From 75b3ce98a3820c3a29565ea679022f5c339a148e Mon Sep 17 00:00:00 2001 From: Simeon Griggs Date: Wed, 16 Nov 2022 07:35:52 +0000 Subject: [PATCH] get live preview working --- .env.template | 13 +++- README.md | 10 ++- app/components/Product.tsx | 13 ++-- app/root.tsx | 10 +++ app/routes/$slug.tsx | 47 +++++++----- app/routes/studio/*.tsx | 16 +--- app/sanity/projectDetails.ts | 27 +++++-- app/sanity/sanity.config.ts | 16 ++++ app/sanity/schema/category.ts | 20 +++++ app/sanity/schema/index.ts | 3 +- app/sanity/schema/product.ts | 16 ++++ app/sanity/types/Product.ts | 9 --- app/styles/app.css | 102 ++++++++++++------------- app/types/product.ts | 20 +++++ package-lock.json | 139 +++++++++++++--------------------- package.json | 6 +- tailwind.config.js | 7 +- tsconfig.json | 2 + 18 files changed, 271 insertions(+), 205 deletions(-) create mode 100644 app/sanity/sanity.config.ts create mode 100644 app/sanity/schema/category.ts delete mode 100644 app/sanity/types/Product.ts create mode 100644 app/types/product.ts diff --git a/.env.template b/.env.template index b9ec8bb..0277865 100644 --- a/.env.template +++ b/.env.template @@ -1,3 +1,10 @@ -SANITY_PROJECT_ID=6h1mv88x -SANITY_DATASET=production -SANITY_API_VERSION=2022-09-23 \ No newline at end of file +# These will be added to the window so the Studio can read them +SANITY_PUBLIC_PROJECT_ID="6h1mv88x" +SANITY_PUBLIC_DATASET="production" +SANITY_PUBLIC_API_VERSION="2022-09-23" + +# A random string checked server-side to enable preview mode +SANITY_PREVIEW_SECRET= + +# Generated in sanity.io/manage +SANITY_READ_TOKEN= \ No newline at end of file diff --git a/README.md b/README.md index 9a5aebb..8f4a5be 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,17 @@ ## Includes: +Useful Sanity examples with a light sprinkling of opinionated patterns + - Sanity Studio v3 embedded in the `/studio` route - Styled Components SSR support for the `/studio` route +- Live Preview powered by [@sanity/plugin-kit](https://github.com/sanity-io/preview-kit) - Example Sanity Studio config and schema -- Example Portable Text Component -- Example Image Builder Component +- Example Portable Text Component using [@portabletext/react](https://github.com/portabletext/react-portabletext) +- Example Image Builder Component using [@sanity/image-url](https://github.com/sanity-io/image-url) +- Validated and Typed GROQ query results using [Zod](https://zod.dev/) - eslint and Prettier -- Tailwind CSS for the front-end +- Tailwind CSS with presets by [@sanity/demo](https://github.com/sanity-io/demo) - Tailwind Prose and Prettier plugins ## Development diff --git a/app/components/Product.tsx b/app/components/Product.tsx index dc0fbab..f1bbe04 100644 --- a/app/components/Product.tsx +++ b/app/components/Product.tsx @@ -3,12 +3,11 @@ import {definePreview} from '@sanity/preview-kit' import Layout from '~/components/Layout' import SanityContent from '~/components/SanityContent' -import type {ProductDocument} from '~/sanity/types/Product' import {projectDetails} from '~/sanity/projectDetails' +import type {Product as ProductDocument} from '~/types/product' export default function Product(props: ProductDocument) { - const {title, content, token} = props - const data = usePreview(token, `*[]`) + const {title, content} = props return ( @@ -21,21 +20,19 @@ export default function Product(props: ProductDocument) { } type PreviewProductProps = { - product: ProductDocument query: string params: {[key: string]: string} token: string } const {projectId, dataset} = projectDetails() - const usePreview = definePreview({projectId, dataset}) export function PreviewProduct(props: PreviewProductProps) { - const {product, query, params, token} = props - console.log(`initial data`, product) + const {query, params, token} = props + console.log(props) - const data = usePreview(token, query, params) + const data = usePreview(token ? token : null, query, params) return } diff --git a/app/root.tsx b/app/root.tsx index 833cbe2..13f8222 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -35,6 +35,16 @@ export default function App() { {isStudioRoute && typeof document === 'undefined' ? '__STYLES__' : null} + {isStudioRoute ? null : ( + <> + + + + + )} diff --git a/app/routes/$slug.tsx b/app/routes/$slug.tsx index 8de2409..ddf046a 100644 --- a/app/routes/$slug.tsx +++ b/app/routes/$slug.tsx @@ -1,23 +1,41 @@ -import type {LinksFunction, LoaderArgs} from '@remix-run/node' +import type {LinksFunction, LoaderArgs, ResponseInit} from '@remix-run/node' import {json} from '@remix-run/node' import {useLoaderData} from '@remix-run/react' import groq from 'groq' import {PreviewSuspense} from '@sanity/preview-kit' +import styles from '~/styles/app.css' import Product, {PreviewProduct} from '~/components/Product' import {client} from '~/sanity/client' -import type {ProductDocument} from '~/sanity/types/Product' - -import styles from '~/styles/app.css' +import {productZ} from '~/types/product' export const links: LinksFunction = () => { return [{rel: 'stylesheet', href: styles}] } -export const loader = async ({params}: LoaderArgs) => { - const preview = true - const query = groq`*[_type == "product" && slug.current == $slug][0]` - const product: ProductDocument | null = await client.fetch(query, params) +export const loader = async ({params, request}: LoaderArgs) => { + // If the URL contained a 'secret' query param and it matches the one on the server + const requestUrl = new URL(request.url) + const preview = requestUrl.searchParams.get('secret') === process.env.SANITY_PREVIEW_SECRET + const token = preview ? process.env.SANITY_READ_TOKEN : null + + // TODO: Create a 'session' to store preview authentication + // TODO: Exit-preview route + + const query = groq`*[_type == "product" && slug.current == $slug][0]{ + title, + "slug": slug.current, + images, + content + }` + + const product = await client + // Params from the loader uses the filename + // $slug.tsx has the params { slug: 'hello-world' } + .fetch(query, params) + // Parsed with Zod to validate data at runtime + // and generate a Typescript type + .then((res) => productZ.parse(res)) if (!product) { return new Response('Not found', {status: 404}) @@ -28,22 +46,17 @@ export const loader = async ({params}: LoaderArgs) => { preview, query: preview ? query : null, params: preview ? params : null, + token: preview ? token : null, }) } export default function ProductPage() { - const {product, preview, query, params} = useLoaderData() + const {product, preview, query, params, token} = useLoaderData() if (preview) { return ( - - + }> + ) } diff --git a/app/routes/studio/*.tsx b/app/routes/studio/*.tsx index 8e0ea36..f153f48 100644 --- a/app/routes/studio/*.tsx +++ b/app/routes/studio/*.tsx @@ -1,10 +1,7 @@ import type {LinksFunction, MetaFunction} from '@remix-run/node' import {ClientOnly} from 'remix-utils' -import {Studio, defineConfig} from 'sanity' -import {deskTool} from 'sanity/desk' - -import {projectDetails} from '~/sanity/projectDetails' -import schema from '~/sanity/schema' +import {Studio} from 'sanity' +import {config} from '~/sanity/sanity.config' import styles from '~/styles/studio.css' @@ -13,15 +10,6 @@ export const meta: MetaFunction = () => ({ robots: 'noindex', }) -const config = defineConfig({ - ...projectDetails(), - plugins: [deskTool()], - basePath: `/studio`, - schema: { - types: schema, - }, -}) - export const links: LinksFunction = () => { return [{rel: 'stylesheet', href: styles}] } diff --git a/app/sanity/projectDetails.ts b/app/sanity/projectDetails.ts index c8f6c4a..2748759 100644 --- a/app/sanity/projectDetails.ts +++ b/app/sanity/projectDetails.ts @@ -1,7 +1,20 @@ -export const projectDetails = () => ({ - projectId: - typeof document === 'undefined' ? process.env.SANITY_PROJECT_ID : window?.ENV?.projectId, - dataset: typeof document === 'undefined' ? process.env.SANITY_DATASET : window?.ENV?.dataset, - apiVersion: - typeof document === 'undefined' ? process.env.SANITY_API_VERSION : window?.ENV?.apiVersion, -}) +declare global { + interface Window { + ENV: { + SANITY_PUBLIC_PROJECT_ID: string + SANITY_PUBLIC_DATASET: string + SANITY_PUBLIC_API_VERSION: string + } + } +} + +export const projectDetails = () => { + const {SANITY_PUBLIC_PROJECT_ID, SANITY_PUBLIC_DATASET, SANITY_PUBLIC_API_VERSION} = + typeof document === 'undefined' ? process.env : window.ENV + + return { + projectId: SANITY_PUBLIC_PROJECT_ID ?? `pnkijp0b`, + dataset: SANITY_PUBLIC_DATASET ?? `remix`, + apiVersion: SANITY_PUBLIC_API_VERSION ?? `2022-09-23`, + } +} diff --git a/app/sanity/sanity.config.ts b/app/sanity/sanity.config.ts new file mode 100644 index 0000000..b5d7ee7 --- /dev/null +++ b/app/sanity/sanity.config.ts @@ -0,0 +1,16 @@ +import {defineConfig} from 'sanity' +import {deskTool} from 'sanity/desk' + +import {projectDetails} from '~/sanity/projectDetails' +import schema from '~/sanity/schema' + +export const config = defineConfig({ + ...projectDetails(), + name: 'sanity-remix', + title: 'Sanity Remix', + plugins: [deskTool()], + basePath: `/studio`, + schema: { + types: schema, + }, +}) diff --git a/app/sanity/schema/category.ts b/app/sanity/schema/category.ts new file mode 100644 index 0000000..16f8c4f --- /dev/null +++ b/app/sanity/schema/category.ts @@ -0,0 +1,20 @@ +import {defineType, defineField} from 'sanity' + +export default defineType({ + name: 'category', + title: 'Category', + type: 'document', + fields: [ + defineField({ + name: 'title', + type: 'string', + }), + defineField({ + name: 'slug', + type: 'slug', + options: { + source: 'title', + }, + }), + ], +}) diff --git a/app/sanity/schema/index.ts b/app/sanity/schema/index.ts index 0f9fd04..e411b95 100644 --- a/app/sanity/schema/index.ts +++ b/app/sanity/schema/index.ts @@ -1,3 +1,4 @@ +import category from './category' import product from './product' -export default [product] +export default [product, category] diff --git a/app/sanity/schema/product.ts b/app/sanity/schema/product.ts index 44b4f3c..e03d78e 100644 --- a/app/sanity/schema/product.ts +++ b/app/sanity/schema/product.ts @@ -21,5 +21,21 @@ export default defineType({ type: 'array' as const, of: [{type: 'block'}, {type: 'image'}], }), + defineField({ + name: 'images', + type: 'array', + of: [ + defineField({ + name: 'image', + type: 'image', + options: {hotspot: true}, + }), + ], + }), + defineField({ + name: 'category', + type: 'reference', + to: [{type: 'category'}], + }), ], }) diff --git a/app/sanity/types/Product.ts b/app/sanity/types/Product.ts deleted file mode 100644 index 3fbc3ae..0000000 --- a/app/sanity/types/Product.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type {Block, SanityDocumentLike} from 'sanity' - -export type ProductDocument = SanityDocumentLike & { - title?: string - slug?: { - current?: string - } - content?: Block[] -} diff --git a/app/styles/app.css b/app/styles/app.css index 296a764..172c479 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -16,7 +16,7 @@ /* 2 */ border-style: solid; /* 2 */ - border-color: #e5e7eb; + border-color: #ced2d9; /* 2 */ } @@ -43,7 +43,7 @@ html { -o-tab-size: 4; tab-size: 4; /* 3 */ - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Liberation Sans", Helvetica, Arial, system-ui, sans-serif; /* 4 */ font-feature-settings: normal; /* 5 */ @@ -126,7 +126,7 @@ code, kbd, samp, pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-family: IBM Plex Mono, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace; /* 1 */ font-size: 1em; /* 2 */ @@ -354,7 +354,7 @@ textarea { input::-moz-placeholder, textarea::-moz-placeholder { opacity: 1; /* 1 */ - color: #9ca3af; + color: #9ea6b3; /* 2 */ } @@ -362,7 +362,7 @@ input::placeholder, textarea::placeholder { opacity: 1; /* 1 */ - color: #9ca3af; + color: #9ea6b3; /* 2 */ } @@ -441,7 +441,7 @@ video { --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-color: rgb(34 118 252 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; @@ -488,7 +488,7 @@ video { --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-color: rgb(34 118 252 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; @@ -650,8 +650,8 @@ video { } .prose :where(blockquote):not(:where([class~="not-prose"] *)) { - font-weight: 500; - font-style: italic; + font-weight: inherit; + font-style: normal; color: var(--tw-prose-quotes); border-left-width: 0.25rem; border-left-color: var(--tw-prose-quote-borders); @@ -868,38 +868,38 @@ video { } .prose { - --tw-prose-body: #374151; - --tw-prose-headings: #111827; - --tw-prose-lead: #4b5563; - --tw-prose-links: #111827; - --tw-prose-bold: #111827; - --tw-prose-counters: #6b7280; - --tw-prose-bullets: #d1d5db; - --tw-prose-hr: #e5e7eb; - --tw-prose-quotes: #111827; - --tw-prose-quote-borders: #e5e7eb; - --tw-prose-captions: #6b7280; - --tw-prose-code: #111827; - --tw-prose-pre-code: #e5e7eb; - --tw-prose-pre-bg: #1f2937; - --tw-prose-th-borders: #d1d5db; - --tw-prose-td-borders: #e5e7eb; - --tw-prose-invert-body: #d1d5db; + --tw-prose-body: #101112; + --tw-prose-headings: #101112; + --tw-prose-lead: #101112; + --tw-prose-links: #101112; + --tw-prose-bold: #101112; + --tw-prose-counters: #101112; + --tw-prose-bullets: #101112; + --tw-prose-hr: #101112; + --tw-prose-quotes: #101112; + --tw-prose-quote-borders: #101112; + --tw-prose-captions: #101112; + --tw-prose-code: #101112; + --tw-prose-pre-code: #fff; + --tw-prose-pre-bg: #101112; + --tw-prose-th-borders: #101112; + --tw-prose-td-borders: #101112; + --tw-prose-invert-body: #fff; --tw-prose-invert-headings: #fff; - --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-lead: #fff; --tw-prose-invert-links: #fff; --tw-prose-invert-bold: #fff; - --tw-prose-invert-counters: #9ca3af; - --tw-prose-invert-bullets: #4b5563; - --tw-prose-invert-hr: #374151; - --tw-prose-invert-quotes: #f3f4f6; - --tw-prose-invert-quote-borders: #374151; - --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-counters: #fff; + --tw-prose-invert-bullets: #fff; + --tw-prose-invert-hr: #fff; + --tw-prose-invert-quotes: #fff; + --tw-prose-invert-quote-borders: #fff; + --tw-prose-invert-captions: #fff; --tw-prose-invert-code: #fff; - --tw-prose-invert-pre-code: #d1d5db; - --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); - --tw-prose-invert-th-borders: #4b5563; - --tw-prose-invert-td-borders: #374151; + --tw-prose-invert-pre-code: #101112; + --tw-prose-invert-pre-bg: #fff; + --tw-prose-invert-th-borders: #fff; + --tw-prose-invert-td-borders: #fff; font-size: 1rem; line-height: 1.75; } @@ -1011,11 +1011,11 @@ video { } .mt-6 { - margin-top: 1.5rem; + margin-top: 52px; } .mb-6 { - margin-bottom: 1.5rem; + margin-bottom: 52px; } .block { @@ -1059,19 +1059,19 @@ video { } .gap-6 { - gap: 1.5rem; + gap: 52px; } .gap-4 { - gap: 1rem; + gap: 20px; } .rounded { - border-radius: 0.25rem; + border-radius: 3px; } .rounded-lg { - border-radius: 0.5rem; + border-radius: 9px; } .bg-white { @@ -1081,16 +1081,16 @@ video { .bg-green-100 { --tw-bg-opacity: 1; - background-color: rgb(220 252 231 / var(--tw-bg-opacity)); + background-color: rgb(208 244 220 / var(--tw-bg-opacity)); } .bg-gray-50 { --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); + background-color: rgb(242 243 245 / var(--tw-bg-opacity)); } .p-6 { - padding: 1.5rem; + padding: 52px; } .text-center { @@ -1117,12 +1117,12 @@ video { .text-green-600 { --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity)); + color: rgb(50 148 84 / var(--tw-text-opacity)); } .text-green-700 { --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity)); + color: rgb(41 115 67 / var(--tw-text-opacity)); } .underline { @@ -1137,12 +1137,12 @@ video { .hover\:text-green-400:hover { --tw-text-opacity: 1; - color: rgb(74 222 128 / var(--tw-text-opacity)); + color: rgb(67 214 117 / var(--tw-text-opacity)); } .prose-a\:text-green-600 :is(:where(a):not(:where([class~="not-prose"] *))) { --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity)); + color: rgb(50 148 84 / var(--tw-text-opacity)); } @media (min-width: 768px) { @@ -1255,7 +1255,7 @@ video { line-height: 1.7777778; margin-top: 2em; margin-bottom: 2em; - border-radius: 0.5rem; + border-radius: 0.1875rem; padding-top: 1.1111111em; padding-right: 1.3333333em; padding-bottom: 1.1111111em; diff --git a/app/types/product.ts b/app/types/product.ts new file mode 100644 index 0000000..29f5aa2 --- /dev/null +++ b/app/types/product.ts @@ -0,0 +1,20 @@ +import {z} from 'zod' + +// This is a Zod schema +// https://zod.dev/ + +// It will validate data at run time +// And generate Types during development +// Giving you both the flexibility of writing GROQ queries +// And the safety of Typescript +// without being limited to the shape of your Sanity Schema +export const productZ = z.object({ + title: z.string(), + slug: z.string(), + images: z.array(z.any()), + content: z.array(z.any()), +}) + +export type Product = z.infer + +export const productsZ = z.array(productZ) diff --git a/package-lock.json b/package-lock.json index 0ed8cde..d13e0e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,9 @@ "@remix-run/react": "^1.7.0", "@remix-run/serve": "^1.7.0", "@sanity/asset-utils": "^1.3.0", + "@sanity/demo": "^1.0.0", "@sanity/image-url": "^1.0.1", - "@sanity/preview-kit": "^1.2.0-add-type-allowlist.2", + "@sanity/preview-kit": "^1.2.2", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "groq": "^2.33.2", @@ -20,7 +21,8 @@ "react-dom": "^18.2.0", "remix-utils": "^4.1.0", "sanity": "dev-preview", - "styled-components": "^5.3.5" + "styled-components": "^5.3.5", + "zod": "^3.19.1" }, "devDependencies": { "@remix-run/dev": "^1.7.0", @@ -2867,6 +2869,15 @@ "resolved": "https://registry.npmjs.org/@sanity/color/-/color-2.1.16.tgz", "integrity": "sha512-R5Wh4qt+Jv20nvwSwE5xA+eS3kF2diPA6noAPQZSUsSG9UIUGGgxJyU0hWUa9O06RTCNqgBQI1YJiZTeJ6S7SA==" }, + "node_modules/@sanity/demo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sanity/demo/-/demo-1.0.0.tgz", + "integrity": "sha512-o415Q12oITx+FxSyIeBtx6K645rQoTatJVi3PYRQx5VyH5vWw5GAwNpDpWHvYrmV2QX1DE1BM4TE2MV8riKqzw==", + "peerDependencies": { + "@sanity/color": "^2", + "tailwindcss": "^3" + } + }, "node_modules/@sanity/diff": { "version": "3.0.0-rc.2", "resolved": "https://registry.npmjs.org/@sanity/diff/-/diff-3.0.0-rc.2.tgz", @@ -3005,9 +3016,9 @@ "integrity": "sha512-wtMYcV5GIDIhVyF/jjmdwq1GdlK07dRL40XMns73VbrFI7FteRltxv48bhYVZPcLkRXb0SHjpDS/icj9/yzbVA==" }, "node_modules/@sanity/groq-store": { - "version": "1.1.0-add-type-allowlist.1", - "resolved": "https://registry.npmjs.org/@sanity/groq-store/-/groq-store-1.1.0-add-type-allowlist.1.tgz", - "integrity": "sha512-Nga7UQPhttFTxEHZnHIo7gvIVcl3x9W/Yo7PRxfOewZuwLUmypzOBdGjWYRHIvTtVAgA1+DGuxpopsoCn5DMXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@sanity/groq-store/-/groq-store-1.1.2.tgz", + "integrity": "sha512-ZIpj1pU/4Rm9gq3nqcTbifJkmY3ViNqWbXtTDK2+d3W84jlXE+6k5jacPr2xI8A3ZsFd+H5j/zADH2vuSy1ldg==", "dependencies": { "@sanity/types": "^2.35.0", "eventsource": "^2.0.2", @@ -3289,14 +3300,14 @@ } }, "node_modules/@sanity/preview-kit": { - "version": "1.2.0-add-type-allowlist.2", - "resolved": "https://registry.npmjs.org/@sanity/preview-kit/-/preview-kit-1.2.0-add-type-allowlist.2.tgz", - "integrity": "sha512-6fbr+o16dAEdkcQopQs9Lwut2SI6FoIYl4/PfhuceIY1No5pwI/5htmU6e8DkdfNGHZOmovURn3WUMkM7vRWpA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@sanity/preview-kit/-/preview-kit-1.2.6.tgz", + "integrity": "sha512-Y2ZVMSrnJmnXY9DMjoGNIhLDjsLpZRLEvP2ZwodPJp2NGc0+FVu9rSzYoFdbT82VZCSs+iejyMXsZjogITygDw==", "dependencies": { - "@sanity/groq-store": "1.1.0-add-type-allowlist.1", + "@sanity/groq-store": "^1.1.2", "@types/event-source-polyfill": "^1.0.0", "event-source-polyfill": "^1.0.31", - "suspend-react": "^0.0.8" + "suspend-react": "0.0.8" }, "engines": { "node": ">=14" @@ -4238,7 +4249,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, "dependencies": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", @@ -4249,7 +4259,6 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -4261,7 +4270,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -4415,8 +4423,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -5119,7 +5126,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -5956,7 +5962,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -6250,7 +6255,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6331,7 +6335,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, "dependencies": { "acorn-node": "^1.8.2", "defined": "^1.0.0", @@ -6347,8 +6350,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff": { "version": "5.1.0", @@ -6390,8 +6392,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -10872,7 +10873,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, "engines": { "node": ">=10" } @@ -12652,7 +12652,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -13383,7 +13382,6 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -13400,7 +13398,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -13419,7 +13416,6 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" @@ -13448,7 +13444,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -13467,7 +13462,6 @@ "version": "6.0.10", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13761,7 +13755,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, "engines": { "node": ">=10" }, @@ -13957,7 +13950,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -13966,7 +13958,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16216,7 +16207,6 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", - "dev": true, "dependencies": { "arg": "^5.0.2", "chokidar": "^3.5.3", @@ -16257,7 +16247,6 @@ "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -16273,7 +16262,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -16285,7 +16273,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -18020,7 +18007,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } @@ -18091,7 +18077,6 @@ "version": "3.19.1", "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -20150,6 +20135,12 @@ "resolved": "https://registry.npmjs.org/@sanity/color/-/color-2.1.16.tgz", "integrity": "sha512-R5Wh4qt+Jv20nvwSwE5xA+eS3kF2diPA6noAPQZSUsSG9UIUGGgxJyU0hWUa9O06RTCNqgBQI1YJiZTeJ6S7SA==" }, + "@sanity/demo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sanity/demo/-/demo-1.0.0.tgz", + "integrity": "sha512-o415Q12oITx+FxSyIeBtx6K645rQoTatJVi3PYRQx5VyH5vWw5GAwNpDpWHvYrmV2QX1DE1BM4TE2MV8riKqzw==", + "requires": {} + }, "@sanity/diff": { "version": "3.0.0-rc.2", "resolved": "https://registry.npmjs.org/@sanity/diff/-/diff-3.0.0-rc.2.tgz", @@ -20276,9 +20267,9 @@ "integrity": "sha512-wtMYcV5GIDIhVyF/jjmdwq1GdlK07dRL40XMns73VbrFI7FteRltxv48bhYVZPcLkRXb0SHjpDS/icj9/yzbVA==" }, "@sanity/groq-store": { - "version": "1.1.0-add-type-allowlist.1", - "resolved": "https://registry.npmjs.org/@sanity/groq-store/-/groq-store-1.1.0-add-type-allowlist.1.tgz", - "integrity": "sha512-Nga7UQPhttFTxEHZnHIo7gvIVcl3x9W/Yo7PRxfOewZuwLUmypzOBdGjWYRHIvTtVAgA1+DGuxpopsoCn5DMXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@sanity/groq-store/-/groq-store-1.1.2.tgz", + "integrity": "sha512-ZIpj1pU/4Rm9gq3nqcTbifJkmY3ViNqWbXtTDK2+d3W84jlXE+6k5jacPr2xI8A3ZsFd+H5j/zADH2vuSy1ldg==", "requires": { "@sanity/types": "^2.35.0", "eventsource": "^2.0.2", @@ -20532,14 +20523,14 @@ } }, "@sanity/preview-kit": { - "version": "1.2.0-add-type-allowlist.2", - "resolved": "https://registry.npmjs.org/@sanity/preview-kit/-/preview-kit-1.2.0-add-type-allowlist.2.tgz", - "integrity": "sha512-6fbr+o16dAEdkcQopQs9Lwut2SI6FoIYl4/PfhuceIY1No5pwI/5htmU6e8DkdfNGHZOmovURn3WUMkM7vRWpA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@sanity/preview-kit/-/preview-kit-1.2.6.tgz", + "integrity": "sha512-Y2ZVMSrnJmnXY9DMjoGNIhLDjsLpZRLEvP2ZwodPJp2NGc0+FVu9rSzYoFdbT82VZCSs+iejyMXsZjogITygDw==", "requires": { - "@sanity/groq-store": "1.1.0-add-type-allowlist.1", + "@sanity/groq-store": "^1.1.2", "@types/event-source-polyfill": "^1.0.0", "event-source-polyfill": "^1.0.31", - "suspend-react": "^0.0.8" + "suspend-react": "0.0.8" } }, "@sanity/schema": { @@ -21298,7 +21289,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, "requires": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", @@ -21308,14 +21298,12 @@ "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" } } }, @@ -21430,8 +21418,7 @@ "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "2.0.1", @@ -21949,8 +21936,7 @@ "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "camelize": { "version": "1.0.1", @@ -22572,8 +22558,7 @@ "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssom": { "version": "0.5.0", @@ -22794,8 +22779,7 @@ "defined": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" }, "degenerator": { "version": "3.0.2", @@ -22851,7 +22835,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, "requires": { "acorn-node": "^1.8.2", "defined": "^1.0.0", @@ -22861,8 +22844,7 @@ "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "diff": { "version": "5.1.0", @@ -22891,8 +22873,7 @@ "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "doctrine": { "version": "3.0.0", @@ -26149,8 +26130,7 @@ "lilconfig": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" }, "lines-and-columns": { "version": "1.2.4", @@ -27406,8 +27386,7 @@ "object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, "object-inspect": { "version": "1.12.2", @@ -27933,7 +27912,6 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, "requires": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -27944,7 +27922,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, "requires": { "camelcase-css": "^2.0.1" } @@ -27953,7 +27930,6 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, "requires": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" @@ -27963,7 +27939,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "dev": true, "requires": { "postcss-selector-parser": "^6.0.10" } @@ -27972,7 +27947,6 @@ "version": "6.0.10", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -28194,8 +28168,7 @@ "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, "raf": { "version": "3.4.1", @@ -28337,7 +28310,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "requires": { "pify": "^2.3.0" }, @@ -28345,8 +28317,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" } } }, @@ -30149,7 +30120,6 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", - "dev": true, "requires": { "arg": "^5.0.2", "chokidar": "^3.5.3", @@ -30180,7 +30150,6 @@ "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -30193,7 +30162,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -30204,7 +30172,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "requires": { "is-glob": "^4.0.3" } @@ -31395,8 +31362,7 @@ "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "17.6.2", @@ -31447,8 +31413,7 @@ "zod": { "version": "3.19.1", "resolved": "https://registry.npmjs.org/zod/-/zod-3.19.1.tgz", - "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==", - "peer": true + "integrity": "sha512-LYjZsEDhCdYET9ikFu6dVPGp2YH9DegXjdJToSzD9rO6fy4qiRYFoyEYwps88OseJlPyl2NOe2iJuhEhL7IpEA==" }, "zwitch": { "version": "2.0.3", diff --git a/package.json b/package.json index b5d4741..1840542 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,9 @@ "@remix-run/react": "^1.7.0", "@remix-run/serve": "^1.7.0", "@sanity/asset-utils": "^1.3.0", + "@sanity/demo": "^1.0.0", "@sanity/image-url": "^1.0.1", - "@sanity/preview-kit": "^1.2.0-add-type-allowlist.2", + "@sanity/preview-kit": "^1.2.2", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", "groq": "^2.33.2", @@ -23,7 +24,8 @@ "react-dom": "^18.2.0", "remix-utils": "^4.1.0", "sanity": "dev-preview", - "styled-components": "^5.3.5" + "styled-components": "^5.3.5", + "zod": "^3.19.1" }, "devDependencies": { "@remix-run/dev": "^1.7.0", diff --git a/tailwind.config.js b/tailwind.config.js index d4b5c61..c7da81b 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,8 +1,9 @@ /** @type {import('tailwindcss').Config} */ + +const {theme} = require('@sanity/demo/tailwind') + module.exports = { content: ['./app/**/*.{js,ts,jsx,tsx}'], - theme: { - extend: {}, - }, + theme, plugins: [require('@tailwindcss/typography')], } diff --git a/tsconfig.json b/tsconfig.json index 20f8a38..0919007 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,12 @@ { "include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"], "compilerOptions": { + "skipLibCheck": true, "lib": ["DOM", "DOM.Iterable", "ES2019"], "isolatedModules": true, "esModuleInterop": true, "jsx": "react-jsx", + "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "target": "ES2019",