diff --git a/next-14/next.config.mjs b/next-14/next.config.mjs index 1d61478..4e8ac0b 100644 --- a/next-14/next.config.mjs +++ b/next-14/next.config.mjs @@ -1,4 +1,10 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + logging: { + fetches: { + fullUrl: true, + }, + }, +} export default nextConfig diff --git a/next-14/package.json b/next-14/package.json index 0fb8b64..ac67109 100644 --- a/next-14/package.json +++ b/next-14/package.json @@ -6,14 +6,16 @@ "build": "next build", "dev": "next dev", "lint": "next lint", - "start": "next start" + "start": "next start", + "typegen:generate": "sanity typegen generate" }, "dependencies": { "@sanity/client": "^6.22.5", "groq": "^3.64.2", "next": "14.2.18", "react": "^18", - "react-dom": "^18" + "react-dom": "^18", + "use-effect-event": "^1.0.2" }, "devDependencies": { "@types/node": "^20", diff --git a/next-14/sanity-typegen.json b/next-14/sanity-typegen.json new file mode 100644 index 0000000..9cc38d4 --- /dev/null +++ b/next-14/sanity-typegen.json @@ -0,0 +1,3 @@ +{ + "schema": "../studio/schema.json" +} diff --git a/next-14/sanity.types.ts b/next-14/sanity.types.ts new file mode 100644 index 0000000..4592747 --- /dev/null +++ b/next-14/sanity.types.ts @@ -0,0 +1,168 @@ +/** + * --------------------------------------------------------------------------------- + * This file has been generated by Sanity TypeGen. + * Command: `sanity typegen generate` + * + * Any modifications made directly to this file will be overwritten the next time + * the TypeScript definitions are generated. Please make changes to the Sanity + * schema definitions and/or GROQ queries if you need to update these types. + * + * For more information on how to use Sanity TypeGen, visit the official documentation: + * https://www.sanity.io/docs/sanity-typegen + * --------------------------------------------------------------------------------- + */ + +// Source: schema.json +export type SanityImagePaletteSwatch = { + _type: 'sanity.imagePaletteSwatch' + background?: string + foreground?: string + population?: number + title?: string +} + +export type SanityImagePalette = { + _type: 'sanity.imagePalette' + darkMuted?: SanityImagePaletteSwatch + lightVibrant?: SanityImagePaletteSwatch + darkVibrant?: SanityImagePaletteSwatch + vibrant?: SanityImagePaletteSwatch + dominant?: SanityImagePaletteSwatch + lightMuted?: SanityImagePaletteSwatch + muted?: SanityImagePaletteSwatch +} + +export type SanityImageDimensions = { + _type: 'sanity.imageDimensions' + height?: number + width?: number + aspectRatio?: number +} + +export type SanityImageHotspot = { + _type: 'sanity.imageHotspot' + x?: number + y?: number + height?: number + width?: number +} + +export type SanityImageCrop = { + _type: 'sanity.imageCrop' + top?: number + bottom?: number + left?: number + right?: number +} + +export type SanityFileAsset = { + _id: string + _type: 'sanity.fileAsset' + _createdAt: string + _updatedAt: string + _rev: string + originalFilename?: string + label?: string + title?: string + description?: string + altText?: string + sha1hash?: string + extension?: string + mimeType?: string + size?: number + assetId?: string + uploadId?: string + path?: string + url?: string + source?: SanityAssetSourceData +} + +export type SanityImageAsset = { + _id: string + _type: 'sanity.imageAsset' + _createdAt: string + _updatedAt: string + _rev: string + originalFilename?: string + label?: string + title?: string + description?: string + altText?: string + sha1hash?: string + extension?: string + mimeType?: string + size?: number + assetId?: string + uploadId?: string + path?: string + url?: string + metadata?: SanityImageMetadata + source?: SanityAssetSourceData +} + +export type SanityImageMetadata = { + _type: 'sanity.imageMetadata' + location?: Geopoint + dimensions?: SanityImageDimensions + palette?: SanityImagePalette + lqip?: string + blurHash?: string + hasAlpha?: boolean + isOpaque?: boolean +} + +export type Geopoint = { + _type: 'geopoint' + lat?: number + lng?: number + alt?: number +} + +export type SanityAssetSourceData = { + _type: 'sanity.assetSourceData' + name?: string + id?: string + url?: string +} + +export type Demo = { + _id: string + _type: 'demo' + _createdAt: string + _updatedAt: string + _rev: string + title?: string + slug?: Slug +} + +export type Slug = { + _type: 'slug' + current?: string + source?: string +} + +export type Theme = { + _id: string + _type: 'theme' + _createdAt: string + _updatedAt: string + _rev: string + background?: string + text?: string +} + +export type AllSanitySchemaTypes = + | SanityImagePaletteSwatch + | SanityImagePalette + | SanityImageDimensions + | SanityImageHotspot + | SanityImageCrop + | SanityFileAsset + | SanityImageAsset + | SanityImageMetadata + | Geopoint + | SanityAssetSourceData + | Demo + | Slug + | Theme +export declare const internalGroqTypeReferenceTo: unique symbol diff --git a/next-15/next.config.ts b/next-15/next.config.ts index 7985333..3107703 100644 --- a/next-15/next.config.ts +++ b/next-15/next.config.ts @@ -1,7 +1,11 @@ import type {NextConfig} from 'next' const nextConfig: NextConfig = { - /* config options here */ + logging: { + fetches: { + fullUrl: true, + }, + }, } export default nextConfig diff --git a/next-15/package.json b/next-15/package.json index 8b3ab17..0f568bd 100644 --- a/next-15/package.json +++ b/next-15/package.json @@ -6,14 +6,16 @@ "build": "next build", "dev": "next dev --turbopack", "lint": "next lint", - "start": "next start" + "start": "next start", + "typegen:generate": "sanity typegen generate" }, "dependencies": { "@sanity/client": "^6.22.5", "groq": "^3.64.2", "next": "15.0.3", "react": "rc", - "react-dom": "rc" + "react-dom": "rc", + "use-effect-event": "^1.0.2" }, "devDependencies": { "@types/node": "^20", diff --git a/next-15/sanity-typegen.json b/next-15/sanity-typegen.json new file mode 100644 index 0000000..9cc38d4 --- /dev/null +++ b/next-15/sanity-typegen.json @@ -0,0 +1,3 @@ +{ + "schema": "../studio/schema.json" +} diff --git a/next-15/sanity.types.ts b/next-15/sanity.types.ts new file mode 100644 index 0000000..42c72e4 --- /dev/null +++ b/next-15/sanity.types.ts @@ -0,0 +1,201 @@ +// Query TypeMap +import '@sanity/client' + +/** + * --------------------------------------------------------------------------------- + * This file has been generated by Sanity TypeGen. + * Command: `sanity typegen generate` + * + * Any modifications made directly to this file will be overwritten the next time + * the TypeScript definitions are generated. Please make changes to the Sanity + * schema definitions and/or GROQ queries if you need to update these types. + * + * For more information on how to use Sanity TypeGen, visit the official documentation: + * https://www.sanity.io/docs/sanity-typegen + * --------------------------------------------------------------------------------- + */ + +// Source: schema.json +export type SanityImagePaletteSwatch = { + _type: 'sanity.imagePaletteSwatch' + background?: string + foreground?: string + population?: number + title?: string +} + +export type SanityImagePalette = { + _type: 'sanity.imagePalette' + darkMuted?: SanityImagePaletteSwatch + lightVibrant?: SanityImagePaletteSwatch + darkVibrant?: SanityImagePaletteSwatch + vibrant?: SanityImagePaletteSwatch + dominant?: SanityImagePaletteSwatch + lightMuted?: SanityImagePaletteSwatch + muted?: SanityImagePaletteSwatch +} + +export type SanityImageDimensions = { + _type: 'sanity.imageDimensions' + height?: number + width?: number + aspectRatio?: number +} + +export type SanityImageHotspot = { + _type: 'sanity.imageHotspot' + x?: number + y?: number + height?: number + width?: number +} + +export type SanityImageCrop = { + _type: 'sanity.imageCrop' + top?: number + bottom?: number + left?: number + right?: number +} + +export type SanityFileAsset = { + _id: string + _type: 'sanity.fileAsset' + _createdAt: string + _updatedAt: string + _rev: string + originalFilename?: string + label?: string + title?: string + description?: string + altText?: string + sha1hash?: string + extension?: string + mimeType?: string + size?: number + assetId?: string + uploadId?: string + path?: string + url?: string + source?: SanityAssetSourceData +} + +export type SanityImageAsset = { + _id: string + _type: 'sanity.imageAsset' + _createdAt: string + _updatedAt: string + _rev: string + originalFilename?: string + label?: string + title?: string + description?: string + altText?: string + sha1hash?: string + extension?: string + mimeType?: string + size?: number + assetId?: string + uploadId?: string + path?: string + url?: string + metadata?: SanityImageMetadata + source?: SanityAssetSourceData +} + +export type SanityImageMetadata = { + _type: 'sanity.imageMetadata' + location?: Geopoint + dimensions?: SanityImageDimensions + palette?: SanityImagePalette + lqip?: string + blurHash?: string + hasAlpha?: boolean + isOpaque?: boolean +} + +export type Geopoint = { + _type: 'geopoint' + lat?: number + lng?: number + alt?: number +} + +export type SanityAssetSourceData = { + _type: 'sanity.assetSourceData' + name?: string + id?: string + url?: string +} + +export type Demo = { + _id: string + _type: 'demo' + _createdAt: string + _updatedAt: string + _rev: string + title?: string + slug?: Slug +} + +export type Slug = { + _type: 'slug' + current?: string + source?: string +} + +export type Theme = { + _id: string + _type: 'theme' + _createdAt: string + _updatedAt: string + _rev: string + background?: string + text?: string +} + +export type AllSanitySchemaTypes = + | SanityImagePaletteSwatch + | SanityImagePalette + | SanityImageDimensions + | SanityImageHotspot + | SanityImageCrop + | SanityFileAsset + | SanityImageAsset + | SanityImageMetadata + | Geopoint + | SanityAssetSourceData + | Demo + | Slug + | Theme +export declare const internalGroqTypeReferenceTo: unique symbol +// Source: ./src/app/layout.tsx +// Variable: THEME_QUERY +// Query: *[_id == "theme"][0]{background,text,"fetchedAt": dateTime(now())} +export type THEME_QUERYResult = + | { + background: null + text: null + fetchedAt: string | null + } + | { + background: string | null + text: string | null + fetchedAt: string | null + } + | null + +// Source: ./src/app/page.tsx +// Variable: DEMO_QUERY +// Query: *[_type == "demo" && slug.current == $slug][0]{title,"fetchedAt": dateTime(now())} +export type DEMO_QUERYResult = { + title: string | null + fetchedAt: string | null +} | null + +declare module '@sanity/client' { + interface SanityQueries { + '*[_id == "theme"][0]{background,text,"fetchedAt": dateTime(now())}': THEME_QUERYResult + '*[_type == "demo" && slug.current == $slug][0]{title,"fetchedAt": dateTime(now())}': DEMO_QUERYResult + } +} diff --git a/next-15/src/app/SanityLive.tsx b/next-15/src/app/SanityLive.tsx new file mode 100644 index 0000000..c563d8f --- /dev/null +++ b/next-15/src/app/SanityLive.tsx @@ -0,0 +1,48 @@ +'use client' + +import {client} from '@/sanity/client' +import type {LiveEventMessage, LiveEventRestart, LiveEventWelcome} from '@sanity/client' +import {CorsOriginError} from '@sanity/client' +import {useRouter} from 'next/navigation' +import {useEffect} from 'react' +import {useEffectEvent} from 'use-effect-event' +import {expireTags} from './actions' + +export function SanityLive() { + const router = useRouter() + + const handleLiveEvent = useEffectEvent( + (event: LiveEventMessage | LiveEventRestart | LiveEventWelcome) => { + if (event.type === 'welcome') { + console.info('Sanity is live with automatic revalidation of published content') + } else if (event.type === 'message') { + expireTags(event.tags) + } else if (event.type === 'restart') { + router.refresh() + } + }, + ) + useEffect(() => { + const subscription = client.live.events().subscribe({ + next: (event) => { + if (event.type === 'message' || event.type === 'restart' || event.type === 'welcome') { + handleLiveEvent(event) + } + }, + error: (error: unknown) => { + if (error instanceof CorsOriginError) { + console.warn( + `Sanity Live is unable to connect to the Sanity API as the current origin - ${window.origin} - is not in the list of allowed CORS origins for this Sanity Project.`, + error.addOriginUrl && `Add it here:`, + error.addOriginUrl?.toString(), + ) + } else { + console.error(error) + } + }, + }) + return () => subscription.unsubscribe() + }, [handleLiveEvent]) + + return null +} diff --git a/next-15/src/app/ThemeButton.tsx b/next-15/src/app/ThemeButton.tsx new file mode 100644 index 0000000..012d97b --- /dev/null +++ b/next-15/src/app/ThemeButton.tsx @@ -0,0 +1,24 @@ +'use client' + +import type {SyncTag} from '@sanity/client' +import {useTransition} from 'react' +import {randomColorTheme} from './actions' + +export function ThemeButton({tags}: {tags: SyncTag[]}) { + const [pending, startTransition] = useTransition() + return ( + + ) +} diff --git a/next-15/src/app/TimeSince.tsx b/next-15/src/app/TimeSince.tsx new file mode 100644 index 0000000..e912a12 --- /dev/null +++ b/next-15/src/app/TimeSince.tsx @@ -0,0 +1,45 @@ +'use client' + +import {useLayoutEffect, useState} from 'react' + +export function TimeSince({label, since}: {label: string; since: string}) { + const [from, setFrom] = useState(null) + const [now, setNow] = useState(null) + useLayoutEffect(() => { + setFrom(new Date(since)) + const interval = setInterval(() => setNow(new Date()), 1000) + return () => clearInterval(interval) + }, [since]) + + let timeSince = '…' + if (from && now) { + timeSince = formatTimeSince(from, now) + } + + return ( +
+ {label}: + + fetched {timeSince} + +
+ ) +} + +const rtf = new Intl.RelativeTimeFormat('en', {style: 'short'}) +export function formatTimeSince(from: Date, to: Date): string { + const seconds = Math.floor((from.getTime() - to.getTime()) / 1000) + if (seconds > -60) { + return rtf.format(Math.min(seconds, -1), 'second') + } + const minutes = Math.ceil(seconds / 60) + if (minutes > -60) { + return rtf.format(minutes, 'minute') + } + const hours = Math.ceil(minutes / 60) + if (hours > -24) { + return rtf.format(hours, 'hour') + } + const days = Math.ceil(hours / 24) + return rtf.format(days, 'day') +} diff --git a/next-15/src/app/actions.ts b/next-15/src/app/actions.ts new file mode 100644 index 0000000..1bd4eb7 --- /dev/null +++ b/next-15/src/app/actions.ts @@ -0,0 +1,21 @@ +'use server' + +import type {SyncTag} from '@sanity/client' +import {revalidateTag} from 'next/cache' + +export async function expireTags(tags: SyncTag[]) { + for (const tag of tags) { + revalidateTag(tag) + } + console.log(` expired tags: ${tags.join(', ')}`) +} + +export async function randomColorTheme(tags: SyncTag[]) { + const res = await fetch('https://lcapi-examples-api.sanity.dev/api/random-color-theme', { + method: 'PUT', + }) + for (const tag of tags) { + revalidateTag(tag) + } + return res.json() +} diff --git a/next-15/src/app/globals.css b/next-15/src/app/globals.css index 6b717ad..ed0ea58 100644 --- a/next-15/src/app/globals.css +++ b/next-15/src/app/globals.css @@ -2,20 +2,14 @@ @tailwind components; @tailwind utilities; -:root { - --background: #ffffff; - --foreground: #171717; +@property --theme-text { + syntax: ''; + inherits: true; + initial-value: #000; } -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - -body { - color: var(--foreground); - background: var(--background); - font-family: Arial, Helvetica, sans-serif; +@property --theme-background { + syntax: ''; + inherits: true; + initial-value: #fff; } diff --git a/next-15/src/app/layout.tsx b/next-15/src/app/layout.tsx index f4445ff..d958368 100644 --- a/next-15/src/app/layout.tsx +++ b/next-15/src/app/layout.tsx @@ -1,31 +1,47 @@ -import type {Metadata} from 'next' -import localFont from 'next/font/local' import './globals.css' +import {sanityFetch} from '@/sanity/fetch' +import {defineQuery} from 'groq' +import {Suspense} from 'react' +import {SanityLive} from './SanityLive' +import {ThemeButton} from './ThemeButton' +import {TimeSince} from './TimeSince' -const geistSans = localFont({ - src: './fonts/GeistVF.woff', - variable: '--font-geist-sans', - weight: '100 900', -}) -const geistMono = localFont({ - src: './fonts/GeistMonoVF.woff', - variable: '--font-geist-mono', - weight: '100 900', -}) +const THEME_QUERY = defineQuery( + `*[_id == "theme"][0]{background,text,"fetchedAt": dateTime(now())}`, +) -export const metadata: Metadata = { - title: 'Create Next App', - description: 'Generated by create next app', -} - -export default function RootLayout({ +export default async function RootLayout({ children, }: Readonly<{ children: React.ReactNode }>) { + const {data, tags} = await sanityFetch({query: THEME_QUERY}) + return ( - - {children} + + +
+ {data?.fetchedAt && ( + + + + )} + {children} + + + +
+ + + + ) } diff --git a/next-15/src/app/page.tsx b/next-15/src/app/page.tsx index b34149c..af7014e 100644 --- a/next-15/src/app/page.tsx +++ b/next-15/src/app/page.tsx @@ -1,83 +1,35 @@ -import Image from 'next/image' +import {sanityFetch} from '@/sanity/fetch' +import './globals.css' +import {defineQuery} from 'groq' +import type {Metadata} from 'next' +import {Suspense} from 'react' +import {TimeSince} from './TimeSince' -export default function Home() { - return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{' '} - - src/app/page.tsx - - . -
  2. -
  3. Save and see your changes instantly.
  4. -
+const DEMO_QUERY = defineQuery( + `*[_type == "demo" && slug.current == $slug][0]{title,"fetchedAt": dateTime(now())}`, +) +const slug = 'next-15' + +export async function generateMetadata(): Promise { + const {data} = await sanityFetch({query: DEMO_QUERY, params: {slug}}) + return { + title: data?.title || 'Next 15', + } +} - -
- +export default async function Home() { + const {data} = await sanityFetch({query: DEMO_QUERY, params: {slug}}) + + return ( +
+

+ {data?.title || 'Next 15'} +

+ {data?.fetchedAt && ( + + + + )}
) } diff --git a/next-15/src/sanity/client.ts b/next-15/src/sanity/client.ts new file mode 100644 index 0000000..193a296 --- /dev/null +++ b/next-15/src/sanity/client.ts @@ -0,0 +1,8 @@ +import {createClient} from '@sanity/client' + +export const client = createClient({ + projectId: 'hiomol4a', + dataset: 'lcapi', + apiVersion: '2024-09-21', + useCdn: false, +}) diff --git a/next-15/src/sanity/fetch.ts b/next-15/src/sanity/fetch.ts new file mode 100644 index 0000000..8651009 --- /dev/null +++ b/next-15/src/sanity/fetch.ts @@ -0,0 +1,18 @@ +import {type QueryParams} from '@sanity/client' +import {client} from './client' + +export async function sanityFetch({ + query, + params = {}, +}: { + query: QueryString + params?: QueryParams +}) { + // Uncached query that fetches cache tags (on Next 15 uncached doesn't mean on every browser request, but on every ISR build) + const {syncTags: tags} = await client.fetch(query, params, { + filterResponse: false, + tag: 'fetch-sync-tags', // The request tag makes the fetch unique, avoids deduping with the cached query that has tags + }) + const data = await client.fetch(query, params, {next: {revalidate: false, tags}}) + return {data, tags} +} diff --git a/next-15/tailwind.config.ts b/next-15/tailwind.config.ts index 1c54c9b..f3b29eb 100644 --- a/next-15/tailwind.config.ts +++ b/next-15/tailwind.config.ts @@ -8,9 +8,19 @@ export default { ], theme: { extend: { - colors: { - background: 'var(--background)', - foreground: 'var(--foreground)', + backgroundColor: { + 'theme': 'var(--theme-background,#fff)', + 'theme-button': 'var(--theme-text,#fff)', + }, + textColor: { + 'theme': 'var(--theme-text,#000)', + 'theme-button': 'var(--theme-background,#fff)', + }, + ringColor: { + theme: 'var(--theme-text,#000)', + }, + ringOffsetColor: { + theme: 'var(--theme-background,#fff)', }, }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ede7f62..8710bfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,7 +84,7 @@ importers: version: 3.64.2 next: specifier: 13.5.7 - version: 13.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 13.5.7(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18 version: 18.3.1 @@ -130,13 +130,16 @@ importers: version: 3.64.2 next: specifier: 14.2.18 - version: 14.2.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.18(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18 version: 18.3.1 react-dom: specifier: ^18 version: 18.3.1(react@18.3.1) + use-effect-event: + specifier: ^1.0.2 + version: 1.0.2(react@18.3.1) devDependencies: '@types/node': specifier: ^20 @@ -173,13 +176,16 @@ importers: version: 3.64.2 next: specifier: 15.0.3 - version: 15.0.3(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) + version: 15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) react: specifier: rc version: 19.0.0-rc.1 react-dom: specifier: rc version: 19.0.0-rc.1(react@19.0.0-rc.1) + use-effect-event: + specifier: ^1.0.2 + version: 1.0.2(react@19.0.0-rc.1) devDependencies: '@types/node': specifier: ^20 @@ -216,7 +222,7 @@ importers: version: 3.64.2 next: specifier: canary - version: 15.0.4-canary.22(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) + version: 15.0.4-canary.22(@babel/core@7.26.0)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) react: specifier: rc version: 19.0.0-rc.1 @@ -262,7 +268,7 @@ importers: version: 3.64.2 next: specifier: 15.0.3 - version: 15.0.3(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) + version: 15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) react: specifier: rc version: 19.0.0-rc.1 @@ -10319,9 +10325,9 @@ snapshots: react-dom: 19.0.0-rc.1(react@19.0.0-rc.1) tslib: 2.8.1 - '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.8.1 @@ -10333,9 +10339,9 @@ snapshots: react: 19.0.0-rc.1 tslib: 2.8.1 - '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@18.3.1)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/core': 6.1.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) react: 18.3.1 tslib: 2.8.1 @@ -16991,7 +16997,7 @@ snapshots: neotraverse@0.6.18: {} - next@13.5.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@13.5.7(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 13.5.7 '@swc/helpers': 0.5.2 @@ -17000,7 +17006,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) watchpack: 2.4.0 optionalDependencies: '@next/swc-darwin-arm64': 13.5.7 @@ -17016,7 +17022,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.18(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.18 '@swc/helpers': 0.5.5 @@ -17026,7 +17032,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.18 '@next/swc-darwin-x64': 14.2.18 @@ -17041,7 +17047,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.0.3(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): + next@15.0.3(@babel/core@7.26.0)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): dependencies: '@next/env': 15.0.3 '@swc/counter': 0.1.3 @@ -17051,7 +17057,7 @@ snapshots: postcss: 8.4.31 react: 19.0.0-rc.1 react-dom: 19.0.0-rc.1(react@19.0.0-rc.1) - styled-jsx: 5.1.6(react@19.0.0-rc.1) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0-rc.1) optionalDependencies: '@next/swc-darwin-arm64': 15.0.3 '@next/swc-darwin-x64': 15.0.3 @@ -17066,7 +17072,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.0.4-canary.22(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): + next@15.0.4-canary.22(@babel/core@7.26.0)(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1): dependencies: '@next/env': 15.0.4-canary.22 '@swc/counter': 0.1.3 @@ -17076,7 +17082,7 @@ snapshots: postcss: 8.4.31 react: 19.0.0-rc.1 react-dom: 19.0.0-rc.1(react@19.0.0-rc.1) - styled-jsx: 5.1.6(react@19.0.0-rc.1) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0-rc.1) optionalDependencies: '@next/swc-darwin-arm64': 15.0.4-canary.22 '@next/swc-darwin-x64': 15.0.4-canary.22 @@ -18527,8 +18533,8 @@ snapshots: sanity@3.64.2(@types/node@20.17.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0)(types-react@19.0.0-rc.1): dependencies: '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) - '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@18.3.1) + '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.1.0(react-dom@19.0.0-rc.1(react@19.0.0-rc.1))(react@19.0.0-rc.1))(react@18.3.1) '@dnd-kit/utilities': 3.2.2(react@18.3.1) '@juggle/resize-observer': 3.4.0 '@portabletext/editor': 1.10.2(@sanity/block-tools@3.64.2(debug@4.3.7))(@sanity/schema@3.64.2(debug@4.3.7))(@sanity/types@3.64.2(debug@4.3.7))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(types-react@19.0.0-rc.1) @@ -19237,15 +19243,19 @@ snapshots: stylis: 4.3.2 tslib: 2.6.2 - styled-jsx@5.1.1(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.26.0)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.0 - styled-jsx@5.1.6(react@19.0.0-rc.1): + styled-jsx@5.1.6(@babel/core@7.26.0)(react@19.0.0-rc.1): dependencies: client-only: 0.0.1 react: 19.0.0-rc.1 + optionalDependencies: + '@babel/core': 7.26.0 stylehacks@7.0.4(postcss@8.4.49): dependencies: