diff --git a/apps/example-ssr/package.json b/apps/example-ssr/package.json index 35ba699f..e2446c65 100644 --- a/apps/example-ssr/package.json +++ b/apps/example-ssr/package.json @@ -6,9 +6,9 @@ "astro": "astro", "build": "astro build", "clean": "rimraf .astro && rimraf .turbo && rimraf .vercel && rimraf node_modules", - "dev": "astro dev", + "dev": "astro dev --port 4323", "preview": "astro preview", - "start": "astro dev" + "start": "astro dev --port 4323" }, "dependencies": { "@astro-community/astro-embed-youtube": "^0.5.2", diff --git a/apps/example/package.json b/apps/example/package.json index 42bb59c7..914e3c2d 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -6,9 +6,9 @@ "astro": "astro", "build": "astro build", "clean": "rimraf .astro rimraf dist && rimraf .turbo && rimraf node_modules", - "dev": "astro dev", + "dev": "astro dev --port 4322", "preview": "astro preview", - "start": "astro dev" + "start": "astro dev --port 4322" }, "dependencies": { "@astro-community/astro-embed-youtube": "^0.5.2", diff --git a/apps/movies/.gitignore b/apps/movies/.gitignore new file mode 100644 index 00000000..d724e2f0 --- /dev/null +++ b/apps/movies/.gitignore @@ -0,0 +1,26 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ +.vercel +.env*.local diff --git a/apps/movies/.vscode/extensions.json b/apps/movies/.vscode/extensions.json new file mode 100644 index 00000000..22a15055 --- /dev/null +++ b/apps/movies/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/apps/movies/.vscode/launch.json b/apps/movies/.vscode/launch.json new file mode 100644 index 00000000..d6422097 --- /dev/null +++ b/apps/movies/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/apps/movies/README.md b/apps/movies/README.md new file mode 100644 index 00000000..66f38bd6 --- /dev/null +++ b/apps/movies/README.md @@ -0,0 +1 @@ +# Movies Example App diff --git a/apps/movies/astro.config.mjs b/apps/movies/astro.config.mjs new file mode 100644 index 00000000..535fec43 --- /dev/null +++ b/apps/movies/astro.config.mjs @@ -0,0 +1,23 @@ +import {defineConfig} from 'astro/config' + +import react from '@astrojs/react' +import vercel from '@astrojs/vercel/serverless' +import sanity from '@sanity/astro' + +// https://astro.build/config +export default defineConfig({ + integrations: [ + sanity({ + projectId: '4j2qnyob', + dataset: 'production', + useCdn: true, + studioBasePath: '/admin', + stega: { + studioUrl: '/admin', + }, + }), + react(), + ], + output: 'server', + adapter: vercel(), +}) diff --git a/apps/movies/package.json b/apps/movies/package.json new file mode 100644 index 00000000..875c3d98 --- /dev/null +++ b/apps/movies/package.json @@ -0,0 +1,29 @@ +{ + "name": "movies", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "astro": "astro", + "build": "astro check && astro build", + "dev": "astro dev --port 4321", + "preview": "astro preview", + "start": "astro dev --port 4321" + }, + "dependencies": { + "@astrojs/check": "^0.7.0", + "@astrojs/react": "^3.4.0", + "@astrojs/vercel": "^7.3.4", + "@sanity/astro": "workspace:^", + "@sanity/client": "^6.19.1", + "@sanity/visual-editing": "^2.1.3", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "astro": "^4.9.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.2.1", + "sanity": "^3.44.0", + "typescript": "^5.4.5" + } +} diff --git a/apps/movies/public/favicon.svg b/apps/movies/public/favicon.svg new file mode 100644 index 00000000..f157bd1c --- /dev/null +++ b/apps/movies/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/apps/movies/sanity.cli.ts b/apps/movies/sanity.cli.ts new file mode 100644 index 00000000..3b95d3b3 --- /dev/null +++ b/apps/movies/sanity.cli.ts @@ -0,0 +1,8 @@ +import {defineCliConfig} from 'sanity/cli' + +export default defineCliConfig({ + api: { + projectId: '4j2qnyob', + dataset: 'production', + }, +}) diff --git a/apps/movies/sanity.config.ts b/apps/movies/sanity.config.ts new file mode 100644 index 00000000..00f17103 --- /dev/null +++ b/apps/movies/sanity.config.ts @@ -0,0 +1,27 @@ +import {defineConfig} from 'sanity' +import {structureTool} from 'sanity/structure' +import {schemaTypes} from './schemaTypes' +import {presentationTool} from 'sanity/presentation' + +export default defineConfig({ + name: 'default', + title: 'sanity-astro-movies', + + projectId: '4j2qnyob', + dataset: 'production', + + plugins: [ + presentationTool({ + previewUrl: process.env.VERCEL_BRANCH_URL + ? `https://${process.env.VERCEL_BRANCH_URL}` + : process.env.VERCEL_PROJECT_PRODUCTION_URL + ? `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL}` + : 'http://localhost:4321', + }), + structureTool(), + ], + + schema: { + types: schemaTypes, + }, +}) diff --git a/apps/movies/schemaTypes/blockContent.ts b/apps/movies/schemaTypes/blockContent.ts new file mode 100644 index 00000000..98b22a14 --- /dev/null +++ b/apps/movies/schemaTypes/blockContent.ts @@ -0,0 +1,67 @@ +import {defineArrayMember, defineType} from 'sanity' + +/** + * This is the schema definition for the rich text fields used for + * for this blog studio. When you import it in schemas.js it can be + * reused in other parts of the studio with: + * { + * name: 'someName', + * title: 'Some title', + * type: 'blockContent' + * } + */ +export default defineType({ + title: 'Block Content', + name: 'blockContent', + type: 'array', + of: [ + defineArrayMember({ + title: 'Block', + type: 'block', + // Styles let you set what your user can mark up blocks with. These + // correspond with HTML tags, but you can set any title or value + // you want and decide how you want to deal with it where you want to + // use your content. + styles: [ + {title: 'Normal', value: 'normal'}, + {title: 'H1', value: 'h1'}, + {title: 'H2', value: 'h2'}, + {title: 'H3', value: 'h3'}, + {title: 'H4', value: 'h4'}, + {title: 'Quote', value: 'blockquote'}, + ], + lists: [{title: 'Bullet', value: 'bullet'}], + // Marks let you mark up inline text in the block editor. + marks: { + // Decorators usually describe a single property – e.g. a typographic + // preference or highlighting by editors. + decorators: [ + {title: 'Strong', value: 'strong'}, + {title: 'Emphasis', value: 'em'}, + ], + // Annotations can be any object structure – e.g. a link or a footnote. + annotations: [ + { + title: 'URL', + name: 'link', + type: 'object', + fields: [ + { + title: 'URL', + name: 'href', + type: 'url', + }, + ], + }, + ], + }, + }), + // You can add additional types here. Note that you can't use + // primitive types such as 'string' and 'number' in the same array + // as a block type. + defineArrayMember({ + type: 'image', + options: {hotspot: true}, + }), + ], +}) diff --git a/apps/movies/schemaTypes/castMember.ts b/apps/movies/schemaTypes/castMember.ts new file mode 100644 index 00000000..9153eb13 --- /dev/null +++ b/apps/movies/schemaTypes/castMember.ts @@ -0,0 +1,37 @@ +import {defineField, defineType} from 'sanity' + +export default defineType({ + name: 'castMember', + title: 'Cast Member', + type: 'object', + fields: [ + defineField({ + name: 'characterName', + title: 'Character Name', + type: 'string', + }), + defineField({ + name: 'person', + title: 'Actor', + type: 'reference', + to: [{type: 'person'}], + }), + defineField({ + name: 'externalId', + title: 'External ID', + type: 'number', + }), + defineField({ + name: 'externalCreditId', + title: 'External Credit ID', + type: 'string', + }), + ], + preview: { + select: { + subtitle: 'characterName', + title: 'person.name', + media: 'person.image', + }, + }, +}) diff --git a/apps/movies/schemaTypes/crewMember.ts b/apps/movies/schemaTypes/crewMember.ts new file mode 100644 index 00000000..9563460d --- /dev/null +++ b/apps/movies/schemaTypes/crewMember.ts @@ -0,0 +1,52 @@ +// @ts-check +import {defineField, defineType} from 'sanity' + +export default defineType({ + name: 'crewMember', + title: 'Crew Member', + type: 'object', + fields: [ + defineField({ + name: 'department', + title: 'Department', + type: 'string', + }), + defineField({ + name: 'job', + title: 'Job', + type: 'string', + }), + defineField({ + name: 'person', + title: 'Person', + type: 'reference', + to: [{type: 'person'}], + }), + defineField({ + name: 'externalId', + title: 'External ID', + type: 'number', + }), + defineField({ + name: 'externalCreditId', + title: 'External Credit ID', + type: 'string', + }), + ], + preview: { + select: { + name: 'person.name', + job: 'job', + department: 'department', + media: 'person.image', + }, + prepare(selection) { + const {name, job, department, media} = selection + return { + title: name, + subtitle: `${job} [${department}]`, + media, + } + }, + }, +}) diff --git a/apps/movies/schemaTypes/index.ts b/apps/movies/schemaTypes/index.ts new file mode 100644 index 00000000..aa54ed17 --- /dev/null +++ b/apps/movies/schemaTypes/index.ts @@ -0,0 +1,22 @@ +import blockContent from './blockContent' +import crewMember from './crewMember' +import castMember from './castMember' +import movie from './movie' +import person from './person' +import screening from './screening' +import plotSummary from './plotSummary' +import plotSummaries from './plotSummaries' + +export const schemaTypes = [ + // Document types + movie, + person, + screening, + + // Other types + blockContent, + plotSummary, + plotSummaries, + castMember, + crewMember, +] diff --git a/apps/movies/schemaTypes/movie.ts b/apps/movies/schemaTypes/movie.ts new file mode 100644 index 00000000..a44f52a2 --- /dev/null +++ b/apps/movies/schemaTypes/movie.ts @@ -0,0 +1,85 @@ +import {defineField, defineType} from 'sanity' +import {MdLocalMovies as icon} from 'react-icons/md' + +export default defineType({ + name: 'movie', + title: 'Movie', + type: 'document', + icon, + fields: [ + defineField({ + name: 'title', + title: 'Title', + type: 'string', + }), + defineField({ + name: 'slug', + title: 'Slug', + type: 'slug', + options: { + source: 'title', + maxLength: 100, + }, + }), + defineField({ + name: 'overview', + title: 'Overview', + type: 'blockContent', + }), + defineField({ + name: 'releaseDate', + title: 'Release date', + type: 'datetime', + }), + defineField({ + name: 'poster', + title: 'Poster Image', + type: 'image', + options: { + hotspot: true, + }, + }), + defineField({ + name: 'externalId', + title: 'External ID', + type: 'number', + }), + defineField({ + name: 'popularity', + title: 'Popularity', + type: 'number', + }), + defineField({ + name: 'castMembers', + title: 'Cast Members', + type: 'array', + of: [{type: 'castMember'}], + }), + defineField({ + name: 'crewMembers', + title: 'Crew Members', + type: 'array', + of: [{type: 'crewMember'}], + }), + ], + preview: { + select: { + title: 'title', + date: 'releaseDate', + media: 'poster', + castName0: 'castMembers.0.person.name', + castName1: 'castMembers.1.person.name', + }, + prepare(selection) { + const year = selection.date && selection.date.split('-')[0] + const cast = [selection.castName0, selection.castName1].filter(Boolean).join(', ') + + return { + title: `${selection.title} ${year ? `(${year})` : ''}`, + date: selection.date, + subtitle: cast, + media: selection.media, + } + }, + }, +}) diff --git a/apps/movies/schemaTypes/person.ts b/apps/movies/schemaTypes/person.ts new file mode 100644 index 00000000..22a3f794 --- /dev/null +++ b/apps/movies/schemaTypes/person.ts @@ -0,0 +1,37 @@ +import {defineField, defineType} from 'sanity' +import {MdPerson as icon} from 'react-icons/md' + +export default defineType({ + name: 'person', + title: 'Person', + type: 'document', + icon, + fields: [ + defineField({ + name: 'name', + title: 'Name', + type: 'string', + description: 'Please use "Firstname Lastname" format', + }), + defineField({ + name: 'slug', + title: 'Slug', + type: 'slug', + options: { + source: 'name', + maxLength: 100, + }, + }), + defineField({ + name: 'image', + title: 'Image', + type: 'image', + options: { + hotspot: true, + }, + }), + ], + preview: { + select: {title: 'name', media: 'image'}, + }, +}) diff --git a/apps/movies/schemaTypes/plotSummaries.ts b/apps/movies/schemaTypes/plotSummaries.ts new file mode 100644 index 00000000..00f03e81 --- /dev/null +++ b/apps/movies/schemaTypes/plotSummaries.ts @@ -0,0 +1,20 @@ +import {defineField, defineType} from 'sanity' + +export default defineType({ + title: 'Plot summaries', + name: 'plotSummaries', + type: 'object', + fields: [ + defineField({ + name: 'caption', + title: 'Caption', + type: 'string', + }), + defineField({ + name: 'summaries', + title: 'Summaries', + type: 'array', + of: [{type: 'plotSummary'}], + }), + ], +}) diff --git a/apps/movies/schemaTypes/plotSummary.ts b/apps/movies/schemaTypes/plotSummary.ts new file mode 100644 index 00000000..60d823c8 --- /dev/null +++ b/apps/movies/schemaTypes/plotSummary.ts @@ -0,0 +1,24 @@ +import {defineField, defineType} from 'sanity' + +export default defineType({ + name: 'plotSummary', + title: 'Plot Summary', + type: 'object', + fields: [ + defineField({ + title: 'Summary', + name: 'summary', + type: 'text', + }), + defineField({ + title: 'Author', + name: 'author', + type: 'string', + }), + defineField({ + title: 'Link to author', + name: 'url', + type: 'url', + }), + ], +}) diff --git a/apps/movies/schemaTypes/screening.ts b/apps/movies/schemaTypes/screening.ts new file mode 100644 index 00000000..4c5b784b --- /dev/null +++ b/apps/movies/schemaTypes/screening.ts @@ -0,0 +1,81 @@ +import {defineField, defineType} from 'sanity' +import {MdLocalPlay as icon} from 'react-icons/md' + +export default defineType({ + name: 'screening', + title: 'Screening', + type: 'document', + icon, + fields: [ + defineField({ + name: 'title', + title: 'Title', + type: 'string', + description: 'E.g.: Our first ever screening of Gattaca', + }), + defineField({ + name: 'movie', + title: 'Movie', + type: 'reference', + to: [{type: 'movie'}], + description: 'Which movie are we screening', + }), + defineField({ + name: 'published', + title: 'Published', + type: 'boolean', + description: 'Set to published when this screening should be visible on a front-end', + }), + defineField({ + name: 'location', + title: 'Location', + type: 'geopoint', + description: 'Where will the screening take place?', + hidden: true, + }), + defineField({ + name: 'beginAt', + title: 'Starts at', + type: 'datetime', + description: 'When does the screening start?', + }), + defineField({ + name: 'endAt', + title: 'Ends at', + type: 'datetime', + description: 'When does the screening end?', + }), + defineField({ + name: 'allowedGuests', + title: 'Who can come?', + type: 'string', + options: { + list: [ + {title: 'Members', value: 'members'}, + {title: 'Members and friends', value: 'friends'}, + {title: 'Anyone', value: 'anyone'}, + ], + layout: 'radio', + }, + }), + defineField({ + name: 'infoUrl', + title: 'More info at', + type: 'url', + description: + 'URL to imdb.com, rottentomatoes.com or some other place with reviews, stats, etc', + }), + defineField({ + name: 'ticket', + title: 'Ticket', + type: 'file', + description: 'PDF for printing a physical ticket', + }), + ], + preview: { + select: { + title: 'title', + media: 'movie.poster', + }, + }, +}) diff --git a/apps/movies/src/env.d.ts b/apps/movies/src/env.d.ts new file mode 100644 index 00000000..3319e659 --- /dev/null +++ b/apps/movies/src/env.d.ts @@ -0,0 +1,11 @@ +/// +/// + +interface ImportMetaEnv { + readonly SANITY_VISUAL_EDITING_ENABLED: string + readonly SANITY_API_READ_TOKEN: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/apps/movies/src/layout.astro b/apps/movies/src/layout.astro new file mode 100644 index 00000000..1bfe9961 --- /dev/null +++ b/apps/movies/src/layout.astro @@ -0,0 +1,23 @@ +--- +import {VisualEditing} from '@sanity/astro/visual-editing' +const visualEditingEnabled = import.meta.env.SANITY_VISUAL_EDITING_ENABLED == 'true' + +export type props = { + title: string +} +const {title} = Astro.props +--- + + + + + + + + {title} + + + + + + diff --git a/apps/movies/src/load-query.ts b/apps/movies/src/load-query.ts new file mode 100644 index 00000000..4edab39a --- /dev/null +++ b/apps/movies/src/load-query.ts @@ -0,0 +1,34 @@ +import {type QueryParams} from 'sanity' +import {sanityClient} from 'sanity:client' + +const visualEditingEnabled = import.meta.env.SANITY_VISUAL_EDITING_ENABLED === 'true' +const token = import.meta.env.SANITY_API_READ_TOKEN + +export async function loadQuery({ + query, + params, +}: { + query: string + params?: QueryParams +}) { + if (visualEditingEnabled && !token) { + throw new Error('The `SANITY_API_READ_TOKEN` environment variable is required in Draft Mode.') + } + + const perspective = visualEditingEnabled ? 'previewDrafts' : 'published' + + const {result, resultSourceMap} = await sanityClient.fetch(query, params ?? {}, { + filterResponse: false, + perspective, + resultSourceMap: visualEditingEnabled ? 'withKeyArraySelector' : false, + stega: visualEditingEnabled, + ...(visualEditingEnabled ? {token} : {}), + useCdn: !visualEditingEnabled, + }) + + return { + data: result, + sourceMap: resultSourceMap, + perspective, + } +} diff --git a/apps/movies/src/pages/index.astro b/apps/movies/src/pages/index.astro new file mode 100644 index 00000000..c0f7fe02 --- /dev/null +++ b/apps/movies/src/pages/index.astro @@ -0,0 +1,15 @@ +--- +import Layout from '../layout.astro' +import {loadQuery} from '../load-query' + +const {data: movies} = await loadQuery>({ + query: `*[_type == 'movie']`, +}) +--- + + +

Movies

+
    + {movies.map((movie) =>
  1. {movie.title}
  2. )} +
+
diff --git a/apps/movies/tsconfig.json b/apps/movies/tsconfig.json new file mode 100644 index 00000000..fbc2f5fc --- /dev/null +++ b/apps/movies/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/strictest" +} diff --git a/package.json b/package.json index 154783b9..692287b2 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,12 @@ "build": "turbo run build", "build:example": "turbo run build --filter=example...", "build:example-ssr": "turbo run build --filter=example-ssr...", + "build:movies": "turbo run build --filter=movies...", "clean": "turbo run clean && rimraf .turbo && rimraf node_modules", "dev": "turbo run dev", "dev:example": "turbo run dev --filter=example", "dev:example-ssr": "turbo run dev --filter=example-ssr", + "dev:movies": "turbo run dev --filter=movies", "format": "prettier --write .", "lint": "turbo run lint" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index beb9c4bc..b234f741 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,7 +42,7 @@ importers: version: 3.1.0 '@astrojs/react': specifier: ^3.4.0 - version: 3.4.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(vite@4.5.3) + version: 3.4.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(vite@4.5.3) '@sanity/astro': specifier: workspace:^ version: link:../../packages/sanity-astro @@ -72,7 +72,7 @@ importers: version: 18.3.1(react@18.3.1) sanity: specifier: ^3.44.0 - version: 3.44.0(@types/node@20.12.12)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11) + version: 3.44.0(@types/node@20.12.12)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11) styled-components: specifier: ^6.1.11 version: 6.1.11(react-dom@18.3.1)(react@18.3.1) @@ -87,7 +87,7 @@ importers: version: 3.1.0 '@astrojs/react': specifier: ^3.4.0 - version: 3.4.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(vite@4.5.3) + version: 3.4.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(vite@4.5.3) '@astrojs/vercel': specifier: ^7.6.0 version: 7.6.0(astro@4.9.2)(react@18.3.1) @@ -117,11 +117,56 @@ importers: version: 18.3.1(react@18.3.1) sanity: specifier: ^3.44.0 - version: 3.44.0(@types/node@20.12.12)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11) + version: 3.44.0(@types/node@20.12.12)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11) styled-components: specifier: ^6.1.11 version: 6.1.11(react-dom@18.3.1)(react@18.3.1) + apps/movies: + dependencies: + '@astrojs/check': + specifier: ^0.7.0 + version: 0.7.0(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) + '@astrojs/react': + specifier: ^3.4.0 + version: 3.4.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(vite@4.5.3) + '@astrojs/vercel': + specifier: ^7.3.4 + version: 7.6.0(astro@4.9.2)(react@18.3.1) + '@sanity/astro': + specifier: workspace:^ + version: link:../../packages/sanity-astro + '@sanity/client': + specifier: ^6.19.1 + version: 6.19.1(debug@3.2.7) + '@sanity/visual-editing': + specifier: ^2.1.3 + version: 2.1.3(@sanity/client@6.19.1)(react-dom@18.3.1)(react@18.3.1) + '@types/react': + specifier: ^18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + astro: + specifier: ^4.9.2 + version: 4.9.2(@types/node@20.12.12)(typescript@5.4.5) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-icons: + specifier: ^5.2.1 + version: 5.2.1(react@18.3.1) + sanity: + specifier: ^3.44.0 + version: 3.44.0(@types/node@20.12.12)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + packages/sanity-astro: devDependencies: '@sanity/client': @@ -135,7 +180,7 @@ importers: version: 5.0.4 astro: specifier: ^4.0.9 - version: 4.9.2(@types/node@20.12.12)(typescript@5.4.5) + version: 4.8.3(@types/node@20.12.12)(typescript@5.4.5) react: specifier: ^18.2.0 version: 18.3.1 @@ -144,7 +189,7 @@ importers: version: 18.3.1(react@18.3.1) sanity: specifier: ^3.43.0 - version: 3.44.0(@types/node@20.12.12)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11) + version: 3.44.0(@types/node@20.12.12)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11) serialize-javascript: specifier: ^6.0.2 version: 6.0.2 @@ -191,12 +236,31 @@ packages: lite-youtube-embed: 0.3.2 dev: false + /@astrojs/check@0.7.0(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): + resolution: + { + integrity: sha512-UTqwOeKNu9IYZmJXEeWnQuTdSd/pX58Hl4TUARsMlT97SVDL//kLBE4T/ctxRz6J573N87oE5ddtW/uOOnQTug==, + } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + dependencies: + '@astrojs/language-server': 2.10.0(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5) + chokidar: 3.6.0 + fast-glob: 3.3.2 + kleur: 4.1.5 + typescript: 5.4.5 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + dev: false + /@astrojs/compiler@1.8.2: resolution: { integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==, } - dev: true /@astrojs/compiler@2.8.0: resolution: @@ -210,6 +274,43 @@ packages: integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==, } + /@astrojs/language-server@2.10.0(prettier-plugin-astro@0.13.0)(prettier@3.2.5)(typescript@5.4.5): + resolution: + { + integrity: sha512-crHXpqYfA5qWioiuZnZFpTsNItgBlF1f0S9MzDYS7/pfCALkHNJ7K3w9U/j0uMKymsT4hC7BfMaX0DYlfdSzHg==, + } + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + dependencies: + '@astrojs/compiler': 2.8.0 + '@jridgewell/sourcemap-codec': 1.4.15 + '@volar/kit': 2.2.5(typescript@5.4.5) + '@volar/language-core': 2.2.5 + '@volar/language-server': 2.2.5 + '@volar/language-service': 2.2.5 + '@volar/typescript': 2.2.5 + fast-glob: 3.3.2 + prettier: 3.2.5 + prettier-plugin-astro: 0.13.0 + volar-service-css: 0.0.45(@volar/language-service@2.2.5) + volar-service-emmet: 0.0.45(@volar/language-service@2.2.5) + volar-service-html: 0.0.45(@volar/language-service@2.2.5) + volar-service-prettier: 0.0.45(@volar/language-service@2.2.5)(prettier@3.2.5) + volar-service-typescript: 0.0.45(@volar/language-service@2.2.5) + volar-service-typescript-twoslash-queries: 0.0.45(@volar/language-service@2.2.5) + vscode-html-languageservice: 5.2.0 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - typescript + dev: false + /@astrojs/markdown-remark@5.1.0: resolution: { @@ -246,7 +347,7 @@ packages: dependencies: prismjs: 1.29.0 - /@astrojs/react@3.4.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(vite@4.5.3): + /@astrojs/react@3.4.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(vite@4.5.3): resolution: { integrity: sha512-5MpU+1WVqirEIoEmF1r6HkxqjOWEMjni/qCzPX/oaSyumOZNdCGfDN9GoGJhgSxiZOVfob+MNy46H4d3AgrYpQ==, @@ -258,7 +359,7 @@ packages: react: ^17.0.2 || ^18.0.0 || ^19.0.0-beta react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0-beta dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 '@vitejs/plugin-react': 4.2.1(vite@4.5.3) react: 18.3.1 @@ -2075,6 +2176,64 @@ packages: react: 18.3.1 tslib: 2.6.2 + /@emmetio/abbreviation@2.3.3: + resolution: + { + integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==, + } + dependencies: + '@emmetio/scanner': 1.0.4 + dev: false + + /@emmetio/css-abbreviation@2.1.8: + resolution: + { + integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==, + } + dependencies: + '@emmetio/scanner': 1.0.4 + dev: false + + /@emmetio/css-parser@0.4.0: + resolution: + { + integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==, + } + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + dev: false + + /@emmetio/html-matcher@1.3.0: + resolution: + { + integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==, + } + dependencies: + '@emmetio/scanner': 1.0.4 + dev: false + + /@emmetio/scanner@1.0.4: + resolution: + { + integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==, + } + dev: false + + /@emmetio/stream-reader-utils@0.1.0: + resolution: + { + integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==, + } + dev: false + + /@emmetio/stream-reader@2.2.0: + resolution: + { + integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==, + } + dev: false + /@emnapi/runtime@1.1.1: resolution: { @@ -3293,6 +3452,18 @@ packages: dependencies: minipass: 7.1.1 + /@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462: + resolution: + { + integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==, + } + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + dev: false + /@jridgewell/gen-mapping@0.3.5: resolution: { @@ -4170,7 +4341,7 @@ packages: dependencies: '@sanity/client': 6.19.1(debug@4.3.4) '@sanity/icons': 3.0.0(react@18.3.1) - '@sanity/preview-url-secret': 1.6.16(@sanity/client@6.19.1) + '@sanity/preview-url-secret': 1.6.17(@sanity/client@6.19.1) '@sanity/ui': 2.1.14(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.11) '@sanity/uuid': 3.0.2 '@types/lodash.isequal': 4.5.8 @@ -4211,6 +4382,19 @@ packages: dependencies: '@sanity/client': 6.19.1(debug@3.2.7) '@sanity/uuid': 3.0.2 + dev: true + + /@sanity/preview-url-secret@1.6.17(@sanity/client@6.19.1): + resolution: + { + integrity: sha512-Gj0bnochUdyGJdcYdZMJ8up81aqp6dCy1ldE5Hx3tIktANc7LYie0KfZctexY1h+teBi50vKpk8uiVID/V2e2w==, + } + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.19.1 + dependencies: + '@sanity/client': 6.19.1(debug@3.2.7) + '@sanity/uuid': 3.0.2 /@sanity/schema@3.44.0(debug@3.2.7): resolution: @@ -4268,7 +4452,7 @@ packages: } dependencies: '@sanity/client': 6.19.1(debug@4.3.4) - '@types/react': 18.3.2 + '@types/react': 18.3.3 transitivePeerDependencies: - debug @@ -4279,7 +4463,7 @@ packages: } dependencies: '@sanity/client': 6.19.1(debug@3.2.7) - '@types/react': 18.3.2 + '@types/react': 18.3.3 transitivePeerDependencies: - debug @@ -4290,7 +4474,7 @@ packages: } dependencies: '@sanity/client': 6.19.1(debug@4.3.4) - '@types/react': 18.3.2 + '@types/react': 18.3.3 transitivePeerDependencies: - debug @@ -4447,6 +4631,41 @@ packages: valibot: 0.30.0 dev: true + /@sanity/visual-editing@2.1.3(@sanity/client@6.19.1)(react-dom@18.3.1)(react@18.3.1): + resolution: + { + integrity: sha512-P2M1WIlhJLCwtMR1shmACRWnRMsW5WD5RHVsOFMXolFdL3CY1/O/8yvK9xZ6QEHONDpKsJo2zr+CG2LZ9cX0QQ==, + } + engines: {node: '>=18'} + peerDependencies: + '@remix-run/react': '>= 2' + '@sanity/client': ^6.19.1 + '@sveltejs/kit': '>= 2' + next: '>= 13 || >=14.3.0-canary.0 <14.3.0' + react: ^18.3 || >=19.0.0-rc + react-dom: ^18.3 || >=19.0.0-rc + svelte: '>= 4' + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sanity/client': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + svelte: + optional: true + dependencies: + '@sanity/client': 6.19.1(debug@3.2.7) + '@sanity/preview-url-secret': 1.6.17(@sanity/client@6.19.1) + '@vercel/stega': 0.1.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + valibot: 0.30.0 + dev: false + /@shikijs/core@1.5.2: resolution: { @@ -4771,7 +4990,7 @@ packages: integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==, } dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 /@types/react-dom@18.3.0: resolution: @@ -4779,7 +4998,7 @@ packages: integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==, } dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 dev: false /@types/react-is@18.3.0: @@ -4788,12 +5007,12 @@ packages: integrity: sha512-KZJpHUkAdzyKj/kUHJDc6N7KyidftICufJfOFpiG6haL/BDQNQt5i4n1XDUL/nDZAtGLHDSWRYpLzKTAKSvX6w==, } dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 - /@types/react@18.3.2: + /@types/react@18.3.3: resolution: { - integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==, + integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==, } dependencies: '@types/prop-types': 15.7.12 @@ -5063,7 +5282,6 @@ packages: { integrity: sha512-P7mafQXjkrsoyTRppnt0N21udKS9wUmLXHRyP9saLXLHw32j/FgUJ3FscSWgvSqRs4cj7wKZtwqJEvWJ2jbGmA==, } - dev: true /@vitejs/plugin-react@4.2.1(vite@4.5.3): resolution: @@ -5083,6 +5301,22 @@ packages: transitivePeerDependencies: - supports-color + /@volar/kit@2.2.5(typescript@5.4.5): + resolution: + { + integrity: sha512-Bmn0UCaT43xUGGRwcmFG9lKhiCCLjRT4ScSLLPn5C9ltUcSGnIFFDlbZZa1PreHYHq25/4zkXt9Ap32klAh17w==, + } + peerDependencies: + typescript: '*' + dependencies: + '@volar/language-service': 2.2.5 + '@volar/typescript': 2.2.5 + typesafe-path: 0.2.2 + typescript: 5.4.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false + /@volar/language-core@1.11.1: resolution: { @@ -5092,6 +5326,56 @@ packages: '@volar/source-map': 1.11.1 dev: true + /@volar/language-core@2.2.5: + resolution: + { + integrity: sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==, + } + dependencies: + '@volar/source-map': 2.2.5 + dev: false + + /@volar/language-server@2.2.5: + resolution: + { + integrity: sha512-PV/jkUkI+m72HTXwnY7hsGqLY3VNi96ZRoWFRzVC9QG/853bixxjveXPJIiydMJ9I739lO3kcj3hnGrF5Sm+HA==, + } + dependencies: + '@volar/language-core': 2.2.5 + '@volar/language-service': 2.2.5 + '@volar/snapshot-document': 2.2.5 + '@volar/typescript': 2.2.5 + '@vscode/l10n': 0.0.16 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false + + /@volar/language-service@2.2.5: + resolution: + { + integrity: sha512-a97e/0uCe+uSu23F4zvgvldqJtZe6jugQeEHWjTfhgOEO8+Be0t5CZNNVItQqmPyAsD8eElg0S/cP6uxvCmCSQ==, + } + dependencies: + '@volar/language-core': 2.2.5 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false + + /@volar/snapshot-document@2.2.5: + resolution: + { + integrity: sha512-MTOvWVKxM7ugKO3Amffkv2pND03fe2JtfygYaputqjVFML7YxtTXj8SPnI2pODLeSwOKzDYL6Q8r5j6Y5AgUzQ==, + } + dependencies: + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + dev: false + /@volar/source-map@1.11.1: resolution: { @@ -5101,6 +5385,15 @@ packages: muggle-string: 0.3.1 dev: true + /@volar/source-map@2.2.5: + resolution: + { + integrity: sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==, + } + dependencies: + muggle-string: 0.4.1 + dev: false + /@volar/typescript@1.11.1: resolution: { @@ -5111,6 +5404,43 @@ packages: path-browserify: 1.0.1 dev: true + /@volar/typescript@2.2.5: + resolution: + { + integrity: sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==, + } + dependencies: + '@volar/language-core': 2.2.5 + path-browserify: 1.0.1 + dev: false + + /@vscode/emmet-helper@2.9.3: + resolution: + { + integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==, + } + dependencies: + emmet: 2.4.7 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 2.1.2 + dev: false + + /@vscode/l10n@0.0.16: + resolution: + { + integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==, + } + dev: false + + /@vscode/l10n@0.0.18: + resolution: + { + integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==, + } + dev: false + /@vue/compiler-core@3.4.27: resolution: { @@ -5374,7 +5704,6 @@ packages: integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==, } engines: {node: '>=10'} - deprecated: This package is no longer supported. dependencies: delegates: 1.0.0 readable-stream: 3.6.2 @@ -5587,6 +5916,91 @@ packages: '@portabletext/types': 2.0.13 dev: false + /astro@4.8.3(@types/node@20.12.12)(typescript@5.4.5): + resolution: + { + integrity: sha512-pgIKopkmAUXY3EJHdG7zQpudtBzYAsd94A1R7jmLpH2LFZvzHEkAdHnunmSVmgikJCNqtEo3bUCHgLnCPQaN1g==, + } + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + dependencies: + '@astrojs/compiler': 2.8.0 + '@astrojs/internal-helpers': 0.4.0 + '@astrojs/markdown-remark': 5.1.0 + '@astrojs/telemetry': 3.1.0 + '@babel/core': 7.24.5 + '@babel/generator': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + '@types/babel__core': 7.20.5 + '@types/cookie': 0.6.0 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 4.0.0 + boxen: 7.1.1 + chokidar: 3.6.0 + ci-info: 4.0.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 0.6.0 + cssesc: 3.0.0 + debug: 4.3.4 + deterministic-object-hash: 2.0.2 + devalue: 5.0.0 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.3 + es-module-lexer: 1.5.2 + esbuild: 0.21.2 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.2 + flattie: 1.1.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.10 + mrmime: 2.0.0 + ora: 8.0.1 + p-limit: 5.0.0 + p-queue: 8.0.1 + path-to-regexp: 6.2.2 + preferred-pm: 3.1.3 + prompts: 2.4.2 + rehype: 13.0.1 + resolve: 1.22.8 + semver: 7.6.2 + shiki: 1.5.2 + string-width: 7.1.0 + strip-ansi: 7.1.0 + tsconfck: 3.0.3(typescript@5.4.5) + unist-util-visit: 5.0.0 + vfile: 6.0.1 + vite: 5.2.11(@types/node@20.12.12) + vitefu: 0.2.5(vite@5.2.11) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + optionalDependencies: + sharp: 0.33.3 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - typescript + dev: true + /astro@4.9.2(@types/node@20.12.12)(typescript@5.4.5): resolution: { @@ -5670,6 +6084,7 @@ packages: - supports-color - terser - typescript + dev: false /async-mutex@0.4.1: resolution: @@ -6353,7 +6768,6 @@ packages: { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, } - requiresBuild: true /color-string@1.9.1: resolution: @@ -7244,6 +7658,16 @@ packages: integrity: sha512-bZu7p623NEA2rHTc9K1vykl57ektSPQYFFqQir8BOYf6EKOB+yIsbFB9Kpm7Cgt6tsLr9sRkqfqSZUw7LP1XxQ==, } + /emmet@2.4.7: + resolution: + { + integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==, + } + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + dev: false + /emoji-regex@10.3.0: resolution: { @@ -8506,7 +8930,6 @@ packages: integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==, } engines: {node: '>=10'} - deprecated: This package is no longer supported. dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -8751,7 +9174,6 @@ packages: { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, } - deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -9389,7 +9811,6 @@ packages: { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, } - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -10241,6 +10662,13 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-parser@2.3.1: + resolution: + { + integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==, + } + dev: false + /jsonfile@4.0.0: resolution: { @@ -11394,6 +11822,13 @@ packages: } dev: true + /muggle-string@0.4.1: + resolution: + { + integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, + } + dev: false + /mute-stream@0.0.8: resolution: { @@ -11592,7 +12027,6 @@ packages: { integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==, } - deprecated: This package is no longer supported. dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 @@ -12075,7 +12509,6 @@ packages: { integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, } - dev: true /path-case@2.1.1: resolution: @@ -12327,7 +12760,6 @@ packages: '@astrojs/compiler': 1.8.2 prettier: 3.2.5 sass-formatter: 0.7.9 - dev: true /prettier-plugin-packagejson@2.5.0(prettier@3.2.5): resolution: @@ -12602,7 +13034,7 @@ packages: integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==, } - /react-focus-lock@2.12.1(@types/react@18.3.2)(react@18.3.1): + /react-focus-lock@2.12.1(@types/react@18.3.3)(react@18.3.1): resolution: { integrity: sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==, @@ -12615,13 +13047,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.5 - '@types/react': 18.3.2 + '@types/react': 18.3.3 focus-lock: 1.3.5 prop-types: 15.8.1 react: 18.3.1 react-clientside-effect: 1.2.6(react@18.3.1) - use-callback-ref: 1.3.2(@types/react@18.3.2)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.2)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) /react-i18next@13.5.0(i18next@23.11.4)(react-dom@18.3.1)(react@18.3.1): resolution: @@ -12645,6 +13077,17 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + /react-icons@5.2.1(react@18.3.1): + resolution: + { + integrity: sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==, + } + peerDependencies: + react: '*' + dependencies: + react: 18.3.1 + dev: false + /react-is@16.13.1: resolution: { @@ -13028,6 +13471,13 @@ packages: mdast-util-to-markdown: 2.1.0 unified: 11.0.4 + /request-light@0.7.0: + resolution: + { + integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==, + } + dev: false + /require-directory@2.1.1: resolution: { @@ -13278,7 +13728,6 @@ packages: { integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==, } - dev: true /safe-array-concat@1.1.2: resolution: @@ -13332,7 +13781,7 @@ packages: dependencies: '@sanity/diff-match-patch': 3.1.1 - /sanity@3.44.0(@types/node@20.12.12)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11): + /sanity@3.44.0(@types/node@20.12.12)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.11): resolution: { integrity: sha512-dvX7b1L9qoxIlUMDehVu7LOwXz9OgAt7Qtyd7HR9SaH1tlPxMji+XZTTwfCTSziYEPWYptrtIjfvv8iMEsFH1Q==, @@ -13434,7 +13883,7 @@ packages: react-copy-to-clipboard: 5.1.0(react@18.3.1) react-dom: 18.3.1(react@18.3.1) react-fast-compare: 3.2.2 - react-focus-lock: 2.12.1(@types/react@18.3.2)(react@18.3.1) + react-focus-lock: 2.12.1(@types/react@18.3.3)(react@18.3.1) react-i18next: 13.5.0(i18next@23.11.4)(react-dom@18.3.1)(react@18.3.1) react-is: 18.3.1 react-refractor: 2.2.0(react@18.3.1) @@ -13480,7 +13929,6 @@ packages: } dependencies: suf-log: 2.5.3 - dev: true /saxes@6.0.0: resolution: @@ -14254,7 +14702,6 @@ packages: } dependencies: s.color: 0.0.15 - dev: true /supports-color@5.5.0: resolution: @@ -14888,6 +15335,22 @@ packages: dependencies: uuidv7: 0.4.4 + /typesafe-path@0.2.2: + resolution: + { + integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==, + } + dev: false + + /typescript-auto-import-cache@0.3.2: + resolution: + { + integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==, + } + dependencies: + semver: 7.6.2 + dev: false + /typescript@5.4.2: resolution: { @@ -15240,7 +15703,7 @@ packages: querystringify: 2.2.0 requires-port: 1.0.0 - /use-callback-ref@1.3.2(@types/react@18.3.2)(react@18.3.1): + /use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): resolution: { integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==, @@ -15253,7 +15716,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 react: 18.3.1 tslib: 2.6.2 @@ -15277,7 +15740,7 @@ packages: dependencies: react: 18.3.1 - /use-sidecar@1.1.2(@types/react@18.3.2)(react@18.3.1): + /use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): resolution: { integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==, @@ -15290,7 +15753,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.3.2 + '@types/react': 18.3.3 detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.6.2 @@ -15337,7 +15800,6 @@ packages: { integrity: sha512-5POBdbSkM+3nvJ6ZlyQHsggisfRtyT4tVTo1EIIShs6qCdXJnyWU5TJ68vr8iTg5zpOLjXLRiBqNx+9zwZz/rA==, } - dev: true /validate-npm-package-license@3.0.4: resolution: @@ -15544,6 +16006,196 @@ packages: } engines: {node: '>=0.10.0'} + /volar-service-css@0.0.45(@volar/language-service@2.2.5): + resolution: + { + integrity: sha512-f+AlUI1+kESbcZSVaNJVAnK0c/9Da5StoxzPqA5/8VqUHJWNdubWNnwG5xpFVTfgh6pgTcey3UBhBfHytFaIOg==, + } + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.2.5 + vscode-css-languageservice: 6.2.14 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false + + /volar-service-emmet@0.0.45(@volar/language-service@2.2.5): + resolution: + { + integrity: sha512-9nLXSDkR1vA/3fQkFEsSXAu3XovQxOpTkVG2jilQgfek/K1ZLkaA/WMhN/TtmPmQg4NxE9Ni6mA5udBQ5gVXIA==, + } + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@volar/language-service': 2.2.5 + '@vscode/emmet-helper': 2.9.3 + dev: false + + /volar-service-html@0.0.45(@volar/language-service@2.2.5): + resolution: + { + integrity: sha512-tLTJqfy1v5C4nmeAsfekFIKPl4r4qDMyL0L9MWywr/EApZzPCsbeUGxCqdzxSMC2q7PMCfX2i167txDo+J0LVA==, + } + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.2.5 + vscode-html-languageservice: /@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + dev: false + + /volar-service-prettier@0.0.45(@volar/language-service@2.2.5)(prettier@3.2.5): + resolution: + { + integrity: sha512-+mBS2EsDgp/kunKEBnHvhBwIQm5v2ahw4NKpKdg4sTpXy3UxqHt+Fq/wRYQ7Z8LlNVNRVfp75ThjM+w2zaZBAw==, + } + peerDependencies: + '@volar/language-service': ~2.2.3 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + dependencies: + '@volar/language-service': 2.2.5 + prettier: 3.2.5 + vscode-uri: 3.0.8 + dev: false + + /volar-service-typescript-twoslash-queries@0.0.45(@volar/language-service@2.2.5): + resolution: + { + integrity: sha512-KrPUUvKggZgV9mrDpstCzmf20irgv0ooMv+FGDzIIQUkya+d2+nSS8Mx2h9FvsYgLccUVw5jU3Rhwhd3pv/7qg==, + } + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.2.5 + dev: false + + /volar-service-typescript@0.0.45(@volar/language-service@2.2.5): + resolution: + { + integrity: sha512-i/mMIIAMastJ2kgPo3qvX0Rrl7NyxhIYZ0ug/B4ambZcLPI1vzBgS2fmvyWX3jhBYHh8NmbAotFj+0Y9JtN47A==, + } + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + dependencies: + '@volar/language-service': 2.2.5 + path-browserify: 1.0.1 + semver: 7.6.2 + typescript-auto-import-cache: 0.3.2 + vscode-languageserver-textdocument: 1.0.11 + vscode-nls: 5.2.0 + dev: false + + /vscode-css-languageservice@6.2.14: + resolution: + { + integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==, + } + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + dev: false + + /vscode-html-languageservice@5.2.0: + resolution: + { + integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==, + } + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + dev: false + + /vscode-jsonrpc@8.2.0: + resolution: + { + integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==, + } + engines: {node: '>=14.0.0'} + dev: false + + /vscode-languageserver-protocol@3.17.5: + resolution: + { + integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==, + } + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + dev: false + + /vscode-languageserver-textdocument@1.0.11: + resolution: + { + integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, + } + dev: false + + /vscode-languageserver-types@3.17.5: + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } + dev: false + + /vscode-languageserver@9.0.1: + resolution: + { + integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==, + } + hasBin: true + dependencies: + vscode-languageserver-protocol: 3.17.5 + dev: false + + /vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + dev: false + + /vscode-uri@2.1.2: + resolution: + { + integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==, + } + dev: false + + /vscode-uri@3.0.8: + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } + dev: false + /vue-template-compiler@2.7.16: resolution: {