From bdda6e5156cbcd193e4e106a6aebfdd664cc0d54 Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 08:10:18 -0400 Subject: [PATCH 01/10] feat: add B2B launch bundles, Deal Room portal, Stripe 50/50 billing, 6-calendar FreeBusy, and Sanity Ops SDK (#753) --- apps/ops/package.json | 25 + apps/ops/sanity.cli.ts | 8 + apps/ops/src/App.tsx | 314 +++++ apps/ops/src/index.tsx | 26 + apps/ops/tsconfig.json | 13 + apps/sanity/extract.json | 1044 ++++++++++++++++- apps/sanity/sanity.config.ts | 10 +- apps/sanity/schemas/documents/booking.ts | 148 +++ apps/sanity/schemas/documents/sponsorLead.ts | 245 ++++ apps/sanity/schemas/documents/sponsorPool.ts | 123 ++ .../schemas/singletons/sponsorConfig.ts | 114 ++ apps/site/src/lib/email.ts | 82 ++ apps/site/src/lib/google-calendar.ts | 250 ++++ apps/site/src/lib/sanity/write-client.ts | 242 ++++ apps/site/src/lib/stripe.ts | 258 ++++ apps/site/src/pages/api/booking.ts | 216 ++++ apps/site/src/pages/api/calendar/freebusy.ts | 28 + apps/site/src/pages/api/sponsors/outbound.ts | 322 +++++ apps/site/src/pages/api/sponsorship.ts | 195 +-- apps/site/src/pages/api/stripe/milestone.ts | 167 +++ apps/site/src/pages/api/stripe/webhook.ts | 111 ++ apps/site/src/pages/book.astro | 394 ++++--- apps/site/src/pages/portal/[token].astro | 533 +++++++++ apps/site/src/pages/sponsorships.astro | 322 ++--- apps/site/wrangler.jsonc | 2 + package.json | 2 + pnpm-lock.yaml | 435 ++++++- 27 files changed, 5195 insertions(+), 434 deletions(-) create mode 100644 apps/ops/package.json create mode 100644 apps/ops/sanity.cli.ts create mode 100644 apps/ops/src/App.tsx create mode 100644 apps/ops/src/index.tsx create mode 100644 apps/ops/tsconfig.json create mode 100644 apps/sanity/schemas/documents/booking.ts create mode 100644 apps/sanity/schemas/documents/sponsorLead.ts create mode 100644 apps/sanity/schemas/documents/sponsorPool.ts create mode 100644 apps/sanity/schemas/singletons/sponsorConfig.ts create mode 100644 apps/site/src/lib/email.ts create mode 100644 apps/site/src/lib/google-calendar.ts create mode 100644 apps/site/src/lib/sanity/write-client.ts create mode 100644 apps/site/src/lib/stripe.ts create mode 100644 apps/site/src/pages/api/booking.ts create mode 100644 apps/site/src/pages/api/calendar/freebusy.ts create mode 100644 apps/site/src/pages/api/sponsors/outbound.ts create mode 100644 apps/site/src/pages/api/stripe/milestone.ts create mode 100644 apps/site/src/pages/api/stripe/webhook.ts create mode 100644 apps/site/src/pages/portal/[token].astro diff --git a/apps/ops/package.json b/apps/ops/package.json new file mode 100644 index 00000000..6440d3ca --- /dev/null +++ b/apps/ops/package.json @@ -0,0 +1,25 @@ +{ + "name": "@codingcatdev/ops", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "sanity dev", + "build": "sanity build", + "deploy": "sanity deploy" + }, + "dependencies": { + "@sanity/sdk": "^1.0.0", + "@sanity/sdk-react": "^1.0.0", + "@sanity/ui": "^3.1.10", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "sanity": "^6.9.2", + "styled-components": "^6.3.11" + }, + "devDependencies": { + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "typescript": "^5.9.3" + } +} diff --git a/apps/ops/sanity.cli.ts b/apps/ops/sanity.cli.ts new file mode 100644 index 00000000..8cee1dae --- /dev/null +++ b/apps/ops/sanity.cli.ts @@ -0,0 +1,8 @@ +import { defineCliConfig } from "sanity/cli"; + +export default defineCliConfig({ + app: { + organizationId: process.env.SANITY_ORGANIZATION_ID || "o1H0wB7xG", + entry: "./src/index.tsx", + }, +}); diff --git a/apps/ops/src/App.tsx b/apps/ops/src/App.tsx new file mode 100644 index 00000000..14956d2a --- /dev/null +++ b/apps/ops/src/App.tsx @@ -0,0 +1,314 @@ +import { useDocuments } from "@sanity/sdk-react"; +import { useState } from "react"; + +type WorkspaceTab = "crm" | "bookings" | "billing"; + +interface SeededGmailDraft { + companyName: string; + contact: string; + threadId: string; + draftId: string; + tier: string; + totalUsd: number; + depositUsd: number; + status: string; +} + +const ACTIVE_GMAIL_DEALS: SeededGmailDraft[] = [ + { + companyName: "StreamLapel", + contact: "hello@streamlapel.com", + threadId: "1a140656cb9a4be1", + draftId: "r8880837980856049603", + tier: "Integrated 60s Mid-Roll Ad (Oct 26 - Nov 6)", + totalUsd: 1800, + depositUsd: 900, + status: "Reply Draft Ready in Gmail", + }, + { + companyName: "Tessen ZERO", + contact: "Yannick Parfait ", + threadId: "1a126242f701063b", + draftId: "r4979210524997526110", + tier: "Full-Stack Launch Bundle", + totalUsd: 3500, + depositUsd: 1750, + status: "Reply Draft Ready in Gmail", + }, + { + companyName: "Influencer Laboratory", + contact: "john@influencerlaboratoryinc.com", + threadId: "1a15468638753504", + draftId: "r3892744900021531970", + tier: "Full-Stack Launch Bundle (21.1% US/CA/UK/AU Geo Sent)", + totalUsd: 3500, + depositUsd: 1750, + status: "Reply Draft Ready in Gmail", + }, + { + companyName: "Typeless", + contact: "qia@typeless.com", + threadId: "1a13b726a4593e01", + draftId: "r5723240746882402069", + tier: "Oct 26 Launch + 7-Platform Shorts Pack", + totalUsd: 2000, + depositUsd: 1000, + status: "Reply Draft Ready in Gmail", + }, + { + companyName: "SuperPlane", + contact: "larisa@superplane.com", + threadId: "1a13b7352b2a713e", + draftId: "r1343316162270961096", + tier: "Full-Stack Launch Bundle (Oct 26-30 GA)", + totalUsd: 3500, + depositUsd: 1750, + status: "Reply Draft Ready in Gmail", + }, + { + companyName: "MiniMax (EezyCollab)", + contact: "talent@eezycollab.xyz", + threadId: "1a0d8c55420283dc", + draftId: "r-7977440252907745009", + tier: "Full-Stack Launch Bundle / Dedicated Video", + totalUsd: 3500, + depositUsd: 1750, + status: "Reply Draft Ready in Gmail", + }, + { + companyName: "Kolect (AI 3D Platform)", + contact: "sophia.nguyen@kolect.ai", + threadId: "1a138ebfcd7f64c0", + draftId: "r-3575370967009126686", + tier: "Full-Stack Launch Bundle", + totalUsd: 3500, + depositUsd: 1750, + status: "Reply Draft Ready in Gmail", + }, + { + companyName: "Kolect (Flova)", + contact: "sophia.nguyen@kolect.ai", + threadId: "1a15878e1da6781e", + draftId: "r7006830561667617324", + tier: "Organic YouTube Feature (Ad Rights Excluded)", + totalUsd: 950, + depositUsd: 475, + status: "Reply Draft Ready in Gmail", + }, +]; + +export function App() { + const [activeTab, setActiveTab] = useState("crm"); + const [discovering, setDiscovering] = useState(false); + const [discoveredProspects, setDiscoveredProspects] = useState>([]); + + const sponsorLeads = useDocuments({ documentType: "sponsorLead" }); + const sponsorPool = useDocuments({ documentType: "sponsorPool" }); + const bookings = useDocuments({ documentType: "booking" }); + + const handleDiscoverOutbound = async () => { + setDiscovering(true); + try { + const res = await fetch("https://codingcat.dev/api/sponsors/outbound"); + if (res.ok) { + const data = await res.json(); + setDiscoveredProspects(data.prospects || []); + } + } catch { + // Fallback + } finally { + setDiscovering(false); + } + }; + + return ( +
+
+
+

CodingCat.dev Revenue & Booking OS

+

+ Unified Sanity App SDK Workspace · Project hfh83o0w (Production) +

+
+
+ + + +
+
+ + {activeTab === "crm" && ( +
+
+
+
+

Active Inbound Sponsor Threads (Gmail + Sanity)

+

+ Threaded Gmail reply drafts are staged in alex.patterson@gmail.com with verified 21.1% US/CA/UK/AU geography metrics. +

+
+
+ + + + + + + + + + + + {ACTIVE_GMAIL_DEALS.map((deal) => ( + + + + + + + + ))} + +
CompanyContactRecommended PackageTotal / 50% DepositStatus
{deal.companyName}{deal.contact}{deal.tier} + ${deal.totalUsd.toLocaleString()} (${deal.depositUsd.toLocaleString()} deposit) + {deal.status}
+
+ +
+
+
+

+ Outbound Funded AI & YC Startup Scraper ({sponsorPool.data?.length || discoveredProspects.length}) +

+

+ Automatically generates 2 tailored CodingCat.dev video concepts per startup + Cloudflare Email Routing outreach. +

+
+ +
+ + {discoveredProspects.length > 0 && ( +
+ {discoveredProspects.map((p) => ( +
+
+ + {p.companyName} ({p.fundingRound}) โ€” {p.category} + + Score: {p.relevanceScore}/100 +
+
    + {p.videoConcepts?.map((vc: any, i: number) => ( +
  • + {vc.title} โ€” {vc.angle} +
  • + ))} +
+
+ ))} +
+ )} +
+
+ )} + + {activeTab === "bookings" && ( +
+

Two-Track Podcast & Sponsor Calendar Bookings

+

+ All recording sessions enforce 8:00 AM - 5:00 PM PT/ET business hours and E-SIGN digital media release capture at codingcat.dev/book. +

+ +
+ )} + + {activeTab === "billing" && ( +
+

50% Upfront Deposit + 50% on Publish Milestone Billing

+

+ Every Sponsor Deal Room at codingcat.dev/portal/[token] supports both instant Stripe Checkout (Card / ACH) and Net-15 Corporate Hosted Invoices. +

+
    +
  • Full-Stack Launch Bundle ($3,500): $1,750 upfront deposit + $1,750 on publish
  • +
  • Sponsored Podcast & Multi-Channel Showcase ($2,000): $1,000 upfront deposit + $1,000 on publish
  • +
  • Ecosystem Integration ($950): $475 upfront deposit + $475 on publish
  • +
+
+ )} +
+ ); +} diff --git a/apps/ops/src/index.tsx b/apps/ops/src/index.tsx new file mode 100644 index 00000000..9ba5a3dc --- /dev/null +++ b/apps/ops/src/index.tsx @@ -0,0 +1,26 @@ +import { type SanityConfig } from "@sanity/sdk"; +import { SanityApp } from "@sanity/sdk-react"; +import { StudioTheme, ThemeProvider } from "@sanity/ui"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { App } from "./App"; + +const config: SanityConfig[] = [ + { + projectId: "hfh83o0w", + dataset: "production", + }, +]; + +const rootEl = document.getElementById("root"); +if (rootEl) { + createRoot(rootEl).render( + + + Loading CodingCat.dev Ops...}> + + + + , + ); +} diff --git a/apps/ops/tsconfig.json b/apps/ops/tsconfig.json new file mode 100644 index 00000000..f7e905c9 --- /dev/null +++ b/apps/ops/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "noEmit": true + }, + "include": ["src", "sanity.cli.ts"] +} diff --git a/apps/sanity/extract.json b/apps/sanity/extract.json index dda81e6c..30f6f527 100644 --- a/apps/sanity/extract.json +++ b/apps/sanity/extract.json @@ -654,6 +654,897 @@ } } }, + { + "type": "type", + "name": "sponsorLead.reference", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sponsorLead" + } + }, + { + "name": "booking", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "booking" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "guestName": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "guestEmail": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "company": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "socialUrl": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "track": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "editorial" + }, + { + "type": "string", + "value": "sponsored" + }, + { + "type": "string", + "value": "full-stack-launch" + } + ] + }, + "optional": true + }, + "status": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "approved" + }, + { + "type": "string", + "value": "scheduled" + }, + { + "type": "string", + "value": "recorded" + }, + { + "type": "string", + "value": "published" + }, + { + "type": "string", + "value": "cancelled" + } + ] + }, + "optional": true + }, + "slotStartAt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "topics": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "appointmentScheduleUrl": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "googleCalendarEventId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "signatureMode": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "draw" + }, + { + "type": "string", + "value": "type" + } + ] + }, + "optional": true + }, + "signatureData": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "signedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "consentRecording": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "consentCommercial": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "consentLikeness": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "portalToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sponsorLeadRef": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sponsorLead.reference" + }, + "optional": true + } + } + }, + { + "name": "sponsorPool", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sponsorPool" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "companyName": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "contactName": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "contactEmail": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "website": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "category": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "fundingRound": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "yc" + }, + { + "type": "string", + "value": "hackernews" + }, + { + "type": "string", + "value": "linkedin" + }, + { + "type": "string", + "value": "curated" + }, + { + "type": "string", + "value": "enriched" + } + ] + }, + "optional": true + }, + "relevanceScore": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "videoConcepts": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "hook": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "angle": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "targetPackage": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "outreachDraftSubject": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "outreachDraftBody": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "lastContactedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "optedOut": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "notes": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "type": "type", + "name": "sponsor.reference", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sponsor" + } + }, + { + "name": "sponsorLead", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sponsorLead" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "companyName": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "contactName": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "contactEmail": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "website": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "portalToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "inbound" + }, + { + "type": "string", + "value": "gmail" + }, + { + "type": "string", + "value": "outbound" + }, + { + "type": "string", + "value": "booking" + } + ] + }, + "optional": true + }, + "status": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "new" + }, + { + "type": "string", + "value": "contacted" + }, + { + "type": "string", + "value": "replied" + }, + { + "type": "string", + "value": "negotiating" + }, + { + "type": "string", + "value": "deposit_sent" + }, + { + "type": "string", + "value": "deposit_paid" + }, + { + "type": "string", + "value": "booked" + }, + { + "type": "string", + "value": "balance_sent" + }, + { + "type": "string", + "value": "paid" + } + ] + }, + "optional": true + }, + "rateCard": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "full-stack-launch" + }, + { + "type": "string", + "value": "podcast-showcase" + }, + { + "type": "string", + "value": "ecosystem-integration" + }, + { + "type": "string", + "value": "dedicated-video" + }, + { + "type": "string", + "value": "mid-roll-ad" + }, + { + "type": "string", + "value": "custom-series" + } + ] + }, + "optional": true + }, + "totalAmountCents": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "depositAmountCents": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "balanceAmountCents": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "depositPaidAt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "balancePaidAt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "stripeDepositCheckoutUrl": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "stripeDepositInvoiceId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "stripeDepositInvoiceUrl": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "stripeBalanceCheckoutUrl": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "stripeBalanceInvoiceId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "stripeBalanceInvoiceUrl": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "stripeInvoiceId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "intent": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "deliverables": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "channel": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "youtube" + }, + { + "type": "string", + "value": "youtube-short" + }, + { + "type": "string", + "value": "blog" + }, + { + "type": "string", + "value": "syndication" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "string", + "value": "linkedin" + }, + { + "type": "string", + "value": "shorts-network" + } + ] + }, + "optional": true + }, + "status": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "in-progress" + }, + { + "type": "string", + "value": "scheduled" + }, + { + "type": "string", + "value": "published" + } + ] + }, + "optional": true + }, + "url": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "views": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "publishedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "bookedPodcast": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "podcast.reference" + }, + "optional": true + }, + "sponsorDocId": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sponsor.reference" + }, + "optional": true + }, + "threadId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "lastEmailAt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "notes": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, { "type": "type", "name": "page.reference", @@ -2510,36 +3401,6 @@ "dereferencesTo": "author" } }, - { - "type": "type", - "name": "sponsor.reference", - "value": { - "type": "object", - "attributes": { - "_ref": { - "type": "objectAttribute", - "value": { - "type": "string" - } - }, - "_type": { - "type": "objectAttribute", - "value": { - "type": "string", - "value": "reference" - } - }, - "_weak": { - "type": "objectAttribute", - "value": { - "type": "boolean" - }, - "optional": true - } - }, - "dereferencesTo": "sponsor" - } - }, { "type": "type", "name": "syndication.reference", @@ -8247,6 +9108,129 @@ } } }, + { + "name": "sponsorConfig", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sponsorConfig" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "cooldownDays": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "depositPercentage": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "rateCardTiers": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "id": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "price": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "depositPrice": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "outreachEmailTemplate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "maxOutreachPerRun": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, { "name": "settings", "type": "document", diff --git a/apps/sanity/sanity.config.ts b/apps/sanity/sanity.config.ts index bfe3489b..ff3fa2be 100644 --- a/apps/sanity/sanity.config.ts +++ b/apps/sanity/sanity.config.ts @@ -31,7 +31,11 @@ import podcast from "./schemas/documents/podcast"; import podcastType from "./schemas/documents/podcastType"; import post from "./schemas/documents/post"; import settings from "./schemas/singletons/settings"; +import sponsorConfig from "./schemas/singletons/sponsorConfig"; import sponsor from "./schemas/documents/sponsor"; +import sponsorLead from "./schemas/documents/sponsorLead"; +import sponsorPool from "./schemas/documents/sponsorPool"; +import booking from "./schemas/documents/booking"; import tableSchema, { rowType } from "./schemas/custom/table"; import syndication from "./schemas/documents/syndication"; import transcript from "./schemas/documents/transcript"; @@ -76,6 +80,7 @@ const schemaTypes = [ rowType, // Singletons settings, + sponsorConfig, // Documents author, guest, @@ -84,6 +89,9 @@ const schemaTypes = [ podcastType, post, sponsor, + sponsorLead, + sponsorPool, + booking, syndication, transcript, ]; @@ -158,7 +166,7 @@ function buildPlugins(previewUrl: string): PluginOptions[] { ] : []), structureTool({ structure: editorialStructure }), - singletonPlugin([settings.name]), + singletonPlugin([settings.name, sponsorConfig.name]), assistWithPresets(), media(), codeInput(), diff --git a/apps/sanity/schemas/documents/booking.ts b/apps/sanity/schemas/documents/booking.ts new file mode 100644 index 00000000..06b525bb --- /dev/null +++ b/apps/sanity/schemas/documents/booking.ts @@ -0,0 +1,148 @@ +import {defineField, defineType} from 'sanity' +import {HiOutlineCalendar} from 'react-icons/hi' + +export default defineType({ + name: 'booking', + title: 'Podcast & Sponsor Booking', + type: 'document', + icon: HiOutlineCalendar, + fields: [ + defineField({ + name: 'guestName', + title: 'Guest Full Legal Name', + type: 'string', + validation: (Rule) => Rule.required(), + }), + defineField({ + name: 'guestEmail', + title: 'Guest Email', + type: 'string', + validation: (Rule) => Rule.required().email(), + }), + defineField({ + name: 'company', + title: 'Company / Flagship Project', + type: 'string', + }), + defineField({ + name: 'socialUrl', + title: 'Social Handle or Portfolio URL', + type: 'url', + }), + defineField({ + name: 'track', + title: 'Booking Track', + type: 'string', + options: { + list: [ + {title: 'Editorial Guest Application (Free / Review Queue)', value: 'editorial'}, + {title: 'Sponsored Podcast & Multi-Channel Showcase ($2,000 Fast-Track)', value: 'sponsored'}, + {title: 'Full-Stack Launch Bundle ($3,500 Kickoff & Demo)', value: 'full-stack-launch'}, + ], + }, + initialValue: 'editorial', + validation: (Rule) => Rule.required(), + }), + defineField({ + name: 'status', + title: 'Booking Status', + type: 'string', + options: { + list: [ + {title: 'Pending Review / Deposit', value: 'pending'}, + {title: 'Approved / Deposit Paid', value: 'approved'}, + {title: 'Scheduled on Google Calendar', value: 'scheduled'}, + {title: 'Recorded', value: 'recorded'}, + {title: 'Published', value: 'published'}, + {title: 'Declined / Cancelled', value: 'cancelled'}, + ], + }, + initialValue: 'pending', + }), + defineField({ + name: 'slotStartAt', + title: 'Requested Recording Slot (UTC ISO)', + type: 'datetime', + }), + defineField({ + name: 'topics', + title: 'Proposed Topics & Key Talking Points', + type: 'text', + }), + defineField({ + name: 'appointmentScheduleUrl', + title: 'Google Calendar Appointment Schedule Link', + type: 'url', + initialValue: 'https://calendar.app.google/s3B6PEqbVsGcY81MA', + }), + defineField({ + name: 'googleCalendarEventId', + title: 'Google Calendar Event ID', + type: 'string', + }), + defineField({ + name: 'signatureMode', + title: 'E-SIGN Signature Mode', + type: 'string', + options: { + list: [ + {title: 'Drawn Canvas Signature', value: 'draw'}, + {title: 'Typed Legal Signature', value: 'type'}, + ], + }, + }), + defineField({ + name: 'signatureData', + title: 'E-SIGN Signature Data (Typed Name or Base64 PNG)', + type: 'text', + }), + defineField({ + name: 'signedAt', + title: 'E-SIGN Executed At', + type: 'datetime', + }), + defineField({ + name: 'consentRecording', + title: 'Consent: Recording & Distribution', + type: 'boolean', + initialValue: true, + }), + defineField({ + name: 'consentCommercial', + title: 'Consent: Commercial & Sponsorship Use', + type: 'boolean', + initialValue: true, + }), + defineField({ + name: 'consentLikeness', + title: 'Consent: Likeness & Social Clips', + type: 'boolean', + initialValue: true, + }), + defineField({ + name: 'portalToken', + title: 'Linked Deal Room Token', + type: 'string', + }), + defineField({ + name: 'sponsorLeadRef', + title: 'Linked Sponsor Lead', + type: 'reference', + to: [{type: 'sponsorLead'}], + }), + ], + preview: { + select: { + title: 'guestName', + company: 'company', + track: 'track', + status: 'status', + }, + prepare({title, company, track, status}) { + return { + title: company ? `${title} (${company})` : title, + subtitle: [track, status].filter(Boolean).join(' \u00b7 '), + } + }, + }, +}) diff --git a/apps/sanity/schemas/documents/sponsorLead.ts b/apps/sanity/schemas/documents/sponsorLead.ts new file mode 100644 index 00000000..c359ed4b --- /dev/null +++ b/apps/sanity/schemas/documents/sponsorLead.ts @@ -0,0 +1,245 @@ +import {defineField, defineType} from 'sanity' +import {HiOutlineCurrencyDollar} from 'react-icons/hi' + +export default defineType({ + name: 'sponsorLead', + title: 'Sponsor Lead', + type: 'document', + icon: HiOutlineCurrencyDollar, + fields: [ + defineField({ + name: 'companyName', + title: 'Company Name', + type: 'string', + validation: (Rule) => Rule.required(), + }), + defineField({ + name: 'contactName', + title: 'Contact Name', + type: 'string', + }), + defineField({ + name: 'contactEmail', + title: 'Contact Email', + type: 'string', + validation: (Rule) => Rule.required().email(), + }), + defineField({ + name: 'website', + title: 'Company Website', + type: 'url', + }), + defineField({ + name: 'portalToken', + title: 'Deal Room Portal Token', + type: 'string', + description: 'Unique token used for codingcat.dev/portal/[token]', + }), + defineField({ + name: 'source', + title: 'Source', + type: 'string', + options: { + list: [ + {title: 'Inbound Website', value: 'inbound'}, + {title: 'Gmail Thread', value: 'gmail'}, + {title: 'Outbound Scraper', value: 'outbound'}, + {title: 'Fast-Track Booking', value: 'booking'}, + ], + }, + validation: (Rule) => Rule.required(), + }), + defineField({ + name: 'status', + title: 'Status', + type: 'string', + options: { + list: [ + {title: 'New', value: 'new'}, + {title: 'Contacted', value: 'contacted'}, + {title: 'Replied', value: 'replied'}, + {title: 'Negotiating', value: 'negotiating'}, + {title: 'Deposit Sent', value: 'deposit_sent'}, + {title: 'Deposit Paid (50%)', value: 'deposit_paid'}, + {title: 'Booked / In Production', value: 'booked'}, + {title: 'Balance Sent', value: 'balance_sent'}, + {title: 'Paid in Full (100%)', value: 'paid'}, + ], + }, + initialValue: 'new', + validation: (Rule) => Rule.required(), + }), + defineField({ + name: 'rateCard', + title: 'Package / Rate Card Tier', + type: 'string', + options: { + list: [ + {title: 'Full-Stack Launch Bundle ($3,500)', value: 'full-stack-launch'}, + {title: 'Sponsored Podcast & Multi-Channel Showcase ($2,000)', value: 'podcast-showcase'}, + {title: 'Ecosystem Integration / Mid-Roll + Social Pack ($950)', value: 'ecosystem-integration'}, + {title: 'Dedicated YouTube Video ($2,500)', value: 'dedicated-video'}, + {title: 'Integrated Mid-Roll Ad ($1,800)', value: 'mid-roll-ad'}, + {title: 'Custom Video Series (Custom)', value: 'custom-series'}, + ], + }, + }), + defineField({ + name: 'totalAmountCents', + title: 'Total Package Amount (Cents)', + type: 'number', + description: 'Total contract value in USD cents (e.g. 350000 = $3,500.00)', + }), + defineField({ + name: 'depositAmountCents', + title: '50% Upfront Deposit Amount (Cents)', + type: 'number', + description: '50% deposit required to lock calendar & production slot', + }), + defineField({ + name: 'balanceAmountCents', + title: '50% Final Balance Amount (Cents)', + type: 'number', + description: '50% remaining balance due upon publication', + }), + defineField({ + name: 'depositPaidAt', + title: '50% Deposit Paid At', + type: 'datetime', + }), + defineField({ + name: 'balancePaidAt', + title: '50% Balance Paid At', + type: 'datetime', + }), + defineField({ + name: 'stripeDepositCheckoutUrl', + title: 'Stripe 50% Deposit Checkout URL', + type: 'url', + }), + defineField({ + name: 'stripeDepositInvoiceId', + title: 'Stripe 50% Deposit Invoice ID (Net-15/30)', + type: 'string', + }), + defineField({ + name: 'stripeDepositInvoiceUrl', + title: 'Stripe 50% Deposit Hosted Invoice URL', + type: 'url', + }), + defineField({ + name: 'stripeBalanceCheckoutUrl', + title: 'Stripe 50% Balance Checkout URL', + type: 'url', + }), + defineField({ + name: 'stripeBalanceInvoiceId', + title: 'Stripe 50% Balance Invoice ID (Net-15/30)', + type: 'string', + }), + defineField({ + name: 'stripeBalanceInvoiceUrl', + title: 'Stripe 50% Balance Hosted Invoice URL', + type: 'url', + }), + defineField({ + name: 'stripeInvoiceId', + title: 'Legacy Stripe Invoice ID', + type: 'string', + }), + defineField({ + name: 'intent', + title: 'Campaign Goals & Intent', + type: 'text', + }), + defineField({ + name: 'deliverables', + title: 'Campaign Deliverables & Live ROI Tracking', + type: 'array', + of: [ + { + type: 'object', + fields: [ + defineField({name: 'title', title: 'Deliverable Title', type: 'string'}), + defineField({ + name: 'channel', + title: 'Channel', + type: 'string', + options: { + list: [ + {title: 'YouTube Long-Form', value: 'youtube'}, + {title: 'YouTube Short', value: 'youtube-short'}, + {title: 'CodingCat.dev Canonical Blog + AEO', value: 'blog'}, + {title: 'Dev.to & Hashnode Syndication', value: 'syndication'}, + {title: 'X (@CodingCatDev + @codercatdev)', value: 'x'}, + {title: 'LinkedIn', value: 'linkedin'}, + {title: 'Bluesky / Threads / Mastodon / TikTok / IG', value: 'shorts-network'}, + ], + }, + }), + defineField({ + name: 'status', + title: 'Status', + type: 'string', + options: { + list: [ + {title: 'Pending Deposit', value: 'pending'}, + {title: 'In Production', value: 'in-progress'}, + {title: 'Scheduled in Postiz', value: 'scheduled'}, + {title: 'Published', value: 'published'}, + ], + }, + initialValue: 'pending', + }), + defineField({name: 'url', title: 'Live URL', type: 'url'}), + defineField({name: 'views', title: 'Verified Views / Impressions', type: 'number'}), + defineField({name: 'publishedAt', title: 'Published At', type: 'datetime'}), + ], + }, + ], + }), + defineField({ + name: 'bookedPodcast', + title: 'Linked Podcast Episode', + type: 'reference', + to: [{type: 'podcast'}], + }), + defineField({ + name: 'sponsorDocId', + title: 'Linked Sponsor', + type: 'reference', + to: [{type: 'sponsor'}], + description: 'Public sponsor document created when lead converts to paid', + readOnly: true, + }), + defineField({ + name: 'threadId', + title: 'Gmail Thread ID', + type: 'string', + }), + defineField({ + name: 'lastEmailAt', + title: 'Last Email At', + type: 'datetime', + }), + defineField({ + name: 'notes', + title: 'Notes', + type: 'text', + }), + ], + preview: { + select: { + title: 'companyName', + status: 'status', + rateCard: 'rateCard', + source: 'source', + }, + prepare({title, status, rateCard, source}) { + return { + title, + subtitle: [status, rateCard, source].filter(Boolean).join(' \u00b7 '), + } + }, + }, +}) diff --git a/apps/sanity/schemas/documents/sponsorPool.ts b/apps/sanity/schemas/documents/sponsorPool.ts new file mode 100644 index 00000000..1e3f2199 --- /dev/null +++ b/apps/sanity/schemas/documents/sponsorPool.ts @@ -0,0 +1,123 @@ +import {defineField, defineType} from 'sanity' +import {HiOutlineUserGroup} from 'react-icons/hi' + +export default defineType({ + name: 'sponsorPool', + title: 'Sponsor Pool (Outbound Prospects)', + type: 'document', + icon: HiOutlineUserGroup, + fields: [ + defineField({ + name: 'companyName', + title: 'Company Name', + type: 'string', + validation: (Rule) => Rule.required(), + }), + defineField({ + name: 'contactName', + title: 'Contact Name / Role', + type: 'string', + }), + defineField({ + name: 'contactEmail', + title: 'Contact Email', + type: 'string', + validation: (Rule) => Rule.required().email(), + }), + defineField({ + name: 'website', + title: 'Website', + type: 'url', + }), + defineField({ + name: 'category', + title: 'Category', + type: 'string', + }), + defineField({ + name: 'fundingRound', + title: 'Funding / Launch Signal', + type: 'string', + description: 'e.g. Seed $6M, Series A $18M, YC W26, HN Launch', + }), + defineField({ + name: 'source', + title: 'Source', + type: 'string', + options: { + list: [ + {title: 'Y Combinator AI / DevTools', value: 'yc'}, + {title: 'Hacker News Launch / Who Is Hiring', value: 'hackernews'}, + {title: 'LinkedIn / Funding Announcement', value: 'linkedin'}, + {title: 'Curated', value: 'curated'}, + {title: 'Enriched', value: 'enriched'}, + ], + }, + }), + defineField({ + name: 'relevanceScore', + title: 'Relevance Score (0-100)', + type: 'number', + }), + defineField({ + name: 'videoConcepts', + title: 'Tailored CodingCat.dev Video Concepts (2 per Startup)', + type: 'array', + of: [ + { + type: 'object', + fields: [ + defineField({name: 'title', title: 'Proposed Video Title', type: 'string'}), + defineField({name: 'hook', title: '60s Short / Opening Hook', type: 'text'}), + defineField({name: 'angle', title: 'Production Architecture Angle', type: 'text'}), + defineField({ + name: 'targetPackage', + title: 'Recommended Bundle', + type: 'string', + initialValue: 'Full-Stack Launch Bundle ($3,500)', + }), + ], + }, + ], + }), + defineField({ + name: 'outreachDraftSubject', + title: 'Generated Outreach Subject', + type: 'string', + }), + defineField({ + name: 'outreachDraftBody', + title: 'Generated Outreach Body', + type: 'text', + }), + defineField({ + name: 'lastContactedAt', + title: 'Last Contacted At', + type: 'datetime', + }), + defineField({ + name: 'optedOut', + title: 'Opted Out', + type: 'boolean', + initialValue: false, + }), + defineField({ + name: 'notes', + title: 'Notes', + type: 'text', + }), + ], + preview: { + select: { + title: 'companyName', + category: 'category', + funding: 'fundingRound', + }, + prepare({title, category, funding}) { + return { + title, + subtitle: [funding, category].filter(Boolean).join(' \u00b7 '), + } + }, + }, +}) diff --git a/apps/sanity/schemas/singletons/sponsorConfig.ts b/apps/sanity/schemas/singletons/sponsorConfig.ts new file mode 100644 index 00000000..8e198074 --- /dev/null +++ b/apps/sanity/schemas/singletons/sponsorConfig.ts @@ -0,0 +1,114 @@ +import { defineField, defineType } from "sanity"; + +export default defineType({ + name: "sponsorConfig", + title: "Sponsor Config", + type: "document", + icon: () => "๐Ÿ’ฐ", + fields: [ + defineField({ + name: "cooldownDays", + title: "Cooldown Days", + type: "number", + description: "Days to wait before contacting a sponsor again after the last outreach", + initialValue: 14, + }), + defineField({ + name: "depositPercentage", + title: "Upfront Deposit Percentage", + type: "number", + description: "Percentage required upfront to lock a calendar & production slot (default 50%)", + initialValue: 50, + }), + defineField({ + name: "rateCardTiers", + title: "Rate Card Tiers", + type: "array", + description: "Multi-channel launch bundles & sponsorship tiers", + of: [ + { + type: "object", + fields: [ + defineField({ + name: "id", + title: "Tier ID", + type: "string", + }), + defineField({ + name: "name", + title: "Name", + type: "string", + }), + defineField({ + name: "description", + title: "Description", + type: "text", + }), + defineField({ + name: "price", + title: "Total Price (USD)", + type: "number", + }), + defineField({ + name: "depositPrice", + title: "50% Deposit Price (USD)", + type: "number", + }), + ], + }, + ], + initialValue: [ + { + _type: "object", + _key: "full-stack-launch", + id: "full-stack-launch", + name: "Full-Stack Launch Bundle", + description: + "Dedicated YouTube deep-dive (61K+ subs) + 4 vertical Shorts across 7 platforms (28 native video posts) + Canonical SEO/AEO blog post on codingcat.dev (syndicated to Dev.to & Hashnode) + Dual-account social amplification + Live Deal Room.", + price: 3500, + depositPrice: 1750, + }, + { + _type: "object", + _key: "podcast-showcase", + id: "podcast-showcase", + name: "Sponsored Podcast & Multi-Channel Showcase", + description: + "Priority fast-track 45-min podcast episode + 4 vertical Shorts across 7 platforms + Integrated mid-roll + Permanent show notes, blog feature, and Deal Room telemetry.", + price: 2000, + depositPrice: 1000, + }, + { + _type: "object", + _key: "ecosystem-integration", + id: "ecosystem-integration", + name: "Ecosystem Integration (Mid-Roll + Social Pack)", + description: + "60-second host-read mid-roll integration in a technical video + Multi-channel social thread across X, LinkedIn, Bluesky, Threads, and Mastodon + Permanent link on codingcat.dev.", + price: 950, + depositPrice: 475, + }, + ], + }), + defineField({ + name: "outreachEmailTemplate", + title: "Outreach Email Template", + type: "text", + description: "Template for automated sponsor outreach emails. Use {{companyName}} for personalization", + initialValue: + "Hi {{contactName}},\n\nSaw {{companyName}}'s recent momentum and put together two concrete technical video concepts we could build and distribute across CodingCat.dev (61K+ YouTube subscribers, 7-platform Shorts syndication, and canonical AEO blog posts).\n\n{{videoConcepts}}\n\nWould you be open to a quick 15-minute chat this week? You can grab a time directly here: https://calendar.app.google/tyGiF6dGFQeaVrN66\n\nBest,\nAlex Patterson\nFounder, CodingCat.dev", + }), + defineField({ + name: "maxOutreachPerRun", + title: "Max Outreach Per Run", + type: "number", + description: "Maximum sponsor emails to send per cron run. Keeps volume manageable and avoids spam flags", + initialValue: 10, + }), + ], + preview: { + prepare() { + return { title: "Sponsor Config" }; + }, + }, +}); diff --git a/apps/site/src/lib/email.ts b/apps/site/src/lib/email.ts new file mode 100644 index 00000000..8d5778ad --- /dev/null +++ b/apps/site/src/lib/email.ts @@ -0,0 +1,82 @@ +import { env } from "cloudflare:workers"; + +interface SendEmailBinding { + send(message: unknown): Promise; +} + +function buildMimeMessage(opts: { + from: string; + fromName: string; + to: string; + subject: string; + text: string; + html?: string; +}): string { + const boundary = `----=_Part_${crypto.randomUUID().replace(/-/g, "")}`; + const date = new Date().toUTCString(); + const msgId = `<${crypto.randomUUID()}@codingcat.dev>`; + const lines = [ + `From: "${opts.fromName}" <${opts.from}>`, + `To: <${opts.to}>`, + `Subject: ${opts.subject}`, + `Date: ${date}`, + `Message-ID: ${msgId}`, + "MIME-Version: 1.0", + `Content-Type: multipart/alternative; boundary="${boundary}"`, + "", + `--${boundary}`, + "Content-Type: text/plain; charset=UTF-8", + "Content-Transfer-Encoding: 7bit", + "", + opts.text, + ]; + + if (opts.html) { + lines.push( + `--${boundary}`, + "Content-Type: text/html; charset=UTF-8", + "Content-Transfer-Encoding: 7bit", + "", + opts.html, + ); + } + + lines.push(`--${boundary}--`, ""); + return lines.join("\r\n"); +} + +export async function sendCodingCatEmail(opts: { + to: string; + subject: string; + text: string; + html?: string; + from?: string; + fromName?: string; +}): Promise { + try { + const workerEnv = (env ?? {}) as unknown as { + EMAIL?: SendEmailBinding; + }; + if (!workerEnv.EMAIL) { + return false; + } + + const from = opts.from ?? "alex@codingcat.dev"; + const fromName = opts.fromName ?? "Alex Patterson (CodingCat.dev)"; + const raw = buildMimeMessage({ + from, + fromName, + to: opts.to, + subject: opts.subject, + text: opts.text, + html: opts.html, + }); + + const { EmailMessage } = await import("cloudflare:email"); + const msg = new EmailMessage(from, opts.to, raw); + await workerEnv.EMAIL.send(msg); + return true; + } catch { + return false; + } +} diff --git a/apps/site/src/lib/google-calendar.ts b/apps/site/src/lib/google-calendar.ts new file mode 100644 index 00000000..ae68f2d7 --- /dev/null +++ b/apps/site/src/lib/google-calendar.ts @@ -0,0 +1,250 @@ +import { env } from "cloudflare:workers"; + +export const CODINGCAT_CALENDAR_IDS = [ + "alex.patterson@gmail.com", + "alex@codingcat.dev", + "alex.patterson@sanity.io", + "mikqhmn29svd9p9m99quch9nuo@group.calendar.google.com", // Oliver - Alex + "2em0afukjm0gk9k3n0ohh5ag3g@group.calendar.google.com", // Oliver - Events + "a1jir6k8sl9k38fbbohoei5f80@group.calendar.google.com", // Oliver - Heidi +]; + +export interface AvailableCalendarSlot { + id: string; + startAt: string; + endAt: string; + displayDate: string; + displayTime: string; +} + +async function getAccessToken(): Promise { + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + const clientId = workerEnv.GOOGLE_CLIENT_ID; + const clientSecret = workerEnv.GOOGLE_CLIENT_SECRET; + const refreshToken = workerEnv.GOOGLE_REFRESH_TOKEN; + + if (!clientId || !clientSecret || !refreshToken) { + return null; + } + + const body = new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + refresh_token: refreshToken, + grant_type: "refresh_token", + }); + + const res = await fetch("https://oauth2.googleapis.com/token", { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: body.toString(), + }); + + if (!res.ok) { + return null; + } + const data = (await res.json()) as { access_token?: string }; + return data.access_token ?? null; +} + +function generateDefaultCandidateSlots( + daysAhead = 14, +): AvailableCalendarSlot[] { + const slots: AvailableCalendarSlot[] = []; + const now = new Date(); + + // Candidate slots in overlapping US PT (8:00 AM - 2:00 PM PT) & ET (11:00 AM - 5:00 PM ET) work hours: + // 16:00 UTC (9:00 AM PDT / 12:00 PM EDT), 17:30 UTC (10:30 AM PDT / 1:30 PM EDT), 19:00 UTC (12:00 PM PDT / 3:00 PM EDT) + const candidateUtcHours = [ + { hour: 16, minute: 0, label: "9:00 AM PT / 12:00 PM ET" }, + { hour: 17, minute: 30, label: "10:30 AM PT / 1:30 PM ET" }, + { hour: 19, minute: 0, label: "12:00 PM PT / 3:00 PM ET" }, + ]; + + for (let d = 1; d <= daysAhead; d++) { + const dayDate = new Date(now.getTime() + d * 86400_000); + const dayOfWeek = dayDate.getUTCDay(); + // Weekdays Monday (1) through Friday (5), prioritizing Tue-Thu + if (dayOfWeek === 0 || dayOfWeek === 6) { + continue; + } + + for (const cand of candidateUtcHours) { + const start = new Date( + Date.UTC( + dayDate.getUTCFullYear(), + dayDate.getUTCMonth(), + dayDate.getUTCDate(), + cand.hour, + cand.minute, + 0, + ), + ); + const end = new Date(start.getTime() + 45 * 60_000); + slots.push({ + id: `slot-${start.toISOString().slice(0, 16).replace(/[:T]/g, "-")}`, + startAt: start.toISOString(), + endAt: end.toISOString(), + displayDate: start.toLocaleDateString("en-US", { + weekday: "short", + month: "short", + day: "numeric", + timeZone: "America/New_York", + }), + displayTime: cand.label, + }); + } + } + + return slots; +} + +/** + * Queries Google Calendar FreeBusy API across all 6 of Alex Patterson's calendars + * (Personal, CodingCat.dev, Sanity.io, and Oliver family calendars) and returns + * conflict-free 45-minute recording slots during 8am-5pm PT/ET work hours. + */ +export async function getMultiCalendarAvailableSlots( + maxSlots = 9, +): Promise<{ slots: AvailableCalendarSlot[]; liveVerified: boolean }> { + const candidates = generateDefaultCandidateSlots(14); + const accessToken = await getAccessToken(); + + if (!accessToken || candidates.length === 0) { + return { + slots: candidates.slice(0, maxSlots), + liveVerified: false, + }; + } + + const timeMin = candidates[0].startAt; + const timeMax = candidates[candidates.length - 1].endAt; + + try { + const res = await fetch("https://www.googleapis.com/calendar/v3/freeBusy", { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + timeMin, + timeMax, + items: CODINGCAT_CALENDAR_IDS.map((id) => ({ id })), + }), + }); + + if (!res.ok) { + return { slots: candidates.slice(0, maxSlots), liveVerified: false }; + } + + const data = (await res.json()) as { + calendars?: Record< + string, + { busy?: Array<{ start: string; end: string }> } + >; + }; + + const busyRanges: Array<{ startMs: number; endMs: number }> = []; + for (const cal of Object.values(data.calendars ?? {})) { + for (const b of cal.busy ?? []) { + busyRanges.push({ + startMs: new Date(b.start).getTime(), + endMs: new Date(b.end).getTime(), + }); + } + } + + const available = candidates.filter((slot) => { + const slotStart = new Date(slot.startAt).getTime(); + const slotEnd = new Date(slot.endAt).getTime(); + return !busyRanges.some( + (b) => slotStart < b.endMs && slotEnd > b.startMs, + ); + }); + + return { + slots: (available.length > 0 ? available : candidates).slice(0, maxSlots), + liveVerified: true, + }; + } catch { + return { + slots: candidates.slice(0, maxSlots), + liveVerified: false, + }; + } +} + +/** + * Creates a Google Calendar event on alex@codingcat.dev (or alex.patterson@gmail.com) + * when a Sponsored Showcase or approved Editorial session is booked. + */ +export async function createGoogleCalendarBookingEvent(opts: { + guestName: string; + guestEmail: string; + company: string; + track: string; + startAt: string; + topics: string; + portalUrl?: string; +}): Promise<{ eventId: string; htmlLink?: string } | null> { + const accessToken = await getAccessToken(); + if (!accessToken) { + return null; + } + + const start = new Date(opts.startAt); + const end = new Date(start.getTime() + 45 * 60_000); + + const summary = + opts.track === "editorial" + ? `CodingCat.dev Podcast: ${opts.guestName} (${opts.company})` + : `[SPONSORED] CodingCat.dev Showcase: ${opts.guestName} (${opts.company})`; + + const descriptionLines = [ + `CodingCat.dev Recording Session (${opts.track.toUpperCase()})`, + `Guest: ${opts.guestName} (${opts.guestEmail})`, + `Company: ${opts.company}`, + `Topics: ${opts.topics}`, + "E-SIGN Media Release: Signed & stored in Sanity", + ...(opts.portalUrl ? [`Deal Room: ${opts.portalUrl}`] : []), + ]; + + try { + const res = await fetch( + "https://www.googleapis.com/calendar/v3/calendars/alex%40codingcat.dev/events?sendUpdates=all", + { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + summary, + description: descriptionLines.join("\n"), + start: { dateTime: start.toISOString() }, + end: { dateTime: end.toISOString() }, + attendees: [ + { email: "alex.patterson@gmail.com" }, + { email: "alex@codingcat.dev" }, + { email: opts.guestEmail, displayName: opts.guestName }, + ], + }), + }, + ); + + if (!res.ok) { + return null; + } + const event = (await res.json()) as { id?: string; htmlLink?: string }; + if (!event.id) { + return null; + } + return { eventId: event.id, htmlLink: event.htmlLink }; + } catch { + return null; + } +} diff --git a/apps/site/src/lib/sanity/write-client.ts b/apps/site/src/lib/sanity/write-client.ts new file mode 100644 index 00000000..12156f33 --- /dev/null +++ b/apps/site/src/lib/sanity/write-client.ts @@ -0,0 +1,242 @@ +import { env } from "cloudflare:workers"; +import { createClient, type SanityClient } from "@sanity/client"; + +export interface SponsorPackageTier { + id: string; + name: string; + priceUsd: number; + totalAmountCents: number; + depositAmountCents: number; + balanceAmountCents: number; + tagline: string; + description: string; + deliverables: Array<{ + title: string; + channel: string; + }>; +} + +export const SPONSOR_PACKAGE_TIERS: SponsorPackageTier[] = [ + { + id: "full-stack-launch", + name: "Full-Stack Launch Bundle", + priceUsd: 3500, + totalAmountCents: 350000, + depositAmountCents: 175000, + balanceAmountCents: 175000, + tagline: "Most Popular \u00b7 Complete Multi-Channel DevTool Launch", + description: + "Dedicated YouTube technical deep-dive (61K+ subscribers) + 4 vertical Shorts published across 7 platforms (28 native video posts via Postiz) + Canonical SEO & Agent-Ready (AEO / WebMCP / llms.txt) article on codingcat.dev syndicated to Dev.to & Hashnode + Dual-account social amplification (@CodingCatDev + @codercatdev) + Live ROI Deal Room.", + deliverables: [ + { + title: "Dedicated YouTube Technical Deep-Dive Video", + channel: "youtube", + }, + { + title: "4x Vertical Shorts across 7 Platforms (28 Native Video Posts)", + channel: "shorts-network", + }, + { + title: "Canonical SEO & Agent-Ready (AEO) Article on CodingCat.dev", + channel: "blog", + }, + { + title: "Canonical Syndication to Dev.to & Hashnode", + channel: "syndication", + }, + { + title: "Dual-Account Launch Thread (@CodingCatDev + @codercatdev)", + channel: "x", + }, + { title: "LinkedIn Technical Breakdown Post", channel: "linkedin" }, + ], + }, + { + id: "podcast-showcase", + name: "Sponsored Podcast & Multi-Channel Showcase", + priceUsd: 2000, + totalAmountCents: 200000, + depositAmountCents: 100000, + balanceAmountCents: 100000, + tagline: + "Fast-Track Recording \u00b7 Founder / DevRel Engineering Deep-Dive", + description: + "Priority fast-track 45-minute podcast & video episode on CodingCat.dev + 4 vertical Shorts distributed across 7 platforms + 60-second host-read mid-roll callout + Permanent show notes, canonical blog feature, and Live ROI Deal Room.", + deliverables: [ + { + title: "45-Minute Sponsored Podcast & YouTube Video Episode", + channel: "youtube", + }, + { + title: "4x Vertical Episode Shorts across 7 Platforms", + channel: "shorts-network", + }, + { + title: "Canonical Episode Post & Show Notes on CodingCat.dev", + channel: "blog", + }, + { + title: + "Multi-Channel Launch Amplification (X, LinkedIn, Bluesky, Threads, Mastodon)", + channel: "x", + }, + ], + }, + { + id: "ecosystem-integration", + name: "Ecosystem Integration (Mid-Roll + Social Pack)", + priceUsd: 950, + totalAmountCents: 95000, + depositAmountCents: 47500, + balanceAmountCents: 47500, + tagline: + "High-Intent Developer Reach \u00b7 60s Integration + Social Thread", + description: + "60-second host-read technical demo integrated into a relevant CodingCat.dev video + Dedicated multi-channel social thread across X, LinkedIn, Bluesky, Threads, and Mastodon + Permanent sponsor link on codingcat.dev.", + deliverables: [ + { + title: "60-Second Host-Read Integrated Mid-Roll Ad", + channel: "youtube", + }, + { + title: + "Multi-Channel Social Thread (X, LinkedIn, Bluesky, Threads, Mastodon)", + channel: "x", + }, + { + title: "Permanent Sponsor Link & Show Notes Inclusion", + channel: "blog", + }, + ], + }, + { + id: "dedicated-video", + name: "Standalone Dedicated YouTube Video", + priceUsd: 2500, + totalAmountCents: 250000, + depositAmountCents: 125000, + balanceAmountCents: 125000, + tagline: "End-to-End Architecture & Code Walkthrough", + description: + "Full 10-to-15 minute YouTube video dedicated entirely to building with your product, SDK, or platform. Includes permanent pinned link and sponsor page placement.", + deliverables: [ + { title: "Dedicated YouTube Video Walkthrough", channel: "youtube" }, + { title: "Social Launch Post across X & LinkedIn", channel: "x" }, + ], + }, + { + id: "mid-roll-ad", + name: "Integrated 60s Mid-Roll Ad", + priceUsd: 1800, + totalAmountCents: 180000, + depositAmountCents: 90000, + balanceAmountCents: 90000, + tagline: "Flagship Tutorial Integration", + description: + "60-second host-read integration inside a flagship tutorial or architecture breakdown, with permanent description link and chapter marker.", + deliverables: [ + { title: "60-Second Integrated Mid-Roll Segment", channel: "youtube" }, + ], + }, + { + id: "custom-series", + name: "Multi-Part Video Series & Advisory", + priceUsd: 6000, + totalAmountCents: 600000, + depositAmountCents: 300000, + balanceAmountCents: 300000, + tagline: "Custom Enterprise Campaign \u00b7 3+ Videos + Shorts + Articles", + description: + "Multi-part technical series covering your platform from quickstart to production scale, complete with dedicated Shorts, canonical articles, and quarterly campaign reporting.", + deliverables: [ + { title: "Multi-Part YouTube Technical Series", channel: "youtube" }, + { + title: "12x Multi-Platform Vertical Shorts", + channel: "shorts-network", + }, + { + title: "Canonical Documentation & Tutorial Series on CodingCat.dev", + channel: "blog", + }, + ], + }, +]; + +export function resolveSponsorTier( + rawTier: string | string[] | undefined, +): SponsorPackageTier { + const text = ( + Array.isArray(rawTier) ? rawTier.join(" ") : String(rawTier ?? "") + ).toLowerCase(); + for (const tier of SPONSOR_PACKAGE_TIERS) { + if (text.includes(tier.id) || text.includes(tier.name.toLowerCase())) { + return tier; + } + } + if ( + text.includes("full-stack") || + text.includes("bundle") || + text.includes("3,500") || + text.includes("3500") + ) { + return SPONSOR_PACKAGE_TIERS[0]; + } + if ( + text.includes("podcast") || + text.includes("showcase") || + text.includes("2,000") || + text.includes("2000") + ) { + return SPONSOR_PACKAGE_TIERS[1]; + } + if (text.includes("ecosystem") || text.includes("950")) { + return SPONSOR_PACKAGE_TIERS[2]; + } + if (text.includes("dedicated")) { + return SPONSOR_PACKAGE_TIERS[3]; + } + if ( + text.includes("mid-roll") || + text.includes("1,800") || + text.includes("1800") + ) { + return SPONSOR_PACKAGE_TIERS[4]; + } + if (text.includes("series") || text.includes("custom")) { + return SPONSOR_PACKAGE_TIERS[5]; + } + return SPONSOR_PACKAGE_TIERS[0]; +} + +export function getSanityServerClient(): { + client: SanityClient; + canWrite: boolean; +} { + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + const projectId = workerEnv.PUBLIC_SANITY_PROJECT_ID || "hfh83o0w"; + const dataset = workerEnv.PUBLIC_SANITY_DATASET || "production"; + const apiVersion = workerEnv.PUBLIC_SANITY_API_VERSION || "2025-09-30"; + const writeToken = + workerEnv.SANITY_API_WRITE_TOKEN || + workerEnv.SANITY_AUTH_TOKEN || + workerEnv.SANITY_WRITE_TOKEN; + const readToken = workerEnv.SANITY_API_READ_TOKEN; + const token = writeToken || readToken; + + const client = createClient({ + projectId, + dataset, + apiVersion, + useCdn: false, + token, + perspective: "published", + }); + + return { + client, + canWrite: Boolean(writeToken), + }; +} diff --git a/apps/site/src/lib/stripe.ts b/apps/site/src/lib/stripe.ts new file mode 100644 index 00000000..49661344 --- /dev/null +++ b/apps/site/src/lib/stripe.ts @@ -0,0 +1,258 @@ +import { env } from "cloudflare:workers"; + +export interface StripeMilestoneSessionParams { + leadId: string; + portalToken: string; + companyName: string; + contactEmail: string; + packageName: string; + milestone: "deposit" | "balance"; + amountCents: number; + siteUrl: string; +} + +export interface StripeInvoiceResult { + invoiceId: string; + hostedInvoiceUrl: string; +} + +function getStripeSecretKey(): string | undefined { + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + return workerEnv.STRIPE_SECRET_KEY; +} + +function toFormUrlEncoded( + params: Record, +): string { + const search = new URLSearchParams(); + for (const [k, v] of Object.entries(params)) { + if (v !== undefined && v !== null && v !== "") { + search.append(k, String(v)); + } + } + return search.toString(); +} + +/** + * Creates a Stripe Checkout Session for either the 50% Upfront Deposit + * or the 50% Final Balance on Publish. + */ +export async function createStripeMilestoneCheckout( + params: StripeMilestoneSessionParams, +): Promise<{ checkoutUrl: string; sessionId: string } | null> { + const secretKey = getStripeSecretKey(); + if (!secretKey) { + return null; + } + + const label = + params.milestone === "deposit" + ? `50% Upfront Deposit: ${params.packageName} (${params.companyName})` + : `50% Final Balance: ${params.packageName} (${params.companyName})`; + + const description = + params.milestone === "deposit" + ? "Locks your production & recording slot on CodingCat.dev. Remaining 50% balance due upon publication." + : "Final 50% balance upon publication of your CodingCat.dev launch campaign."; + + const body = toFormUrlEncoded({ + mode: "payment", + customer_email: params.contactEmail, + success_url: `${params.siteUrl}/portal/${params.portalToken}?payment=${params.milestone}_success`, + cancel_url: `${params.siteUrl}/portal/${params.portalToken}?payment=cancelled`, + "line_items[0][price_data][currency]": "usd", + "line_items[0][price_data][unit_amount]": params.amountCents, + "line_items[0][price_data][product_data][name]": label, + "line_items[0][price_data][product_data][description]": description, + "line_items[0][quantity]": 1, + "metadata[leadId]": params.leadId, + "metadata[portalToken]": params.portalToken, + "metadata[milestone]": params.milestone, + "metadata[companyName]": params.companyName, + "metadata[packageName]": params.packageName, + }); + + const res = await fetch("https://api.stripe.com/v1/checkout/sessions", { + method: "POST", + headers: { + Authorization: `Bearer ${secretKey}`, + "Content-Type": "application/x-www-form-urlencoded", + }, + body, + }); + + if (!res.ok) { + return null; + } + const data = (await res.json()) as { id?: string; url?: string }; + if (!data.id || !data.url) { + return null; + } + return { sessionId: data.id, checkoutUrl: data.url }; +} + +/** + * Creates & finalizes a Stripe Hosted Invoice (Net-15 or Net-30) for enterprise + * sponsors who pay via AP / ACH / Wire or Corporate Card. + */ +export async function createStripeMilestoneInvoice( + params: StripeMilestoneSessionParams & { daysUntilDue?: number }, +): Promise { + const secretKey = getStripeSecretKey(); + if (!secretKey) { + return null; + } + + const headers = { + Authorization: `Bearer ${secretKey}`, + "Content-Type": "application/x-www-form-urlencoded", + }; + + // 1. Find or create customer + const searchRes = await fetch( + `https://api.stripe.com/v1/customers?email=${encodeURIComponent(params.contactEmail)}&limit=1`, + { headers: { Authorization: `Bearer ${secretKey}` } }, + ); + const searchData = (await searchRes.json()) as { + data?: Array<{ id: string }>; + }; + let customerId = searchData.data?.[0]?.id; + + if (!customerId) { + const createCustomerRes = await fetch( + "https://api.stripe.com/v1/customers", + { + method: "POST", + headers, + body: toFormUrlEncoded({ + name: params.companyName, + email: params.contactEmail, + "metadata[leadId]": params.leadId, + "metadata[portalToken]": params.portalToken, + }), + }, + ); + if (!createCustomerRes.ok) { + return null; + } + const customer = (await createCustomerRes.json()) as { id: string }; + customerId = customer.id; + } + + const label = + params.milestone === "deposit" + ? `50% Upfront Deposit: ${params.packageName} (${params.companyName})` + : `50% Final Balance: ${params.packageName} (${params.companyName})`; + + // 2. Create draft invoice + const invoiceRes = await fetch("https://api.stripe.com/v1/invoices", { + method: "POST", + headers, + body: toFormUrlEncoded({ + customer: customerId, + collection_method: "send_invoice", + days_until_due: params.daysUntilDue ?? 15, + description: `CodingCat.dev Sponsorship (${params.packageName}) โ€” Deal Room: ${params.siteUrl}/portal/${params.portalToken}`, + "metadata[leadId]": params.leadId, + "metadata[portalToken]": params.portalToken, + "metadata[milestone]": params.milestone, + "metadata[companyName]": params.companyName, + "metadata[packageName]": params.packageName, + }), + }); + if (!invoiceRes.ok) { + return null; + } + const invoice = (await invoiceRes.json()) as { id: string }; + + // 3. Attach invoice item + const itemRes = await fetch("https://api.stripe.com/v1/invoiceitems", { + method: "POST", + headers, + body: toFormUrlEncoded({ + customer: customerId, + invoice: invoice.id, + amount: params.amountCents, + currency: "usd", + description: label, + }), + }); + if (!itemRes.ok) { + return null; + } + + // 4. Finalize invoice so hosted_invoice_url is immediately live + const finalizeRes = await fetch( + `https://api.stripe.com/v1/invoices/${invoice.id}/finalize`, + { + method: "POST", + headers, + }, + ); + if (!finalizeRes.ok) { + return null; + } + const finalized = (await finalizeRes.json()) as { + id: string; + hosted_invoice_url?: string; + }; + if (!finalized.hosted_invoice_url) { + return null; + } + + return { + invoiceId: finalized.id, + hostedInvoiceUrl: finalized.hosted_invoice_url, + }; +} + +/** + * Verifies a Stripe Webhook signature using Web Crypto API (Cloudflare Workers compatible). + */ +export async function verifyStripeWebhookSignature( + payload: string, + sigHeader: string | null, + secret: string, +): Promise { + if (!sigHeader || !secret) { + return false; + } + const parts = sigHeader + .split(",") + .reduce>((acc, part) => { + const [k, v] = part.split("="); + if (k && v) { + acc[k.trim()] = v.trim(); + } + return acc; + }, {}); + + const timestamp = parts.t; + const signature = parts.v1; + if (!timestamp || !signature) { + return false; + } + + const signedPayload = `${timestamp}.${payload}`; + const encoder = new TextEncoder(); + const key = await crypto.subtle.importKey( + "raw", + encoder.encode(secret), + { name: "HMAC", hash: "SHA-256" }, + false, + ["sign"], + ); + const sigBuffer = await crypto.subtle.sign( + "HMAC", + key, + encoder.encode(signedPayload), + ); + const expectedHex = Array.from(new Uint8Array(sigBuffer)) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); + + return expectedHex === signature; +} diff --git a/apps/site/src/pages/api/booking.ts b/apps/site/src/pages/api/booking.ts new file mode 100644 index 00000000..53158e0e --- /dev/null +++ b/apps/site/src/pages/api/booking.ts @@ -0,0 +1,216 @@ +import { env } from "cloudflare:workers"; +import type { APIRoute } from "astro"; +import { sendCodingCatEmail } from "@/lib/email"; +import { + getSanityServerClient, + resolveSponsorTier, +} from "@/lib/sanity/write-client"; +import { + createStripeMilestoneCheckout, + createStripeMilestoneInvoice, +} from "@/lib/stripe"; + +interface BookingPayload { + guestName?: string; + guestEmail?: string; + company?: string; + socialUrl?: string; + track?: "editorial" | "sponsored" | "full-stack-launch"; + slotStartAt?: string; + topics?: string; + signatureMode?: "draw" | "type"; + signatureData?: string; + consentRecording?: boolean; + consentCommercial?: boolean; + consentLikeness?: boolean; +} + +export const POST: APIRoute = async ({ request, url }) => { + let data: BookingPayload = {}; + try { + data = (await request.json()) as BookingPayload; + } catch { + return new Response( + JSON.stringify({ success: false, message: "Invalid JSON payload" }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ); + } + + const guestName = data.guestName?.trim(); + const guestEmail = data.guestEmail?.trim(); + const company = data.company?.trim() || guestName || "Podcast Guest"; + const socialUrl = data.socialUrl?.trim(); + const track = data.track || "editorial"; + const slotStartAt = + data.slotStartAt || new Date(Date.now() + 7 * 86400_000).toISOString(); + const topics = data.topics?.trim(); + const signatureMode = data.signatureMode || "type"; + const signatureData = data.signatureData || guestName; + + if (!guestName || !guestEmail || !guestEmail.includes("@") || !topics) { + return new Response( + JSON.stringify({ + success: false, + message: "Guest name, valid email, and talking points are required.", + }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ); + } + + const bookingId = `booking-${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + const portalToken = `spt_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + const isSponsored = track === "sponsored" || track === "full-stack-launch"; + const appointmentScheduleUrl = + track === "full-stack-launch" + ? "https://calendar.app.google/tyGiF6dGFQeaVrN66" + : "https://calendar.app.google/s3B6PEqbVsGcY81MA"; + + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + const fallbackOrigin = url?.origin ?? new URL(request.url).origin; + const siteUrl = (workerEnv.SITE_URL || fallbackOrigin).replace(/\/$/, ""); + + const { client, canWrite } = getSanityServerClient(); + let portalUrl: string | undefined; + let stripeDepositCheckoutUrl: string | undefined; + let stripeDepositInvoiceUrl: string | undefined; + + if (isSponsored) { + const tier = resolveSponsorTier( + track === "full-stack-launch" ? "full-stack-launch" : "podcast-showcase", + ); + const leadId = `sponsorLead-${portalToken}`; + + try { + const [checkout, invoice] = await Promise.all([ + createStripeMilestoneCheckout({ + leadId, + portalToken, + companyName: company, + contactEmail: guestEmail, + packageName: tier.name, + milestone: "deposit", + amountCents: tier.depositAmountCents, + siteUrl, + }), + createStripeMilestoneInvoice({ + leadId, + portalToken, + companyName: company, + contactEmail: guestEmail, + packageName: tier.name, + milestone: "deposit", + amountCents: tier.depositAmountCents, + siteUrl, + daysUntilDue: 15, + }), + ]); + stripeDepositCheckoutUrl = checkout?.checkoutUrl; + stripeDepositInvoiceUrl = invoice?.hostedInvoiceUrl; + } catch { + // Stripe optional in dev + } + + if (canWrite) { + try { + await client.createOrReplace({ + _id: leadId, + _type: "sponsorLead", + companyName: company, + contactName: guestName, + contactEmail: guestEmail, + ...(socialUrl ? { website: socialUrl } : {}), + portalToken, + source: "booking", + status: + stripeDepositCheckoutUrl || stripeDepositInvoiceUrl + ? "deposit_sent" + : "new", + rateCard: tier.id, + totalAmountCents: tier.totalAmountCents, + depositAmountCents: tier.depositAmountCents, + balanceAmountCents: tier.balanceAmountCents, + ...(stripeDepositCheckoutUrl ? { stripeDepositCheckoutUrl } : {}), + ...(stripeDepositInvoiceUrl ? { stripeDepositInvoiceUrl } : {}), + intent: topics, + deliverables: tier.deliverables.map((d, idx) => ({ + _key: `deliv-${idx}`, + title: d.title, + channel: d.channel, + status: "pending", + })), + lastEmailAt: new Date().toISOString(), + }); + } catch { + // Non-fatal + } + } + + const queryFallback = new URLSearchParams({ + company, + name: guestName, + email: guestEmail, + tier: tier.id, + }); + portalUrl = `${siteUrl}/portal/${portalToken}?${queryFallback.toString()}`; + } + + if (canWrite) { + try { + await client.createOrReplace({ + _id: bookingId, + _type: "booking", + guestName, + guestEmail, + company, + ...(socialUrl ? { socialUrl } : {}), + track, + status: "pending", + slotStartAt, + topics, + appointmentScheduleUrl, + signatureMode, + signatureData, + signedAt: new Date().toISOString(), + consentRecording: data.consentRecording ?? true, + consentCommercial: data.consentCommercial ?? true, + consentLikeness: data.consentLikeness ?? true, + ...(isSponsored ? { portalToken } : {}), + }); + } catch { + // Non-fatal + } + } + + await sendCodingCatEmail({ + to: "alex.patterson@gmail.com", + subject: `[CodingCat.dev ${isSponsored ? "Fast-Track Sponsored" : "Editorial"} Booking] ${guestName} (${company})`, + text: [ + "New Podcast Booking & Signed Media Release", + `Track: ${track}`, + `Guest: ${guestName} <${guestEmail}>`, + `Company: ${company}`, + `Requested Slot: ${slotStartAt}`, + `Topics: ${topics}`, + `Calendar Link: ${appointmentScheduleUrl}`, + ...(portalUrl ? [`Deal Room: ${portalUrl}`] : []), + ].join("\n"), + }); + + return new Response( + JSON.stringify({ + success: true, + bookingId, + track, + isSponsored, + appointmentScheduleUrl, + portalToken: isSponsored ? portalToken : undefined, + portalUrl, + stripeDepositCheckoutUrl, + stripeDepositInvoiceUrl, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); +}; diff --git a/apps/site/src/pages/api/calendar/freebusy.ts b/apps/site/src/pages/api/calendar/freebusy.ts new file mode 100644 index 00000000..5c4074ab --- /dev/null +++ b/apps/site/src/pages/api/calendar/freebusy.ts @@ -0,0 +1,28 @@ +import type { APIRoute } from "astro"; +import { + CODINGCAT_CALENDAR_IDS, + getMultiCalendarAvailableSlots, +} from "@/lib/google-calendar"; + +export const GET: APIRoute = async ({ request, url }) => { + const reqUrl = url ?? new URL(request.url); + const max = Number(reqUrl.searchParams.get("limit") || 9); + const { slots, liveVerified } = await getMultiCalendarAvailableSlots( + Math.min(18, Math.max(3, max)), + ); + + return new Response( + JSON.stringify({ + success: true, + liveVerified, + checkedCalendars: CODINGCAT_CALENDAR_IDS, + workHoursPolicy: + "8:00 AM - 5:00 PM PT / ET Overlap (11:00 AM - 5:00 PM ET)", + slots, + }), + { + status: 200, + headers: { "Content-Type": "application/json" }, + }, + ); +}; diff --git a/apps/site/src/pages/api/sponsors/outbound.ts b/apps/site/src/pages/api/sponsors/outbound.ts new file mode 100644 index 00000000..89f84547 --- /dev/null +++ b/apps/site/src/pages/api/sponsors/outbound.ts @@ -0,0 +1,322 @@ +import type { APIRoute } from "astro"; +import { sendCodingCatEmail } from "@/lib/email"; +import { getSanityServerClient } from "@/lib/sanity/write-client"; + +export interface OutboundProspect { + companyName: string; + website: string; + contactName: string; + contactEmail: string; + category: string; + fundingRound: string; + source: "yc" | "hackernews" | "linkedin" | "curated"; + relevanceScore: number; + videoConcepts: Array<{ + title: string; + hook: string; + angle: string; + targetPackage: string; + }>; + outreachDraftSubject: string; + outreachDraftBody: string; +} + +function sanitizeDashes(text: string): string { + return text + .replace(/\u2014/g, ", ") + .replace(/\u2013/g, "-") + .replace(/--+/g, ","); +} + +function buildTailoredConcepts( + companyName: string, + category: string, + summary: string, +) { + const cleanSummary = sanitizeDashes( + summary || category || "AI and developer infrastructure", + ); + const concepts = [ + { + title: `Building Production AI Agents with ${companyName}: Architecture & Cost Breakdown`, + hook: `Most teams wire up ${companyName} in a weekend prototype and hit scaling walls in production. Here is how to structure ${companyName} in 60 seconds without burning token or latency budgets.`, + angle: + "End-to-end production build on CodingCat.dev showing real SDK integration, latency benchmarks, and 4 vertical Shorts syndicated across 7 developer networks.", + targetPackage: "Full-Stack Launch Bundle ($3,500)", + }, + { + title: `Under the Hood of ${companyName}: Engineering Deep-Dive (${cleanSummary.slice(0, 60)})`, + hook: `What happens under the hood when you replace brittle glue code with ${companyName}? Let us walk through the live architecture.`, + angle: + "45-minute technical founder/staff-engineer podcast showcase + canonical AEO/WebMCP article on codingcat.dev syndicated to Dev.to and Hashnode.", + targetPackage: "Sponsored Podcast & Multi-Channel Showcase ($2,000)", + }, + ]; + + const outreachDraftSubject = sanitizeDashes( + `2 technical video concepts for ${companyName} x CodingCat.dev`, + ); + + const outreachDraftBody = sanitizeDashes( + [ + `Hi ${companyName} team,`, + "", + `I have been following ${companyName}'s momentum in ${cleanSummary} and put together two concrete technical video concepts we could build and distribute for your team on CodingCat.dev (61.2K+ YouTube subscribers, ~21% US/CA/UK/AU senior engineering audience, 7-platform Shorts syndication, and canonical AEO blog coverage):`, + "", + `1. "${concepts[0].title}"`, + ` Angle: ${concepts[0].angle}`, + "", + `2. "${concepts[1].title}"`, + ` Angle: ${concepts[1].angle}`, + "", + "Our Full-Stack Launch Bundle ($3,500 total, locked with a 50% upfront deposit and 50% on publish) includes the dedicated YouTube build, 4 vertical Shorts published across 7 platforms (28 native video posts), a canonical SEO + Agent-Ready (WebMCP / llms.txt) article on codingcat.dev syndicated to Dev.to and Hashnode, and a live ROI Deal Room.", + "", + "If you are open to a quick 15-minute scoping call this week, you can grab a time directly on my calendar here:", + "https://calendar.app.google/tyGiF6dGFQeaVrN66", + "", + "Best,", + "Alex Patterson", + "Founder, CodingCat.dev", + "https://codingcat.dev/sponsorships", + ].join("\n"), + ); + + return { concepts, outreachDraftSubject, outreachDraftBody }; +} + +async function discoverLaunchHnProspects(): Promise { + const prospects: OutboundProspect[] = []; + try { + const res = await fetch( + "https://hn.algolia.com/api/v1/search_by_date?query=%22Launch%20HN%22&tags=story&hitsPerPage=8", + ); + if (res.ok) { + const data = (await res.json()) as { + hits?: Array<{ + title?: string; + url?: string; + author?: string; + points?: number; + }>; + }; + for (const hit of data.hits ?? []) { + const rawTitle = hit.title ?? ""; + // Match "Launch HN: Company (YC W26) โ€“ Summary" + const cleaned = rawTitle.replace(/^Launch HN:\s*/i, ""); + const parts = cleaned.split(/[\u2013\u2014\-:]/); + const nameWithBatch = (parts[0] ?? "").trim(); + const summary = + parts.slice(1).join(" ").trim() || + "Developer Infrastructure & AI Tooling"; + const batchMatch = nameWithBatch.match(/\((YC [^)]+)\)/i); + const companyName = nameWithBatch + .replace(/\s*\([^)]*\)\s*/g, "") + .trim(); + if (!companyName || companyName.length < 2) { + continue; + } + + let domain = "example.com"; + if (hit.url) { + try { + domain = new URL(hit.url).hostname.replace(/^www\./, ""); + } catch { + // fallback + } + } + const website = hit.url || `https://${domain}`; + const { concepts, outreachDraftSubject, outreachDraftBody } = + buildTailoredConcepts(companyName, "AI / Developer Tools", summary); + + prospects.push({ + companyName, + website, + contactName: hit.author ? `${hit.author} (Founder)` : "Founding Team", + contactEmail: `founders@${domain}`, + category: sanitizeDashes(summary.slice(0, 80)), + fundingRound: batchMatch ? batchMatch[1] : "YC / Launch HN", + source: "yc", + relevanceScore: Math.min( + 98, + 75 + Math.round((hit.points ?? 20) / 10), + ), + videoConcepts: concepts, + outreachDraftSubject, + outreachDraftBody, + }); + } + } + } catch { + // Fallback curated prospects below + } + + if (prospects.length === 0) { + const fallbackSeeds = [ + { + companyName: "SuperPlane", + website: "https://superplane.com", + contactName: "Larisa (Growth)", + contactEmail: "larisa@superplane.com", + category: "Open-Source DevOps & Cloud Orchestration", + fundingRound: "GA Launch Oct 2026", + source: "curated" as const, + }, + { + companyName: "Tessen ZERO", + website: "https://tessen.ai", + contactName: "Yannick Parfait", + contactEmail: "hello@tessen.ai", + category: "Autonomous Security & AI Agent Guardrails", + fundingRound: "Seed Launch", + source: "curated" as const, + }, + ]; + for (const seed of fallbackSeeds) { + const { concepts, outreachDraftSubject, outreachDraftBody } = + buildTailoredConcepts(seed.companyName, seed.category, seed.category); + prospects.push({ + ...seed, + relevanceScore: 95, + videoConcepts: concepts, + outreachDraftSubject, + outreachDraftBody, + }); + } + } + + return prospects; +} + +export const GET: APIRoute = async () => { + const prospects = await discoverLaunchHnProspects(); + return new Response( + JSON.stringify({ + success: true, + count: prospects.length, + prospects, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); +}; + +export const POST: APIRoute = async ({ request }) => { + let body: { + action?: "discover" | "send_outreach"; + companyName?: string; + website?: string; + contactName?: string; + contactEmail?: string; + category?: string; + fundingRound?: string; + subject?: string; + message?: string; + } = {}; + + try { + body = await request.json(); + } catch { + // Default to discover + } + + if (body.action === "send_outreach" && body.contactEmail) { + const { concepts, outreachDraftSubject, outreachDraftBody } = + buildTailoredConcepts( + body.companyName || "Partner", + body.category || "Developer Tooling", + body.category || "Developer Tooling", + ); + + const subject = sanitizeDashes(body.subject || outreachDraftSubject); + const text = sanitizeDashes(body.message || outreachDraftBody); + + const sent = await sendCodingCatEmail({ + to: body.contactEmail, + subject, + text, + }); + + const { client, canWrite } = getSanityServerClient(); + if (canWrite && body.companyName) { + try { + const slugId = body.companyName + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-"); + await client.createOrReplace({ + _id: `sponsorPool-${slugId}`, + _type: "sponsorPool", + companyName: body.companyName, + contactName: body.contactName || "Founding Team", + contactEmail: body.contactEmail, + ...(body.website ? { website: body.website } : {}), + category: body.category || "AI / DevTools", + fundingRound: body.fundingRound || "Seed / Launch", + source: "yc", + relevanceScore: 92, + videoConcepts: concepts.map((c, idx) => ({ + _key: `vc-${idx}`, + ...c, + })), + outreachDraftSubject: subject, + outreachDraftBody: text, + lastContactedAt: new Date().toISOString(), + optedOut: false, + }); + } catch { + // Non-fatal + } + } + + return new Response( + JSON.stringify({ + success: true, + emailSentViaCloudflare: sent, + subject, + text, + videoConcepts: concepts, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); + } + + const prospects = await discoverLaunchHnProspects(); + const { client, canWrite } = getSanityServerClient(); + + if (canWrite) { + for (const p of prospects.slice(0, 6)) { + try { + const slugId = p.companyName.toLowerCase().replace(/[^a-z0-9]+/g, "-"); + await client.createOrReplace({ + _id: `sponsorPool-${slugId}`, + _type: "sponsorPool", + companyName: p.companyName, + contactName: p.contactName, + contactEmail: p.contactEmail, + website: p.website, + category: p.category, + fundingRound: p.fundingRound, + source: p.source, + relevanceScore: p.relevanceScore, + videoConcepts: p.videoConcepts.map((c, idx) => ({ + _key: `vc-${idx}`, + ...c, + })), + outreachDraftSubject: p.outreachDraftSubject, + outreachDraftBody: p.outreachDraftBody, + optedOut: false, + }); + } catch { + // Non-fatal + } + } + } + + return new Response( + JSON.stringify({ + success: true, + savedToSanity: canWrite, + count: prospects.length, + prospects, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); +}; diff --git a/apps/site/src/pages/api/sponsorship.ts b/apps/site/src/pages/api/sponsorship.ts index 6c771093..c2d6b054 100644 --- a/apps/site/src/pages/api/sponsorship.ts +++ b/apps/site/src/pages/api/sponsorship.ts @@ -1,5 +1,14 @@ import { env } from "cloudflare:workers"; import type { APIRoute } from "astro"; +import { sendCodingCatEmail } from "@/lib/email"; +import { + getSanityServerClient, + resolveSponsorTier, +} from "@/lib/sanity/write-client"; +import { + createStripeMilestoneCheckout, + createStripeMilestoneInvoice, +} from "@/lib/stripe"; interface SponsorshipPayload { name?: string; @@ -7,34 +16,14 @@ interface SponsorshipPayload { email?: string; company?: string; companyName?: string; + website?: string; tier?: string | string[]; sponsorshipTier?: string | string[]; + paymentPreference?: "checkout" | "invoice"; message?: string; } -function getTierBudgetCents(tier: string | string[] | undefined): number { - const raw = ( - Array.isArray(tier) ? tier.join(" ") : String(tier ?? "") - ).toLowerCase(); - if (raw.includes("dedicated")) { - return 400000; - } - if (raw.includes("mid-roll") || raw.includes("integrated")) { - return 180000; - } - if (raw.includes("shout-out")) { - return 90000; - } - if (raw.includes("newsletter") || raw.includes("blog")) { - return 50000; - } - if (raw.includes("series") || raw.includes("custom")) { - return 500000; - } - return 150000; -} - -export const POST: APIRoute = async ({ request }) => { +export const POST: APIRoute = async ({ request, url }) => { let data: SponsorshipPayload = {}; const contentType = request.headers.get("content-type") ?? ""; @@ -92,8 +81,10 @@ export const POST: APIRoute = async ({ request }) => { const name = (data.name ?? data.fullName)?.trim(); const email = data.email?.trim(); - const company = (data.company ?? data.companyName)?.trim(); - const tier = data.tier ?? data.sponsorshipTier; + const company = + (data.company ?? data.companyName)?.trim() || name || "Sponsor Partner"; + const website = data.website?.trim(); + const rawTier = data.tier ?? data.sponsorshipTier; const message = data.message?.trim(); if (!name) { @@ -120,8 +111,8 @@ export const POST: APIRoute = async ({ request }) => { } const hasTier = - (typeof tier === "string" && tier.trim().length > 0) || - (Array.isArray(tier) && tier.length > 0); + (typeof rawTier === "string" && rawTier.trim().length > 0) || + (Array.isArray(rawTier) && rawTier.length > 0); if (!hasTier) { return new Response( @@ -136,66 +127,128 @@ export const POST: APIRoute = async ({ request }) => { ); } - const targetPlacements = Array.isArray(tier) ? tier : [String(tier)]; - const proposedBudget = getTierBudgetCents(tier); + const selectedTier = resolveSponsorTier(rawTier); + const portalToken = `spt_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + const leadId = `sponsorLead-${portalToken}`; - const flipcoreUrl = - (env as unknown as Record)?.FLIPCORE_API_URL ?? - "https://api.flipfeeds.com"; - const flipcoreWebUrl = - (env as unknown as Record) - ?.PUBLIC_FLIPCORE_WEB_URL ?? "https://flipfeeds.com"; + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + const fallbackOrigin = url?.origin ?? new URL(request.url).origin; + const siteUrl = (workerEnv.SITE_URL || fallbackOrigin).replace(/\/$/, ""); - const fallbackToken = `spt_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; - let portalToken = fallbackToken; - let portalUrl = `${flipcoreWebUrl}/codingcatdev/portal/${fallbackToken}`; - let dealId = `deal_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; - let inquiryId = `inq_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + // 1. Optional Stripe 50% Upfront Deposit Checkout + Net-15 Invoice generation + let stripeDepositCheckoutUrl: string | undefined; + let stripeDepositInvoiceId: string | undefined; + let stripeDepositInvoiceUrl: string | undefined; try { - const flipcoreRes = await fetch(`${flipcoreUrl}/v1/deals/inquiries`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - sponsorName: name, - sponsorEmail: email, - companyName: company ?? undefined, - targetPlacements, - proposedBudget, - currency: "USD", - message: message ?? undefined, - slug: "codingcatdev", + const [checkout, invoice] = await Promise.all([ + createStripeMilestoneCheckout({ + leadId, + portalToken, + companyName: company, + contactEmail: email, + packageName: selectedTier.name, + milestone: "deposit", + amountCents: selectedTier.depositAmountCents, + siteUrl, }), - }); + createStripeMilestoneInvoice({ + leadId, + portalToken, + companyName: company, + contactEmail: email, + packageName: selectedTier.name, + milestone: "deposit", + amountCents: selectedTier.depositAmountCents, + siteUrl, + daysUntilDue: 15, + }), + ]); + stripeDepositCheckoutUrl = checkout?.checkoutUrl; + stripeDepositInvoiceId = invoice?.invoiceId; + stripeDepositInvoiceUrl = invoice?.hostedInvoiceUrl; + } catch { + // Non-fatal if Stripe is not configured in local dev + } - if (flipcoreRes.ok) { - const resData = (await flipcoreRes.json()) as any; - if (resData.portalUrl) { - portalUrl = resData.portalUrl; - } - if (resData.portalToken) { - portalToken = resData.portalToken; - } - if (resData.dealId) { - dealId = resData.dealId; - } - if (resData.inquiryId) { - inquiryId = resData.inquiryId; - } + // 2. Persist sponsorLead directly in Sanity + const { client, canWrite } = getSanityServerClient(); + if (canWrite) { + try { + await client.createOrReplace({ + _id: leadId, + _type: "sponsorLead", + companyName: company, + contactName: name, + contactEmail: email, + ...(website ? { website } : {}), + portalToken, + source: "inbound", + status: + stripeDepositCheckoutUrl || stripeDepositInvoiceUrl + ? "deposit_sent" + : "new", + rateCard: selectedTier.id, + totalAmountCents: selectedTier.totalAmountCents, + depositAmountCents: selectedTier.depositAmountCents, + balanceAmountCents: selectedTier.balanceAmountCents, + ...(stripeDepositCheckoutUrl ? { stripeDepositCheckoutUrl } : {}), + ...(stripeDepositInvoiceId ? { stripeDepositInvoiceId } : {}), + ...(stripeDepositInvoiceUrl ? { stripeDepositInvoiceUrl } : {}), + intent: + message || + `Selected package: ${selectedTier.name} ($${selectedTier.priceUsd})`, + deliverables: selectedTier.deliverables.map((d, idx) => ({ + _key: `deliv-${idx}`, + title: d.title, + channel: d.channel, + status: "pending", + })), + lastEmailAt: new Date().toISOString(), + }); + } catch { + // Fallback to stateless Deal Room params if write token lacks permissions } - } catch { - // Resilient fallback: uses pre-generated live Deal Room URL } + const queryFallback = new URLSearchParams({ + company, + name, + email, + tier: selectedTier.id, + }); + const portalUrl = `${siteUrl}/portal/${portalToken}?${queryFallback.toString()}`; + + // 3. Fire-and-forget notification email via Cloudflare Email Routing if bound + await sendCodingCatEmail({ + to: "alex.patterson@gmail.com", + subject: `[CodingCat.dev Sponsor Inquiry] ${company} (${selectedTier.name} - $${selectedTier.priceUsd})`, + text: [ + "New Sponsorship Inquiry on CodingCat.dev", + `Company: ${company}`, + `Contact: ${name} <${email}>`, + `Package: ${selectedTier.name} ($${selectedTier.priceUsd} total / $${selectedTier.depositAmountCents / 100} 50% deposit)`, + `Deal Room URL: ${portalUrl}`, + `Message: ${message || "(none)"}`, + ].join("\n"), + }); + return new Response( JSON.stringify({ success: true, message: "Inquiry received", - inquiryId, - dealId, + inquiryId: leadId, + dealId: leadId, portalToken, portalUrl, dealRoomUrl: portalUrl, + depositAmountUsd: selectedTier.depositAmountCents / 100, + totalAmountUsd: selectedTier.priceUsd, + stripeDepositCheckoutUrl, + stripeDepositInvoiceUrl, }), { status: 200, diff --git a/apps/site/src/pages/api/stripe/milestone.ts b/apps/site/src/pages/api/stripe/milestone.ts new file mode 100644 index 00000000..75d31ce1 --- /dev/null +++ b/apps/site/src/pages/api/stripe/milestone.ts @@ -0,0 +1,167 @@ +import { env } from "cloudflare:workers"; +import type { APIRoute } from "astro"; +import { + getSanityServerClient, + resolveSponsorTier, +} from "@/lib/sanity/write-client"; +import { + createStripeMilestoneCheckout, + createStripeMilestoneInvoice, +} from "@/lib/stripe"; + +export const POST: APIRoute = async ({ request, url }) => { + let body: { + portalToken?: string; + leadId?: string; + companyName?: string; + contactEmail?: string; + tier?: string; + milestone?: "deposit" | "balance"; + mode?: "checkout" | "invoice"; + daysUntilDue?: number; + } = {}; + + try { + body = await request.json(); + } catch { + return new Response( + JSON.stringify({ success: false, message: "Invalid JSON body" }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ); + } + + const portalToken = + body.portalToken || + `spt_${crypto.randomUUID().replace(/-/g, "").slice(0, 16)}`; + const leadId = body.leadId || `sponsorLead-${portalToken}`; + const milestone = body.milestone || "deposit"; + const mode = body.mode || "checkout"; + const tier = resolveSponsorTier(body.tier); + const amountCents = + milestone === "deposit" ? tier.depositAmountCents : tier.balanceAmountCents; + + const companyName = body.companyName || "Sponsor Partner"; + const contactEmail = body.contactEmail || "alex@codingcat.dev"; + + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + const fallbackOrigin = url?.origin ?? new URL(request.url).origin; + const siteUrl = (workerEnv.SITE_URL || fallbackOrigin).replace(/\/$/, ""); + + if (mode === "invoice") { + const invoice = await createStripeMilestoneInvoice({ + leadId, + portalToken, + companyName, + contactEmail, + packageName: tier.name, + milestone, + amountCents, + siteUrl, + daysUntilDue: body.daysUntilDue ?? 15, + }); + + if (!invoice) { + return new Response( + JSON.stringify({ + success: false, + message: + "Stripe secret key not configured or invoice creation failed.", + }), + { status: 503, headers: { "Content-Type": "application/json" } }, + ); + } + + const { client, canWrite } = getSanityServerClient(); + if (canWrite) { + try { + await client + .patch(leadId) + .set( + milestone === "deposit" + ? { + stripeDepositInvoiceId: invoice.invoiceId, + stripeDepositInvoiceUrl: invoice.hostedInvoiceUrl, + status: "deposit_sent", + } + : { + stripeBalanceInvoiceId: invoice.invoiceId, + stripeBalanceInvoiceUrl: invoice.hostedInvoiceUrl, + status: "balance_sent", + }, + ) + .commit(); + } catch { + // Non-fatal + } + } + + return new Response( + JSON.stringify({ + success: true, + milestone, + mode: "invoice", + invoiceId: invoice.invoiceId, + url: invoice.hostedInvoiceUrl, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); + } + + const checkout = await createStripeMilestoneCheckout({ + leadId, + portalToken, + companyName, + contactEmail, + packageName: tier.name, + milestone, + amountCents, + siteUrl, + }); + + if (!checkout) { + return new Response( + JSON.stringify({ + success: false, + message: + "Stripe secret key not configured or checkout creation failed.", + }), + { status: 503, headers: { "Content-Type": "application/json" } }, + ); + } + + const { client, canWrite } = getSanityServerClient(); + if (canWrite) { + try { + await client + .patch(leadId) + .set( + milestone === "deposit" + ? { + stripeDepositCheckoutUrl: checkout.checkoutUrl, + status: "deposit_sent", + } + : { + stripeBalanceCheckoutUrl: checkout.checkoutUrl, + status: "balance_sent", + }, + ) + .commit(); + } catch { + // Non-fatal + } + } + + return new Response( + JSON.stringify({ + success: true, + milestone, + mode: "checkout", + sessionId: checkout.sessionId, + url: checkout.checkoutUrl, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); +}; diff --git a/apps/site/src/pages/api/stripe/webhook.ts b/apps/site/src/pages/api/stripe/webhook.ts new file mode 100644 index 00000000..f1797d5f --- /dev/null +++ b/apps/site/src/pages/api/stripe/webhook.ts @@ -0,0 +1,111 @@ +import { env } from "cloudflare:workers"; +import type { APIRoute } from "astro"; +import { getSanityServerClient } from "@/lib/sanity/write-client"; +import { verifyStripeWebhookSignature } from "@/lib/stripe"; + +export const POST: APIRoute = async ({ request }) => { + const rawBody = await request.text(); + const sigHeader = request.headers.get("stripe-signature"); + + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + const webhookSecret = workerEnv.STRIPE_WEBHOOK_SECRET; + + if (webhookSecret) { + const valid = await verifyStripeWebhookSignature( + rawBody, + sigHeader, + webhookSecret, + ); + if (!valid) { + return new Response( + JSON.stringify({ error: "Invalid Stripe signature" }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ); + } + } + + let event: { + type?: string; + data?: { + object?: { + id?: string; + metadata?: { + leadId?: string; + portalToken?: string; + milestone?: "deposit" | "balance"; + companyName?: string; + }; + }; + }; + }; + + try { + event = JSON.parse(rawBody); + } catch { + return new Response(JSON.stringify({ error: "Invalid JSON" }), { + status: 400, + }); + } + + if ( + event.type === "checkout.session.completed" || + event.type === "invoice.paid" + ) { + const obj = event.data?.object; + const leadId = obj?.metadata?.leadId; + const milestone = obj?.metadata?.milestone || "deposit"; + const companyName = obj?.metadata?.companyName; + const nowIso = new Date().toISOString(); + + const { client, canWrite } = getSanityServerClient(); + if (canWrite && leadId) { + try { + if (milestone === "deposit") { + await client + .patch(leadId) + .set({ + status: "deposit_paid", + depositPaidAt: nowIso, + }) + .commit(); + } else { + // Final 50% balance paid -> mark paid in full and ensure public sponsor doc exists + const sponsorId = `sponsor-${leadId.replace(/^sponsorLead-/, "")}`; + if (companyName) { + await client.createIfNotExists({ + _id: sponsorId, + _type: "sponsor", + title: companyName, + description: `Official CodingCat.dev Launch Partner (${companyName})`, + }); + } + await client + .patch(leadId) + .set({ + status: "paid", + balancePaidAt: nowIso, + ...(companyName + ? { + sponsorDocId: { + _type: "reference", + _ref: sponsorId, + }, + } + : {}), + }) + .commit(); + } + } catch { + // Non-fatal + } + } + } + + return new Response(JSON.stringify({ received: true }), { + status: 200, + headers: { "Content-Type": "application/json" }, + }); +}; diff --git a/apps/site/src/pages/book.astro b/apps/site/src/pages/book.astro index a1ecb0ab..2ab24e13 100644 --- a/apps/site/src/pages/book.astro +++ b/apps/site/src/pages/book.astro @@ -2,102 +2,24 @@ import Breadcrumbs from "@/components/Breadcrumbs.astro"; import PodmatchBadge from "@/components/PodmatchBadge.astro"; import BaseLayout from "@/layouts/BaseLayout.astro"; -import { env } from "cloudflare:workers"; - -interface BookingPageDetails { - title: string; - description: string; - durationMinutes: number; - hostName: string; - slug: string; - slots: Array<{ - id: string; - startAt: string; - displayDate: string; - displayTime: string; - }>; -} - -let bookingDetails: BookingPageDetails = { - title: "CodingCat.dev Podcast Recording Session", - description: - "Join Alex Patterson for an in-depth conversation exploring web development, edge runtimes, developer tooling, and modern frameworks.", - durationMinutes: 45, - hostName: "Alex Patterson", - slug: "codingcatdev", - slots: [ - { - id: "slot-1", - startAt: "2026-10-15T14:00:00Z", - displayDate: "Thursday, Oct 15", - displayTime: "10:00 AM EDT (14:00 UTC)", - }, - { - id: "slot-2", - startAt: "2026-10-15T16:00:00Z", - displayDate: "Thursday, Oct 15", - displayTime: "12:00 PM EDT (16:00 UTC)", - }, - { - id: "slot-3", - startAt: "2026-10-20T14:00:00Z", - displayDate: "Tuesday, Oct 20", - displayTime: "10:00 AM EDT (14:00 UTC)", - }, - { - id: "slot-4", - startAt: "2026-10-20T16:00:00Z", - displayDate: "Tuesday, Oct 20", - displayTime: "12:00 PM EDT (16:00 UTC)", - }, - { - id: "slot-5", - startAt: "2026-10-22T15:00:00Z", - displayDate: "Thursday, Oct 22", - displayTime: "11:00 AM EDT (15:00 UTC)", - }, - ], -}; - -try { - const flipcoreUrl = - (env as unknown as Record)?.FLIPCORE_API_URL ?? - "https://api.flipfeeds.com"; - const res = await fetch(`${flipcoreUrl}/api/public/booking/codingcatdev`, { - headers: { Accept: "application/json" }, - }); - if (res.ok) { - const data = (await res.json()) as any; - if (data?.title) bookingDetails.title = data.title; - if (data?.description) bookingDetails.description = data.description; - if (data?.durationMinutes) bookingDetails.durationMinutes = data.durationMinutes; - if (Array.isArray(data?.slots) && data.slots.length > 0) { - bookingDetails.slots = data.slots.map((s: any, idx: number) => { - const date = new Date(s.startAt); - return { - id: `slot-api-${idx}`, - startAt: s.startAt, - displayDate: date.toLocaleDateString("en-US", { - weekday: "short", - month: "short", - day: "numeric", - }), - displayTime: date.toLocaleTimeString("en-US", { - hour: "numeric", - minute: "2-digit", - timeZoneName: "short", - }), - }; - }); - } - } -} catch { - // Resilient fallback defaults used -} - -const title = "Book a Recording Session โ€” CodingCat.dev"; +import { getMultiCalendarAvailableSlots } from "@/lib/google-calendar"; + +const searchParams = Astro.url.searchParams; +const initialTrack = + searchParams.get("track") === "sponsored" + ? "sponsored" + : searchParams.get("track") === "full-stack-launch" + ? "full-stack-launch" + : "editorial"; +const initialCompany = searchParams.get("company") || ""; +const initialName = searchParams.get("name") || ""; +const initialEmail = searchParams.get("email") || ""; + +const { slots: upcomingSlots, liveVerified } = await getMultiCalendarAvailableSlots(6); + +const title = "Book a Podcast & Showcase Session โ€” CodingCat.dev"; const description = - "Schedule your guest appearance on the CodingCat.dev Podcast. Choose your recording slot, complete intake questions, and sign your digital release form."; + "Schedule your guest appearance or fast-track sponsored showcase on the CodingCat.dev Podcast. Choose your track, complete intake questions, and sign your E-SIGN digital media release."; --- @@ -107,11 +29,14 @@ const description =
+ + CodingCat.dev Studio & Google Calendar Sync +

- {bookingDetails.title} + CodingCat.dev Podcast Recording Session

- {bookingDetails.description} + Join Alex Patterson for an in-depth conversation exploring AI agents, web engineering, cloud infrastructure, and modern developer tooling.

@@ -119,38 +44,119 @@ const description =
Host: - {bookingDetails.hostName} + Alex Patterson
Duration: - {bookingDetails.durationMinutes} Minutes + 45 Minutes
- Studio Engine: - FlipFeeds 4K Local Ingest + Recording Window: + 8:00 AM – 5:00 PM PT / ET
- Two-Way Sync: - Google Calendar & Studio Room + Calendar Sync: + Google Calendar Appointment Schedule
- +

1 - Select an Available Recording Slot + Choose Your Session Track +

+ Editorial vs. Guaranteed Launch Showcase +
+ +
+ + + +
+
+ + +
+
+

+ 2 + Select Preferred Recording Window + {liveVerified && ( + + โœ“ Live Multi-Calendar FreeBusy Verified + + )}

- All times normalized to UTC + + View full live Google Calendar schedule ↗ +
{ - bookingDetails.slots.map((slot, index) => ( + upcomingSlots.map((slot, index) => (
@@ -231,7 +239,8 @@ const description =
@@ -242,21 +251,21 @@ const description =

- 3 + 4 Digital Appearance & Media Release Agreement

- Terms v1.0 ยท E-SIGN Valid + Terms v1.0 · E-SIGN Valid
- FLIPCORE & CODINGCAT.DEV PODCAST APPEARANCE RELEASE AGREEMENT (v1.0)

- 1. GRANT OF RIGHTS: The Participant grants CodingCat.dev and FlipFeeds the irrevocable, worldwide, perpetual right to record, edit, broadcast, stream, and commercially distribute their voice, video likeness, conversation, and biographical materials across any digital distribution channels.

- 2. CLIPPING & TRANSCRIPTS: The Producer retains sole discretion to create derivative works, short-form clips (TikTok, Shorts, Reels), and word-by-word transcripts.

+ CODINGCAT.DEV PODCAST APPEARANCE RELEASE AGREEMENT (v1.0)

+ 1. GRANT OF RIGHTS: The Participant grants CodingCat.dev the irrevocable, worldwide, perpetual right to record, edit, broadcast, stream, and commercially distribute their voice, video likeness, conversation, and biographical materials across any digital distribution channels.

+ 2. CLIPPING & TRANSCRIPTS: The Producer retains sole discretion to create derivative works, short-form clips (YouTube Shorts, X, LinkedIn, Bluesky, Threads, Mastodon, TikTok, Reels), and word-by-word transcripts.

3. COMMERCIAL & SPONSORSHIP USE: Producer may monetize the show through sponsorships and dynamic ad insertion without financial compensation unless agreed separately.

- 4. ELECTRONIC SIGNATURE VALIDITY: Executing this release electronically carries the full legal force of a handwritten physical signature pursuant to 15 U.S.C. ยง 7001 (E-SIGN Act). + 4. ELECTRONIC SIGNATURE VALIDITY: Executing this release electronically carries the full legal force of a handwritten physical signature pursuant to 15 U.S.C. § 7001 (E-SIGN Act).
@@ -271,7 +280,7 @@ const description = @@ -345,30 +354,29 @@ const description =

- Recording Session Confirmed! + Intake & Media Release Recorded!

- Your technical interview with Alex Patterson has been reserved. Your calendar invite and Studio entry pass have been generated. + Your E-SIGN appearance release with Alex Patterson has been saved to Sanity. Lock in your exact Google Calendar invite below.

- +
- Your Studio Entry Pass -
- - https://flipfeeds.com/studio?room=srt_codingcatdev_preview - - -
+ + Step 2: Lock Your Google Calendar Invite + + + Open Google Calendar Appointment Schedule ↗ +

- Please join 5 minutes before scheduled time using Chrome, Edge, or Brave with headphones enabled. + Selecting your time on the Google Calendar schedule automatically sends calendar invites and recording links to both you and Alex.

@@ -392,24 +400,40 @@ const description =
PodMatch Network Certified - Powered by FlipFeeds Two-Sided Creator & Guest Matching + Powered by CodingCat.dev & Sanity Content Operating System
- diff --git a/apps/site/src/pages/portal/[token].astro b/apps/site/src/pages/portal/[token].astro new file mode 100644 index 00000000..a3f4d038 --- /dev/null +++ b/apps/site/src/pages/portal/[token].astro @@ -0,0 +1,533 @@ +--- +import Breadcrumbs from "@/components/Breadcrumbs.astro"; +import BaseLayout from "@/layouts/BaseLayout.astro"; +import { + getSanityServerClient, + resolveSponsorTier, +} from "@/lib/sanity/write-client"; + +const { token } = Astro.params; +const searchParams = Astro.url.searchParams; + +interface DeliverableItem { + title: string; + channel: string; + status: string; + url?: string; + views?: number; + publishedAt?: string; +} + +interface LeadPortalData { + _id: string; + portalToken: string; + companyName: string; + contactName: string; + contactEmail: string; + status: string; + rateCard: string; + packageName: string; + packageDescription: string; + totalAmountCents: number; + depositAmountCents: number; + balanceAmountCents: number; + depositPaidAt?: string; + balancePaidAt?: string; + stripeDepositCheckoutUrl?: string; + stripeDepositInvoiceUrl?: string; + stripeBalanceCheckoutUrl?: string; + stripeBalanceInvoiceUrl?: string; + deliverables: DeliverableItem[]; +} + +const fallbackTier = resolveSponsorTier(searchParams.get("tier") || "full-stack-launch"); +const fallbackCompany = searchParams.get("company") || "Sponsor Partner"; +const fallbackName = searchParams.get("name") || "Sponsor Team"; +const fallbackEmail = searchParams.get("email") || ""; +const paymentNotice = searchParams.get("payment"); + +let portalData: LeadPortalData = { + _id: `sponsorLead-${token}`, + portalToken: token || "demo", + companyName: fallbackCompany, + contactName: fallbackName, + contactEmail: fallbackEmail, + status: paymentNotice === "deposit_success" ? "deposit_paid" : "new", + rateCard: fallbackTier.id, + packageName: fallbackTier.name, + packageDescription: fallbackTier.description, + totalAmountCents: fallbackTier.totalAmountCents, + depositAmountCents: fallbackTier.depositAmountCents, + balanceAmountCents: fallbackTier.balanceAmountCents, + deliverables: fallbackTier.deliverables.map((d) => ({ + title: d.title, + channel: d.channel, + status: paymentNotice === "deposit_success" ? "in-progress" : "pending", + })), +}; + +try { + const { client } = getSanityServerClient(); + const doc = await client.fetch | null>( + `*[_type == "sponsorLead" && (portalToken == $portalToken || _id == $leadId)][0]`, + { portalToken: token ?? "", leadId: `sponsorLead-${token ?? ""}` }, + ); + if (doc) { + const tier = resolveSponsorTier(doc.rateCard || fallbackTier.id); + portalData = { + _id: doc._id, + portalToken: doc.portalToken || token || "demo", + companyName: doc.companyName || fallbackCompany, + contactName: doc.contactName || fallbackName, + contactEmail: doc.contactEmail || fallbackEmail, + status: + paymentNotice === "deposit_success" + ? "deposit_paid" + : paymentNotice === "balance_success" + ? "paid" + : doc.status || "new", + rateCard: tier.id, + packageName: tier.name, + packageDescription: tier.description, + totalAmountCents: doc.totalAmountCents || tier.totalAmountCents, + depositAmountCents: doc.depositAmountCents || tier.depositAmountCents, + balanceAmountCents: doc.balanceAmountCents || tier.balanceAmountCents, + depositPaidAt: doc.depositPaidAt, + balancePaidAt: doc.balancePaidAt, + stripeDepositCheckoutUrl: doc.stripeDepositCheckoutUrl, + stripeDepositInvoiceUrl: doc.stripeDepositInvoiceUrl, + stripeBalanceCheckoutUrl: doc.stripeBalanceCheckoutUrl, + stripeBalanceInvoiceUrl: doc.stripeBalanceInvoiceUrl, + deliverables: + Array.isArray(doc.deliverables) && doc.deliverables.length > 0 + ? doc.deliverables + : tier.deliverables.map((d) => ({ + title: d.title, + channel: d.channel, + status: "pending", + })), + }; + } +} catch { + // Uses resilient fallback portalData +} + +const formatUsd = (cents: number) => + new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + maximumFractionDigits: 0, + }).format(cents / 100); + +const isDepositPaid = + Boolean(portalData.depositPaidAt) || + portalData.status === "deposit_paid" || + portalData.status === "booked" || + portalData.status === "balance_sent" || + portalData.status === "paid"; + +const isBalancePaid = + Boolean(portalData.balancePaidAt) || portalData.status === "paid"; +--- + + + + +
+ { + paymentNotice === "deposit_success" && ( +
+ 50% Deposit Confirmed! Your production slot is locked. Next step: pick your kickoff or recording slot below. +
+ ) + } + { + paymentNotice === "balance_success" && ( +
+ Final 50% Balance Paid! Thank you for partnering with CodingCat.dev. +
+ ) + } + + +
+
+
+ CodingCat.dev Sponsor Deal Room + · + Token: {portalData.portalToken} +
+

+ {portalData.companyName} × CodingCat.dev +

+

+ {portalData.packageName} — {portalData.packageDescription} +

+
+ +
+ + Total Campaign Value + + + {formatUsd(portalData.totalAmountCents)} + + + 50% Deposit ({formatUsd(portalData.depositAmountCents)}) + 50% on Publish + +
+
+ + +
+
+ YouTube Subscribers + 61.2K+ + โœ“ Verified YouTube API +
+
+ US / CA / UK / AU Share + 21.1% + โœ“ #1 Watch-Time Engagement +
+
+ Short-Form Syndication + 7 Platforms + โœ“ YT, X, LI, BSky, Threads, Masto, IG/TT +
+
+ Canonical SEO + AEO + WebMCP + llms.txt + โœ“ Dev.to & Hashnode Syndicated +
+
+ + +
+ +
+
+
+

+ 1. Milestone Billing (50% / 50%) +

+ + Stripe Verified + +
+

+ Lock your production and recording window with a 50% upfront deposit via instant card/ACH checkout or a Net-15 corporate invoice. The remaining 50% balance is billed only when your deliverables go live. +

+ + +
+
+
+ + Milestone 1 · Upfront Deposit (50%) + +

+ Lock Production & Calendar Slot +

+
+ + {formatUsd(portalData.depositAmountCents)} + +
+ + { + isDepositPaid ? ( +
+ โœ“ 50% Deposit Paid {portalData.depositPaidAt ? `on ${new Date(portalData.depositPaidAt).toLocaleDateString()}` : ""} +
+ ) : ( +
+ {portalData.stripeDepositCheckoutUrl ? ( + + Pay {formatUsd(portalData.depositAmountCents)} Deposit Now → + + ) : ( + + )} + + {portalData.stripeDepositInvoiceUrl ? ( + + View Net-15 Corporate Invoice ↗ + + ) : ( + + )} +
+ ) + } +
+ + +
+
+
+ + Milestone 2 · Final Balance on Publish (50%) + +

+ Due Upon Campaign Publication +

+
+ + {formatUsd(portalData.balanceAmountCents)} + +
+ + { + isBalancePaid ? ( +
+ โœ“ Paid in Full +
+ ) : ( +
+ + +
+ ) + } +
+ + +
+
+ + +
+ +
+
+ + +
+
+
+

+ 3. Multi-Channel Deliverables & Live ROI Tracking +

+

+ Every asset in your bundle is tracked here with live links and verified impression telemetry as it ships. +

+
+ + {portalData.deliverables.length} Deliverables + +
+ +
+ { + portalData.deliverables.map((item) => ( +
+
+ + {item.title} + + + Channel: {item.channel} + +
+
+ {typeof item.views === "number" && ( + + {item.views.toLocaleString()} views + + )} + {item.url && ( + + View Live ↗ + + )} + + {item.status.replace("-", " ")} + +
+
+ )) + } +
+
+
+
+ + diff --git a/apps/site/src/pages/sponsorships.astro b/apps/site/src/pages/sponsorships.astro index a9c812a8..145f3074 100644 --- a/apps/site/src/pages/sponsorships.astro +++ b/apps/site/src/pages/sponsorships.astro @@ -1,143 +1,134 @@ --- import Breadcrumbs from "@/components/Breadcrumbs.astro"; import BaseLayout from "@/layouts/BaseLayout.astro"; -import { env } from "cloudflare:workers"; +import { SPONSOR_PACKAGE_TIERS } from "@/lib/sanity/write-client"; -interface VerifiedMetrics { - subscribers: string; - monthlyViews: string; - reach: string; -} - -let metrics: VerifiedMetrics = { - subscribers: "61K+", - monthlyViews: "350K+", - reach: "150K+", +const metrics = { + subscribers: "61.2K+", + totalViews: "405K+", + tier1GeoShare: "21.1%", + shortPlatforms: "7 Platforms", }; -try { - const flipcoreUrl = - (env as unknown as Record)?.FLIPCORE_API_URL ?? - "https://api.flipfeeds.com"; - const kitRes = await fetch(`${flipcoreUrl}/api/public/media_kit/codingcatdev`, { - headers: { Accept: "application/json" }, - }); - if (kitRes.ok) { - const kitData = (await kitRes.json()) as any; - if (kitData?.stats && Array.isArray(kitData.stats)) { - for (const s of kitData.stats) { - const label = (s.label ?? s.name ?? "").toLowerCase(); - if (label.includes("sub") && s.displayValue) metrics.subscribers = s.displayValue; - if (label.includes("view") && s.displayValue) metrics.monthlyViews = s.displayValue; - if (label.includes("reach") && s.displayValue) metrics.reach = s.displayValue; - } - } - } -} catch { - // Resilient fallback defaults -} - -const sponsorshipTiers = [ - { - id: "dedicated-video", - name: "Dedicated Video", - price: "$4,000", - description: - "A full video dedicated to your product or service. Includes a permanent logo and link on our sponsors page.", - }, - { - id: "mid-roll-ad", - name: "Integrated Mid-Roll Ad", - price: "$1,800", - description: - "A 60-second ad integrated into the middle of a video. Includes a permanent logo and link on our sponsors page.", - }, - { - id: "shout-out", - name: "Quick Shout-Out", - price: "$900", - description: - "A 30-second shout-out at the beginning of a video. Includes a permanent logo and link on our sponsors page.", - }, - { - id: "blog-newsletter", - name: "Blog Post / Newsletter", - price: "$500", - description: - "Sponsor a blog post or our weekly newsletter. Your logo and a link will be featured.", - }, - { - id: "video-series", - name: "Video Series", - price: "Custom", - description: - "Sponsor a whole series of videos. Contact us for custom pricing and tailored packages.", - }, -]; +const formatUsd = (cents: number) => + new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + maximumFractionDigits: 0, + }).format(cents / 100); ---
-
+
+ + B2B Developer Marketing & Multi-Channel Distribution +

- Sponsor CodingCat.dev + Launch Your DevTool Across CodingCat.dev

-

- Reach an engaged global audience of developers, creators, and technology leaders. Choose from our standard packages or request custom collaboration. +

+ Stop buying isolated one-off shout-outs. Partner with Alex Patterson for end-to-end technical deep-dives, 7-platform vertical Shorts syndication, canonical SEO & Agent-Ready (AEO / WebMCP / llms.txt) articles, and live ROI Deal Room telemetry.

- -
+ +
YouTube Subscribers {metrics.subscribers} - โœ“ Verified via FlipFeeds + โœ“ Verified First-Party YouTube API +
+
+ US / CA / UK / AU Share + {metrics.tier1GeoShare} + โœ“ #1 Watch-Time Engagement per Viewer
- Monthly Impressions - {metrics.reach} - โœ“ Real-time Analytics + Short-Form Video Network + {metrics.shortPlatforms} + โœ“ YT, X, LinkedIn, BSky, Threads, Masto, IG/TT
- Monthly Video Views - {metrics.monthlyViews} - โœ“ First-Party Telemetry + Canonical SEO & AEO + WebMCP + llms.txt + โœ“ Syndicated to Dev.to & Hashnode
-
-

Sponsorship Tiers

+
+
+
+

+ Multi-Channel Launch Bundles & Rate Card +

+

+ All packages use milestone billing: 50% upfront deposit to lock your production & calendar slot, and 50% upon publication. (Includes Dedicated Video, Integrated Mid-Roll Ad, Quick Shout-Out, Blog Post / Newsletter, and Video Series options.) +

+
+ + Prefer to talk first? Book a 15-min Sponsor Discovery Call ↗ + +
+
{ - sponsorshipTiers.map((tier) => ( -
+ SPONSOR_PACKAGE_TIERS.map((tier, idx) => ( +
-

+ + {tier.tagline} + +

{tier.name}

-

- {tier.price} -

+
+

+ {formatUsd(tier.totalAmountCents)} +

+ + ({formatUsd(tier.depositAmountCents)} 50% deposit) + +

{tier.description}

+
    + {tier.deliverables.map((d) => ( +
  • + โœ“ + {d.title} +
  • + ))} +
-
+
@@ -146,13 +137,13 @@ const sponsorshipTiers = [
- +

- Inquire About Sponsorship + Open Your Sponsor Deal Room

- Fill out the form below with your sponsorship goals, and our team will get back to you promptly. + Select your package below to immediately open your dedicated Deal Room with 50% deposit Stripe Checkout, Net-15 corporate invoice generation, and direct Google Calendar scheduling.

-
- - -
+
+
+ + +
-
- - +
+ + +
-
- - +
+
+ + +
+ +
+ + +
@@ -261,9 +271,9 @@ const sponsorshipTiers = [
@@ -277,12 +287,11 @@ const sponsorshipTiers = [ const submitBtn = document.getElementById("submit-btn") as HTMLButtonElement | null; const tierSelect = document.getElementById("tier") as HTMLSelectElement | null; - // Click to auto-select tier from cards above document.querySelectorAll(".tier-select-btn").forEach((btn) => { btn.addEventListener("click", () => { - const tierName = btn.getAttribute("data-tier-name"); - if (tierSelect && tierName) { - tierSelect.value = tierName; + const tierId = btn.getAttribute("data-tier-id"); + if (tierSelect && tierId) { + tierSelect.value = tierId; tierSelect.scrollIntoView({ behavior: "smooth", block: "center" }); tierSelect.focus(); } @@ -300,12 +309,13 @@ const sponsorshipTiers = [ name: formData.get("name"), email: formData.get("email"), company: formData.get("company"), + website: formData.get("website"), tier: formData.get("tier"), message: formData.get("message"), }; submitBtn.disabled = true; - submitBtn.textContent = "Sending..."; + submitBtn.textContent = "Opening Deal Room..."; try { const res = await fetch("/api/sponsorship", { @@ -326,7 +336,7 @@ const sponsorshipTiers = [ const targetUrl = result.portalUrl || result.dealRoomUrl; if (targetUrl) { if (successEl) { - successEl.innerHTML = `Inquiry received! Opening your Deal Room portal...
Click here if not redirected automatically →`; + successEl.innerHTML = `Deal Room created! Opening your Deal Room portal...
Click here if not redirected automatically →`; successEl.classList.remove("hidden"); } window.location.href = targetUrl; @@ -339,14 +349,14 @@ const sponsorshipTiers = [ errorEl.classList.remove("hidden"); } } - } catch (err) { + } catch { if (errorEl) { errorEl.textContent = "A network error occurred. Please try again."; errorEl.classList.remove("hidden"); } } finally { submitBtn.disabled = false; - submitBtn.textContent = "Send Inquiry"; + submitBtn.textContent = "Create Deal Room & View Deposit Options โ†’"; } }); } diff --git a/apps/site/wrangler.jsonc b/apps/site/wrangler.jsonc index 3a9fbe0e..e31058a5 100644 --- a/apps/site/wrangler.jsonc +++ b/apps/site/wrangler.jsonc @@ -12,6 +12,7 @@ "workers_dev": true, "preview_urls": true, "ai": { "binding": "AI" }, + "send_email": [{ "name": "EMAIL" }], // Uncomment after clicking "Enable Analytics Engine" once at: // https://dash.cloudflare.com/c46bd0f3b9ed47b8692cca098030edbf/workers/analytics-engine // "analytics_engine_datasets": [ @@ -58,6 +59,7 @@ } ], "ai": { "binding": "AI" }, + "send_email": [{ "name": "EMAIL" }], "d1_databases": [ { "binding": "DB", diff --git a/package.json b/package.json index b2bfac4f..16dbcbe2 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,10 @@ "scripts": { "dev": "pnpm --filter @codingcatdev/site dev", "dev:studio": "pnpm --filter @codingcatdev/sanity dev", + "dev:ops": "pnpm --filter @codingcatdev/ops dev", "build": "pnpm --filter @codingcatdev/site build", "build:studio": "pnpm --filter @codingcatdev/sanity build", + "build:ops": "pnpm --filter @codingcatdev/ops build", "deploy:studio": "pnpm --filter @codingcatdev/sanity deploy", "deploy:blueprints": "sanity blueprints deploy", "blueprints:deploy": "sanity blueprints deploy", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 30491ea4..dea8515b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,40 @@ importers: specifier: ^6.9.2 version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3) + apps/ops: + dependencies: + '@sanity/sdk': + specifier: ^1.0.0 + version: 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + '@sanity/sdk-react': + specifier: ^1.0.0 + version: 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + '@sanity/ui': + specifier: ^3.1.10 + version: 3.5.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + react: + specifier: ^19.2.0 + version: 19.2.8 + react-dom: + specifier: ^19.2.0 + version: 19.2.8(react@19.2.8) + sanity: + specifier: ^6.9.2 + version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3) + styled-components: + specifier: ^6.3.11 + version: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + devDependencies: + '@types/react': + specifier: ^19.2.0 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.0 + version: 19.2.3(@types/react@19.2.14) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + apps/sanity: dependencies: '@portabletext/block-tools': @@ -2566,6 +2600,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + '@lezer/common@1.5.1': resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} @@ -3246,6 +3283,14 @@ packages: resolution: {integrity: sha512-MBQ082q7GRvzSH7Xzx4ul1Kxm/AEKDgwTz5cd13oXIlenl3VAM0Un0QpeTjkC5IZTC7SHbnhwkgoVHTZDz9WKQ==} engines: {node: '>=18.0.0'} + '@sanity/comlink@2.0.5': + resolution: {integrity: sha512-6Rbg71hkeoGInk/9hBsCUBCZ33IHSs2fZynAR85ANkXDM+WYiwRDlker7OngBkfbK8TF9+G797VjNMQQgJINiQ==} + engines: {node: '>=18'} + + '@sanity/comlink@3.1.1': + resolution: {integrity: sha512-UyBJG4oWNs+VGVo5Yr5aKir5bgMzF/dnaNYjqxP2+5+iXnvhVOcI6dAtEXDj7kMmn5/ysHNKbLDlW6aVeBm7xg==} + engines: {node: '>=18'} + '@sanity/comlink@4.0.3': resolution: {integrity: sha512-gCnltbeB8BmXVLSr/6XHAA3tQmhJDMKXufOVRXYxAhIEv+5n9CtnxupjY5IzmdI+7v+G67TZV/8zCQhvaFlVww==} engines: {node: '>=20.19 <22 || >=22.12'} @@ -3337,6 +3382,10 @@ packages: '@sanity/media-library-types@1.6.0': resolution: {integrity: sha512-1Nqw8GSUr7E8AFue9luyTOM4Ev0ZlJ35SHcQrHZ6T68G5llfXw99e3GkLXzk6qYFk9r9fJaBTSpW5IyO2mObZQ==} + '@sanity/message-protocol@0.12.0': + resolution: {integrity: sha512-RMRWQG5yVkCZnnBHW3qxVbZGUOeXPBzFPdD9+pynQCTVZI7zYBEzjnY8lcSYjty+0unDHqeoqMPfBXhqs0rg2g==} + engines: {node: '>=20.0.0'} + '@sanity/message-protocol@0.23.0': resolution: {integrity: sha512-UfQDuWRzbK4dRTfLURGCZo7ZlR0sK+2lwT2QMAfqsM5kMq5GR31lbX4LMcSw27h7rwUv8ZSf1hBEbluVpgRmlg==} engines: {node: '>=20.0.0'} @@ -3349,6 +3398,10 @@ packages: resolution: {integrity: sha512-XeDbtq/YmpXwLd01wJU/mrNqXxPEKRZiPugt/ukXJoDdetjgBNmcIPkic6RnXpzHyLNf/Pi6+d5ktlrUvMYI2Q==} engines: {node: '>=22.12'} + '@sanity/mutate@0.12.6': + resolution: {integrity: sha512-Ai9Dy0C79yUALnuLe0ealwqgz11T+ngpWCzTyZv01xdjB6coQo+KoM8E0FeRTK5Zr/IAgKphYuYLU5DFCB9cGw==} + engines: {node: '>=18'} + '@sanity/mutate@0.16.1': resolution: {integrity: sha512-400OooNtiafgJEOCzj0E5atuWlaKp1z6LU/LB/xZUVVywNj3WuT52U6qeVOfGlZeWKhYMCdGFX2ZnMbIrME95w==} engines: {node: '>=18'} @@ -3395,6 +3448,17 @@ packages: '@sanity/schema@6.9.2': resolution: {integrity: sha512-k01v24uhByfKbOqgzlPlXVZ8yeW5qdzL3LtUUGgoikC1DEWBETY56Tc8u0R6eFmYPM8+I63L78TjbvtXYu2INQ==} + '@sanity/sdk-react@1.0.0': + resolution: {integrity: sha512-gZ4p5gh+2TaR22HZbrvXvPlR90onRyIVP84FRIgXcd2SDyPmqOfoCuZ/rpgYNhtU88ZwLPDWAh1+rMYJXxUNqg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@sanity/sdk@1.0.0': + resolution: {integrity: sha512-9IsaEboT+KIWnWASMZIBEarZP8E0NE+XSqQOUZ+0PZ3G5TRhgcLaq8D9hM5MRvNdVjxAY/QEFeGyduEs2hMSpw==} + engines: {node: '>=20.0.0'} + '@sanity/sdk@2.12.0': resolution: {integrity: sha512-WrQKzwuvpMA0Z/LKzrkpwisx+kdm+USNPiFJej54TWS7rTQPvf1JJhxr02rODcGKDbDgwCHGiOmV5GGr8cPAig==} @@ -3415,6 +3479,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + '@sanity/types@3.99.0': + resolution: {integrity: sha512-a766U9VSoyOSWq+RZz9wsEo/Nnn+inDkEcdGu+rHFuygdepullB/RZpF2MxNsfUMCSPnajgG1Tm9lhwbSmlySA==} + peerDependencies: + '@types/react': 18 || 19 + '@sanity/types@5.28.0': resolution: {integrity: sha512-kfLwYx/8q1l76Hqt2dMS/apoXskj6NB2LKnGIa+nDh0JfHArWror1j9Zwqpm/aF1ywS7R0I5xXBsiygCLeGszg==} peerDependencies: @@ -3425,6 +3494,14 @@ packages: peerDependencies: '@types/react': '*' + '@sanity/ui@3.5.5': + resolution: {integrity: sha512-5ehxYAXf8FlUKvTlMuEDMbz4keb8UhEnCyRnlp0lIcPF1EYODe6NdHjtgQqzQRKqS34OAVi2y+WAP/lLrx2+lg==} + engines: {node: '>=20.19 <22 || >=22.12'} + peerDependencies: + react: ^18 || >=19.0.0-0 + react-dom: ^18 || >=19.0.0-0 + styled-components: ^5.2 || ^6 + '@sanity/ui@4.0.3': resolution: {integrity: sha512-IXZ01joAs1YDKhzcvW5+F+3hL5BsDLH3HB7WqpBqfTitQ0jmvyXr8quHQnsP8br3JyxEREmTEAIJhS8ABEXPXw==} engines: {node: '>=22.12'} @@ -3739,6 +3816,12 @@ packages: '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.26': + resolution: {integrity: sha512-48NWfiY6oNcKOh47Z4h+sIvwcQR91h6KPhaYKgeMIrkT2jV82Gy90SErj60vW8jQbeMSOSbhIv3bZ7JoqPPVhA==} + '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} @@ -4908,6 +4991,17 @@ packages: react-dom: optional: true + framer-motion@13.5.1: + resolution: {integrity: sha512-HeWOaeHD3kyTSIEMT6+nw7fBn4saIfxxabZyAITbycAl4xr1kzGJKIvGt/OWghSlvIA9qTnZ1zTGelHAe6S8DA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -5790,9 +5884,15 @@ packages: motion-dom@13.0.0: resolution: {integrity: sha512-Xk+SJas70uMAUIApg+m3lZDShxI3LBFHq7mFGbBKoRXc2PVPDyAKmzN64Bbzt4CZdP/CItTiJxWtn4TA0v53Ng==} + motion-dom@13.5.1: + resolution: {integrity: sha512-/7CVCD20Mz1KobktorpdgvowV0V41J7UxqE+qWS3GkSJqrRr5ft+2RloOYtEKv+wvBp3JaSFBclhxt4ja8ovHg==} + motion-utils@13.0.0: resolution: {integrity: sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==} + motion-utils@13.5.0: + resolution: {integrity: sha512-Hqe/sqjIKliPZg8sVjWAkdySDPJNIeKH+euVkDOG8ri3DUUU7ZjndmHsGqEPz2iHpiyVaV5I22iguCMHU2he+Q==} + motion@13.1.0: resolution: {integrity: sha512-qtvscq59uCPdWnNW4SdSkrxR+BS/QYsa923bx7ocA+4p+ZGNbbVQwkSnG4aukB81QWjtl3AxX36plxNyZLmHCA==} peerDependencies: @@ -5804,6 +5904,17 @@ packages: react-dom: optional: true + motion@13.5.1: + resolution: {integrity: sha512-eV9SUem6KnzEa9+eT+dVBeDlhy5TTdn09YWR1WhUsKoZCJPw/n4TcYhjbxq2Gy5PTwDr//4H3r5vxkcZnNnO1w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -6185,6 +6296,16 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-compiler-runtime@1.0.0: + resolution: {integrity: sha512-rRfjYv66HlG8896yPUDONgKzG5BxZD1nV9U6rkm+7VCuvQc903C4MjcoZR4zPw53IKSOX9wMQVpA1IAbRtzQ7w==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental + + react-compiler-runtime@19.1.0-rc.1: + resolution: {integrity: sha512-wCt6g+cRh8g32QT18/9blfQHywGjYu+4FlEc3CW1mx3pPxYzZZl1y+VtqxRgnKKBCFLIGUYxog4j4rs5YS86hw==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental + react-dom@19.2.4: resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: @@ -6206,6 +6327,11 @@ packages: peerDependencies: react: '>= 16.8' + react-error-boundary@5.0.0: + resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} + peerDependencies: + react: '>=16.13.1' + react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -7071,6 +7197,11 @@ packages: peerDependencies: react: ^18.3 || ^19.0.0-0 + use-effect-event@2.0.4: + resolution: {integrity: sha512-il5ezAwTIxg1dr+eXP+1SS1EpXe6IFy1oADvGxmiCNGCDX1X+ygERRDOFoCyzc+r6ktqag3VITmrw1ZPfoig1g==} + peerDependencies: + react: ^18.3 || ^19.0.0-0 + use-hot-module-reload@2.0.0: resolution: {integrity: sha512-RbL/OY1HjHNf5BYSFV3yDtQhIGKjCx9ntEjnUBYsOGc9fTo94nyFTcjtD42/twJkPgMljWpszUIpTGD3LuwHSg==} peerDependencies: @@ -9982,6 +10113,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@juggle/resize-observer@3.4.0': {} + '@lezer/common@1.5.1': {} '@lezer/css@1.3.1': @@ -10162,7 +10295,7 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@mux/mux-player-react@3.13.2(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@mux/mux-player-react@3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@mux/mux-player': 3.13.2(react@19.2.8) '@mux/playback-core': 0.35.2 @@ -10171,6 +10304,7 @@ snapshots: react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) '@mux/mux-player@3.13.2(react@19.2.4)': dependencies: @@ -11064,6 +11198,18 @@ snapshots: '@sanity/color@3.0.8': {} + '@sanity/comlink@2.0.5': + dependencies: + rxjs: 7.8.2 + uuid: 11.1.0 + xstate: 5.32.5 + + '@sanity/comlink@3.1.1': + dependencies: + rxjs: 7.8.2 + uuid: 11.1.0 + xstate: 5.32.5 + '@sanity/comlink@4.0.3': dependencies: rxjs: 7.8.2 @@ -11187,6 +11333,10 @@ snapshots: '@sanity/media-library-types@1.6.0': {} + '@sanity/message-protocol@0.12.0': + dependencies: + '@sanity/comlink': 2.0.5 + '@sanity/message-protocol@0.23.0': dependencies: '@sanity/comlink': 4.0.3 @@ -11211,6 +11361,17 @@ snapshots: - supports-color - xstate + '@sanity/mutate@0.12.6': + dependencies: + '@sanity/client': 7.26.2 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/uuid': 3.0.3 + hotscript: 1.0.13 + lodash: 4.18.1 + mendoza: 3.0.8 + nanoid: 5.1.11 + rxjs: 7.8.2 + '@sanity/mutate@0.16.1(xstate@5.32.5)': dependencies: '@sanity/client': 7.26.2 @@ -11341,6 +11502,45 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@sanity/sdk-react@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))': + dependencies: + '@sanity/client': 7.26.2 + '@sanity/message-protocol': 0.12.0 + '@sanity/sdk': 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + '@sanity/types': 3.99.0(@types/react@19.2.14) + '@types/lodash-es': 4.17.12 + groq: 3.88.1-typegen-experimental.0 + lodash-es: 4.18.1 + react: 19.2.8 + react-compiler-runtime: 19.1.0-rc.1(react@19.2.8) + react-dom: 19.2.8(react@19.2.8) + react-error-boundary: 5.0.0(react@19.2.8) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + + '@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))': + dependencies: + '@sanity/client': 7.26.2 + '@sanity/comlink': 3.1.1 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/message-protocol': 0.12.0 + '@sanity/mutate': 0.12.6 + '@sanity/types': 3.99.0(@types/react@19.2.14) + '@types/lodash-es': 4.17.12 + groq: 3.88.1-typegen-experimental.0 + lodash-es: 4.18.1 + reselect: 5.2.0 + rxjs: 7.8.2 + zustand: 5.0.14(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5)': dependencies: '@sanity/bifur-client': 1.0.0 @@ -11420,6 +11620,12 @@ snapshots: '@actions/github': 9.0.0 yaml: 2.9.0 + '@sanity/types@3.99.0(@types/react@19.2.14)': + dependencies: + '@sanity/client': 7.26.2 + '@sanity/media-library-types': 1.6.0 + '@types/react': 19.2.14 + '@sanity/types@5.28.0(@types/react@19.2.14)': dependencies: '@sanity/client': 7.26.2 @@ -11432,6 +11638,22 @@ snapshots: '@sanity/media-library-types': 1.6.0 '@types/react': 19.2.14 + '@sanity/ui@3.5.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@juggle/resize-observer': 3.4.0 + '@sanity/color': 3.0.8 + '@sanity/icons': 5.2.1(react@19.2.8) + csstype: 3.2.3 + motion: 13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-compiler-runtime: 1.0.0(react@19.2.8) + react-dom: 19.2.8(react@19.2.8) + react-is: 19.2.8 + react-refractor: 4.0.0(react@19.2.8) + styled-components: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + use-effect-event: 2.0.4(react@19.2.8) + '@sanity/ui@4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@floating-ui/react-dom': 2.1.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -11600,6 +11822,21 @@ snapshots: - vue-tsc - yaml + '@sanity/workbench@0.1.0-alpha.36(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(react@19.2.8)(xstate@5.32.5)': + dependencies: + '@module-federation/runtime': 2.8.2 + '@sanity/client': 7.26.2 + '@sanity/color': 3.0.8 + '@sanity/sdk': 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + '@sanity/telemetry': 1.1.0(react@19.2.8) + es-toolkit: 1.51.0 + rxjs: 7.8.2 + verkit: 0.3.2 + xstate: 5.32.5 + zod: 4.4.3 + transitivePeerDependencies: + - react + '@sanity/workbench@0.1.0-alpha.36(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(react@19.2.4)(xstate@5.32.5)': dependencies: '@module-federation/runtime': 2.8.2 @@ -11897,6 +12134,12 @@ snapshots: '@types/linkify-it@5.0.0': {} + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.26 + + '@types/lodash@4.17.26': {} + '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 @@ -13127,6 +13370,15 @@ snapshots: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) + framer-motion@13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + motion-dom: 13.5.1 + motion-utils: 13.5.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + fsevents@2.3.3: optional: true @@ -14036,8 +14288,14 @@ snapshots: dependencies: motion-utils: 13.0.0 + motion-dom@13.5.1: + dependencies: + motion-utils: 13.5.0 + motion-utils@13.0.0: {} + motion-utils@13.5.0: {} + motion@13.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: framer-motion: 13.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -14054,6 +14312,14 @@ snapshots: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) + motion@13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + framer-motion: 13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + mrmime@2.0.1: {} ms@2.1.3: {} @@ -14401,6 +14667,14 @@ snapshots: '@babel/runtime': 7.29.2 react: 19.2.8 + react-compiler-runtime@1.0.0(react@19.2.8): + dependencies: + react: 19.2.8 + + react-compiler-runtime@19.1.0-rc.1(react@19.2.8): + dependencies: + react: 19.2.8 + react-dom@19.2.4(react@19.2.4): dependencies: react: 19.2.4 @@ -14423,6 +14697,11 @@ snapshots: prop-types: 15.8.1 react: 19.2.4 + react-error-boundary@5.0.0(react@19.2.8): + dependencies: + '@babel/runtime': 7.29.2 + react: 19.2.8 + react-fast-compare@3.2.2: {} react-file-icon@1.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): @@ -14779,6 +15058,154 @@ snapshots: - '@types/react' - supports-color + sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3): + dependencies: + '@algorithm.ts/lcs': 4.0.6 + '@date-fns/tz': 1.5.0 + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + '@dnd-kit/utilities': 3.2.2(react@19.2.8) + '@isaacs/ttlcache': 2.1.5 + '@mux/mux-player-react': 3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/html': 1.2.0 + '@portabletext/patches': 2.0.6 + '@portabletext/plugin-dnd': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) + '@portabletext/plugin-list-index': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) + '@portabletext/plugin-markdown-shortcuts': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/plugin-one-line': 7.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) + '@portabletext/plugin-paste-link': 4.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) + '@portabletext/plugin-table': 1.3.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@portabletext/plugin-typography': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/react': 7.0.1(react@19.2.8) + '@portabletext/sanity-bridge': 3.2.5(@types/react@19.2.14) + '@portabletext/to-html': 5.0.3 + '@portabletext/toolkit': 5.0.2 + '@rexxars/react-json-inspector': 9.0.1(react@19.2.8) + '@sanity-labs/ui-poc': 0.0.1-alpha.25(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@sanity/asset-utils': 2.3.0 + '@sanity/bifur-client': 1.0.0 + '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) + '@sanity/client': 7.26.2 + '@sanity/color': 3.0.8 + '@sanity/comlink': 4.0.3 + '@sanity/diff': 6.9.2 + '@sanity/diff-match-patch': 3.2.0 + '@sanity/diff-patch': 5.0.0 + '@sanity/eventsource': 5.0.4 + '@sanity/generate-help-url': 4.0.0 + '@sanity/icons': 5.2.1(react@19.2.8) + '@sanity/id-utils': 1.0.0 + '@sanity/image-url': 2.1.1 + '@sanity/logos': 2.2.5(react@19.2.8) + '@sanity/media-library-types': 1.6.0 + '@sanity/message-protocol': 0.24.0 + '@sanity/migrate': 8.0.2(@types/react@19.2.14)(xstate@5.32.5) + '@sanity/mutate': 0.18.1(xstate@5.32.5) + '@sanity/mutator': 6.9.2(@types/react@19.2.14) + '@sanity/presentation-comlink': 2.2.3(@sanity/types@6.9.2(@types/react@19.2.14)) + '@sanity/preview-url-secret': 4.1.4(@sanity/client@7.26.2) + '@sanity/prism-groq': 1.1.2(prismjs@1.30.0) + '@sanity/schema': 6.9.2(@types/react@19.2.14) + '@sanity/telemetry': 1.1.0(react@19.2.8) + '@sanity/types': 6.9.2(@types/react@19.2.14) + '@sanity/ui': 4.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + '@sanity/util': 6.9.2(@types/react@19.2.14) + '@sanity/uuid': 3.0.3 + '@sanity/workbench': 0.1.0-alpha.36(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(react@19.2.8)(xstate@5.32.5) + '@sentry/react': 10.70.0(react@19.2.8) + '@tanstack/react-table': 8.21.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@tanstack/react-virtual': 3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.32.5) + clsx: 2.1.1 + color2k: 2.0.4 + dataloader: 2.2.3 + date-fns: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) + exif-component: 1.0.1 + fast-deep-equal: 3.1.3 + groq-js: 2.0.0 + history: 5.3.0 + i18next: 26.3.6(typescript@5.9.3) + is-hotkey-esm: 1.0.0 + is-network-error: 1.3.2 + isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) + json-reduce: 3.0.0 + json-stable-stringify: 1.3.0 + lodash-es: 4.18.1 + mendoza: 3.0.8 + motion: 13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + nano-pubsub: 3.0.0 + nanoid: 6.0.1 + observable-callback: 1.0.3(rxjs@7.8.2) + path-to-regexp: 8.4.2 + player.style: 0.3.4(react@19.2.8) + polished: 4.3.1 + quick-lru: 7.3.0 + raf: 3.4.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-fast-compare: 3.2.2 + react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.2.8) + react-i18next: 17.0.11(i18next@26.3.6(typescript@5.9.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) + react-is: 19.2.8 + react-refractor: 4.0.0(react@19.2.8) + react-rx: 5.1.1(react@19.2.8)(rxjs@7.8.2) + refractor: 5.0.0 + rxjs: 7.8.2 + rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.2) + rxjs-mergemap-array: 0.1.0(rxjs@7.8.2) + scroll-into-view-if-needed: 3.1.0 + scrollmirror: 1.2.4 + semver: 7.8.5 + shallow-equals: 1.0.0 + speakingurl: 14.0.1 + styled-components: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + swr: 2.5.1(react@19.2.8) + urlpattern-polyfill: 10.1.0 + use-device-pixel-ratio: 1.1.2(react@19.2.8) + use-effect-event: 2.0.3(react@19.2.8) + use-hot-module-reload: 2.0.0(react@19.2.8) + use-sync-external-store: 1.6.0(react@19.2.8) + uuid: 14.0.1 + web-vitals: 6.1.1 + xstate: 5.32.5 + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@noble/hashes' + - '@rolldown/plugin-babel' + - '@sanity/sdk' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - '@vitejs/devtools' + - babel-plugin-react-compiler + - bare-abort-controller + - bare-buffer + - bufferutil + - canvas + - esbuild + - jiti + - less + - oxfmt + - prismjs + - react-native + - react-native-b4a + - rolldown + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - typescript + - utf-8-validate + - vitest + - vue-tsc + sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3): dependencies: '@algorithm.ts/lcs': 4.0.6 @@ -14936,7 +15363,7 @@ snapshots: '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) '@dnd-kit/utilities': 3.2.2(react@19.2.8) '@isaacs/ttlcache': 2.1.5 - '@mux/mux-player-react': 3.13.2(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@mux/mux-player-react': 3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) '@portabletext/html': 1.2.0 '@portabletext/patches': 2.0.6 @@ -15719,6 +16146,10 @@ snapshots: dependencies: react: 19.2.8 + use-effect-event@2.0.4(react@19.2.8): + dependencies: + react: 19.2.8 + use-hot-module-reload@2.0.0(react@19.2.4): dependencies: react: 19.2.4 From 2cc72b5ca9ea5235c825176fcbe88f72c72b9948 Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 08:32:36 -0400 Subject: [PATCH 02/10] feat(sanity): ship codingcat-ops Sanity App SDK via Blueprint & upgrade runtime-cli to 17.16.0 (#754) --- .github/workflows/ci.yml | 3 + .github/workflows/deploy.yml | 2 + apps/ops/package.json | 12 +- apps/ops/sanity.cli.ts | 3 +- apps/ops/src/index.tsx | 13 +- apps/sanity/package.json | 6 +- package.json | 7 +- pnpm-lock.yaml | 5279 ++++++++++++++++++++++------------ sanity.blueprint.ts | 15 + 9 files changed, 3434 insertions(+), 1906 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46c657e9..fe45eb5c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,6 +57,9 @@ jobs: SANITY_STUDIO_PROJECT_ID: hfh83o0w SANITY_STUDIO_DATASET: production + - name: Build ops app (Sanity App SDK) + run: pnpm --filter @codingcatdev/ops build + - name: Run E2E Tests run: pnpm --filter @codingcatdev/site test:e2e diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 027fbaac..3b8b59b7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -6,7 +6,9 @@ on: branches: [dev, main] paths: - "apps/sanity/**" + - "apps/ops/**" - "sanity.blueprint.ts" + - "package.json" - "pnpm-lock.yaml" - ".github/workflows/deploy.yml" diff --git a/apps/ops/package.json b/apps/ops/package.json index 6440d3ca..cfba3a68 100644 --- a/apps/ops/package.json +++ b/apps/ops/package.json @@ -9,12 +9,12 @@ "deploy": "sanity deploy" }, "dependencies": { - "@sanity/sdk": "^1.0.0", - "@sanity/sdk-react": "^1.0.0", - "@sanity/ui": "^3.1.10", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "sanity": "^6.9.2", + "@sanity/sdk": "^3.9.1", + "@sanity/sdk-react": "^3.9.1", + "@sanity/ui": "^4.4.9", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "sanity": "^6.20.0", "styled-components": "^6.3.11" }, "devDependencies": { diff --git a/apps/ops/sanity.cli.ts b/apps/ops/sanity.cli.ts index 8cee1dae..9da4e20e 100644 --- a/apps/ops/sanity.cli.ts +++ b/apps/ops/sanity.cli.ts @@ -2,7 +2,8 @@ import { defineCliConfig } from "sanity/cli"; export default defineCliConfig({ app: { - organizationId: process.env.SANITY_ORGANIZATION_ID || "o1H0wB7xG", + organizationId: process.env.SANITY_ORGANIZATION_ID || "ovF2qiKSO", entry: "./src/index.tsx", }, }); + diff --git a/apps/ops/src/index.tsx b/apps/ops/src/index.tsx index 9ba5a3dc..bb9f8216 100644 --- a/apps/ops/src/index.tsx +++ b/apps/ops/src/index.tsx @@ -1,8 +1,7 @@ import { type SanityConfig } from "@sanity/sdk"; import { SanityApp } from "@sanity/sdk-react"; -import { StudioTheme, ThemeProvider } from "@sanity/ui"; +import { studioTheme, ThemeProvider } from "@sanity/ui"; import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; import { App } from "./App"; const config: SanityConfig[] = [ @@ -12,15 +11,15 @@ const config: SanityConfig[] = [ }, ]; -const rootEl = document.getElementById("root"); -if (rootEl) { - createRoot(rootEl).render( +export default function RootApp() { + return ( - + Loading CodingCat.dev Ops...
}> - , + ); } + diff --git a/apps/sanity/package.json b/apps/sanity/package.json index cb03b8e3..612e54be 100644 --- a/apps/sanity/package.json +++ b/apps/sanity/package.json @@ -22,8 +22,8 @@ "@sanity/functions": "^1.8.1", "@sanity/icons": "^5.2.1", "@sanity/image-url": "^2.1.1", - "@sanity/ui": "^4.0.3", - "@sanity/vision": "^6.9.2", + "@sanity/ui": "^4.4.9", + "@sanity/vision": "^6.20.0", "date-fns": "^4.1.0", "lucide-react": "^0.577.0", "micromark": "^4.0.2", @@ -33,7 +33,7 @@ "react-icons": "^5.6.0", "react-inlinesvg": "^4.2.0", "react-twitter-embed": "^4.0.4", - "sanity": "^6.9.2", + "sanity": "^6.20.0", "sanity-plugin-media": "^6.1.4", "styled-components": "^6.3.11" }, diff --git a/package.json b/package.json index 16dbcbe2..adc8b573 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,12 @@ "@sanity/client": "^8.9.0", "@sanity/functions": "^1.8.1", "@sanity/image-url": "^2.1.1", - "sanity": "^6.9.2" + "sanity": "^6.20.0" + }, + "pnpm": { + "overrides": { + "@sanity/runtime-cli": "17.16.0" + } }, "packageManager": "pnpm@10.34.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dea8515b..4fe21594 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@sanity/runtime-cli': 17.16.0 + patchedDependencies: workers-ai-provider: hash: 75deef68d8c9efb9d0dc235e48a668acbde17a117fd935e787de368a8f46e86c @@ -18,7 +21,7 @@ importers: version: 2.5.0 '@sanity/blueprints': specifier: ^0.28.0 - version: 0.28.0(jiti@2.7.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) '@sanity/client': specifier: ^8.9.0 version: 8.9.0 @@ -29,29 +32,29 @@ importers: specifier: ^2.1.1 version: 2.1.1 sanity: - specifier: ^6.9.2 - version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3) + specifier: ^6.20.0 + version: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(typescript@6.0.3))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(terser@5.48.0)(tsx@4.23.12)(typescript@6.0.3) apps/ops: dependencies: '@sanity/sdk': - specifier: ^1.0.0 - version: 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + specifier: ^3.9.1 + version: 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3) '@sanity/sdk-react': - specifier: ^1.0.0 - version: 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + specifier: ^3.9.1 + version: 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3) '@sanity/ui': - specifier: ^3.1.10 - version: 3.5.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + specifier: ^4.4.9 + version: 4.4.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) react: - specifier: ^19.2.0 + specifier: ^19.2.4 version: 19.2.8 react-dom: - specifier: ^19.2.0 + specifier: ^19.2.4 version: 19.2.8(react@19.2.8) sanity: - specifier: ^6.9.2 - version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3) + specifier: ^6.20.0 + version: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) styled-components: specifier: ^6.3.11 version: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -79,16 +82,16 @@ importers: version: 7.0.1(react@19.2.4) '@sanity/assist': specifier: ^6.1.19 - version: 6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@sanity/blueprints': specifier: ^0.28.0 - version: 0.28.0(jiti@2.7.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) '@sanity/client': specifier: ^8.9.0 version: 8.9.0 '@sanity/code-input': specifier: ^7.3.5 - version: 7.3.5(937dfac7d6df93ac847c841c1958fc37) + version: 7.3.5(a7523e9fd1235f415c4739c3e7045053) '@sanity/functions': specifier: ^1.8.1 version: 1.8.1(@aws-lite/client@0.23.5)(@aws-lite/dynamodb@0.3.9)(@aws-lite/lambda@0.1.5)(@aws-lite/sns@0.0.8)(@aws-lite/sqs@0.2.4) @@ -99,11 +102,11 @@ importers: specifier: ^2.1.1 version: 2.1.1 '@sanity/ui': - specifier: ^4.0.3 - version: 4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + specifier: ^4.4.9 + version: 4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@sanity/vision': - specifier: ^6.9.2 - version: 6.9.2(@babel/runtime@7.29.2)(@codemirror/lint@6.9.5)(@codemirror/theme-one-dark@6.1.3)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + specifier: ^6.20.0 + version: 6.20.0(@babel/runtime@7.29.10)(@codemirror/theme-one-dark@6.1.3)(@shikijs/themes@4.4.3)(@types/react@19.2.14)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -132,11 +135,11 @@ importers: specifier: ^4.0.4 version: 4.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) sanity: - specifier: ^6.9.2 - version: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + specifier: ^6.20.0 + version: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) sanity-plugin-media: specifier: ^6.1.4 - version: 6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) styled-components: specifier: ^6.3.11 version: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -188,7 +191,7 @@ importers: version: 2.0.1 '@tailwindcss/vite': specifier: ^4.2.1 - version: 4.3.3(vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.3.3(vite@8.3.5(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) ai: specifier: ^7.0.135 version: 7.0.135(zod@4.6.7) @@ -244,24 +247,6 @@ packages: '@acemir/cssom@0.9.31': resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - '@actions/core@3.0.0': - resolution: {integrity: sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==} - - '@actions/exec@3.0.0': - resolution: {integrity: sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==} - - '@actions/github@9.0.0': - resolution: {integrity: sha512-yJ0RoswsAaKcvkmpCE4XxBRiy/whH2SdTBHWzs0gi4wkqTDhXMChjSdqBz/F4AeiDlP28rQqL33iHb+kjAMX6w==} - - '@actions/http-client@3.0.2': - resolution: {integrity: sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==} - - '@actions/http-client@4.0.0': - resolution: {integrity: sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==} - - '@actions/io@3.0.2': - resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} - '@ai-sdk/gateway@4.0.109': resolution: {integrity: sha512-5285aXDemutkSNF08ESzp3uUXqnvUCahtq7iaEqwvJNAGY8l8k3G0PGCWNnRg8l18BbDI3nj/bs+/20DkGl4cQ==} engines: {node: '>=22'} @@ -312,10 +297,6 @@ packages: resolution: {integrity: sha512-6m2Tpw/X5lHy0551TcGyDFY8RxNUegcZYbgt6N/fZ3o+fK0b03W6xecS8lXrnxxbUk9EWrweI/9TbJIysafdbg==} engines: {node: '>=22'} - '@asamuzakjp/css-color@5.0.1': - resolution: {integrity: sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/css-color@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -519,10 +500,6 @@ packages: resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.29.7': resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} @@ -541,12 +518,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.29.7': resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} engines: {node: '>=6.9.0'} @@ -1113,6 +1084,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} + engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -1420,6 +1395,9 @@ packages: '@codemirror/commands@6.11.0': resolution: {integrity: sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==} + '@codemirror/commands@6.11.1': + resolution: {integrity: sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==} + '@codemirror/lang-css@6.3.1': resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} @@ -1447,21 +1425,36 @@ packages: '@codemirror/language@6.12.4': resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==} + '@codemirror/language@6.13.1': + resolution: {integrity: sha512-zfvU2r3TyylQLMj/te+5CnQ0rSqZi8B1oTCBbQkagcLW4Xc6imab6qN+pEJhsuNOLaJqiRyBXp9UhWA1DhVvDw==} + '@codemirror/legacy-modes@6.5.3': resolution: {integrity: sha512-xCsmIzH78MyWkib9jlPaaun57XNkfbMIhagfaZVd0iLTqlpw3jXaIcbZm72MTmmn64eTZpBVNjbyYh+QXnxRsg==} '@codemirror/lint@6.9.5': resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==} - '@codemirror/search@6.7.1': - resolution: {integrity: sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==} + '@codemirror/lint@6.9.7': + resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==} + + '@codemirror/search@6.7.2': + resolution: {integrity: sha512-gUYkYhT2+n/+VGZ+8EzE5WFkYZUZYm1VOKDudIsNqh42uRVQJ0a6Yss9sdKT3MeOYfuL1N6AZA57oza0Oyr0LA==} '@codemirror/state@6.7.1': resolution: {integrity: sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==} + '@codemirror/state@6.7.6': + resolution: {integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==} + + '@codemirror/streamparser@6.0.0': + resolution: {integrity: sha512-JTFPF6xrfjt0mnfGPgzcLiMwYmvIyNaoizp8BYzv8FE8KrT6GBGDZ190rtt+O7Wke3gG/MFHyiY9YGNeimof4w==} + '@codemirror/theme-one-dark@6.1.3': resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} + '@codemirror/view@6.43.15': + resolution: {integrity: sha512-HHsfpqFeHyXLs983pSRe38Xajs0vFWZQ2BuX0m7Ki8w3jZ5iD8cuR3lBz2/5/X53Dhf32SBHKh6rtSTB6tKeGw==} + '@codemirror/view@6.43.9': resolution: {integrity: sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw==} @@ -1473,13 +1466,6 @@ packages: resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.1.1': - resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-calc@3.2.1': resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} engines: {node: '>=20.19.0'} @@ -1487,13 +1473,6 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.0.2': - resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.1': resolution: {integrity: sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==} engines: {node: '>=20.19.0'} @@ -1507,14 +1486,6 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.1': - resolution: {integrity: sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==} - peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true - '@csstools/css-syntax-patches-for-csstree@1.1.4': resolution: {integrity: sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==} peerDependencies: @@ -2310,6 +2281,10 @@ packages: resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/ansi@2.0.9': + resolution: {integrity: sha512-0Ywt3S8tqM6TWUcsRlBFQ1x+X3/o8kktX0ZiKAnByYb9GFDknnOhse1PVtfiD2BXPI8ar+BWx9PV9R0lQIcygw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/checkbox@4.3.2': resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} engines: {node: '>=18'} @@ -2328,6 +2303,15 @@ packages: '@types/node': optional: true + '@inquirer/checkbox@5.2.7': + resolution: {integrity: sha512-/+QmGE/9bvE/EobaZDnzYe+T+QWoJrnmxwBQNtoi2OVSUR9d1znYsNyEoUrOZvFSxDYttrhzRIpXpaLkN+iIsg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/confirm@5.1.21': resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} engines: {node: '>=18'} @@ -2346,6 +2330,15 @@ packages: '@types/node': optional: true + '@inquirer/confirm@6.3.4': + resolution: {integrity: sha512-ZwnaZZDa1zxsyVrN32s447ydMnKcw7e8WWNT+R+Qsu0zAn8Rs6yi9d1B80Kob1Ul2cfUi7t8JD2t4/K7uEZpqA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/core@10.3.2': resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} engines: {node: '>=18'} @@ -2364,6 +2357,15 @@ packages: '@types/node': optional: true + '@inquirer/core@12.0.5': + resolution: {integrity: sha512-c0ZSnO9oVk/IlEGoZK3u8b3IZQeu9I6jUkXJSQnQEVRXsjKvtAq3AGqFL2LgfJhlzMZne08pZHWRWasIcI3Rew==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/editor@4.2.23': resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} engines: {node: '>=18'} @@ -2382,6 +2384,15 @@ packages: '@types/node': optional: true + '@inquirer/editor@5.3.5': + resolution: {integrity: sha512-6lU3/pPx5z3lHWejFW061MV4qZooBQYv/+EeGhNOPiP/i+hrYsHfxxBnnDGsAfg8YdLUd69YckoeOjtr3QuAUg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/expand@4.0.23': resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} engines: {node: '>=18'} @@ -2400,6 +2411,15 @@ packages: '@types/node': optional: true + '@inquirer/expand@5.1.7': + resolution: {integrity: sha512-eiJ31YFCaB6fLoJCqLIn8S6eqUyME6vwr8KcP5h8cxmA+bV9RRVPO+kywoxb7G63HduDXV6sN/SM7o2R+ahEcQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -2418,6 +2438,15 @@ packages: '@types/node': optional: true + '@inquirer/external-editor@3.0.6': + resolution: {integrity: sha512-rWmw6WG8JZ7LMn/srXEylYGhL6EXXJeROE7/4x4GREh6NgzqJBDbIgpNGsYoLPfobeb4VZtEYzPGnT5EFNYhiQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/figures@1.0.15': resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} @@ -2426,6 +2455,10 @@ packages: resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/figures@2.0.9': + resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + '@inquirer/input@4.3.1': resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} engines: {node: '>=18'} @@ -2444,6 +2477,15 @@ packages: '@types/node': optional: true + '@inquirer/input@5.1.8': + resolution: {integrity: sha512-psOSTgkL8y/OtgJJYbqJ0oISr2QBE0U1Ro/qQdA/EKjeJiwiUTQgQmq8o4ESNzVOWthIeh3YLD7BCUR9dKnR5g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/number@3.0.23': resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} engines: {node: '>=18'} @@ -2462,6 +2504,15 @@ packages: '@types/node': optional: true + '@inquirer/number@4.2.5': + resolution: {integrity: sha512-lEy7LWsdF5qHx5QjHZqabUqM9P7i5uTMCt8GRzqxmwXXKbapKJDA+ucVflVVPAyj4snD5DTAD4L+sct85XOlOQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/password@4.0.23': resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} engines: {node: '>=18'} @@ -2480,6 +2531,15 @@ packages: '@types/node': optional: true + '@inquirer/password@5.2.4': + resolution: {integrity: sha512-T7ir3fflSSVCYEVqNyMBq+pIMsilQRtbZcD5gxn6Ewsin5TJWBxrGBdXveWtmeXVAeoInfhS+BhBUZaL4sFSDg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/prompts@7.10.1': resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} engines: {node: '>=18'} @@ -2498,6 +2558,15 @@ packages: '@types/node': optional: true + '@inquirer/prompts@8.7.4': + resolution: {integrity: sha512-SAJt+QhY5rOJAIgZBw9TrHWfgrp6wsb9cqRCyqax+Hl6EiFfRXmD9EsIWkST8yq/dQ8H46Is2Sr/JG7Ls/LQ+Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/rawlist@4.1.11': resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} engines: {node: '>=18'} @@ -2516,6 +2585,15 @@ packages: '@types/node': optional: true + '@inquirer/rawlist@5.3.7': + resolution: {integrity: sha512-XveEe8v3BHj9ec00n+9i8FHjWhXjS6+jCTizYvXCqKUKtgkrq9xid8S5j3mYGW96qfxG3mwNoud3m3v8GDk9Pw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/search@3.2.2': resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} engines: {node: '>=18'} @@ -2534,6 +2612,15 @@ packages: '@types/node': optional: true + '@inquirer/search@4.3.5': + resolution: {integrity: sha512-kIUecMugEN2YTvTmff+uYz0nAE0f9RFNDVZknfrh264vAQM9P8tnsXiUp7z8XbGuNIBEtFMJhvc9QquawpC46A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/select@4.4.2': resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} engines: {node: '>=18'} @@ -2552,6 +2639,15 @@ packages: '@types/node': optional: true + '@inquirer/select@5.2.7': + resolution: {integrity: sha512-pRDWO4dTqSAvFQdO8yclKMtXNDm9K9HmvWB5UZmT3clw2OlOBNXveHzhyFmO/0d0yJMqlPcNITus1Jtpm6t8VQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/type@3.0.10': resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} engines: {node: '>=18'} @@ -2570,6 +2666,15 @@ packages: '@types/node': optional: true + '@inquirer/type@4.2.0': + resolution: {integrity: sha512-2rnHX8RPo4glJYqnFc/v3nQeIhDcjyRRyaT7MGcfL/8xv/8K03SXYoA2tX06WVSKywWOE/ncbG3dtuzLjR5TCQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -2600,9 +2705,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@juggle/resize-observer@3.4.0': - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@lezer/common@1.5.1': resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} @@ -2645,15 +2747,6 @@ packages: markdown-it: optional: true - '@mdit/plugin-alert@0.23.2': - resolution: {integrity: sha512-pXIil0FLy9ilhvT6d324A4X+mt5i/zG8ml0VIpZwiUYh2k1Wi6VnZhFHfsnONTRu6dPL2EwQBIhQgQ+269f7LA==} - engines: {node: '>= 20'} - peerDependencies: - markdown-it: ^14.1.0 - peerDependenciesMeta: - markdown-it: - optional: true - '@mdit/plugin-alert@2.0.2': resolution: {integrity: sha512-0vjhfT58lKE5BDkrdpXdsX4jzRq2zDhlVqQNcgAOAatjG+Tq7k8eCQZBle+10lzNegqpWRgszpu2BSS4df7luw==} engines: {node: '>=22'} @@ -2663,17 +2756,8 @@ packages: markdown-it: optional: true - '@module-federation/dts-plugin@2.8.1': - resolution: {integrity: sha512-JM8g76KzhhH44kHvM2JPJ5FIlQDwUNzw0vvq5EDSo/znNUmUEuSrfTssukCKg1nqnBGWLohjIV0LOOhLdCknoQ==} - peerDependencies: - typescript: ^4.9.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - vue-tsc: '>=1.0.24' - peerDependenciesMeta: - vue-tsc: - optional: true - - '@module-federation/dts-plugin@2.8.2': - resolution: {integrity: sha512-pwZFW8b2LZTymMMC+o2M9xMXDIQKAHGtCRqj/IkOp0jHRYrKjK9cma9xoUNst8/R3sEn878/i9wgv/43BnCEyg==} + '@module-federation/dts-plugin@2.9.2': + resolution: {integrity: sha512-J84cRrewtUFnFdMeD/91mHtW+Toh3mAWvGnhsFAc9oEbGwqfzJEfgPJri65xdtzWcNhs1d6FImPMTvnjzOnYvA==} peerDependencies: typescript: ^4.9.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 vue-tsc: '>=1.0.24' @@ -2681,59 +2765,35 @@ packages: vue-tsc: optional: true - '@module-federation/error-codes@2.8.1': - resolution: {integrity: sha512-0mQ+bWt1LRCZyURx3g2b8G+aAlvk8iXIgrp3Jit/75blrlVda/eVqnHz1L+YOxwkP3xSrdbUb4423AoWti31ZQ==} - - '@module-federation/error-codes@2.8.2': - resolution: {integrity: sha512-8inlDv48QOjA//CLQ3epjoHEiMQGsz1Pmtu2N+s7gQVggn6AYHpjnMe8AsyGxtpaPg3wbX0HmBZtRFggpXUB9A==} - - '@module-federation/managers@2.8.1': - resolution: {integrity: sha512-bHRooIgplIFNLH42eM3g21b2apM/a7lMG1EwifUxT4A4AobS42H08KGdYITdKJcrgowx3D7PhYndiwtHFI03zQ==} - - '@module-federation/managers@2.8.2': - resolution: {integrity: sha512-OQfnoUwy1IUfn6DaI2S/DPKgnElkYlP+gG8mbUQlJVEW1Zg/8V/dZbNgJUKikTJly6yR1r08PK59g7239ITYMw==} - - '@module-federation/runtime-core@2.8.1': - resolution: {integrity: sha512-Dif+3u7fvq6qBATFIv5qB7ay6Rgo2HNzhaNOt1yRfpVXjiJqQ3UPnHZ+TLP9znkXiZvg6Bg5W9EV2ZX4nH2S0w==} - - '@module-federation/runtime-core@2.8.2': - resolution: {integrity: sha512-PEkkK9MUp+nUCeQMS4ox3QGZfwwxgfjGA7P4umEnr5c3y8DLNDR+26tyHf/Gkjen2VsjlcyL+mEAQo1Zi4IE3g==} + '@module-federation/error-codes@2.9.2': + resolution: {integrity: sha512-MTpKubqsJSBgnuw+2Pli1kHL4INeHD5cGnHL84oRANwQAWK7b6lN3ZZTmL3FL6lYn65ImineqZNqGWBv5GQVLQ==} - '@module-federation/runtime@2.8.1': - resolution: {integrity: sha512-+xpq/r6Om4plbGJisZp6/rl7usEUlQszz34E+JUKgl9uW3QIRzVgxwOAzGiF7U+dqOKxMqmiq+nTJwK2wAwteA==} + '@module-federation/managers@2.9.2': + resolution: {integrity: sha512-VtSKLkT2EA1wqCMFXNiklC+XF+5bZPYY3sUQ9LCFHqKS7v7NOJDrwMV6Qtw3fxH4Y6Pe6P28MiU8D9dlzknCKQ==} - '@module-federation/runtime@2.8.2': - resolution: {integrity: sha512-SUoP+PD5EjSPSi6FxEPGIZoRkFifxdeYcVQbJE9mO0VEjF51gAk3/TgX8k0vzUryOBPmXekLr9SfQXU6DqUtvA==} + '@module-federation/runtime-core@2.9.2': + resolution: {integrity: sha512-S9roTDqLtAWaaDBuug69ZnXXGEx0pUq/yG06J759bjRgfAg2P9+dWEv1q7rB2eMIp7HH4L6s3ColDRYdL6tJ9w==} - '@module-federation/sdk@2.8.1': - resolution: {integrity: sha512-3EVljiNilY2pFIG2RO4KNCC6gIPnYc9J+p5U6Nn8D5X3PtJeEcPyBvKGttxZnSLlXCi+YXQfgexBOfnkvEuzuQ==} + '@module-federation/runtime@2.9.2': + resolution: {integrity: sha512-1lPZVy7TkMTTBMkkjgQt7jA+9FAx226yQqEz+X0lFAIbpxIWfpzNQLD+7IydEe83ZhDJpK3cv/9bn3jjQBZeqQ==} - '@module-federation/sdk@2.8.2': - resolution: {integrity: sha512-OPS/lbQjraLXoWniQpCwQ/vqgURHTrhsackSNcOPmcJHM3LyR+DabxUc0pl8jAqExsW2l+uepQq7+/Gkei871w==} + '@module-federation/sdk@2.9.2': + resolution: {integrity: sha512-ILtBFPuYpVcRA/Qay1lJ2hMtZI8fDE/v1n7xiN17e5qx5rSBR3FaamTsmRpN1hIt+gVnoa76CzOP/Y73d8hHNg==} - '@module-federation/third-party-dts-extractor@2.8.1': - resolution: {integrity: sha512-6ulu7vqv5wyM5YWwxjUHzZ+8Sg6e+/vn+gskiUBs6EPqe/w3XMdRoUrFjAI3EW62xi0e0xbWLsjbQs9jCAj8ig==} + '@module-federation/third-party-dts-extractor@2.9.2': + resolution: {integrity: sha512-FKJVGx+/jIe16RfmwoyIDVMPAttIFJv6AJCLkKf05IRNvI3RJFqQ1tLP1YjcfGuumCbYuWGa4QKnMla7YjVpqg==} - '@module-federation/third-party-dts-extractor@2.8.2': - resolution: {integrity: sha512-Xf3iZ4iDi972XMOMbmUm/c5Vwwb6cTsU+Jpoz96lUom6Yps9FQX48elIdhgcQsL7/K64PqdOONsrlZVo8zphKA==} - - '@module-federation/vite@1.20.1': - resolution: {integrity: sha512-IlCiZvMHc9BkwqgwwI/MdnQK7X/rZfazjGaMBQlGPd0mDiDRbZzd0A+FVlxtiNnerAeIfZnBuZfg9G8JRT7EOQ==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@module-federation/vite@1.20.7': - resolution: {integrity: sha512-Mto7P+4k+vXZYuQ6AjDMhVjp5uo/u0G+gLsJLVw6vkibvG2kcwvTmVLoHUBhQ2tj01onohajAxIs9X7H9G4FSg==} + '@module-federation/vite@1.23.5': + resolution: {integrity: sha512-pZ4gwP3SyuNG9JnYAWFIOJyFz1Kl37hnJyKjajMpPqQwTQkCjY7gn58qEmVwTyBv8VqOA5XxEXe1ZMF3AsOmnw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@mux/mux-data-google-ima@0.3.15': - resolution: {integrity: sha512-5u5VIWI6V0urhrZzka3nZdCcVL/po2LxWO7lW3QHeWmCjpkudY+OmLqzdbLLcqEXHsURRM2+M6O2k6LNVFNnLw==} + '@mux/mux-data-google-ima@0.3.18': + resolution: {integrity: sha512-YFSz+bconNzW/HtnYFb7xC6tmHVf7cHQsIIIOTtvSZw4qge7mpM1Ex96hB3EWFnU73gA6GAf00xwJnPXGKwOig==} - '@mux/mux-player-react@3.13.2': - resolution: {integrity: sha512-yjAmiqVPYTKi88LAuHxSwKiYrZUDy1ofUYjrDP91mvPfz8BfTvUanzpyE8+a6pRIZFp55rmiAnWyjWKuqSGASw==} + '@mux/mux-player-react@3.14.0': + resolution: {integrity: sha512-TmEhiYq30mUzBaMlvl7fX2V3kVW8JqnlmrcOVmxYZynlQMwPprd6Dz1h2frEANa6WO6XiucVZdzT/nqhhOlxnA==} peerDependencies: '@types/react': ^17.0.0 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0 '@types/react-dom': '*' @@ -2745,14 +2805,14 @@ packages: '@types/react-dom': optional: true - '@mux/mux-player@3.13.2': - resolution: {integrity: sha512-qYOYK4/vAr0VEs5SoC8KRieKm3VSgXJpyuERvOIDYvomIVGVpeqGzhjeDeZ7XKQBH3swg0RdAT3kZaTWXe5s9Q==} + '@mux/mux-player@3.14.0': + resolution: {integrity: sha512-vb1czZOL+L1PA4hNbiLBO913CMtJ5LTvJ5hjck+ba93MNNpv/Ie86TxtvspXWK6fufEWiCoCH5GK81A/aEWQhw==} - '@mux/mux-video@0.31.2': - resolution: {integrity: sha512-waahxlrat1PpRzcY2pwMQJ5Gyhos+D6iRyKnYzF0wBf4SESfBtunSBj3EuKuljypm8bamh9gWnlA0LSzm5Pz1w==} + '@mux/mux-video@0.31.5': + resolution: {integrity: sha512-Cs2SUiKhW5puhua071z6CDHFFKu1qtvAot0LtJBFrYIEN3CWTXJ6hrGpPr6JVVCtaTHXQ8nbArOQ70cI1A/gmw==} - '@mux/playback-core@0.35.2': - resolution: {integrity: sha512-AsMV0LMwJm9T1ig6BBYSddeMlkzz+2RGcd6dkOgYk+L5Hx477ovbTxJZJ/vTW+rZjNWHcG3BvgNbSLgiubyZhw==} + '@mux/playback-core@0.36.0': + resolution: {integrity: sha512-HCACbUUDQ3j7dA9b7zqa9dsqjQOS6PlETPyiHYS4wfZiY0dciAQhIjymCBtpfXQg+WeSzD1Clsj2Uq0cMev36g==} '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} @@ -2792,56 +2852,22 @@ packages: resolution: {integrity: sha512-KcbWlSO+s0Yr9c5wHNC6Npqdh46iJ8t9wCWW19yipT0QmnfZjoTqqqJ1DoP6s3i5P1z5cG35AqS17KL3b20Klw==} engines: {node: '>=18.0.0'} + '@oclif/core@4.14.0': + resolution: {integrity: sha512-QCJIZoVJxV7jywgVAUlsQwl3dr3Sa21kfi5z9KrYolbexWJUtFSEtMoNiBWojD05mYycLnB50gp/VxlGdaOCRA==} + engines: {node: '>=18.0.0'} + '@oclif/plugin-help@6.2.58': resolution: {integrity: sha512-DAYMXZrTWRMLTbpX+rT+ibAmKrZ6IVNGn+fgAGjMoeNlqlSY94eJHocgmqChMwsdWp3H3x+jFmPJiYQt/ifr3Q==} engines: {node: '>=18.0.0'} + '@oclif/plugin-help@6.3.0': + resolution: {integrity: sha512-cpSRv7tyHHFPv39HrV22eNmu8ylrwjmPvqdlNo3URp79+p5319p+a8PI/3ez6A6GZmjwBj1EWUdVz1aPUAsSmw==} + engines: {node: '>=18.0.0'} + '@oclif/plugin-not-found@3.2.93': resolution: {integrity: sha512-KBizxn+kgTPWLUCo/vDz/oDdEA5Ll5H6x0jJhl05B56yHwgQp46ZxwXmtBsxvvgrmMqJEtFUw2Qrq+nTHWWv4g==} engines: {node: '>=18.0.0'} - '@octokit/auth-token@6.0.0': - resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} - engines: {node: '>= 20'} - - '@octokit/core@7.0.6': - resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} - engines: {node: '>= 20'} - - '@octokit/endpoint@11.0.3': - resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} - engines: {node: '>= 20'} - - '@octokit/graphql@9.0.3': - resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} - engines: {node: '>= 20'} - - '@octokit/openapi-types@27.0.0': - resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} - - '@octokit/plugin-paginate-rest@14.0.0': - resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} - engines: {node: '>= 20'} - peerDependencies: - '@octokit/core': '>=6' - - '@octokit/plugin-rest-endpoint-methods@17.0.0': - resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} - engines: {node: '>= 20'} - peerDependencies: - '@octokit/core': '>=6' - - '@octokit/request-error@7.1.0': - resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} - engines: {node: '>= 20'} - - '@octokit/request@10.0.8': - resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} - engines: {node: '>= 20'} - - '@octokit/types@16.0.0': - resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} - '@openrouter/ai-sdk-provider@3.1.0': resolution: {integrity: sha512-BQy1TA9fKrh47s9ivsO6FY5QimN7GUF0i8Qon3pkxQclEgShso0dClpcWn8OIyPLEZZPFaFKgI8TW4S/O0p0Dw==} engines: {node: '>=22'} @@ -2859,6 +2885,47 @@ packages: '@oxc-project/types@0.144.0': resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==} + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} + + '@pierre/diffs@1.6.0': + resolution: {integrity: sha512-bO8sUiwF7Y1VU3DpYc0jwJz8SVhL53Qp9S9sUaHZJWznuQv9xRLgaeX4yNBysiA7uY70R2Aq7kCcTwPfW89GzQ==} + peerDependencies: + react: ^18.3.1 || ^19.0.0 + react-dom: ^18.3.1 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@pierre/highlights@0.1.3': + resolution: {integrity: sha512-fI7BQu1IRtxBQthK8+Z0aEADcxHBEHSZnWUmE/gKvn7BfwPcaBkh9OiXi4eEQBf4MrtzUNaYTOXJTW4yWUD9QQ==} + + '@pierre/theme@2.0.0': + resolution: {integrity: sha512-yNDd9GYLQl1mEUJR8AneJ5e4ohLIHQd/wZLWr4fagt78vS2RwwZNW530vVgHqXFAyFVcFlRmGUD5ramXH46OXw==} + engines: {vscode: ^1.0.0} + + '@pierre/theming@1.0.1': + resolution: {integrity: sha512-WCI5Qd7iprDpISL9fBYOLe8RV53+b7mFNA3bPzl60/2CKCSrsKN8zEcep6Y3BAzvARlmca50zGjDodqPGiTUKA==} + peerDependencies: + '@pierre/theme': ^1.1.0 || ^2.0.0 + '@shikijs/themes': ^3.0.0 || ^4.0.0 + react: ^18.3.1 || ^19.0.0 + react-dom: ^18.3.1 || ^19.0.0 + shiki: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + '@pierre/theme': + optional: true + '@shikijs/themes': + optional: true + react: + optional: true + react-dom: + optional: true + shiki: + optional: true + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -2884,94 +2951,94 @@ packages: resolution: {integrity: sha512-BX4LXt3hDU2wI2kufuMT3CNF88atdZuCSB+YXtjUF9hO/sZJhLG/IfK5pWV4GVoRIql9C6f2IBitxRSImG5NQQ==} engines: {node: '>=20.19 <22 || >=22.12'} - '@portabletext/editor@7.11.0': - resolution: {integrity: sha512-t4upBUN8ODfi7B1GphlU7Whn5BU0YlzGb3zwVAgTRBRZgAJzvnjtK8lXS5nEaQD5ZT5W48HomTMSvKbXk7D+wQ==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/editor@8.2.7': + resolution: {integrity: sha512-9xRFULmxCIACgmLqcdmkXSw2RVovBSczSm2/s6FCrSLujxcR7g6nKlxa147U6maIjQG1S7bZoihovppPF/YlOQ==} + engines: {node: '>=22.12'} peerDependencies: - react: ^19.2.8 + react: ^19.3.1 '@portabletext/html@1.2.0': resolution: {integrity: sha512-4xtdIdGOAdpXv4PfcSLZAoVdOURt4hVLs/bKeXjpQzja3vWgD/A5sscMsElO3zESDXcp5fWZG2s3eJwjLU3i3g==} engines: {node: '>=20.19 <22 || >=22.12'} - '@portabletext/keyboard-shortcuts@2.1.4': - resolution: {integrity: sha512-oIIYUjr2At34+Nrl409HVRTO8T1wAEExAKVQIvGnuS2ZkJMvJN2tn7oPK1ImIZoQbizikHW+o3hqVSNd0agLlA==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/html@2.0.2': + resolution: {integrity: sha512-9s69Dd2F5QjSHeiM11w+vnuYSjSDatXK3W033rpVCOG5AItVglFUmZzKh7UqAFeV6T9sTSjCfaX7lo2UesK6Uw==} + engines: {node: '>=22.12'} - '@portabletext/markdown@1.5.0': - resolution: {integrity: sha512-TLlWrsLT6kXUeE4Fn6KWW+NMOBB/epT5qZiD92+15cJje6R7xmmQ/orCwViSicCiQ77t1/zwguilCUzdNB4XDA==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/keyboard-shortcuts@3.0.0': + resolution: {integrity: sha512-YsK/3mkFEVHs021S9EGA885p6eIe3XzFcARKD7scqtNaPBz7y579XXoa78kXe6XBLgiuKmB8eU3/Ucdnvi5SCA==} + engines: {node: '>=22.12'} '@portabletext/markdown@2.5.0': resolution: {integrity: sha512-ODxM2OFclDuzqnluuOuQOZw4b+iNUZD/l0ArxA+23ZHPmmcbtzlGoGZfcLGA6LRUKve6+cvCwXCbeX3Z1l+sKA==} engines: {node: '>=22.12'} - '@portabletext/patches@2.0.6': - resolution: {integrity: sha512-qki7QMrZz3FJ60XNPFDMQgn8RerfKPaLWAyNJ/wg83gpoNlPFevwYxwCsH8OahVDmaCy30QZrPgj7k0tWb97uA==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/patches@3.0.2': + resolution: {integrity: sha512-h1Xp4zjKh5dLsXxkdWJA4r2N1kKGr+v52+MuXviu+cLuGvLoC0VrBOYF3H8hOmQw33ylenwtIIUE978t7IxOJQ==} + engines: {node: '>=22.12'} - '@portabletext/plugin-character-pair-decorator@8.0.48': - resolution: {integrity: sha512-NyEQmks9S53v/HIy4WZqg2y8fXDhGL9cFqyRj+OIm2enr5jgjvrY6HH7X5/pzCn5y2V9vWDMsg/lFdhjBbyPng==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-character-pair-decorator@9.0.21': + resolution: {integrity: sha512-WtmhIaSZOUmLm6eG5EMsG7LhWMuaF5hMb5V2K4gnWfMaQ8cpe36LrOluy0lOlU3wLJNmjH5iRtV7N4mX4pVy7Q==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 - '@portabletext/plugin-dnd@1.0.32': - resolution: {integrity: sha512-o2IoSmW64IyCBx0uBJAUoxjeaPaWqGuo50B/f2i3JwbVUv5p+eooAK5RgdovKEtUrbyYYBckGyRrICa9yzsdew==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-dnd@2.0.22': + resolution: {integrity: sha512-KOEh9eq5KxSqcv2LSXiXomdWghAPSPg94+Ybq5Knpsai23MG+sUhDLbsuZITGX6lOJMl/xERT9Kr/g7GXPHJxQ==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 - '@portabletext/plugin-input-rule@6.0.17': - resolution: {integrity: sha512-n6dMB31MEDe9phPAJSAMRc4DjyOxkIfyF3Jh4o2oHnKW3YVZMXJQkJ9qQ9Y3PtVqWBXCQBvYMB+j4IJpije7JA==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-input-rule@7.0.21': + resolution: {integrity: sha512-UFYlxKiRAJcLRAakKU2Xe3jdEj3ZkXp0V6D8qe8hvfIHjGplGRBea2RIb4gIA+Twh+fLrX/630YrX1kTixzMcQ==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 - '@portabletext/plugin-list-index@1.0.32': - resolution: {integrity: sha512-tag1QQ6KHFF8F5CP+nKfnDROh1PYcV4+rXnEHvWExOnQFTgASDXRrlW4iB4/uei6zoQvf5z9zcDY5fkcLW4w/w==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-list-index@2.0.20': + resolution: {integrity: sha512-BeX6Bw3KEwQkp1OiPPE0OH3/2DyfFEzC40NVcydapu8Gw0Bqg2cQQ4MV8jX0adQYtQaW4Hx+pdZ27en5ai4rUQ==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 - '@portabletext/plugin-markdown-shortcuts@8.0.48': - resolution: {integrity: sha512-RiYLalBeVxHhTaXrbHS+vpxDyYUVfaZfsR8QLzzE/f3A9OXH+uMqvd7BwW76JWH7CC5S1/cpfT2+TngfmVGJ1w==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-markdown-shortcuts@9.0.21': + resolution: {integrity: sha512-+J6N9oyX3EYN14DsroVzZQHwQnJ6EdJXpFsjrsPvm4bcb+7JGAi2dcxBCs3HdKkU5FpQePUJTAR5LnMJ7mn9ZA==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 - '@portabletext/plugin-one-line@7.0.47': - resolution: {integrity: sha512-QH9+f60w/qAm9LQmpMbn5SCj3An0XBS6HriU9zXmkx1Kdv9pMKT/k8ZkqXQPOGmRq40oAMqn4if/I1OUIBlUgA==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-one-line@8.0.20': + resolution: {integrity: sha512-hzcozebB98iDsBm0B4Q70uO1Mdrj9R/Qvb7CzhpZTDGx7Gmj2pb0bXPbYIsuzG+43XiNkeSSE7Qh7LAG5sIlVQ==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 - '@portabletext/plugin-paste-link@4.0.47': - resolution: {integrity: sha512-P3Ktb9rDjoxNoLcGgnhYALmMlMraSIz3xajbySwrZeYgRZKcJ7umbBGxLdukgLeeysa3cVdomm8yg25pBl0Qcg==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-paste-link@5.0.20': + resolution: {integrity: sha512-ZrkZ5hXDBi4JMX3WXnPWuNJN/9pFZhUotXPve4w59nkpQH4SzxNrl9/gNg1tTgE0k9ObO2Y/f5gkd1ti+KUMpA==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 - '@portabletext/plugin-table@1.3.17': - resolution: {integrity: sha512-TfLcQivi5NQVBUFoH+JJsSaB/KRuo+RiBbPVFYQBkIho8rFomrV9DrqSHK7/G4cDB4ZAEQe4qmUk7UYySrxESA==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-table@2.0.20': + resolution: {integrity: sha512-TXHIsnWS9/MhQde5Dx2+AeJtFHgRY2WsyFJWyahb+heTdSKm3FrZS1S9MngPKHQhyz6o1HTfCDeK92T66lSsdw==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 react-dom: ^19.2 - '@portabletext/plugin-typography@8.0.48': - resolution: {integrity: sha512-x+vTPAt4gOLg1sb0LUYDLfN5szg1M5f/gb7UHZitzpcDg75EDmxCUjaVD0N/Kg5kZ/TCUrWpxfZfkKJw9Wa1DA==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/plugin-typography@9.0.21': + resolution: {integrity: sha512-iK3sqY/jd7KP4d3OUbdQIavZitvREHIgWw8c5BjuM+sAjTKlDwh7GXf/Ywrc/tcvi6Z6VBme9wen8dUGVT3ERA==} + engines: {node: '>=22.12'} peerDependencies: - '@portabletext/editor': ^7.11.0 + '@portabletext/editor': ^8.2.7 react: ^19.2 '@portabletext/react@7.0.1': @@ -2980,10 +3047,24 @@ packages: peerDependencies: react: ^19 + '@portabletext/react@8.0.1': + resolution: {integrity: sha512-Fy9UxVhppgEckEvczZytg4bBxiPcZIM49NrJ3sizEoz19aNzJWEYoUj7f3TI94907psEk0yfR145eoOgkedM2A==} + engines: {node: '>=22.12'} + peerDependencies: + react: ^19 + + '@portabletext/repair@1.0.0': + resolution: {integrity: sha512-5oH5Osa1Cka07kK0w3y/ehS6gy64+dlyAwCiiuu74S0uceScvGuUFo6qSJDhsg1x9zxv46wMpZyObox3Aej9ag==} + engines: {node: '>=22.12'} + '@portabletext/sanity-bridge@3.2.5': resolution: {integrity: sha512-tLX7SQJzV2IUTCPRFMDUgZNujiti2/IT8aRTHaHsHo5oIxKcRaKidfM9ZeCt6L1TgtOELivxd3szytWTfYeddQ==} engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/sanity-bridge@4.1.4': + resolution: {integrity: sha512-4S3IZ9T5Eoe2lcrmrw3Yygu8fv50JhHE7+hOTyx+wxpaKvRvFvf2XJa2DM5mhVMzOhScyyc3H0FaCrZEzQ5BJQ==} + engines: {node: '>=22.12'} + '@portabletext/schema@2.2.4': resolution: {integrity: sha512-pTDrGxBk2LFVK4awpyBBOEkwGZwQOUWFyQAnhPfuLHIIgjcljOhzGHB+Mz89ddxi+zAXlxJ/A3U2xmFibe8qNQ==} engines: {node: '>=20.19 <22 || >=22.12'} @@ -2992,9 +3073,9 @@ packages: resolution: {integrity: sha512-mNv1YShl0e6XJZIntQYm7nr9UbLXCf3+JktfGp1OO8iPxpdMRnhaIq3iGSMVrO9fIBcB7TNQgFfOdqQCSfXFew==} engines: {node: '>=22.12'} - '@portabletext/to-html@5.0.3': - resolution: {integrity: sha512-62xml8ywsBjsNHfaQsMEZbj5VvJhWcGq5e4PCZpyb5yWl5zxukBRKal42201t5nu2Vt+JEMj9ezKU776C0elrQ==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@portabletext/schema@3.1.0': + resolution: {integrity: sha512-Th8x0I21GDDv+yQEqF1w/G9iuyLkFdUM424VSSCCdZRSnfor2m23m+GFdf3pVTte6TPOzu4Ku89FwqyRRJ2vxQ==} + engines: {node: '>=22.12'} '@portabletext/to-html@6.0.0': resolution: {integrity: sha512-kMqr55pJDBsIyOHLeVccFMFfJxSdozS+A1TeYhiihIinSDhb6ibUxpQIpg0B1n54vZJJW8rDs+QayP3vQqLKUg==} @@ -3038,36 +3119,79 @@ packages: react: ^18 || ^19 react-dom: ^18 || ^19 - '@rolldown/binding-android-arm64@1.2.4': - resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} + '@rolldown/binding-android-arm-eabi@1.2.14': + resolution: {integrity: sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.14': + resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-android-arm64@1.2.4': + resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] + '@rolldown/binding-darwin-arm64@1.2.14': + resolution: {integrity: sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-arm64@1.2.4': resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-x64@1.2.14': + resolution: {integrity: sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.2.4': resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-freebsd-x64@1.2.14': + resolution: {integrity: sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-freebsd-x64@1.2.4': resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.2.14': + resolution: {integrity: sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.2.4': resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3075,6 +3199,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.2.14': + resolution: {integrity: sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.2.4': resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3082,6 +3213,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + resolution: {integrity: sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.2.4': resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3089,6 +3227,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.2.14': + resolution: {integrity: sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.2.4': resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3096,6 +3241,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.2.14': + resolution: {integrity: sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.2.4': resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3103,6 +3255,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.2.14': + resolution: {integrity: sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-x64-musl@1.2.4': resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3110,26 +3269,44 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-openharmony-arm64@1.2.14': + resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.2.4': resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-win32-arm64-msvc@1.2.14': + resolution: {integrity: sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.2.4': resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.2.14': + resolution: {integrity: sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.2.4': resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/plugin-babel@0.2.3': - resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} + '@rolldown/plugin-babel@0.2.4': + resolution: {integrity: sha512-ygmm2j/mN+aCvstHo0x3IOu4uc6LqXT9SJ3q4kpfG/+Yhfz0B+E47FITcC0FljZADwUFARP6E2kiE+Lc26D8wg==} engines: {node: '>=22.12.0 || ^24.0.0'} peerDependencies: '@babel/core': ^7.29.0 || ^8.0.0-rc.1 @@ -3151,13 +3328,13 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@sanity-labs/design-tokens@0.0.2-alpha.2': - resolution: {integrity: sha512-rM0+qso6XaE60UaJ7z7v7DWBRlJ57XQUzuL8nTwtub42xGw4jusEhDq7/c4Mrdec98hLykyhe6t5n2mKxf/BVQ==} + '@sanity-labs/design-tokens@0.0.2-alpha.6': + resolution: {integrity: sha512-4JMs6p0uUJjtU7hbHDZxCpx/4xEnbEpuBR/0vccE+BlOZYBZaH3MvV7+llV6+OYH5ANh3pvvMM+CEy5BPdf2KA==} engines: {node: '>=20.19 <22 || >=22.12'} - '@sanity-labs/design-tokens@0.0.2-alpha.4': - resolution: {integrity: sha512-+i7GXix4Akt34VDWgSM1Lpq8Hxf8SH8022uNsDRXSNuAqQMjKVGWLItAyc2TyfWVwWZLhsCF3lj5tdW7cecDxQ==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@sanity-labs/groq-wasm@1.0.1': + resolution: {integrity: sha512-a/uZKRVyl+uM5DbL76295Q99kL4+ZJ3hpq1wiXVH/L8vbOm/znoZuYu9ynxKs9Xau1kcqSkl6/cSFJBbRjfGwg==} + engines: {node: '>=22.3.0'} '@sanity-labs/oclif-plugin-skills-flag@0.2.1': resolution: {integrity: sha512-DCuefzB+ZcI7pc68up/T0TExeS98MAA2Rcy6vEwQLv86XCku3KHm7v2NNNLQ65PYqNVOil6kPIUefi/6pxQf+w==} @@ -3165,13 +3342,11 @@ packages: peerDependencies: '@oclif/core': ^4.0.0 - '@sanity-labs/ui-poc@0.0.1-alpha.25': - resolution: {integrity: sha512-TaH3RSCRmceGCFMIrHBk0erSvmbYZxrlp9gnL5gXn8Yk7StK/M6qI7iB+gBdxmKcfGiwSbw82AbnXYf7KmpzCw==} - engines: {node: '>=20.19 <22 || >=22.12'} - hasBin: true + '@sanity/access-ui@6.20.0': + resolution: {integrity: sha512-sZwzB1ZqUDWRAUfTnW83QI4pFklsQ2F3M1sWdUeTSMUy8VvRPnvEGBH3hh59zVsxFD8cyzeLgu+esl5b7zmNsw==} + engines: {node: '>=22.12'} peerDependencies: - react: ^19.2 - react-dom: ^19.2 + react: ^19.2.2 '@sanity/asset-utils@2.3.0': resolution: {integrity: sha512-dlEmALjQ5iyQG0O8ZVmkkE3wUYCKfRmiyMvuuGN5SF9buAHxmseBOKJ/Iy2DU/8ef70mtUXlzeCRSlTN/nmZsg==} @@ -3190,19 +3365,14 @@ packages: resolution: {integrity: sha512-4cy7RytpkR0wm08EzEx9tL3XwoH7FqnAb9aUNskLmwpWzkFSs34amh19BvUq1TujmEqwCGLJARa+QWpOCoWpjw==} engines: {node: '>=20.19'} + '@sanity/bifur-client@2.0.2': + resolution: {integrity: sha512-TL37rSZLXAcjGCAVuGXXatvFhfwLaGlxKK5ghBdQJ0ZvilmXt2AYSp/ww3/AhWH3/9afayaJ/mFs3d1fl1UWwg==} + engines: {node: '>=22.12'} + '@sanity/blueprints-parser@0.5.0': resolution: {integrity: sha512-wlfpO5gbYLPU5K6i7gaRBuZHGOnyEsuPOe8XMfEklLi1pE0PhRl9WgdLRwwt+M+aGguAuOpISjEcFSf2I5N3lA==} engines: {node: '>=22.12'} - '@sanity/blueprints@0.23.6': - resolution: {integrity: sha512-wZHwl/wOaCqAbZ3O1ZwNpPrLT6Cpemb5hdeGWbUGGD7qp39WAfB+xzHYmmeXo8fhs93hhc7KEHQK2dEPr4xQag==} - engines: {node: '>=22'} - peerDependencies: - vite: '>= 8' - peerDependenciesMeta: - vite: - optional: true - '@sanity/blueprints@0.28.0': resolution: {integrity: sha512-Csg/coSR5TV1tQHpdtVLu4JJUTmdsm37Y7zwCGKjwXD4VTkNlWPhj8wjY6Ti0fxLND8MgbwIxdZAjJ4aPbYbzw==} engines: {node: '>=22'} @@ -3215,42 +3385,45 @@ packages: vite: optional: true - '@sanity/cli-build@5.2.1': - resolution: {integrity: sha512-aJbJUufSxv7cPGQ4WBSn8DPorK9fPm4n1gSAko66DFR9CCLuv0FwdeSYSF7Z2jMK3qNhL56ZKwera9gojRqAdQ==} + '@sanity/cli-build@6.5.0': + resolution: {integrity: sha512-4eshQK7S+kIqLSRwYhHwPl3tt1uk1RIj+fRAB9Rg37K1ThTuyWr8jlk1oqla586Vra6ylumAHYkGXGN+5C0Qkg==} engines: {node: '>=22.12'} peerDependencies: babel-plugin-react-compiler: '*' + oxc-transform-react: '*' + sanity: ^6.17.0 peerDependenciesMeta: babel-plugin-react-compiler: optional: true - - '@sanity/cli-core@2.8.1': - resolution: {integrity: sha512-ZDzGQqmESOmDI4/zc69Wlv21DLIPiQQnvWOxXcekfK0/YG1bKDaWsHwSdNqWaYkepwAc0k3/SDIyh0AsyohMVA==} - engines: {node: '>=22.12'} - peerDependencies: - babel-plugin-react-compiler: '*' - peerDependenciesMeta: - babel-plugin-react-compiler: + oxc-transform-react: + optional: true + sanity: optional: true - '@sanity/cli-core@3.1.0': - resolution: {integrity: sha512-IVG0Yy3hgvbhuE7fO97hm50GwLYFlgvztkbfWie+8MjTd61Zlu/jU6GIADXlc403uu/jetpQxQIxMxe0q1TeVg==} + '@sanity/cli-core@3.11.0': + resolution: {integrity: sha512-+rneegzFoBRx18S5721fiOhCLyoqyKB+zTzhHZpOtWBXkBsN75DGN4parwMRs08fsqZZVQCr4Dpc8b5TneRhVQ==} engines: {node: '>=22.12'} peerDependencies: babel-plugin-react-compiler: '*' + oxc-transform-react: '*' peerDependenciesMeta: babel-plugin-react-compiler: optional: true + oxc-transform-react: + optional: true - '@sanity/cli@7.18.0': - resolution: {integrity: sha512-ANu0be2UjT71PuQaDnHTNQB73VeYiznF5ob3zQ2ivhX2d90vR5fL40HeYGXQnXwH/+D+K8M/0HAJKCaTf6ayzQ==} + '@sanity/cli@8.22.0': + resolution: {integrity: sha512-0pFRrsZknQBVEjOduEdXiR92WLbqxLXvU1KXCpJnl/6JrFo4QYRPbRcLOXRytL3IKz/bM3cmHTinJvjwNwP5zQ==} engines: {node: '>=22.12'} hasBin: true peerDependencies: babel-plugin-react-compiler: '*' + oxc-transform-react: '*' peerDependenciesMeta: babel-plugin-react-compiler: optional: true + oxc-transform-react: + optional: true '@sanity/client@7.26.2': resolution: {integrity: sha512-iEkGiHbrxCnT/A30A6pH+vX4otP3lLp935Vwuv0/YrnETxrKCn6PnsZU+TfTm6ZEZ9kZGs8wKP5yBLmZw5S6OQ==} @@ -3268,12 +3441,10 @@ packages: sanity: ^5 || ^6.0.0-0 styled-components: ^6.1 - '@sanity/codegen@7.0.3': - resolution: {integrity: sha512-t3Svo28RWX7OOvj4DkNX0fSWpzt+94pslKwvkKhSs4Lw24Ta1hYkE1a+OgwUjKBbw2Za54V7NpMwNlXjPEr2Fw==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@sanity/codegen@8.2.0': + resolution: {integrity: sha512-bMJuhbXLwMGZfnwenRBa4umhWoO5VTZQhAiXBcO/rwgnzEtA9mF5fv9SYcqX7mj8O3l35XeeETUdi1qZYVg1GQ==} + engines: {node: '>=22.12'} peerDependencies: - '@oclif/core': ^4.8.0 - '@sanity/cli-core': ^2 oxfmt: '*' peerDependenciesMeta: oxfmt: @@ -3283,13 +3454,9 @@ packages: resolution: {integrity: sha512-MBQ082q7GRvzSH7Xzx4ul1Kxm/AEKDgwTz5cd13oXIlenl3VAM0Un0QpeTjkC5IZTC7SHbnhwkgoVHTZDz9WKQ==} engines: {node: '>=18.0.0'} - '@sanity/comlink@2.0.5': - resolution: {integrity: sha512-6Rbg71hkeoGInk/9hBsCUBCZ33IHSs2fZynAR85ANkXDM+WYiwRDlker7OngBkfbK8TF9+G797VjNMQQgJINiQ==} - engines: {node: '>=18'} - - '@sanity/comlink@3.1.1': - resolution: {integrity: sha512-UyBJG4oWNs+VGVo5Yr5aKir5bgMzF/dnaNYjqxP2+5+iXnvhVOcI6dAtEXDj7kMmn5/ysHNKbLDlW6aVeBm7xg==} - engines: {node: '>=18'} + '@sanity/color@3.0.9': + resolution: {integrity: sha512-cvoxvd7ZPs5/TK30yoX6F82GNmIPVg9sVy06PUTWkVnY4m1NpCiTUj+zCQpf8JQdn7c2J9FHytrmnEHNWXDDZw==} + engines: {node: '>=18.0.0'} '@sanity/comlink@4.0.3': resolution: {integrity: sha512-gCnltbeB8BmXVLSr/6XHAA3tQmhJDMKXufOVRXYxAhIEv+5n9CtnxupjY5IzmdI+7v+G67TZV/8zCQhvaFlVww==} @@ -3307,16 +3474,16 @@ packages: resolution: {integrity: sha512-Ll3BPOn9aPGeBUOFDZpKk0IObL+NI4tNq7VyOKj680xd+iCtfjnbcZZU0vpj94XozVGE0Zf+0FoYWXk2xJgZCg==} engines: {node: '>=18.18'} - '@sanity/diff-patch@5.0.0': - resolution: {integrity: sha512-JASdNaZsxUFBx8GQ1sX2XehYhdhOcurh7KwzQ3cXgOTdjvIQyQcLwmMeYCsU/K26GiI81ODbCEb/C0c92t2Unw==} - engines: {node: '>=18.2'} - '@sanity/diff-patch@6.0.0': resolution: {integrity: sha512-oJ5kZQV6C/DAlcpRLEU7AcVWXrSPuJb3Z1TQ9tm/qZOVWJENwWln45jtepQEYolTIuGx9jUlhYUi3hGIkOt8RA==} engines: {node: '>=18.2'} - '@sanity/diff@6.9.2': - resolution: {integrity: sha512-qIGwPMHVi9WWIaocpjAKa1UgglHFl4cih7JZQgsGSL1RbofTl2vByETq/WOGmQdOCmrEnBH3cMskTtUpBTCyaQ==} + '@sanity/diff-patch@7.0.0': + resolution: {integrity: sha512-e/xGFPWtDN5ZafxtG/DcP4URBk3EPblR+Ett1pT3AmiViNLPkHfwnG/Jj4+DlHkvcKTSw6jebuGVEFkumAxHQg==} + engines: {node: '>=22.12.0'} + + '@sanity/diff@6.20.0': + resolution: {integrity: sha512-b4whe5KdQxSjn0AzsE7IiUTiiTPF5k/0yctVoe7Zmx7IeGQolnm+uYxPMrdlmM/vJbutmBoPNv9MAK6rYHQUhQ==} engines: {node: '>=22.12'} '@sanity/eventsource@5.0.4': @@ -3340,11 +3507,9 @@ packages: '@sanity/generate-help-url@4.0.0': resolution: {integrity: sha512-Ooa4xkLT3TLaX+mw/13fq3IeGdnAkx4rbpVASvRVixzBBvvcL6jPqj50fjlCd+EhgB5GRXBCNNAy/hWXwjZEUA==} - '@sanity/icons@3.7.4': - resolution: {integrity: sha512-O9MnckiDsphFwlRS8Q3kj3n+JYUZ0UzKRujnSikMZOKI0dayucRe4U2XvxikRhJnFhcEJXW2RkWJoBaCoup9Sw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^18.3 || ^19.0.0-0 + '@sanity/groq-condition-describe@0.5.2': + resolution: {integrity: sha512-HbP+UytB9gbScX5JuCM5mJNIZ093p3eeuDojqbf5KIunBaAqi0AuamsU5bjfNa/roE92xAJ9HDLbS5Vc93aPWA==} + engines: {node: '>=20'} '@sanity/icons@5.2.1': resolution: {integrity: sha512-P5gY1HRungh4RgCcypdIpu/SKoTwRBTttpbHntZjdW1MO3MK6xEOs+pbAzSARyhh22OcN9PkBBEYk2FL34BvfQ==} @@ -3352,19 +3517,25 @@ packages: peerDependencies: react: ^18 || ^19 - '@sanity/id-utils@1.0.0': - resolution: {integrity: sha512-2sb7tbdMDuUuVyocJPKG0gZBiOML/ovCe+mJiLrv1j69ODOfa2LfUjDVR+dRw/A/+XuxoJSSP8ebG7NiwTOgIA==} + '@sanity/icons@5.2.3': + resolution: {integrity: sha512-10nE7IiuXIPIf6ufSKyNwnOE75wghEollUYzkjPUAX+5oenyE5qDFUrMD5MeC+8gxZ8KS61o8sH1mpmhpWx++w==} + engines: {node: '>=20.19 <22 || >=22.12'} + peerDependencies: + react: ^18 || ^19 + + '@sanity/id-utils@1.1.0': + resolution: {integrity: sha512-A+DujVHCO3/+0DuzinmfCRQacIWVIherK0AHqFDoDOSgxx+Bur1kLhzX8fn7PdB2uZilxu2zWOr+UaGcj5zGbA==} engines: {node: '>=18'} '@sanity/image-url@2.1.1': resolution: {integrity: sha512-qVXsF1teWR6FO3ZFAz46HDcRU+E6EQkpyncPnkGOzeJ1PgnaOiWMVbiSrZtX10s3txzzu/tAjKwbxbGHfDWgGw==} engines: {node: '>=20.19.0'} - '@sanity/import@6.0.3': - resolution: {integrity: sha512-jbnR3z93+hrddl0xPDuQotJYnVNtQPl969LZXo6opMZuy/uG64jwodp76pnJmq8Y9aHqR2fLk/ne7R4iBv8PhA==} - engines: {node: '>=20.19.1 <22 || >=22.12'} + '@sanity/import@7.0.4': + resolution: {integrity: sha512-HE9ES1kezNFgc8eN6bxNvT0r/BFGvIa8mKKHaDCz2IhD095LhdxhvmdqL3Lb3MXG0L/vi686OMABA4Dw2AG5JA==} + engines: {node: '>=22.12.0'} peerDependencies: - '@sanity/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + '@sanity/client': ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 '@sanity/json-match@1.0.5': resolution: {integrity: sha512-skhIX8gT/hLritEBkjfc7+TBlJNu/NLisyA8noKceCk28OatFK0wX7dIuFawkt3pfhTYVomVPykAYFcIm2OqJg==} @@ -3373,8 +3544,8 @@ packages: '@sanity/lezer-groq@1.0.4': resolution: {integrity: sha512-KgCmAY7yXll+g3+1z+GZiQhlEW7ulJGUH8gGzbUgKVZShPop/dDjfwNAdGZKFY3AkF+m62oSa1X8m1P3sonD4A==} - '@sanity/logos@2.2.5': - resolution: {integrity: sha512-P8dr9ai65KTimeqj2j58zjGwDErIg0UjsQdl8FfhDvweUY5i7vazztgotjVXtUfkj4kL18O6I04Kq4RvOVB15g==} + '@sanity/logos@2.2.6': + resolution: {integrity: sha512-wTkEcfne18DAYvbGclESNjraUCmbFL1fHMHzpIKH7AgdARvJqMHPEg6QoFsgeKP6tmDmME772uoAIsnwCOTWzg==} engines: {node: '>=14.0.0'} peerDependencies: react: ^18.3 || ^19.0.0-0 @@ -3382,42 +3553,30 @@ packages: '@sanity/media-library-types@1.6.0': resolution: {integrity: sha512-1Nqw8GSUr7E8AFue9luyTOM4Ev0ZlJ35SHcQrHZ6T68G5llfXw99e3GkLXzk6qYFk9r9fJaBTSpW5IyO2mObZQ==} - '@sanity/message-protocol@0.12.0': - resolution: {integrity: sha512-RMRWQG5yVkCZnnBHW3qxVbZGUOeXPBzFPdD9+pynQCTVZI7zYBEzjnY8lcSYjty+0unDHqeoqMPfBXhqs0rg2g==} - engines: {node: '>=20.0.0'} - - '@sanity/message-protocol@0.23.0': - resolution: {integrity: sha512-UfQDuWRzbK4dRTfLURGCZo7ZlR0sK+2lwT2QMAfqsM5kMq5GR31lbX4LMcSw27h7rwUv8ZSf1hBEbluVpgRmlg==} - engines: {node: '>=20.0.0'} + '@sanity/media-library-types@1.8.0': + resolution: {integrity: sha512-oO9rpW8vl1+Yc5o0OzuJqUuxoD34cVYdOeUVRuGdhxD3RXs5zcrj8WanzvWFwN9B1UpFQBBKDpF6E6jCFfPZrQ==} + peerDependencies: + '@sanity/types': ^4.0.0 || ^5.0.0 || ^6.0.0 '@sanity/message-protocol@0.24.0': resolution: {integrity: sha512-F/MwFVc3fN8uVvCIGuTxHN5EVo148wLhjL7h/u6wbShWJGMKgcGx0n6MwfCPyi6ftpdvRXsPZVDgZ1GMeeBf2Q==} engines: {node: '>=20.0.0'} - '@sanity/migrate@8.0.2': - resolution: {integrity: sha512-XeDbtq/YmpXwLd01wJU/mrNqXxPEKRZiPugt/ukXJoDdetjgBNmcIPkic6RnXpzHyLNf/Pi6+d5ktlrUvMYI2Q==} + '@sanity/migrate@8.0.5': + resolution: {integrity: sha512-kOksEqR6kfSOqr46Bzdj59Qo3heN6Okjy9cXx2LJXDxsOVFGX5817zi1S1M8KMKscCfLqS/yMFZoWDg9RL3Vqw==} engines: {node: '>=22.12'} - '@sanity/mutate@0.12.6': - resolution: {integrity: sha512-Ai9Dy0C79yUALnuLe0ealwqgz11T+ngpWCzTyZv01xdjB6coQo+KoM8E0FeRTK5Zr/IAgKphYuYLU5DFCB9cGw==} - engines: {node: '>=18'} - - '@sanity/mutate@0.16.1': - resolution: {integrity: sha512-400OooNtiafgJEOCzj0E5atuWlaKp1z6LU/LB/xZUVVywNj3WuT52U6qeVOfGlZeWKhYMCdGFX2ZnMbIrME95w==} - engines: {node: '>=18'} + '@sanity/mutate@0.18.2': + resolution: {integrity: sha512-1z199kB46I1F+3z7Z0bwKepUf81BAZ766jhpozVfC8nHaN/ceqQby7lh95KbrwqnlpxbIRu7dWpzXMBdTvm1xA==} peerDependencies: xstate: ^5.19.0 peerDependenciesMeta: xstate: optional: true - '@sanity/mutate@0.18.1': - resolution: {integrity: sha512-28iICKl33s9yr8XtgpoCHOb+l5kKVbd6CpFYi4Vx0fHNZcFiKDGdY+RzZrC34GWqb6M16wkxwtHSVbEmXbfTpw==} - peerDependencies: - xstate: ^5.19.0 - peerDependenciesMeta: - xstate: - optional: true + '@sanity/mutator@6.20.0': + resolution: {integrity: sha512-nKkWJNLqTtIHWDEveOzgwWoUOUBVM2ou727dF302JvQeNfipW3Z0Ag8I0YMaqOak0BWhJtnDiE5sy/E6xrJEDw==} + engines: {node: '>=22.12'} '@sanity/mutator@6.9.2': resolution: {integrity: sha512-ofpSj4EROW54yeo6FkkVaTEyUZQRNqSBEpycACRu9ZqusdtBSt90gklKHsG4N2vw11iUgvxDkW18HlJdiW4kaQ==} @@ -3426,11 +3585,11 @@ packages: resolution: {integrity: sha512-XRsLYFNq6DhMm+Ddt+lWzV4nuARmteYAYHrrbKFzpOpt9hCBsLjWbvTELxohEzhIFNoxbVBaRcY6GDB1/ANRFw==} engines: {node: '>=20.19 <22 || >=22.12'} - '@sanity/preview-url-secret@4.1.4': - resolution: {integrity: sha512-FZvWDDUd9ezeKHXnNeDitjJUUrOft+SKGLstNPYo5jtsxaTyFQCmXOlD0HVGNON+FnlJ3BKaw7UyncPJPJ8hhQ==} + '@sanity/preview-url-secret@4.1.5': + resolution: {integrity: sha512-XDmLWn734GI0ssfegDjp24LwSKkPqwPkzwg9klApVfUFFWqfWt9o/WTN2+Vc940TV6fzD7hmVcWCwccMrPXGvQ==} engines: {node: '>=20.19 <22 || >=22.12'} peerDependencies: - '@sanity/client': ^7.26.2 + '@sanity/client': ^7.26.2 || ^8.0.0 '@sanity/prism-groq@1.1.2': resolution: {integrity: sha512-McMw9U5kuYAgIwyNodhFKdarM0cPme6UYBR6ms6YBNEO8Qqu5zGHydUeORaJ/w4qdFKGB1oWjBjy525ed6LXaQ==} @@ -3440,27 +3599,30 @@ packages: prismjs: optional: true - '@sanity/runtime-cli@17.7.1': - resolution: {integrity: sha512-n70HEMVBblvjrHaA8PJanrrvQ1FKpcfElpHwxMWwJI8LPfQyK9wYFNyoQFXNx2HD0IM8uI/hQjEcqxz4exgEdw==} + '@sanity/runtime-cli@17.16.0': + resolution: {integrity: sha512-LAFY7+ezTCLQ89KDKyZgFU4cVhGr8EYKARWm1B4/pm8ssFKRgHLD0mx/hpLP6B6yih2j/pHJAFGwJiSoBqRcYg==} engines: {node: '>=22.12'} hasBin: true + '@sanity/schema-descriptor-utils@1.3.3': + resolution: {integrity: sha512-Qb5ZTHStp2jXeK+KlrbOnoD4LakdTS/JSvHwl91wnQmQVkIp/K965C5qgZsrnBKmNf5BHZ8KijPiApJWBe/KCQ==} + engines: {node: '>=22'} + + '@sanity/schema@6.20.0': + resolution: {integrity: sha512-yDaxYCOUbSpFpEAB/0fF2DhFkI5cszifZZyxAWijevjwewxQx1iqhYusO6YJ9l9C+6nt/jMd8xs9jbJa5cNUsA==} + engines: {node: '>=22.12'} + '@sanity/schema@6.9.2': resolution: {integrity: sha512-k01v24uhByfKbOqgzlPlXVZ8yeW5qdzL3LtUUGgoikC1DEWBETY56Tc8u0R6eFmYPM8+I63L78TjbvtXYu2INQ==} - '@sanity/sdk-react@1.0.0': - resolution: {integrity: sha512-gZ4p5gh+2TaR22HZbrvXvPlR90onRyIVP84FRIgXcd2SDyPmqOfoCuZ/rpgYNhtU88ZwLPDWAh1+rMYJXxUNqg==} - engines: {node: '>=20.0.0'} + '@sanity/sdk-react@3.9.1': + resolution: {integrity: sha512-RLcDKy1ohfFWU5cYZKR6DzbafDVrXHU6hwZGg+s5MNZd0ow+i2KCv0+5qt6Poi2NGGUh+b0IYR1+CPiyC24m+g==} peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@sanity/sdk@1.0.0': - resolution: {integrity: sha512-9IsaEboT+KIWnWASMZIBEarZP8E0NE+XSqQOUZ+0PZ3G5TRhgcLaq8D9hM5MRvNdVjxAY/QEFeGyduEs2hMSpw==} - engines: {node: '>=20.0.0'} + react: ^19.2.0 + react-dom: ^19.2.0 - '@sanity/sdk@2.12.0': - resolution: {integrity: sha512-WrQKzwuvpMA0Z/LKzrkpwisx+kdm+USNPiFJej54TWS7rTQPvf1JJhxr02rODcGKDbDgwCHGiOmV5GGr8cPAig==} + '@sanity/sdk@3.9.1': + resolution: {integrity: sha512-K5XWJAfFcFI/uOaXjOMzRLXwNtn2RloMnHtF+BhOFCu4d01cBpkna2hJNOy6zEFfetJNQYwpwkrNrve9zBrHbQ==} '@sanity/signed-urls@2.0.2': resolution: {integrity: sha512-w/Aq0JDYI44WC5w8mzJBAjCem8qlGrxGTzvNbUWwBfys6kSL+TZBSypV5waCc35XRgt0X5zdYZMJOrshcjJLFw==} @@ -3474,57 +3636,60 @@ packages: react: optional: true - '@sanity/template-validator@3.1.0': - resolution: {integrity: sha512-pIy9yXosuA2duaJH0J1V8RYrabGB/Jh77FGYozr2pGwmCFwnLw/W/FS99qbcsJZa3wXHSMhMRyYq7IbulbijZw==} + '@sanity/template-validator@3.1.1': + resolution: {integrity: sha512-FgaiEa3upiwizx1YHEHOiyoahpKmvzeWl4+UFZUs14KCs2ILVX/SCGoPp+hrKIZtOoJwFwOe7bdyxHr3UTs+vg==} engines: {node: '>=18.0.0'} hasBin: true - '@sanity/types@3.99.0': - resolution: {integrity: sha512-a766U9VSoyOSWq+RZz9wsEo/Nnn+inDkEcdGu+rHFuygdepullB/RZpF2MxNsfUMCSPnajgG1Tm9lhwbSmlySA==} - peerDependencies: - '@types/react': 18 || 19 - '@sanity/types@5.28.0': resolution: {integrity: sha512-kfLwYx/8q1l76Hqt2dMS/apoXskj6NB2LKnGIa+nDh0JfHArWror1j9Zwqpm/aF1ywS7R0I5xXBsiygCLeGszg==} peerDependencies: '@types/react': ^19.2 + '@sanity/types@6.20.0': + resolution: {integrity: sha512-UycI+DYdHS4jnQ1mI/eouzsZ4Swk3EWw51EDxCY9TE3lljjaP2g4OPBUqFTVmK3jIum1nXXprnKDarcc6oVIrg==} + engines: {node: '>=22.12'} + peerDependencies: + '@types/react': '*' + '@sanity/types@6.9.2': resolution: {integrity: sha512-AKITu+phxMU4iSOr1Kv6F3cTaKzOe8QEjXrMOSo+9sec4fz8AkxnDjZlGGuYTD6uyYPwICnjr98CYfxc4Z0OfA==} peerDependencies: '@types/react': '*' - '@sanity/ui@3.5.5': - resolution: {integrity: sha512-5ehxYAXf8FlUKvTlMuEDMbz4keb8UhEnCyRnlp0lIcPF1EYODe6NdHjtgQqzQRKqS34OAVi2y+WAP/lLrx2+lg==} - engines: {node: '>=20.19 <22 || >=22.12'} + '@sanity/ui@4.4.10': + resolution: {integrity: sha512-Dig1n0Aba6MM4pCPH357qEkb3elFQ/YzZ1JBDySIiqmf4+S7AbI0ar5cd0KHr39v8YQV2RAAjh2F6n07SmdKwQ==} + engines: {node: '>=22.12'} peerDependencies: - react: ^18 || >=19.0.0-0 - react-dom: ^18 || >=19.0.0-0 - styled-components: ^5.2 || ^6 + react: ^19.2 + react-dom: ^19.2 + styled-components: ^6.1 || ^7.0.0-0 - '@sanity/ui@4.0.3': - resolution: {integrity: sha512-IXZ01joAs1YDKhzcvW5+F+3hL5BsDLH3HB7WqpBqfTitQ0jmvyXr8quHQnsP8br3JyxEREmTEAIJhS8ABEXPXw==} - engines: {node: '>=22.12'} + '@sanity/ui@5.0.0-alpha.14': + resolution: {integrity: sha512-h+IdfVMoDpnwYxk1Z+RFal7yRKgukWHY3QQtf2P9dKTIFCSzKr4CIGyKuBfFFTe58cUBRMfHllRU2b/hlhHF6A==} + engines: {node: '>=20.19 <22 || >=22.12'} + hasBin: true peerDependencies: react: ^19.2 react-dom: ^19.2 - styled-components: ^6.1 - '@sanity/util@6.9.2': - resolution: {integrity: sha512-m8dL5OXIsosIc/gux892FAUfyUuL5KtMxyrKTuRGKO+nEkY7Q0E/8pyR0+Lcgcri9ysUoBLMrY+gSu2pS1EHIQ==} + '@sanity/util@6.20.0': + resolution: {integrity: sha512-qYfh0gR1F7pVXzrF4xseS6eGeAl2DeELgW4rva9vsxpEXBUnBPFagqb5TZYdKWOvKiyGGbk45NLMR0w2mB/7xA==} engines: {node: '>=22.12'} - '@sanity/uuid@3.0.2': - resolution: {integrity: sha512-vzdhqOrX7JGbMyK40KuIwwyXHm7GMLOGuYgn3xlC09e4ZVNofUO5mgezQqnRv0JAMthIRhofqs9f6ufUjMKOvw==} - '@sanity/uuid@3.0.3': resolution: {integrity: sha512-aJvKuFwzcZKRwuIjrRPfXfXKpSdnLF4CnedV5WcX1n5SzhufvRNHIot5lkx1+Y1DwiMVQOZ5gDSPJH+P6Ao70A==} - '@sanity/vision@6.9.2': - resolution: {integrity: sha512-FRZgUXPmiEAVu1t8dAVgplVeOE69DsaQGDG1MnhSW8K9VSERUS91bEIv2acycSzBuEur2JzM/nc0h/OZDFr/QA==} + '@sanity/validation@6.20.0': + resolution: {integrity: sha512-rEbjOtpMi/orXjGfi3ZnmR28hmWUud6/lpnlhDYg3U24WyLud8P0Kd24+vmGpAfGoDFLFxcA5TGjnjPAJMcEvA==} + engines: {node: '>=22.12'} + + '@sanity/vision@6.20.0': + resolution: {integrity: sha512-uTevz+hZFuviitQPJbKOtWVPdLdk3q3nmAWfcCRfAXc4yC+zdTnpyWOK5rHDyVtlsVHBLpqHPyvjbYJo4Rx3lA==} + engines: {node: '>=22.12'} peerDependencies: react: ^19.2.2 - sanity: ^6.0.0-0 + sanity: ^6.20.0 '@sanity/visual-editing-standalone@2.0.1': resolution: {integrity: sha512-Fvw2mUPx9cWmuVqzJAuzEOZ9jRcZhSB5NpX8qF2Hb3dS1P/dpVfCCo4GDYxTDS8Y5l4QxYvX4mniwCXj4CZMEw==} @@ -3540,61 +3705,77 @@ packages: '@sanity/types': optional: true - '@sanity/workbench-cli@1.10.0': - resolution: {integrity: sha512-h9+AUoL0wKOSAhPMNmH1rFqZawNdkDogPg5W1avOfAwwm6DtqAFi63OCd2DtCqSStuq3OH9jOB9k6sgq7hnPjA==} - engines: {node: '>=22.12'} - - '@sanity/workbench-cli@2.0.1': - resolution: {integrity: sha512-+mjSeXu7GhWWuG9xhOu3Vuv+Zxvy3d6tTUvVl6qdUr9r8IneIzDsp6WRUVwuqZSSwyG+V2Cy98TaEEcp7tppOQ==} + '@sanity/workbench-cli@2.12.0': + resolution: {integrity: sha512-Ob0kF6ZBy9I6JBgeKRE6bUQktu3WKYxTUHcL4s9OVaAeQ2kr3jIoKo0sHvXDPy3NJo19fKbQNvcb7CtbyfUD8w==} engines: {node: '>=22.12'} - '@sanity/workbench@0.1.0-alpha.36': - resolution: {integrity: sha512-1gkMw1LezDFTu7I+F+R4RtruTkjdoy6B9LM56cNSMo48S1fAmFSWY5JIAv7aA/WipzXwiMVnctAmIAo7lF9rMQ==} - engines: {node: '>=20.19.1 <22 || >=22.12'} - peerDependencies: - '@sanity/sdk': ^2.9.0 - xstate: ^5.31.0 - '@sanity/worker-channels@2.0.0': resolution: {integrity: sha512-mC+8yPQuw2rHXdHigFPU9thNa6vTaPmh7jFR6RvloE8s+6dmnk9bHdPXRbrrUqafxzK3L9aH2E170ubXyxcAIA==} engines: {node: '>=20.19.1 <22 || >=22.12'} + '@sanity/workflow-blueprint@0.36.0': + resolution: {integrity: sha512-9+uhiY7Ldj/XiIu1OaAFjcYQZj/m9QMHh1fu9xmJXx6AbklsOCpXfoqowepmDbnUrImMEicsvb1vahlR+Wl9pA==} + engines: {node: '>=20'} + peerDependencies: + '@sanity/workflow-engine': 0.36.0 + typescript: ^6.0.3 || ^7.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@sanity/workflow-cli@0.36.0': + resolution: {integrity: sha512-xbhMiEA2hw99gRtPI+2KihERL4ZPL0BM0YuVxsn9KoIsH5vhtt5Tk8+IQOeoeE6NDNibyh4jomkYMxyDMblTnQ==} + engines: {node: '>=20.12'} + hasBin: true + peerDependencies: + '@sanity/cli-core': ^3.6.0 + '@sanity/workflow-blueprint': 0.36.0 + '@sanity/workflow-engine': 0.36.0 + + '@sanity/workflow-engine@0.36.0': + resolution: {integrity: sha512-ONK3O+X5XEC6EyG+OUnhgrdYzOsVi0VbuB6AnY1D6uc+mV/IKcCZRiZHlJoQzyXI8/EU02mHtc/CRmWBQWbPCg==} + engines: {node: '>=20'} + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sentry/browser-utils@10.70.0': - resolution: {integrity: sha512-IvjhafF5NFXrPCg5EHbAPGDwIhHxgUcLlHTklZ3DAdA6ky88BJYMfevbcnOEmgavf4nylhCaquRUFNB5+szj+A==} - engines: {node: '>=18'} + '@sentry/browser-utils@11.8.0': + resolution: {integrity: sha512-tTqJmnfuJaQy9LyInCWJtJ0L+VnOq+L9+lTMkQH+pptXBAuHfdJyEl2IhGqO4QmsfKyZpHa2GVd3HKpEQsVYeg==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} - '@sentry/browser@10.70.0': - resolution: {integrity: sha512-IK6+J+8H06tZe+A8L37TT5ZxxwNtyQatW8zl5RYYJ/e9CsjrM8fPi8I1OT7uquTw8UtjqFHt7bEef/Vy63ksPg==} - engines: {node: '>=18'} + '@sentry/browser@11.8.0': + resolution: {integrity: sha512-uBC1k2ESZErHv+RfG6p9siHrtxv+QErDxL/jvEBZnoMV6OcWdZyWTGKcqrW7EjwlBiWkgVve1W7z8tNDDuVQxw==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} - '@sentry/conventions@0.16.0': - resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} + '@sentry/conventions@0.27.0': + resolution: {integrity: sha512-Mrqd/o7n/z7qWSYfQQA7x4fFTA0IqOG6JNsbBpnC97khPwZk7n6DPtOO7YgaYplSl8R8QLRbBz9Xv2lVhToSAg==} engines: {node: '>=14'} - '@sentry/core@10.70.0': - resolution: {integrity: sha512-ozhCTDqg89oB4XmWfAwuHshABpvT7AkRpaPnogopPfMAaI61G1t8EKCJ4W7aum8JSBonlfyjPCyW5oYZFm0KvA==} - engines: {node: '>=18'} + '@sentry/core@11.8.0': + resolution: {integrity: sha512-4MVTthk6C/1oQFjbVIfygHyNkx2YGbwNLml0kJji0vjJXy6ZNls9zdIp0FTBTi4e3189IcSc5OXD4qcJdmEeKA==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} - '@sentry/feedback@10.70.0': - resolution: {integrity: sha512-6VQn2ETJjHkk4QQDdx/587/JDfXsk3yBTLZ3UZOMtBVrkmwgk+1FJZ8ULJ3ud1xZcuh2icunIkc7tGVv2axdnw==} - engines: {node: '>=18'} + '@sentry/feedback@11.8.0': + resolution: {integrity: sha512-t8MSpbPoOcPOkywcv0Hwh97A82jWFZju5NU/a6pHmn2pKFktgCgnHKNHvlYp8QUaDNYijYpLv58NIM5Dg7by7A==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} - '@sentry/react@10.70.0': - resolution: {integrity: sha512-j1d/4hvoaUVKs5GRrfmwUCkiEmkfaeHsk+xgausZlzg5YvmwpF+gyevBLNP26GFEH7nyHXW4l8dbbo0eNieJmw==} - engines: {node: '>=18'} + '@sentry/react@11.8.0': + resolution: {integrity: sha512-8+RCBT4kZ954QpkKvHsQpBkFI3Tg0KShZLFRV4WVzocaRJL+iQA9Y2FV1bxQ12meC9BawaTbI8eX/uUIFDjwMA==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: - react: ^16.14.0 || 17.x || 18.x || 19.x + react: 17.x || 18.x || 19.x + react-router: 6.x || 7.x || 8.x + peerDependenciesMeta: + react-router: + optional: true - '@sentry/replay-canvas@10.70.0': - resolution: {integrity: sha512-irzpw22bK5CF3jbecDa0gBUcfjv7tgeUoLAvtIfeHOP5ajmf3o4Cp99a9RQqkfgvkcMeRZBUwE91SQhp6Ank+w==} - engines: {node: '>=18'} + '@sentry/replay-canvas@11.8.0': + resolution: {integrity: sha512-/MiivHLdDv3ot5uJmWcPhIOubec54hPd4U/c2OE5oNyhM3zrd/S6b2FEfwke/V120QGEdZcuzGatwNJ2jNSkgQ==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} - '@sentry/replay@10.70.0': - resolution: {integrity: sha512-xMnSGzJn9Xd29rYd32lkx/gFW+5mtgqADJ2FiZvis0MBGZuDlNRwPn0/Cs1xA3JNXKV3NGfhdmmvs90w4dHSmw==} - engines: {node: '>=18'} + '@sentry/replay@11.8.0': + resolution: {integrity: sha512-0jXMLd9XCBEZ5tu0VJa1uj1HYCpsjuNjbEBhF5pUw4FHyIH5hz01WuI20SH2Ct0pP1mykTzJLPGjZ8sUiAmMnQ==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@shikijs/core@4.4.3': resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==} @@ -3754,25 +3935,14 @@ packages: 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 - '@tanstack/react-table@8.21.3': - resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - '@tanstack/react-virtual@3.14.9': - resolution: {integrity: sha512-qZyr0FZDP8rDC4WBhsryIZmAd9bveJvFGUJJtskWaew6/0dTRS6wZxnR6VQ5bY2KwL3LjerrHqQLk3a0GKcPXQ==} + '@tanstack/react-virtual@3.14.21': + resolution: {integrity: sha512-wWE/ZJDNNDp18JHWy7n5PQooqerHePVkEEu6Op0twKQ2InF9DPhYMQptQY0syDEviMd3/r8D0OUvKJibDGm9HQ==} 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 - '@tanstack/table-core@8.21.3': - resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} - engines: {node: '>=12'} - - '@tanstack/virtual-core@3.17.7': - resolution: {integrity: sha512-bp+v10y65sp2H7WpWfIMyxTNfl8ZVfxFTLRjPIFRryi6FV/J33z4IS53WO4pTk36KlvJ4iLiQz+oaydDC1xbcA==} + '@tanstack/virtual-core@3.19.6': + resolution: {integrity: sha512-CsTW892z23gy7IyxYTTorVu1uZWB+0N349rSMgKz4rFLPpLza7F7TpcCKeI5iUAwYQCt8QUlOU67J+KXCxtpGw==} '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -3813,24 +3983,9 @@ packages: '@types/hast@3.0.5': resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/lodash-es@4.17.12': - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - - '@types/lodash@4.17.26': - resolution: {integrity: sha512-48NWfiY6oNcKOh47Z4h+sIvwcQR91h6KPhaYKgeMIrkT2jV82Gy90SErj60vW8jQbeMSOSbhIv3bZ7JoqPPVhA==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -3877,8 +4032,9 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + '@typescript/typescript6@6.0.2': + resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} + hasBin: true '@uiw/codemirror-extensions-basic-setup@4.25.11': resolution: {integrity: sha512-otyFa+n9IOYtEjaKOxPedHkj15fTPUF21wdR9pv0GpZPfuGl27cvmcv6+tognbRu9VvEcsHKE+ESoszeo3KfTw==} @@ -3891,6 +4047,17 @@ packages: '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' + '@uiw/codemirror-extensions-basic-setup@4.25.12': + resolution: {integrity: sha512-wR5lz7jbVcBGyiiLEObAmDikcc39KNqrrd4bdUhav85WZu48ttgnSf1YV+grHuMsj5l/WCw6u+r9ZuSfURJgiA==} + peerDependencies: + '@codemirror/autocomplete': '>=6.0.0' + '@codemirror/commands': '>=6.0.0' + '@codemirror/language': '>=6.0.0' + '@codemirror/lint': '>=6.0.0' + '@codemirror/search': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + '@uiw/codemirror-themes@4.25.11': resolution: {integrity: sha512-SBNCOgRsCtewGNocRbmjbCkltGXlFcPJsvhxQ351VynQjnWUiPbUrFcEU/haQ3HanROdAAjWXZJPk5bMBxl2jw==} peerDependencies: @@ -3909,6 +4076,17 @@ packages: react: '>=17.0.0' react-dom: '>=17.0.0' + '@uiw/react-codemirror@4.25.12': + resolution: {integrity: sha512-RE0Gj/QesD7/JWPnJREG8Kq8brGv2NAH17iUECcBrLkqXzzEAgsj/4Qqvz/OlK8XWKmzlsenLRkObT9H+gYQ0w==} + peerDependencies: + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -3938,18 +4116,21 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@vitejs/plugin-react@6.0.5': - resolution: {integrity: sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==} + '@vitejs/plugin-react@6.1.2': + resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 babel-plugin-react-compiler: ^1.0.0 + oxc-transform-react: ^0.152.0 vite: ^8.0.0 peerDependenciesMeta: '@rolldown/plugin-babel': optional: true babel-plugin-react-compiler: optional: true + oxc-transform-react: + optional: true '@volar/kit@2.4.28': resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} @@ -3998,8 +4179,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - adm-zip@0.6.0: - resolution: {integrity: sha512-XleryMhbuksdKtofnWZ9Sk+4CUTbms4Mb/EU32SZwToAyZ5RgVos/ki8n+yr0LWHOGKuakbXTuuYNHLQjhddgg==} + adm-zip@0.6.1: + resolution: {integrity: sha512-Xwrja8nx9e5o2N1my4DsKCeKpdrnACyr1wtbPxBDgGzKzKyE9kRtBFA8mWldI+RVlD7CBZNWY/wQ2+ydwOR6kQ==} engines: {node: '>=14.0'} agent-base@7.1.4: @@ -4132,6 +4313,14 @@ packages: react-native-b4a: optional: true + b4a@1.9.0: + resolution: {integrity: sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -4178,6 +4367,15 @@ packages: bare-buffer: optional: true + bare-fs@4.8.4: + resolution: {integrity: sha512-MPC2eyrpbk3A873sK4y6rk+Iv4o2enxTjHZ8zH3HO0mjrpm5XjnguY2XmfidIsDV6vnjpbMBKUAJpV0ISD2SsQ==} + engines: {bare: '>=1.28.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-os@3.8.0: resolution: {integrity: sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==} engines: {bare: '>=1.14.0'} @@ -4208,9 +4406,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - before-after-hook@4.0.0: - resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} - better-auth@1.7.7: resolution: {integrity: sha512-Zhgxi/c5ylmfB/sX+nwnBbsFf/j6k0L8DvL6CJXZSrXgxc5pPMC/e7j812zNd4L4B4ELmdURCPw3X8nAOUdcjw==} peerDependencies: @@ -4318,10 +4513,6 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - cac@7.0.0: - resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} - engines: {node: '>=20.19.0'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -4445,6 +4636,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cobe@2.0.1: + resolution: {integrity: sha512-aaa6vcIlaC8C1SF50LDH0Anybo/EAXnrxqe+bwvr4+YUtZydqjeBjTTD7ziCCkbRrRGSns3I3F6cZsf3W+L+ag==} + codemirror@6.0.2: resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} @@ -4672,10 +4866,17 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dialog-closedby-polyfill@1.3.0: + resolution: {integrity: sha512-II3pxe/zr5OLhbqrkjQgXDFp61ICPlGZspNIgERwUUCLLHgQzPjv3VTStGD4W+ujwR5zMCZAdcWgu5nTmOIUYQ==} + diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4700,13 +4901,12 @@ packages: dompurify@3.3.3: resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} + dompurify@3.4.17: + resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==} + domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv@17.4.2: - resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} - engines: {node: '>=12'} - dset@3.1.4: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} @@ -4787,9 +4987,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-toolkit@1.51.0: - resolution: {integrity: sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==} - esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} @@ -4837,18 +5034,10 @@ packages: events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} - eventsource-parser@3.1.1: resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} engines: {node: '>=18.0.0'} - eventsource-parser@4.0.0: - resolution: {integrity: sha512-aIpvYxbqTx4KYWw73KpCt1Rh22tEAJ144F1qR76CT3Ex+LNMEPKf5HFrK5Yz9fMP1EVT0GrfA35VZvWQhMPuSQ==} - engines: {node: '>=22.12'} - eventsource-parser@4.1.1: resolution: {integrity: sha512-zaWNqeSLeyzEAAt2Q6aDBRDRk/VnPmsKqvToyGvv6aahvLv71A4Jw7jG93Hckf11zXurbqgsffvpSgKPoeU1Qw==} engines: {node: '>=22.12'} @@ -4857,21 +5046,13 @@ packages: resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} engines: {node: '>=12.0.0'} - eventsource@4.1.0: - resolution: {integrity: sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==} - engines: {node: '>=20.0.0'} - - eventsource@5.1.0: - resolution: {integrity: sha512-+errgX9LYbcpibagHh7CEjEZJvQbIDZB2yY7SbUAhHGv4Ircri3T9LH33TUtcXHDy/pFYel1xCi4VOcBnr3wmw==} - engines: {node: '>=22.12.0'} - eventsource@5.1.2: resolution: {integrity: sha512-VJnwqqp+fOT3WDkjnUy49Zuyh48+kH0JdJApZkslrRQyx35zIZJeJYJl0+a+LrTzh5TFv6MdmXnBDv71UXFyWQ==} engines: {node: '>=22.12.0'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} + execa@10.2.0: + resolution: {integrity: sha512-j1pFOVxaybMVCTNHSBuISL2KQcDS3KIE1wBmUp4n2X+1FgaQI2ZDJVy9TYxDyMCzYojRIMh9O8X/UoWZtxTJdw==} + engines: {node: '>=22'} exif-component@1.0.1: resolution: {integrity: sha512-FXnmK9yJYTa3V3G7DE9BRjUJ0pwXMICAxfbsAuKPTuSlFzMZhQbcvvwx0I8ofNJHxz3tfjze+whxcGpfklAWOQ==} @@ -4879,9 +5060,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fast-content-type-parse@3.0.0: - resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4980,19 +5158,8 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - framer-motion@13.1.0: - resolution: {integrity: sha512-QSZrF0Id3QGuHJ+OL+9PSY9pk86C8ERFalwAGSchzTm65+ZoGH/RM26lmEARLljcHj2lqhv0jZOOks+EI3COOw==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - framer-motion@13.5.1: - resolution: {integrity: sha512-HeWOaeHD3kyTSIEMT6+nw7fBn4saIfxxabZyAITbycAl4xr1kzGJKIvGt/OWghSlvIA9qTnZ1zTGelHAe6S8DA==} + framer-motion@14.5.0: + resolution: {integrity: sha512-pXIj1m9JX//3XExUgQIpS0f5iWcjenO14ekdg9S++Rr0VzfnAaveoNzonigRarD/+AM3umTGS3K/RANGQJitCQ==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -5026,25 +5193,12 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-it@8.7.2: - resolution: {integrity: sha512-slSwC/BBAnoz9OnHopU+V5pJKAieddoF6dmx2CvbWMRePgup8ftiB+D7d+pr2PZzcqNtZOVDMoLOsXGsERhTEg==} - engines: {node: '>=14.0.0'} - get-it@8.8.3: resolution: {integrity: sha512-IfkbWqOGO2kd2Ccgiz/NIzk3bcwjtVqBm3RNa3j/veHg2q7c1DgS3EXrCrvIWH0jbNTbhkdblnxBP7Dm8CiH+A==} engines: {node: '>=14.0.0'} - get-it@9.5.0: - resolution: {integrity: sha512-99lU0uwyslDOTwYkmiPk9VSpd6Nw/iYQ0hFJU1Vz8MO+b11dxAiuK7Wzpzo2+KyQ+3jeq79BNetfEdaXBWd7CQ==} - engines: {node: '>=22.12.0'} - peerDependencies: - vitest: '>=2.0.0' - peerDependenciesMeta: - vitest: - optional: true - - get-it@9.6.1: - resolution: {integrity: sha512-uxMgcolbhJTz8f/cOHLcgde3A0gwqv5p6m8OJ2WJqn7NBi79krofZdp95FD0+7N9UUpmAe76vIEX3kDFijRahg==} + get-it@9.6.1: + resolution: {integrity: sha512-uxMgcolbhJTz8f/cOHLcgde3A0gwqv5p6m8OJ2WJqn7NBi79krofZdp95FD0+7N9UUpmAe76vIEX3kDFijRahg==} engines: {node: '>=22.12.0'} peerDependencies: vitest: '>=2.0.0' @@ -5068,8 +5222,8 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-tsconfig@4.14.3: + resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} get-tsconfig@5.0.0-beta.4: resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} @@ -5108,9 +5262,9 @@ packages: resolution: {integrity: sha512-kj56ZjnOFbgDt91zYwQ10jsVUtVGJqAKfRbAir0EvTK84O5ZsSyc0rDEm2P3jmAJkxs4X1DOG8vtaYJQIA/XCA==} engines: {node: '>=22.12'} - groq@3.88.1-typegen-experimental.0: - resolution: {integrity: sha512-6TZD6H1y3P7zk0BQharjFa7BOivV9nFL6KKVZbRZRH0yOSSyu2xHglTO48b1/2mCEdYoBQpvE7rjCDUf6XmQYQ==} - engines: {node: '>=18'} + groq@6.20.0: + resolution: {integrity: sha512-9ZuwUpovJ5qWBpW7y5ynK6zpyeeB+qhC5AgTrgoibZO1Fl6k39tB/b4nmIVG3qgOIzHapkj5ihO5DYEIXWairQ==} + engines: {node: '>=22.12'} groq@6.9.2: resolution: {integrity: sha512-3M9bA7BqmX120GYb6oQSxWyWmwWfUNWxk7dEn5AyL8CHA6wCGcgsfMDT2o/mC1T9FkGH7iFvh6SE8AHSbiywwg==} @@ -5171,8 +5325,8 @@ packages: history@5.3.0: resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} - hls.js@1.6.15: - resolution: {integrity: sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==} + hls.js@1.7.3: + resolution: {integrity: sha512-MsPlx6yVW4Qv4C7mEVou4/gk/5cN2dVxOTnrNjPSmyH2f0Ln+/UkG10Ax1PE6OvrmTVPKgQYozTtBaPOuCzq7A==} hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -5211,8 +5365,8 @@ packages: humanize-list@1.0.1: resolution: {integrity: sha512-4+p3fCRF21oUqxhK0yZ6yaSP/H5/wZumc7q1fH99RkW7Q13aAxDeP78BKjoR+6y+kaHqKF/JWuQhsNuuI2NKtA==} - i18next@26.3.6: - resolution: {integrity: sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==} + i18next@26.5.4: + resolution: {integrity: sha512-Wg0O1u2xmnsve9gICDwGekLkMe9SIC7+ZiuLYfWUGb/A3TQdRKygQ4OY9ros4raf5D66ZnW9JMrTDtGP2b8a7Q==} peerDependencies: typescript: ^5 || ^6 || ^7 peerDependenciesMeta: @@ -5255,6 +5409,9 @@ packages: resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} engines: {node: ^18.17.0 || >=20.5.0} + interestfor@1.0.10: + resolution: {integrity: sha512-keOeje8wed6x7e/kNdMjVJEobOG9hz/9ld0LuyK3mxwvqLIfmxeBZFLaTPRj5QurfagGeaq8Gq3FUEb0LEY3Rw==} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -5464,9 +5621,6 @@ packages: resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} engines: {node: '>=7.10.1'} - json-with-bigint@3.5.7: - resolution: {integrity: sha512-7ei3MdAI5+fJPVnKlW77TKNKwQ5ppSzWvhPuSuINT/GYW9ZOC1eRKOuhV9yHG5aEsUPj9BBx5JIekkmoLHxZOw==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -5662,9 +5816,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@5.0.2: - resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} - linkify-it@6.1.0: resolution: {integrity: sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==} @@ -5681,9 +5832,6 @@ packages: lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -5706,6 +5854,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru_map@0.4.1: + resolution: {integrity: sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==} + lucide-react@0.577.0: resolution: {integrity: sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==} peerDependencies: @@ -5724,10 +5875,6 @@ packages: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} - markdown-it@14.3.0: - resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} - hasBin: true - markdown-it@15.0.2: resolution: {integrity: sha512-q4IGxMv56jCqT4OCRCADBoDP3LO4MhmTXjFbphHPXs4g3j9Xg5RDnxqN8IF/3vIWEU+VCnUq+7JUg/cfy2E6Qw==} hasBin: true @@ -5748,15 +5895,15 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - mdurl@2.1.0: resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} media-chrome@4.19.2: resolution: {integrity: sha512-4ai1ITN8wBhwugQcRgqe3tN0z6OSKGOXqHLNrS04MgKFfsLqu6Dm8MPq02pI9Y9ZKoXtFjIl85jOryIW9es3BA==} + media-chrome@4.19.3: + resolution: {integrity: sha512-B5cPfn5FUTm3ki58QlEk2CB3xFo1i5jM1JavVN3bV81o09cokQC+qWVGVWZWY9Yoo6si9WeaQZUNn472WzbNVQ==} + media-tracks@0.3.5: resolution: {integrity: sha512-l54rkKXlLBt3ob3zOLWHcnjvwUmX5bNEZ70igyapOZZC9imzqBmq1oz8p2roiV04KhjblFIi2hetLPF1oYVLRA==} @@ -5881,31 +6028,18 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - motion-dom@13.0.0: - resolution: {integrity: sha512-Xk+SJas70uMAUIApg+m3lZDShxI3LBFHq7mFGbBKoRXc2PVPDyAKmzN64Bbzt4CZdP/CItTiJxWtn4TA0v53Ng==} - - motion-dom@13.5.1: - resolution: {integrity: sha512-/7CVCD20Mz1KobktorpdgvowV0V41J7UxqE+qWS3GkSJqrRr5ft+2RloOYtEKv+wvBp3JaSFBclhxt4ja8ovHg==} - - motion-utils@13.0.0: - resolution: {integrity: sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==} + modern-tar@0.8.6: + resolution: {integrity: sha512-LYSks0tNVqbtez/9OB0YFP6qLRSqkdAxJWOQpVaR67lNTbj2zNLyYpowkRMia5lXLCZKzxwoxkxH2MbbBR2aEg==} + engines: {node: '>=18.0.0'} - motion-utils@13.5.0: - resolution: {integrity: sha512-Hqe/sqjIKliPZg8sVjWAkdySDPJNIeKH+euVkDOG8ri3DUUU7ZjndmHsGqEPz2iHpiyVaV5I22iguCMHU2he+Q==} + motion-dom@14.5.0: + resolution: {integrity: sha512-GAdnk1AgdtyrD3I09ZxEpV+Nt5QgwUsxN55qQV8mfk082dFQpcoT07wXkQAHRZjvZWUEBYhBVNeoXvtkYdL8jA==} - motion@13.1.0: - resolution: {integrity: sha512-qtvscq59uCPdWnNW4SdSkrxR+BS/QYsa923bx7ocA+4p+ZGNbbVQwkSnG4aukB81QWjtl3AxX36plxNyZLmHCA==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + motion-utils@14.1.1: + resolution: {integrity: sha512-3VvN5Uvf8B6qG+OfOui6Nht5EWp+vLuU3IqcAj7ItZGKqtmTjCebl5sGZF7/08gEHRnEl1AP/fIwbcEyVrcQGQ==} - motion@13.5.1: - resolution: {integrity: sha512-eV9SUem6KnzEa9+eT+dVBeDlhy5TTdn09YWR1WhUsKoZCJPw/n4TcYhjbxq2Gy5PTwDr//4H3r5vxkcZnNnO1w==} + motion@14.5.0: + resolution: {integrity: sha512-A0MinYYhYU12CHELw4+9jKPVreI43yDOprC4kAATHhF1rLfMFMhfpBR0GvdRR/IWEuKsHDnVn4fT+R2gQRyulw==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -5933,8 +6067,8 @@ packages: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} - mux-embed@5.17.10: - resolution: {integrity: sha512-i+eaoezVxIEliYGWPsjQztrWbA8A3Rzwqhwv1WGuRrl2npx85jFYJV5y+cjh7FASPOjT+7zJTYCJfxmcbgM7Hg==} + mux-embed@5.18.2: + resolution: {integrity: sha512-LBH8+LazS5Iyy2ujTrwXNJt6QUUUHw7NHdRFrBfIlKTrEdL5ZrzesSsAdVVPKBjdP0OoDoVu2zoh+oT5PgFomw==} nano-pubsub@3.0.0: resolution: {integrity: sha512-zoTNyBafxG0+F5PP3T3j1PKMr7gedriSdYRhLFLRFCz0OnQfQ6BkVk9peXVF30hz633Bw0Zh5McleOrXPjWYCQ==} @@ -5950,6 +6084,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@5.1.11: resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} engines: {node: ^18 || >=20} @@ -5960,6 +6099,11 @@ packages: engines: {node: ^22 || ^24 || >=26} hasBin: true + nanoid@6.0.2: + resolution: {integrity: sha512-hIvVOb9Qr1p/9CNNLOe0OlWvgx/ziTsVwKN/GDSsuArN2K0wDiafP3s0SWmsm7o2BdnyS8Z9Z64NFBUbn6ziBg==} + engines: {node: ^22 || ^24 || >=26} + hasBin: true + nanostores@1.5.5: resolution: {integrity: sha512-FixtE239Gl6Gz0ZGCK0WzvNwObNCIwVT+L7zQcf1QgcA6AzBxblzqe9OT88qiucNkhsjSOqiogSaF5jVbJiqSA==} engines: {node: ^20.0.0 || >=22.0.0} @@ -6050,10 +6194,6 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} - ora@9.4.0: - resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} - engines: {node: '>=20'} - ora@9.4.1: resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} engines: {node: '>=20'} @@ -6074,6 +6214,10 @@ packages: resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} + p-map@7.1.1: + resolution: {integrity: sha512-6Lh3jQPLthYujSrlw6ccWXBGZTkoTCz27Hd92g79LH/kjAbgoEu0t442cCCNbegPSJsA0lwDX8z0bcKtkpA32g==} + engines: {node: '>=18'} + p-queue@9.1.0: resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==} engines: {node: '>=20'} @@ -6086,10 +6230,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-directory@8.2.0: - resolution: {integrity: sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw==} - engines: {node: '>=18'} - package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -6144,9 +6284,6 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -6178,6 +6315,10 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -6194,8 +6335,8 @@ packages: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} - player.style@0.3.4: - resolution: {integrity: sha512-5O9bkbq0APQIkhptyZwp0gUgheCeImGPFo4hvPF2M5xBmgsUYzsUPHCfMye2xyeRE1zvQBKtziaC3jPgnHE1tw==} + player.style@0.3.5: + resolution: {integrity: sha512-hknPiLjNtJP5zM0vCVXsl3Pef+uQnecYg8X/1vjd/Y3TdAgs/zxhck02SFTxRSckaObKemP5tUT8wTH7ByUmnw==} pluralize-esm@9.0.5: resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} @@ -6224,6 +6365,10 @@ packages: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.31: + resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==} + engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} @@ -6237,6 +6382,10 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + pretty-ms@9.3.1: + resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} + engines: {node: '>=18'} + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -6301,11 +6450,6 @@ packages: peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental - react-compiler-runtime@19.1.0-rc.1: - resolution: {integrity: sha512-wCt6g+cRh8g32QT18/9blfQHywGjYu+4FlEc3CW1mx3pPxYzZZl1y+VtqxRgnKKBCFLIGUYxog4j4rs5YS86hw==} - peerDependencies: - react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental - react-dom@19.2.4: resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: @@ -6327,10 +6471,14 @@ packages: peerDependencies: react: '>= 16.8' - react-error-boundary@5.0.0: - resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} + react-error-boundary@6.1.6: + resolution: {integrity: sha512-CDXPnXDGyFIbkwaaJ6u+xgsRmJhSi6YdgUDW1vnyKHfXp1a9pfAlM+ZET2CDu80/A+8iRcmXN0NSY9BCCoWP5A==} peerDependencies: - react: '>=16.13.1' + '@types/react': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -6361,8 +6509,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@17.0.11: - resolution: {integrity: sha512-cDtkXgxjuFTWUH6V+aQn1Ve5vDiUztCNPWW5GtSHDccsgRXO1nE6QFWCEmc1KAutrb3OUv87wFShJL5RhUwPXg==} + react-i18next@17.1.0: + resolution: {integrity: sha512-4VouOnTDyvhvqXx6WZ+s3/cgSiaLutILdYkO3P1Ms+4qcKR7At+JP4Vi7IeHkVLyVV+DmN1l23Pn73UcwSGGPA==} peerDependencies: i18next: '>= 26.2.0' react: '>= 16.8.0' @@ -6390,8 +6538,8 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@19.2.8: - resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} + react-is@19.3.1: + resolution: {integrity: sha512-RRieF6IyxQBkcK6pP8xOHprLTPW6QjRkbGdImtqNme+/hYVwCZkLQLdlZGOhUqXwkS9IEynaGvPJtv6XB/cz0Q==} react-redux@9.3.0: resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} @@ -6415,8 +6563,8 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react-rx@5.1.1: - resolution: {integrity: sha512-4GNme4kL2F825aNnsIDqrOSxK6j6tjkpVdbdeILS8WMWOpX1QFO/Wyb28WREYZmcXr9Vys4ZV7yDdw6k9OxuMQ==} + react-rx@7.1.0: + resolution: {integrity: sha512-22bBSdI1KgeOZ9ucV3Wdyhs3/aZF6KSLD3iqrN2dXRXPMuXhOIDdpM1Dt2rOMZwrX6VWXJTK1RnM917HIkgUIw==} engines: {node: '>=22.12'} peerDependencies: react: ^19.2 @@ -6459,6 +6607,10 @@ packages: resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} + engines: {node: '>=0.10.0'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -6549,6 +6701,9 @@ packages: reselect@5.2.0: resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} + reselect@5.3.0: + resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -6572,6 +6727,11 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown@1.2.14: + resolution: {integrity: sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rolldown@1.2.4: resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6619,8 +6779,8 @@ packages: sanity: ^5 || ^6.0.0-0 styled-components: ^6.1 - sanity@6.9.2: - resolution: {integrity: sha512-1HCdwyzo4xUxHnpO/dulWafnVJaOL008pfod8nQb1NE3D0wtEt3lbsS2A5v9ea2cTFWZYYmZ5JTXzN9KbEZRVQ==} + sanity@6.20.0: + resolution: {integrity: sha512-GkKiy6KW78YstiyjiLUCZi1L8SdmoqbJ8gdklNYJbRpQ3Uo8k52YJQor4avmBrPr0QWb9BDh+9i2jNK6/5IpoQ==} engines: {node: '>=22.12'} hasBin: true peerDependencies: @@ -6687,9 +6847,6 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} - shallow-equals@1.0.0: - resolution: {integrity: sha512-xd/FKcdmfmMbyYCca3QTVEJtqUOGuajNzvAX6nt8dXILwjAIEkfHc4hI8/JMGApAmb7VeULO0Q30NTxnbH/15g==} - shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -6744,6 +6901,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -6775,6 +6936,9 @@ packages: streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + streamx@2.28.1: + resolution: {integrity: sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -6787,10 +6951,6 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.2.0: - resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} - engines: {node: '>=20'} - string-width@8.2.2: resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} engines: {node: '>=20'} @@ -6881,18 +7041,15 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-fs@3.1.2: - resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} - tar-fs@3.1.3: resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} - tar-stream@3.1.8: - resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} - tar-stream@3.2.0: resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + tar-stream@3.2.2: + resolution: {integrity: sha512-+8NeqHRjQWH9nYlwo2gamAMImZCVzI4UoEgDpWorBt9OEfppiZn+uSkskzQKPWIZyji/C8fpWO7u69G0DX0tbg==} + tar@7.5.22: resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} engines: {node: '>=18'} @@ -6979,10 +7136,6 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -7008,8 +7161,10 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true uc.micro@3.0.0: resolution: {integrity: sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==} @@ -7029,22 +7184,14 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@6.24.1: - resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} - engines: {node: '>=18.17'} - - undici@7.26.0: - resolution: {integrity: sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==} - engines: {node: '>=20.18.1'} - - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} - engines: {node: '>=20.18.1'} - undici@7.29.0: resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} + undici@7.29.1: + resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} + engines: {node: '>=20.18.1'} + undici@7.30.0: resolution: {integrity: sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==} engines: {node: '>=20.18.1'} @@ -7103,9 +7250,6 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - universal-user-agent@7.0.3: - resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - unstorage@1.17.5: resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} peerDependencies: @@ -7192,11 +7336,6 @@ packages: peerDependencies: react: '>=16.8.0' - use-effect-event@2.0.3: - resolution: {integrity: sha512-fz1en+z3fYXCXx3nMB8hXDMuygBltifNKZq29zDx+xNJ+1vEs6oJlYd9sK31vxJ0YI534VUsHEBY0k2BATsmBQ==} - peerDependencies: - react: ^18.3 || ^19.0.0-0 - use-effect-event@2.0.4: resolution: {integrity: sha512-il5ezAwTIxg1dr+eXP+1SS1EpXe6IFy1oADvGxmiCNGCDX1X+ygERRDOFoCyzc+r6ktqag3VITmrw1ZPfoig1g==} peerDependencies: @@ -7231,6 +7370,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -7243,22 +7387,21 @@ packages: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true - uuid@14.0.1: - resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + uuid@14.0.3: + resolution: {integrity: sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==} hasBin: true uuidv7@0.4.4: resolution: {integrity: sha512-jjRGChg03uGp9f6wQYSO8qXkweJwRbA5WRuEQE8xLIiehIzIIi23qZSzsyvZPCPoFqkeLtZuz7Plt1LGukAInA==} hasBin: true - verkit@0.3.2: - resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} - engines: {node: '>=18.12.0'} + valibot@1.5.0: + resolution: {integrity: sha512-nil6AkP2TChWL43Z5uJ6GTxX01CUA+g8LWUM+N/rB9NBbkUMaUsi9PUNzlUPgoKASgmx9f7eGOYpJ04/fSa6FQ==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -7269,11 +7412,6 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@6.0.0: - resolution: {integrity: sha512-oj4PVrT+pDh6GYf5wfUXkcZyekYS8kKPfLPXVl8qe324Ec6l4K2DUKNadRbZ3LQl0qGcDz+PyOo7ZAh00Y+JjQ==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - vite@8.2.1: resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -7317,6 +7455,49 @@ packages: yaml: optional: true + vite@8.3.5: + resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 || ^0.8.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitefu@1.1.3: resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} peerDependencies: @@ -7437,8 +7618,8 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - web-vitals@6.1.1: - resolution: {integrity: sha512-r93gKnR6ZC2O8F3JrS0AAGIQ0v0OhXuyg4DAj2oG7K+GPkwXfUSc3ZcWeu50AsV5yIc6xxnTjERipJ6EvSw2vg==} + web-vitals@6.2.3: + resolution: {integrity: sha512-Dmy+vdO1UPMqXiAtZSNayhl4f794Bxfd94W4HIj2HlYtczEQfEOon969memlcpcHrTuOKLa5baFjX7WbgmOq+A==} webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} @@ -7452,6 +7633,11 @@ packages: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + which-command@0.1.0: + resolution: {integrity: sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==} + engines: {node: '>=22'} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -7565,8 +7751,8 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xstate@5.32.5: - resolution: {integrity: sha512-ULazi1oe6wGrXl0Frb6otSlkm5HLifbbVTkMk5kkSKqz4TkxJaVpnl6jOJwKeid3ORPxYyZQgNLUSYX9q65SIA==} + xstate@5.33.3: + resolution: {integrity: sha512-AnDRjS/GyKHmbA1PyhVCYBqYsA7EGe3KGgeD0ht3NFsXzoz7leX/HQDFX9QlHFJ/ltLHPsgChJYwPzRvB/0b4g==} xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} @@ -7624,6 +7810,10 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + yoga-wasm-web@0.3.3: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} @@ -7639,14 +7829,11 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} - zod@4.6.7: resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} - zustand@5.0.14: - resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} + zustand@5.0.15: + resolution: {integrity: sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -7670,37 +7857,6 @@ snapshots: '@acemir/cssom@0.9.31': {} - '@actions/core@3.0.0': - dependencies: - '@actions/exec': 3.0.0 - '@actions/http-client': 4.0.0 - - '@actions/exec@3.0.0': - dependencies: - '@actions/io': 3.0.2 - - '@actions/github@9.0.0': - dependencies: - '@actions/http-client': 3.0.2 - '@octokit/core': 7.0.6 - '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) - '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) - '@octokit/request': 10.0.8 - '@octokit/request-error': 7.1.0 - undici: 6.24.1 - - '@actions/http-client@3.0.2': - dependencies: - tunnel: 0.0.6 - undici: 6.24.1 - - '@actions/http-client@4.0.0': - dependencies: - tunnel: 0.0.6 - undici: 6.24.1 - - '@actions/io@3.0.2': {} - '@ai-sdk/gateway@4.0.109(zod@4.6.7)': dependencies: '@ai-sdk/provider': 4.0.26 @@ -7766,14 +7922,6 @@ snapshots: '@aws-lite/client': 0.23.5 lambda-runtimes: 3.0.0 - '@asamuzakjp/css-color@5.0.1': - dependencies: - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - lru-cache: 11.5.1 - '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 @@ -8073,10 +8221,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.29.0 - '@babel/helper-annotate-as-pure@7.29.7': dependencies: '@babel/types': 7.29.8 @@ -8110,13 +8254,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 - semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -8127,8 +8264,8 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -8319,8 +8456,8 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': dependencies: @@ -8785,8 +8922,8 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.29.0 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/types': 7.29.8 esutils: 2.0.3 '@babel/preset-react@7.29.7(@babel/core@7.29.7)': @@ -8821,6 +8958,8 @@ snapshots: pirates: 4.0.7 source-map-support: 0.5.21 + '@babel/runtime@7.29.10': {} + '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': @@ -9076,9 +9215,9 @@ snapshots: '@codemirror/autocomplete@6.20.3': dependencies: - '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/language': 6.13.1 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.15 '@lezer/common': 1.5.1 '@codemirror/commands@6.10.3': @@ -9095,6 +9234,13 @@ snapshots: '@codemirror/view': 6.43.9 '@lezer/common': 1.5.1 + '@codemirror/commands@6.11.1': + dependencies: + '@codemirror/language': 6.13.1 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.15 + '@lezer/common': 1.5.1 + '@codemirror/lang-css@6.3.1': dependencies: '@codemirror/autocomplete': 6.20.1 @@ -9171,6 +9317,16 @@ snapshots: '@lezer/lr': 1.4.8 style-mod: 4.1.3 + '@codemirror/language@6.13.1': + dependencies: + '@codemirror/state': 6.7.6 + '@codemirror/streamparser': 6.0.0 + '@codemirror/view': 6.43.15 + '@lezer/common': 1.5.1 + '@lezer/highlight': 1.2.3 + '@lezer/lr': 1.4.8 + style-mod: 4.1.3 + '@codemirror/legacy-modes@6.5.3': dependencies: '@codemirror/language': 6.12.4 @@ -9181,16 +9337,28 @@ snapshots: '@codemirror/view': 6.43.9 crelt: 1.0.6 - '@codemirror/search@6.7.1': + '@codemirror/lint@6.9.7': dependencies: - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.15 + crelt: 1.0.6 + + '@codemirror/search@6.7.2': + dependencies: + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.15 crelt: 1.0.6 '@codemirror/state@6.7.1': dependencies: '@marijn/find-cluster-break': 1.0.2 + '@codemirror/state@6.7.6': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/streamparser@6.0.0': {} + '@codemirror/theme-one-dark@6.1.3': dependencies: '@codemirror/language': 6.12.4 @@ -9198,6 +9366,13 @@ snapshots: '@codemirror/view': 6.43.9 '@lezer/highlight': 1.2.3 + '@codemirror/view@6.43.15': + dependencies: + '@codemirror/state': 6.7.6 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + '@codemirror/view@6.43.9': dependencies: '@codemirror/state': 6.7.1 @@ -9211,23 +9386,11 @@ snapshots: '@csstools/color-helpers@6.0.2': {} - '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 @@ -9239,10 +9402,6 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.1(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 - '@csstools/css-syntax-patches-for-csstree@1.1.4(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -9263,6 +9422,11 @@ snapshots: react: 19.2.8 tslib: 2.8.1 + '@dnd-kit/accessibility@3.1.1(react@19.3.1)': + dependencies: + react: 19.3.1 + tslib: 2.8.1 + '@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@dnd-kit/accessibility': 3.1.1(react@19.2.4) @@ -9279,34 +9443,56 @@ snapshots: react-dom: 19.2.8(react@19.2.8) tslib: 2.8.1 - '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.4)': + '@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@dnd-kit/accessibility': 3.1.1(react@19.3.1) + '@dnd-kit/utilities': 3.2.2(react@19.3.1) + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) + tslib: 2.8.1 + + '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.4)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1) '@dnd-kit/utilities': 3.2.2(react@19.2.4) react: 19.2.4 tslib: 2.8.1 - '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': + '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.8)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1) '@dnd-kit/utilities': 3.2.2(react@19.2.8) react: 19.2.8 tslib: 2.8.1 - '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.4)': + '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.3.1)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + '@dnd-kit/utilities': 3.2.2(react@19.3.1) + react: 19.3.1 + tslib: 2.8.1 + + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.4)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1) '@dnd-kit/utilities': 3.2.2(react@19.2.4) react: 19.2.4 tslib: 2.8.1 - '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.8)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1) '@dnd-kit/utilities': 3.2.2(react@19.2.8) react: 19.2.8 tslib: 2.8.1 + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.3.1)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + '@dnd-kit/utilities': 3.2.2(react@19.3.1) + react: 19.3.1 + tslib: 2.8.1 + '@dnd-kit/utilities@3.2.2(react@19.2.4)': dependencies: react: 19.2.4 @@ -9317,6 +9503,11 @@ snapshots: react: 19.2.8 tslib: 2.8.1 + '@dnd-kit/utilities@3.2.2(react@19.3.1)': + dependencies: + react: 19.3.1 + tslib: 2.8.1 + '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -9624,6 +9815,12 @@ snapshots: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) + '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.3.1))(react@19.3.1)': + dependencies: + '@floating-ui/dom': 1.8.0 + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) + '@floating-ui/utils@0.2.11': {} '@floating-ui/utils@0.2.12': {} @@ -9837,6 +10034,8 @@ snapshots: '@inquirer/ansi@2.0.7': {} + '@inquirer/ansi@2.0.9': {} + '@inquirer/checkbox@4.3.2(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 @@ -9856,6 +10055,15 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/checkbox@5.2.7(@types/node@25.5.0)': + dependencies: + '@inquirer/ansi': 2.0.9 + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/confirm@5.1.21(@types/node@25.5.0)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.5.0) @@ -9870,6 +10078,13 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/confirm@6.3.4(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/core@10.3.2(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 @@ -9895,13 +10110,25 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 - '@inquirer/editor@4.2.23(@types/node@25.5.0)': + '@inquirer/core@12.0.5(@types/node@25.5.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/external-editor': 1.0.3(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) - optionalDependencies: - '@types/node': 25.5.0 + '@inquirer/ansi': 2.0.9 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.2.0(@types/node@25.5.0) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.0 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 25.5.0 + + '@inquirer/editor@4.2.23(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 '@inquirer/editor@5.2.2(@types/node@25.5.0)': dependencies: @@ -9911,6 +10138,14 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/editor@5.3.5(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/external-editor': 3.0.6(@types/node@25.5.0) + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/expand@4.0.23(@types/node@25.5.0)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.5.0) @@ -9926,6 +10161,13 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/expand@5.1.7(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/external-editor@1.0.3(@types/node@25.5.0)': dependencies: chardet: 2.1.1 @@ -9940,10 +10182,19 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/external-editor@3.0.6(@types/node@25.5.0)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/figures@1.0.15': {} '@inquirer/figures@2.0.7': {} + '@inquirer/figures@2.0.9': {} + '@inquirer/input@4.3.1(@types/node@25.5.0)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.5.0) @@ -9958,6 +10209,13 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/input@5.1.8(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/number@3.0.23(@types/node@25.5.0)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.5.0) @@ -9972,6 +10230,13 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/number@4.2.5(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/password@4.0.23(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 @@ -9988,6 +10253,14 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/password@5.2.4(@types/node@25.5.0)': + dependencies: + '@inquirer/ansi': 2.0.9 + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/prompts@7.10.1(@types/node@25.5.0)': dependencies: '@inquirer/checkbox': 4.3.2(@types/node@25.5.0) @@ -10018,6 +10291,21 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/prompts@8.7.4(@types/node@25.5.0)': + dependencies: + '@inquirer/checkbox': 5.2.7(@types/node@25.5.0) + '@inquirer/confirm': 6.3.4(@types/node@25.5.0) + '@inquirer/editor': 5.3.5(@types/node@25.5.0) + '@inquirer/expand': 5.1.7(@types/node@25.5.0) + '@inquirer/input': 5.1.8(@types/node@25.5.0) + '@inquirer/number': 4.2.5(@types/node@25.5.0) + '@inquirer/password': 5.2.4(@types/node@25.5.0) + '@inquirer/rawlist': 5.3.7(@types/node@25.5.0) + '@inquirer/search': 4.3.5(@types/node@25.5.0) + '@inquirer/select': 5.2.7(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/rawlist@4.1.11(@types/node@25.5.0)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.5.0) @@ -10033,6 +10321,13 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/rawlist@5.3.7(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/search@3.2.2(@types/node@25.5.0)': dependencies: '@inquirer/core': 10.3.2(@types/node@25.5.0) @@ -10050,6 +10345,14 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/search@4.3.5(@types/node@25.5.0)': + dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/select@4.4.2(@types/node@25.5.0)': dependencies: '@inquirer/ansi': 1.0.2 @@ -10069,6 +10372,15 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/select@5.2.7(@types/node@25.5.0)': + dependencies: + '@inquirer/ansi': 2.0.9 + '@inquirer/core': 12.0.5(@types/node@25.5.0) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.2.0(@types/node@25.5.0) + optionalDependencies: + '@types/node': 25.5.0 + '@inquirer/type@3.0.10(@types/node@25.5.0)': optionalDependencies: '@types/node': 25.5.0 @@ -10077,6 +10389,10 @@ snapshots: optionalDependencies: '@types/node': 25.5.0 + '@inquirer/type@4.2.0(@types/node@25.5.0)': + optionalDependencies: + '@types/node': 25.5.0 + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.3 @@ -10113,8 +10429,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@juggle/resize-observer@3.4.0': {} - '@lezer/common@1.5.1': {} '@lezer/css@1.3.1': @@ -10172,122 +10486,95 @@ snapshots: optionalDependencies: markdown-it: 15.0.2 - '@mdit/plugin-alert@0.23.2(markdown-it@14.3.0)': - dependencies: - '@types/markdown-it': 14.1.2 - optionalDependencies: - markdown-it: 14.3.0 - '@mdit/plugin-alert@2.0.2(markdown-it@15.0.2)': dependencies: '@mdit/helper': 1.1.2(markdown-it@15.0.2) optionalDependencies: markdown-it: 15.0.2 - '@module-federation/dts-plugin@2.8.1(typescript@5.9.3)': + '@module-federation/dts-plugin@2.9.2(typescript@5.9.3)': dependencies: - '@module-federation/error-codes': 2.8.1 - '@module-federation/managers': 2.8.1 - '@module-federation/sdk': 2.8.1 - '@module-federation/third-party-dts-extractor': 2.8.1 - adm-zip: 0.6.0 - isomorphic-ws: 5.0.0(ws@8.21.0) + '@module-federation/error-codes': 2.9.2 + '@module-federation/managers': 2.9.2 + '@module-federation/sdk': 2.9.2 + '@module-federation/third-party-dts-extractor': 2.9.2 + adm-zip: 0.6.1 + isomorphic-ws: 5.0.0(ws@8.21.3) typescript: 5.9.3 - undici: 7.28.0 - ws: 8.21.0 + undici: 7.29.1 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@module-federation/dts-plugin@2.8.2(typescript@5.9.3)': + '@module-federation/dts-plugin@2.9.2(typescript@6.0.3)': dependencies: - '@module-federation/error-codes': 2.8.2 - '@module-federation/managers': 2.8.2 - '@module-federation/sdk': 2.8.2 - '@module-federation/third-party-dts-extractor': 2.8.2 - adm-zip: 0.6.0 - isomorphic-ws: 5.0.0(ws@8.21.0) - typescript: 5.9.3 - undici: 7.29.0 - ws: 8.21.0 + '@module-federation/error-codes': 2.9.2 + '@module-federation/managers': 2.9.2 + '@module-federation/sdk': 2.9.2 + '@module-federation/third-party-dts-extractor': 2.9.2 + adm-zip: 0.6.1 + isomorphic-ws: 5.0.0(ws@8.21.3) + typescript: 6.0.3 + undici: 7.29.1 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@module-federation/error-codes@2.8.1': {} - - '@module-federation/error-codes@2.8.2': {} - - '@module-federation/managers@2.8.1': - dependencies: - '@module-federation/sdk': 2.8.1 - - '@module-federation/managers@2.8.2': - dependencies: - '@module-federation/sdk': 2.8.2 - - '@module-federation/runtime-core@2.8.1': - dependencies: - '@module-federation/error-codes': 2.8.1 - '@module-federation/sdk': 2.8.1 + '@module-federation/error-codes@2.9.2': {} - '@module-federation/runtime-core@2.8.2': + '@module-federation/managers@2.9.2': dependencies: - '@module-federation/error-codes': 2.8.2 - '@module-federation/sdk': 2.8.2 + '@module-federation/sdk': 2.9.2 - '@module-federation/runtime@2.8.1': + '@module-federation/runtime-core@2.9.2': dependencies: - '@module-federation/error-codes': 2.8.1 - '@module-federation/runtime-core': 2.8.1 - '@module-federation/sdk': 2.8.1 + '@module-federation/error-codes': 2.9.2 + '@module-federation/sdk': 2.9.2 - '@module-federation/runtime@2.8.2': + '@module-federation/runtime@2.9.2': dependencies: - '@module-federation/error-codes': 2.8.2 - '@module-federation/runtime-core': 2.8.2 - '@module-federation/sdk': 2.8.2 + '@module-federation/error-codes': 2.9.2 + '@module-federation/runtime-core': 2.9.2 + '@module-federation/sdk': 2.9.2 - '@module-federation/sdk@2.8.1': {} + '@module-federation/sdk@2.9.2': {} - '@module-federation/sdk@2.8.2': {} + '@module-federation/third-party-dts-extractor@2.9.2': {} - '@module-federation/third-party-dts-extractor@2.8.1': {} - - '@module-federation/third-party-dts-extractor@2.8.2': {} - - '@module-federation/vite@1.20.1(typescript@5.9.3)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': + '@module-federation/vite@1.23.5(typescript@5.9.3)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: - '@module-federation/dts-plugin': 2.8.1(typescript@5.9.3) - '@module-federation/runtime': 2.8.1 - '@module-federation/sdk': 2.8.1 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@module-federation/dts-plugin': 2.9.2(typescript@5.9.3) + '@module-federation/runtime': 2.9.2 + '@module-federation/sdk': 2.9.2 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - vue-tsc - '@module-federation/vite@1.20.7(typescript@5.9.3)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': + '@module-federation/vite@1.23.5(typescript@6.0.3)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: - '@module-federation/dts-plugin': 2.8.2(typescript@5.9.3) - '@module-federation/runtime': 2.8.2 - '@module-federation/sdk': 2.8.2 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@module-federation/dts-plugin': 2.9.2(typescript@6.0.3) + '@module-federation/runtime': 2.9.2 + '@module-federation/sdk': 2.9.2 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - vue-tsc - '@mux/mux-data-google-ima@0.3.15': + '@mux/mux-data-google-ima@0.3.18': dependencies: - mux-embed: 5.17.10 + mux-embed: 5.18.2 - '@mux/mux-player-react@3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@mux/mux-player-react@3.14.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@mux/mux-player': 3.13.2(react@19.2.4) - '@mux/playback-core': 0.35.2 + '@mux/mux-player': 3.14.0(react@19.2.4) + '@mux/playback-core': 0.36.0 prop-types: 15.8.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -10295,10 +10582,10 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@mux/mux-player-react@3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@mux/mux-player-react@3.14.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@mux/mux-player': 3.13.2(react@19.2.8) - '@mux/playback-core': 0.35.2 + '@mux/mux-player': 3.14.0(react@19.2.8) + '@mux/playback-core': 0.36.0 prop-types: 15.8.1 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) @@ -10306,37 +10593,56 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@mux/mux-player@3.13.2(react@19.2.4)': + '@mux/mux-player-react@3.14.0(@types/react@19.2.14)(react-dom@19.2.8(react@19.3.1))(react@19.3.1)': dependencies: - '@mux/mux-video': 0.31.2 - '@mux/playback-core': 0.35.2 - media-chrome: 4.19.2(react@19.2.4) - player.style: 0.3.4(react@19.2.4) + '@mux/mux-player': 3.14.0(react@19.3.1) + '@mux/playback-core': 0.36.0 + prop-types: 15.8.1 + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) + optionalDependencies: + '@types/react': 19.2.14 + + '@mux/mux-player@3.14.0(react@19.2.4)': + dependencies: + '@mux/mux-video': 0.31.5 + '@mux/playback-core': 0.36.0 + media-chrome: 4.19.3(react@19.2.4) + player.style: 0.3.5(react@19.2.4) transitivePeerDependencies: - react - '@mux/mux-player@3.13.2(react@19.2.8)': + '@mux/mux-player@3.14.0(react@19.2.8)': dependencies: - '@mux/mux-video': 0.31.2 - '@mux/playback-core': 0.35.2 - media-chrome: 4.19.2(react@19.2.8) - player.style: 0.3.4(react@19.2.8) + '@mux/mux-video': 0.31.5 + '@mux/playback-core': 0.36.0 + media-chrome: 4.19.3(react@19.2.8) + player.style: 0.3.5(react@19.2.8) + transitivePeerDependencies: + - react + + '@mux/mux-player@3.14.0(react@19.3.1)': + dependencies: + '@mux/mux-video': 0.31.5 + '@mux/playback-core': 0.36.0 + media-chrome: 4.19.3(react@19.3.1) + player.style: 0.3.5(react@19.3.1) transitivePeerDependencies: - react - '@mux/mux-video@0.31.2': + '@mux/mux-video@0.31.5': dependencies: - '@mux/mux-data-google-ima': 0.3.15 - '@mux/playback-core': 0.35.2 + '@mux/mux-data-google-ima': 0.3.18 + '@mux/playback-core': 0.36.0 '@types/google_interactive_media_ads_types': 3.697.1 castable-video: 1.1.16 custom-media-element: 1.4.6 media-tracks: 0.3.5 - '@mux/playback-core@0.35.2': + '@mux/playback-core@0.36.0': dependencies: - hls.js: 1.6.15 - mux-embed: 5.17.10 + hls.js: 1.7.3 + mux-embed: 5.18.2 '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: @@ -10393,10 +10699,35 @@ snapshots: wrap-ansi: 7.0.0 wsl-utils: 0.4.0 + '@oclif/core@4.14.0': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 6.0.1 + get-package-type: 0.1.0 + indent-string: 4.0.0 + lilconfig: 3.1.3 + minimatch: 10.2.5 + semver: 7.8.5 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.17 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + wsl-utils: 0.4.0 + '@oclif/plugin-help@6.2.58': dependencies: '@oclif/core': 4.13.5 + '@oclif/plugin-help@6.3.0': + dependencies: + '@oclif/core': 4.14.0 + '@oclif/plugin-not-found@3.2.93(@types/node@25.5.0)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@25.5.0) @@ -10406,58 +10737,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@octokit/auth-token@6.0.0': {} - - '@octokit/core@7.0.6': - dependencies: - '@octokit/auth-token': 6.0.0 - '@octokit/graphql': 9.0.3 - '@octokit/request': 10.0.8 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - before-after-hook: 4.0.0 - universal-user-agent: 7.0.3 - - '@octokit/endpoint@11.0.3': - dependencies: - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/graphql@9.0.3': - dependencies: - '@octokit/request': 10.0.8 - '@octokit/types': 16.0.0 - universal-user-agent: 7.0.3 - - '@octokit/openapi-types@27.0.0': {} - - '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/types': 16.0.0 - - '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': - dependencies: - '@octokit/core': 7.0.6 - '@octokit/types': 16.0.0 - - '@octokit/request-error@7.1.0': - dependencies: - '@octokit/types': 16.0.0 - - '@octokit/request@10.0.8': - dependencies: - '@octokit/endpoint': 11.0.3 - '@octokit/request-error': 7.1.0 - '@octokit/types': 16.0.0 - fast-content-type-parse: 3.0.0 - json-with-bigint: 3.5.7 - universal-user-agent: 7.0.3 - - '@octokit/types@16.0.0': - dependencies: - '@octokit/openapi-types': 27.0.0 - '@openrouter/ai-sdk-provider@3.1.0(ai@7.0.135(zod@4.6.7))(zod@4.6.7)': dependencies: ai: 7.0.135(zod@4.6.7) @@ -10469,6 +10748,35 @@ snapshots: '@oxc-project/types@0.144.0': {} + '@oxc-project/types@0.154.0': {} + + '@pierre/diffs@1.6.0(@shikijs/themes@4.4.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@pierre/highlights': 0.1.3 + '@pierre/theme': 2.0.0 + '@pierre/theming': 1.0.1(@pierre/theme@2.0.0)(@shikijs/themes@4.4.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(shiki@4.4.3) + diff: 9.0.0 + hast-util-to-html: 9.0.5 + lru_map: 0.4.1 + shiki: 4.4.3 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + transitivePeerDependencies: + - '@shikijs/themes' + + '@pierre/highlights@0.1.3': {} + + '@pierre/theme@2.0.0': {} + + '@pierre/theming@1.0.1(@pierre/theme@2.0.0)(@shikijs/themes@4.4.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(shiki@4.4.3)': + optionalDependencies: + '@pierre/theme': 2.0.0 + '@shikijs/themes': 4.4.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + shiki: 4.4.3 + '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -10502,53 +10810,68 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.4)': + '@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.2.4)': dependencies: - '@portabletext/html': 1.2.0 - '@portabletext/keyboard-shortcuts': 2.1.4 - '@portabletext/markdown': 1.5.0 - '@portabletext/patches': 2.0.6 - '@portabletext/schema': 2.2.4 - '@portabletext/to-html': 5.0.3 - '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.32.5) - debug: 4.4.3(supports-color@8.1.1) + '@portabletext/html': 2.0.2 + '@portabletext/keyboard-shortcuts': 3.0.0 + '@portabletext/patches': 3.0.2 + '@portabletext/repair': 1.0.0 + '@portabletext/schema': 3.1.0 + '@portabletext/to-html': 6.0.0 + '@sanity/diff-match-patch': 3.2.1 + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.33.3) + obug: 3.0.0 react: 19.2.4 scroll-into-view-if-needed: 3.1.0 - xstate: 5.32.5 + xstate: 5.33.3 transitivePeerDependencies: - '@types/react' - - supports-color - '@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8)': + '@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.2.8)': dependencies: - '@portabletext/html': 1.2.0 - '@portabletext/keyboard-shortcuts': 2.1.4 - '@portabletext/markdown': 1.5.0 - '@portabletext/patches': 2.0.6 - '@portabletext/schema': 2.2.4 - '@portabletext/to-html': 5.0.3 - '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.32.5) - debug: 4.4.3(supports-color@8.1.1) + '@portabletext/html': 2.0.2 + '@portabletext/keyboard-shortcuts': 3.0.0 + '@portabletext/patches': 3.0.2 + '@portabletext/repair': 1.0.0 + '@portabletext/schema': 3.1.0 + '@portabletext/to-html': 6.0.0 + '@sanity/diff-match-patch': 3.2.1 + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.33.3) + obug: 3.0.0 react: 19.2.8 scroll-into-view-if-needed: 3.1.0 - xstate: 5.32.5 + xstate: 5.33.3 + transitivePeerDependencies: + - '@types/react' + + '@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1)': + dependencies: + '@portabletext/html': 2.0.2 + '@portabletext/keyboard-shortcuts': 3.0.0 + '@portabletext/patches': 3.0.2 + '@portabletext/repair': 1.0.0 + '@portabletext/schema': 3.1.0 + '@portabletext/to-html': 6.0.0 + '@sanity/diff-match-patch': 3.2.1 + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.3.1)(xstate@5.33.3) + obug: 3.0.0 + react: 19.3.1 + scroll-into-view-if-needed: 3.1.0 + xstate: 5.33.3 transitivePeerDependencies: - '@types/react' - - supports-color '@portabletext/html@1.2.0': dependencies: '@portabletext/schema': 2.2.4 '@vercel/stega': 1.1.0 - '@portabletext/keyboard-shortcuts@2.1.4': {} - - '@portabletext/markdown@1.5.0': + '@portabletext/html@2.0.2': dependencies: - '@mdit/plugin-alert': 0.23.2(markdown-it@14.3.0) - '@portabletext/schema': 2.2.4 - '@portabletext/toolkit': 5.0.2 - markdown-it: 14.3.0 + '@portabletext/schema': 3.1.0 + '@vercel/stega': 1.1.0 + + '@portabletext/keyboard-shortcuts@3.0.0': {} '@portabletext/markdown@2.5.0': dependencies: @@ -10559,146 +10882,225 @@ snapshots: linkify-it: 6.1.0 markdown-it: 15.0.2 - '@portabletext/patches@2.0.6': + '@portabletext/patches@3.0.2': dependencies: - '@sanity/diff-match-patch': 3.2.0 + '@sanity/diff-match-patch': 3.2.1 - '@portabletext/plugin-character-pair-decorator@8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4)': + '@portabletext/plugin-character-pair-decorator@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-input-rule': 6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4) react: 19.2.4 transitivePeerDependencies: - '@types/react' - '@portabletext/plugin-character-pair-decorator@8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8)': + '@portabletext/plugin-character-pair-decorator@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-input-rule': 6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8) react: 19.2.8 transitivePeerDependencies: - '@types/react' - '@portabletext/plugin-dnd@1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4)': + '@portabletext/plugin-character-pair-decorator@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1) + react: 19.3.1 + transitivePeerDependencies: + - '@types/react' + + '@portabletext/plugin-dnd@2.0.22(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.4 - '@portabletext/plugin-dnd@1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8)': + '@portabletext/plugin-dnd@2.0.22(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.8 - '@portabletext/plugin-input-rule@6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4)': + '@portabletext/plugin-dnd@2.0.22(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.32.5) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + react: 19.3.1 + + '@portabletext/plugin-input-rule@7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.33.3) react: 19.2.4 - xstate: 5.32.5 + xstate: 5.33.3 transitivePeerDependencies: - '@types/react' - '@portabletext/plugin-input-rule@6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8)': + '@portabletext/plugin-input-rule@7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.32.5) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.33.3) react: 19.2.8 - xstate: 5.32.5 + xstate: 5.33.3 + transitivePeerDependencies: + - '@types/react' + + '@portabletext/plugin-input-rule@7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.3.1)(xstate@5.33.3) + react: 19.3.1 + xstate: 5.33.3 transitivePeerDependencies: - '@types/react' - '@portabletext/plugin-list-index@1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4)': + '@portabletext/plugin-list-index@2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.4 - '@portabletext/plugin-list-index@1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8)': + '@portabletext/plugin-list-index@2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.8 - '@portabletext/plugin-markdown-shortcuts@8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4)': + '@portabletext/plugin-list-index@2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + react: 19.3.1 + + '@portabletext/plugin-markdown-shortcuts@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-character-pair-decorator': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4) - '@portabletext/plugin-input-rule': 6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-character-pair-decorator': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4) react: 19.2.4 transitivePeerDependencies: - '@types/react' - '@portabletext/plugin-markdown-shortcuts@8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8)': + '@portabletext/plugin-markdown-shortcuts@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-character-pair-decorator': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-input-rule': 6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-character-pair-decorator': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8) react: 19.2.8 transitivePeerDependencies: - '@types/react' - '@portabletext/plugin-one-line@7.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4)': + '@portabletext/plugin-markdown-shortcuts@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-character-pair-decorator': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1) + react: 19.3.1 + transitivePeerDependencies: + - '@types/react' + + '@portabletext/plugin-one-line@8.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.4 - '@portabletext/plugin-one-line@7.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8)': + '@portabletext/plugin-one-line@8.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.8 - '@portabletext/plugin-paste-link@4.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4)': + '@portabletext/plugin-one-line@8.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + react: 19.3.1 + + '@portabletext/plugin-paste-link@5.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.4 - '@portabletext/plugin-paste-link@4.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8)': + '@portabletext/plugin-paste-link@5.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) react: 19.2.8 - '@portabletext/plugin-table@1.3.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@portabletext/plugin-paste-link@5.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + react: 19.3.1 + + '@portabletext/plugin-table@2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@floating-ui/dom': 1.8.0 - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/keyboard-shortcuts': 2.1.4 + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/keyboard-shortcuts': 3.0.0 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@portabletext/plugin-table@1.3.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@portabletext/plugin-table@2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@floating-ui/dom': 1.8.0 - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/keyboard-shortcuts': 2.1.4 + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/keyboard-shortcuts': 3.0.0 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - '@portabletext/plugin-typography@8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4)': + '@portabletext/plugin-table@2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react-dom@19.2.8(react@19.3.1))(react@19.3.1)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-input-rule': 6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4) + '@floating-ui/dom': 1.8.0 + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/keyboard-shortcuts': 3.0.0 + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) + + '@portabletext/plugin-typography@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4) react: 19.2.4 transitivePeerDependencies: - '@types/react' - '@portabletext/plugin-typography@8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8)': + '@portabletext/plugin-typography@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8)': dependencies: - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-input-rule': 6.0.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8) react: 19.2.8 transitivePeerDependencies: - '@types/react' + '@portabletext/plugin-typography@9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1)': + dependencies: + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-input-rule': 7.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1) + react: 19.3.1 + transitivePeerDependencies: + - '@types/react' + '@portabletext/react@7.0.1(react@19.2.4)': dependencies: '@portabletext/toolkit': 5.0.2 '@portabletext/types': 4.0.2 react: 19.2.4 - '@portabletext/react@7.0.1(react@19.2.8)': + '@portabletext/react@8.0.1(react@19.2.4)': dependencies: - '@portabletext/toolkit': 5.0.2 + '@portabletext/toolkit': 6.0.0 + '@portabletext/types': 4.0.2 + react: 19.2.4 + + '@portabletext/react@8.0.1(react@19.2.8)': + dependencies: + '@portabletext/toolkit': 6.0.0 '@portabletext/types': 4.0.2 react: 19.2.8 + '@portabletext/react@8.0.1(react@19.3.1)': + dependencies: + '@portabletext/toolkit': 6.0.0 + '@portabletext/types': 4.0.2 + react: 19.3.1 + + '@portabletext/repair@1.0.0': + dependencies: + '@portabletext/patches': 3.0.2 + '@portabletext/schema': 3.1.0 + '@portabletext/sanity-bridge@3.2.5(@types/react@19.2.14)': dependencies: '@portabletext/schema': 2.2.4 @@ -10707,14 +11109,20 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@portabletext/sanity-bridge@4.1.4(@types/react@19.2.14)': + dependencies: + '@portabletext/schema': 3.1.0 + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/types': 6.20.0(@types/react@19.2.14) + transitivePeerDependencies: + - '@types/react' + - vitest + '@portabletext/schema@2.2.4': {} '@portabletext/schema@3.0.0': {} - '@portabletext/to-html@5.0.3': - dependencies: - '@portabletext/toolkit': 5.0.2 - '@portabletext/types': 4.0.2 + '@portabletext/schema@3.1.0': {} '@portabletext/to-html@6.0.0': dependencies: @@ -10757,104 +11165,177 @@ snapshots: md5-o-matic: 0.1.1 react: 19.2.8 + '@rexxars/react-json-inspector@9.0.1(react@19.3.1)': + dependencies: + debounce: 1.2.1 + md5-o-matic: 0.1.1 + react: 19.3.1 + '@rexxars/react-split-pane@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@rolldown/binding-android-arm-eabi@1.2.14': + optional: true + + '@rolldown/binding-android-arm64@1.2.14': + optional: true + '@rolldown/binding-android-arm64@1.2.4': optional: true + '@rolldown/binding-darwin-arm64@1.2.14': + optional: true + '@rolldown/binding-darwin-arm64@1.2.4': optional: true + '@rolldown/binding-darwin-x64@1.2.14': + optional: true + '@rolldown/binding-darwin-x64@1.2.4': optional: true + '@rolldown/binding-freebsd-x64@1.2.14': + optional: true + '@rolldown/binding-freebsd-x64@1.2.4': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.14': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.4': optional: true + '@rolldown/binding-linux-arm64-musl@1.2.14': + optional: true + '@rolldown/binding-linux-arm64-musl@1.2.4': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.4': optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.14': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.4': optional: true + '@rolldown/binding-linux-x64-gnu@1.2.14': + optional: true + '@rolldown/binding-linux-x64-gnu@1.2.4': optional: true + '@rolldown/binding-linux-x64-musl@1.2.14': + optional: true + '@rolldown/binding-linux-x64-musl@1.2.4': optional: true + '@rolldown/binding-openharmony-arm64@1.2.14': + optional: true + '@rolldown/binding-openharmony-arm64@1.2.4': optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.14': + optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.4': optional: true + '@rolldown/binding-win32-x64-msvc@1.2.14': + optional: true + '@rolldown/binding-win32-x64-msvc@1.2.4': optional: true - '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': + '@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 - picomatch: 4.0.5 - rolldown: 1.2.4 + picomatch: 4.0.7 + rolldown: 1.2.14 optionalDependencies: - '@babel/runtime': 7.29.2 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@babel/runtime': 7.29.10 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) '@rolldown/pluginutils@1.0.0-rc.3': {} '@rolldown/pluginutils@1.0.1': {} - '@sanity-labs/design-tokens@0.0.2-alpha.2': {} + '@sanity-labs/design-tokens@0.0.2-alpha.6': {} - '@sanity-labs/design-tokens@0.0.2-alpha.4': {} + '@sanity-labs/groq-wasm@1.0.1': {} - '@sanity-labs/oclif-plugin-skills-flag@0.2.1(@oclif/core@4.13.5)': + '@sanity-labs/oclif-plugin-skills-flag@0.2.1(@oclif/core@4.14.0)': dependencies: - '@oclif/core': 4.13.5 + '@oclif/core': 4.14.0 - '@sanity-labs/ui-poc@0.0.1-alpha.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@sanity/access-ui@6.20.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: - '@sanity-labs/design-tokens': 0.0.2-alpha.4 - '@sanity/icons': 3.7.4(react@19.2.4) - clsx: 2.1.1 - comment-json: 5.0.0 + '@sanity/client': 8.9.0 + '@sanity/icons': 5.2.3(react@19.2.4) + '@sanity/ui': 4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-refractor: 4.0.0(react@19.2.4) + react-rx: 7.1.0(react@19.2.4)(rxjs@7.8.2) + rxjs: 7.8.2 + ui5: '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)' + transitivePeerDependencies: + - react-dom + - styled-components + - vitest - '@sanity-labs/ui-poc@0.0.1-alpha.25(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@sanity/access-ui@6.20.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': dependencies: - '@sanity-labs/design-tokens': 0.0.2-alpha.4 - '@sanity/icons': 3.7.4(react@19.2.8) - clsx: 2.1.1 - comment-json: 5.0.0 + '@sanity/client': 8.9.0 + '@sanity/icons': 5.2.3(react@19.2.8) + '@sanity/ui': 4.4.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-refractor: 4.0.0(react@19.2.8) + react-rx: 7.1.0(react@19.2.8)(rxjs@7.8.2) + rxjs: 7.8.2 + ui5: '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.8(react@19.2.8))(react@19.2.8)' + transitivePeerDependencies: + - react-dom + - styled-components + - vitest + + '@sanity/access-ui@6.20.0(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1))': + dependencies: + '@sanity/client': 8.9.0 + '@sanity/icons': 5.2.3(react@19.3.1) + '@sanity/ui': 4.4.10(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1)) + react: 19.3.1 + react-rx: 7.1.0(react@19.3.1)(rxjs@7.8.2) + rxjs: 7.8.2 + ui5: '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.8(react@19.3.1))(react@19.3.1)' + transitivePeerDependencies: + - react-dom + - styled-components + - vitest '@sanity/asset-utils@2.3.0': {} - '@sanity/assist@6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@sanity/assist@6.1.19(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@portabletext/types': 4.0.2 '@sanity/client': 7.26.2 '@sanity/color': 3.0.8 '@sanity/icons': 5.2.1(react@19.2.4) '@sanity/mutator': 6.9.2(@types/react@19.2.14) - '@sanity/ui': 4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@sanity/ui': 4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) date-fns: 4.4.0 lodash-es: 4.18.1 react: 19.2.4 @@ -10862,7 +11343,7 @@ snapshots: react-fast-compare: 3.2.2 rxjs: 7.8.2 rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.2) - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + sanity: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@types/react' @@ -10873,44 +11354,49 @@ snapshots: nanoid: 5.1.11 rxjs: 7.8.2 - '@sanity/blueprints-parser@0.5.0': {} + '@sanity/bifur-client@2.0.2': + dependencies: + nanoid: 6.0.2 + rxjs: 7.8.2 - '@sanity/blueprints@0.23.6(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': - optionalDependencies: - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/blueprints-parser@0.5.0': {} - '@sanity/blueprints@0.28.0(jiti@2.7.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': + '@sanity/blueprints@0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: parse-duration: 2.1.9 optionalDependencies: jiti: 2.7.0 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - '@sanity/cli-build@5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/cli-build@6.5.0(411f116d525a086784c2a84e92ba57a0)': dependencies: '@oclif/core': 4.13.5 - '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) - '@sanity/cli-core': 3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) '@sanity/generate-help-url': 4.0.0 - '@sanity/schema': 6.9.2(@types/react@19.2.14) - '@sanity/telemetry': 1.1.0(react@19.2.8) - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/workbench-cli': 2.0.1(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) - '@vitejs/plugin-react': 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/workbench-cli': 2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.3.1)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)(yaml@2.9.0) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) chokidar: 5.0.0 cjs-module-lexer: 2.2.1 + dompurify: 3.4.17 empathic: 2.0.1 + jsdom: 29.1.1(@noble/hashes@2.4.0) + lightningcss: 1.33.0 lodash-es: 4.18.1 node-html-parser: 7.1.0 oneline: 2.0.0 picomatch: 4.0.5 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.1 + react-is: 19.3.1 semver: 7.8.5 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - zod: 4.4.3 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 optionalDependencies: babel-plugin-react-compiler: 1.0.0 + sanity: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) transitivePeerDependencies: - '@babel/core' - '@babel/plugin-transform-runtime' @@ -10919,14 +11405,12 @@ snapshots: - '@types/node' - '@types/react' - '@vitejs/devtools' - - bare-abort-controller - - bare-buffer - bufferutil - canvas - esbuild + - immer - jiti - less - - react-native-b4a - rolldown - sass - sass-embedded @@ -10935,72 +11419,150 @@ snapshots: - terser - tsx - typescript + - use-sync-external-store - utf-8-validate - vitest - vue-tsc + - xstate - yaml - '@sanity/cli-core@2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0)': + '@sanity/cli-build@6.5.0(7948589135ae65c892d8c26bcac3a6f5)': dependencies: - '@inquirer/prompts': 8.5.2(@types/node@25.5.0) '@oclif/core': 4.13.5 - '@sanity/client': 7.26.2 - boxen: 8.0.1 - debug: 4.4.3(supports-color@8.1.1) + '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/generate-help-url': 4.0.0 + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/workbench-cli': 2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.3.1)(terser@5.48.0)(tsx@4.23.12)(typescript@6.0.3)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)(yaml@2.9.0) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + chokidar: 5.0.0 + cjs-module-lexer: 2.2.1 + dompurify: 3.4.17 empathic: 2.0.1 - get-it: 8.8.3 - get-tsconfig: 4.14.0 - import-meta-resolve: 4.2.0 - jiti: 2.7.0 jsdom: 29.1.1(@noble/hashes@2.4.0) - json-lexer: 1.2.0 - log-symbols: 7.0.1 - ora: 9.4.0 - rxjs: 7.8.2 - tsx: 4.23.12 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - wrap-ansi: 9.0.2 - zod: 4.4.3 + lightningcss: 1.33.0 + lodash-es: 4.18.1 + node-html-parser: 7.1.0 + oneline: 2.0.0 + picomatch: 4.0.5 + react: 19.3.1 + react-is: 19.3.1 + semver: 7.8.5 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 optionalDependencies: babel-plugin-react-compiler: 1.0.0 + sanity: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(typescript@6.0.3))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(terser@5.48.0)(tsx@4.23.12)(typescript@6.0.3) transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' - '@noble/hashes' - '@types/node' + - '@types/react' - '@vitejs/devtools' + - bufferutil - canvas - esbuild + - immer + - jiti - less + - rolldown + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate + - yaml + + '@sanity/cli-build@6.5.0(fe37103854ff8cc950f6ec45cf94f756)': + dependencies: + '@oclif/core': 4.13.5 + '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/generate-help-url': 4.0.0 + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/workbench-cli': 2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.3.1)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3)(yaml@2.9.0) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + chokidar: 5.0.0 + cjs-module-lexer: 2.2.1 + dompurify: 3.4.17 + empathic: 2.0.1 + jsdom: 29.1.1(@noble/hashes@2.4.0) + lightningcss: 1.33.0 + lodash-es: 4.18.1 + node-html-parser: 7.1.0 + oneline: 2.0.0 + picomatch: 4.0.5 + react: 19.3.1 + react-is: 19.3.1 + semver: 7.8.5 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 + optionalDependencies: + babel-plugin-react-compiler: 1.0.0 + sanity: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@noble/hashes' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - bufferutil + - canvas + - esbuild + - immer + - jiti + - less + - rolldown - sass - sass-embedded - stylus - sugarss - - supports-color - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate - yaml - '@sanity/cli-core@3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0)': + '@sanity/cli-core@3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)': dependencies: + '@inquirer/core': 12.0.5(@types/node@25.5.0) '@inquirer/prompts': 8.5.2(@types/node@25.5.0) '@oclif/core': 4.13.5 '@sanity/client': 8.9.0 boxen: 8.0.1 empathic: 2.0.1 - get-it: 9.5.0 - get-tsconfig: 4.14.0 + get-it: 9.6.1 + get-tsconfig: 4.14.3 import-meta-resolve: 4.2.0 jiti: 2.7.0 jsdom: 29.1.1(@noble/hashes@2.4.0) json-lexer: 1.2.0 log-symbols: 7.0.1 - obug: 2.1.4 - ora: 9.4.0 + obug: 3.0.0 + ora: 9.4.1 rxjs: 7.8.2 - tsx: 4.23.12 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) wrap-ansi: 9.0.2 - zod: 4.4.3 + zod: 4.6.7 optionalDependencies: babel-plugin-react-compiler: 1.0.0 transitivePeerDependencies: @@ -11015,78 +11577,76 @@ snapshots: - stylus - sugarss - terser + - tsx - vitest - yaml - '@sanity/cli@7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5)': + '@sanity/cli@8.22.0(299fd29bb40c35fa6c2a53d133561739)': dependencies: '@oclif/core': 4.13.5 '@oclif/plugin-help': 6.2.58 '@oclif/plugin-not-found': 3.2.93(@types/node@25.5.0) - '@sanity/cli-build': 5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) - '@sanity/cli-core': 2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) - '@sanity/client': 7.26.2 - '@sanity/codegen': 7.0.3(@oclif/core@4.13.5)(@sanity/cli-core@2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0))(react@19.2.8) + '@sanity/blueprints': 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-build': 6.5.0(7948589135ae65c892d8c26bcac3a6f5) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/client': 8.9.0 + '@sanity/codegen': 8.2.0(react@19.3.1)(typescript@6.0.3) '@sanity/descriptors': 1.3.0 '@sanity/export': 6.2.1 '@sanity/generate-help-url': 4.0.0 - '@sanity/id-utils': 1.0.0 - '@sanity/import': 6.0.3(@sanity/client@7.26.2)(@types/react@19.2.14) - '@sanity/migrate': 8.0.2(@types/react@19.2.14)(xstate@5.32.5) - '@sanity/runtime-cli': 17.7.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) - '@sanity/schema': 6.9.2(@types/react@19.2.14) - '@sanity/telemetry': 1.1.0(react@19.2.8) - '@sanity/template-validator': 3.1.0 - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/workbench-cli': 1.10.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) + '@sanity/id-utils': 1.1.0 + '@sanity/import': 7.0.4(@sanity/client@8.9.0)(@types/react@19.2.14) + '@sanity/migrate': 8.0.5(@types/react@19.2.14)(xstate@5.33.3) + '@sanity/runtime-cli': 17.16.0(d1b5b9b4152816050c7388f1e5bbc206) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/schema-descriptor-utils': 1.3.3 + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/template-validator': 3.1.1 + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/workbench-cli': 2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.3.1)(terser@5.48.0)(tsx@4.23.12)(typescript@6.0.3)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)(yaml@2.9.0) '@sanity/worker-channels': 2.0.0 + '@sanity/workflow-cli': 0.36.0(@sanity/cli-core@3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(typescript@6.0.3))(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(react@19.3.1) + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@6.0.3) '@vercel/frameworks': 3.29.0 chokidar: 5.0.0 console-table-printer: 2.15.0 - date-fns: 4.4.0 - debug: 4.4.3(supports-color@8.1.1) - dotenv: 17.4.2 - eventsource: 4.1.0 - execa: 9.6.1 + eventsource: 5.1.2 + execa: 10.2.0 form-data: 4.0.5 get-latest-version: 6.0.1 - groq-js: 1.30.3 + groq-js: 2.0.0 gunzip-maybe: 1.4.2 import-meta-resolve: 4.2.0 is-installed-globally: 1.0.0 - isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) json5: 2.2.3 jsonc-parser: 3.3.1 lodash-es: 4.18.1 minimist: 1.2.8 - nanoid: 5.1.11 + obug: 3.0.0 oneline: 2.0.0 open: 11.0.0 p-map: 7.0.4 - package-directory: 8.2.0 peek-stream: 1.1.3 picomatch: 4.0.5 pluralize-esm: 9.0.5 pretty-ms: 9.3.0 promise-props-recursive: 2.0.2 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-is: 19.2.8 rxjs: 7.8.2 semver: 7.8.5 skills: 1.5.22 smol-toml: 1.6.1 string-argv: 0.3.2 + string-width: 7.2.0 tar: 7.5.22 - tar-fs: 3.1.2 tar-stream: 3.2.0 tinyglobby: 0.2.17 - tsx: 4.23.12 typeid-js: 1.2.0 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + valibot: 1.5.0(typescript@6.0.3) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) which: 6.0.1 + wrap-ansi: 9.0.2 yaml: 2.9.0 - zod: 4.4.3 + zod: 4.6.7 optionalDependencies: babel-plugin-react-compiler: 1.0.0 transitivePeerDependencies: @@ -11095,6 +11655,7 @@ snapshots: - '@babel/runtime' - '@noble/hashes' - '@rolldown/plugin-babel' + - '@sanity/workflow-blueprint' - '@types/node' - '@types/react' - '@vitejs/devtools' @@ -11103,60 +11664,275 @@ snapshots: - bufferutil - canvas - esbuild + - immer - jiti - less - oxfmt + - react - react-native-b4a - rolldown + - sanity - sass - sass-embedded - stylus - sugarss - supports-color - terser + - tsx - typescript + - use-sync-external-store - utf-8-validate - vitest - vue-tsc - xstate - '@sanity/client@7.26.2': - dependencies: - '@sanity/eventsource': 5.0.4 - get-it: 8.8.3 - nanoid: 3.3.18 - rxjs: 7.8.2 - - '@sanity/client@8.9.0': + '@sanity/cli@8.22.0(98a42d609e82eb66a4d860ff95d7690c)': dependencies: + '@oclif/core': 4.13.5 + '@oclif/plugin-help': 6.2.58 + '@oclif/plugin-not-found': 3.2.93(@types/node@25.5.0) + '@sanity/blueprints': 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-build': 6.5.0(411f116d525a086784c2a84e92ba57a0) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/client': 8.9.0 + '@sanity/codegen': 8.2.0(react@19.2.4)(typescript@5.9.3) + '@sanity/descriptors': 1.3.0 + '@sanity/export': 6.2.1 + '@sanity/generate-help-url': 4.0.0 + '@sanity/id-utils': 1.1.0 + '@sanity/import': 7.0.4(@sanity/client@8.9.0)(@types/react@19.2.14) + '@sanity/migrate': 8.0.5(@types/react@19.2.14)(xstate@5.33.3) + '@sanity/runtime-cli': 17.16.0(fc8c054cd54d2e83e7e4000bb08441df) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/schema-descriptor-utils': 1.3.3 + '@sanity/telemetry': 1.1.0(react@19.2.4) + '@sanity/template-validator': 3.1.1 + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/workbench-cli': 2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)(yaml@2.9.0) + '@sanity/worker-channels': 2.0.0 + '@sanity/workflow-cli': 0.36.0(@sanity/cli-core@3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(react@19.2.4) + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@5.9.3) + '@vercel/frameworks': 3.29.0 + chokidar: 5.0.0 + console-table-printer: 2.15.0 eventsource: 5.1.2 - get-it: 9.6.1 + execa: 10.2.0 + form-data: 4.0.5 + get-latest-version: 6.0.1 + groq-js: 2.0.0 + gunzip-maybe: 1.4.2 + import-meta-resolve: 4.2.0 + is-installed-globally: 1.0.0 + json5: 2.2.3 + jsonc-parser: 3.3.1 + lodash-es: 4.18.1 + minimist: 1.2.8 obug: 3.0.0 + oneline: 2.0.0 + open: 11.0.0 + p-map: 7.0.4 + peek-stream: 1.1.3 + picomatch: 4.0.5 + pluralize-esm: 9.0.5 + pretty-ms: 9.3.0 + promise-props-recursive: 2.0.2 rxjs: 7.8.2 + semver: 7.8.5 + skills: 1.5.22 + smol-toml: 1.6.1 + string-argv: 0.3.2 + string-width: 7.2.0 + tar: 7.5.22 + tar-stream: 3.2.0 + tinyglobby: 0.2.17 + typeid-js: 1.2.0 + valibot: 1.5.0(typescript@5.9.3) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + which: 6.0.1 + wrap-ansi: 9.0.2 + yaml: 2.9.0 + zod: 4.6.7 + optionalDependencies: + babel-plugin-react-compiler: 1.0.0 transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@noble/hashes' + - '@rolldown/plugin-babel' + - '@sanity/workflow-blueprint' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - bare-abort-controller + - bare-buffer + - bufferutil + - canvas + - esbuild + - immer + - jiti + - less + - oxfmt + - react + - react-native-b4a + - rolldown + - sanity + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate - vitest + - vue-tsc + - xstate - '@sanity/code-input@7.3.5(937dfac7d6df93ac847c841c1958fc37)': + '@sanity/cli@8.22.0(d04f60f2b4623a4231ecd6642258477f)': dependencies: - '@codemirror/lang-html': 6.4.12 - '@codemirror/lang-java': 6.0.2 - '@codemirror/lang-javascript': 6.2.5 - '@codemirror/lang-json': 6.0.2 - '@codemirror/lang-markdown': 6.5.2 - '@codemirror/lang-php': 6.0.2 - '@codemirror/lang-sql': 6.10.0 - '@codemirror/language': 6.12.4 + '@oclif/core': 4.13.5 + '@oclif/plugin-help': 6.2.58 + '@oclif/plugin-not-found': 3.2.93(@types/node@25.5.0) + '@sanity/blueprints': 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-build': 6.5.0(fe37103854ff8cc950f6ec45cf94f756) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/client': 8.9.0 + '@sanity/codegen': 8.2.0(react@19.2.8)(typescript@5.9.3) + '@sanity/descriptors': 1.3.0 + '@sanity/export': 6.2.1 + '@sanity/generate-help-url': 4.0.0 + '@sanity/id-utils': 1.1.0 + '@sanity/import': 7.0.4(@sanity/client@8.9.0)(@types/react@19.2.14) + '@sanity/migrate': 8.0.5(@types/react@19.2.14)(xstate@5.33.3) + '@sanity/runtime-cli': 17.16.0(03849a6528935b0f7bbbd798661c40ee) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/schema-descriptor-utils': 1.3.3 + '@sanity/telemetry': 1.1.0(react@19.2.8) + '@sanity/template-validator': 3.1.1 + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/workbench-cli': 2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.2.8)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3)(yaml@2.9.0) + '@sanity/worker-channels': 2.0.0 + '@sanity/workflow-cli': 0.36.0(@sanity/cli-core@3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(react@19.2.8) + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@5.9.3) + '@vercel/frameworks': 3.29.0 + chokidar: 5.0.0 + console-table-printer: 2.15.0 + eventsource: 5.1.2 + execa: 10.2.0 + form-data: 4.0.5 + get-latest-version: 6.0.1 + groq-js: 2.0.0 + gunzip-maybe: 1.4.2 + import-meta-resolve: 4.2.0 + is-installed-globally: 1.0.0 + json5: 2.2.3 + jsonc-parser: 3.3.1 + lodash-es: 4.18.1 + minimist: 1.2.8 + obug: 3.0.0 + oneline: 2.0.0 + open: 11.0.0 + p-map: 7.0.4 + peek-stream: 1.1.3 + picomatch: 4.0.5 + pluralize-esm: 9.0.5 + pretty-ms: 9.3.0 + promise-props-recursive: 2.0.2 + rxjs: 7.8.2 + semver: 7.8.5 + skills: 1.5.22 + smol-toml: 1.6.1 + string-argv: 0.3.2 + string-width: 7.2.0 + tar: 7.5.22 + tar-stream: 3.2.0 + tinyglobby: 0.2.17 + typeid-js: 1.2.0 + valibot: 1.5.0(typescript@5.9.3) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + which: 6.0.1 + wrap-ansi: 9.0.2 + yaml: 2.9.0 + zod: 4.6.7 + optionalDependencies: + babel-plugin-react-compiler: 1.0.0 + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@noble/hashes' + - '@rolldown/plugin-babel' + - '@sanity/workflow-blueprint' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - bare-abort-controller + - bare-buffer + - bufferutil + - canvas + - esbuild + - immer + - jiti + - less + - oxfmt + - react + - react-native-b4a + - rolldown + - sanity + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate + + '@sanity/client@7.26.2': + dependencies: + '@sanity/eventsource': 5.0.4 + get-it: 8.8.3 + nanoid: 3.3.18 + rxjs: 7.8.2 + + '@sanity/client@8.9.0': + dependencies: + eventsource: 5.1.2 + get-it: 9.6.1 + obug: 3.0.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - vitest + + '@sanity/code-input@7.3.5(a7523e9fd1235f415c4739c3e7045053)': + dependencies: + '@codemirror/lang-html': 6.4.12 + '@codemirror/lang-java': 6.0.2 + '@codemirror/lang-javascript': 6.2.5 + '@codemirror/lang-json': 6.0.2 + '@codemirror/lang-markdown': 6.5.2 + '@codemirror/lang-php': 6.0.2 + '@codemirror/lang-sql': 6.10.0 + '@codemirror/language': 6.12.4 '@codemirror/legacy-modes': 6.5.3 '@codemirror/state': 6.7.1 '@codemirror/view': 6.43.9 '@lezer/highlight': 1.2.3 '@sanity/icons': 5.2.1(react@19.2.4) '@sanity/lezer-groq': 1.0.4 - '@sanity/ui': 4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@sanity/ui': 4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@uiw/codemirror-themes': 4.25.11(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.9) - '@uiw/react-codemirror': 4.25.11(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.5)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.9)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@uiw/react-codemirror': 4.25.11(@babel/runtime@7.29.10)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.9)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + sanity: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@babel/runtime' @@ -11167,7 +11943,7 @@ snapshots: - codemirror - react-dom - '@sanity/codegen@7.0.3(@oclif/core@4.13.5)(@sanity/cli-core@2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0))(react@19.2.8)': + '@sanity/codegen@8.2.0(react@19.2.4)(typescript@5.9.3)': dependencies: '@babel/core': 7.29.7 '@babel/generator': 7.29.8 @@ -11177,44 +11953,89 @@ snapshots: '@babel/register': 7.29.7(@babel/core@7.29.7) '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 - '@oclif/core': 4.13.5 - '@sanity/cli-core': 2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) - '@sanity/telemetry': 1.1.0(react@19.2.8) + '@sanity/telemetry': 1.1.0(react@19.2.4) '@sanity/worker-channels': 2.0.0 chokidar: 3.6.0 - debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 groq: 6.9.2 - groq-js: 1.30.3 + groq-js: 2.0.0 json5: 2.2.3 lodash-es: 4.18.1 + obug: 3.0.0 prettier: 3.9.6 reselect: 5.2.0 tsconfig-paths: 4.2.0 - zod: 4.4.3 + valibot: 1.5.0(typescript@5.9.3) transitivePeerDependencies: - react - supports-color + - typescript - '@sanity/color@3.0.8': {} - - '@sanity/comlink@2.0.5': + '@sanity/codegen@8.2.0(react@19.2.8)(typescript@5.9.3)': dependencies: - rxjs: 7.8.2 - uuid: 11.1.0 - xstate: 5.32.5 + '@babel/core': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + '@babel/preset-react': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/register': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@sanity/telemetry': 1.1.0(react@19.2.8) + '@sanity/worker-channels': 2.0.0 + chokidar: 3.6.0 + globby: 11.1.0 + groq: 6.9.2 + groq-js: 2.0.0 + json5: 2.2.3 + lodash-es: 4.18.1 + obug: 3.0.0 + prettier: 3.9.6 + reselect: 5.2.0 + tsconfig-paths: 4.2.0 + valibot: 1.5.0(typescript@5.9.3) + transitivePeerDependencies: + - react + - supports-color + - typescript - '@sanity/comlink@3.1.1': + '@sanity/codegen@8.2.0(react@19.3.1)(typescript@6.0.3)': dependencies: - rxjs: 7.8.2 - uuid: 11.1.0 - xstate: 5.32.5 + '@babel/core': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/preset-env': 7.29.7(@babel/core@7.29.7) + '@babel/preset-react': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/register': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/worker-channels': 2.0.0 + chokidar: 3.6.0 + globby: 11.1.0 + groq: 6.9.2 + groq-js: 2.0.0 + json5: 2.2.3 + lodash-es: 4.18.1 + obug: 3.0.0 + prettier: 3.9.6 + reselect: 5.2.0 + tsconfig-paths: 4.2.0 + valibot: 1.5.0(typescript@6.0.3) + transitivePeerDependencies: + - react + - supports-color + - typescript + + '@sanity/color@3.0.8': {} + + '@sanity/color@3.0.9': {} '@sanity/comlink@4.0.3': dependencies: rxjs: 7.8.2 - uuid: 14.0.1 - xstate: 5.32.5 + uuid: 14.0.3 + xstate: 5.33.3 '@sanity/descriptors@1.3.0': dependencies: @@ -11224,17 +12045,17 @@ snapshots: '@sanity/diff-match-patch@3.2.1': {} - '@sanity/diff-patch@5.0.0': + '@sanity/diff-patch@6.0.0': dependencies: - '@sanity/diff-match-patch': 3.2.0 + '@sanity/diff-match-patch': 3.2.1 - '@sanity/diff-patch@6.0.0': + '@sanity/diff-patch@7.0.0': dependencies: '@sanity/diff-match-patch': 3.2.1 - '@sanity/diff@6.9.2': + '@sanity/diff@6.20.0': dependencies: - '@sanity/diff-match-patch': 3.2.0 + '@sanity/diff-match-patch': 3.2.1 '@sanity/eventsource@5.0.4': dependencies: @@ -11267,50 +12088,50 @@ snapshots: '@sanity/generate-help-url@4.0.0': {} - '@sanity/icons@3.7.4(react@19.2.4)': + '@sanity/groq-condition-describe@0.5.2': dependencies: - react: 19.2.4 + groq-js: 1.30.3 + transitivePeerDependencies: + - supports-color - '@sanity/icons@3.7.4(react@19.2.8)': + '@sanity/icons@5.2.1(react@19.2.4)': dependencies: - react: 19.2.8 + react: 19.2.4 - '@sanity/icons@5.2.1(react@19.2.4)': + '@sanity/icons@5.2.3(react@19.2.4)': dependencies: react: 19.2.4 - '@sanity/icons@5.2.1(react@19.2.8)': + '@sanity/icons@5.2.3(react@19.2.8)': dependencies: react: 19.2.8 - '@sanity/id-utils@1.0.0': + '@sanity/icons@5.2.3(react@19.3.1)': + dependencies: + react: 19.3.1 + + '@sanity/id-utils@1.1.0': dependencies: - '@sanity/uuid': 3.0.2 - lodash: 4.17.23 + '@sanity/uuid': 3.0.3 ts-brand: 0.2.0 '@sanity/image-url@2.1.1': dependencies: '@sanity/signed-urls': 2.0.2 - '@sanity/import@6.0.3(@sanity/client@7.26.2)(@types/react@19.2.14)': + '@sanity/import@7.0.4(@sanity/client@8.9.0)(@types/react@19.2.14)': dependencies: '@sanity/asset-utils': 2.3.0 - '@sanity/client': 7.26.2 + '@sanity/client': 8.9.0 '@sanity/generate-help-url': 4.0.0 - '@sanity/mutator': 6.9.2(@types/react@19.2.14) - debug: 4.4.3(supports-color@8.1.1) - get-it: 8.8.3 - gunzip-maybe: 1.4.2 - p-map: 7.0.4 - tar-fs: 3.1.2 - tinyglobby: 0.2.17 + '@sanity/mutator': 6.20.0(@types/react@19.2.14) + get-it: 9.6.1 + modern-tar: 0.8.6 + obug: 3.0.0 + p-map: 7.1.1 transitivePeerDependencies: - '@types/react' - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color + - vitest '@sanity/json-match@1.0.5': {} @@ -11321,60 +12142,56 @@ snapshots: '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 - '@sanity/logos@2.2.5(react@19.2.4)': + '@sanity/logos@2.2.6(react@19.2.4)': dependencies: - '@sanity/color': 3.0.8 + '@sanity/color': 3.0.9 react: 19.2.4 - '@sanity/logos@2.2.5(react@19.2.8)': + '@sanity/logos@2.2.6(react@19.2.8)': dependencies: - '@sanity/color': 3.0.8 + '@sanity/color': 3.0.9 react: 19.2.8 + '@sanity/logos@2.2.6(react@19.3.1)': + dependencies: + '@sanity/color': 3.0.9 + react: 19.3.1 + '@sanity/media-library-types@1.6.0': {} - '@sanity/message-protocol@0.12.0': + '@sanity/media-library-types@1.8.0(@sanity/types@5.28.0(@types/react@19.2.14))': dependencies: - '@sanity/comlink': 2.0.5 + '@sanity/types': 5.28.0(@types/react@19.2.14) - '@sanity/message-protocol@0.23.0': + '@sanity/media-library-types@1.8.0(@sanity/types@6.20.0(@types/react@19.2.14))': dependencies: - '@sanity/comlink': 4.0.3 + '@sanity/types': 6.20.0(@types/react@19.2.14) '@sanity/message-protocol@0.24.0': dependencies: '@sanity/comlink': 4.0.3 - '@sanity/migrate@8.0.2(@types/react@19.2.14)(xstate@5.32.5)': + '@sanity/migrate@8.0.5(@types/react@19.2.14)(xstate@5.33.3)': dependencies: - '@sanity/client': 7.26.2 - '@sanity/mutate': 0.18.1(xstate@5.32.5) - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/util': 6.9.2(@types/react@19.2.14) + '@sanity/client': 8.9.0 + '@sanity/mutate': 0.18.2(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/util': 6.20.0(@types/react@19.2.14) arrify: 3.0.0 - debug: 4.4.3(supports-color@8.1.1) - fast-fifo: 1.3.2 + get-it: 9.6.1 groq-js: 2.0.0 + modern-tar: 0.8.6 + obug: 3.0.0 p-map: 7.0.4 transitivePeerDependencies: - '@types/react' - - supports-color + - vitest - xstate - '@sanity/mutate@0.12.6': - dependencies: - '@sanity/client': 7.26.2 - '@sanity/diff-match-patch': 3.2.1 - '@sanity/uuid': 3.0.3 - hotscript: 1.0.13 - lodash: 4.18.1 - mendoza: 3.0.8 - nanoid: 5.1.11 - rxjs: 7.8.2 - - '@sanity/mutate@0.16.1(xstate@5.32.5)': + '@sanity/mutate@0.18.2(xstate@5.33.3)': dependencies: - '@sanity/client': 7.26.2 + '@isaacs/ttlcache': 2.1.5 + '@sanity/client': 8.9.0 '@sanity/diff-match-patch': 3.2.1 '@sanity/uuid': 3.0.3 hotscript: 1.0.13 @@ -11383,21 +12200,20 @@ snapshots: nanoid: 5.1.11 rxjs: 7.8.2 optionalDependencies: - xstate: 5.32.5 + xstate: 5.33.3 + transitivePeerDependencies: + - vitest - '@sanity/mutate@0.18.1(xstate@5.32.5)': + '@sanity/mutator@6.20.0(@types/react@19.2.14)': dependencies: - '@isaacs/ttlcache': 2.1.5 - '@sanity/client': 7.26.2 - '@sanity/diff-match-patch': 3.2.0 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/types': 6.20.0(@types/react@19.2.14) '@sanity/uuid': 3.0.3 - hotscript: 1.0.13 - lodash: 4.18.1 - mendoza: 3.0.8 - nanoid: 5.1.11 - rxjs: 7.8.2 - optionalDependencies: - xstate: 5.32.5 + dequal: 2.0.3 + obug: 3.0.0 + transitivePeerDependencies: + - '@types/react' + - vitest '@sanity/mutator@6.9.2(@types/react@19.2.14)': dependencies: @@ -11410,43 +12226,42 @@ snapshots: - '@types/react' - supports-color - '@sanity/presentation-comlink@2.2.3(@sanity/types@6.9.2(@types/react@19.2.14))': + '@sanity/presentation-comlink@2.2.3(@sanity/types@6.20.0(@types/react@19.2.14))': dependencies: '@sanity/client': 7.26.2 '@sanity/comlink': 4.0.3 - '@sanity/visual-editing-types': 2.0.14(@sanity/client@7.26.2)(@sanity/types@6.9.2(@types/react@19.2.14)) - xstate: 5.32.5 + '@sanity/visual-editing-types': 2.0.14(@sanity/client@7.26.2)(@sanity/types@6.20.0(@types/react@19.2.14)) + xstate: 5.33.3 transitivePeerDependencies: - '@sanity/types' - '@sanity/preview-url-secret@4.1.4(@sanity/client@7.26.2)': + '@sanity/preview-url-secret@4.1.5(@sanity/client@8.9.0)': dependencies: - '@sanity/client': 7.26.2 + '@sanity/client': 8.9.0 '@sanity/uuid': 3.0.3 '@sanity/prism-groq@1.1.2(prismjs@1.30.0)': optionalDependencies: prismjs: 1.30.0 - '@sanity/runtime-cli@17.7.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/runtime-cli@17.16.0(03849a6528935b0f7bbbd798661c40ee)': dependencies: '@architect/hydrate': 6.0.2 '@architect/inventory': 6.1.0 - '@inquirer/prompts': 8.5.2(@types/node@25.5.0) - '@oclif/core': 4.13.5 - '@oclif/plugin-help': 6.2.58 - '@sanity-labs/design-tokens': 0.0.2-alpha.2 - '@sanity-labs/oclif-plugin-skills-flag': 0.2.1(@oclif/core@4.13.5) - '@sanity/blueprints': 0.23.6(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@inquirer/prompts': 8.7.4(@types/node@25.5.0) + '@oclif/core': 4.14.0 + '@oclif/plugin-help': 6.3.0 + '@sanity-labs/oclif-plugin-skills-flag': 0.2.1(@oclif/core@4.14.0) + '@sanity/blueprints': 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) '@sanity/blueprints-parser': 0.5.0 - '@sanity/cli-build': 5.2.1(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0) - '@sanity/cli-core': 3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) + '@sanity/cli-build': 6.5.0(fe37103854ff8cc950f6ec45cf94f756) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) '@sanity/client': 8.9.0 - adm-zip: 0.6.0 + adm-zip: 0.6.1 array-treeify: 0.2.0 cardinal: 2.1.1 empathic: 2.0.1 - eventsource: 5.1.0 + eventsource: 5.1.2 groq-js: 2.0.0 jiti: 2.7.0 mime-types: 3.0.2 @@ -11454,8 +12269,8 @@ snapshots: signal-exit: 4.1.0 strip-ansi: 7.2.0 tar-fs: 3.1.3 - tar-stream: 3.2.0 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + tar-stream: 3.2.2 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) ws: 8.21.3 xdg-basedir: 5.1.0 transitivePeerDependencies: @@ -11472,9 +12287,138 @@ snapshots: - bufferutil - canvas - esbuild + - immer + - less + - oxc-transform-react + - react-native-b4a + - rolldown + - sanity + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate + - yaml + + '@sanity/runtime-cli@17.16.0(d1b5b9b4152816050c7388f1e5bbc206)': + dependencies: + '@architect/hydrate': 6.0.2 + '@architect/inventory': 6.1.0 + '@inquirer/prompts': 8.7.4(@types/node@25.5.0) + '@oclif/core': 4.14.0 + '@oclif/plugin-help': 6.3.0 + '@sanity-labs/oclif-plugin-skills-flag': 0.2.1(@oclif/core@4.14.0) + '@sanity/blueprints': 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/blueprints-parser': 0.5.0 + '@sanity/cli-build': 6.5.0(7948589135ae65c892d8c26bcac3a6f5) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/client': 8.9.0 + adm-zip: 0.6.1 + array-treeify: 0.2.0 + cardinal: 2.1.1 + empathic: 2.0.1 + eventsource: 5.1.2 + groq-js: 2.0.0 + jiti: 2.7.0 + mime-types: 3.0.2 + ora: 9.4.1 + signal-exit: 4.1.0 + strip-ansi: 7.2.0 + tar-fs: 3.1.3 + tar-stream: 3.2.2 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + ws: 8.21.3 + xdg-basedir: 5.1.0 + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@noble/hashes' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - babel-plugin-react-compiler + - bare-abort-controller + - bare-buffer + - bufferutil + - canvas + - esbuild + - immer + - less + - oxc-transform-react + - react-native-b4a + - rolldown + - sanity + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate + - yaml + + '@sanity/runtime-cli@17.16.0(fc8c054cd54d2e83e7e4000bb08441df)': + dependencies: + '@architect/hydrate': 6.0.2 + '@architect/inventory': 6.1.0 + '@inquirer/prompts': 8.7.4(@types/node@25.5.0) + '@oclif/core': 4.14.0 + '@oclif/plugin-help': 6.3.0 + '@sanity-labs/oclif-plugin-skills-flag': 0.2.1(@oclif/core@4.14.0) + '@sanity/blueprints': 0.28.0(jiti@2.7.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/blueprints-parser': 0.5.0 + '@sanity/cli-build': 6.5.0(411f116d525a086784c2a84e92ba57a0) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/client': 8.9.0 + adm-zip: 0.6.1 + array-treeify: 0.2.0 + cardinal: 2.1.1 + empathic: 2.0.1 + eventsource: 5.1.2 + groq-js: 2.0.0 + jiti: 2.7.0 + mime-types: 3.0.2 + ora: 9.4.1 + signal-exit: 4.1.0 + strip-ansi: 7.2.0 + tar-fs: 3.1.3 + tar-stream: 3.2.2 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + ws: 8.21.3 + xdg-basedir: 5.1.0 + transitivePeerDependencies: + - '@babel/core' + - '@babel/plugin-transform-runtime' + - '@babel/runtime' + - '@noble/hashes' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - babel-plugin-react-compiler + - bare-abort-controller + - bare-buffer + - bufferutil + - canvas + - esbuild + - immer - less + - oxc-transform-react - react-native-b4a - rolldown + - sanity - sass - sass-embedded - stylus @@ -11482,11 +12426,31 @@ snapshots: - terser - tsx - typescript + - use-sync-external-store - utf-8-validate - vitest - vue-tsc + - xstate - yaml + '@sanity/schema-descriptor-utils@1.3.3': {} + + '@sanity/schema@6.20.0(@types/react@19.2.14)': + dependencies: + '@sanity/descriptors': 1.3.0 + '@sanity/generate-help-url': 4.0.0 + '@sanity/types': 6.20.0(@types/react@19.2.14) + arrify: 3.0.0 + dequal: 2.0.3 + get-it: 9.6.1 + groq-js: 2.0.0 + humanize-list: 1.0.1 + leven: 4.1.0 + lodash-es: 4.18.1 + transitivePeerDependencies: + - '@types/react' + - vitest + '@sanity/schema@6.9.2(@types/react@19.2.14)': dependencies: '@sanity/descriptors': 1.3.0 @@ -11502,97 +12466,169 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@sanity/sdk-react@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))': + '@sanity/sdk-react@3.9.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)': dependencies: - '@sanity/client': 7.26.2 - '@sanity/message-protocol': 0.12.0 - '@sanity/sdk': 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) - '@sanity/types': 3.99.0(@types/react@19.2.14) - '@types/lodash-es': 4.17.12 - groq: 3.88.1-typegen-experimental.0 - lodash-es: 4.18.1 + '@module-federation/runtime': 2.9.2 + '@sanity/client': 8.9.0 + '@sanity/message-protocol': 0.24.0 + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + react: 19.2.4 + react-compiler-runtime: 1.0.0(react@19.2.4) + react-dom: 19.2.4(react@19.2.4) + react-error-boundary: 6.1.6(@types/react@19.2.14)(react@19.2.4) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + - vitest + - xstate + + '@sanity/sdk-react@3.9.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3)': + dependencies: + '@module-federation/runtime': 2.9.2 + '@sanity/client': 8.9.0 + '@sanity/message-protocol': 0.24.0 + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) react: 19.2.8 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.8) + react-compiler-runtime: 1.0.0(react@19.2.8) react-dom: 19.2.8(react@19.2.8) - react-error-boundary: 5.0.0(react@19.2.8) + react-error-boundary: 6.1.6(@types/react@19.2.14)(react@19.2.8) rxjs: 7.8.2 transitivePeerDependencies: - '@types/react' - immer - use-sync-external-store + - vitest + - xstate - '@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))': + '@sanity/sdk-react@3.9.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)': dependencies: - '@sanity/client': 7.26.2 - '@sanity/comlink': 3.1.1 - '@sanity/diff-match-patch': 3.2.1 - '@sanity/message-protocol': 0.12.0 - '@sanity/mutate': 0.12.6 - '@sanity/types': 3.99.0(@types/react@19.2.14) - '@types/lodash-es': 4.17.12 - groq: 3.88.1-typegen-experimental.0 - lodash-es: 4.18.1 - reselect: 5.2.0 + '@module-federation/runtime': 2.9.2 + '@sanity/client': 8.9.0 + '@sanity/message-protocol': 0.24.0 + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + react: 19.3.1 + react-compiler-runtime: 1.0.0(react@19.3.1) + react-dom: 19.2.8(react@19.3.1) + react-error-boundary: 6.1.6(@types/react@19.2.14)(react@19.3.1) rxjs: 7.8.2 - zustand: 5.0.14(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) transitivePeerDependencies: - '@types/react' - immer - - react - use-sync-external-store + - vitest + - xstate - '@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5)': + '@sanity/sdk@3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)': dependencies: '@sanity/bifur-client': 1.0.0 - '@sanity/client': 7.26.2 + '@sanity/client': 8.9.0 '@sanity/comlink': 4.0.3 '@sanity/diff-match-patch': 3.2.1 '@sanity/diff-patch': 6.0.0 - '@sanity/id-utils': 1.0.0 + '@sanity/id-utils': 1.1.0 '@sanity/image-url': 2.1.1 '@sanity/json-match': 1.0.5 - '@sanity/message-protocol': 0.23.0 - '@sanity/mutate': 0.16.1(xstate@5.32.5) + '@sanity/message-protocol': 0.24.0 + '@sanity/mutate': 0.18.2(xstate@5.33.3) '@sanity/telemetry': 1.1.0(react@19.2.4) - '@sanity/types': 5.28.0(@types/react@19.2.14) - groq: 3.88.1-typegen-experimental.0 - groq-js: 1.30.3 - reselect: 5.2.0 + '@sanity/types': 6.20.0(@types/react@19.2.14) + groq: 6.20.0 + groq-js: 2.0.0 + reselect: 5.3.0 rxjs: 7.8.2 - zustand: 5.0.14(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + zustand: 5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1)) transitivePeerDependencies: - '@types/react' - immer - react - - supports-color - use-sync-external-store + - vitest - xstate - '@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5)': + '@sanity/sdk@3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3)': dependencies: '@sanity/bifur-client': 1.0.0 - '@sanity/client': 7.26.2 + '@sanity/client': 8.9.0 '@sanity/comlink': 4.0.3 '@sanity/diff-match-patch': 3.2.1 '@sanity/diff-patch': 6.0.0 - '@sanity/id-utils': 1.0.0 + '@sanity/id-utils': 1.1.0 '@sanity/image-url': 2.1.1 '@sanity/json-match': 1.0.5 - '@sanity/message-protocol': 0.23.0 - '@sanity/mutate': 0.16.1(xstate@5.32.5) + '@sanity/message-protocol': 0.24.0 + '@sanity/mutate': 0.18.2(xstate@5.33.3) '@sanity/telemetry': 1.1.0(react@19.2.8) - '@sanity/types': 5.28.0(@types/react@19.2.14) - groq: 3.88.1-typegen-experimental.0 - groq-js: 1.30.3 - reselect: 5.2.0 + '@sanity/types': 6.20.0(@types/react@19.2.14) + groq: 6.20.0 + groq-js: 2.0.0 + reselect: 5.3.0 rxjs: 7.8.2 - zustand: 5.0.14(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + zustand: 5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8)) + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + - vitest + - xstate + + '@sanity/sdk@3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3)': + dependencies: + '@sanity/bifur-client': 1.0.0 + '@sanity/client': 8.9.0 + '@sanity/comlink': 4.0.3 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/diff-patch': 6.0.0 + '@sanity/id-utils': 1.1.0 + '@sanity/image-url': 2.1.1 + '@sanity/json-match': 1.0.5 + '@sanity/message-protocol': 0.24.0 + '@sanity/mutate': 0.18.2(xstate@5.33.3) + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/types': 6.20.0(@types/react@19.2.14) + groq: 6.20.0 + groq-js: 2.0.0 + reselect: 5.3.0 + rxjs: 7.8.2 + zustand: 5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.2.8)) + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + - vitest + - xstate + + '@sanity/sdk@3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)': + dependencies: + '@sanity/bifur-client': 1.0.0 + '@sanity/client': 8.9.0 + '@sanity/comlink': 4.0.3 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/diff-patch': 6.0.0 + '@sanity/id-utils': 1.1.0 + '@sanity/image-url': 2.1.1 + '@sanity/json-match': 1.0.5 + '@sanity/message-protocol': 0.24.0 + '@sanity/mutate': 0.18.2(xstate@5.33.3) + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/types': 6.20.0(@types/react@19.2.14) + groq: 6.20.0 + groq-js: 2.0.0 + reselect: 5.3.0 + rxjs: 7.8.2 + zustand: 5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1)) transitivePeerDependencies: - '@types/react' - immer - react - - supports-color - use-sync-external-store + - vitest - xstate '@sanity/signed-urls@2.0.2': @@ -11614,23 +12650,30 @@ snapshots: optionalDependencies: react: 19.2.8 - '@sanity/template-validator@3.1.0': + '@sanity/telemetry@1.1.0(react@19.3.1)': + dependencies: + rxjs: 7.8.2 + typeid-js: 0.3.0 + optionalDependencies: + react: 19.3.1 + + '@sanity/template-validator@3.1.1': dependencies: - '@actions/core': 3.0.0 - '@actions/github': 9.0.0 yaml: 2.9.0 - '@sanity/types@3.99.0(@types/react@19.2.14)': + '@sanity/types@5.28.0(@types/react@19.2.14)': dependencies: '@sanity/client': 7.26.2 - '@sanity/media-library-types': 1.6.0 + '@sanity/media-library-types': 1.8.0(@sanity/types@5.28.0(@types/react@19.2.14)) '@types/react': 19.2.14 - '@sanity/types@5.28.0(@types/react@19.2.14)': + '@sanity/types@6.20.0(@types/react@19.2.14)': dependencies: - '@sanity/client': 7.26.2 - '@sanity/media-library-types': 1.6.0 + '@sanity/client': 8.9.0 + '@sanity/media-library-types': 1.8.0(@sanity/types@6.20.0(@types/react@19.2.14)) '@types/react': 19.2.14 + transitivePeerDependencies: + - vitest '@sanity/types@6.9.2(@types/react@19.2.14)': dependencies: @@ -11638,126 +12681,210 @@ snapshots: '@sanity/media-library-types': 1.6.0 '@types/react': 19.2.14 - '@sanity/ui@3.5.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + '@sanity/ui@4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@sanity/color': 3.0.9 + '@sanity/icons': 5.2.3(react@19.2.4) + clsx: 2.1.1 + csstype: 3.2.3 + motion: 14.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-is: 19.3.1 + react-refractor: 4.0.0(react@19.2.4) + styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + use-effect-event: 2.0.4(react@19.2.4) + + '@sanity/ui@4.4.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': dependencies: '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@juggle/resize-observer': 3.4.0 - '@sanity/color': 3.0.8 - '@sanity/icons': 5.2.1(react@19.2.8) + '@sanity/color': 3.0.9 + '@sanity/icons': 5.2.3(react@19.2.8) + clsx: 2.1.1 csstype: 3.2.3 - motion: 13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + motion: 14.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 - react-compiler-runtime: 1.0.0(react@19.2.8) react-dom: 19.2.8(react@19.2.8) - react-is: 19.2.8 + react-is: 19.3.1 react-refractor: 4.0.0(react@19.2.8) styled-components: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) use-effect-event: 2.0.4(react@19.2.8) - '@sanity/ui@4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@sanity/ui@4.4.10(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1))': dependencies: - '@floating-ui/react-dom': 2.1.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@sanity/color': 3.0.8 - '@sanity/icons': 5.2.1(react@19.2.4) + '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + '@sanity/color': 3.0.9 + '@sanity/icons': 5.2.3(react@19.3.1) + clsx: 2.1.1 csstype: 3.2.3 - motion: 13.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + motion: 14.5.0(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) + react-is: 19.3.1 + react-refractor: 4.0.0(react@19.3.1) + styled-components: 6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + use-effect-event: 2.0.4(react@19.3.1) + + '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@sanity-labs/design-tokens': 0.0.2-alpha.6 + '@sanity/icons': 5.2.3(react@19.2.4) + clsx: 2.1.1 + comment-json: 5.0.0 + dialog-closedby-polyfill: 1.3.0 + interestfor: 1.0.10 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-is: 19.2.8 react-refractor: 4.0.0(react@19.2.4) - styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - use-effect-event: 2.0.3(react@19.2.4) - '@sanity/ui@4.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@sanity/color': 3.0.8 - '@sanity/icons': 5.2.1(react@19.2.8) - csstype: 3.2.3 - motion: 13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@sanity-labs/design-tokens': 0.0.2-alpha.6 + '@sanity/icons': 5.2.3(react@19.2.8) + clsx: 2.1.1 + comment-json: 5.0.0 + dialog-closedby-polyfill: 1.3.0 + interestfor: 1.0.10 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - react-is: 19.2.8 react-refractor: 4.0.0(react@19.2.8) - styled-components: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - use-effect-event: 2.0.3(react@19.2.8) - '@sanity/util@6.9.2(@types/react@19.2.14)': + '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.8(react@19.3.1))(react@19.3.1)': + dependencies: + '@sanity-labs/design-tokens': 0.0.2-alpha.6 + '@sanity/icons': 5.2.3(react@19.3.1) + clsx: 2.1.1 + comment-json: 5.0.0 + dialog-closedby-polyfill: 1.3.0 + interestfor: 1.0.10 + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) + react-refractor: 4.0.0(react@19.3.1) + + '@sanity/util@6.20.0(@types/react@19.2.14)': dependencies: '@date-fns/tz': 1.5.0 '@date-fns/utc': 2.1.1 - '@sanity/client': 7.26.2 - '@sanity/types': 6.9.2(@types/react@19.2.14) + '@sanity/client': 8.9.0 + '@sanity/types': 6.20.0(@types/react@19.2.14) date-fns: 4.4.0 + get-it: 9.6.1 rxjs: 7.8.2 transitivePeerDependencies: - '@types/react' - - '@sanity/uuid@3.0.2': - dependencies: - '@types/uuid': 8.3.4 - uuid: 8.3.2 + - vitest '@sanity/uuid@3.0.3': dependencies: uuid: 11.1.0 - '@sanity/vision@6.9.2(@babel/runtime@7.29.2)(@codemirror/lint@6.9.5)(@codemirror/theme-one-dark@6.1.3)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@sanity/validation@6.20.0(@types/react@19.2.14)(typescript@5.9.3)': + dependencies: + '@sanity/client': 8.9.0 + '@sanity/id-utils': 1.1.0 + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/util': 6.20.0(@types/react@19.2.14) + dequal: 2.0.3 + i18next: 26.5.4(typescript@5.9.3) + lodash-es: 4.18.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - typescript + - vitest + + '@sanity/validation@6.20.0(@types/react@19.2.14)(typescript@6.0.3)': + dependencies: + '@sanity/client': 8.9.0 + '@sanity/id-utils': 1.1.0 + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/util': 6.20.0(@types/react@19.2.14) + dequal: 2.0.3 + i18next: 26.5.4(typescript@6.0.3) + lodash-es: 4.18.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/react' + - typescript + - vitest + + '@sanity/vision@6.20.0(@babel/runtime@7.29.10)(@codemirror/theme-one-dark@6.1.3)(@shikijs/themes@4.4.3)(@types/react@19.2.14)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@codemirror/autocomplete': 6.20.3 - '@codemirror/commands': 6.11.0 + '@codemirror/commands': 6.11.1 '@codemirror/lang-javascript': 6.2.5 - '@codemirror/language': 6.12.4 - '@codemirror/search': 6.7.1 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/language': 6.13.1 + '@codemirror/lint': 6.9.7 + '@codemirror/search': 6.7.2 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.15 '@lezer/highlight': 1.2.3 + '@pierre/diffs': 1.6.0(@shikijs/themes@4.4.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@rexxars/react-json-inspector': 9.0.1(react@19.2.4) '@rexxars/react-split-pane': 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@sanity/client': 7.26.2 - '@sanity/color': 3.0.8 - '@sanity/icons': 5.2.1(react@19.2.4) + '@sanity-labs/groq-wasm': 1.0.1 + '@sanity/client': 8.9.0 + '@sanity/color': 3.0.9 + '@sanity/icons': 5.2.3(react@19.2.4) '@sanity/lezer-groq': 1.0.4 - '@sanity/ui': 4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/ui': 4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@sanity/uuid': 3.0.3 - '@uiw/react-codemirror': 4.25.11(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.5)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.9)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@uiw/react-codemirror': 4.25.12(@babel/runtime@7.29.10)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.13.1)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.6)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.15)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vanilla-extract/dynamic': 2.1.5 + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.33.3) + cobe: 2.0.1 + dequal: 2.0.3 + groq-js: 2.0.0 is-hotkey-esm: 1.0.0 json-2-csv: 5.5.10 json5: 2.2.3 lodash-es: 4.18.1 + motion: 14.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) quick-lru: 7.3.0 react: 19.2.4 - react-rx: 5.1.1(react@19.2.4)(rxjs@7.8.2) + react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.2.4) + react-rx: 7.1.0(react@19.2.4)(rxjs@7.8.2) rxjs: 7.8.2 - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) - use-effect-event: 2.0.3(react@19.2.4) + sanity: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) + ui5: '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)' + use-effect-event: 2.0.4(react@19.2.4) + xstate: 5.33.3 transitivePeerDependencies: - '@babel/runtime' - - '@codemirror/lint' - '@codemirror/theme-one-dark' + - '@shikijs/themes' + - '@types/react' - codemirror - react-dom - styled-components + - vitest '@sanity/visual-editing-standalone@2.0.1': {} - '@sanity/visual-editing-types@2.0.14(@sanity/client@7.26.2)(@sanity/types@6.9.2(@types/react@19.2.14))': + '@sanity/visual-editing-types@2.0.14(@sanity/client@7.26.2)(@sanity/types@6.20.0(@types/react@19.2.14))': dependencies: '@sanity/client': 7.26.2 optionalDependencies: - '@sanity/types': 6.9.2(@types/react@19.2.14) + '@sanity/types': 6.20.0(@types/react@19.2.14) - '@sanity/workbench-cli@1.10.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/workbench-cli@2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.2.4)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)(yaml@2.9.0)': dependencies: - '@module-federation/vite': 1.20.1(typescript@5.9.3)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) - '@sanity/cli-core': 2.8.1(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@vitejs/plugin-react': 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@module-federation/runtime': 2.9.2 + '@module-federation/vite': 1.23.5(typescript@5.9.3)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) form-data: 4.0.5 - tar-fs: 3.1.2 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - zod: 4.4.3 + rxjs: 7.8.2 + semver: 7.8.5 + tar: 7.5.22 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 transitivePeerDependencies: - '@noble/hashes' - '@rolldown/plugin-babel' @@ -11765,36 +12892,42 @@ snapshots: - '@types/react' - '@vitejs/devtools' - babel-plugin-react-compiler - - bare-abort-controller - - bare-buffer - bufferutil - canvas - esbuild + - immer - jiti - less - - react-native-b4a + - oxc-transform-react + - react - sass - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - typescript + - use-sync-external-store - utf-8-validate + - vitest - vue-tsc + - xstate - yaml - '@sanity/workbench-cli@2.0.1(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(yaml@2.9.0)': + '@sanity/workbench-cli@2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.2.8)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3)(yaml@2.9.0)': dependencies: - '@module-federation/vite': 1.20.7(typescript@5.9.3)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) - '@sanity/cli-core': 3.1.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(yaml@2.9.0) - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@vitejs/plugin-react': 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@module-federation/runtime': 2.9.2 + '@module-federation/vite': 1.23.5(typescript@5.9.3)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) form-data: 4.0.5 - tar-fs: 3.1.2 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - zod: 4.4.3 + rxjs: 7.8.2 + semver: 7.8.5 + tar: 7.5.22 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 transitivePeerDependencies: - '@noble/hashes' - '@rolldown/plugin-babel' @@ -11802,14 +12935,143 @@ snapshots: - '@types/react' - '@vitejs/devtools' - babel-plugin-react-compiler - - bare-abort-controller - - bare-buffer - bufferutil - canvas - esbuild + - immer - jiti - less - - react-native-b4a + - oxc-transform-react + - react + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate + - yaml + + '@sanity/workbench-cli@2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.3.1)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3)(yaml@2.9.0)': + dependencies: + '@module-federation/runtime': 2.9.2 + '@module-federation/vite': 1.23.5(typescript@5.9.3)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + form-data: 4.0.5 + rxjs: 7.8.2 + semver: 7.8.5 + tar: 7.5.22 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 + transitivePeerDependencies: + - '@noble/hashes' + - '@rolldown/plugin-babel' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - babel-plugin-react-compiler + - bufferutil + - canvas + - esbuild + - immer + - jiti + - less + - oxc-transform-react + - react + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate + - yaml + + '@sanity/workbench-cli@2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.3.1)(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)(yaml@2.9.0)': + dependencies: + '@module-federation/runtime': 2.9.2 + '@module-federation/vite': 1.23.5(typescript@5.9.3)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + form-data: 4.0.5 + rxjs: 7.8.2 + semver: 7.8.5 + tar: 7.5.22 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 + transitivePeerDependencies: + - '@noble/hashes' + - '@rolldown/plugin-babel' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - babel-plugin-react-compiler + - bufferutil + - canvas + - esbuild + - immer + - jiti + - less + - oxc-transform-react + - react + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - use-sync-external-store + - utf-8-validate + - vitest + - vue-tsc + - xstate + - yaml + + '@sanity/workbench-cli@2.12.0(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(react@19.3.1)(terser@5.48.0)(tsx@4.23.12)(typescript@6.0.3)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3)(yaml@2.9.0)': + dependencies: + '@module-federation/runtime': 2.9.2 + '@module-federation/vite': 1.23.5(typescript@6.0.3)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@vitejs/plugin-react': 6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + form-data: 4.0.5 + rxjs: 7.8.2 + semver: 7.8.5 + tar: 7.5.22 + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + zod: 4.6.7 + transitivePeerDependencies: + - '@noble/hashes' + - '@rolldown/plugin-babel' + - '@types/node' + - '@types/react' + - '@vitejs/devtools' + - babel-plugin-react-compiler + - bufferutil + - canvas + - esbuild + - immer + - jiti + - less + - oxc-transform-react + - react - sass - sass-embedded - stylus @@ -11817,107 +13079,164 @@ snapshots: - terser - tsx - typescript + - use-sync-external-store - utf-8-validate - vitest - vue-tsc + - xstate - yaml - '@sanity/workbench@0.1.0-alpha.36(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(react@19.2.8)(xstate@5.32.5)': + '@sanity/worker-channels@2.0.0': {} + + '@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@sanity/client': 7.26.2 + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(typescript@6.0.3)': + dependencies: + '@sanity/client': 7.26.2 + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@6.0.3) + optionalDependencies: + typescript: 6.0.3 + + '@sanity/workflow-cli@0.36.0(@sanity/cli-core@3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(react@19.2.4)': + dependencies: + '@oclif/core': 4.13.5 + '@oclif/plugin-help': 6.2.58 + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + '@sanity/client': 7.26.2 + '@sanity/telemetry': 1.1.0(react@19.2.4) + '@sanity/workflow-blueprint': 0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3) + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@5.9.3) + '@typescript/typescript6': 6.0.2 + boxen: 8.0.1 + diff: 9.0.0 + jiti: 2.7.0 + log-symbols: 7.0.1 + ora: 9.4.1 + transitivePeerDependencies: + - react + + '@sanity/workflow-cli@0.36.0(@sanity/cli-core@3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(react@19.2.8)': dependencies: - '@module-federation/runtime': 2.8.2 + '@oclif/core': 4.13.5 + '@oclif/plugin-help': 6.2.58 + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) '@sanity/client': 7.26.2 - '@sanity/color': 3.0.8 - '@sanity/sdk': 1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) '@sanity/telemetry': 1.1.0(react@19.2.8) - es-toolkit: 1.51.0 - rxjs: 7.8.2 - verkit: 0.3.2 - xstate: 5.32.5 - zod: 4.4.3 + '@sanity/workflow-blueprint': 0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3) + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@5.9.3) + '@typescript/typescript6': 6.0.2 + boxen: 8.0.1 + diff: 9.0.0 + jiti: 2.7.0 + log-symbols: 7.0.1 + ora: 9.4.1 transitivePeerDependencies: - react - '@sanity/workbench@0.1.0-alpha.36(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(react@19.2.4)(xstate@5.32.5)': + '@sanity/workflow-cli@0.36.0(@sanity/cli-core@3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(typescript@6.0.3))(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(react@19.3.1)': dependencies: - '@module-federation/runtime': 2.8.2 + '@oclif/core': 4.13.5 + '@oclif/plugin-help': 6.2.58 + '@sanity/cli-core': 3.11.0(@noble/hashes@2.4.0)(@types/node@25.5.0)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) '@sanity/client': 7.26.2 - '@sanity/color': 3.0.8 - '@sanity/sdk': 2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5) - '@sanity/telemetry': 1.1.0(react@19.2.4) - es-toolkit: 1.51.0 - rxjs: 7.8.2 - verkit: 0.3.2 - xstate: 5.32.5 - zod: 4.4.3 + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/workflow-blueprint': 0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(typescript@6.0.3) + '@sanity/workflow-engine': 0.36.0(@types/react@19.2.14)(typescript@6.0.3) + '@typescript/typescript6': 6.0.2 + boxen: 8.0.1 + diff: 9.0.0 + jiti: 2.7.0 + log-symbols: 7.0.1 + ora: 9.4.1 transitivePeerDependencies: - react - '@sanity/workbench@0.1.0-alpha.36(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(react@19.2.8)(xstate@5.32.5)': + '@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3)': dependencies: - '@module-federation/runtime': 2.8.2 - '@sanity/client': 7.26.2 - '@sanity/color': 3.0.8 - '@sanity/sdk': 2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5) - '@sanity/telemetry': 1.1.0(react@19.2.8) - es-toolkit: 1.51.0 - rxjs: 7.8.2 - verkit: 0.3.2 - xstate: 5.32.5 - zod: 4.4.3 + '@sanity/groq-condition-describe': 0.5.2 + '@sanity/id-utils': 1.1.0 + '@sanity/types': 5.28.0(@types/react@19.2.14) + groq-js: 1.30.3 + valibot: 1.5.0(typescript@5.9.3) transitivePeerDependencies: - - react + - '@types/react' + - supports-color + - typescript - '@sanity/worker-channels@2.0.0': {} + '@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3)': + dependencies: + '@sanity/groq-condition-describe': 0.5.2 + '@sanity/id-utils': 1.1.0 + '@sanity/types': 5.28.0(@types/react@19.2.14) + groq-js: 1.30.3 + valibot: 1.5.0(typescript@6.0.3) + transitivePeerDependencies: + - '@types/react' + - supports-color + - typescript '@sec-ant/readable-stream@0.4.1': {} - '@sentry/browser-utils@10.70.0': + '@sentry/browser-utils@11.8.0': dependencies: - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 + '@sentry/conventions': 0.27.0 + '@sentry/core': 11.8.0 + web-vitals: 6.2.3 - '@sentry/browser@10.70.0': + '@sentry/browser@11.8.0': dependencies: - '@sentry/browser-utils': 10.70.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 - '@sentry/feedback': 10.70.0 - '@sentry/replay': 10.70.0 - '@sentry/replay-canvas': 10.70.0 + '@sentry/browser-utils': 11.8.0 + '@sentry/conventions': 0.27.0 + '@sentry/core': 11.8.0 + '@sentry/feedback': 11.8.0 + '@sentry/replay': 11.8.0 + '@sentry/replay-canvas': 11.8.0 - '@sentry/conventions@0.16.0': {} + '@sentry/conventions@0.27.0': {} - '@sentry/core@10.70.0': + '@sentry/core@11.8.0': dependencies: - '@sentry/conventions': 0.16.0 + '@sentry/conventions': 0.27.0 - '@sentry/feedback@10.70.0': + '@sentry/feedback@11.8.0': dependencies: - '@sentry/core': 10.70.0 + '@sentry/core': 11.8.0 - '@sentry/react@10.70.0(react@19.2.4)': + '@sentry/react@11.8.0(react@19.2.4)': dependencies: - '@sentry/browser': 10.70.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 + '@sentry/browser': 11.8.0 + '@sentry/conventions': 0.27.0 + '@sentry/core': 11.8.0 react: 19.2.4 - '@sentry/react@10.70.0(react@19.2.8)': + '@sentry/react@11.8.0(react@19.2.8)': dependencies: - '@sentry/browser': 10.70.0 - '@sentry/conventions': 0.16.0 - '@sentry/core': 10.70.0 + '@sentry/browser': 11.8.0 + '@sentry/conventions': 0.27.0 + '@sentry/core': 11.8.0 react: 19.2.8 - '@sentry/replay-canvas@10.70.0': + '@sentry/react@11.8.0(react@19.3.1)': + dependencies: + '@sentry/browser': 11.8.0 + '@sentry/conventions': 0.27.0 + '@sentry/core': 11.8.0 + react: 19.3.1 + + '@sentry/replay-canvas@11.8.0': dependencies: - '@sentry/core': 10.70.0 - '@sentry/replay': 10.70.0 + '@sentry/core': 11.8.0 + '@sentry/replay': 11.8.0 - '@sentry/replay@10.70.0': + '@sentry/replay@11.8.0': dependencies: - '@sentry/browser-utils': 10.70.0 - '@sentry/core': 10.70.0 + '@sentry/browser-utils': 11.8.0 + '@sentry/core': 11.8.0 '@shikijs/core@4.4.3': dependencies: @@ -12040,12 +13359,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.3.0 - '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.3(vite@8.3.5(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 8.2.1(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + vite: 8.3.5(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) '@tanem/react-nprogress@5.0.63(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -12054,33 +13373,25 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@tanstack/react-table@8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-virtual@3.14.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tanstack/table-core': 8.21.3 + '@tanstack/virtual-core': 3.19.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@tanstack/react-table@8.21.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@tanstack/react-virtual@3.14.21(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@tanstack/table-core': 8.21.3 + '@tanstack/virtual-core': 3.19.6 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - '@tanstack/react-virtual@3.14.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@tanstack/virtual-core': 3.17.7 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@tanstack/react-virtual@3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@tanstack/react-virtual@3.14.21(react-dom@19.2.8(react@19.3.1))(react@19.3.1)': dependencies: - '@tanstack/virtual-core': 3.17.7 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@tanstack/virtual-core': 3.19.6 + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) - '@tanstack/table-core@8.21.3': {} - - '@tanstack/virtual-core@3.17.7': {} + '@tanstack/virtual-core@3.19.6': {} '@tybys/wasm-util@0.10.3': dependencies: @@ -12132,25 +13443,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/linkify-it@5.0.0': {} - - '@types/lodash-es@4.17.12': - dependencies: - '@types/lodash': 4.17.26 - - '@types/lodash@4.17.26': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/mdurl@2.0.0': {} - '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': @@ -12193,32 +13489,61 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@types/uuid@8.3.4': {} + '@typescript/typescript6@6.0.2': + dependencies: + '@typescript/old': typescript@6.0.3 - '@uiw/codemirror-extensions-basic-setup@4.25.11(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.5)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/view@6.43.9)': + '@uiw/codemirror-extensions-basic-setup@4.25.11(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.1)(@codemirror/view@6.43.9)': dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/commands': 6.10.3 '@codemirror/language': 6.12.4 - '@codemirror/lint': 6.9.5 - '@codemirror/search': 6.7.1 + '@codemirror/lint': 6.9.7 + '@codemirror/search': 6.7.2 '@codemirror/state': 6.7.1 '@codemirror/view': 6.43.9 + '@uiw/codemirror-extensions-basic-setup@4.25.12(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.11.1)(@codemirror/language@6.13.1)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.6)(@codemirror/view@6.43.15)': + dependencies: + '@codemirror/autocomplete': 6.20.3 + '@codemirror/commands': 6.11.1 + '@codemirror/language': 6.13.1 + '@codemirror/lint': 6.9.7 + '@codemirror/search': 6.7.2 + '@codemirror/state': 6.7.6 + '@codemirror/view': 6.43.15 + '@uiw/codemirror-themes@4.25.11(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.9)': dependencies: '@codemirror/language': 6.12.4 '@codemirror/state': 6.7.1 '@codemirror/view': 6.43.9 - '@uiw/react-codemirror@4.25.11(@babel/runtime@7.29.2)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.5)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.9)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@uiw/react-codemirror@4.25.11(@babel/runtime@7.29.10)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.9)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.10 '@codemirror/commands': 6.10.3 '@codemirror/state': 6.7.1 '@codemirror/theme-one-dark': 6.1.3 '@codemirror/view': 6.43.9 - '@uiw/codemirror-extensions-basic-setup': 4.25.11(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.5)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/view@6.43.9) + '@uiw/codemirror-extensions-basic-setup': 4.25.11(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.10.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.1)(@codemirror/view@6.43.9) + codemirror: 6.0.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + + '@uiw/react-codemirror@4.25.12(@babel/runtime@7.29.10)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.13.1)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.6)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.15)(codemirror@6.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.29.10 + '@codemirror/commands': 6.11.1 + '@codemirror/state': 6.7.6 + '@codemirror/theme-one-dark': 6.1.3 + '@codemirror/view': 6.43.15 + '@uiw/codemirror-extensions-basic-setup': 4.25.12(@codemirror/autocomplete@6.20.3)(@codemirror/commands@6.11.1)(@codemirror/language@6.13.1)(@codemirror/lint@6.9.7)(@codemirror/search@6.7.2)(@codemirror/state@6.7.6)(@codemirror/view@6.43.15) codemirror: 6.0.2 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -12260,12 +13585,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': + '@vitejs/plugin-react@6.1.2(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) + vite: 8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) optionalDependencies: - '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) + '@rolldown/plugin-babel': 0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) babel-plugin-react-compiler: 1.0.0 '@volar/kit@2.4.28(typescript@5.9.3)': @@ -12320,23 +13645,33 @@ snapshots: '@workflow/serde@4.1.0': {} - '@xstate/react@6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.32.5)': + '@xstate/react@6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.33.3)': dependencies: react: 19.2.4 use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.14)(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.2.4) optionalDependencies: - xstate: 5.32.5 + xstate: 5.33.3 transitivePeerDependencies: - '@types/react' - '@xstate/react@6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.32.5)': + '@xstate/react@6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.33.3)': dependencies: react: 19.2.8 use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.14)(react@19.2.8) - use-sync-external-store: 1.6.0(react@19.2.8) + use-sync-external-store: 1.7.0(react@19.2.8) + optionalDependencies: + xstate: 5.33.3 + transitivePeerDependencies: + - '@types/react' + + '@xstate/react@6.1.0(@types/react@19.2.14)(react@19.3.1)(xstate@5.33.3)': + dependencies: + react: 19.3.1 + use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.14)(react@19.3.1) + use-sync-external-store: 1.7.0(react@19.3.1) optionalDependencies: - xstate: 5.32.5 + xstate: 5.33.3 transitivePeerDependencies: - '@types/react' @@ -12346,7 +13681,7 @@ snapshots: acorn@8.16.0: {} - adm-zip@0.6.0: {} + adm-zip@0.6.1: {} agent-base@7.1.4: {} @@ -12528,6 +13863,8 @@ snapshots: b4a@1.8.0: {} + b4a@1.9.0: {} + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.29.2 @@ -12536,7 +13873,7 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: - '@babel/compat-data': 7.29.0 + '@babel/compat-data': 7.29.7 '@babel/core': 7.29.7 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) semver: 6.3.1 @@ -12580,6 +13917,17 @@ snapshots: - bare-abort-controller - react-native-b4a + bare-fs@4.8.4: + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.8.1(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + bare-os@3.8.0: {} bare-path@3.0.0: @@ -12604,8 +13952,6 @@ snapshots: baseline-browser-mapping@2.10.32: {} - before-after-hook@4.0.0: {} - better-auth@1.7.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: '@better-auth/core': 1.7.7(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.2)(better-call@1.4.0(zod@4.6.7))(jose@6.2.12)(kysely@0.29.6)(nanostores@1.5.5) @@ -12687,8 +14033,6 @@ snapshots: dependencies: run-applescript: 7.1.0 - cac@7.0.0: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -12733,6 +14077,10 @@ snapshots: dependencies: react: 19.2.8 + ce-la-react@0.3.2(react@19.3.1): + dependencies: + react: 19.3.1 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -12806,13 +14154,15 @@ snapshots: clsx@2.1.1: {} + cobe@2.0.1: {} + codemirror@6.0.2: dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/commands': 6.11.0 '@codemirror/language': 6.12.4 - '@codemirror/lint': 6.9.5 - '@codemirror/search': 6.7.1 + '@codemirror/lint': 6.9.7 + '@codemirror/search': 6.7.2 '@codemirror/state': 6.7.1 '@codemirror/view': 6.43.9 @@ -12941,8 +14291,8 @@ snapshots: cssstyle@6.2.0: dependencies: - '@asamuzakjp/css-color': 5.0.1 - '@csstools/css-syntax-patches-for-csstree': 1.1.1(css-tree@3.2.1) + '@asamuzakjp/css-color': 5.1.11 + '@csstools/css-syntax-patches-for-csstree': 1.1.4(css-tree@3.2.1) css-tree: 3.2.1 lru-cache: 11.5.1 @@ -13016,8 +14366,12 @@ snapshots: dependencies: dequal: 2.0.3 + dialog-closedby-polyfill@1.3.0: {} + diff@8.0.4: {} + diff@9.0.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -13045,14 +14399,16 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 + dompurify@3.4.17: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv@17.4.2: {} - dset@3.1.4: {} dunder-proto@1.0.1: @@ -13123,8 +14479,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-toolkit@1.51.0: {} - esbuild@0.28.0: optionalDependencies: '@esbuild/aix-ppc64': 0.28.0 @@ -13209,49 +14563,35 @@ snapshots: transitivePeerDependencies: - bare-abort-controller - eventsource-parser@3.0.6: {} - eventsource-parser@3.1.1: {} - eventsource-parser@4.0.0: {} - eventsource-parser@4.1.1: {} eventsource@2.0.2: {} - eventsource@4.1.0: - dependencies: - eventsource-parser: 3.0.6 - - eventsource@5.1.0: - dependencies: - eventsource-parser: 4.0.0 - eventsource@5.1.2: dependencies: eventsource-parser: 4.1.1 - execa@9.6.1: + execa@10.2.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 human-signals: 8.0.1 is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.3.0 + pretty-ms: 9.3.1 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 + which-command: 0.1.0 + yoctocolors: 2.2.0 exif-component@1.0.1: {} extend@3.0.2: {} - fast-content-type-parse@3.0.0: {} - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -13352,32 +14692,32 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - framer-motion@13.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + framer-motion@14.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - motion-dom: 13.0.0 - motion-utils: 13.0.0 + motion-dom: 14.5.0 + motion-utils: 14.1.1 tslib: 2.8.1 optionalDependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - framer-motion@13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + framer-motion@14.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - motion-dom: 13.0.0 - motion-utils: 13.0.0 + motion-dom: 14.5.0 + motion-utils: 14.1.1 tslib: 2.8.1 optionalDependencies: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - framer-motion@13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + framer-motion@14.5.0(react-dom@19.2.8(react@19.3.1))(react@19.3.1): dependencies: - motion-dom: 13.5.1 - motion-utils: 13.5.0 + motion-dom: 14.5.0 + motion-utils: 14.1.1 tslib: 2.8.1 optionalDependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) fsevents@2.3.3: optional: true @@ -13403,13 +14743,6 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-it@8.7.2: - dependencies: - decompress-response: 7.0.0 - is-retry-allowed: 2.2.0 - through2: 4.0.2 - tunnel-agent: 0.6.0 - get-it@8.8.3: dependencies: decompress-response: 7.0.0 @@ -13417,20 +14750,16 @@ snapshots: through2: 4.0.2 tunnel-agent: 0.6.0 - get-it@9.5.0: - dependencies: - undici: 7.29.0 - get-it@9.6.1: dependencies: undici: 7.30.0 get-latest-version@6.0.1: dependencies: - get-it: 8.7.2 + get-it: 8.8.3 registry-auth-token: 5.1.1 registry-url: 7.2.0 - semver: 7.8.1 + semver: 7.8.5 get-package-type@0.1.0: {} @@ -13444,7 +14773,7 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-tsconfig@4.14.0: + get-tsconfig@4.14.3: dependencies: resolve-pkg-maps: 1.0.0 @@ -13487,7 +14816,7 @@ snapshots: dependencies: obug: 2.1.4 - groq@3.88.1-typegen-experimental.0: {} + groq@6.20.0: {} groq@6.9.2: {} @@ -13586,7 +14915,7 @@ snapshots: dependencies: '@babel/runtime': 7.29.2 - hls.js@1.6.15: {} + hls.js@1.7.3: {} hoist-non-react-statics@3.3.2: dependencies: @@ -13626,10 +14955,14 @@ snapshots: humanize-list@1.0.1: {} - i18next@26.3.6(typescript@5.9.3): + i18next@26.5.4(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 + i18next@26.5.4(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -13655,6 +14988,8 @@ snapshots: ini@5.0.0: {} + interestfor@1.0.10: {} + iron-webcrypto@1.2.1: {} is-alphabetical@2.0.1: {} @@ -13752,9 +15087,9 @@ snapshots: - canvas - supports-color - isomorphic-ws@5.0.0(ws@8.21.0): + isomorphic-ws@5.0.0(ws@8.21.3): dependencies: - ws: 8.21.0 + ws: 8.21.3 jiti@2.7.0: {} @@ -13788,7 +15123,7 @@ snapshots: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.26.0 + undici: 7.30.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -13815,7 +15150,7 @@ snapshots: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.26.0 + undici: 7.30.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -13851,8 +15186,6 @@ snapshots: json-stream-stringify@3.1.6: {} - json-with-bigint@3.5.7: {} - json5@2.2.3: {} jsonc-parser@2.3.1: {} @@ -13980,10 +15313,6 @@ snapshots: lines-and-columns@1.2.4: {} - linkify-it@5.0.2: - dependencies: - uc.micro: 2.1.0 - linkify-it@6.1.0: dependencies: uc.micro: 3.0.0 @@ -13999,8 +15328,6 @@ snapshots: lodash.isplainobject@4.0.6: {} - lodash@4.17.23: {} - lodash@4.18.1: {} log-symbols@7.0.1: @@ -14020,6 +15347,8 @@ snapshots: dependencies: yallist: 3.1.1 + lru_map@0.4.1: {} + lucide-react@0.577.0(react@19.2.4): dependencies: react: 19.2.4 @@ -14043,15 +15372,6 @@ snapshots: pify: 4.0.1 semver: 5.7.2 - markdown-it@14.3.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.2 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - markdown-it@15.0.2: dependencies: argparse: 3.0.2 @@ -14081,8 +15401,6 @@ snapshots: mdn-data@2.27.1: {} - mdurl@2.0.0: {} - mdurl@2.1.0: {} media-chrome@4.19.2(react@19.2.4): @@ -14097,6 +15415,30 @@ snapshots: transitivePeerDependencies: - react + media-chrome@4.19.2(react@19.3.1): + dependencies: + ce-la-react: 0.3.2(react@19.3.1) + transitivePeerDependencies: + - react + + media-chrome@4.19.3(react@19.2.4): + dependencies: + ce-la-react: 0.3.2(react@19.2.4) + transitivePeerDependencies: + - react + + media-chrome@4.19.3(react@19.2.8): + dependencies: + ce-la-react: 0.3.2(react@19.2.8) + transitivePeerDependencies: + - react + + media-chrome@4.19.3(react@19.3.1): + dependencies: + ce-la-react: 0.3.2(react@19.3.1) + transitivePeerDependencies: + - react + media-tracks@0.3.5: {} memoize-one@6.0.0: {} @@ -14284,41 +15626,37 @@ snapshots: dependencies: minipass: 7.1.3 - motion-dom@13.0.0: - dependencies: - motion-utils: 13.0.0 + modern-tar@0.8.6: {} - motion-dom@13.5.1: + motion-dom@14.5.0: dependencies: - motion-utils: 13.5.0 + motion-utils: 14.1.1 - motion-utils@13.0.0: {} + motion-utils@14.1.1: {} - motion-utils@13.5.0: {} - - motion@13.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + motion@14.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - framer-motion: 13.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + framer-motion: 14.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tslib: 2.8.1 optionalDependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - motion@13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + motion@14.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - framer-motion: 13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + framer-motion: 14.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) tslib: 2.8.1 optionalDependencies: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - motion@13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + motion@14.5.0(react-dom@19.2.8(react@19.3.1))(react@19.3.1): dependencies: - framer-motion: 13.5.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + framer-motion: 14.5.0(react-dom@19.2.8(react@19.3.1))(react@19.3.1) tslib: 2.8.1 optionalDependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) mrmime@2.0.1: {} @@ -14330,7 +15668,7 @@ snapshots: mute-stream@3.0.0: {} - mux-embed@5.17.10: {} + mux-embed@5.18.2: {} nano-pubsub@3.0.0: {} @@ -14338,10 +15676,14 @@ snapshots: nanoid@3.3.18: {} + nanoid@3.3.20: {} + nanoid@5.1.11: {} nanoid@6.0.1: {} + nanoid@6.0.2: {} + nanostores@1.5.5: {} neotraverse@1.0.1: {} @@ -14423,17 +15765,6 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 - ora@9.4.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 3.4.0 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 7.0.1 - stdin-discarder: 0.3.2 - string-width: 8.2.0 - ora@9.4.1: dependencies: chalk: 5.6.2 @@ -14443,7 +15774,7 @@ snapshots: is-unicode-supported: 2.1.0 log-symbols: 7.0.1 stdin-discarder: 0.3.2 - string-width: 8.2.0 + string-width: 8.2.2 p-limit@2.3.0: dependencies: @@ -14459,6 +15790,8 @@ snapshots: p-map@7.0.4: {} + p-map@7.1.1: {} + p-queue@9.1.0: dependencies: eventemitter3: 5.0.4 @@ -14468,10 +15801,6 @@ snapshots: p-try@2.2.0: {} - package-directory@8.2.0: - dependencies: - find-up-simple: 1.0.1 - package-manager-detector@1.8.0: {} pako@0.2.9: {} @@ -14526,8 +15855,6 @@ snapshots: path-to-regexp@6.3.0: {} - path-to-regexp@8.4.2: {} - path-type@4.0.0: {} pathe@2.0.3: {} @@ -14550,6 +15877,8 @@ snapshots: picomatch@4.0.5: {} + picomatch@4.0.7: {} + pify@4.0.1: {} pirates@4.0.7: {} @@ -14560,18 +15889,24 @@ snapshots: dependencies: find-up: 3.0.0 - player.style@0.3.4(react@19.2.4): + player.style@0.3.5(react@19.2.4): dependencies: media-chrome: 4.19.2(react@19.2.4) transitivePeerDependencies: - react - player.style@0.3.4(react@19.2.8): + player.style@0.3.5(react@19.2.8): dependencies: media-chrome: 4.19.2(react@19.2.8) transitivePeerDependencies: - react + player.style@0.3.5(react@19.3.1): + dependencies: + media-chrome: 4.19.2(react@19.3.1) + transitivePeerDependencies: + - react + pluralize-esm@9.0.5: {} pluralize@8.0.0: {} @@ -14599,6 +15934,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.31: + dependencies: + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 + powershell-utils@0.1.0: {} prettier@3.9.6: {} @@ -14607,6 +15948,10 @@ snapshots: dependencies: parse-ms: 4.0.0 + pretty-ms@9.3.1: + dependencies: + parse-ms: 4.0.0 + prismjs@1.30.0: {} process-ancestry@0.1.0: {} @@ -14667,13 +16012,22 @@ snapshots: '@babel/runtime': 7.29.2 react: 19.2.8 + react-clientside-effect@1.2.8(react@19.3.1): + dependencies: + '@babel/runtime': 7.29.2 + react: 19.3.1 + + react-compiler-runtime@1.0.0(react@19.2.4): + dependencies: + react: 19.2.4 + react-compiler-runtime@1.0.0(react@19.2.8): dependencies: react: 19.2.8 - react-compiler-runtime@19.1.0-rc.1(react@19.2.8): + react-compiler-runtime@1.0.0(react@19.3.1): dependencies: - react: 19.2.8 + react: 19.3.1 react-dom@19.2.4(react@19.2.4): dependencies: @@ -14690,6 +16044,11 @@ snapshots: react: 19.2.8 scheduler: 0.27.0 + react-dom@19.2.8(react@19.3.1): + dependencies: + react: 19.3.1 + scheduler: 0.27.0 + react-dropzone@11.7.1(react@19.2.4): dependencies: attr-accept: 2.2.5 @@ -14697,10 +16056,23 @@ snapshots: prop-types: 15.8.1 react: 19.2.4 - react-error-boundary@5.0.0(react@19.2.8): + react-error-boundary@6.1.6(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + react-error-boundary@6.1.6(@types/react@19.2.14)(react@19.2.8): dependencies: - '@babel/runtime': 7.29.2 react: 19.2.8 + optionalDependencies: + '@types/react': 19.2.14 + + react-error-boundary@6.1.6(@types/react@19.2.14)(react@19.3.1): + dependencies: + react: 19.3.1 + optionalDependencies: + '@types/react': 19.2.14 react-fast-compare@3.2.2: {} @@ -14735,6 +16107,18 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + react-focus-lock@2.13.7(@types/react@19.2.14)(react@19.3.1): + dependencies: + '@babel/runtime': 7.29.2 + focus-lock: 1.3.6 + prop-types: 15.8.1 + react: 19.3.1 + react-clientside-effect: 1.2.8(react@19.3.1) + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.3.1) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.3.1) + optionalDependencies: + '@types/react': 19.2.14 + react-from-dom@0.7.5(react@19.2.4): dependencies: react: 19.2.4 @@ -14743,28 +16127,39 @@ snapshots: dependencies: react: 19.2.4 - react-i18next@17.0.11(i18next@26.3.6(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): + react-i18next@17.1.0(i18next@26.5.4(typescript@6.0.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.10 html-parse-stringify: 4.0.1 - i18next: 26.3.6(typescript@5.9.3) + i18next: 26.5.4(typescript@6.0.3) react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.2.4) optionalDependencies: react-dom: 19.2.4(react@19.2.4) typescript: 5.9.3 - react-i18next@17.0.11(i18next@26.3.6(typescript@5.9.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3): + react-i18next@17.1.0(i18next@26.5.4(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.10 html-parse-stringify: 4.0.1 - i18next: 26.3.6(typescript@5.9.3) + i18next: 26.5.4(typescript@6.0.3) react: 19.2.8 - use-sync-external-store: 1.6.0(react@19.2.8) + use-sync-external-store: 1.7.0(react@19.2.8) optionalDependencies: react-dom: 19.2.8(react@19.2.8) typescript: 5.9.3 + react-i18next@17.1.0(i18next@26.5.4(typescript@6.0.3))(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(typescript@6.0.3): + dependencies: + '@babel/runtime': 7.29.10 + html-parse-stringify: 4.0.1 + i18next: 26.5.4(typescript@6.0.3) + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) + optionalDependencies: + react-dom: 19.2.8(react@19.3.1) + typescript: 6.0.3 + react-icons@5.6.0(react@19.2.4): dependencies: react: 19.2.4 @@ -14776,7 +16171,7 @@ snapshots: react-is@16.13.1: {} - react-is@19.2.8: {} + react-is@19.3.1: {} react-redux@9.3.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1): dependencies: @@ -14801,19 +16196,29 @@ snapshots: unist-util-filter: 5.0.1 unist-util-visit-parents: 6.0.2 + react-refractor@4.0.0(react@19.3.1): + dependencies: + react: 19.3.1 + refractor: 5.0.0 + unist-util-filter: 5.0.1 + unist-util-visit-parents: 6.0.2 + react-refresh@0.18.0: {} - react-rx@5.1.1(react@19.2.4)(rxjs@7.8.2): + react-rx@7.1.0(react@19.2.4)(rxjs@7.8.2): dependencies: react: 19.2.4 rxjs: 7.8.2 - use-effect-event: 2.0.3(react@19.2.4) - react-rx@5.1.1(react@19.2.8)(rxjs@7.8.2): + react-rx@7.1.0(react@19.2.8)(rxjs@7.8.2): dependencies: react: 19.2.8 rxjs: 7.8.2 - use-effect-event: 2.0.3(react@19.2.8) + + react-rx@7.1.0(react@19.3.1)(rxjs@7.8.2): + dependencies: + react: 19.3.1 + rxjs: 7.8.2 react-select@5.10.2(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: @@ -14858,6 +16263,8 @@ snapshots: react@19.2.8: {} + react@19.3.1: {} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -14899,7 +16306,7 @@ snapshots: refractor@5.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/prismjs': 1.26.6 hastscript: 9.0.1 parse-entities: 4.0.2 @@ -14954,6 +16361,8 @@ snapshots: reselect@5.2.0: {} + reselect@5.3.0: {} + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -14977,6 +16386,27 @@ snapshots: reusify@1.1.0: {} + rolldown@1.2.14: + dependencies: + '@oxc-project/types': 0.154.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.14 + '@rolldown/binding-android-arm64': 1.2.14 + '@rolldown/binding-darwin-arm64': 1.2.14 + '@rolldown/binding-darwin-x64': 1.2.14 + '@rolldown/binding-freebsd-x64': 1.2.14 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.14 + '@rolldown/binding-linux-arm64-gnu': 1.2.14 + '@rolldown/binding-linux-arm64-musl': 1.2.14 + '@rolldown/binding-linux-ppc64-gnu': 1.2.14 + '@rolldown/binding-linux-s390x-gnu': 1.2.14 + '@rolldown/binding-linux-x64-gnu': 1.2.14 + '@rolldown/binding-linux-x64-musl': 1.2.14 + '@rolldown/binding-openharmony-arm64': 1.2.14 + '@rolldown/binding-win32-arm64-msvc': 1.2.14 + '@rolldown/binding-win32-x64-msvc': 1.2.14 + rolldown@1.2.4: dependencies: '@oxc-project/types': 0.144.0 @@ -15023,14 +16453,14 @@ snapshots: safer-buffer@2.1.2: {} - sanity-plugin-media@6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): + sanity-plugin-media@6.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3))(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): dependencies: '@hookform/resolvers': 4.1.3(react-hook-form@7.85.0(react@19.2.4)) '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1))(react@19.2.4) '@sanity/client': 7.26.2 '@sanity/color': 3.0.8 '@sanity/icons': 5.2.1(react@19.2.4) - '@sanity/ui': 4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@sanity/ui': 4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@sanity/uuid': 3.0.3 '@tanem/react-nprogress': 5.0.63(react-dom@19.2.4(react@19.2.4))(react@19.2.4) copy-to-clipboard: 3.3.3 @@ -15051,83 +16481,84 @@ snapshots: redux: 5.0.1 redux-observable: 3.0.0-rc.2(redux@5.0.1)(rxjs@7.8.2) rxjs: 7.8.2 - sanity: 6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3) + sanity: 6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3) styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) zod: 3.25.76 transitivePeerDependencies: - '@types/react' - supports-color - sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3): + sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3): dependencies: '@algorithm.ts/lcs': 4.0.6 '@date-fns/tz': 1.5.0 - '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) - '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) - '@dnd-kit/utilities': 3.2.2(react@19.2.8) + '@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.4) + '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.4) + '@dnd-kit/utilities': 3.2.2(react@19.2.4) '@isaacs/ttlcache': 2.1.5 - '@mux/mux-player-react': 3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/html': 1.2.0 - '@portabletext/patches': 2.0.6 - '@portabletext/plugin-dnd': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-list-index': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-markdown-shortcuts': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-one-line': 7.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-paste-link': 4.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-table': 1.3.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-typography': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) - '@portabletext/react': 7.0.1(react@19.2.8) - '@portabletext/sanity-bridge': 3.2.5(@types/react@19.2.14) - '@portabletext/to-html': 5.0.3 - '@portabletext/toolkit': 5.0.2 - '@rexxars/react-json-inspector': 9.0.1(react@19.2.8) - '@sanity-labs/ui-poc': 0.0.1-alpha.25(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@mux/mux-player-react': 3.14.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.2.4) + '@portabletext/html': 2.0.2 + '@portabletext/patches': 3.0.2 + '@portabletext/plugin-dnd': 2.0.22(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4) + '@portabletext/plugin-list-index': 2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4) + '@portabletext/plugin-markdown-shortcuts': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4) + '@portabletext/plugin-one-line': 8.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4) + '@portabletext/plugin-paste-link': 5.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.4) + '@portabletext/plugin-table': 2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@portabletext/plugin-typography': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.4) + '@portabletext/react': 8.0.1(react@19.2.4) + '@portabletext/sanity-bridge': 4.1.4(@types/react@19.2.14) + '@portabletext/to-html': 6.0.0 + '@portabletext/toolkit': 6.0.0 + '@rexxars/react-json-inspector': 9.0.1(react@19.2.4) + '@sanity/access-ui': 6.20.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@sanity/asset-utils': 2.3.0 - '@sanity/bifur-client': 1.0.0 - '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) - '@sanity/client': 7.26.2 - '@sanity/color': 3.0.8 + '@sanity/bifur-client': 2.0.2 + '@sanity/cli': 8.22.0(98a42d609e82eb66a4d860ff95d7690c) + '@sanity/client': 8.9.0 + '@sanity/color': 3.0.9 '@sanity/comlink': 4.0.3 - '@sanity/diff': 6.9.2 - '@sanity/diff-match-patch': 3.2.0 - '@sanity/diff-patch': 5.0.0 + '@sanity/diff': 6.20.0 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/diff-patch': 7.0.0 '@sanity/eventsource': 5.0.4 '@sanity/generate-help-url': 4.0.0 - '@sanity/icons': 5.2.1(react@19.2.8) - '@sanity/id-utils': 1.0.0 + '@sanity/icons': 5.2.3(react@19.2.4) + '@sanity/id-utils': 1.1.0 '@sanity/image-url': 2.1.1 - '@sanity/logos': 2.2.5(react@19.2.8) - '@sanity/media-library-types': 1.6.0 + '@sanity/logos': 2.2.6(react@19.2.4) + '@sanity/media-library-types': 1.8.0(@sanity/types@6.20.0(@types/react@19.2.14)) '@sanity/message-protocol': 0.24.0 - '@sanity/migrate': 8.0.2(@types/react@19.2.14)(xstate@5.32.5) - '@sanity/mutate': 0.18.1(xstate@5.32.5) - '@sanity/mutator': 6.9.2(@types/react@19.2.14) - '@sanity/presentation-comlink': 2.2.3(@sanity/types@6.9.2(@types/react@19.2.14)) - '@sanity/preview-url-secret': 4.1.4(@sanity/client@7.26.2) + '@sanity/migrate': 8.0.5(@types/react@19.2.14)(xstate@5.33.3) + '@sanity/mutate': 0.18.2(xstate@5.33.3) + '@sanity/mutator': 6.20.0(@types/react@19.2.14) + '@sanity/presentation-comlink': 2.2.3(@sanity/types@6.20.0(@types/react@19.2.14)) + '@sanity/preview-url-secret': 4.1.5(@sanity/client@8.9.0) '@sanity/prism-groq': 1.1.2(prismjs@1.30.0) - '@sanity/schema': 6.9.2(@types/react@19.2.14) - '@sanity/telemetry': 1.1.0(react@19.2.8) - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/ui': 4.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) - '@sanity/util': 6.9.2(@types/react@19.2.14) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/sdk-react': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/telemetry': 1.1.0(react@19.2.4) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/ui': 4.4.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@sanity/util': 6.20.0(@types/react@19.2.14) '@sanity/uuid': 3.0.3 - '@sanity/workbench': 0.1.0-alpha.36(@sanity/sdk@1.0.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)))(react@19.2.8)(xstate@5.32.5) - '@sentry/react': 10.70.0(react@19.2.8) - '@tanstack/react-table': 8.21.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@tanstack/react-virtual': 3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.32.5) + '@sanity/validation': 6.20.0(@types/react@19.2.14)(typescript@5.9.3) + '@sentry/react': 11.8.0(react@19.2.4) + '@tanstack/react-virtual': 3.14.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@vanilla-extract/dynamic': 2.1.5 + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.33.3) clsx: 2.1.1 color2k: 2.0.4 dataloader: 2.2.3 date-fns: 4.4.0 - debug: 4.4.3(supports-color@8.1.1) + dequal: 2.0.3 exif-component: 1.0.1 - fast-deep-equal: 3.1.3 groq-js: 2.0.0 history: 5.3.0 - i18next: 26.3.6(typescript@5.9.3) + i18next: 26.5.4(typescript@5.9.3) is-hotkey-esm: 1.0.0 is-network-error: 1.3.2 isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) @@ -15135,23 +16566,23 @@ snapshots: json-stable-stringify: 1.3.0 lodash-es: 4.18.1 mendoza: 3.0.8 - motion: 13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + motion: 14.5.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) nano-pubsub: 3.0.0 - nanoid: 6.0.1 + nanoid: 6.0.2 observable-callback: 1.0.3(rxjs@7.8.2) - path-to-regexp: 8.4.2 - player.style: 0.3.4(react@19.2.8) + obug: 3.0.0 + player.style: 0.3.5(react@19.2.4) polished: 4.3.1 quick-lru: 7.3.0 raf: 3.4.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) react-fast-compare: 3.2.2 - react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.2.8) - react-i18next: 17.0.11(i18next@26.3.6(typescript@5.9.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) - react-is: 19.2.8 - react-refractor: 4.0.0(react@19.2.8) - react-rx: 5.1.1(react@19.2.8)(rxjs@7.8.2) + react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.2.4) + react-i18next: 17.1.0(i18next@26.5.4(typescript@6.0.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react-is: 19.3.1 + react-refractor: 4.0.0(react@19.2.4) + react-rx: 7.1.0(react@19.2.4)(rxjs@7.8.2) refractor: 5.0.0 rxjs: 7.8.2 rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.2) @@ -15159,25 +16590,25 @@ snapshots: scroll-into-view-if-needed: 3.1.0 scrollmirror: 1.2.4 semver: 7.8.5 - shallow-equals: 1.0.0 speakingurl: 14.0.1 - styled-components: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - swr: 2.5.1(react@19.2.8) + styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + swr: 2.5.1(react@19.2.4) + ui5: '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)' urlpattern-polyfill: 10.1.0 - use-device-pixel-ratio: 1.1.2(react@19.2.8) - use-effect-event: 2.0.3(react@19.2.8) - use-hot-module-reload: 2.0.0(react@19.2.8) - use-sync-external-store: 1.6.0(react@19.2.8) - uuid: 14.0.1 - web-vitals: 6.1.1 - xstate: 5.32.5 + use-device-pixel-ratio: 1.1.2(react@19.2.4) + use-effect-event: 2.0.4(react@19.2.4) + use-hot-module-reload: 2.0.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.2.4) + uuid: 14.0.3 + web-vitals: 6.2.3 + xstate: 5.33.3 transitivePeerDependencies: - '@babel/core' - '@babel/plugin-transform-runtime' - '@babel/runtime' - '@noble/hashes' - '@rolldown/plugin-babel' - - '@sanity/sdk' + - '@sanity/workflow-blueprint' - '@types/node' - '@types/react' - '@types/react-dom' @@ -15188,12 +16619,15 @@ snapshots: - bufferutil - canvas - esbuild + - immer - jiti - less + - oxc-transform-react - oxfmt - prismjs - react-native - react-native-b4a + - react-router - rolldown - sass - sass-embedded @@ -15201,81 +16635,83 @@ snapshots: - sugarss - supports-color - terser + - tsx - typescript - utf-8-validate - vitest - vue-tsc - sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(terser@5.48.0)(typescript@5.9.3): + sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@5.9.3))(typescript@5.9.3))(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(tsx@4.23.12)(typescript@5.9.3): dependencies: '@algorithm.ts/lcs': 4.0.6 '@date-fns/tz': 1.5.0 - '@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.4) - '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.4) - '@dnd-kit/utilities': 3.2.2(react@19.2.4) + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.8) + '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.2.8) + '@dnd-kit/utilities': 3.2.2(react@19.2.8) '@isaacs/ttlcache': 2.1.5 - '@mux/mux-player-react': 3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.4) - '@portabletext/html': 1.2.0 - '@portabletext/patches': 2.0.6 - '@portabletext/plugin-dnd': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4) - '@portabletext/plugin-list-index': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4) - '@portabletext/plugin-markdown-shortcuts': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4) - '@portabletext/plugin-one-line': 7.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4) - '@portabletext/plugin-paste-link': 4.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.4) - '@portabletext/plugin-table': 1.3.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@portabletext/plugin-typography': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.4) - '@portabletext/react': 7.0.1(react@19.2.4) - '@portabletext/sanity-bridge': 3.2.5(@types/react@19.2.14) - '@portabletext/to-html': 5.0.3 - '@portabletext/toolkit': 5.0.2 - '@rexxars/react-json-inspector': 9.0.1(react@19.2.4) - '@sanity-labs/ui-poc': 0.0.1-alpha.25(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@mux/mux-player-react': 3.14.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.2.8) + '@portabletext/html': 2.0.2 + '@portabletext/patches': 3.0.2 + '@portabletext/plugin-dnd': 2.0.22(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8) + '@portabletext/plugin-list-index': 2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8) + '@portabletext/plugin-markdown-shortcuts': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/plugin-one-line': 8.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8) + '@portabletext/plugin-paste-link': 5.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.2.8) + '@portabletext/plugin-table': 2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@portabletext/plugin-typography': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.2.8) + '@portabletext/react': 8.0.1(react@19.2.8) + '@portabletext/sanity-bridge': 4.1.4(@types/react@19.2.14) + '@portabletext/to-html': 6.0.0 + '@portabletext/toolkit': 6.0.0 + '@rexxars/react-json-inspector': 9.0.1(react@19.2.8) + '@sanity/access-ui': 6.20.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) '@sanity/asset-utils': 2.3.0 - '@sanity/bifur-client': 1.0.0 - '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) - '@sanity/client': 7.26.2 - '@sanity/color': 3.0.8 + '@sanity/bifur-client': 2.0.2 + '@sanity/cli': 8.22.0(d04f60f2b4623a4231ecd6642258477f) + '@sanity/client': 8.9.0 + '@sanity/color': 3.0.9 '@sanity/comlink': 4.0.3 - '@sanity/diff': 6.9.2 - '@sanity/diff-match-patch': 3.2.0 - '@sanity/diff-patch': 5.0.0 + '@sanity/diff': 6.20.0 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/diff-patch': 7.0.0 '@sanity/eventsource': 5.0.4 '@sanity/generate-help-url': 4.0.0 - '@sanity/icons': 5.2.1(react@19.2.4) - '@sanity/id-utils': 1.0.0 + '@sanity/icons': 5.2.3(react@19.2.8) + '@sanity/id-utils': 1.1.0 '@sanity/image-url': 2.1.1 - '@sanity/logos': 2.2.5(react@19.2.4) - '@sanity/media-library-types': 1.6.0 + '@sanity/logos': 2.2.6(react@19.2.8) + '@sanity/media-library-types': 1.8.0(@sanity/types@6.20.0(@types/react@19.2.14)) '@sanity/message-protocol': 0.24.0 - '@sanity/migrate': 8.0.2(@types/react@19.2.14)(xstate@5.32.5) - '@sanity/mutate': 0.18.1(xstate@5.32.5) - '@sanity/mutator': 6.9.2(@types/react@19.2.14) - '@sanity/presentation-comlink': 2.2.3(@sanity/types@6.9.2(@types/react@19.2.14)) - '@sanity/preview-url-secret': 4.1.4(@sanity/client@7.26.2) + '@sanity/migrate': 8.0.5(@types/react@19.2.14)(xstate@5.33.3) + '@sanity/mutate': 0.18.2(xstate@5.33.3) + '@sanity/mutator': 6.20.0(@types/react@19.2.14) + '@sanity/presentation-comlink': 2.2.3(@sanity/types@6.20.0(@types/react@19.2.14)) + '@sanity/preview-url-secret': 4.1.5(@sanity/client@8.9.0) '@sanity/prism-groq': 1.1.2(prismjs@1.30.0) - '@sanity/schema': 6.9.2(@types/react@19.2.14) - '@sanity/telemetry': 1.1.0(react@19.2.4) - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/ui': 4.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(styled-components@6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - '@sanity/util': 6.9.2(@types/react@19.2.14) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3) + '@sanity/sdk-react': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8))(xstate@5.33.3) + '@sanity/telemetry': 1.1.0(react@19.2.8) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/ui': 4.4.10(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + '@sanity/util': 6.20.0(@types/react@19.2.14) '@sanity/uuid': 3.0.3 - '@sanity/workbench': 0.1.0-alpha.36(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(xstate@5.32.5))(react@19.2.4)(xstate@5.32.5) - '@sentry/react': 10.70.0(react@19.2.4) - '@tanstack/react-table': 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/react-virtual': 3.14.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.4)(xstate@5.32.5) + '@sanity/validation': 6.20.0(@types/react@19.2.14)(typescript@5.9.3) + '@sentry/react': 11.8.0(react@19.2.8) + '@tanstack/react-virtual': 3.14.21(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@vanilla-extract/dynamic': 2.1.5 + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.33.3) clsx: 2.1.1 color2k: 2.0.4 dataloader: 2.2.3 date-fns: 4.4.0 - debug: 4.4.3(supports-color@8.1.1) + dequal: 2.0.3 exif-component: 1.0.1 - fast-deep-equal: 3.1.3 groq-js: 2.0.0 history: 5.3.0 - i18next: 26.3.6(typescript@5.9.3) + i18next: 26.5.4(typescript@5.9.3) is-hotkey-esm: 1.0.0 is-network-error: 1.3.2 isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) @@ -15283,23 +16719,23 @@ snapshots: json-stable-stringify: 1.3.0 lodash-es: 4.18.1 mendoza: 3.0.8 - motion: 13.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + motion: 14.5.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) nano-pubsub: 3.0.0 - nanoid: 6.0.1 + nanoid: 6.0.2 observable-callback: 1.0.3(rxjs@7.8.2) - path-to-regexp: 8.4.2 - player.style: 0.3.4(react@19.2.4) + obug: 3.0.0 + player.style: 0.3.5(react@19.2.8) polished: 4.3.1 quick-lru: 7.3.0 raf: 3.4.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) react-fast-compare: 3.2.2 - react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.2.4) - react-i18next: 17.0.11(i18next@26.3.6(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - react-is: 19.2.8 - react-refractor: 4.0.0(react@19.2.4) - react-rx: 5.1.1(react@19.2.4)(rxjs@7.8.2) + react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.2.8) + react-i18next: 17.1.0(i18next@26.5.4(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) + react-is: 19.3.1 + react-refractor: 4.0.0(react@19.2.8) + react-rx: 7.1.0(react@19.2.8)(rxjs@7.8.2) refractor: 5.0.0 rxjs: 7.8.2 rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.2) @@ -15307,25 +16743,25 @@ snapshots: scroll-into-view-if-needed: 3.1.0 scrollmirror: 1.2.4 semver: 7.8.5 - shallow-equals: 1.0.0 speakingurl: 14.0.1 - styled-components: 6.3.11(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - swr: 2.5.1(react@19.2.4) + styled-components: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + swr: 2.5.1(react@19.2.8) + ui5: '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.8(react@19.2.8))(react@19.2.8)' urlpattern-polyfill: 10.1.0 - use-device-pixel-ratio: 1.1.2(react@19.2.4) - use-effect-event: 2.0.3(react@19.2.4) - use-hot-module-reload: 2.0.0(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) - uuid: 14.0.1 - web-vitals: 6.1.1 - xstate: 5.32.5 + use-device-pixel-ratio: 1.1.2(react@19.2.8) + use-effect-event: 2.0.4(react@19.2.8) + use-hot-module-reload: 2.0.0(react@19.2.8) + use-sync-external-store: 1.7.0(react@19.2.8) + uuid: 14.0.3 + web-vitals: 6.2.3 + xstate: 5.33.3 transitivePeerDependencies: - '@babel/core' - '@babel/plugin-transform-runtime' - '@babel/runtime' - '@noble/hashes' - '@rolldown/plugin-babel' - - '@sanity/sdk' + - '@sanity/workflow-blueprint' - '@types/node' - '@types/react' - '@types/react-dom' @@ -15336,12 +16772,15 @@ snapshots: - bufferutil - canvas - esbuild + - immer - jiti - less + - oxc-transform-react - oxfmt - prismjs - react-native - react-native-b4a + - react-router - rolldown - sass - sass-embedded @@ -15349,81 +16788,83 @@ snapshots: - sugarss - supports-color - terser + - tsx - typescript - utf-8-validate - vitest - vue-tsc - sanity@6.9.2(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.4)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(terser@5.48.0)(typescript@5.9.3): + sanity@6.20.0(@babel/core@7.29.7)(@babel/runtime@7.29.10)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.4(@babel/core@7.29.7)(@babel/runtime@7.29.10)(rolldown@1.2.14)(vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@sanity/workflow-blueprint@0.36.0(@sanity/workflow-engine@0.36.0(@types/react@19.2.14)(typescript@6.0.3))(typescript@6.0.3))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(immer@11.1.4)(jiti@2.7.0)(prismjs@1.30.0)(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(rolldown@1.2.14)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(terser@5.48.0)(tsx@4.23.12)(typescript@6.0.3): dependencies: '@algorithm.ts/lcs': 4.0.6 '@date-fns/tz': 1.5.0 - '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) - '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) - '@dnd-kit/utilities': 3.2.2(react@19.2.8) + '@dnd-kit/core': 6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.3.1) + '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.8(react@19.3.1))(react@19.3.1))(react@19.3.1) + '@dnd-kit/utilities': 3.2.2(react@19.3.1) '@isaacs/ttlcache': 2.1.5 - '@mux/mux-player-react': 3.13.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@portabletext/editor': 7.11.0(@types/react@19.2.14)(react@19.2.8) - '@portabletext/html': 1.2.0 - '@portabletext/patches': 2.0.6 - '@portabletext/plugin-dnd': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-list-index': 1.0.32(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-markdown-shortcuts': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) - '@portabletext/plugin-one-line': 7.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-paste-link': 4.0.47(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-table': 1.3.17(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@portabletext/plugin-typography': 8.0.48(@portabletext/editor@7.11.0(@types/react@19.2.14)(react@19.2.8))(@types/react@19.2.14)(react@19.2.8) - '@portabletext/react': 7.0.1(react@19.2.8) - '@portabletext/sanity-bridge': 3.2.5(@types/react@19.2.14) - '@portabletext/to-html': 5.0.3 - '@portabletext/toolkit': 5.0.2 - '@rexxars/react-json-inspector': 9.0.1(react@19.2.8) - '@sanity-labs/ui-poc': 0.0.1-alpha.25(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@mux/mux-player-react': 3.14.0(@types/react@19.2.14)(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + '@portabletext/editor': 8.2.7(@types/react@19.2.14)(react@19.3.1) + '@portabletext/html': 2.0.2 + '@portabletext/patches': 3.0.2 + '@portabletext/plugin-dnd': 2.0.22(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1) + '@portabletext/plugin-list-index': 2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1) + '@portabletext/plugin-markdown-shortcuts': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1) + '@portabletext/plugin-one-line': 8.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1) + '@portabletext/plugin-paste-link': 5.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react@19.3.1) + '@portabletext/plugin-table': 2.0.20(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + '@portabletext/plugin-typography': 9.0.21(@portabletext/editor@8.2.7(@types/react@19.2.14)(react@19.3.1))(@types/react@19.2.14)(react@19.3.1) + '@portabletext/react': 8.0.1(react@19.3.1) + '@portabletext/sanity-bridge': 4.1.4(@types/react@19.2.14) + '@portabletext/to-html': 6.0.0 + '@portabletext/toolkit': 6.0.0 + '@rexxars/react-json-inspector': 9.0.1(react@19.3.1) + '@sanity/access-ui': 6.20.0(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1)) '@sanity/asset-utils': 2.3.0 - '@sanity/bifur-client': 1.0.0 - '@sanity/cli': 7.18.0(@babel/core@7.29.7)(@babel/runtime@7.29.2)(@noble/hashes@2.4.0)(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.2)(rolldown@1.2.4)(vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)))(@types/node@25.5.0)(@types/react@19.2.14)(babel-plugin-react-compiler@1.0.0)(esbuild@0.28.1)(jiti@2.7.0)(rolldown@1.2.4)(terser@5.48.0)(typescript@5.9.3)(xstate@5.32.5) - '@sanity/client': 7.26.2 - '@sanity/color': 3.0.8 + '@sanity/bifur-client': 2.0.2 + '@sanity/cli': 8.22.0(299fd29bb40c35fa6c2a53d133561739) + '@sanity/client': 8.9.0 + '@sanity/color': 3.0.9 '@sanity/comlink': 4.0.3 - '@sanity/diff': 6.9.2 - '@sanity/diff-match-patch': 3.2.0 - '@sanity/diff-patch': 5.0.0 + '@sanity/diff': 6.20.0 + '@sanity/diff-match-patch': 3.2.1 + '@sanity/diff-patch': 7.0.0 '@sanity/eventsource': 5.0.4 '@sanity/generate-help-url': 4.0.0 - '@sanity/icons': 5.2.1(react@19.2.8) - '@sanity/id-utils': 1.0.0 + '@sanity/icons': 5.2.3(react@19.3.1) + '@sanity/id-utils': 1.1.0 '@sanity/image-url': 2.1.1 - '@sanity/logos': 2.2.5(react@19.2.8) - '@sanity/media-library-types': 1.6.0 + '@sanity/logos': 2.2.6(react@19.3.1) + '@sanity/media-library-types': 1.8.0(@sanity/types@6.20.0(@types/react@19.2.14)) '@sanity/message-protocol': 0.24.0 - '@sanity/migrate': 8.0.2(@types/react@19.2.14)(xstate@5.32.5) - '@sanity/mutate': 0.18.1(xstate@5.32.5) - '@sanity/mutator': 6.9.2(@types/react@19.2.14) - '@sanity/presentation-comlink': 2.2.3(@sanity/types@6.9.2(@types/react@19.2.14)) - '@sanity/preview-url-secret': 4.1.4(@sanity/client@7.26.2) + '@sanity/migrate': 8.0.5(@types/react@19.2.14)(xstate@5.33.3) + '@sanity/mutate': 0.18.2(xstate@5.33.3) + '@sanity/mutator': 6.20.0(@types/react@19.2.14) + '@sanity/presentation-comlink': 2.2.3(@sanity/types@6.20.0(@types/react@19.2.14)) + '@sanity/preview-url-secret': 4.1.5(@sanity/client@8.9.0) '@sanity/prism-groq': 1.1.2(prismjs@1.30.0) - '@sanity/schema': 6.9.2(@types/react@19.2.14) - '@sanity/telemetry': 1.1.0(react@19.2.8) - '@sanity/types': 6.9.2(@types/react@19.2.14) - '@sanity/ui': 4.0.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(styled-components@6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) - '@sanity/util': 6.9.2(@types/react@19.2.14) + '@sanity/schema': 6.20.0(@types/react@19.2.14) + '@sanity/sdk': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/sdk-react': 3.9.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1))(xstate@5.33.3) + '@sanity/telemetry': 1.1.0(react@19.3.1) + '@sanity/types': 6.20.0(@types/react@19.2.14) + '@sanity/ui': 4.4.10(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1)) + '@sanity/util': 6.20.0(@types/react@19.2.14) '@sanity/uuid': 3.0.3 - '@sanity/workbench': 0.1.0-alpha.36(@sanity/sdk@2.12.0(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8))(xstate@5.32.5))(react@19.2.8)(xstate@5.32.5) - '@sentry/react': 10.70.0(react@19.2.8) - '@tanstack/react-table': 8.21.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@tanstack/react-virtual': 3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.2.8)(xstate@5.32.5) + '@sanity/validation': 6.20.0(@types/react@19.2.14)(typescript@6.0.3) + '@sentry/react': 11.8.0(react@19.3.1) + '@tanstack/react-virtual': 3.14.21(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + '@vanilla-extract/dynamic': 2.1.5 + '@xstate/react': 6.1.0(@types/react@19.2.14)(react@19.3.1)(xstate@5.33.3) clsx: 2.1.1 color2k: 2.0.4 dataloader: 2.2.3 date-fns: 4.4.0 - debug: 4.4.3(supports-color@8.1.1) + dequal: 2.0.3 exif-component: 1.0.1 - fast-deep-equal: 3.1.3 groq-js: 2.0.0 history: 5.3.0 - i18next: 26.3.6(typescript@5.9.3) + i18next: 26.5.4(typescript@6.0.3) is-hotkey-esm: 1.0.0 is-network-error: 1.3.2 isomorphic-dompurify: 2.36.0(@noble/hashes@2.4.0) @@ -15431,23 +16872,23 @@ snapshots: json-stable-stringify: 1.3.0 lodash-es: 4.18.1 mendoza: 3.0.8 - motion: 13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + motion: 14.5.0(react-dom@19.2.8(react@19.3.1))(react@19.3.1) nano-pubsub: 3.0.0 - nanoid: 6.0.1 + nanoid: 6.0.2 observable-callback: 1.0.3(rxjs@7.8.2) - path-to-regexp: 8.4.2 - player.style: 0.3.4(react@19.2.8) + obug: 3.0.0 + player.style: 0.3.5(react@19.3.1) polished: 4.3.1 quick-lru: 7.3.0 raf: 3.4.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.3.1 + react-dom: 19.2.8(react@19.3.1) react-fast-compare: 3.2.2 - react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.2.8) - react-i18next: 17.0.11(i18next@26.3.6(typescript@5.9.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) - react-is: 19.2.8 - react-refractor: 4.0.0(react@19.2.8) - react-rx: 5.1.1(react@19.2.8)(rxjs@7.8.2) + react-focus-lock: 2.13.7(@types/react@19.2.14)(react@19.3.1) + react-i18next: 17.1.0(i18next@26.5.4(typescript@6.0.3))(react-dom@19.2.8(react@19.3.1))(react@19.3.1)(typescript@6.0.3) + react-is: 19.3.1 + react-refractor: 4.0.0(react@19.3.1) + react-rx: 7.1.0(react@19.3.1)(rxjs@7.8.2) refractor: 5.0.0 rxjs: 7.8.2 rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.2) @@ -15455,25 +16896,25 @@ snapshots: scroll-into-view-if-needed: 3.1.0 scrollmirror: 1.2.4 semver: 7.8.5 - shallow-equals: 1.0.0 speakingurl: 14.0.1 - styled-components: 6.3.11(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - swr: 2.5.1(react@19.2.8) + styled-components: 6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1) + swr: 2.5.1(react@19.3.1) + ui5: '@sanity/ui@5.0.0-alpha.14(react-dom@19.2.8(react@19.3.1))(react@19.3.1)' urlpattern-polyfill: 10.1.0 - use-device-pixel-ratio: 1.1.2(react@19.2.8) - use-effect-event: 2.0.3(react@19.2.8) - use-hot-module-reload: 2.0.0(react@19.2.8) - use-sync-external-store: 1.6.0(react@19.2.8) - uuid: 14.0.1 - web-vitals: 6.1.1 - xstate: 5.32.5 + use-device-pixel-ratio: 1.1.2(react@19.3.1) + use-effect-event: 2.0.4(react@19.3.1) + use-hot-module-reload: 2.0.0(react@19.3.1) + use-sync-external-store: 1.7.0(react@19.3.1) + uuid: 14.0.3 + web-vitals: 6.2.3 + xstate: 5.33.3 transitivePeerDependencies: - '@babel/core' - '@babel/plugin-transform-runtime' - '@babel/runtime' - '@noble/hashes' - '@rolldown/plugin-babel' - - '@sanity/sdk' + - '@sanity/workflow-blueprint' - '@types/node' - '@types/react' - '@types/react-dom' @@ -15484,12 +16925,15 @@ snapshots: - bufferutil - canvas - esbuild + - immer - jiti - less + - oxc-transform-react - oxfmt - prismjs - react-native - react-native-b4a + - react-router - rolldown - sass - sass-embedded @@ -15497,6 +16941,7 @@ snapshots: - sugarss - supports-color - terser + - tsx - typescript - utf-8-validate - vitest @@ -15574,8 +17019,6 @@ snapshots: dependencies: kind-of: 6.0.3 - shallow-equals@1.0.0: {} - shallowequal@1.1.0: {} sharp@0.34.5: @@ -15678,6 +17121,8 @@ snapshots: source-map-js@1.2.1: {} + source-map-js@1.2.2: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -15706,6 +17151,15 @@ snapshots: - bare-abort-controller - react-native-b4a + streamx@2.28.1: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-argv@0.3.2: {} string-width@4.2.3: @@ -15720,11 +17174,6 @@ snapshots: get-east-asian-width: 1.5.0 strip-ansi: 7.2.0 - string-width@8.2.0: - dependencies: - get-east-asian-width: 1.5.0 - strip-ansi: 7.2.0 - string-width@8.2.2: dependencies: get-east-asian-width: 1.5.0 @@ -15789,6 +17238,21 @@ snapshots: optionalDependencies: react-dom: 19.2.8(react@19.2.8) + styled-components@6.3.11(react-dom@19.2.8(react@19.3.1))(react@19.3.1): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + '@emotion/unitless': 0.10.0 + '@types/stylis': 4.2.7 + css-to-react-native: 3.2.0 + csstype: 3.2.3 + postcss: 8.4.49 + react: 19.3.1 + shallowequal: 1.1.0 + stylis: 4.3.6 + tslib: 2.8.1 + optionalDependencies: + react-dom: 19.2.8(react@19.3.1) + stylis@4.2.0: {} stylis@4.3.6: {} @@ -15819,13 +17283,19 @@ snapshots: dependencies: dequal: 2.0.3 react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.2.4) swr@2.5.1(react@19.2.8): dependencies: dequal: 2.0.3 react: 19.2.8 - use-sync-external-store: 1.6.0(react@19.2.8) + use-sync-external-store: 1.7.0(react@19.2.8) + + swr@2.5.1(react@19.3.1): + dependencies: + dequal: 2.0.3 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) symbol-tree@3.2.4: {} @@ -15835,22 +17305,10 @@ snapshots: tapable@2.3.3: {} - tar-fs@3.1.2: - dependencies: - pump: 3.0.4 - tar-stream: 3.1.8 - optionalDependencies: - bare-fs: 4.5.5 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - tar-fs@3.1.3: dependencies: pump: 3.0.4 - tar-stream: 3.2.0 + tar-stream: 3.2.2 optionalDependencies: bare-fs: 4.5.5 bare-path: 3.0.0 @@ -15859,7 +17317,7 @@ snapshots: - bare-buffer - react-native-b4a - tar-stream@3.1.8: + tar-stream@3.2.0: dependencies: b4a: 1.8.0 bare-fs: 4.5.5 @@ -15870,12 +17328,12 @@ snapshots: - bare-buffer - react-native-b4a - tar-stream@3.2.0: + tar-stream@3.2.2: dependencies: - b4a: 1.8.0 - bare-fs: 4.5.5 + b4a: 1.9.0 + bare-fs: 4.8.4 fast-fifo: 1.3.2 - streamx: 2.23.0 + streamx: 2.28.1 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -15974,13 +17432,12 @@ snapshots: esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 + optional: true tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - tunnel@0.0.6: {} - type-fest@0.21.3: {} type-fest@4.41.0: {} @@ -16001,7 +17458,7 @@ snapshots: typescript@5.9.3: {} - uc.micro@2.1.0: {} + typescript@6.0.3: {} uc.micro@3.0.0: {} @@ -16016,14 +17473,10 @@ snapshots: undici-types@7.18.2: optional: true - undici@6.24.1: {} - - undici@7.26.0: {} - - undici@7.28.0: {} - undici@7.29.0: {} + undici@7.29.1: {} + undici@7.30.0: {} undici@8.10.0: {} @@ -16095,8 +17548,6 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - universal-user-agent@7.0.3: {} - unstorage@1.17.5: dependencies: anymatch: 3.1.3 @@ -16130,6 +17581,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.3.1): + dependencies: + react: 19.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + use-device-pixel-ratio@1.1.2(react@19.2.4): dependencies: react: 19.2.4 @@ -16138,18 +17596,22 @@ snapshots: dependencies: react: 19.2.8 - use-effect-event@2.0.3(react@19.2.4): + use-device-pixel-ratio@1.1.2(react@19.3.1): dependencies: - react: 19.2.4 + react: 19.3.1 - use-effect-event@2.0.3(react@19.2.8): + use-effect-event@2.0.4(react@19.2.4): dependencies: - react: 19.2.8 + react: 19.2.4 use-effect-event@2.0.4(react@19.2.8): dependencies: react: 19.2.8 + use-effect-event@2.0.4(react@19.3.1): + dependencies: + react: 19.3.1 + use-hot-module-reload@2.0.0(react@19.2.4): dependencies: react: 19.2.4 @@ -16158,6 +17620,10 @@ snapshots: dependencies: react: 19.2.8 + use-hot-module-reload@2.0.0(react@19.3.1): + dependencies: + react: 19.3.1 + use-isomorphic-layout-effect@1.2.1(@types/react@19.2.14)(react@19.2.4): dependencies: react: 19.2.4 @@ -16170,6 +17636,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + use-isomorphic-layout-effect@1.2.1(@types/react@19.2.14)(react@19.3.1): + dependencies: + react: 19.3.1 + optionalDependencies: + '@types/react': 19.2.14 + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4): dependencies: detect-node-es: 1.1.0 @@ -16186,27 +17658,47 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 19.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + use-sync-external-store@1.6.0(react@19.2.4): dependencies: react: 19.2.4 - use-sync-external-store@1.6.0(react@19.2.8): + use-sync-external-store@1.7.0(react@19.2.4): + dependencies: + react: 19.2.4 + + use-sync-external-store@1.7.0(react@19.2.8): dependencies: react: 19.2.8 + use-sync-external-store@1.7.0(react@19.3.1): + dependencies: + react: 19.3.1 + util-deprecate@1.0.2: {} uuid@10.0.0: {} uuid@11.1.0: {} - uuid@14.0.1: {} - - uuid@8.3.2: {} + uuid@14.0.3: {} uuidv7@0.4.4: {} - verkit@0.3.2: {} + valibot@1.5.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + valibot@1.5.0(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 vfile-location@5.0.3: dependencies: @@ -16223,27 +17715,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@6.0.0(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0): - dependencies: - cac: 7.0.0 - es-module-lexer: 2.0.0 - obug: 2.1.1 - pathe: 2.0.3 - vite: 8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0) - transitivePeerDependencies: - - '@types/node' - - '@vitejs/devtools' - - esbuild - - jiti - - less - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml - vite@8.2.1(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 @@ -16260,12 +17731,28 @@ snapshots: tsx: 4.23.12 yaml: 2.9.0 - vite@8.2.1(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0): + vite@8.3.5(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 - postcss: 8.5.26 - rolldown: 1.2.4 + picomatch: 4.0.7 + postcss: 8.5.31 + rolldown: 1.2.14 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.12.4 + esbuild: 0.28.0 + fsevents: 2.3.3 + jiti: 2.7.0 + terser: 5.48.0 + tsx: 4.23.12 + yaml: 2.9.0 + + vite@8.3.5(@types/node@25.5.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.31 + rolldown: 1.2.14 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.5.0 @@ -16394,7 +17881,7 @@ snapshots: web-namespaces@2.0.1: {} - web-vitals@6.1.1: {} + web-vitals@6.2.3: {} webidl-conversions@8.0.1: {} @@ -16408,6 +17895,8 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + which-command@0.1.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -16502,7 +17991,7 @@ snapshots: xmlchars@2.2.0: {} - xstate@5.32.5: {} + xstate@5.33.3: {} xtend@4.0.2: {} @@ -16552,6 +18041,8 @@ snapshots: yoctocolors@2.1.2: {} + yoctocolors@2.2.0: {} + yoga-wasm-web@0.3.3: {} youch-core@0.3.3: @@ -16571,22 +18062,34 @@ snapshots: zod@4.3.6: {} - zod@4.4.3: {} - zod@4.6.7: {} - zustand@5.0.14(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): + zustand@5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.2.4)(use-sync-external-store@1.7.0(react@19.3.1)): optionalDependencies: '@types/react': 19.2.14 immer: 11.1.4 react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) + use-sync-external-store: 1.7.0(react@19.3.1) - zustand@5.0.14(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)): + zustand@5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.2.8)(use-sync-external-store@1.7.0(react@19.2.8)): optionalDependencies: '@types/react': 19.2.14 immer: 11.1.4 react: 19.2.8 - use-sync-external-store: 1.6.0(react@19.2.8) + use-sync-external-store: 1.7.0(react@19.2.8) + + zustand@5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.2.8)): + optionalDependencies: + '@types/react': 19.2.14 + immer: 11.1.4 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.2.8) + + zustand@5.0.15(@types/react@19.2.14)(immer@11.1.4)(react@19.3.1)(use-sync-external-store@1.7.0(react@19.3.1)): + optionalDependencies: + '@types/react': 19.2.14 + immer: 11.1.4 + react: 19.3.1 + use-sync-external-store: 1.7.0(react@19.3.1) zwitch@2.0.4: {} diff --git a/sanity.blueprint.ts b/sanity.blueprint.ts index ca44156e..29946604 100644 --- a/sanity.blueprint.ts +++ b/sanity.blueprint.ts @@ -1,11 +1,26 @@ import { + defineApplication, defineBlueprint, defineDocumentFunction, defineScheduledFunction, + defineWindowView, } from "@sanity/blueprints"; export default defineBlueprint({ resources: [ + defineApplication({ + name: "codingcat-ops", + title: "CodingCat Ops & Revenue OS", + root: "./apps/ops", + views: [ + defineWindowView({ + name: "main", + title: "CodingCat Ops & Revenue OS", + src: "./src/index.tsx", + dock: { group: "applications", order: 10 }, + }), + ], + }), defineDocumentFunction({ name: "syndicate-content", displayName: "Syndicate Content (Dev.to & Hashnode)", From 348117d85540ecfbbb8609ae646907f535ac6f84 Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 09:21:56 -0400 Subject: [PATCH 03/10] feat(ci): deploy Sanity App SDK coreApp & synchronously poll Blueprint Stack status (#755) --- .github/workflows/deploy.yml | 192 ++++++++++++++++++++++++++++++++++- apps/ops/sanity.cli.ts | 9 ++ 2 files changed, 197 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3b8b59b7..e355a0bd 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -51,6 +51,43 @@ jobs: SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + - name: Deploy Sanity Ops App (Sanity App SDK) + working-directory: apps/ops + run: | + ORG_ID=$(node -e " + fetch('https://api.sanity.io/v2021-06-07/projects/${{ vars.SANITY_STUDIO_PROJECT_ID }}', { + headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } + }) + .then(r => r.json()) + .then(d => { + if (!d.organizationId) throw new Error('No organizationId in project response'); + console.log(d.organizationId); + }) + .catch(err => { console.error(err); process.exit(1); }); + ") + export SANITY_ORGANIZATION_ID="$ORG_ID" + EXISTING_APP_ID=$(node -e " + fetch('https://api.sanity.io/v2024-08-01/user-applications?appType=coreApp&organizationId=' + process.env.SANITY_ORGANIZATION_ID, { + headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } + }) + .then(r => r.ok ? r.json() : []) + .then(apps => { + const list = Array.isArray(apps) ? apps : []; + const match = list.find(a => a.title === 'CodingCat Ops & Revenue OS'); + if (match && match.id) console.log(match.id); + }) + .catch(() => {}); + ") + if [ -n "$EXISTING_APP_ID" ]; then + echo "Found existing CodingCat Ops & Revenue OS app: $EXISTING_APP_ID" + SANITY_OPS_APP_ID="$EXISTING_APP_ID" npx sanity deploy -y + else + echo "Creating and deploying new CodingCat Ops & Revenue OS app in organization $ORG_ID..." + npx sanity deploy -y --create --title "CodingCat Ops & Revenue OS" + fi + env: + SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + - name: Promote Stack to Organization Scope run: | mkdir -p .sanity @@ -59,11 +96,11 @@ jobs: env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} - - name: Deploy Sanity Blueprints Functions + - name: Deploy Sanity Blueprints & Poll Synchronously Until Completed run: | ORG_ID=$(node -e " fetch('https://api.sanity.io/v2021-06-07/projects/${{ vars.SANITY_STUDIO_PROJECT_ID }}', { - headers: { Authorization: 'Bearer ${{ secrets.SANITY_AUTH_TOKEN }}' } + headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } }) .then(r => r.json()) .then(d => { @@ -75,7 +112,62 @@ jobs: echo "Resolved Organization ID: $ORG_ID" mkdir -p .sanity echo "{\"organizationId\":\"$ORG_ID\"}" > .sanity/blueprint.config.json + + echo "=== Previous Stack Info & Logs ===" + pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true + pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} || true + + echo "=== Starting Blueprint Deployment ===" pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --no-wait + + echo "=== Synchronously Polling Blueprint Stack Operation Until Terminal State ===" + ORG_ID="$ORG_ID" STACK_NAME="${{ vars.SANITY_STUDIO_DATASET }}" node -e " + const token = process.env.SANITY_AUTH_TOKEN; + const orgId = process.env.ORG_ID; + const stackName = process.env.STACK_NAME; + const headers = { + Accept: 'application/json', + Authorization: 'Bearer ' + token, + 'X-Sanity-Scope-Type': 'organization', + 'X-Sanity-Scope-Id': orgId, + }; + (async () => { + const stacksRes = await fetch('https://api.sanity.io/v2026-06-15/blueprints/stacks', { headers }); + if (!stacksRes.ok) throw new Error('Failed to list stacks: HTTP ' + stacksRes.status); + const stacks = await stacksRes.json(); + const stack = stacks.find(s => s.name === stackName || s.id === stackName); + if (!stack) throw new Error('Stack not found: ' + stackName); + console.log('Polling Stack:', stack.name, '(' + stack.id + ')'); + const deadline = Date.now() + 5 * 60 * 1000; + while (Date.now() < deadline) { + const res = await fetch('https://api.sanity.io/v2026-06-15/blueprints/stacks/' + stack.id, { headers }); + if (!res.ok) throw new Error('Failed to fetch stack ' + stack.id + ': HTTP ' + res.status); + const data = await res.json(); + const op = data.recentOperation; + const status = op?.status || 'NONE'; + console.log('[' + new Date().toISOString() + '] Operation ' + (op?.id || 'n/a') + ' status: ' + status); + if (status === 'COMPLETED' || status === 'NONE') { + console.log('โœ” Blueprint Stack operation settled with status:', status); + process.exit(0); + } + if (status === 'FAILED' || status === 'CANCELLED') { + console.error('โœ– Blueprint Stack operation failed:', JSON.stringify(op, null, 2)); + const logsRes = await fetch('https://api.sanity.io/v2026-06-15/blueprints/logs?stackId=' + stack.id + (op?.id ? '&operationId=' + op.id : ''), { headers }); + if (logsRes.ok) { + const logs = await logsRes.json(); + console.error('Operation logs:', JSON.stringify(logs, null, 2)); + } + process.exit(1); + } + await new Promise(r => setTimeout(r, 4000)); + } + console.error('โœ– Timed out waiting 5 minutes for Blueprint Stack operation to complete'); + process.exit(1); + })().catch(err => { console.error(err); process.exit(1); }); + " + + echo "=== Verified Post-Deploy Stack Info ===" + pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} SANITY_API_WRITE_TOKEN: ${{ secrets.SANITY_API_WRITE_TOKEN }} @@ -125,6 +217,43 @@ jobs: SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + - name: Deploy Sanity Ops App (Sanity App SDK) + working-directory: apps/ops + run: | + ORG_ID=$(node -e " + fetch('https://api.sanity.io/v2021-06-07/projects/${{ vars.SANITY_STUDIO_PROJECT_ID }}', { + headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } + }) + .then(r => r.json()) + .then(d => { + if (!d.organizationId) throw new Error('No organizationId in project response'); + console.log(d.organizationId); + }) + .catch(err => { console.error(err); process.exit(1); }); + ") + export SANITY_ORGANIZATION_ID="$ORG_ID" + EXISTING_APP_ID=$(node -e " + fetch('https://api.sanity.io/v2024-08-01/user-applications?appType=coreApp&organizationId=' + process.env.SANITY_ORGANIZATION_ID, { + headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } + }) + .then(r => r.ok ? r.json() : []) + .then(apps => { + const list = Array.isArray(apps) ? apps : []; + const match = list.find(a => a.title === 'CodingCat Ops & Revenue OS'); + if (match && match.id) console.log(match.id); + }) + .catch(() => {}); + ") + if [ -n "$EXISTING_APP_ID" ]; then + echo "Found existing CodingCat Ops & Revenue OS app: $EXISTING_APP_ID" + SANITY_OPS_APP_ID="$EXISTING_APP_ID" npx sanity deploy -y + else + echo "Creating and deploying new CodingCat Ops & Revenue OS app in organization $ORG_ID..." + npx sanity deploy -y --create --title "CodingCat Ops & Revenue OS" + fi + env: + SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + - name: Promote Stack to Organization Scope run: | mkdir -p .sanity @@ -133,11 +262,11 @@ jobs: env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} - - name: Deploy Sanity Blueprints Functions + - name: Deploy Sanity Blueprints & Poll Synchronously Until Completed run: | ORG_ID=$(node -e " fetch('https://api.sanity.io/v2021-06-07/projects/${{ vars.SANITY_STUDIO_PROJECT_ID }}', { - headers: { Authorization: 'Bearer ${{ secrets.SANITY_AUTH_TOKEN }}' } + headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } }) .then(r => r.json()) .then(d => { @@ -149,7 +278,62 @@ jobs: echo "Resolved Organization ID: $ORG_ID" mkdir -p .sanity echo "{\"organizationId\":\"$ORG_ID\"}" > .sanity/blueprint.config.json + + echo "=== Previous Stack Info & Logs ===" + pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true + pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} || true + + echo "=== Starting Blueprint Deployment ===" pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --no-wait + + echo "=== Synchronously Polling Blueprint Stack Operation Until Terminal State ===" + ORG_ID="$ORG_ID" STACK_NAME="${{ vars.SANITY_STUDIO_DATASET }}" node -e " + const token = process.env.SANITY_AUTH_TOKEN; + const orgId = process.env.ORG_ID; + const stackName = process.env.STACK_NAME; + const headers = { + Accept: 'application/json', + Authorization: 'Bearer ' + token, + 'X-Sanity-Scope-Type': 'organization', + 'X-Sanity-Scope-Id': orgId, + }; + (async () => { + const stacksRes = await fetch('https://api.sanity.io/v2026-06-15/blueprints/stacks', { headers }); + if (!stacksRes.ok) throw new Error('Failed to list stacks: HTTP ' + stacksRes.status); + const stacks = await stacksRes.json(); + const stack = stacks.find(s => s.name === stackName || s.id === stackName); + if (!stack) throw new Error('Stack not found: ' + stackName); + console.log('Polling Stack:', stack.name, '(' + stack.id + ')'); + const deadline = Date.now() + 5 * 60 * 1000; + while (Date.now() < deadline) { + const res = await fetch('https://api.sanity.io/v2026-06-15/blueprints/stacks/' + stack.id, { headers }); + if (!res.ok) throw new Error('Failed to fetch stack ' + stack.id + ': HTTP ' + res.status); + const data = await res.json(); + const op = data.recentOperation; + const status = op?.status || 'NONE'; + console.log('[' + new Date().toISOString() + '] Operation ' + (op?.id || 'n/a') + ' status: ' + status); + if (status === 'COMPLETED' || status === 'NONE') { + console.log('โœ” Blueprint Stack operation settled with status:', status); + process.exit(0); + } + if (status === 'FAILED' || status === 'CANCELLED') { + console.error('โœ– Blueprint Stack operation failed:', JSON.stringify(op, null, 2)); + const logsRes = await fetch('https://api.sanity.io/v2026-06-15/blueprints/logs?stackId=' + stack.id + (op?.id ? '&operationId=' + op.id : ''), { headers }); + if (logsRes.ok) { + const logs = await logsRes.json(); + console.error('Operation logs:', JSON.stringify(logs, null, 2)); + } + process.exit(1); + } + await new Promise(r => setTimeout(r, 4000)); + } + console.error('โœ– Timed out waiting 5 minutes for Blueprint Stack operation to complete'); + process.exit(1); + })().catch(err => { console.error(err); process.exit(1); }); + " + + echo "=== Verified Post-Deploy Stack Info ===" + pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} SANITY_API_WRITE_TOKEN: ${{ secrets.SANITY_API_WRITE_TOKEN }} diff --git a/apps/ops/sanity.cli.ts b/apps/ops/sanity.cli.ts index 9da4e20e..c2313ab1 100644 --- a/apps/ops/sanity.cli.ts +++ b/apps/ops/sanity.cli.ts @@ -4,6 +4,15 @@ export default defineCliConfig({ app: { organizationId: process.env.SANITY_ORGANIZATION_ID || "ovF2qiKSO", entry: "./src/index.tsx", + title: "CodingCat Ops & Revenue OS", }, + ...(process.env.SANITY_OPS_APP_ID + ? { + deployment: { + appId: process.env.SANITY_OPS_APP_ID, + }, + } + : {}), }); + From 6acf5a799e5a65731bfefba7ae93770a40765e5d Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 09:27:18 -0400 Subject: [PATCH 04/10] fix(sanity): pin deployed ops appId yiugiba2sjnhpehqmky6nulc and remove broken beta defineApplication from blueprint (#756) --- apps/ops/sanity.cli.ts | 11 ++++------- sanity.blueprint.ts | 15 --------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/apps/ops/sanity.cli.ts b/apps/ops/sanity.cli.ts index c2313ab1..97201a93 100644 --- a/apps/ops/sanity.cli.ts +++ b/apps/ops/sanity.cli.ts @@ -6,13 +6,10 @@ export default defineCliConfig({ entry: "./src/index.tsx", title: "CodingCat Ops & Revenue OS", }, - ...(process.env.SANITY_OPS_APP_ID - ? { - deployment: { - appId: process.env.SANITY_OPS_APP_ID, - }, - } - : {}), + deployment: { + appId: process.env.SANITY_OPS_APP_ID || "yiugiba2sjnhpehqmky6nulc", + }, }); + diff --git a/sanity.blueprint.ts b/sanity.blueprint.ts index 29946604..ca44156e 100644 --- a/sanity.blueprint.ts +++ b/sanity.blueprint.ts @@ -1,26 +1,11 @@ import { - defineApplication, defineBlueprint, defineDocumentFunction, defineScheduledFunction, - defineWindowView, } from "@sanity/blueprints"; export default defineBlueprint({ resources: [ - defineApplication({ - name: "codingcat-ops", - title: "CodingCat Ops & Revenue OS", - root: "./apps/ops", - views: [ - defineWindowView({ - name: "main", - title: "CodingCat Ops & Revenue OS", - src: "./src/index.tsx", - dock: { group: "applications", order: 10 }, - }), - ], - }), defineDocumentFunction({ name: "syndicate-content", displayName: "Syndicate Content (Dev.to & Hashnode)", From 6c4b248ceecff3bfdd049a5259b161b49246f685 Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 09:33:49 -0400 Subject: [PATCH 05/10] ci: enable --verbose on all sanity blueprints commands in deploy workflow --- .github/workflows/deploy.yml | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e355a0bd..1f349fdb 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -92,7 +92,7 @@ jobs: run: | mkdir -p .sanity echo '{"projectId":"${{ vars.SANITY_STUDIO_PROJECT_ID }}"}' > .sanity/blueprint.config.json - pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force || true + pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force --verbose || true env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} @@ -115,10 +115,13 @@ jobs: echo "=== Previous Stack Info & Logs ===" pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true - pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} || true + pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true - echo "=== Starting Blueprint Deployment ===" - pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --no-wait + echo "=== Blueprint Deployment Plan ===" + pnpm exec sanity blueprints plan --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true + + echo "=== Starting Blueprint Deployment (--verbose) ===" + pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --no-wait --verbose echo "=== Synchronously Polling Blueprint Stack Operation Until Terminal State ===" ORG_ID="$ORG_ID" STACK_NAME="${{ vars.SANITY_STUDIO_DATASET }}" node -e " @@ -166,8 +169,9 @@ jobs: })().catch(err => { console.error(err); process.exit(1); }); " - echo "=== Verified Post-Deploy Stack Info ===" + echo "=== Verified Post-Deploy Stack Info & Logs (--verbose) ===" pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose + pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --limit 50 --verbose || true env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} SANITY_API_WRITE_TOKEN: ${{ secrets.SANITY_API_WRITE_TOKEN }} @@ -258,7 +262,7 @@ jobs: run: | mkdir -p .sanity echo '{"projectId":"${{ vars.SANITY_STUDIO_PROJECT_ID }}"}' > .sanity/blueprint.config.json - pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force || true + pnpm exec sanity blueprints promote --project-id ${{ vars.SANITY_STUDIO_PROJECT_ID }} --stack ${{ vars.SANITY_STUDIO_DATASET }} --force --verbose || true env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} @@ -281,10 +285,13 @@ jobs: echo "=== Previous Stack Info & Logs ===" pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true - pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} || true + pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true + + echo "=== Blueprint Deployment Plan ===" + pnpm exec sanity blueprints plan --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose || true - echo "=== Starting Blueprint Deployment ===" - pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --no-wait + echo "=== Starting Blueprint Deployment (--verbose) ===" + pnpm exec sanity blueprints deploy --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --no-wait --verbose echo "=== Synchronously Polling Blueprint Stack Operation Until Terminal State ===" ORG_ID="$ORG_ID" STACK_NAME="${{ vars.SANITY_STUDIO_DATASET }}" node -e " @@ -332,8 +339,9 @@ jobs: })().catch(err => { console.error(err); process.exit(1); }); " - echo "=== Verified Post-Deploy Stack Info ===" + echo "=== Verified Post-Deploy Stack Info & Logs (--verbose) ===" pnpm exec sanity blueprints info --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --verbose + pnpm exec sanity blueprints logs --organization-id "$ORG_ID" --stack ${{ vars.SANITY_STUDIO_DATASET }} --limit 50 --verbose || true env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} SANITY_API_WRITE_TOKEN: ${{ secrets.SANITY_API_WRITE_TOKEN }} From edf8ec3cdf6d0dab6d8125515eedeca048021524 Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 09:49:11 -0400 Subject: [PATCH 06/10] feat(ops): scope Sanity App SDK to (Dev)/(Production) titles and target dataset --- .github/workflows/deploy.yml | 46 +++++++++++++++++++++++++++++------- apps/ops/sanity.cli.ts | 15 ++++++++++-- apps/ops/src/App.tsx | 15 +++++++++--- apps/ops/src/index.tsx | 17 ++++++++++--- 4 files changed, 77 insertions(+), 16 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1f349fdb..1e4d6f45 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -66,6 +66,12 @@ jobs: .catch(err => { console.error(err); process.exit(1); }); ") export SANITY_ORGANIZATION_ID="$ORG_ID" + if [ "${{ vars.SANITY_STUDIO_DATASET }}" = "dev" ]; then + APP_TITLE="CodingCat Ops & Revenue OS (Dev)" + else + APP_TITLE="CodingCat Ops & Revenue OS (Production)" + fi + export APP_TITLE EXISTING_APP_ID=$(node -e " fetch('https://api.sanity.io/v2024-08-01/user-applications?appType=coreApp&organizationId=' + process.env.SANITY_ORGANIZATION_ID, { headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } @@ -73,20 +79,29 @@ jobs: .then(r => r.ok ? r.json() : []) .then(apps => { const list = Array.isArray(apps) ? apps : []; - const match = list.find(a => a.title === 'CodingCat Ops & Revenue OS'); + const targetTitle = process.env.APP_TITLE; + const isDev = process.env.SANITY_APP_DATASET === 'dev'; + const match = list.find(a => + a.title === targetTitle || + (isDev && (a.id === 'yiugiba2sjnhpehqmky6nulc' || a.title === 'CodingCat Ops & Revenue OS')) + ); if (match && match.id) console.log(match.id); }) .catch(() => {}); ") if [ -n "$EXISTING_APP_ID" ]; then - echo "Found existing CodingCat Ops & Revenue OS app: $EXISTING_APP_ID" + echo "Found existing $APP_TITLE app: $EXISTING_APP_ID" SANITY_OPS_APP_ID="$EXISTING_APP_ID" npx sanity deploy -y else - echo "Creating and deploying new CodingCat Ops & Revenue OS app in organization $ORG_ID..." - npx sanity deploy -y --create --title "CodingCat Ops & Revenue OS" + echo "Creating and deploying new $APP_TITLE app in organization $ORG_ID..." + npx sanity deploy -y --create --title "$APP_TITLE" fi env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} + SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + SANITY_APP_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} + SANITY_APP_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} - name: Promote Stack to Organization Scope run: | @@ -236,6 +251,12 @@ jobs: .catch(err => { console.error(err); process.exit(1); }); ") export SANITY_ORGANIZATION_ID="$ORG_ID" + if [ "${{ vars.SANITY_STUDIO_DATASET }}" = "dev" ]; then + APP_TITLE="CodingCat Ops & Revenue OS (Dev)" + else + APP_TITLE="CodingCat Ops & Revenue OS (Production)" + fi + export APP_TITLE EXISTING_APP_ID=$(node -e " fetch('https://api.sanity.io/v2024-08-01/user-applications?appType=coreApp&organizationId=' + process.env.SANITY_ORGANIZATION_ID, { headers: { Authorization: 'Bearer ' + process.env.SANITY_AUTH_TOKEN } @@ -243,20 +264,29 @@ jobs: .then(r => r.ok ? r.json() : []) .then(apps => { const list = Array.isArray(apps) ? apps : []; - const match = list.find(a => a.title === 'CodingCat Ops & Revenue OS'); + const targetTitle = process.env.APP_TITLE; + const isDev = process.env.SANITY_APP_DATASET === 'dev'; + const match = list.find(a => + a.title === targetTitle || + (isDev && (a.id === 'yiugiba2sjnhpehqmky6nulc' || a.title === 'CodingCat Ops & Revenue OS')) + ); if (match && match.id) console.log(match.id); }) .catch(() => {}); ") if [ -n "$EXISTING_APP_ID" ]; then - echo "Found existing CodingCat Ops & Revenue OS app: $EXISTING_APP_ID" + echo "Found existing $APP_TITLE app: $EXISTING_APP_ID" SANITY_OPS_APP_ID="$EXISTING_APP_ID" npx sanity deploy -y else - echo "Creating and deploying new CodingCat Ops & Revenue OS app in organization $ORG_ID..." - npx sanity deploy -y --create --title "CodingCat Ops & Revenue OS" + echo "Creating and deploying new $APP_TITLE app in organization $ORG_ID..." + npx sanity deploy -y --create --title "$APP_TITLE" fi env: SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} + SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + SANITY_APP_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} + SANITY_APP_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} - name: Promote Stack to Organization Scope run: | diff --git a/apps/ops/sanity.cli.ts b/apps/ops/sanity.cli.ts index 97201a93..f794a72c 100644 --- a/apps/ops/sanity.cli.ts +++ b/apps/ops/sanity.cli.ts @@ -1,15 +1,26 @@ import { defineCliConfig } from "sanity/cli"; +const dataset = + process.env.SANITY_APP_DATASET || + process.env.SANITY_STUDIO_DATASET || + "production"; +const isDev = dataset === "dev"; + export default defineCliConfig({ app: { organizationId: process.env.SANITY_ORGANIZATION_ID || "ovF2qiKSO", entry: "./src/index.tsx", - title: "CodingCat Ops & Revenue OS", + title: isDev + ? "CodingCat Ops & Revenue OS (Dev)" + : "CodingCat Ops & Revenue OS (Production)", }, deployment: { - appId: process.env.SANITY_OPS_APP_ID || "yiugiba2sjnhpehqmky6nulc", + appId: + process.env.SANITY_OPS_APP_ID || + (isDev ? "yiugiba2sjnhpehqmky6nulc" : undefined), }, }); + diff --git a/apps/ops/src/App.tsx b/apps/ops/src/App.tsx index 14956d2a..9508f3f4 100644 --- a/apps/ops/src/App.tsx +++ b/apps/ops/src/App.tsx @@ -98,6 +98,12 @@ const ACTIVE_GMAIL_DEALS: SeededGmailDraft[] = [ ]; export function App() { + const projectId = process.env.SANITY_APP_PROJECT_ID || "hfh83o0w"; + const dataset = process.env.SANITY_APP_DATASET || "production"; + const isDev = dataset === "dev"; + const envLabel = isDev ? "Dev" : "Production"; + const siteOrigin = isDev ? "https://dev.codingcat.dev" : "https://codingcat.dev"; + const [activeTab, setActiveTab] = useState("crm"); const [discovering, setDiscovering] = useState(false); const [discoveredProspects, setDiscoveredProspects] = useState>([]); @@ -109,7 +115,7 @@ export function App() { const handleDiscoverOutbound = async () => { setDiscovering(true); try { - const res = await fetch("https://codingcat.dev/api/sponsors/outbound"); + const res = await fetch(`${siteOrigin}/api/sponsors/outbound`); if (res.ok) { const data = await res.json(); setDiscoveredProspects(data.prospects || []); @@ -125,9 +131,12 @@ export function App() {
-

CodingCat.dev Revenue & Booking OS

+

+ CodingCat.dev Revenue & Booking OS ({envLabel}) +

- Unified Sanity App SDK Workspace · Project hfh83o0w (Production) + Unified Sanity App SDK Workspace · Project {projectId} · Dataset{" "} + {dataset} ({envLabel})

diff --git a/apps/ops/src/index.tsx b/apps/ops/src/index.tsx index bb9f8216..4140aef5 100644 --- a/apps/ops/src/index.tsx +++ b/apps/ops/src/index.tsx @@ -4,10 +4,13 @@ import { studioTheme, ThemeProvider } from "@sanity/ui"; import { StrictMode } from "react"; import { App } from "./App"; +const projectId = process.env.SANITY_APP_PROJECT_ID || "hfh83o0w"; +const dataset = process.env.SANITY_APP_DATASET || "production"; + const config: SanityConfig[] = [ { - projectId: "hfh83o0w", - dataset: "production", + projectId, + dataset, }, ]; @@ -15,7 +18,14 @@ export default function RootApp() { return ( - Loading CodingCat.dev Ops...
}> + + Loading CodingCat.dev Ops ({dataset === "dev" ? "Dev" : "Production"})... +
+ } + > @@ -23,3 +33,4 @@ export default function RootApp() { ); } + From 3acc9fd62dbf0655fe8a56492ad6521731349018 Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 11:46:58 -0400 Subject: [PATCH 07/10] feat(sanity): add threads social field to user/guest schema --- apps/sanity/schemas/partials/user.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/sanity/schemas/partials/user.ts b/apps/sanity/schemas/partials/user.ts index ca8dd9d7..f4baf6c2 100644 --- a/apps/sanity/schemas/partials/user.ts +++ b/apps/sanity/schemas/partials/user.ts @@ -85,6 +85,10 @@ const content = defineType({ name: "substack", type: "string", }), + defineField({ + name: "threads", + type: "string", + }), defineField({ name: "tiktok", type: "string", From 3a7a791cb1ea0420779a8bfa6a09e62599147cba Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 11:57:36 -0400 Subject: [PATCH 08/10] feat(sanity): sync 256 newly discovered guest socials into Sanity datasets --- .github/workflows/deploy.yml | 16 + apps/sanity/scripts/sync-guest-socials.mjs | 1659 ++++++++++++++++++++ 2 files changed, 1675 insertions(+) create mode 100644 apps/sanity/scripts/sync-guest-socials.mjs diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1e4d6f45..1f84bd07 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -42,6 +42,14 @@ jobs: path: /tmp/sanity-production-backup.ndjson.gz retention-days: 30 + - name: Sync Enriched Guest Socials to Sanity Dataset + run: node apps/sanity/scripts/sync-guest-socials.mjs + env: + SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + SANITY_API_WRITE_TOKEN: ${{ secrets.SANITY_API_WRITE_TOKEN }} + SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} + - name: Deploy Sanity Studio run: npx sanity deploy -y working-directory: apps/sanity @@ -227,6 +235,14 @@ jobs: path: /tmp/sanity-production-backup.ndjson.gz retention-days: 30 + - name: Sync Enriched Guest Socials to Sanity Dataset + run: node apps/sanity/scripts/sync-guest-socials.mjs + env: + SANITY_AUTH_TOKEN: ${{ secrets.SANITY_AUTH_TOKEN }} + SANITY_API_WRITE_TOKEN: ${{ secrets.SANITY_API_WRITE_TOKEN }} + SANITY_STUDIO_PROJECT_ID: ${{ vars.SANITY_STUDIO_PROJECT_ID }} + SANITY_STUDIO_DATASET: ${{ vars.SANITY_STUDIO_DATASET }} + - name: Deploy Sanity Studio run: npx sanity deploy -y working-directory: apps/sanity diff --git a/apps/sanity/scripts/sync-guest-socials.mjs b/apps/sanity/scripts/sync-guest-socials.mjs new file mode 100644 index 00000000..677fccc6 --- /dev/null +++ b/apps/sanity/scripts/sync-guest-socials.mjs @@ -0,0 +1,1659 @@ +#!/usr/bin/env node +/** + * Syncs the 147 enriched guest social profiles (+256 newly discovered social links) + * into Sanity (production & dev datasets). + */ +const PROJECT_ID = process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w"; +const DATASET = process.env.SANITY_STUDIO_DATASET || "production"; +const TOKEN = process.env.SANITY_API_WRITE_TOKEN || process.env.SANITY_AUTH_TOKEN; + +const PATCHES = [ + { + "_id": "RIgC5r4TJ0hCGOzxHt52Uf", + "title": "Adam Argyle", + "socials": { + "github": "https://github.com/argyleink", + "twitter": "https://twitter.com/argyleink", + "youtube": "https://www.youtube.com/c/AdamArgyleInk", + "mastodon": "https://front-end.social/@argyleink", + "bluesky": "https://bsky.app/profile/nerdy.dev", + "linkedin": "https://www.linkedin.com/in/adamargyle" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt5Qpc", + "title": "Adam Bradley", + "socials": { + "github": "https://github.com/adamdbradley", + "twitter": "https://twitter.com/adamdbradley", + "instagram": "https://www.instagram.com/figma", + "bluesky": "https://bsky.app/profile/adambradley.bsky.social", + "threads": "https://www.threads.net/@figma" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt55CK", + "title": "Adewale Abati", + "socials": { + "github": "https://github.com/acekyd", + "linkedin": "https://www.linkedin.com/in/acekyd/", + "stackoverflow": "https://stackoverflow.com/users/1945274/acekyd", + "twitch": "https://www.twitch.tv/elpunish3rr/", + "twitter": "https://twitter.com/Ace_KYD", + "youtube": "https://www.youtube.com/acekyd", + "instagram": "https://instagram.com/acekydtv", + "tiktok": "https://tiktok.com/@acekydtv", + "bluesky": "https://bsky.app/profile/acekyd.bsky.social", + "threads": "https://www.threads.net/@acekydtv" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt52AL", + "title": "Alex Feldman", + "socials": { + "linkedin": "https://www.linkedin.com/in/alexanderfeldman/", + "bluesky": "https://bsky.app/profile/hafeldman17.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt50CP", + "title": "Alex Gogan", + "socials": { + "github": "https://github.com/alx-andru", + "twitter": "https://twitter.com/alexg0g", + "linkedin": "https://www.linkedin.com/in/agogan/", + "bluesky": "https://bsky.app/profile/alx-andru.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt51q1", + "title": "Alex Ruheni", + "socials": { + "github": "https://github.com/ruheni", + "twitter": "https://twitter.com/ruheni_alex", + "bluesky": "https://bsky.app/profile/ruheni.blue", + "mastodon": "https://hachyderm.io/@ruheni" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4r1N", + "title": "Alex Trost", + "socials": { + "github": "https://github.com/a-trost", + "twitch": "https://www.twitch.tv/trostcodes", + "twitter": "https://twitter.com/trostcodes", + "bluesky": "https://bsky.app/profile/trost.codes", + "linkedin": "https://www.linkedin.com/in/trostcodes/", + "tiktok": "https://www.tiktok.com/@trostcodes" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4hvQ", + "title": "Alexander Gallego", + "socials": { + "github": "https://github.com/emaxerrno", + "twitter": "https://twitter.com/emaxerrno", + "linkedin": "https://www.linkedin.com/in/alexandergallego/" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4lh8", + "title": "Alexander Lichter", + "socials": { + "github": "https://github.com/manniL/", + "linkedin": "https://www.linkedin.com/in/alexanderlichter/", + "mastodon": "https://hachyderm.io/@manniL", + "twitch": "https://www.twitch.tv/TheAlexLichter/", + "twitter": "https://twitter.com/thealexlichter", + "youtube": "https://www.youtube.com/@TheAlexLichter", + "bluesky": "https://bsky.app/profile/thealexlichter.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4lHj", + "title": "Ali Spittel", + "socials": { + "github": "https://github.com/aspittel", + "twitter": "https://twitter.com/ASpittel", + "youtube": "https://www.youtube.com/alispitteldev", + "bluesky": "https://bsky.app/profile/alispit.tel" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4cR1", + "title": "Alyssa Nicoll", + "socials": { + "github": "https://github.com/alyssamichelle", + "twitch": "https://www.twitch.tv/CodeItLive", + "twitter": "https://twitter.com/alyssanicoll", + "youtube": "https://www.youtube.com/channel/UC_VUp1NHZnnh8DAS2d-c46A", + "linkedin": "https://www.linkedin.com/in/alyssa-nicoll", + "bluesky": "https://bsky.app/profile/alyssanicoll.bsky.social", + "mastodon": "https://www.youtube.com/@AngularAirPodcast" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4eZ7", + "title": "Amy Dutton", + "socials": { + "github": "https://github.com/ahaywood", + "linkedin": "https://www.linkedin.com/in/amy-dutton/", + "twitter": "https://twitter.com/selfteachme", + "youtube": "http://youtube.com/c/selfteachme", + "instagram": "http://instagram.com/selfteachme", + "bluesky": "https://bsky.app/profile/selfteach.me", + "threads": "https://www.threads.net/@selfteachme" + } + }, + { + "_id": "4c91217a-f5f9-44ba-a22a-18af2329da3a", + "title": "Andrea Wu", + "socials": { + "github": "http://github.com/andreaowu", + "medium": "https://andreaowu.medium.com/", + "linkedin": "https://www.linkedin.com/in/andreaowu" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4aYA", + "title": "Ankita Kulkarni", + "socials": { + "linkedin": "https://www.linkedin.com/in/kulkarniankita/", + "twitter": "https://twitter.com/kulkarniankita9", + "youtube": "https://www.youtube.com/channel/UCbklMsA4tFtq4DEf1dyViQw", + "bluesky": "https://bsky.app/profile/kulkarniankita.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4YfJ", + "title": "Anthony Campolo", + "socials": { + "github": "https://github.com/ajcwebdev", + "twitter": "https://twitter.com/ajcwebdev", + "youtube": "https://youtube.com/@ajcwebdev", + "linkedin": "https://www.linkedin.com/in/ajcwebdev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4Yzd", + "title": "Anuradha Kumari", + "socials": { + "devto": "https://dev.to/anuradhakumari", + "github": "https://github.com/anuk79", + "linkedin": "https://www.linkedin.com/in/anuradha15/", + "twitter": "https://twitter.com/miracle_404", + "youtube": "https://www.youtube.com/channel/UCzv8q9-tSIQuTDzgB1BgXMQ", + "instagram": "https://www.instagram.com/anuradha_404/", + "threads": "https://www.threads.net/@anuradha_404" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4BTU", + "title": "April Wensel", + "socials": { + "github": "https://github.com/aprilw", + "twitter": "https://twitter.com/aprilwensel", + "linkedin": "https://linkedin.com/in/aprilwensel", + "mastodon": "https://mastodon.social/@aprilwensel", + "bluesky": "https://bsky.app/profile/aprilwensel.com" + } + }, + { + "_id": "2795b7e9-0450-410d-942c-7f21f2ecbce8", + "title": "Balki Kodarapu", + "socials": { + "linkedin": "https://www.linkedin.com/in/balkikodarapu/" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3yr4", + "title": "BekahHW", + "socials": { + "github": "https://twitter.com/BekahHW", + "instagram": "https://www.instagram.com/BekahHW", + "linkedin": "https://www.linkedin.com/in/bekah-hawrot-weigel/", + "twitter": "https://twitter.com/BekahHW", + "youtube": "https://www.youtube.com/@bekahhw", + "bluesky": "https://bsky.app/profile/bekahhw.com", + "threads": "https://www.threads.net/@BekahHW" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt48CG", + "title": "Ben Hong", + "socials": { + "github": "https://github.com/bencodezen", + "mastodon": "https://m.webtoo.ls/@bencodezen", + "twitter": "https://twitter.com/bencodezen", + "youtube": "https://www.youtube.com/bencodezen", + "bluesky": "https://bsky.app/profile/bencodezen.io", + "linkedin": "https://linkedin.com/in/bencodezen", + "instagram": "https://www.instagram.com/bencodezen", + "threads": "https://www.threads.net/@bencodezen" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3zBO", + "title": "Ben Myers", + "socials": { + "github": "https://github.com/BenDMyers", + "linkedin": "https://www.linkedin.com/in/BenDMyers/", + "mastodon": "https://a11y.info/@ben", + "twitch": "https://www.twitch.tv/SomeAnticsDev", + "twitter": "https://twitter.com/BenDMyers", + "youtube": "https://www.youtube.com/channel/UCoc1J1XEEtg4sNrt3V-tNRw", + "bluesky": "https://bsky.app/profile/benmyers.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3ybp", + "title": "Brad Frost", + "socials": { + "codepen": "http://codepen.io/bradfrost/", + "github": "https://github.com/bradfrost", + "instagram": "http://instagram.com/brad_frost", + "lastfm": "http://www.last.fm/user/brad_frost", + "linkedin": "https://www.linkedin.com/in/bradfrost", + "mastodon": "https://mastodon.social/@brad_frost", + "spotify": "https://open.spotify.com/user/ienjoyhotsoup", + "twitter": "https://twitter.com/brad_frost/", + "youtube": "https://www.youtube.com/@brad_frost", + "bluesky": "https://bsky.app/profile/bradfrost.bsky.social", + "threads": "https://www.threads.net/@brad_frost" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4XlQ", + "title": "Brad Garropy", + "socials": { + "discord": "https://bradgarropy.com/discord", + "github": "https://github.com/bradgarropy", + "twitch": "https://twitch.tv/bradgarropy", + "twitter": "https://twitter.com/bradgarropy", + "youtube": "https://youtube.com/bradgarropy", + "mastodon": "https://youtube.com/@bradgarropy", + "instagram": "https://instagram.com/bradgarropy", + "bluesky": "https://bsky.app/profile/bradgarropy.com", + "linkedin": "https://linkedin.com/in/bradgarropy", + "threads": "https://www.threads.net/@bradgarropy" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3yMa", + "title": "Braden Sidoti", + "socials": { + "linkedin": "https://www.linkedin.com/in/braden-sidoti-25676537/", + "twitter": "https://twitter.com/bsinthewild", + "bluesky": "https://bsky.app/profile/bs14.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3fqM", + "title": "Brandon Roberts", + "socials": { + "github": "https://github.com/brandonroberts", + "twitter": "https://twitter.com/brandontroberts", + "youtube": "https://www.youtube.com/@BrandonRobertsDev", + "linkedin": "https://www.linkedin.com/in/brandontroberts/", + "bluesky": "https://bsky.app/profile/brandonroberts.dev" + } + }, + { + "_id": "c14bf99a-2345-47d9-b3cb-81b6ed30bfe4", + "title": "Brian Clark", + "socials": { + "github": "https://github.com/clarkio", + "instagram": "https://www.instagram.com/_clarkio/?hl=en", + "linkedin": "https://www.linkedin.com/in/brianclarkdev/", + "polywork": "https://www.polywork.com/clarkio", + "twitch": "https://www.twitch.tv/clarkio", + "twitter": "https://x.com/_clarkio", + "youtube": "https://www.youtube.com/channel/UCID02LhTNYYhWbok3zyggOw", + "tiktok": "https://tiktok.com/@clarkio", + "bluesky": "https://bsky.app/profile/brianclark.social", + "threads": "https://www.threads.net/@_clarkio" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3Mpe", + "title": "Brian Douglas", + "socials": { + "github": "https://github.com/bdougie", + "linkedin": "https://www.linkedin.com/in/brianldouglas/", + "twitter": "https://twitter.com/bdougieYO", + "bluesky": "https://bsky.app/profile/bizza.pizza", + "instagram": "https://instagram.com/bdougieyo", + "youtube": "https://youtube.com/@bdougie", + "threads": "https://www.threads.net/@bdougieyo" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3Lvl", + "title": "Brian Li", + "socials": { + "github": "https://github.com/bwhli", + "linkedin": "https://www.linkedin.com/in/bwhli/?originalSubdomain=jp", + "twitter": "https://twitter.com/bwhli", + "instagram": "https://instagram.com/bwhli", + "threads": "https://www.threads.net/@bwhli" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3MG5", + "title": "Brian Rinaldi", + "socials": { + "github": "https://github.com/remotesynth", + "linkedin": "https://www.linkedin.com/in/brianrinaldi/", + "twitter": "https://twitter.com/remotesynth", + "mastodon": "https://mastodon.xyz/@remotesynth", + "bluesky": "https://bsky.app/profile/remotesynthesis.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3MVK", + "title": "Brittany Walker", + "socials": { + "github": "https://github.com/brittanyrw", + "linkedin": "https://www.linkedin.com/in/brittanyrwalker/", + "polywork": "https://www.polywork.com/musicalwebdev", + "twitter": "https://twitter.com/musicalwebdev", + "bluesky": "https://bsky.app/profile/musicalwebdev.bsky.social" + } + }, + { + "_id": "9ea0a439-2219-455b-97a2-4c21559ce8e5", + "title": "Brittney Postma (Guest)", + "socials": { + "twitter": "https://x.com/BrittneyPostma", + "bluesky": "https://bsky.app/profile/brittneypostma.bsky.social", + "github": "https://github.com/brittneypostma", + "linkedin": "https://www.linkedin.com/in/brittneypostma/", + "youtube": "https://www.youtube.com/@BrittneyPostma" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt31Rb", + "title": "Bryan Robinson", + "socials": { + "github": "https://github.com/brob", + "mastodon": "https://hachyderm.io/@brob", + "twitch": "https://www.twitch.tv/bryanlrobinson", + "twitter": "https://twitter.com/brob", + "bluesky": "https://bsky.app/profile/brob.dev", + "youtube": "https://www.youtube.com/@bryanlrobinson", + "linkedin": "https://linkedin.com/in/bryanlrobinson" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt25LQ", + "title": "Cassidy Williams", + "socials": { + "codepen": "https://codepen.io/cassidoo/", + "github": "https://github.com/cassidoo", + "linkedin": "https://www.linkedin.com/in/cassidoo/", + "twitter": "https://twitter.com/cassidoo", + "bluesky": "https://bsky.app/profile/cassidoo.co", + "mastodon": "https://notacult.social/@cassidoo" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt2aeE", + "title": "Chris Biscardi", + "socials": { + "dribbble": "https://dribbble.com/chrisbiscardi", + "github": "https://github.com/christopherbiscardi", + "twitter": "https://twitter.com/chrisbiscardi", + "youtube": "http://youtube.com/c/chrisbiscardi", + "bluesky": "https://bsky.app/profile/chrisbiscardi.bsky.social", + "mastodon": "https://hachyderm.io/@chrisbiscardi" + } + }, + { + "_id": "6cd2fb87-5431-424c-a0cc-267f6890f4ba", + "title": "Chris Ferdinandi", + "socials": { + "linkedin": "https://www.linkedin.com/in/cferdinandi/", + "mastodon": "https://mastodon.social/@cferdinandi", + "bluesky": "https://bsky.app/profile/cferdinandi.bsky.social" + } + }, + { + "_id": "5cb367ce-a218-4c3d-8614-a64e188a08c1", + "title": "Chris Sev", + "socials": { + "github": "https://github.com/chris-sev", + "linkedin": "https://www.linkedin.com/in/chrissev", + "twitter": "https://twitter.com/chris__sev", + "youtube": "https://www.youtube.com/c/ChrisSev", + "bluesky": "https://bsky.app/profile/chrissev.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt1ll9", + "title": "Chris Swithinbank", + "socials": { + "github": "https://github.com/delucis/", + "mastodon": "https://m.webtoo.ls/@swithinbank", + "twitter": "https://twitter.com/swithinbank", + "bluesky": "https://bsky.app/profile/chrisswithin.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt1Hvn", + "title": "Christopher Burns", + "socials": { + "github": "https://github.com/burnedchris", + "linkedin": "https://www.linkedin.com/in/burnedchris/", + "twitch": "https://www.twitch.tv/burnedchris", + "twitter": "https://twitter.com/burnedchris", + "bluesky": "https://bsky.app/profile/inth.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0IdT", + "title": "Clark Sell", + "socials": { + "github": "https://github.com/theClarkSell", + "twitter": "https://twitter.com/theclarksell", + "linkedin": "https://www.linkedin.com/in/theclarksell/", + "youtube": "https://www.youtube.com/clarksell", + "instagram": "https://instagram.com/theClarkSell", + "bluesky": "https://bsky.app/profile/clarksell.bsky.social", + "threads": "https://www.threads.net/@theClarkSell" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0UgK", + "title": "Colby Fayock", + "socials": { + "github": "https://github.com/colbyfayock", + "mastodon": "https://hachyderm.io/@colbyfayock", + "twitch": "https://www.twitch.tv/colbyfayock", + "twitter": "https://twitter.com/colbyfayock", + "youtube": "https://www.youtube.com/colbyfayock", + "bluesky": "https://bsky.app/profile/colbyfayock.com", + "instagram": "https://www.instagram.com/colbyfayock/", + "threads": "https://www.threads.net/@colbyfayock" + } + }, + { + "_id": "8c1a2a76-b615-430b-96d8-0f80097dc370", + "title": "Corbin Crutchley", + "socials": { + "discord": "https://discord.com/invite/FMcvc6T", + "github": "https://github.com/crutchcorn", + "twitch": "https://www.twitch.tv/crutchcorn", + "twitter": "https://twitter.com/crutchcorn/", + "bluesky": "https://bsky.app/profile/crutchcorn.dev", + "linkedin": "https://www.linkedin.com/in/corbincrutchley/" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0IJ9", + "title": "Daniel Ribbens", + "socials": { + "github": "https://github.com/DanRibbens", + "linkedin": "https://www.linkedin.com/in/danribbens/", + "twitter": "https://twitter.com/DanielRibbens", + "instagram": "https://www.instagram.com/payloadcms/", + "threads": "https://www.threads.net/@payloadcms" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0Hyp", + "title": "Daniel Roe", + "socials": { + "github": "https://github.com/danielroe", + "mastodon": "https://mastodon.roe.dev/@daniel", + "twitch": "https://www.twitch.tv/danielroe", + "twitter": "https://twitter.com/danielcroe", + "youtube": "https://www.youtube.com/@danielroe", + "bluesky": "https://bsky.app/profile/danielroe.dev", + "linkedin": "https://www.linkedin.com/in/daniel-roe/", + "instagram": "https://www.instagram.com/daniel.c.roe", + "threads": "https://www.threads.net/@daniel.c.roe" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0HeV", + "title": "Debbie O'Brien", + "socials": { + "github": "https://github.com/debs-obrien", + "linkedin": "https://www.linkedin.com/in/debbie-o-brien-1a199975/", + "twitter": "https://twitter.com/debs_obrien", + "youtube": "https://www.youtube.com/c/DebbieOBrien", + "bluesky": "https://bsky.app/profile/debbie.codes" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0HPG", + "title": "Domitrius Clark", + "socials": { + "github": "https://github.com/domitriusclark", + "twitch": "https://twitch.com/domitriusclark", + "twitter": "https://twitter.com/domitriusclark", + "linkedin": "https://www.linkedin.com/in/domitriusclark/", + "bluesky": "https://bsky.app/profile/domitriusclark.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0GB3", + "title": "Dov Alperin", + "socials": { + "github": "https://github.com/DAlperin", + "twitter": "https://twitter.com/dovunderscore", + "mastodon": "https://mastodon.social/@dov", + "linkedin": "https://www.linkedin.com/in/dov-alperin" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0Gkc", + "title": "Eduardo San Martin Morote", + "socials": { + "github": "https://github.com/posva", + "mastodon": "https://m.webtoo.ls/@posva", + "twitter": "https://twitter.com/posva", + "bluesky": "https://bsky.app/profile/esm.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0GQI", + "title": "Ekene Eze (Kenny)", + "socials": { + "github": "https://github.com/kenny-io", + "twitter": "https://twitter.com/kenny_io", + "youtube": "https://www.youtube.com/c/EkeneEze", + "linkedin": "https://www.linkedin.com/in/ekeneeze/" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0F70", + "title": "Elizabeth Wilson", + "socials": { + "linkedin": "https://www.linkedin.com/in/elizabethtrumanwilson/", + "twitter": "https://twitter.com/TruWil", + "bluesky": "https://bsky.app/profile/wilsones13.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0FbU", + "title": "Emma Twersky", + "socials": { + "github": "https://github.com/twerske", + "instagram": "https://www.instagram.com/twerske/", + "linkedin": "https://www.linkedin.com/in/emmatwersky/", + "twitter": "https://twitter.com/twerske", + "bluesky": "https://bsky.app/profile/twerk.bsky.social", + "threads": "https://www.threads.net/@twerske" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0Erl", + "title": "Eric Simons", + "socials": { + "github": "https://github.com/EricSimons", + "linkedin": "https://www.linkedin.com/in/eric-simons-a464a664/", + "twitter": "https://twitter.com/ericsimons40", + "bluesky": "https://bsky.app/profile/esft.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0CKG", + "title": "Erik Hanchett", + "socials": { + "github": "https://github.com/ErikCH", + "twitter": "https://twitter.com/ErikCH", + "youtube": "https://www.youtube.com/c/programwitherik", + "bluesky": "https://bsky.app/profile/erikch.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0EcW", + "title": "Facundo Giuliani", + "socials": { + "github": "https://github.com/fgiuliani", + "linkedin": "https://www.linkedin.com/in/facundogiuliani/", + "twitter": "https://twitter.com/facundozurdo", + "bluesky": "https://bsky.app/profile/fgiuliani.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0BLI", + "title": "Grayson Hicks", + "socials": { + "github": "https://github.com/graysonhicks", + "twitter": "https://twitter.com/graysonhicks", + "instagram": "https://instagram.com/jgraysonhicks", + "threads": "https://www.threads.net/@jgraysonhicks" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0B63", + "title": "Greg Whitworth", + "socials": { + "github": "https://github.com/gregwhitworth", + "twitter": "https://twitter.com/gregwhitworth", + "linkedin": "https://www.linkedin.com/in/gregwhitworth/", + "bluesky": "https://bsky.app/profile/gregwhitworth.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0BaX", + "title": "Guillermo Rauch", + "socials": { + "github": "https://github.com/rauchg", + "instagram": "https://www.instagram.com/rauchg/", + "linkedin": "https://www.linkedin.com/in/guillermo-rauch-b834b917b/", + "twitter": "https://twitter.com/rauchg", + "bluesky": "https://bsky.app/profile/rauchg.blue", + "threads": "https://www.threads.net/@rauchg" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0Aqo", + "title": "Heather Buchel", + "socials": { + "linkedin": "https://www.linkedin.com/in/heather-buchel-92bb5b64/", + "mastodon": "https://hachyderm.io/@hbuchel", + "twitter": "https://twitter.com/hbuchel", + "bluesky": "https://bsky.app/profile/heather-buchel.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0AbZ", + "title": "Houssein Djirdeh", + "socials": { + "twitter": "https://twitter.com/hdjirdeh", + "bluesky": "https://bsky.app/profile/houssein.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0AHF", + "title": "Jake Rosenberg", + "socials": { + "twitter": "https://twitter.com/jakob_rosenberg", + "bluesky": "https://bsky.app/profile/jakerosenberg.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt09XW", + "title": "James Perkins", + "socials": { + "github": "https://github.com/perkinsjr/", + "twitter": "https://twitter.com/james_r_perkins", + "youtube": "https://www.youtube.com/@james-perkins", + "bluesky": "https://bsky.app/profile/jamesperkins.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt09ml", + "title": "James Q Quick", + "socials": { + "github": "https://github.com/jamesqquick", + "instagram": "https://instagram.com/jamesqquick", + "linkedin": "https://www.linkedin.com/in/jamesqquick/", + "tiktok": "https://www.tiktok.com/@jamesqquick", + "twitch": "https://www.twitch.tv/jamesqquick", + "twitter": "https://twitter.com/jamesqquick", + "youtube": "https://www.youtube.com/jamesqquick", + "bluesky": "https://bsky.app/profile/jamesqquick.bsky.social", + "threads": "https://www.threads.net/@jamesqquick" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt08OO", + "title": "James Vidler", + "socials": { + "github": "https://github.com/jamesvidler", + "linkedin": "https://www.linkedin.com/in/jameskvidler/", + "twitter": "https://twitter.com/jameskvidler", + "bluesky": "https://bsky.app/profile/fownhopeboy.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt07tu", + "title": "Jason Lengstorf", + "socials": { + "github": "https://github.com/jlengstorf", + "linkedin": "https://www.linkedin.com/in/jlengstorf/", + "twitch": "https://www.twitch.tv/jlengstorf", + "twitter": "https://twitter.com/jlengstorf", + "youtube": "https://www.youtube.com/channel/UCnty0z0pNRDgnuoirYXnC5A", + "mastodon": "https://youtube.com/@codetv-dev", + "bluesky": "https://bsky.app/profile/jason.energy", + "instagram": "https://instagram.com/jlengstorf", + "threads": "https://www.threads.net/@jlengstorf" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt07AB", + "title": "Jenn Junod", + "socials": { + "linkedin": "https://www.linkedin.com/in/jennjunod/", + "twitch": "https://www.twitch.tv/jennjunod", + "twitter": "https://twitter.com/jennjunod", + "youtube": "https://www.youtube.com/channel/UCOYqYy7ebj5j63TbdGB-Lcg", + "bluesky": "https://bsky.app/profile/jennjunod.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt06QS", + "title": "Jesse Hall", + "socials": { + "discord": "https://discord.com/invite/A9CnsVzzkZ", + "github": "https://github.com/codestackr", + "linkedin": "https://www.linkedin.com/in/codestackr/", + "twitch": "https://www.twitch.tv/elpunish3rr/", + "twitter": "https://twitter.com/codeSTACKr", + "youtube": "https://www.youtube.com/codestackr", + "bluesky": "https://bsky.app/profile/codestackr.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt06fh", + "title": "Jochum (wolfen)", + "socials": { + "github": "https://github.com/wolfenrain", + "linkedin": "https://www.linkedin.com/in/jochum-van-der-ploeg/", + "stackoverflow": "https://stackoverflow.com/users/1945274/acekyd", + "twitch": "https://www.twitch.tv/elpunish3rr/", + "twitter": "https://twitter.com/wolfenrain", + "youtube": "https://www.youtube.com/acekyd", + "mastodon": "https://mastodon.social/@wolfenrain", + "bluesky": "https://bsky.app/profile/wolfenra.in" + } + }, + { + "_id": "9a8d9256-114c-479d-af51-7fc9176b7abf", + "title": "Joe Casabona", + "socials": { + "bluesky": "https://bsky.app/profile/casabona.org", + "github": "https://github.com/jcasabona", + "instagram": "https://instagram.com/jcasabona", + "linkedin": "https://www.linkedin.com/in/jcasabona/", + "youtube": "https://www.youtube.com/@JoeCasa", + "threads": "https://www.threads.net/@jcasabona" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt06uw", + "title": "Joel Varty", + "socials": { + "linkedin": "https://www.linkedin.com/in/joelvarty", + "twitter": "https://twitter.com/joelvarty", + "bluesky": "https://bsky.app/profile/joelvarty.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt06BD", + "title": "Jon Meyers", + "socials": { + "github": "https://github.com/dijonmusters", + "twitter": "https://twitter.com/jonmeyers_io", + "youtube": "https://youtube.com/supabase", + "bluesky": "https://bsky.app/profile/jonmeyers.io" + } + }, + { + "_id": "dc5819bf-2835-40e2-8f94-73d6b6518329", + "title": "Jonathan Wilke", + "socials": { + "github": "https://github.com/jonathanwilke", + "linkedin": "https://www.linkedin.com/in/jonathan-wilke-766a83b8/", + "twitter": "https://x.com/jonathan_wilke", + "bluesky": "https://bsky.app/profile/jonathanwilke.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt05vy", + "title": "Jordan Powell", + "socials": { + "facebook": "https://www.facebook.com/thejordanpowell", + "github": "https://github.com/jordanpowell88", + "instagram": "https://www.instagram.com/thejordanpowell", + "linkedin": "https://www.linkedin.com/in/jordanpowell88/", + "twitter": "https://twitter.com/JordanPowell88", + "youtube": "https://www.youtube.com/channel/UCDNwR4FvrnQTYABq_rJuvAg", + "bluesky": "https://bsky.app/profile/jordanpowell.bsky.social", + "threads": "https://www.threads.net/@thejordanpowell" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt04x0", + "title": "Juan Andrรฉs", + "socials": { + "github": "https://github.com/juanwmedia", + "twitter": "https://twitter.com/juanwmedia", + "linkedin": "https://www.linkedin.com/in/juanwmedia/", + "youtube": "https://www.youtube.com/@juanwmedia", + "bluesky": "https://bsky.app/profile/juanandreses.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt05CF", + "title": "Juri Strumpflohner", + "socials": { + "github": "https://github.com/juristr", + "twitter": "https://twitter.com/juristr", + "bluesky": "https://bsky.app/profile/juri.dev", + "linkedin": "https://linkedin.com/in/juristr/", + "youtube": "https://youtube.com/@juristr" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt04IM", + "title": "Justin Duke", + "socials": { + "github": "https://github.com/jmduke", + "twitter": "https://twitter.com/jmduke", + "bluesky": "https://bsky.app/profile/jmduke.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt04hl", + "title": "Justin Schwartzenberger", + "socials": { + "github": "https://github.com/jschwarty", + "linkedin": "https://www.linkedin.com/in/justinschwartzenberger/", + "stackoverflow": "https://stackoverflow.com/users/349596/justin-schwartzenberger", + "twitter": "https://twitter.com/schwarty", + "bluesky": "https://bsky.app/profile/schwarty.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0437", + "title": "Katerina Skroumpelou", + "socials": { + "github": "https://github.com/mandarini", + "linkedin": "https://www.linkedin.com/in/katerinaskroumpelou/", + "medium": "https://pakotinia.medium.com/", + "twitter": "https://twitter.com/psybercity", + "bluesky": "https://bsky.app/profile/psyber.city" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0349", + "title": "Kathryn Grayson", + "socials": { + "devto": "https://dev.to/kathryngrayson", + "github": "https://github.com/kathryngraysonnanz", + "linkedin": "https://www.linkedin.com/in/kathryngrayson/", + "polywork": "https://www.polywork.com/kathrynkay", + "twitter": "https://twitter.com/kathryngrayson", + "bluesky": "https://bsky.app/profile/kgrayson.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt02ou", + "title": "Kellen Mace", + "socials": { + "github": "https://github.com/kellenmace", + "linkedin": "https://www.linkedin.com/in/kellenmace/", + "twitter": "https://twitter.com/kellenmace", + "bluesky": "https://bsky.app/profile/kellenmace.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt025B", + "title": "Kelly Vaughn", + "socials": { + "github": "https://github.com/kellyvaughn", + "instagram": "https://www.instagram.com/kelllyvaughn/", + "linkedin": "https://www.linkedin.com/in/kellyvaughn/", + "substack": "https://substack.com/@kvlly", + "twitter": "https://twitter.com/kvlly", + "bluesky": "https://bsky.app/profile/kvlly.com", + "threads": "https://www.threads.net/@kelllyvaughn" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt02KQ", + "title": "Kent C. Dodds", + "socials": { + "github": "https://github.com/kentcdodds", + "twitter": "https://twitter.com/kentcdodds", + "youtube": "https://www.youtube.com/@kentcdodds-vids", + "bluesky": "https://bsky.app/profile/kentcdodds.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt01pw", + "title": "Knut Melvaer", + "socials": { + "github": "https://github.com/kmelve", + "linkedin": "https://www.linkedin.com/in/knutmelvaer/", + "twitter": "https://twitter.com/kmelve", + "bluesky": "https://bsky.app/profile/knut.fyi" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt02Zf", + "title": "Lane Wagner", + "socials": { + "github": "https://github.com/wagslane", + "linkedin": "https://www.linkedin.com/in/wagslane/", + "twitter": "https://twitter.com/wagslane", + "bluesky": "https://bsky.app/profile/wagslane.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt01ah", + "title": "Lauren Lee", + "socials": { + "github": "https://github.com/laurenelee", + "linkedin": "https://www.linkedin.com/in/dev-lauren-lee/", + "twitter": "https://twitter.com/LoLoCoding", + "youtube": "https://www.youtube.com/channel/UCAXRntzYPySoBGSZJClcRlg", + "bluesky": "https://bsky.app/profile/laurenlee.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt01LS", + "title": "Laurie Barth", + "socials": { + "devto": "https://dev.to/laurieontech", + "github": "https://github.com/laurieontech", + "linkedin": "https://www.linkedin.com/in/lauriebarth/", + "polywork": "https://timeline.laurieontech.com/", + "twitter": "https://twitter.com/laurieontech", + "bluesky": "https://bsky.app/profile/laurieontech.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszy9J", + "title": "Lee Briggs", + "socials": { + "github": "https://github.com/jaxxstorm", + "linkedin": "https://www.linkedin.com/in/briggsl/", + "twitter": "https://twitter.com/briggsl", + "bluesky": "https://bsky.app/profile/brig.gs" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszyTd", + "title": "Lee Robinson", + "socials": { + "github": "https://github.com/leerob", + "linkedin": "https://www.linkedin.com/in/leeerob/", + "twitter": "https://twitter.com/leeerob", + "youtube": "https://www.youtube.com/@leerob", + "bluesky": "https://bsky.app/profile/leerobinson.bsky.social" + } + }, + { + "_id": "740e85e5-0635-4a59-9426-714467259091", + "title": "Luca Forstner", + "socials": { + "github": "https://github.com/lforst", + "linkedin": "https://www.linkedin.com/in/luca-forstner-10807a231/", + "twitter": "https://x.com/LucaForstner", + "bluesky": "https://bsky.app/profile/handle.invalid" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszpSl", + "title": "Lukas (spydon) Klingsbro", + "socials": { + "github": "https://github.com/spydon", + "linkedin": "https://www.linkedin.com/in/spydon/", + "twitter": "https://twitter.com/spyd0n", + "mastodon": "https://fosstodon.org/@spydon", + "bluesky": "https://bsky.app/profile/spydon.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszoj2", + "title": "Matthew Phillips", + "socials": { + "github": "https://github.com/matthewp", + "twitter": "https://twitter.com/matthewcp", + "bluesky": "https://bsky.app/profile/spooky.click" + } + }, + { + "_id": "91c2331d-0fa1-4905-8bfe-8f5b78f00c64", + "title": "Max Gerber", + "socials": { + "github": "https://github.com/maxwellgerber", + "linkedin": "https://www.linkedin.com/in/maxwellgerber/", + "bluesky": "https://bsky.app/profile/maxgerber.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszoTn", + "title": "Max Howell", + "socials": { + "github": "https://github.com/mxcl", + "twitter": "https://twitter.com/mxcl", + "linkedin": "https://www.linkedin.com/in/mxcl" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszoEY", + "title": "Maya Shavin", + "socials": { + "facebook": "https://www.facebook.com/mayashavin", + "github": "https://github.com/mayashavin", + "linkedin": "https://www.linkedin.com/in/mayashavin/", + "twitter": "https://twitter.com/MayaShavin", + "youtube": "https://www.youtube.com/@mayashavin", + "bluesky": "https://bsky.app/profile/mayashavin.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHsznzJ", + "title": "Michael Chan", + "socials": { + "discord": "http://discord.gg/lunchdev", + "github": "https://github.com/chantastic", + "twitter": "https://twitter.com/chantastic", + "youtube": "https://www.youtube.com/c/chantastic", + "mastodon": "https://www.youtube.com/@chantastic", + "instagram": "https://www.instagram.com/chantastic/", + "bluesky": "https://bsky.app/profile/michaelcwchan.bsky.social", + "threads": "https://www.threads.net/@chantastic" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHsznk4", + "title": "Michael Dowden", + "socials": { + "github": "https://github.com/mrdowden", + "linkedin": "https://www.linkedin.com/in/mrdowden/", + "medium": "https://mrdowden.medium.com/", + "tiktok": "https://www.tiktok.com/@mrdowden", + "twitch": "https://www.twitch.tv/andromedagalactic", + "twitter": "https://twitter.com/mrdowden", + "youtube": "https://www.youtube.com/@mrdowden", + "mastodon": "https://mastodon.social/@mrdowden", + "bluesky": "https://bsky.app/profile/mrdowden.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHsznUp", + "title": "Mike Hartington", + "socials": { + "github": "https://github.com/mhartington", + "linkedin": "https://www.linkedin.com/in/mike-hartington-63638362/", + "twitter": "https://twitter.com/mhartington", + "bluesky": "http://bsky.app/profile/mhartington.io" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszn0L", + "title": "Miลกko Hevery", + "socials": { + "github": "https://github.com/mhevery", + "twitter": "https://twitter.com/mhevery", + "bluesky": "https://bsky.app/profile/misko.dev" + } + }, + { + "_id": "162bab87-d65d-4c20-b625-6ee593ebaa45", + "title": "Muhammad Ahsan Ayaz", + "socials": { + "github": "https://github.com/ahsanayaz", + "linkedin": "https://www.linkedin.com/in/muhammad-ahsan-ayaz", + "twitter": "https://twitter.com/muhammad_ahsan", + "bluesky": "https://bsky.app/profile/codewithahsan.bsky.social", + "instagram": "https://instagram.com/code.with.ahsan", + "threads": "https://www.threads.net/@code.with.ahsan" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHsznFa", + "title": "Nader Dabit", + "socials": { + "github": "https://github.com/dabit3", + "linkedin": "https://www.linkedin.com/in/naderdabit/", + "twitter": "https://twitter.com/dabit3", + "youtube": "https://www.youtube.com/naderdabit", + "bluesky": "https://bsky.app/profile/dabit3.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszml6", + "title": "Nick DeJesus", + "socials": { + "github": "https://github.com/Dayhaysoos", + "twitter": "https://twitter.com/dayhaysoos", + "bluesky": "https://bsky.app/profile/dayhaysoos.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszeyR", + "title": "Nick Hodges", + "socials": { + "github": "https://github.com/nickhodges", + "linkedin": "https://www.linkedin.com/in/nickhodges/", + "medium": "https://nickhodges.medium.com/", + "twitter": "https://twitter.com/nickhodges", + "bluesky": "https://bsky.app/profile/nickhodges.bsky.social" + } + }, + { + "_id": "f3ff8de1-9b48-4768-898e-a84cb2efb228", + "title": "Nick Taylor", + "socials": { + "discord": "https://discord.com/invite/FkGSHMxbTe", + "github": "https://github.com/nickytonline", + "instagram": "https://www.instagram.com/nickytonline", + "linkedin": "https://www.linkedin.com/in/nickytonline/https://www.polywork.com/nickytonline", + "mastodon": "https://toot.cafe/@nickytonline", + "polywork": "https://www.polywork.com/nickytonline", + "twitch": "https://www.twitch.tv/nickytonline", + "twitter": "https://twitter.com/nickytonline", + "youtube": "https://www.youtube.com/@nickytonline", + "bluesky": "https://bsky.app/profile/nickyt.online", + "threads": "https://www.threads.net/@nickytonline" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHsziAa", + "title": "Omed Habib", + "socials": { + "github": "https://github.com/omedhabib", + "instagram": "https://www.instagram.com/omed.habib", + "linkedin": "https://www.linkedin.com/in/omed/", + "twitter": "https://twitter.com/omedhabib", + "threads": "https://www.threads.net/@omed.habib" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHsze4Y", + "title": "Paolo Ricciuti", + "socials": { + "github": "https://github.com/paoloricciuti", + "twitter": "https://twitter.com/PaoloRicciuti", + "bluesky": "https://bsky.app/profile/paolo.ricciuti.me" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszdUz", + "title": "Patrick Martin", + "socials": { + "github": "https://github.com/patm1987", + "linkedin": "https://www.linkedin.com/in/patrick-martin-268a85a/", + "medium": "https://medium.com/@pux0r3", + "twitter": "https://twitter.com/pux0r3", + "bluesky": "https://bsky.app/profile/pcnmartin.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszdkE", + "title": "Pedro Duarte", + "socials": { + "github": "https://github.com/peduarte", + "linkedin": "https://www.linkedin.com/in/peduarteltd/?originalSubdomain=es", + "twitter": "https://twitter.com/peduarte", + "bluesky": "https://bsky.app/profile/ped.ro" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszcgB", + "title": "Prince Wilson", + "socials": { + "github": "https://github.com/maxcell", + "linkedin": "https://www.linkedin.com/in/maxcell/", + "mastodon": "https://hachyderm.io/@maxcell", + "twitch": "https://www.twitch.tv/maxcellw", + "twitter": "https://twitter.com/maxcell", + "bluesky": "https://bsky.app/profile/maxcell.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszcBh", + "title": "Randal Schwartz", + "socials": { + "linkedin": "https://www.linkedin.com/in/randalschwartz/", + "twitter": "https://twitter.com/RandalSchwartz", + "bluesky": "https://bsky.app/profile/randalschwartz.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszbwS", + "title": "Renan", + "socials": { + "github": "https://github.com/renancaraujo", + "linkedin": "https://www.linkedin.com/in/renancaraujo/", + "twitter": "https://twitter.com/reNotANumber", + "mastodon": "https://fluttercommunity.social/@renan", + "bluesky": "https://bsky.app/profile/renanminx.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszbRy", + "title": "Renรฉ Brandel", + "socials": { + "github": "https://github.com/renebrandel", + "linkedin": "https://www.linkedin.com/in/renebrandel/", + "twitter": "https://twitter.com/renebrandel", + "bluesky": "https://bsky.app/profile/renebrandel.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszbhD", + "title": "Rich Harris", + "socials": { + "github": "https://github.com/Rich-Harris", + "linkedin": "https://www.linkedin.com/in/rich-harris/", + "twitter": "https://twitter.com/rich_harris", + "bluesky": "https://bsky.app/profile/rich-harris.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszaNv", + "title": "Rob Sutter", + "socials": { + "linkedin": "https://www.linkedin.com/in/robsutter/", + "twitter": "https://twitter.com/rts_rob", + "bluesky": "https://bsky.app/profile/robsutter.dev" + } + }, + { + "_id": "9fc9b65d-cfa3-4407-9f94-be7eb8cd32be", + "title": "Roman Jaquez", + "socials": { + "github": "https://github.com/romanejaquez", + "twitter": "https://twitter.com/drcoderz", + "bluesky": "https://bsky.app/profile/romanjaquez.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszaiF", + "title": "Ryan Carniato", + "socials": { + "devto": "https://dev.to/ryansolid", + "github": "https://github.com/ryansolid", + "twitter": "https://twitter.com/RyanCarniato", + "bluesky": "https://bsky.app/profile/ryansolid.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszYkJ", + "title": "Salma Alam-Naylor", + "socials": { + "github": "https://github.com/whitep4nth3r", + "linkedin": "https://www.linkedin.com/in/whitep4nth3r/?originalSubdomain=uk", + "twitch": "https://www.twitch.tv/whitep4nth3r", + "twitter": "https://twitter.com/whitep4nth3r", + "bluesky": "https://bsky.app/profile/whitep4nth3r.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszVnP", + "title": "Sam Bhagwat", + "socials": { + "github": "https://github.com/calcsam", + "linkedin": "https://www.linkedin.com/in/sambhagwat/", + "twitter": "https://twitter.com/calcsam", + "bluesky": "https://bsky.app/profile/calcsam.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszVT5", + "title": "Sam Littlefair", + "socials": { + "github": "https://github.com/samlfair", + "linkedin": "https://www.linkedin.com/in/samlittlefair/?originalSubdomain=ca", + "twitter": "https://twitter.com/samlfair", + "bluesky": "https://bsky.app/profile/littlefair.ca" + } + }, + { + "_id": "ad09a6a8-84e1-49ea-b5ab-18e2bb1247b8", + "title": "Saron Yitbarek", + "socials": { + "twitter": "https://twitter.com/saronyitbarek", + "bluesky": "https://bsky.app/profile/saron.bsky.social" + } + }, + { + "_id": "0ccc6e7b-24b9-4e13-87dc-ca95d86c2298", + "title": "Scott Rees", + "socials": { + "linkedin": "https://www.linkedin.com/in/scott-rees-3800a814/", + "mastodon": "https://hachyderm.io/@hbuchel", + "twitter": "https://x.com/reesscot?lang=en", + "bluesky": "https://bsky.app/profile/scott-rees.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszUyb", + "title": "Scott Spence", + "socials": { + "github": "https://github.com/spences10", + "twitter": "https://twitter.com/spences10", + "bluesky": "https://bsky.app/profile/scottspence.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszcQw", + "title": "Scott Tolinski", + "socials": { + "github": "https://github.com/stolinski", + "linkedin": "https://www.linkedin.com/in/stolinski/", + "twitter": "https://twitter.com/stolinski", + "youtube": "https://www.youtube.com/c/leveluptuts", + "bluesky": "https://bsky.app/profile/tolin.ski" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszUjM", + "title": "Sean Falconer", + "socials": { + "github": "https://github.com/thefalc", + "linkedin": "https://www.linkedin.com/in/seanf/", + "twitter": "https://twitter.com/seanfalconer", + "bluesky": "https://bsky.app/profile/seanfalconer.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszUU7", + "title": "Shai Reznik", + "socials": { + "github": "https://github.com/shairez", + "twitter": "https://twitter.com/shai_reznik", + "youtube": "https://www.youtube.com/user/hirezio", + "bluesky": "https://bsky.app/profile/shairez.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszUEs", + "title": "Shivay Lamba", + "socials": { + "github": "https://github.com/shivaylamba", + "mastodon": "https://mastodon.social/@shivaylamba", + "twitter": "https://twitter.com/howdevelop", + "bluesky": "https://bsky.app/profile/shivaylamba.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszTkO", + "title": "Simon Grimm", + "socials": { + "github": "https://github.com/saimon24", + "twitter": "https://twitter.com/schlimmson", + "youtube": "https://www.youtube.com/channel/UCZZPgUIorPao48a1tBYSDgg", + "mastodon": "https://www.youtube.com/@galaxies_dev", + "linkedin": "https://www.linkedin.com/in/simongr/", + "instagram": "https://www.instagram.com/simongrimm_/", + "bluesky": "https://bsky.app/profile/galaxies.dev", + "threads": "https://www.threads.net/@simongrimm_" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszTV9", + "title": "Stefan Kingham", + "socials": { + "twitter": "https://twitter.com/stefankingham", + "bluesky": "https://bsky.app/profile/stefankingham.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszTAp", + "title": "Steve Sewell", + "socials": { + "github": "https://github.com/steve8708", + "linkedin": "https://www.linkedin.com/in/ssewell/", + "tiktok": "https://www.tiktok.com/@steve8708", + "twitter": "https://twitter.com/Steve8708", + "youtube": "https://www.youtube.com/@Builderio", + "bluesky": "https://bsky.app/profile/steve8708.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszSgL", + "title": "Taylor Desseyn", + "socials": { + "instagram": "https://instagram.com/tdesseyn", + "linkedin": "https://linkedin.com/in/taylordesseyn", + "spotify": "https://open.spotify.com/show/2UBzvscEgepXLUKvA5c24x", + "tiktok": "https://tiktok.com/@tdesseyn", + "twitter": "https://x.com/tdesseyn", + "youtube": "https://youtube.com/channel/UCNqJ-P5d9RUCUsQ-grhlUHw", + "bluesky": "https://bsky.app/profile/tdesseyn.bsky.social", + "threads": "https://www.threads.net/@tdesseyn" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszSR6", + "title": "Tessa Mero", + "socials": { + "linkedin": "https://www.linkedin.com/in/tessamero/", + "twitter": "https://twitter.com/TessaMero", + "bluesky": "https://bsky.app/profile/tessamero.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszSBr", + "title": "Thomas G. Lopes", + "socials": { + "github": "https://github.com/TGlide", + "twitter": "https://twitter.com/thomasglopes", + "bluesky": "https://bsky.app/profile/thomasglopes.com", + "linkedin": "https://www.linkedin.com/in/thomas-gl/" + } + }, + { + "_id": "c04bf8ca-ecba-4ab9-9a6b-7e5002291277", + "title": "Thomas Johnson", + "socials": { + "github": "https://github.com/tomjohnson3", + "linkedin": "https://www.linkedin.com/in/tomjohnson3/", + "twitter": "https://x.com/tomjohnson3", + "bluesky": "https://bsky.app/profile/multiplayer.app", + "threads": "https://www.threads.net/@trymultiplayer" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszRrX", + "title": "Tim Benniks", + "socials": { + "github": "https://github.com/timbenniks", + "linkedin": "https://www.linkedin.com/in/timbenniks/", + "twitter": "https://twitter.com/timbenniks", + "bluesky": "https://bsky.app/profile/timbenniks.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszRcI", + "title": "Tim Neutkens", + "socials": { + "github": "https://github.com/timneutkens", + "linkedin": "https://www.linkedin.com/in/tim-neutkens-5a6733168/", + "twitter": "https://twitter.com/timneutkens", + "bluesky": "https://bsky.app/profile/timneutkens.bsky.social" + } + }, + { + "_id": "35aedae9-ff20-4ac0-8310-52b04fa3e444", + "title": "Tobin South", + "socials": { + "twitter": "https://x.com/TobinSouth", + "linkedin": "https://www.linkedin.com/in/tobinsouth/", + "github": "https://github.com/tobinsouth", + "bluesky": "https://bsky.app/profile/tobinsouth.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszRCt", + "title": "Tom Preston-Werner", + "socials": { + "github": "https://github.com/mojombo", + "linkedin": "https://www.linkedin.com/in/mojombo/", + "twitter": "https://twitter.com/mojombo", + "bluesky": "https://bsky.app/profile/mojombo.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszPUC", + "title": "Tomek Suล‚kowski", + "socials": { + "github": "https://github.com/sulco", + "linkedin": "https://www.linkedin.com/in/tsulkowski/", + "twitter": "https://twitter.com/sulco", + "bluesky": "https://bsky.app/profile/sulco.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszP4n", + "title": "Tyler McGinnis", + "socials": { + "github": "https://github.com/tylermcginnis", + "linkedin": "https://www.linkedin.com/in/tylermcginnis33/", + "twitch": "https://www.twitch.tv/elpunish3rr/", + "twitter": "https://twitter.com/tylermcginnis", + "youtube": "https://www.youtube.com/acekyd", + "bluesky": "https://bsky.app/profile/tyler.ui.dev" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszOfO", + "title": "Una Kravets", + "socials": { + "github": "https://github.com/Una", + "twitter": "https://twitter.com/Una", + "bluesky": "https://bsky.app/profile/una.im", + "mastodon": "https://front-end.social/@una", + "tiktok": "https://tiktok.com/@unacode", + "linkedin": "https://www.linkedin.com/in/unakravets" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszN1m", + "title": "Vagish Vela", + "socials": { + "facebook": "https://www.facebook.com/vagishvela/", + "github": "https://github.com/vagishvela", + "instagram": "https://www.instagram.com/vagish", + "twitter": "https://twitter.com/vagish", + "linkedin": "https://www.linkedin.com/in/vagish/", + "mastodon": "https://ruby.social/@vagish", + "bluesky": "https://bsky.app/profile/vagish.bsky.social", + "threads": "https://www.threads.net/@vagish" + } + }, + { + "_id": "0d5cd71e-5b13-4dc2-8b7f-f1ce0a1ed5b1", + "title": "Vincent (Wen Yu) Ge", + "socials": { + "github": "https://github.com/gewenyu99", + "twitter": "https://x.com/WenYuGe1", + "youtube": "https://www.youtube.com/@umamicomplex6841", + "bluesky": "https://bsky.app/profile/gewenyu99.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszMhS", + "title": "Vlad Hosu", + "socials": { + "github": "https://github.com/subpic", + "linkedin": "https://www.linkedin.com/in/vladhosu/", + "bluesky": "https://bsky.app/profile/vlad.socialbee.com" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszMN8", + "title": "Waldemar Hummer", + "socials": { + "github": "https://github.com/whummer/", + "twitter": "https://twitter.com/w_hummer", + "bluesky": "https://bsky.app/profile/whummer.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszM2o", + "title": "Wes Bos", + "socials": { + "github": "https://github.com/wesbos", + "linkedin": "https://www.linkedin.com/in/wesbos/", + "twitter": "https://twitter.com/wesbos", + "mastodon": "https://tiktok.com/@wesbos", + "instagram": "https://instagram.com/@wesbos", + "bluesky": "https://bsky.app/profile/wesbos.com", + "threads": "https://www.threads.net/@wesbos" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszLiU", + "title": "Willow (GHOST)", + "socials": { + "github": "https://github.com/ghostdevv", + "twitter": "https://twitter.com/onlyspaceghost", + "bluesky": "https://bsky.app/profile/willow.sh", + "mastodon": "https://fosstodon.org/@onlyspaceghost" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszLOA", + "title": "Zack DeRose", + "socials": { + "github": "https://github.com/ZackDeRose", + "linkedin": "https://www.linkedin.com/in/zackderose/", + "twitter": "https://twitter.com/zackderose", + "youtube": "https://www.youtube.com/c/ZackDeRoseDev", + "bluesky": "https://bsky.app/profile/zackderose.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszL3q", + "title": "Zoรซ Wilson", + "socials": { + "linkedin": "https://www.linkedin.com/in/zo%C3%AB-wilson-45b8a7b7/", + "bluesky": "https://bsky.app/profile/zoelwilson.bsky.social" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszoyH", + "title": "m4dz", + "socials": { + "github": "https://github.com/m4dz/", + "linkedin": "https://www.linkedin.com/in/m4d-z/", + "twitch": "https://www.twitch.tv/m4dz_devrel/", + "twitter": "https://twitter.com/m4d_z", + "bluesky": "https://bsky.app/profile/madz258.wetdry.world.ap.brid.gy" + } + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszcvQ", + "title": "pngwn", + "socials": { + "github": "https://github.com/pngwn", + "twitter": "https://twitter.com/evilpingwin", + "bluesky": "https://bsky.app/profile/pngwn.at" + } + } +]; + +async function main() { + if (!TOKEN) { + console.log("[sync-guest-socials] No SANITY token set, skipping."); + return; + } + const mutations = PATCHES.map((p) => ({ + patch: { + id: p._id, + set: { + socials: p.socials, + }, + }, + })); + + const res = await fetch(`https://${PROJECT_ID}.api.sanity.io/v2025-09-30/data/mutate/${DATASET}`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${TOKEN}`, + }, + body: JSON.stringify({ mutations }), + }); + if (!res.ok) { + const text = await res.text(); + console.warn(`[sync-guest-socials] HTTP ${res.status}: ${text}`); + return; + } + console.log(`โœ” Synced enriched socials for ${PATCHES.length} guests into Sanity (${PROJECT_ID}/${DATASET})`); +} + +main().catch((err) => console.error(err)); From 0e1bac97535e46fa86bd2344c2c037a1f2ddc9a5 Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 12:57:03 -0400 Subject: [PATCH 09/10] feat(site,sanity): add expiring magic-link Guest Profile Portal (/guest-portal/[token]) --- apps/sanity/schemas/partials/user.ts | 14 + apps/site/src/lib/guest-portal.ts | 201 ++++++++ .../site/src/pages/api/guest-portal/update.ts | 160 +++++++ .../site/src/pages/guest-portal/[token].astro | 437 ++++++++++++++++++ 4 files changed, 812 insertions(+) create mode 100644 apps/site/src/lib/guest-portal.ts create mode 100644 apps/site/src/pages/api/guest-portal/update.ts create mode 100644 apps/site/src/pages/guest-portal/[token].astro diff --git a/apps/sanity/schemas/partials/user.ts b/apps/sanity/schemas/partials/user.ts index f4baf6c2..274f21de 100644 --- a/apps/sanity/schemas/partials/user.ts +++ b/apps/sanity/schemas/partials/user.ts @@ -125,6 +125,20 @@ const content = defineType({ }), ], }), + defineField({ + name: "portalToken", + title: "Guest Portal Magic Token", + type: "string", + readOnly: true, + hidden: true, + }), + defineField({ + name: "portalTokenExpiresAt", + title: "Guest Portal Token Expiration", + type: "datetime", + readOnly: true, + hidden: true, + }), ], }); diff --git a/apps/site/src/lib/guest-portal.ts b/apps/site/src/lib/guest-portal.ts new file mode 100644 index 00000000..359c6f90 --- /dev/null +++ b/apps/site/src/lib/guest-portal.ts @@ -0,0 +1,201 @@ +import { env } from "cloudflare:workers"; + +export interface GuestPortalTokenPayload { + /** Sanity guest document _id */ + id: string; + /** Sanity guest slug.current */ + slug: string; + /** Expiration timestamp in unix milliseconds */ + exp: number; +} + +const DEFAULT_PORTAL_SIGNING_KEY = + "codingcat-guest-portal-hmac-v1-hfh83o0w-secret"; + +function getSigningSecret(): string { + const workerEnv = (env ?? {}) as unknown as Record< + string, + string | undefined + >; + return ( + workerEnv.GUEST_PORTAL_SECRET || + workerEnv.SANITY_API_WRITE_TOKEN || + DEFAULT_PORTAL_SIGNING_KEY + ); +} + +function toBase64Url(bytes: Uint8Array): string { + let binary = ""; + for (let i = 0; i < bytes.length; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary) + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=+$/, ""); +} + +function fromBase64Url(str: string): Uint8Array { + const padded = + str.replace(/-/g, "+").replace(/_/g, "/") + + "===".slice((str.length + 3) % 4); + const binary = atob(padded); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; +} + +async function computeHmacB64Url( + data: string, + secret: string, +): Promise { + const enc = new TextEncoder(); + const key = await crypto.subtle.importKey( + "raw", + enc.encode(secret), + { name: "HMAC", hash: "SHA-256" }, + false, + ["sign"], + ); + const sig = await crypto.subtle.sign("HMAC", key, enc.encode(data)); + return toBase64Url(new Uint8Array(sig)).slice(0, 24); +} + +export async function createGuestPortalToken( + payload: GuestPortalTokenPayload, + secretOverride?: string, +): Promise { + const enc = new TextEncoder(); + const payloadB64 = toBase64Url(enc.encode(JSON.stringify(payload))); + const sig = await computeHmacB64Url( + payloadB64, + secretOverride || DEFAULT_PORTAL_SIGNING_KEY, + ); + return `${payloadB64}.${sig}`; +} + +export async function verifyGuestPortalToken(token: string | undefined): Promise<{ + valid: boolean; + expired: boolean; + payload: GuestPortalTokenPayload | null; +}> { + if (!token || !token.includes(".")) { + return { valid: false, expired: false, payload: null }; + } + const [payloadB64, providedSig] = token.split("."); + if (!payloadB64 || !providedSig) { + return { valid: false, expired: false, payload: null }; + } + + try { + const dec = new TextDecoder(); + const parsed = JSON.parse( + dec.decode(fromBase64Url(payloadB64)), + ) as GuestPortalTokenPayload; + + if (!parsed || !parsed.id || !parsed.exp) { + return { valid: false, expired: false, payload: null }; + } + + // Accept signature signed with either worker secret or default deterministic key + const candidateSecrets = Array.from( + new Set([getSigningSecret(), DEFAULT_PORTAL_SIGNING_KEY]), + ); + let sigMatches = false; + for (const sec of candidateSecrets) { + const expected = await computeHmacB64Url(payloadB64, sec); + if (expected === providedSig) { + sigMatches = true; + break; + } + } + + if (!sigMatches) { + return { valid: false, expired: false, payload: null }; + } + + if (Date.now() > parsed.exp) { + return { valid: false, expired: true, payload: parsed }; + } + + return { valid: true, expired: false, payload: parsed }; + } catch { + return { valid: false, expired: false, payload: null }; + } +} + +export const ALLOWED_SOCIAL_KEYS = [ + "twitter", + "bluesky", + "linkedin", + "instagram", + "threads", + "youtube", + "github", + "mastodon", + "tiktok", + "facebook", + "twitch", + "substack", + "devto", + "medium", + "codepen", + "discord", + "stackoverflow", + "email", +] as const; + +export type AllowedSocialKey = (typeof ALLOWED_SOCIAL_KEYS)[number]; + +/** + * Normalizes a handle or URL into a canonical URL for Sanity storage. + */ +export function normalizeSocialInput( + key: AllowedSocialKey, + rawValue: string | undefined | null, +): string { + const val = String(rawValue ?? "").trim(); + if (!val) return ""; + if (key === "email" || key === "discord") return val; + if (/^https?:\/\//i.test(val)) return val; + + const clean = val.replace(/^@/, ""); + switch (key) { + case "twitter": + return `https://x.com/${clean}`; + case "bluesky": + return `https://bsky.app/profile/${clean.includes(".") ? clean : `${clean}.bsky.social`}`; + case "linkedin": + return clean.startsWith("in/") + ? `https://www.linkedin.com/${clean}` + : `https://www.linkedin.com/in/${clean}`; + case "instagram": + return `https://www.instagram.com/${clean}`; + case "threads": + return `https://www.threads.net/@${clean}`; + case "youtube": + return `https://www.youtube.com/@${clean}`; + case "github": + return `https://github.com/${clean}`; + case "tiktok": + return `https://www.tiktok.com/@${clean}`; + case "facebook": + return `https://www.facebook.com/${clean}`; + case "twitch": + return `https://www.twitch.tv/${clean}`; + case "devto": + return `https://dev.to/${clean}`; + case "mastodon": { + // Support @user@instance.tld + if (clean.includes("@")) { + const [user, instance] = clean.split("@"); + if (user && instance) return `https://${instance}/@${user}`; + } + return `https://mastodon.social/@${clean}`; + } + default: + return `https://${clean}`; + } +} diff --git a/apps/site/src/pages/api/guest-portal/update.ts b/apps/site/src/pages/api/guest-portal/update.ts new file mode 100644 index 00000000..67076cc8 --- /dev/null +++ b/apps/site/src/pages/api/guest-portal/update.ts @@ -0,0 +1,160 @@ +import type { APIRoute } from "astro"; +import { + ALLOWED_SOCIAL_KEYS, + normalizeSocialInput, + verifyGuestPortalToken, +} from "@/lib/guest-portal"; +import { getSanityServerClient } from "@/lib/sanity/write-client"; + +export const POST: APIRoute = async ({ request }) => { + try { + const body = (await request.json()) as { + token?: string; + title?: string; + websiteUrl?: string; + socials?: Record; + }; + + const rawToken = body.token?.trim(); + if (!rawToken) { + return new Response( + JSON.stringify({ error: "Missing guest portal token." }), + { status: 400, headers: { "Content-Type": "application/json" } }, + ); + } + + const { client, canWrite } = getSanityServerClient(); + const verification = await verifyGuestPortalToken(rawToken); + + let guestId = verification.payload?.id; + if (!verification.valid) { + if (verification.expired) { + return new Response( + JSON.stringify({ + error: + "This magic link has expired. Please reply to Alex's email for a fresh link.", + }), + { status: 403, headers: { "Content-Type": "application/json" } }, + ); + } + + // Fallback: check if token is stored directly on a guest doc in Sanity with non-expired portalTokenExpiresAt + const docByToken = await client.fetch<{ + _id: string; + portalTokenExpiresAt?: string; + } | null>( + `*[_type == "guest" && portalToken == $token][0]{ _id, portalTokenExpiresAt }`, + { token: rawToken }, + ); + + if (!docByToken) { + return new Response( + JSON.stringify({ error: "Invalid guest portal token." }), + { status: 403, headers: { "Content-Type": "application/json" } }, + ); + } + if ( + docByToken.portalTokenExpiresAt && + new Date(docByToken.portalTokenExpiresAt).getTime() < Date.now() + ) { + return new Response( + JSON.stringify({ + error: + "This magic link has expired. Please reply to Alex's email for a fresh link.", + }), + { status: 403, headers: { "Content-Type": "application/json" } }, + ); + } + guestId = docByToken._id; + } + + if (!guestId) { + return new Response( + JSON.stringify({ error: "Could not resolve guest profile." }), + { status: 404, headers: { "Content-Type": "application/json" } }, + ); + } + + const existingGuest = await client.fetch<{ + _id: string; + title?: string; + socials?: Record; + websites?: Array; + } | null>( + `*[_type == "guest" && _id == $id][0]{ _id, title, socials, websites }`, + { id: guestId }, + ); + + if (!existingGuest) { + return new Response( + JSON.stringify({ error: "Guest profile not found in Sanity." }), + { status: 404, headers: { "Content-Type": "application/json" } }, + ); + } + + const mergedSocials: Record = { + ...(existingGuest.socials || {}), + }; + + if (body.socials && typeof body.socials === "object") { + for (const key of ALLOWED_SOCIAL_KEYS) { + if (key in body.socials) { + const normalized = normalizeSocialInput(key, body.socials[key]); + if (normalized) { + mergedSocials[key] = normalized; + } else { + delete mergedSocials[key]; + } + } + } + } + + const patchSet: Record = { + socials: mergedSocials, + }; + + if (body.title && body.title.trim().length >= 2) { + patchSet.title = body.title.trim(); + } + + if (typeof body.websiteUrl === "string") { + const cleanSite = body.websiteUrl.trim(); + if (cleanSite) { + const href = /^https?:\/\//i.test(cleanSite) + ? cleanSite + : `https://${cleanSite}`; + patchSet.websites = [ + { + _key: "primary-site", + _type: "site", + site: href, + link: { + blank: true, + href, + }, + }, + ]; + } + } + + if (canWrite) { + await client.patch(existingGuest._id).set(patchSet).commit(); + } + + return new Response( + JSON.stringify({ + ok: true, + guestId: existingGuest._id, + socials: mergedSocials, + persistedToSanity: canWrite, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return new Response(JSON.stringify({ error: message }), { + status: 500, + headers: { "Content-Type": "application/json" }, + }); + } +}; diff --git a/apps/site/src/pages/guest-portal/[token].astro b/apps/site/src/pages/guest-portal/[token].astro new file mode 100644 index 00000000..22a17677 --- /dev/null +++ b/apps/site/src/pages/guest-portal/[token].astro @@ -0,0 +1,437 @@ +--- +import Breadcrumbs from "@/components/Breadcrumbs.astro"; +import BaseLayout from "@/layouts/BaseLayout.astro"; +import { verifyGuestPortalToken } from "@/lib/guest-portal"; +import { getSanityServerClient } from "@/lib/sanity/write-client"; + +const { token } = Astro.params; + +interface EpisodeRef { + _id: string; + title: string; + slug: string; + season: number; + episode: number; + youtube?: string; +} + +interface GuestDoc { + _id: string; + title: string; + slug: string; + avatarUrl?: string; + socials?: Record; + websites?: Array<{ site?: string; link?: { href?: string } }>; + episodes: EpisodeRef[]; +} + +const verification = await verifyGuestPortalToken(token); +const { client } = getSanityServerClient(); + +let isExpired = verification.expired; +let isValid = verification.valid; +let expiresAtIso = verification.payload?.exp + ? new Date(verification.payload.exp).toISOString() + : ""; +let guestDoc: GuestDoc | null = null; + +if (isValid && verification.payload) { + guestDoc = await client.fetch( + `*[_type == "guest" && (_id == $id || slug.current == $slug)][0]{ + _id, + title, + "slug": slug.current, + "avatarUrl": coverImage.asset->url, + socials, + websites, + "episodes": *[_type == "podcast" && references(^._id) && !(_id in path("drafts.**"))] | order(season desc, episode desc) { + _id, + title, + "slug": slug.current, + season, + episode, + youtube + } + }`, + { id: verification.payload.id, slug: verification.payload.slug }, + ); +} else if (!isExpired && token) { + // Fallback: check Sanity portalToken field + const docByToken = await client.fetch< + (GuestDoc & { portalTokenExpiresAt?: string }) | null + >( + `*[_type == "guest" && portalToken == $token][0]{ + _id, + title, + "slug": slug.current, + "avatarUrl": coverImage.asset->url, + socials, + websites, + portalTokenExpiresAt, + "episodes": *[_type == "podcast" && references(^._id) && !(_id in path("drafts.**"))] | order(season desc, episode desc) { + _id, + title, + "slug": slug.current, + season, + episode, + youtube + } + }`, + { token }, + ); + if (docByToken) { + if ( + docByToken.portalTokenExpiresAt && + new Date(docByToken.portalTokenExpiresAt).getTime() < Date.now() + ) { + isExpired = true; + } else { + isValid = true; + guestDoc = docByToken; + expiresAtIso = docByToken.portalTokenExpiresAt || ""; + } + } +} + +const socials = guestDoc?.socials || {}; +const primaryWebsite = + guestDoc?.websites?.[0]?.link?.href || guestDoc?.websites?.[0]?.site || ""; + +const socialFields = [ + { + key: "twitter", + label: "X (Twitter)", + placeholder: "@username or https://x.com/username", + priority: true, + }, + { + key: "bluesky", + label: "Bluesky", + placeholder: "handle.bsky.social or https://bsky.app/profile/...", + priority: true, + }, + { + key: "linkedin", + label: "LinkedIn", + placeholder: "https://www.linkedin.com/in/username", + priority: true, + }, + { + key: "instagram", + label: "Instagram", + placeholder: "@username or https://www.instagram.com/username", + priority: true, + }, + { + key: "threads", + label: "Threads", + placeholder: "@username or https://www.threads.net/@username", + priority: true, + }, + { + key: "facebook", + label: "Facebook", + placeholder: "https://www.facebook.com/username", + priority: true, + }, + { + key: "mastodon", + label: "Mastodon", + placeholder: "@user@mastodon.social or full URL", + priority: false, + }, + { + key: "youtube", + label: "YouTube Channel", + placeholder: "@channel or https://www.youtube.com/@channel", + priority: false, + }, + { + key: "github", + label: "GitHub", + placeholder: "username or https://github.com/username", + priority: false, + }, + { + key: "tiktok", + label: "TikTok", + placeholder: "@username or https://www.tiktok.com/@username", + priority: false, + }, + { + key: "twitch", + label: "Twitch", + placeholder: "https://www.twitch.tv/username", + priority: false, + }, + { + key: "substack", + label: "Substack", + placeholder: "https://username.substack.com", + priority: false, + }, + { + key: "devto", + label: "Dev.to", + placeholder: "https://dev.to/username", + priority: false, + }, + { + key: "medium", + label: "Medium", + placeholder: "https://medium.com/@username", + priority: false, + }, +]; +--- + + +
+ + + {!isValid || !guestDoc ? ( +
+

+ {isExpired ? "This Guest Portal Magic Link Has Expired" : "Invalid Guest Portal Link"} +

+

+ {isExpired + ? "For security, guest profile edit links expire after 30 days." + : "We could not verify this guest profile link."} +

+ +
+ ) : ( +
+
+
+
+ {guestDoc.avatarUrl && ( + {guestDoc.title} + )} +
+ + Verified Sanity Guest Magic Link + {expiresAtIso && ` ยท Expires ${new Date(expiresAtIso).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" })}`} + +

+ {guestDoc.title} +

+

+ Public Speaker Profile:{" "} + + codingcat.dev/guest/{guestDoc.slug} + +

+
+
+
+ +

+ We are sharing full episodes and vertical video clips from our archive across{" "} + X, Instagram, Threads, Bluesky, Facebook, Mastodon, LinkedIn, and TikTok. + Add or update your social handles below and they will immediately sync to your Sanity profile so our social agent tags you whenever your episode is shared. +

+ + {guestDoc.episodes?.length > 0 && ( +
+

+ Your CodingCat.dev Podcast Episode(s) +

+ +
+ )} +
+ +
+
+
+ + +
+
+ + +
+
+ +
+ +
+

+ Social Handles for Episode Tagging +

+

+ You can paste either your `@handle` or full profile URL โ€” we normalize it automatically. +

+
+ +
+ {socialFields.map((field) => { + const currentVal = socials[field.key] || ""; + const isMissingPriority = field.priority && !currentVal; + return ( +
+ + +
+ ); + })} +
+ +
+
+ +
+
+
+ )} +
+ + +
From 21017bd3005a16cf3849e178f45f8200928a121d Mon Sep 17 00:00:00 2001 From: Alex Patterson Date: Wed, 21 Oct 2026 13:02:22 -0400 Subject: [PATCH 10/10] feat(sanity): sync 186 guest portal tokens and 141 resolved emails to Sanity --- apps/sanity/scripts/sync-guest-socials.mjs | 1373 ++++++++++++++++---- 1 file changed, 1108 insertions(+), 265 deletions(-) diff --git a/apps/sanity/scripts/sync-guest-socials.mjs b/apps/sanity/scripts/sync-guest-socials.mjs index 677fccc6..3a5fa68a 100644 --- a/apps/sanity/scripts/sync-guest-socials.mjs +++ b/apps/sanity/scripts/sync-guest-socials.mjs @@ -1,13 +1,24 @@ #!/usr/bin/env node /** - * Syncs the 147 enriched guest social profiles (+256 newly discovered social links) - * into Sanity (production & dev datasets). + * Syncs all 186 enriched guest profiles (+256 social links, 141 resolved emails, + * and 30-day expiring portalTokens) into Sanity (production & dev datasets). */ const PROJECT_ID = process.env.SANITY_STUDIO_PROJECT_ID || "hfh83o0w"; const DATASET = process.env.SANITY_STUDIO_DATASET || "production"; const TOKEN = process.env.SANITY_API_WRITE_TOKEN || process.env.SANITY_AUTH_TOKEN; const PATCHES = [ + { + "_id": "RIgC5r4TJ0hCGOzxHt5W4m", + "title": "Aaron Frost", + "socials": { + "github": "https://github.com/aaronfrost", + "twitter": "https://twitter.com/aaronfrost", + "email": "aaronfrost@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDVXNG0iLCJzbHVnIjoiYWFyb24tZnJvc3QiLCJleHAiOjE3OTUxOTM5MDA4ODN9.cmQUiDdYx6El5W-XqbpdT4ZF", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, { "_id": "RIgC5r4TJ0hCGOzxHt52Uf", "title": "Adam Argyle", @@ -17,8 +28,11 @@ const PATCHES = [ "youtube": "https://www.youtube.com/c/AdamArgyleInk", "mastodon": "https://front-end.social/@argyleink", "bluesky": "https://bsky.app/profile/nerdy.dev", - "linkedin": "https://www.linkedin.com/in/adamargyle" - } + "linkedin": "https://www.linkedin.com/in/adamargyle", + "email": "atom@argyleink.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDUyVWYiLCJzbHVnIjoiYWRhbS1hcmd5bGUiLCJleHAiOjE3OTUxOTM5MDA4ODN9.I-SDfNGmTtTWaNX7Ul0XkV_A", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt5Qpc", @@ -28,8 +42,11 @@ const PATCHES = [ "twitter": "https://twitter.com/adamdbradley", "instagram": "https://www.instagram.com/figma", "bluesky": "https://bsky.app/profile/adambradley.bsky.social", - "threads": "https://www.threads.net/@figma" - } + "threads": "https://www.threads.net/@figma", + "email": "adam@builder.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDVRcGMiLCJzbHVnIjoiYWRhbS1icmFkbGV5IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.1-Xc7K6R600OGu-nC89FoL8a", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt55CK", @@ -44,16 +61,22 @@ const PATCHES = [ "instagram": "https://instagram.com/acekydtv", "tiktok": "https://tiktok.com/@acekydtv", "bluesky": "https://bsky.app/profile/acekyd.bsky.social", - "threads": "https://www.threads.net/@acekydtv" - } + "threads": "https://www.threads.net/@acekydtv", + "email": "acekyd01@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDU1Q0siLCJzbHVnIjoiYWNlLWt5ZCIsImV4cCI6MTc5NTE5MzkwMDg4M30.5urPUy7122b2KyXIm8hfOZV7", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt52AL", "title": "Alex Feldman", "socials": { "linkedin": "https://www.linkedin.com/in/alexanderfeldman/", - "bluesky": "https://bsky.app/profile/hafeldman17.bsky.social" - } + "bluesky": "https://bsky.app/profile/hafeldman17.bsky.social", + "email": "alex@ajonp.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDUyQUwiLCJzbHVnIjoiYWxleC1mZWxkbWFuIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ._tjszbFcyxgtUETk41dhmuoB", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt50CP", @@ -62,8 +85,23 @@ const PATCHES = [ "github": "https://github.com/alx-andru", "twitter": "https://twitter.com/alexg0g", "linkedin": "https://www.linkedin.com/in/agogan/", - "bluesky": "https://bsky.app/profile/alx-andru.bsky.social" - } + "bluesky": "https://bsky.app/profile/alx-andru.bsky.social", + "email": "alex@joinsherpa.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDUwQ1AiLCJzbHVnIjoiYWxleC1nb2dhbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.SHosMz4YrKuGEi-rnoFi6PaX", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4w1I", + "title": "Alex Jover Morales", + "socials": { + "github": "https://github.com/alexjoverm", + "linkedin": "https://www.linkedin.com/in/alex-jover-morales-994752102/", + "twitter": "https://twitter.com/alexjoverm", + "email": "alexjovermorales@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDR3MUkiLCJzbHVnIjoiYWxleC1qb3Zlci1tb3JhbGVzIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.Kl67c-5_A6vp6Q9kxawb5AhU", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt51q1", @@ -72,8 +110,11 @@ const PATCHES = [ "github": "https://github.com/ruheni", "twitter": "https://twitter.com/ruheni_alex", "bluesky": "https://bsky.app/profile/ruheni.blue", - "mastodon": "https://hachyderm.io/@ruheni" - } + "mastodon": "https://hachyderm.io/@ruheni", + "email": "ruheni@prisma.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDUxcTEiLCJzbHVnIjoiYWxleC1ydWhlbmkiLCJleHAiOjE3OTUxOTM5MDA4ODN9.S45aI-X5or9pZOKtAa7lqHEO", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4r1N", @@ -85,7 +126,9 @@ const PATCHES = [ "bluesky": "https://bsky.app/profile/trost.codes", "linkedin": "https://www.linkedin.com/in/trostcodes/", "tiktok": "https://www.tiktok.com/@trostcodes" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRyMU4iLCJzbHVnIjoiYWxleC10cm9zdCIsImV4cCI6MTc5NTE5MzkwMDg4M30.YAhrP8KvtbiCoIGFnNLZdkfa", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4hvQ", @@ -94,7 +137,9 @@ const PATCHES = [ "github": "https://github.com/emaxerrno", "twitter": "https://twitter.com/emaxerrno", "linkedin": "https://www.linkedin.com/in/alexandergallego/" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRodlEiLCJzbHVnIjoiYWxleGFuZGVyLWdhbGxlZ28iLCJleHAiOjE3OTUxOTM5MDA4ODN9.zUC3OFm-Sc3oDhkOG9K9ba3e", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4lh8", @@ -106,8 +151,11 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/TheAlexLichter/", "twitter": "https://twitter.com/thealexlichter", "youtube": "https://www.youtube.com/@TheAlexLichter", - "bluesky": "https://bsky.app/profile/thealexlichter.com" - } + "bluesky": "https://bsky.app/profile/thealexlichter.com", + "email": "notify@twitter.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRsaDgiLCJzbHVnIjoiYWxleGFuZGVyLWxpY2h0ZXIiLCJleHAiOjE3OTUxOTM5MDA4ODN9.mGQN1b1dbSGp9yDXGaqmXoBw", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4lHj", @@ -117,7 +165,9 @@ const PATCHES = [ "twitter": "https://twitter.com/ASpittel", "youtube": "https://www.youtube.com/alispitteldev", "bluesky": "https://bsky.app/profile/alispit.tel" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRsSGoiLCJzbHVnIjoiYWxpLXNwaXR0ZWwiLCJleHAiOjE3OTUxOTM5MDA4ODN9.ZbD8u7_2llohmqxdgSq6o13A", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4cR1", @@ -129,8 +179,33 @@ const PATCHES = [ "youtube": "https://www.youtube.com/channel/UC_VUp1NHZnnh8DAS2d-c46A", "linkedin": "https://www.linkedin.com/in/alyssa-nicoll", "bluesky": "https://bsky.app/profile/alyssanicoll.bsky.social", - "mastodon": "https://www.youtube.com/@AngularAirPodcast" - } + "mastodon": "https://www.youtube.com/@AngularAirPodcast", + "email": "mail@alyssanicoll.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRjUjEiLCJzbHVnIjoiYWx5c3NhLW5pY29sbCIsImV4cCI6MTc5NTE5MzkwMDg4M30.kr3ro8_HVLWv16ujnahiKYeC", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "b5d8b34a-0ff3-417a-9fe7-73659931d9c6", + "title": "Amanda Cavallaro", + "socials": { + "github": "https://github.com/amdcavallaro", + "linkedin": "https://www.linkedin.com/in/amandacavallaro/", + "twitter": "https://twitter.com/amdcavallaro", + "email": "amdcaruso@gmail.com" + }, + "portalToken": "eyJpZCI6ImI1ZDhiMzRhLTBmZjMtNDE3YS05ZmU3LTczNjU5OTMxZDljNiIsInNsdWciOiJhbWFuZGEtY2F2YWxsYXJvIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.iEu5NmWExF-zi5CumWcSPTTF", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4bhI", + "title": "Amanda Giannelli", + "socials": { + "github": "https://github.com/agiannelli", + "twitter": "https://twitter.com/GiannelliTech" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRiaEkiLCJzbHVnIjoiYW1hbmRhLWdpYW5uZWxsaSIsImV4cCI6MTc5NTE5MzkwMDg4M30.JwtfMU4duJOe9_lluBJJZD0v", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4eZ7", @@ -142,8 +217,11 @@ const PATCHES = [ "youtube": "http://youtube.com/c/selfteachme", "instagram": "http://instagram.com/selfteachme", "bluesky": "https://bsky.app/profile/selfteach.me", - "threads": "https://www.threads.net/@selfteachme" - } + "threads": "https://www.threads.net/@selfteachme", + "email": "amy@compressed.fm" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRlWjciLCJzbHVnIjoiYW15LWR1dHRvbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.bzxcwy0z8gcEwzI-sgSLOwyL", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "4c91217a-f5f9-44ba-a22a-18af2329da3a", @@ -152,7 +230,9 @@ const PATCHES = [ "github": "http://github.com/andreaowu", "medium": "https://andreaowu.medium.com/", "linkedin": "https://www.linkedin.com/in/andreaowu" - } + }, + "portalToken": "eyJpZCI6IjRjOTEyMTdhLWY1ZjktNDRiYS1hMjJhLTE4YWYyMzI5ZGEzYSIsInNsdWciOiJhbmRyZWEtd3UiLCJleHAiOjE3OTUxOTM5MDA4ODN9.A8QFXwNekfZYY08EyIWDhIfK", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4aYA", @@ -161,8 +241,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/kulkarniankita/", "twitter": "https://twitter.com/kulkarniankita9", "youtube": "https://www.youtube.com/channel/UCbklMsA4tFtq4DEf1dyViQw", - "bluesky": "https://bsky.app/profile/kulkarniankita.com" - } + "bluesky": "https://bsky.app/profile/kulkarniankita.com", + "email": "me@kulkarniankita.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRhWUEiLCJzbHVnIjoiYW5raXRhLWt1bGthcm5pIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.jIbd-zLsixL3jJxsr_PQ3mx6", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4YfJ", @@ -172,7 +255,32 @@ const PATCHES = [ "twitter": "https://twitter.com/ajcwebdev", "youtube": "https://youtube.com/@ajcwebdev", "linkedin": "https://www.linkedin.com/in/ajcwebdev" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRZZkoiLCJzbHVnIjoiYW50aG9ueS1jYW1wb2xvIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.sAKtI1r_hab0uUWYHGWE4ahe", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4ZjM", + "title": "Antonio Lo Fiego", + "socials": { + "github": "https://github.com/antoniolofiego", + "linkedin": "https://www.linkedin.com/in/antoniolofiego/", + "twitter": "https://twitter.com/antonio_lofiego", + "email": "alofiego@hey.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRaak0iLCJzbHVnIjoiYW50b25pby1sby1maWVnbyIsImV4cCI6MTc5NTE5MzkwMDg4M30.IBX-Z6Phdedt-N_ISQVjG6C-", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4Y5k", + "title": "Antonio Sarcevic", + "socials": { + "github": "https://github.com/SarcevicAntonio", + "linkedin": "https://www.linkedin.com/in/sarcevic/", + "twitter": "https://twitter.com/SarcevicAntonio" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRZNWsiLCJzbHVnIjoiYW50b25pby1zYXJjZXZpYyIsImV4cCI6MTc5NTE5MzkwMDg4M30.YgSHFwkRM4z_HD6SFtv8gplZ", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4Yzd", @@ -184,8 +292,11 @@ const PATCHES = [ "twitter": "https://twitter.com/miracle_404", "youtube": "https://www.youtube.com/channel/UCzv8q9-tSIQuTDzgB1BgXMQ", "instagram": "https://www.instagram.com/anuradha_404/", - "threads": "https://www.threads.net/@anuradha_404" - } + "threads": "https://www.threads.net/@anuradha_404", + "email": "contact@anuradhakumari.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRZemQiLCJzbHVnIjoiYW51cmFkaGEta3VtYXJpIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.3Z40EHN9XZonZErg3EEe2PcX", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4BTU", @@ -195,15 +306,32 @@ const PATCHES = [ "twitter": "https://twitter.com/aprilwensel", "linkedin": "https://linkedin.com/in/aprilwensel", "mastodon": "https://mastodon.social/@aprilwensel", - "bluesky": "https://bsky.app/profile/aprilwensel.com" - } + "bluesky": "https://bsky.app/profile/aprilwensel.com", + "email": "april@compassionatecoding.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRCVFUiLCJzbHVnIjoiYXByaWwtd2Vuc2VsIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.N-KZ9SIltC-tc2qgJuim95hm", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "2795b7e9-0450-410d-942c-7f21f2ecbce8", "title": "Balki Kodarapu", "socials": { - "linkedin": "https://www.linkedin.com/in/balkikodarapu/" - } + "linkedin": "https://www.linkedin.com/in/balkikodarapu/", + "email": "balki.kodarapu@gmail.com" + }, + "portalToken": "eyJpZCI6IjI3OTViN2U5LTA0NTAtNDEwZC05NDJjLTdmMjFmMmVjYmNlOCIsInNsdWciOiJiYWxraS1rb2RhcmFwdSIsImV4cCI6MTc5NTE5MzkwMDg4M30._VA_08soDks0wSbjO9VZJHs0", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4XR6", + "title": "Batuhan Ozdemir", + "socials": { + "github": "https://github.com/BatuhanW", + "twitter": "https://twitter.com/kakamelatte", + "email": "batuhanwilhelm@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRYUjYiLCJzbHVnIjoiYmF0dWhhbi1vemRlbWlyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.JczVFDRH570wbzPB3uAfdGUz", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3yr4", @@ -216,7 +344,9 @@ const PATCHES = [ "youtube": "https://www.youtube.com/@bekahhw", "bluesky": "https://bsky.app/profile/bekahhw.com", "threads": "https://www.threads.net/@BekahHW" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDN5cjQiLCJzbHVnIjoiYmVrYWgtaGF3cm90LXdlaWdlbCIsImV4cCI6MTc5NTE5MzkwMDg4M30.e_RyTvZmz7qPTTDyqwrUJwUG", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt48CG", @@ -229,8 +359,11 @@ const PATCHES = [ "bluesky": "https://bsky.app/profile/bencodezen.io", "linkedin": "https://linkedin.com/in/bencodezen", "instagram": "https://www.instagram.com/bencodezen", - "threads": "https://www.threads.net/@bencodezen" - } + "threads": "https://www.threads.net/@bencodezen", + "email": "ben@bencodezen.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDQ4Q0ciLCJzbHVnIjoiYmVuLWhvbmciLCJleHAiOjE3OTUxOTM5MDA4ODN9.ZFHoWR-QD1lrEaTE3qc4bL9b", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3zBO", @@ -242,8 +375,22 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/SomeAnticsDev", "twitter": "https://twitter.com/BenDMyers", "youtube": "https://www.youtube.com/channel/UCoc1J1XEEtg4sNrt3V-tNRw", - "bluesky": "https://bsky.app/profile/benmyers.dev" - } + "bluesky": "https://bsky.app/profile/benmyers.dev", + "email": "ben@benmyers.dev" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDN6Qk8iLCJzbHVnIjoiYmVuLW15ZXJzIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.afqLHGTuOvZOOGVFdxMebjbh", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "97a6824d-8fc4-4385-9966-a27497f131cb", + "title": "Benjamin Bressington", + "socials": { + "facebook": "https://www.facebook.com/automateboring", + "linkedin": "https://www.linkedin.com/company/automateboring", + "youtube": "https://www.youtube.com/@theAutomateBoring" + }, + "portalToken": "eyJpZCI6Ijk3YTY4MjRkLThmYzQtNDM4NS05OTY2LWEyNzQ5N2YxMzFjYiIsInNsdWciOiJiZW5qYW1pbi1icmVzc2luZ3RvbiIsImV4cCI6MTc5NTE5MzkwMDg4M30._I59EvkktpGcg6wHOOlfMnr4", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3ybp", @@ -259,8 +406,11 @@ const PATCHES = [ "twitter": "https://twitter.com/brad_frost/", "youtube": "https://www.youtube.com/@brad_frost", "bluesky": "https://bsky.app/profile/bradfrost.bsky.social", - "threads": "https://www.threads.net/@brad_frost" - } + "threads": "https://www.threads.net/@brad_frost", + "email": "brad@bradfrost.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDN5YnAiLCJzbHVnIjoiYnJhZC1mcm9zdCIsImV4cCI6MTc5NTE5MzkwMDg4M30.m1o6BKuJEfDl04jmgXub-JAH", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt4XlQ", @@ -275,8 +425,11 @@ const PATCHES = [ "instagram": "https://instagram.com/bradgarropy", "bluesky": "https://bsky.app/profile/bradgarropy.com", "linkedin": "https://linkedin.com/in/bradgarropy", - "threads": "https://www.threads.net/@bradgarropy" - } + "threads": "https://www.threads.net/@bradgarropy", + "email": "bradgarropy@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRYbFEiLCJzbHVnIjoiYnJhZC1nYXJyb3B5IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.aXJ29c3BhOShLmYAfrOQBOoq", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3yMa", @@ -284,8 +437,22 @@ const PATCHES = [ "socials": { "linkedin": "https://www.linkedin.com/in/braden-sidoti-25676537/", "twitter": "https://twitter.com/bsinthewild", - "bluesky": "https://bsky.app/profile/bs14.bsky.social" - } + "bluesky": "https://bsky.app/profile/bs14.bsky.social", + "email": "braden@clerk.dev" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDN5TWEiLCJzbHVnIjoiYnJhZGVuLXNpZG90aSIsImV4cCI6MTc5NTE5MzkwMDg4M30.qc7mvTo-QrmK_Q5RNHXiZFdp", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3g5b", + "title": "Brandon Bayer", + "socials": { + "github": "https://github.com/flybayer", + "twitter": "https://twitter.com/flybayer", + "email": "b@bayer.ws" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDNnNWIiLCJzbHVnIjoiYnJhbmRvbi1iYXllciIsImV4cCI6MTc5NTE5MzkwMDg4M30.ZQxqxKVc-H8ct3LN0eM9xVSa", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3fqM", @@ -295,8 +462,20 @@ const PATCHES = [ "twitter": "https://twitter.com/brandontroberts", "youtube": "https://www.youtube.com/@BrandonRobertsDev", "linkedin": "https://www.linkedin.com/in/brandontroberts/", - "bluesky": "https://bsky.app/profile/brandonroberts.dev" - } + "bluesky": "https://bsky.app/profile/brandonroberts.dev", + "email": "robertsbt@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDNmcU0iLCJzbHVnIjoiYnJhbmRvbi1yb2JlcnRzIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.gDW0qM9boX3kR9hghy7tSKJA", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt3pGd", + "title": "Brett Fitzgerald", + "socials": { + "linkedin": "https://www.linkedin.com/in/brettgfitzgerald/" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDNwR2QiLCJzbHVnIjoiYnJldHQtZml0emdlcmFsZCIsImV4cCI6MTc5NTE5MzkwMDg4M30.LK5uJMECJi3BTrC_H9-y4oJv", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "c14bf99a-2345-47d9-b3cb-81b6ed30bfe4", @@ -311,8 +490,11 @@ const PATCHES = [ "youtube": "https://www.youtube.com/channel/UCID02LhTNYYhWbok3zyggOw", "tiktok": "https://tiktok.com/@clarkio", "bluesky": "https://bsky.app/profile/brianclark.social", - "threads": "https://www.threads.net/@_clarkio" - } + "threads": "https://www.threads.net/@_clarkio", + "email": "brian.clark@snyk.io" + }, + "portalToken": "eyJpZCI6ImMxNGJmOTlhLTIzNDUtNDdkOS1iM2NiLTgxYjZlZDMwYmZlNCIsInNsdWciOiJicmlhbi1jbGFyayIsImV4cCI6MTc5NTE5MzkwMDg4M30.wriAkIZdXjOgu01JzYfNUSa6", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3Mpe", @@ -324,8 +506,11 @@ const PATCHES = [ "bluesky": "https://bsky.app/profile/bizza.pizza", "instagram": "https://instagram.com/bdougieyo", "youtube": "https://youtube.com/@bdougie", - "threads": "https://www.threads.net/@bdougieyo" - } + "threads": "https://www.threads.net/@bdougieyo", + "email": "brian.rinaldi@localstack.cloud" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDNNcGUiLCJzbHVnIjoiYnJpYW4tZG91Z2xhcyIsImV4cCI6MTc5NTE5MzkwMDg4M30.Y6j1tsukDq5pHmkgqkKUHKtP", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3Lvl", @@ -335,8 +520,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/bwhli/?originalSubdomain=jp", "twitter": "https://twitter.com/bwhli", "instagram": "https://instagram.com/bwhli", - "threads": "https://www.threads.net/@bwhli" - } + "threads": "https://www.threads.net/@bwhli", + "email": "brianli@kinsta.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDNMdmwiLCJzbHVnIjoiYnJpYW4tbGkiLCJleHAiOjE3OTUxOTM5MDA4ODN9.0kBTI1o6GUS5NG9A4PTPzu7n", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3MG5", @@ -346,8 +534,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/brianrinaldi/", "twitter": "https://twitter.com/remotesynth", "mastodon": "https://mastodon.xyz/@remotesynth", - "bluesky": "https://bsky.app/profile/remotesynthesis.com" - } + "bluesky": "https://bsky.app/profile/remotesynthesis.com", + "email": "brian.rinaldi@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDNNRzUiLCJzbHVnIjoiYnJpYW4tcmluYWxkaSIsImV4cCI6MTc5NTE5MzkwMDg4M30.gie-NQ-Iny2zw0EJXEf4MEUt", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt3MVK", @@ -358,7 +549,9 @@ const PATCHES = [ "polywork": "https://www.polywork.com/musicalwebdev", "twitter": "https://twitter.com/musicalwebdev", "bluesky": "https://bsky.app/profile/musicalwebdev.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDNNVksiLCJzbHVnIjoiYnJpdHRhbnktd2Fsa2VyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.E8IG7jGEjZN5TzNY8fVJ0Rh4", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "9ea0a439-2219-455b-97a2-4c21559ce8e5", @@ -368,8 +561,11 @@ const PATCHES = [ "bluesky": "https://bsky.app/profile/brittneypostma.bsky.social", "github": "https://github.com/brittneypostma", "linkedin": "https://www.linkedin.com/in/brittneypostma/", - "youtube": "https://www.youtube.com/@BrittneyPostma" - } + "youtube": "https://www.youtube.com/@BrittneyPostma", + "email": "bdesignedwebdev@gmail.com" + }, + "portalToken": "eyJpZCI6IjllYTBhNDM5LTIyMTktNDU1Yi05N2EyLTRjMjE1NTljZThlNSIsInNsdWciOiJicml0dG5leS1wb3N0bWEtZ3Vlc3QiLCJleHAiOjE3OTUxOTM5MDA4ODN9.yYihOMr4KskoINlWzIuvMY-M", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt31Rb", @@ -381,8 +577,11 @@ const PATCHES = [ "twitter": "https://twitter.com/brob", "bluesky": "https://bsky.app/profile/brob.dev", "youtube": "https://www.youtube.com/@bryanlrobinson", - "linkedin": "https://linkedin.com/in/bryanlrobinson" - } + "linkedin": "https://linkedin.com/in/bryanlrobinson", + "email": "bryanlrobinson@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDMxUmIiLCJzbHVnIjoiYnJ5YW4tcm9iaW5zb24iLCJleHAiOjE3OTUxOTM5MDA4ODN9.OjxESCnJrhzPOkH0g5ORHBcF", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt25LQ", @@ -394,7 +593,9 @@ const PATCHES = [ "twitter": "https://twitter.com/cassidoo", "bluesky": "https://bsky.app/profile/cassidoo.co", "mastodon": "https://notacult.social/@cassidoo" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDI1TFEiLCJzbHVnIjoiY2Fzc2lkb28iLCJleHAiOjE3OTUxOTM5MDA4ODN9.cWjho4nN2VA729bJ4up03E4S", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt2aeE", @@ -405,8 +606,11 @@ const PATCHES = [ "twitter": "https://twitter.com/chrisbiscardi", "youtube": "http://youtube.com/c/chrisbiscardi", "bluesky": "https://bsky.app/profile/chrisbiscardi.bsky.social", - "mastodon": "https://hachyderm.io/@chrisbiscardi" - } + "mastodon": "https://hachyderm.io/@chrisbiscardi", + "email": "chris@christopherbiscardi.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDJhZUUiLCJzbHVnIjoiY2hyaXMtYmlzY2FyZGkiLCJleHAiOjE3OTUxOTM5MDA4ODN9.VxO35l9liWJnddctPDLKIeT5", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "6cd2fb87-5431-424c-a0cc-267f6890f4ba", @@ -414,8 +618,11 @@ const PATCHES = [ "socials": { "linkedin": "https://www.linkedin.com/in/cferdinandi/", "mastodon": "https://mastodon.social/@cferdinandi", - "bluesky": "https://bsky.app/profile/cferdinandi.bsky.social" - } + "bluesky": "https://bsky.app/profile/cferdinandi.bsky.social", + "email": "chris@adhdftw.com" + }, + "portalToken": "eyJpZCI6IjZjZDJmYjg3LTU0MzEtNDI0Yy1hMGNjLTI2N2Y2ODkwZjRiYSIsInNsdWciOiJjaHJpcy1mZXJkaW5hbmRpIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.aQdv57Z8NMQ18CCmmJOIyQy_", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "5cb367ce-a218-4c3d-8614-a64e188a08c1", @@ -426,7 +633,9 @@ const PATCHES = [ "twitter": "https://twitter.com/chris__sev", "youtube": "https://www.youtube.com/c/ChrisSev", "bluesky": "https://bsky.app/profile/chrissev.bsky.social" - } + }, + "portalToken": "eyJpZCI6IjVjYjM2N2NlLWEyMTgtNGMzZC04NjE0LWE2NGUxODhhMDhjMSIsInNsdWciOiJjaHJpcy1zZXYiLCJleHAiOjE3OTUxOTM5MDA4ODN9.CqcsZkx4_Oa-sWby1nSiTWQm", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt1ll9", @@ -435,8 +644,11 @@ const PATCHES = [ "github": "https://github.com/delucis/", "mastodon": "https://m.webtoo.ls/@swithinbank", "twitter": "https://twitter.com/swithinbank", - "bluesky": "https://bsky.app/profile/chrisswithin.bsky.social" - } + "bluesky": "https://bsky.app/profile/chrisswithin.bsky.social", + "email": "swithinbank@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDFsbDkiLCJzbHVnIjoiY2hyaXMtc3dpdGhpbmJhbmsiLCJleHAiOjE3OTUxOTM5MDA4ODN9._mDYVg7BjbLdsqFoVt7DpogN", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt1Hvn", @@ -447,7 +659,20 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/burnedchris", "twitter": "https://twitter.com/burnedchris", "bluesky": "https://bsky.app/profile/inth.com" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDFIdm4iLCJzbHVnIjoiY2hyaXN0b3BoZXItYnVybnMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.CT03gumKCMgQAhFjzVYs23GL", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0uzD", + "title": "Christy Ennis-Kloote", + "socials": { + "linkedin": "https://www.linkedin.com/in/enniskloote/", + "medium": "https://enniskloote.medium.com/", + "twitter": "https://twitter.com/EnnisKloote" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDB1ekQiLCJzbHVnIjoiY2hyaXN0eS1lbm5pcy1rbG9vdGUiLCJleHAiOjE3OTUxOTM5MDA4ODN9.EkxlniorV9Jj6Oj45uYsMoBm", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0IdT", @@ -459,8 +684,11 @@ const PATCHES = [ "youtube": "https://www.youtube.com/clarksell", "instagram": "https://instagram.com/theClarkSell", "bluesky": "https://bsky.app/profile/clarksell.bsky.social", - "threads": "https://www.threads.net/@theClarkSell" - } + "threads": "https://www.threads.net/@theClarkSell", + "email": "hello@unspecified.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBJZFQiLCJzbHVnIjoiY2xhcmstc2VsbCIsImV4cCI6MTc5NTE5MzkwMDg4M30.zkKACgxGNjKLW1NvspvrE8KP", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0UgK", @@ -473,8 +701,11 @@ const PATCHES = [ "youtube": "https://www.youtube.com/colbyfayock", "bluesky": "https://bsky.app/profile/colbyfayock.com", "instagram": "https://www.instagram.com/colbyfayock/", - "threads": "https://www.threads.net/@colbyfayock" - } + "threads": "https://www.threads.net/@colbyfayock", + "email": "colby.fayock@cloudinary.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBVZ0siLCJzbHVnIjoiY29sYnktZmF5b2NrIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.P8ihM3Rtr5TMSyUDO39fJYTf", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "8c1a2a76-b615-430b-96d8-0f80097dc370", @@ -485,8 +716,21 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/crutchcorn", "twitter": "https://twitter.com/crutchcorn/", "bluesky": "https://bsky.app/profile/crutchcorn.dev", - "linkedin": "https://www.linkedin.com/in/corbincrutchley/" - } + "linkedin": "https://www.linkedin.com/in/corbincrutchley/", + "email": "github@crutchcorn.dev" + }, + "portalToken": "eyJpZCI6IjhjMWEyYTc2LWI2MTUtNDMwYi05NmQ4LTBmODAwOTdkYzM3MCIsInNsdWciOiJjb3JiaW4tY3J1dGNobGV5IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.PBrb3w7d0lOYphmdqM44-f03", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "fcd7ce46-7e73-4802-8ec9-9fbaf5f13ee5", + "title": "Dan Hafner", + "socials": { + "linkedin": "https://www.linkedin.com/in/dan-hafner-35066a39/", + "email": "dan@dappermobileapps.com" + }, + "portalToken": "eyJpZCI6ImZjZDdjZTQ2LTdlNzMtNDgwMi04ZWM5LTlmYmFmNWYxM2VlNSIsInNsdWciOiJkYW4taGFmbmVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ._lvVEAi8fVgWV9d4XqO85D6X", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0IJ9", @@ -497,7 +741,9 @@ const PATCHES = [ "twitter": "https://twitter.com/DanielRibbens", "instagram": "https://www.instagram.com/payloadcms/", "threads": "https://www.threads.net/@payloadcms" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBJSjkiLCJzbHVnIjoiZGFuaWVsLXJpYmJlbnMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.5JilfxiVR-MXGMU2leFz68um", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0Hyp", @@ -511,8 +757,11 @@ const PATCHES = [ "bluesky": "https://bsky.app/profile/danielroe.dev", "linkedin": "https://www.linkedin.com/in/daniel-roe/", "instagram": "https://www.instagram.com/daniel.c.roe", - "threads": "https://www.threads.net/@daniel.c.roe" - } + "threads": "https://www.threads.net/@daniel.c.roe", + "email": "daniel@roe.dev" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBIeXAiLCJzbHVnIjoiZGFuaWVsLXJvZSIsImV4cCI6MTc5NTE5MzkwMDg4M30.6ExvxkRAvxXzJrAqRIrj2UlF", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0HeV", @@ -523,7 +772,9 @@ const PATCHES = [ "twitter": "https://twitter.com/debs_obrien", "youtube": "https://www.youtube.com/c/DebbieOBrien", "bluesky": "https://bsky.app/profile/debbie.codes" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBIZVYiLCJzbHVnIjoiZGViYmllLW8tYnJpZW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.bwA7rhpuVa6Rl8yvxqxhVeXd", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0HPG", @@ -533,8 +784,23 @@ const PATCHES = [ "twitch": "https://twitch.com/domitriusclark", "twitter": "https://twitter.com/domitriusclark", "linkedin": "https://www.linkedin.com/in/domitriusclark/", - "bluesky": "https://bsky.app/profile/domitriusclark.bsky.social" - } + "bluesky": "https://bsky.app/profile/domitriusclark.bsky.social", + "email": "domitriusaclark@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBIUEciLCJzbHVnIjoiZG9taXRyaXVzLWNsYXJrIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.LAeycSVKORXkGSBMsXH4VX_J", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0H4w", + "title": "Douwe Maan", + "socials": { + "github": "https://github.com/DouweM", + "linkedin": "https://www.linkedin.com/in/douwem/", + "twitter": "https://twitter.com/DouweM", + "email": "hi@douwe.me" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBINHciLCJzbHVnIjoiZG91d2UtbWFhbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.TrAV139Efp24re3wbluctbYA", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0GB3", @@ -543,8 +809,11 @@ const PATCHES = [ "github": "https://github.com/DAlperin", "twitter": "https://twitter.com/dovunderscore", "mastodon": "https://mastodon.social/@dov", - "linkedin": "https://www.linkedin.com/in/dov-alperin" - } + "linkedin": "https://www.linkedin.com/in/dov-alperin", + "email": "dov@fly.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBHQjMiLCJzbHVnIjoiZG92LWFscGVyaW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.zsdvTjQU66iki7-uVcGs16BT", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0Gkc", @@ -554,7 +823,9 @@ const PATCHES = [ "mastodon": "https://m.webtoo.ls/@posva", "twitter": "https://twitter.com/posva", "bluesky": "https://bsky.app/profile/esm.dev" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBHa2MiLCJzbHVnIjoiZWR1YXJkby1zYW4tbWFydGluLW1vcm90ZSIsImV4cCI6MTc5NTE5MzkwMDg4M30.VaznFB7HyJmsNGb8-F68IiHB", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0GQI", @@ -564,7 +835,32 @@ const PATCHES = [ "twitter": "https://twitter.com/kenny_io", "youtube": "https://www.youtube.com/c/EkeneEze", "linkedin": "https://www.linkedin.com/in/ekeneeze/" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBHUUkiLCJzbHVnIjoiZWtlbmUtZXplIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.y1kIV4f_O4LltO7RPcQnkKjs", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0Fvo", + "title": "Elena Lape", + "socials": { + "devto": "https://dev.to/elenalape", + "github": "https://github.com/elenalape", + "linkedin": "https://www.linkedin.com/in/ElenaLape/", + "twitter": "https://twitter.com/elena_lape", + "youtube": "https://www.youtube.com/elenalape", + "email": "hi@elenalape.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBGdm8iLCJzbHVnIjoiZWxlbmEtbGFwZSIsImV4cCI6MTc5NTE5MzkwMDg4M30.1hJhxk6FSqoJIVTN0e3hOpJG", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0FMF", + "title": "Elizabeth Bush", + "socials": { + "linkedin": "https://www.linkedin.com/in/elizabethbush/" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBGTUYiLCJzbHVnIjoiZWxpemFiZXRoLWJ1c2giLCJleHAiOjE3OTUxOTM5MDA4ODN9.d7S-wMTwXwR2wookqDGnYdty", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0F70", @@ -573,7 +869,9 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/elizabethtrumanwilson/", "twitter": "https://twitter.com/TruWil", "bluesky": "https://bsky.app/profile/wilsones13.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBGNzAiLCJzbHVnIjoiZWxpemFiZXRoLXdpbHNvbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.S0tdy4WUKnix4HfymESWuLoK", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0FbU", @@ -584,8 +882,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/emmatwersky/", "twitter": "https://twitter.com/twerske", "bluesky": "https://bsky.app/profile/twerk.bsky.social", - "threads": "https://www.threads.net/@twerske" - } + "threads": "https://www.threads.net/@twerske", + "email": "emmatwersky@google.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBGYlUiLCJzbHVnIjoiZW1tYS10d2Vyc2t5IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.b32asCqWFYqtKBOfJTU3SLWf", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0Erl", @@ -594,8 +895,11 @@ const PATCHES = [ "github": "https://github.com/EricSimons", "linkedin": "https://www.linkedin.com/in/eric-simons-a464a664/", "twitter": "https://twitter.com/ericsimons40", - "bluesky": "https://bsky.app/profile/esft.bsky.social" - } + "bluesky": "https://bsky.app/profile/esft.bsky.social", + "email": "eric@stackblitz.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBFcmwiLCJzbHVnIjoiZXJpYy1zaW1vbnMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.Ji7z7aWhvQ3tqUxOXHKIpvqJ", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0CKG", @@ -604,8 +908,11 @@ const PATCHES = [ "github": "https://github.com/ErikCH", "twitter": "https://twitter.com/ErikCH", "youtube": "https://www.youtube.com/c/programwitherik", - "bluesky": "https://bsky.app/profile/erikch.bsky.social" - } + "bluesky": "https://bsky.app/profile/erikch.bsky.social", + "email": "icystorm@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBDS0ciLCJzbHVnIjoiZXJpay1oYW5jaGV0dCIsImV4cCI6MTc5NTE5MzkwMDg4M30.DwMfIZ3FQYkUUBiwRD78hIo-", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0EcW", @@ -614,8 +921,33 @@ const PATCHES = [ "github": "https://github.com/fgiuliani", "linkedin": "https://www.linkedin.com/in/facundogiuliani/", "twitter": "https://twitter.com/facundozurdo", - "bluesky": "https://bsky.app/profile/fgiuliani.bsky.social" - } + "bluesky": "https://bsky.app/profile/fgiuliani.bsky.social", + "email": "facundo.giuliani@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBFY1ciLCJzbHVnIjoiZmFjdW5kby1naXVsaWFuaSIsImV4cCI6MTc5NTE5MzkwMDg4M30.Het0qZMq5EOHMW8A8HXovK1e", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0C51", + "title": "Flor Antara", + "socials": { + "linkedin": "https://www.linkedin.com/in/florantara/", + "twitter": "https://twitter.com/techflor", + "email": "fantara@zipwhip.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBDNTEiLCJzbHVnIjoiZmxvci1hbnRhcmEiLCJleHAiOjE3OTUxOTM5MDA4ODN9.w6ikYUtOY3jSvK1EZl7G1kyq", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0Bpm", + "title": "Fred K Schott", + "socials": { + "github": "https://github.com/fredkschott", + "linkedin": "https://www.linkedin.com/in/fredkschott/", + "twitter": "https://twitter.com/fredkschott" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBCcG0iLCJzbHVnIjoiZnJlZC1rLXNjaG90dCIsImV4cCI6MTc5NTE5MzkwMDg4M30.QnwkDFAHKrLoMqvDIV7tB493", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0BLI", @@ -625,7 +957,9 @@ const PATCHES = [ "twitter": "https://twitter.com/graysonhicks", "instagram": "https://instagram.com/jgraysonhicks", "threads": "https://www.threads.net/@jgraysonhicks" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBCTEkiLCJzbHVnIjoiZ3JheXNvbi1oaWNrcyIsImV4cCI6MTc5NTE5MzkwMDg4M30.xvZtsxidxZiGREwuN2tHmC05", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0B63", @@ -634,8 +968,11 @@ const PATCHES = [ "github": "https://github.com/gregwhitworth", "twitter": "https://twitter.com/gregwhitworth", "linkedin": "https://www.linkedin.com/in/gregwhitworth/", - "bluesky": "https://bsky.app/profile/gregwhitworth.bsky.social" - } + "bluesky": "https://bsky.app/profile/gregwhitworth.bsky.social", + "email": "gwhitworth@salesforce.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBCNjMiLCJzbHVnIjoiZ3JlZy13aGl0d29ydGgiLCJleHAiOjE3OTUxOTM5MDA4ODN9.l91jKTIwYz8R2ZxxniUY7LwR", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0BaX", @@ -646,8 +983,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/guillermo-rauch-b834b917b/", "twitter": "https://twitter.com/rauchg", "bluesky": "https://bsky.app/profile/rauchg.blue", - "threads": "https://www.threads.net/@rauchg" - } + "threads": "https://www.threads.net/@rauchg", + "email": "rauchg@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBCYVgiLCJzbHVnIjoiZ3VpbGxlcm1vLXJhdWNoIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.ms2asfYCipV5pEAHmzZuzEOf", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0Aqo", @@ -656,8 +996,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/heather-buchel-92bb5b64/", "mastodon": "https://hachyderm.io/@hbuchel", "twitter": "https://twitter.com/hbuchel", - "bluesky": "https://bsky.app/profile/heather-buchel.com" - } + "bluesky": "https://bsky.app/profile/heather-buchel.com", + "email": "buchel@amazon.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBBcW8iLCJzbHVnIjoiaGVhdGhlci1idWNoZWwiLCJleHAiOjE3OTUxOTM5MDA4ODN9.B4gfprfiSKo84ZQgvK6aO1hC", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0AbZ", @@ -665,7 +1008,18 @@ const PATCHES = [ "socials": { "twitter": "https://twitter.com/hdjirdeh", "bluesky": "https://bsky.app/profile/houssein.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBBYloiLCJzbHVnIjoiaG91c3NlaW4tZGppcmRlaCIsImV4cCI6MTc5NTE5MzkwMDg4M30.iTVbK12ibZKeoojWvxskGp8Y", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0A20", + "title": "Igor Zalutski", + "socials": { + "twitter": "https://twitter.com/igorzij" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBBMjAiLCJzbHVnIjoiaWdvci16YWx1dHNraSIsImV4cCI6MTc5NTE5MzkwMDg4M30.pEZ-0jwzSzzNfrinoVshKuti", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0AHF", @@ -673,7 +1027,9 @@ const PATCHES = [ "socials": { "twitter": "https://twitter.com/jakob_rosenberg", "bluesky": "https://bsky.app/profile/jakerosenberg.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDBBSEYiLCJzbHVnIjoiamFrZS1yb3NlbmJlcmciLCJleHAiOjE3OTUxOTM5MDA4ODN9.1dr53UMejFVYntP8xazsOK-E", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt09XW", @@ -682,8 +1038,11 @@ const PATCHES = [ "github": "https://github.com/perkinsjr/", "twitter": "https://twitter.com/james_r_perkins", "youtube": "https://www.youtube.com/@james-perkins", - "bluesky": "https://bsky.app/profile/jamesperkins.bsky.social" - } + "bluesky": "https://bsky.app/profile/jamesperkins.bsky.social", + "email": "jamesperkins@hey.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA5WFciLCJzbHVnIjoiamFtZXMtci1wZXJraW5zIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.aGXbYgIjwzZ-z2DT61vNA3EU", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt09ml", @@ -697,8 +1056,11 @@ const PATCHES = [ "twitter": "https://twitter.com/jamesqquick", "youtube": "https://www.youtube.com/jamesqquick", "bluesky": "https://bsky.app/profile/jamesqquick.bsky.social", - "threads": "https://www.threads.net/@jamesqquick" - } + "threads": "https://www.threads.net/@jamesqquick", + "email": "james.q.quick@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA5bWwiLCJzbHVnIjoiamFtZXMtcS1xdWljayIsImV4cCI6MTc5NTE5MzkwMDg4M30.6se56-vNlWSyBufuqdIvF3Ys", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt08OO", @@ -707,8 +1069,21 @@ const PATCHES = [ "github": "https://github.com/jamesvidler", "linkedin": "https://www.linkedin.com/in/jameskvidler/", "twitter": "https://twitter.com/jameskvidler", - "bluesky": "https://bsky.app/profile/fownhopeboy.bsky.social" - } + "bluesky": "https://bsky.app/profile/fownhopeboy.bsky.social", + "email": "james@agilitycms.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA4T08iLCJzbHVnIjoiamFtZXMtdmlkbGVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.oEbxL9DMeO64Hp2F_zwTn18Q", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt0899", + "title": "Jason Bahl", + "socials": { + "twitter": "https://twitter.com/jasonbahl", + "email": "jason.bahl@wpengine.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA4OTkiLCJzbHVnIjoiamFzb24tYmFobCIsImV4cCI6MTc5NTE5MzkwMDg4M30.Q9mg_RMH8oSbwAST9OhGW8z8", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt07tu", @@ -722,8 +1097,24 @@ const PATCHES = [ "mastodon": "https://youtube.com/@codetv-dev", "bluesky": "https://bsky.app/profile/jason.energy", "instagram": "https://instagram.com/jlengstorf", - "threads": "https://www.threads.net/@jlengstorf" - } + "threads": "https://www.threads.net/@jlengstorf", + "email": "jason@codetv.dev" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA3dHUiLCJzbHVnIjoiamFzb24tbGVuZ3N0b3JmIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.Zhc1BS3wKexshsd4OSU7XL0u", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt07ef", + "title": "Jeff Delaney", + "socials": { + "github": "https://github.com/codediodeio", + "linkedin": "https://www.linkedin.com/in/jeff-delaney/", + "twitter": "https://twitter.com/jeffdelaney23", + "youtube": "https://www.youtube.com/fireship", + "email": "hello@fireship.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA3ZWYiLCJzbHVnIjoiamVmZi1kZWxhbmV5IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.qigRr8WCgXLg31dL7xW_eEnD", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt07AB", @@ -733,8 +1124,11 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/jennjunod", "twitter": "https://twitter.com/jennjunod", "youtube": "https://www.youtube.com/channel/UCOYqYy7ebj5j63TbdGB-Lcg", - "bluesky": "https://bsky.app/profile/jennjunod.bsky.social" - } + "bluesky": "https://bsky.app/profile/jennjunod.bsky.social", + "email": "hello@teachjenntech.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA3QUIiLCJzbHVnIjoiamVubi1qdW5vZCIsImV4cCI6MTc5NTE5MzkwMDg4M30.qS9O5_pDTdk0uRM2qFZ48nnX", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt06QS", @@ -746,8 +1140,20 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/elpunish3rr/", "twitter": "https://twitter.com/codeSTACKr", "youtube": "https://www.youtube.com/codestackr", - "bluesky": "https://bsky.app/profile/codestackr.com" - } + "bluesky": "https://bsky.app/profile/codestackr.com", + "email": "codestackr@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA2UVMiLCJzbHVnIjoiamVzc2UtaGFsbCIsImV4cCI6MTc5NTE5MzkwMDg4M30.cimh0sMmcfkWy6BM42ysxGta", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt07PQ", + "title": "Jhey Tompkins", + "socials": { + "twitter": "https://twitter.com/jh3yy" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA3UFEiLCJzbHVnIjoiamhleS10b21wa2lucyIsImV4cCI6MTc5NTE5MzkwMDg4M30.B52B0RL0SddsNaRvfN5w58ix", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt06fh", @@ -761,7 +1167,9 @@ const PATCHES = [ "youtube": "https://www.youtube.com/acekyd", "mastodon": "https://mastodon.social/@wolfenrain", "bluesky": "https://bsky.app/profile/wolfenra.in" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA2ZmgiLCJzbHVnIjoiam9jaHVtLXdvbGZlbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.BqduQAE_EAkgMe6iVLIThdaF", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "9a8d9256-114c-479d-af51-7fc9176b7abf", @@ -772,8 +1180,11 @@ const PATCHES = [ "instagram": "https://instagram.com/jcasabona", "linkedin": "https://www.linkedin.com/in/jcasabona/", "youtube": "https://www.youtube.com/@JoeCasa", - "threads": "https://www.threads.net/@jcasabona" - } + "threads": "https://www.threads.net/@jcasabona", + "email": "jcasabona@gmail.com" + }, + "portalToken": "eyJpZCI6IjlhOGQ5MjU2LTExNGMtNDc5ZC1hZjUxLTdmYzkxNzZiN2FiZiIsInNsdWciOiJqb2UtY2FzYWJvbmEiLCJleHAiOjE3OTUxOTM5MDA4ODN9.oAmtLmIreE_M9nHngUeOx_Dc", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt06uw", @@ -781,8 +1192,11 @@ const PATCHES = [ "socials": { "linkedin": "https://www.linkedin.com/in/joelvarty", "twitter": "https://twitter.com/joelvarty", - "bluesky": "https://bsky.app/profile/joelvarty.com" - } + "bluesky": "https://bsky.app/profile/joelvarty.com", + "email": "joel@agilitycms.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA2dXciLCJzbHVnIjoiam9lbC12YXJ0eSIsImV4cCI6MTc5NTE5MzkwMDg4M30.ID36jM3n81ibiuLoeOXkdWaZ", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt06BD", @@ -791,8 +1205,11 @@ const PATCHES = [ "github": "https://github.com/dijonmusters", "twitter": "https://twitter.com/jonmeyers_io", "youtube": "https://youtube.com/supabase", - "bluesky": "https://bsky.app/profile/jonmeyers.io" - } + "bluesky": "https://bsky.app/profile/jonmeyers.io", + "email": "jonathon.d.meyers@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA2QkQiLCJzbHVnIjoiam9uLW1leWVycyIsImV4cCI6MTc5NTE5MzkwMDg4M30.aBOWiM-hqzQ0RrQBC5To4-hy", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "dc5819bf-2835-40e2-8f94-73d6b6518329", @@ -801,8 +1218,11 @@ const PATCHES = [ "github": "https://github.com/jonathanwilke", "linkedin": "https://www.linkedin.com/in/jonathan-wilke-766a83b8/", "twitter": "https://x.com/jonathan_wilke", - "bluesky": "https://bsky.app/profile/jonathanwilke.bsky.social" - } + "bluesky": "https://bsky.app/profile/jonathanwilke.bsky.social", + "email": "info@jonathan-wilke.de" + }, + "portalToken": "eyJpZCI6ImRjNTgxOWJmLTI4MzUtNDBlMi04Zjk0LTczZDZiNjUxODMyOSIsInNsdWciOiJqb25hdGhhbi13aWxrZSIsImV4cCI6MTc5NTE5MzkwMDg4M30.cPVi2F_vmd_y0i5yGL96rs5g", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt05vy", @@ -815,8 +1235,21 @@ const PATCHES = [ "twitter": "https://twitter.com/JordanPowell88", "youtube": "https://www.youtube.com/channel/UCDNwR4FvrnQTYABq_rJuvAg", "bluesky": "https://bsky.app/profile/jordanpowell.bsky.social", - "threads": "https://www.threads.net/@thejordanpowell" - } + "threads": "https://www.threads.net/@thejordanpowell", + "email": "jordan@jpdesigning.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA1dnkiLCJzbHVnIjoiam9yZGFuLXBvd2VsbCIsImV4cCI6MTc5NTE5MzkwMDg4M30.myv6mn27voJyMC2wT3wH0uFD", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt05gj", + "title": "Josefine Schaefer", + "socials": { + "twitter": "https://twitter.com/JsfnSchfr", + "email": "josefine.schaefer@storyblok.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA1Z2oiLCJzbHVnIjoiam9zZWZpbmUtc2NoYWVmZXIiLCJleHAiOjE3OTUxOTM5MDA4ODN9.AabpeIOaifKXy3RkC6vgvR9t", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt04x0", @@ -826,8 +1259,11 @@ const PATCHES = [ "twitter": "https://twitter.com/juanwmedia", "linkedin": "https://www.linkedin.com/in/juanwmedia/", "youtube": "https://www.youtube.com/@juanwmedia", - "bluesky": "https://bsky.app/profile/juanandreses.bsky.social" - } + "bluesky": "https://bsky.app/profile/juanandreses.bsky.social", + "email": "juan@wmedia.es" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA0eDAiLCJzbHVnIjoianVhbi1hbmRyZXMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.LYhQyJIv43EHYGKi9NkIG4St", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt05CF", @@ -837,8 +1273,11 @@ const PATCHES = [ "twitter": "https://twitter.com/juristr", "bluesky": "https://bsky.app/profile/juri.dev", "linkedin": "https://linkedin.com/in/juristr/", - "youtube": "https://youtube.com/@juristr" - } + "youtube": "https://youtube.com/@juristr", + "email": "juri.strumpflohner@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA1Q0YiLCJzbHVnIjoianVyaS1zdHJ1bXBmbG9obmVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.mP_lZvTGF4rNwgleqh4h_Nsl", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt04IM", @@ -846,8 +1285,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/jmduke", "twitter": "https://twitter.com/jmduke", - "bluesky": "https://bsky.app/profile/jmduke.com" - } + "bluesky": "https://bsky.app/profile/jmduke.com", + "email": "justin@buttondown.email" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA0SU0iLCJzbHVnIjoianVzdGluLWR1a2UiLCJleHAiOjE3OTUxOTM5MDA4ODN9.OJxLy2qC8n_XGvSN28Pba1_h", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt04hl", @@ -857,8 +1299,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/justinschwartzenberger/", "stackoverflow": "https://stackoverflow.com/users/349596/justin-schwartzenberger", "twitter": "https://twitter.com/schwarty", - "bluesky": "https://bsky.app/profile/schwarty.com" - } + "bluesky": "https://bsky.app/profile/schwarty.com", + "email": "schwarty@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA0aGwiLCJzbHVnIjoianVzdGluLXNjaHdhcnR6ZW5iZXJnZXIiLCJleHAiOjE3OTUxOTM5MDA4ODN9.iBOj9lGf9K4wvBDfu-6RgZfL", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0437", @@ -868,8 +1313,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/katerinaskroumpelou/", "medium": "https://pakotinia.medium.com/", "twitter": "https://twitter.com/psybercity", - "bluesky": "https://bsky.app/profile/psyber.city" - } + "bluesky": "https://bsky.app/profile/psyber.city", + "email": "katerina@nrwl.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDA0MzciLCJzbHVnIjoia2F0ZXJpbmEtc2tyb3VtcGVsb3UiLCJleHAiOjE3OTUxOTM5MDA4ODN9.CZ56dErqiJTbSBxBfg5ldwXT", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt0349", @@ -881,7 +1329,20 @@ const PATCHES = [ "polywork": "https://www.polywork.com/kathrynkay", "twitter": "https://twitter.com/kathryngrayson", "bluesky": "https://bsky.app/profile/kgrayson.com" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAzNDkiLCJzbHVnIjoia2F0aHJ5bi1ncmF5c29uIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.Ehy3UzDzYRkqqmTnCEGGYVYA", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt03JO", + "title": "Katie Franco", + "socials": { + "linkedin": "https://www.linkedin.com/in/katienfranco/", + "twitter": "https://twitter.com/girldevelopit", + "email": "mail@networkforgood.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAzSk8iLCJzbHVnIjoia2F0aWUtZnJhbmNvIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.OOPX6J7eu1fdiLiAELQZR7ZZ", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt02ou", @@ -890,8 +1351,11 @@ const PATCHES = [ "github": "https://github.com/kellenmace", "linkedin": "https://www.linkedin.com/in/kellenmace/", "twitter": "https://twitter.com/kellenmace", - "bluesky": "https://bsky.app/profile/kellenmace.bsky.social" - } + "bluesky": "https://bsky.app/profile/kellenmace.bsky.social", + "email": "kellen.mace@wpengine.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAyb3UiLCJzbHVnIjoia2VsbGVuLW1hY2UiLCJleHAiOjE3OTUxOTM5MDA4ODN9.XmFuGGQI3FvFhWckW44Z7aK3", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt025B", @@ -903,8 +1367,11 @@ const PATCHES = [ "substack": "https://substack.com/@kvlly", "twitter": "https://twitter.com/kvlly", "bluesky": "https://bsky.app/profile/kvlly.com", - "threads": "https://www.threads.net/@kelllyvaughn" - } + "threads": "https://www.threads.net/@kelllyvaughn", + "email": "hello@kvlly.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAyNUIiLCJzbHVnIjoia2VsbHktdmF1Z2huIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.b_XsdhxdYs_T2kwWm0ABbCmT", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt02KQ", @@ -913,8 +1380,11 @@ const PATCHES = [ "github": "https://github.com/kentcdodds", "twitter": "https://twitter.com/kentcdodds", "youtube": "https://www.youtube.com/@kentcdodds-vids", - "bluesky": "https://bsky.app/profile/kentcdodds.com" - } + "bluesky": "https://bsky.app/profile/kentcdodds.com", + "email": "me+github@kentcdodds.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAyS1EiLCJzbHVnIjoia2VudC1jLWRvZGRzIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.5UcPYGYc5bJZf1KoBgBE87tb", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt01pw", @@ -923,8 +1393,11 @@ const PATCHES = [ "github": "https://github.com/kmelve", "linkedin": "https://www.linkedin.com/in/knutmelvaer/", "twitter": "https://twitter.com/kmelve", - "bluesky": "https://bsky.app/profile/knut.fyi" - } + "bluesky": "https://bsky.app/profile/knut.fyi", + "email": "knut.melvaer@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAxcHciLCJzbHVnIjoia251dC1tZWx2YWVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.hJ3TqGBs0Lt47ha_QG5ubvc_", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt02Zf", @@ -934,7 +1407,9 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/wagslane/", "twitter": "https://twitter.com/wagslane", "bluesky": "https://bsky.app/profile/wagslane.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAyWmYiLCJzbHVnIjoibGFuZS13YWduZXIiLCJleHAiOjE3OTUxOTM5MDA4ODN9.T0jLlQV0LpVtyknvbKitcnbt", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt01ah", @@ -944,8 +1419,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/dev-lauren-lee/", "twitter": "https://twitter.com/LoLoCoding", "youtube": "https://www.youtube.com/channel/UCAXRntzYPySoBGSZJClcRlg", - "bluesky": "https://bsky.app/profile/laurenlee.bsky.social" - } + "bluesky": "https://bsky.app/profile/laurenlee.bsky.social", + "email": "lauren@lolocoding.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAxYWgiLCJzbHVnIjoibGF1cmVuLWxlZSIsImV4cCI6MTc5NTE5MzkwMDg4M30.z4T8OdBgq_YQyDHbcTb7BjVj", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHt01LS", @@ -956,8 +1434,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/lauriebarth/", "polywork": "https://timeline.laurieontech.com/", "twitter": "https://twitter.com/laurieontech", - "bluesky": "https://bsky.app/profile/laurieontech.dev" - } + "bluesky": "https://bsky.app/profile/laurieontech.dev", + "email": "brittney@ajonp.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDAxTFMiLCJzbHVnIjoibGF1cmllLWJhcnRoIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.POyEPithA2HLU9LhRPfTD-4d", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszy9J", @@ -967,7 +1448,9 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/briggsl/", "twitter": "https://twitter.com/briggsl", "bluesky": "https://bsky.app/profile/brig.gs" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3p5OUoiLCJzbHVnIjoibGVlLWJyaWdncyIsImV4cCI6MTc5NTE5MzkwMDg4M30.CC7fyxT58l2u_A8FLFDLwXHM", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszyTd", @@ -977,8 +1460,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/leeerob/", "twitter": "https://twitter.com/leeerob", "youtube": "https://www.youtube.com/@leerob", - "bluesky": "https://bsky.app/profile/leerobinson.bsky.social" - } + "bluesky": "https://bsky.app/profile/leerobinson.bsky.social", + "email": "lee@leerob.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3p5VGQiLCJzbHVnIjoibGVlLXJvYmluc29uIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.CGp3sQip9PfxL54sxDL9q9Xt", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "740e85e5-0635-4a59-9426-714467259091", @@ -987,8 +1473,11 @@ const PATCHES = [ "github": "https://github.com/lforst", "linkedin": "https://www.linkedin.com/in/luca-forstner-10807a231/", "twitter": "https://x.com/LucaForstner", - "bluesky": "https://bsky.app/profile/handle.invalid" - } + "bluesky": "https://bsky.app/profile/handle.invalid", + "email": "luca.forstner@gmail.com" + }, + "portalToken": "eyJpZCI6Ijc0MGU4NWU1LTA2MzUtNGE1OS05NDI2LTcxNDQ2NzI1OTA5MSIsInNsdWciOiJsdWNhLWZvcnN0bmVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.wccm8STAm3h1NA6wHY7aCoBF", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszpSl", @@ -998,8 +1487,31 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/spydon/", "twitter": "https://twitter.com/spyd0n", "mastodon": "https://fosstodon.org/@spydon", - "bluesky": "https://bsky.app/profile/spydon.dev" - } + "bluesky": "https://bsky.app/profile/spydon.dev", + "email": "me@lukas.fyi" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pwU2wiLCJzbHVnIjoibHVrYXMtc3B5ZG9uIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.fDqNExeUr57goanKHjP-77H6", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "f2a116ab-731a-4bc8-9a30-59b22f602f34", + "title": "Mark Huggins", + "socials": { + "twitter": "https://twitter.com/mhuggins1978" + }, + "portalToken": "eyJpZCI6ImYyYTExNmFiLTczMWEtNGJjOC05YTMwLTU5YjIyZjYwMmYzNCIsInNsdWciOiJtYXJrLWh1Z2dpbnMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.EDoCluYwvKMM35lenDj76y67", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszpDW", + "title": "Matias Capeletto", + "socials": { + "github": "https://github.com/patak-dev", + "twitter": "https://twitter.com/patak_dev", + "email": "matias.capeletto@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pwRFciLCJzbHVnIjoibWF0aWFzLWNhcGVsZXR0byIsImV4cCI6MTc5NTE5MzkwMDg4M30.nQ4C-wmrR8Wn2pKvDhyIAnSR", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszoj2", @@ -1007,8 +1519,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/matthewp", "twitter": "https://twitter.com/matthewcp", - "bluesky": "https://bsky.app/profile/spooky.click" - } + "bluesky": "https://bsky.app/profile/spooky.click", + "email": "matthew@matthewphillips.info" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pvajIiLCJzbHVnIjoibWF0dGhldy1waGlsbGlwcyIsImV4cCI6MTc5NTE5MzkwMDg4M30.7tBLlr8wO0CX8kLiB-HBGrx4", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "91c2331d-0fa1-4905-8bfe-8f5b78f00c64", @@ -1016,8 +1531,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/maxwellgerber", "linkedin": "https://www.linkedin.com/in/maxwellgerber/", - "bluesky": "https://bsky.app/profile/maxgerber.bsky.social" - } + "bluesky": "https://bsky.app/profile/maxgerber.bsky.social", + "email": "max@stytch.com" + }, + "portalToken": "eyJpZCI6IjkxYzIzMzFkLTBmYTEtNDkwNS04YmZlLThmNWI3OGYwMGM2NCIsInNsdWciOiJtYXgtZ2VyYmVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.X8eqlBA1ZHgdCkzspL47u1Is", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszoTn", @@ -1025,8 +1543,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/mxcl", "twitter": "https://twitter.com/mxcl", - "linkedin": "https://www.linkedin.com/in/mxcl" - } + "linkedin": "https://www.linkedin.com/in/mxcl", + "email": "mxcl@me.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pvVG4iLCJzbHVnIjoibWF4LWhvd2VsbCIsImV4cCI6MTc5NTE5MzkwMDg4M30.zuk1r0Ssjyk8R_aUjz5lT0C1", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszoEY", @@ -1037,8 +1558,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/mayashavin/", "twitter": "https://twitter.com/MayaShavin", "youtube": "https://www.youtube.com/@mayashavin", - "bluesky": "https://bsky.app/profile/mayashavin.com" - } + "bluesky": "https://bsky.app/profile/mayashavin.com", + "email": "alex@ajonp.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pvRVkiLCJzbHVnIjoibWF5YS1zaGF2aW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.QZ2cxAI1h62nXDMvY8i3_fYX", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHsznzJ", @@ -1052,7 +1576,9 @@ const PATCHES = [ "instagram": "https://www.instagram.com/chantastic/", "bluesky": "https://bsky.app/profile/michaelcwchan.bsky.social", "threads": "https://www.threads.net/@chantastic" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3puekoiLCJzbHVnIjoibWljaGFlbC1jaGFuIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.H2vvZfrd7Sm1RrfxBJPRXBoA", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHsznk4", @@ -1066,8 +1592,11 @@ const PATCHES = [ "twitter": "https://twitter.com/mrdowden", "youtube": "https://www.youtube.com/@mrdowden", "mastodon": "https://mastodon.social/@mrdowden", - "bluesky": "https://bsky.app/profile/mrdowden.bsky.social" - } + "bluesky": "https://bsky.app/profile/mrdowden.bsky.social", + "email": "michael@dowden.us" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3puazQiLCJzbHVnIjoibWljaGFlbC1kb3dkZW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.MqgfIZYgzem8mQN6iXHyM6gT", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHsznUp", @@ -1076,8 +1605,11 @@ const PATCHES = [ "github": "https://github.com/mhartington", "linkedin": "https://www.linkedin.com/in/mike-hartington-63638362/", "twitter": "https://twitter.com/mhartington", - "bluesky": "http://bsky.app/profile/mhartington.io" - } + "bluesky": "http://bsky.app/profile/mhartington.io", + "email": "mike@ionic.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3puVXAiLCJzbHVnIjoibWlrZS1oYXJ0aW5ndG9uIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.-8fsqbk9CaUPWMFsrt4eu_h_", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszn0L", @@ -1085,8 +1617,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/mhevery", "twitter": "https://twitter.com/mhevery", - "bluesky": "https://bsky.app/profile/misko.dev" - } + "bluesky": "https://bsky.app/profile/misko.dev", + "email": "misko@hevery.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3puMEwiLCJzbHVnIjoibWlza28taGV2ZXJ5IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.Ir8FRpj7zDUNNXoTZhWwPcXx", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "162bab87-d65d-4c20-b625-6ee593ebaa45", @@ -1097,8 +1632,11 @@ const PATCHES = [ "twitter": "https://twitter.com/muhammad_ahsan", "bluesky": "https://bsky.app/profile/codewithahsan.bsky.social", "instagram": "https://instagram.com/code.with.ahsan", - "threads": "https://www.threads.net/@code.with.ahsan" - } + "threads": "https://www.threads.net/@code.with.ahsan", + "email": "ahsan.ubitian@gmail.com" + }, + "portalToken": "eyJpZCI6IjE2MmJhYjg3LWQ2NWQtNGMyMC1iNjI1LTZlZTU5M2ViYWE0NSIsInNsdWciOiJtdWhhbW1hZC1haHNhbi1heWF6IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.mK5tpuCf5DtFMaHETfLTYO9l", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHsznFa", @@ -1108,8 +1646,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/naderdabit/", "twitter": "https://twitter.com/dabit3", "youtube": "https://www.youtube.com/naderdabit", - "bluesky": "https://bsky.app/profile/dabit3.bsky.social" - } + "bluesky": "https://bsky.app/profile/dabit3.bsky.social", + "email": "notify@twitter.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3puRmEiLCJzbHVnIjoibmFkZXItZGFiaXQiLCJleHAiOjE3OTUxOTM5MDA4ODN9.HHtoAoAeOeJsW81RzJDsHXzv", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszml6", @@ -1117,8 +1658,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/Dayhaysoos", "twitter": "https://twitter.com/dayhaysoos", - "bluesky": "https://bsky.app/profile/dayhaysoos.bsky.social" - } + "bluesky": "https://bsky.app/profile/dayhaysoos.bsky.social", + "email": "ndejesus1227@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3ptbDYiLCJzbHVnIjoibmljay1kZWplc3VzIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.agmPDtJ_6HXnOXPwhqUQ-WBQ", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszeyR", @@ -1128,8 +1672,21 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/nickhodges/", "medium": "https://nickhodges.medium.com/", "twitter": "https://twitter.com/nickhodges", - "bluesky": "https://bsky.app/profile/nickhodges.bsky.social" - } + "bluesky": "https://bsky.app/profile/nickhodges.bsky.social", + "email": "nickhodges@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pleVIiLCJzbHVnIjoibmljay1ob2RnZXMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.bVbF_7-ryFpedRif62P3TBF-", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszgWy", + "title": "Nick Rouech", + "socials": { + "linkedin": "https://www.linkedin.com/in/nickrouech/", + "email": "paperlesspost@paperlesspost.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pnV3kiLCJzbHVnIjoibmljay1yb3VlY2giLCJleHAiOjE3OTUxOTM5MDA4ODN9.hu7atAjdaBz8RHLPAqVwhH9z", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "f3ff8de1-9b48-4768-898e-a84cb2efb228", @@ -1145,8 +1702,11 @@ const PATCHES = [ "twitter": "https://twitter.com/nickytonline", "youtube": "https://www.youtube.com/@nickytonline", "bluesky": "https://bsky.app/profile/nickyt.online", - "threads": "https://www.threads.net/@nickytonline" - } + "threads": "https://www.threads.net/@nickytonline", + "email": "nick@nickyt.co" + }, + "portalToken": "eyJpZCI6ImYzZmY4ZGUxLTliNDgtNDc2OC04OThlLWE4NGNiMmVmYjIyOCIsInNsdWciOiJuaWNrLXRheWxvciIsImV4cCI6MTc5NTE5MzkwMDg4M30.4WdlG-117IJYWU5NamVt31ek", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHsziAa", @@ -1156,8 +1716,35 @@ const PATCHES = [ "instagram": "https://www.instagram.com/omed.habib", "linkedin": "https://www.linkedin.com/in/omed/", "twitter": "https://twitter.com/omedhabib", - "threads": "https://www.threads.net/@omed.habib" - } + "threads": "https://www.threads.net/@omed.habib", + "email": "omed@habib.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3ppQWEiLCJzbHVnIjoib21lZC1oYWJpYiIsImV4cCI6MTc5NTE5MzkwMDg4M30.nnPYNFAGiCQNOmWLVi2enBTB", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszjYx", + "title": "Oren Eini", + "socials": { + "facebook": "https://www.facebook.com/profile.php?id=100063550929698", + "github": "https://github.com/ayende", + "linkedin": "https://www.linkedin.com/in/ravendb/", + "twitter": "https://twitter.com/ayende", + "email": "ayende@ayende.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pqWXgiLCJzbHVnIjoib3Jlbi1laW5pIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.REoPPIDKAKYGHuETd5oL0f3h", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszeTx", + "title": "Ovi Negrean", + "socials": { + "linkedin": "https://www.linkedin.com/in/ovidiunegrean/", + "twitter": "https://twitter.com/OviNegrean", + "email": "ovi@socialbee.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3plVHgiLCJzbHVnIjoib3ZpLW5lZ3JlYW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.Zdo0pDfw02oQP0USECNAtMGu", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHsze4Y", @@ -1165,8 +1752,32 @@ const PATCHES = [ "socials": { "github": "https://github.com/paoloricciuti", "twitter": "https://twitter.com/PaoloRicciuti", - "bluesky": "https://bsky.app/profile/paolo.ricciuti.me" - } + "bluesky": "https://bsky.app/profile/paolo.ricciuti.me", + "email": "ricciutipaolo@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3plNFkiLCJzbHVnIjoicGFvbG8tcmljY2l1dGkiLCJleHAiOjE3OTUxOTM5MDA4ODN9.UC5rIO265h6SDwIg2K0CPart", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszejC", + "title": "Pariss Athena", + "socials": { + "twitter": "https://twitter.com/parissathena" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3plakMiLCJzbHVnIjoicGFyaXNzLWF0aGVuYSIsImV4cCI6MTc5NTE5MzkwMDg4M30.-SHL8BBQM4Vmauc6CaC1Pnca", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszdAf", + "title": "Patricio Vargas", + "socials": { + "devto": "https://dev.to/devpato", + "github": "https://github.com/devpato", + "twitter": "https://twitter.com/devpato", + "email": "devpatovg@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pkQWYiLCJzbHVnIjoicGF0cmljaW8tdmFyZ2FzIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.FHPrvQkU9EY3hmavJPGmaoa3", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszdUz", @@ -1176,8 +1787,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/patrick-martin-268a85a/", "medium": "https://medium.com/@pux0r3", "twitter": "https://twitter.com/pux0r3", - "bluesky": "https://bsky.app/profile/pcnmartin.bsky.social" - } + "bluesky": "https://bsky.app/profile/pcnmartin.bsky.social", + "email": "martinpatrick@google.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pkVXoiLCJzbHVnIjoicGF0cmljay1tYXJ0aW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.AZYwYzZ18MnSgqTWdvfkBQDE", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszdkE", @@ -1187,7 +1801,9 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/peduarteltd/?originalSubdomain=es", "twitter": "https://twitter.com/peduarte", "bluesky": "https://bsky.app/profile/ped.ro" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pka0UiLCJzbHVnIjoicGVkcm8tZHVhcnRlIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.Zm5lQHJmXOHPu-TQbwhRWtxa", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszcgB", @@ -1198,8 +1814,11 @@ const PATCHES = [ "mastodon": "https://hachyderm.io/@maxcell", "twitch": "https://www.twitch.tv/maxcellw", "twitter": "https://twitter.com/maxcell", - "bluesky": "https://bsky.app/profile/maxcell.bsky.social" - } + "bluesky": "https://bsky.app/profile/maxcell.bsky.social", + "email": "maxcell.wilson@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pjZ0IiLCJzbHVnIjoicHJpbmNlLXdpbHNvbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.hoLcKEmG12pOZywDiIiSvJ3t", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszcBh", @@ -1207,8 +1826,25 @@ const PATCHES = [ "socials": { "linkedin": "https://www.linkedin.com/in/randalschwartz/", "twitter": "https://twitter.com/RandalSchwartz", - "bluesky": "https://bsky.app/profile/randalschwartz.bsky.social" - } + "bluesky": "https://bsky.app/profile/randalschwartz.bsky.social", + "email": "realmerlyn@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pjQmgiLCJzbHVnIjoicmFuZGFsLXNjaHdhcnR6IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.7OOp47if8z6aA1AWeYyxKnTI", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "69fe600a-1626-442f-8331-3423f3aadacc", + "title": "Raymond Camden", + "socials": { + "codepen": "https://codepen.io/cfjedimaster", + "github": "https://github.com/cfjedimaster", + "linkedin": "https://www.linkedin.com/in/raymondcamden/", + "mastodon": "https://mastodon.social/@raymondcamden", + "youtube": "https://www.youtube.com/user/theraymondcamden", + "email": "raymondcamden@gmail.com" + }, + "portalToken": "eyJpZCI6IjY5ZmU2MDBhLTE2MjYtNDQyZi04MzMxLTM0MjNmM2FhZGFjYyIsInNsdWciOiJyYXltb25kLWNhbWRlbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.GrM7LntbpWI_9aO3DN1vVu69", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszbwS", @@ -1218,8 +1854,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/renancaraujo/", "twitter": "https://twitter.com/reNotANumber", "mastodon": "https://fluttercommunity.social/@renan", - "bluesky": "https://bsky.app/profile/renanminx.bsky.social" - } + "bluesky": "https://bsky.app/profile/renanminx.bsky.social", + "email": "jochum@blue-fire.xyz" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pid1MiLCJzbHVnIjoicmVuYW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.thmk1Hk0WTjWMGeE6mvDUiDJ", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszbRy", @@ -1229,7 +1868,9 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/renebrandel/", "twitter": "https://twitter.com/renebrandel", "bluesky": "https://bsky.app/profile/renebrandel.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3piUnkiLCJzbHVnIjoicmVuZS1icmFuZGVsIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.jfyPCdJkh6h1fd8Yy1Wy6xgX", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszbhD", @@ -1238,8 +1879,25 @@ const PATCHES = [ "github": "https://github.com/Rich-Harris", "linkedin": "https://www.linkedin.com/in/rich-harris/", "twitter": "https://twitter.com/rich_harris", - "bluesky": "https://bsky.app/profile/rich-harris.dev" - } + "bluesky": "https://bsky.app/profile/rich-harris.dev", + "email": "richard.a.harris@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3piaEQiLCJzbHVnIjoicmljaF9oYXJyaXMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.44P_KQgNIeqheOf07blID3vl", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszbCj", + "title": "Richard Bray", + "socials": { + "github": "https://github.com/RichardBray", + "medium": "https://richbray.medium.com/", + "tiktok": "https://www.tiktok.com/@richardoliverbray?lang=en", + "twitter": "https://twitter.com/RichOBray", + "youtube": "https://www.youtube.com/c/RichardBray", + "email": "richardbray89@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3piQ2oiLCJzbHVnIjoicmljaGFyZC1icmF5IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.oEFmKiPH-ZeN_ECWvagqPSFj", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszaNv", @@ -1248,7 +1906,9 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/robsutter/", "twitter": "https://twitter.com/rts_rob", "bluesky": "https://bsky.app/profile/robsutter.dev" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3phTnYiLCJzbHVnIjoicm9iLXN1dHRlciIsImV4cCI6MTc5NTE5MzkwMDg4M30.NSAdl_kKDDsYuF5Bq4D2edYi", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "9fc9b65d-cfa3-4407-9f94-be7eb8cd32be", @@ -1256,8 +1916,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/romanejaquez", "twitter": "https://twitter.com/drcoderz", - "bluesky": "https://bsky.app/profile/romanjaquez.bsky.social" - } + "bluesky": "https://bsky.app/profile/romanjaquez.bsky.social", + "email": "romanejaquez@gmail.com" + }, + "portalToken": "eyJpZCI6IjlmYzliNjVkLWNmYTMtNDQwNy05Zjk0LWJlN2ViOGNkMzJiZSIsInNsdWciOiJyb21hbi1qYXF1ZXoiLCJleHAiOjE3OTUxOTM5MDA4ODN9.zwOOUvySAfotGOEmtAjwqah3", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszaiF", @@ -1267,7 +1930,9 @@ const PATCHES = [ "github": "https://github.com/ryansolid", "twitter": "https://twitter.com/RyanCarniato", "bluesky": "https://bsky.app/profile/ryansolid.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3phaUYiLCJzbHVnIjoicnlhbi1jYXJuaWF0byIsImV4cCI6MTc5NTE5MzkwMDg4M30.UEbJcbJm1pDrcik_xQngghAy", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszYkJ", @@ -1278,7 +1943,9 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/whitep4nth3r", "twitter": "https://twitter.com/whitep4nth3r", "bluesky": "https://bsky.app/profile/whitep4nth3r.com" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pZa0oiLCJzbHVnIjoic2FsbWEtYWxhbS1uYXlsb3IiLCJleHAiOjE3OTUxOTM5MDA4ODN9.mmLvDXeaOm2T2WHGbnL3M3s4", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszVnP", @@ -1287,8 +1954,22 @@ const PATCHES = [ "github": "https://github.com/calcsam", "linkedin": "https://www.linkedin.com/in/sambhagwat/", "twitter": "https://twitter.com/calcsam", - "bluesky": "https://bsky.app/profile/calcsam.bsky.social" - } + "bluesky": "https://bsky.app/profile/calcsam.bsky.social", + "email": "calcsam@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pWblAiLCJzbHVnIjoic2FtLWJoYWd3YXQiLCJleHAiOjE3OTUxOTM5MDA4ODN9.tb7Rw160IhUgJG_huKU0ykoK", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "7146388d-9566-40d9-bf71-c21da61dc133", + "title": "Sam Kim", + "socials": { + "github": "https://github.com/samkim", + "linkedin": "https://www.linkedin.com/in/samskim/", + "email": "sam@authzed.com" + }, + "portalToken": "eyJpZCI6IjcxNDYzODhkLTk1NjYtNDBkOS1iZjcxLWMyMWRhNjFkYzEzMyIsInNsdWciOiJzYW0ta2ltIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.nkvUWe75tpC-Jy81zHhm-jgO", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszVT5", @@ -1297,16 +1978,45 @@ const PATCHES = [ "github": "https://github.com/samlfair", "linkedin": "https://www.linkedin.com/in/samlittlefair/?originalSubdomain=ca", "twitter": "https://twitter.com/samlfair", - "bluesky": "https://bsky.app/profile/littlefair.ca" - } + "bluesky": "https://bsky.app/profile/littlefair.ca", + "email": "sam.littlefair@prismic.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pWVDUiLCJzbHVnIjoic2FtLWxpdHRsZWZhaXIiLCJleHAiOjE3OTUxOTM5MDA4ODN9.lA1NSCrZiEYOHbpG35IYkI0-", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszVDq", + "title": "Sarah Kapehe", + "socials": { + "github": "https://github.com/kapehe-ok", + "linkedin": "https://www.linkedin.com/in/kapehe/", + "twitter": "https://twitter.com/kapehe_ok", + "youtube": "https://www.youtube.com/c/betterdevs" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pWRHEiLCJzbHVnIjoic2FyYWgta2FwZWhlIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.oTdbwyWNdEuWbQ8Cf23SjzDi", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "ad09a6a8-84e1-49ea-b5ab-18e2bb1247b8", "title": "Saron Yitbarek", "socials": { "twitter": "https://twitter.com/saronyitbarek", - "bluesky": "https://bsky.app/profile/saron.bsky.social" - } + "bluesky": "https://bsky.app/profile/saron.bsky.social", + "email": "saron.yitbarek@gmail.com" + }, + "portalToken": "eyJpZCI6ImFkMDlhNmE4LTg0ZTEtNDllYS1iNWFiLTE4ZTJiYjEyNDdiOCIsInNsdWciOiJzYXJvbi15aXRiYXJlayIsImV4cCI6MTc5NTE5MzkwMDg4M30.wMBYfhw19QV7tRBvSuoGKRfi", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "0a915c5b-1da4-460d-b966-61bc18356131", + "title": "Sathiesh Veera", + "socials": { + "github": "https://github.com/Sathyvs", + "linkedin": "https://www.linkedin.com/in/sathieshveera/", + "email": "sathieshkumar.v.s@gmail.com" + }, + "portalToken": "eyJpZCI6IjBhOTE1YzViLTFkYTQtNDYwZC1iOTY2LTYxYmMxODM1NjEzMSIsInNsdWciOiJzYXRoaWVzaC12ZWVyYSIsImV4cCI6MTc5NTE5MzkwMDg4M30.qPjQSfyVECykpeK0KG6M41yB", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "0ccc6e7b-24b9-4e13-87dc-ca95d86c2298", @@ -1315,8 +2025,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/scott-rees-3800a814/", "mastodon": "https://hachyderm.io/@hbuchel", "twitter": "https://x.com/reesscot?lang=en", - "bluesky": "https://bsky.app/profile/scott-rees.bsky.social" - } + "bluesky": "https://bsky.app/profile/scott-rees.bsky.social", + "email": "reesscot@amazon.com" + }, + "portalToken": "eyJpZCI6IjBjY2M2ZTdiLTI0YjktNGUxMy04N2RjLWNhOTVkODZjMjI5OCIsInNsdWciOiJzY290dC1yZWVzIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.OPdfNdaWXvHAEoAJXkT4kAKc", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszUyb", @@ -1324,8 +2037,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/spences10", "twitter": "https://twitter.com/spences10", - "bluesky": "https://bsky.app/profile/scottspence.dev" - } + "bluesky": "https://bsky.app/profile/scottspence.dev", + "email": "brittney@ajonp.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pVeWIiLCJzbHVnIjoic2NvdHQtc3BlbmNlIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.qURCz2GQbU-5X5lP4p378BpT", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszcQw", @@ -1335,8 +2051,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/stolinski/", "twitter": "https://twitter.com/stolinski", "youtube": "https://www.youtube.com/c/leveluptuts", - "bluesky": "https://bsky.app/profile/tolin.ski" - } + "bluesky": "https://bsky.app/profile/tolin.ski", + "email": "scott.tolinski@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pjUXciLCJzbHVnIjoic2NvdHQtdG9saW5za2kiLCJleHAiOjE3OTUxOTM5MDA4ODN9.MOxgsTHFuWfjhkeCEctxjHG8", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszUjM", @@ -1346,7 +2065,9 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/seanf/", "twitter": "https://twitter.com/seanfalconer", "bluesky": "https://bsky.app/profile/seanfalconer.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pVak0iLCJzbHVnIjoic2Vhbi1mYWxjb25lciIsImV4cCI6MTc5NTE5MzkwMDg4M30.34xW3oYX7eAk8kEu13mLmpJr", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszUU7", @@ -1355,8 +2076,24 @@ const PATCHES = [ "github": "https://github.com/shairez", "twitter": "https://twitter.com/shai_reznik", "youtube": "https://www.youtube.com/user/hirezio", - "bluesky": "https://bsky.app/profile/shairez.bsky.social" - } + "bluesky": "https://bsky.app/profile/shairez.bsky.social", + "email": "shai@hirez.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pVVTciLCJzbHVnIjoic2hhaS1yZXpuaWsiLCJleHAiOjE3OTUxOTM5MDA4ODN9._Ncy7TlcWEfUG_yVmZqeGtk4", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHszSva", + "title": "Shawn Wang (swyx)", + "socials": { + "github": "https://github.com/swyxio", + "linkedin": "https://www.linkedin.com/in/shawnswyxwang/", + "stackoverflow": "https://stackoverflow.com/users/1106414/swyx", + "twitter": "https://twitter.com/swyx", + "youtube": "https://www.youtube.com/swyxTV" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pTdmEiLCJzbHVnIjoic3d5eCIsImV4cCI6MTc5NTE5MzkwMDg4M30.cfYQGWiXjefu17_saRx8Z1XC", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszUEs", @@ -1365,8 +2102,11 @@ const PATCHES = [ "github": "https://github.com/shivaylamba", "mastodon": "https://mastodon.social/@shivaylamba", "twitter": "https://twitter.com/howdevelop", - "bluesky": "https://bsky.app/profile/shivaylamba.bsky.social" - } + "bluesky": "https://bsky.app/profile/shivaylamba.bsky.social", + "email": "shivaylamba@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pVRXMiLCJzbHVnIjoic2hpdmF5LWxhbWJhIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.VDfPnS5niXakeKOZoTWGkL1x", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszTkO", @@ -1379,16 +2119,22 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/simongr/", "instagram": "https://www.instagram.com/simongrimm_/", "bluesky": "https://bsky.app/profile/galaxies.dev", - "threads": "https://www.threads.net/@simongrimm_" - } + "threads": "https://www.threads.net/@simongrimm_", + "email": "simon@galaxies.dev" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pUa08iLCJzbHVnIjoic2ltb24tZ3JpbW0iLCJleHAiOjE3OTUxOTM5MDA4ODN9.APEfVR1Na_gCs90nR4zh93mA", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszTV9", "title": "Stefan Kingham", "socials": { "twitter": "https://twitter.com/stefankingham", - "bluesky": "https://bsky.app/profile/stefankingham.bsky.social" - } + "bluesky": "https://bsky.app/profile/stefankingham.bsky.social", + "email": "stefankingham@offerzen.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pUVjkiLCJzbHVnIjoic3RlZmFuLWtpbmdoYW0iLCJleHAiOjE3OTUxOTM5MDA4ODN9.QYI2cvZ3llZmDYM1q1ndAI9N", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszTAp", @@ -1399,8 +2145,22 @@ const PATCHES = [ "tiktok": "https://www.tiktok.com/@steve8708", "twitter": "https://twitter.com/Steve8708", "youtube": "https://www.youtube.com/@Builderio", - "bluesky": "https://bsky.app/profile/steve8708.bsky.social" - } + "bluesky": "https://bsky.app/profile/steve8708.bsky.social", + "email": "steve@builder.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pUQXAiLCJzbHVnIjoic3RldmUtc2V3ZWxsIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.pjzVHntJ3IGpF5YBpge24mp-", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "dfa8f1c2-1fef-4556-b061-2ea0422ec537", + "title": "Tamas Piros", + "socials": { + "twitter": "https://x.com/tpiros", + "youtube": "https://www.youtube.com/@WebDevFrontiers", + "email": "tamas@cloudinary.com" + }, + "portalToken": "eyJpZCI6ImRmYThmMWMyLTFmZWYtNDU1Ni1iMDYxLTJlYTA0MjJlYzUzNyIsInNsdWciOiJ0YW1hcy1waXJvcyIsImV4cCI6MTc5NTE5MzkwMDg4M30.kjnolYkXWseotQmNNtNIF6NB", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszSgL", @@ -1413,8 +2173,11 @@ const PATCHES = [ "twitter": "https://x.com/tdesseyn", "youtube": "https://youtube.com/channel/UCNqJ-P5d9RUCUsQ-grhlUHw", "bluesky": "https://bsky.app/profile/tdesseyn.bsky.social", - "threads": "https://www.threads.net/@tdesseyn" - } + "threads": "https://www.threads.net/@tdesseyn", + "email": "taylordesseyn@gun.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pTZ0wiLCJzbHVnIjoidGF5bG9yLWRlc3NleW4iLCJleHAiOjE3OTUxOTM5MDA4ODN9.m6esDkL0wIqZAlCejfjS9Um2", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszSR6", @@ -1422,8 +2185,11 @@ const PATCHES = [ "socials": { "linkedin": "https://www.linkedin.com/in/tessamero/", "twitter": "https://twitter.com/TessaMero", - "bluesky": "https://bsky.app/profile/tessamero.bsky.social" - } + "bluesky": "https://bsky.app/profile/tessamero.bsky.social", + "email": "tessa@appwrite.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pTUjYiLCJzbHVnIjoidGVzc2EtbWVybyIsImV4cCI6MTc5NTE5MzkwMDg4M30.4-GoE6PnZlzBsPSwqgCe-xea", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszSBr", @@ -1432,8 +2198,11 @@ const PATCHES = [ "github": "https://github.com/TGlide", "twitter": "https://twitter.com/thomasglopes", "bluesky": "https://bsky.app/profile/thomasglopes.com", - "linkedin": "https://www.linkedin.com/in/thomas-gl/" - } + "linkedin": "https://www.linkedin.com/in/thomas-gl/", + "email": "thomasgl@pm.me" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pTQnIiLCJzbHVnIjoidGhvbWFzLWctbG9wZXMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.8utu5caHZPrG3pDzEAmwr_lg", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "c04bf8ca-ecba-4ab9-9a6b-7e5002291277", @@ -1443,8 +2212,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/tomjohnson3/", "twitter": "https://x.com/tomjohnson3", "bluesky": "https://bsky.app/profile/multiplayer.app", - "threads": "https://www.threads.net/@trymultiplayer" - } + "threads": "https://www.threads.net/@trymultiplayer", + "email": "tom@multiplayer.app" + }, + "portalToken": "eyJpZCI6ImMwNGJmOGNhLWVjYmEtNGFiOS05YTZiLTdlNTAwMjI5MTI3NyIsInNsdWciOiJ0aG9tYXMtam9obnNvbiIsImV4cCI6MTc5NTE5MzkwMDg4M30.6KELuF9cqPUChWwplFyXHF28", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszRrX", @@ -1453,8 +2225,11 @@ const PATCHES = [ "github": "https://github.com/timbenniks", "linkedin": "https://www.linkedin.com/in/timbenniks/", "twitter": "https://twitter.com/timbenniks", - "bluesky": "https://bsky.app/profile/timbenniks.dev" - } + "bluesky": "https://bsky.app/profile/timbenniks.dev", + "email": "tbenniks@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pSclgiLCJzbHVnIjoidGltLWJlbm5pa3MiLCJleHAiOjE3OTUxOTM5MDA4ODN9.hCocHVf4qZiSYQc1exfp8o-G", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszRcI", @@ -1463,8 +2238,11 @@ const PATCHES = [ "github": "https://github.com/timneutkens", "linkedin": "https://www.linkedin.com/in/tim-neutkens-5a6733168/", "twitter": "https://twitter.com/timneutkens", - "bluesky": "https://bsky.app/profile/timneutkens.bsky.social" - } + "bluesky": "https://bsky.app/profile/timneutkens.bsky.social", + "email": "lee@vercel.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pSY0kiLCJzbHVnIjoidGltLW5ldXRrZW5zIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.Nw7sXo3vgSU9-IMmKrs8rvOc", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "35aedae9-ff20-4ac0-8310-52b04fa3e444", @@ -1473,8 +2251,11 @@ const PATCHES = [ "twitter": "https://x.com/TobinSouth", "linkedin": "https://www.linkedin.com/in/tobinsouth/", "github": "https://github.com/tobinsouth", - "bluesky": "https://bsky.app/profile/tobinsouth.com" - } + "bluesky": "https://bsky.app/profile/tobinsouth.com", + "email": "tobin.south@gmail.com" + }, + "portalToken": "eyJpZCI6IjM1YWVkYWU5LWZmMjAtNGFjMC04MzEwLTUyYjA0ZmEzZTQ0NCIsInNsdWciOiJ0b2Jpbi1zb3V0aCIsImV4cCI6MTc5NTE5MzkwMDg4M30.5wjyJI3-uIPVzvV87HQ-E8gv", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszRCt", @@ -1483,8 +2264,11 @@ const PATCHES = [ "github": "https://github.com/mojombo", "linkedin": "https://www.linkedin.com/in/mojombo/", "twitter": "https://twitter.com/mojombo", - "bluesky": "https://bsky.app/profile/mojombo.bsky.social" - } + "bluesky": "https://bsky.app/profile/mojombo.bsky.social", + "email": "tom@mojombo.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pSQ3QiLCJzbHVnIjoidG9tLXByZXN0b24td2VybmVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.8Pi7b6eHsOH871jFlTAywJSH", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszPUC", @@ -1493,8 +2277,21 @@ const PATCHES = [ "github": "https://github.com/sulco", "linkedin": "https://www.linkedin.com/in/tsulkowski/", "twitter": "https://twitter.com/sulco", - "bluesky": "https://bsky.app/profile/sulco.dev" - } + "bluesky": "https://bsky.app/profile/sulco.dev", + "email": "notify@twitter.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pQVUMiLCJzbHVnIjoidG9tZWstc3Vsa293c2tpIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.bOsD2ULgpaN_IGGE9NW9D_zq", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "6a4a7c7c-a288-4acd-b980-8849c360b2df", + "title": "Tyler Crowe", + "socials": { + "linkedin": "https://www.linkedin.com/in/tylersuncrowe/", + "email": "gesly@google.com" + }, + "portalToken": "eyJpZCI6IjZhNGE3YzdjLWEyODgtNGFjZC1iOTgwLTg4NDljMzYwYjJkZiIsInNsdWciOiJ0eWxlci1jcm93ZSIsImV4cCI6MTc5NTE5MzkwMDg4M30.QGQr8FNz0ARyhwmS-hNuPLiG", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszP4n", @@ -1505,8 +2302,11 @@ const PATCHES = [ "twitch": "https://www.twitch.tv/elpunish3rr/", "twitter": "https://twitter.com/tylermcginnis", "youtube": "https://www.youtube.com/acekyd", - "bluesky": "https://bsky.app/profile/tyler.ui.dev" - } + "bluesky": "https://bsky.app/profile/tyler.ui.dev", + "email": "tyler@ui.dev" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pQNG4iLCJzbHVnIjoidHlsZXItbWNnaW5uaXMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.7teYxn5_KA0DXYX63E1mT4Re", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszOfO", @@ -1517,8 +2317,11 @@ const PATCHES = [ "bluesky": "https://bsky.app/profile/una.im", "mastodon": "https://front-end.social/@una", "tiktok": "https://tiktok.com/@unacode", - "linkedin": "https://www.linkedin.com/in/unakravets" - } + "linkedin": "https://www.linkedin.com/in/unakravets", + "email": "una.kravets@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pPZk8iLCJzbHVnIjoidW5hLWtyYXZldHMiLCJleHAiOjE3OTUxOTM5MDA4ODN9.iCPH0fyeMXjHzw0V8sMB4PQ_", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszN1m", @@ -1531,8 +2334,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/vagish/", "mastodon": "https://ruby.social/@vagish", "bluesky": "https://bsky.app/profile/vagish.bsky.social", - "threads": "https://www.threads.net/@vagish" - } + "threads": "https://www.threads.net/@vagish", + "email": "vagish@vtaku.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pOMW0iLCJzbHVnIjoidmFnaXNoLXZlbGEiLCJleHAiOjE3OTUxOTM5MDA4ODN9.P4JrT5VtNIpITKvLjcoGBewO", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "0d5cd71e-5b13-4dc2-8b7f-f1ce0a1ed5b1", @@ -1542,7 +2348,9 @@ const PATCHES = [ "twitter": "https://x.com/WenYuGe1", "youtube": "https://www.youtube.com/@umamicomplex6841", "bluesky": "https://bsky.app/profile/gewenyu99.bsky.social" - } + }, + "portalToken": "eyJpZCI6IjBkNWNkNzFlLTViMTMtNGRjMi04YjdmLWYxY2UwYTFlZDViMSIsInNsdWciOiJ2aW5jZW50LXdlbi15dS1nZSIsImV4cCI6MTc5NTE5MzkwMDg4M30.XQHfnihFmtX14Amuhesf1ubb", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszMhS", @@ -1550,8 +2358,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/subpic", "linkedin": "https://www.linkedin.com/in/vladhosu/", - "bluesky": "https://bsky.app/profile/vlad.socialbee.com" - } + "bluesky": "https://bsky.app/profile/vlad.socialbee.com", + "email": "vlad.hosu@uni-konstanz.de" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pNaFMiLCJzbHVnIjoidmxhZC1ob3N1IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.AlTieo_jKleIBRAtnsEqUtQy", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszMN8", @@ -1559,8 +2370,11 @@ const PATCHES = [ "socials": { "github": "https://github.com/whummer/", "twitter": "https://twitter.com/w_hummer", - "bluesky": "https://bsky.app/profile/whummer.bsky.social" - } + "bluesky": "https://bsky.app/profile/whummer.bsky.social", + "email": "waldemar.hummer@localstack.cloud" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pNTjgiLCJzbHVnIjoid2FsZGVtYXItaHVtbWVyIiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.wd9UmjTt6IRSk35gllav0lRh", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszM2o", @@ -1572,8 +2386,11 @@ const PATCHES = [ "mastodon": "https://tiktok.com/@wesbos", "instagram": "https://instagram.com/@wesbos", "bluesky": "https://bsky.app/profile/wesbos.com", - "threads": "https://www.threads.net/@wesbos" - } + "threads": "https://www.threads.net/@wesbos", + "email": "wes@wesbos.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pNMm8iLCJzbHVnIjoid2VzLWJvcyIsImV4cCI6MTc5NTE5MzkwMDg4M30.p56yOmK0oXfBPCUQouC3UtvK", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszLiU", @@ -1583,7 +2400,9 @@ const PATCHES = [ "twitter": "https://twitter.com/onlyspaceghost", "bluesky": "https://bsky.app/profile/willow.sh", "mastodon": "https://fosstodon.org/@onlyspaceghost" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pMaVUiLCJzbHVnIjoid2lsbG93IiwiZXhwIjoxNzk1MTkzOTAwODgzfQ.O_gP1vG28eC0wswdi6wey5-G", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszLOA", @@ -1593,8 +2412,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/zackderose/", "twitter": "https://twitter.com/zackderose", "youtube": "https://www.youtube.com/c/ZackDeRoseDev", - "bluesky": "https://bsky.app/profile/zackderose.bsky.social" - } + "bluesky": "https://bsky.app/profile/zackderose.bsky.social", + "email": "zack.derose@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pMT0EiLCJzbHVnIjoiemFjay1kZXJvc2UiLCJleHAiOjE3OTUxOTM5MDA4ODN9.AY1OuIM1A_DXIJgJAiaYeToR", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszL3q", @@ -1602,7 +2424,9 @@ const PATCHES = [ "socials": { "linkedin": "https://www.linkedin.com/in/zo%C3%AB-wilson-45b8a7b7/", "bluesky": "https://bsky.app/profile/zoelwilson.bsky.social" - } + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pMM3EiLCJzbHVnIjoiem9lLXdpbHNvbiIsImV4cCI6MTc5NTE5MzkwMDg4M30._6Cm4gPsUIDHtiy47zGlt5Fg", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszoyH", @@ -1612,8 +2436,11 @@ const PATCHES = [ "linkedin": "https://www.linkedin.com/in/m4d-z/", "twitch": "https://www.twitch.tv/m4dz_devrel/", "twitter": "https://twitter.com/m4d_z", - "bluesky": "https://bsky.app/profile/madz258.wetdry.world.ap.brid.gy" - } + "bluesky": "https://bsky.app/profile/madz258.wetdry.world.ap.brid.gy", + "email": "code@m4dz.net" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pveUgiLCJzbHVnIjoibTRkeiIsImV4cCI6MTc5NTE5MzkwMDg4M30.e6YH04QjqkTHWTpDWD9PvaA-", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" }, { "_id": "RIgC5r4TJ0hCGOzxHszcvQ", @@ -1621,8 +2448,22 @@ const PATCHES = [ "socials": { "github": "https://github.com/pngwn", "twitter": "https://twitter.com/evilpingwin", - "bluesky": "https://bsky.app/profile/pngwn.at" - } + "bluesky": "https://bsky.app/profile/pngwn.at", + "email": "hello@pngwn.io" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIc3pjdlEiLCJzbHVnIjoicG5nd24iLCJleHAiOjE3OTUxOTM5MDA4ODN9.319aumPGIe2gV4R5cGlEqWEg", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" + }, + { + "_id": "RIgC5r4TJ0hCGOzxHt4bCo", + "title": "รngel Sola Orbaiceta", + "socials": { + "github": "https://github.com/asoglovo", + "linkedin": "https://www.linkedin.com/in/angelsolaorbaiceta/?originalSubdomain=es", + "email": "angelsolaorbaiceta@gmail.com" + }, + "portalToken": "eyJpZCI6IlJJZ0M1cjRUSjBoQ0dPenhIdDRiQ28iLCJzbHVnIjoiYW5nZWwtc29sYS1vcmJhaWNldGEiLCJleHAiOjE3OTUxOTM5MDA4ODN9.UM7kuWZR4gNbyARCbIfOgey0", + "portalTokenExpiresAt": "2026-11-20T16:58:20.883Z" } ]; @@ -1636,6 +2477,8 @@ async function main() { id: p._id, set: { socials: p.socials, + portalToken: p.portalToken, + portalTokenExpiresAt: p.portalTokenExpiresAt, }, }, })); @@ -1653,7 +2496,7 @@ async function main() { console.warn(`[sync-guest-socials] HTTP ${res.status}: ${text}`); return; } - console.log(`โœ” Synced enriched socials for ${PATCHES.length} guests into Sanity (${PROJECT_ID}/${DATASET})`); + console.log(`โœ” Synced enriched socials + portalToken for ${PATCHES.length} guests into Sanity (${PROJECT_ID}/${DATASET})`); } main().catch((err) => console.error(err));