From 6b0efea07cd42aaea3844b5c6e5e060a2c2e9f00 Mon Sep 17 00:00:00 2001 From: Jack Merrill Date: Tue, 13 Jun 2023 22:57:59 -0500 Subject: [PATCH] getting closer :eyes: --- next.config.js | 8 +- package.json | 2 + sanity/schemas/post.ts | 86 ++++++------ sanity/schemas/project.ts | 3 + src/app/@blogpost/(.)blog/[id]/page.tsx | 122 ++++++++++++++++++ src/app/@blogpost/default.tsx | 3 + src/app/@project/(.)projects/[id]/page.tsx | 17 ++- src/app/about/page.tsx | 51 ++++++++ src/app/blog/[id]/page.tsx | 86 ++++++++++++ src/app/blog/page.tsx | 86 ++++++++++++ src/app/internal/studio/[[...index]]/page.tsx | 12 +- src/app/layout.tsx | 4 + src/app/projects/[id]/page.tsx | 87 ++++++++++++- src/app/projects/page.tsx | 86 ++++++++++++ src/components/ClientComponent.tsx | 9 ++ src/components/Codeblock.tsx | 2 + src/components/Navbar.tsx | 41 +++--- src/components/SidecardList.tsx | 63 +++++++++ tailwind.config.js | 23 ++++ yarn.lock | 101 +++++++++++++++ 20 files changed, 827 insertions(+), 65 deletions(-) create mode 100644 src/app/@blogpost/(.)blog/[id]/page.tsx create mode 100644 src/app/@blogpost/default.tsx create mode 100644 src/app/about/page.tsx create mode 100644 src/app/blog/[id]/page.tsx create mode 100644 src/app/blog/page.tsx create mode 100644 src/app/projects/page.tsx create mode 100644 src/components/ClientComponent.tsx create mode 100644 src/components/SidecardList.tsx diff --git a/next.config.js b/next.config.js index 767719f..3dcc307 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,8 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + images: { + domains: ["cdn.sanity.io"], + }, +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/package.json b/package.json index e739caa..732b657 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@radix-ui/react-dropdown-menu": "^2.0.4", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-navigation-menu": "^1.1.2", + "@radix-ui/react-tooltip": "^1.0.6", "@sanity/image-url": "^1.0.2", "@sanity/vision": "^3.11.2", "@tailwindcss/typography": "^0.5.9", @@ -31,6 +32,7 @@ "lucide-react": "^0.220.0", "next": "13.4.3", "next-sanity": "^4.3.3", + "next-sanity-image": "^6.0.0", "postcss": "8.4.23", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/sanity/schemas/post.ts b/sanity/schemas/post.ts index 485330f..cc91fa8 100644 --- a/sanity/schemas/post.ts +++ b/sanity/schemas/post.ts @@ -1,72 +1,80 @@ -import {defineField, defineType} from 'sanity' +import { defineField, defineType } from "sanity"; export default defineType({ - name: 'post', - title: 'Post', - type: 'document', + name: "post", + title: "Post", + type: "document", fields: [ defineField({ - name: 'title', - title: 'Title', - type: 'string', + name: "title", + title: "Title", + type: "string", }), defineField({ - name: 'slug', - title: 'Slug', - type: 'slug', + name: "subtitle", + title: "Subtitle", + type: "string", + }), + defineField({ + name: "slug", + title: "Slug", + type: "slug", options: { - source: 'title', + source: "title", maxLength: 96, }, }), defineField({ - name: 'author', - title: 'Author', - type: 'reference', - to: {type: 'author'}, + name: "author", + title: "Author", + type: "reference", + to: { type: "author" }, }), defineField({ - name: 'mainImage', - title: 'Main image', - type: 'image', + name: "mainImage", + title: "Main image", + type: "image", options: { hotspot: true, }, fields: [ { - name: 'alt', - type: 'string', - title: 'Alternative Text', - } - ] + name: "alt", + type: "string", + title: "Alternative Text", + }, + ], }), defineField({ - name: 'categories', - title: 'Categories', - type: 'array', - of: [{type: 'reference', to: {type: 'category'}}], + name: "categories", + title: "Categories", + type: "array", + of: [{ type: "reference", to: { type: "category" } }], }), defineField({ - name: 'publishedAt', - title: 'Published at', - type: 'datetime', + name: "publishedAt", + title: "Published at", + type: "datetime", }), defineField({ - name: 'body', - title: 'Body', - type: 'blockContent', + name: "content", + title: "Body", + type: "markdown", + options: { + imageUrl: (imageAsset) => `${imageAsset.url}`, + }, }), ], preview: { select: { - title: 'title', - author: 'author.name', - media: 'mainImage', + title: "title", + author: "author.name", + media: "mainImage", }, prepare(selection) { - const {author} = selection - return {...selection, subtitle: author && `by ${author}`} + const { author } = selection; + return { ...selection, subtitle: author && `by ${author}` }; }, }, -}) +}); diff --git a/sanity/schemas/project.ts b/sanity/schemas/project.ts index b9184c9..8c45992 100644 --- a/sanity/schemas/project.ts +++ b/sanity/schemas/project.ts @@ -60,6 +60,9 @@ export default defineType({ name: "content", title: "Body", type: "markdown", + options: { + imageUrl: (imageAsset) => `${imageAsset.url}`, + }, }), ], diff --git a/src/app/@blogpost/(.)blog/[id]/page.tsx b/src/app/@blogpost/(.)blog/[id]/page.tsx new file mode 100644 index 0000000..27c1402 --- /dev/null +++ b/src/app/@blogpost/(.)blog/[id]/page.tsx @@ -0,0 +1,122 @@ +"use client"; + +import React from "react"; +import * as Dialog from "@radix-ui/react-dialog"; +import { Cross2Icon } from "@radix-ui/react-icons"; +import { useRouter } from "next/navigation"; +import { q } from "groqd"; +import { client } from "../../../../../sanity/lib/client"; +import { cn } from "@/lib/utils"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import rehypeRaw from "rehype-raw"; +import CodeBlock from "@/components/Codeblock"; +import Image from "next/image"; +import { useNextSanityImage } from "next-sanity-image"; + +type BlogPost = { + title: string; + subtitle: string; + slug: string; + publishedAt: Date; + content: string; +}; + +export default function BlogPostModal({ + params: { id: slug }, +}: { + params: { + id: string; + }; +}) { + const router = useRouter(); + const [post, setPost] = React.useState(null); + const handleOpenChange = (open: boolean) => { + if (!open) { + router.back(); + } + }; + + React.useEffect(() => { + async function getPost() { + const { query, schema } = q("*") + .filterByType("post") + .filter(`slug.current == "${slug}"`) + .grab$({ + title: q.string(), + subtitle: q.string(), + slug: q.slug("slug"), + publishedAt: q.date(), + content: q.string(), + }) + .slice(0, 1); + + const post = schema.parse(await client.fetch(query)); + + setPost(post[0]); + } + getPost(); + }, [slug]); + + return ( + + + + + + {post?.title} + + + {post?.subtitle} + + +
+ { + const { width, height } = props.src.match( + /(?\d+)x(?\d+)/ + ).groups; + return ( + {props.alt} + ); + }, + } as any + } + > + {post?.content || ""} + +
+ + + + +
+
+
+ ); +} diff --git a/src/app/@blogpost/default.tsx b/src/app/@blogpost/default.tsx new file mode 100644 index 0000000..6ddf1b7 --- /dev/null +++ b/src/app/@blogpost/default.tsx @@ -0,0 +1,3 @@ +export default function Default() { + return null; +} diff --git a/src/app/@project/(.)projects/[id]/page.tsx b/src/app/@project/(.)projects/[id]/page.tsx index 1bf049d..3be94fe 100644 --- a/src/app/@project/(.)projects/[id]/page.tsx +++ b/src/app/@project/(.)projects/[id]/page.tsx @@ -11,13 +11,14 @@ import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import rehypeRaw from "rehype-raw"; import CodeBlock from "@/components/Codeblock"; +import Image from "next/image"; +import { useNextSanityImage } from "next-sanity-image"; type Project = { title: string; subtitle: string; slug: string; publishedAt: Date; - mainImage: string; content: string; }; @@ -46,7 +47,6 @@ export default function ProjectModal({ subtitle: q.string(), slug: q.slug("slug"), publishedAt: q.date(), - mainImage: q("mainImage").grabOne$("asset->url", q.string()), content: q.string(), }) .slice(0, 1); @@ -87,6 +87,19 @@ export default function ProjectModal({ components={ { code: CodeBlock, + img: ({ ...props }) => { + const { width, height } = props.src.match( + /(?\d+)x(?\d+)/ + ).groups; + return ( + {props.alt} + ); + }, } as any } > diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx new file mode 100644 index 0000000..4d9e84d --- /dev/null +++ b/src/app/about/page.tsx @@ -0,0 +1,51 @@ +import Logo from "@/components/Logo"; +import SidecardList from "@/components/SidecardList"; +import { IdCardIcon } from "@radix-ui/react-icons"; +import Image from "next/image"; +import Link from "next/link"; + +export default async function Page() { + return ( +
+
+

Hey! I'm Jack Merrill.

+ +

+ I'm a software engineer, designer, and student from the United + States. I'm working to bring accessible designs to the masses. +

+
+ +
+
+
+ +
+
+ + +
+ +
+

About Me

+ +

+ I'm a Division II (sophomore) student at Hampshire College, + studying interaction design. I'm also a full-stack web developer + at{" "} + + Merch + + . +

+ +

+
+
+ ); +} diff --git a/src/app/blog/[id]/page.tsx b/src/app/blog/[id]/page.tsx new file mode 100644 index 0000000..39f6bef --- /dev/null +++ b/src/app/blog/[id]/page.tsx @@ -0,0 +1,86 @@ +import { q } from "groqd"; +import { client } from "../../../../sanity/lib/client"; +import ReactMarkdown from "react-markdown"; +import CodeBlock from "@/components/Codeblock"; +import Image from "next/image"; +import remarkGfm from "remark-gfm"; +import rehypeRaw from "rehype-raw"; + +export default async function Page({ + params: { id: slug }, +}: { + params: { id: string }; +}) { + const { query, schema } = q("*") + .filterByType("post") + .filter(`slug.current == "${slug}"`) + .grab$({ + title: q.string(), + subtitle: q.string(), + slug: q.slug("slug"), + publishedAt: q.date(), + content: q.string(), + mainImage: q("mainImage").grabOne$("asset->url", q.string()), + }) + .slice(0, 1); + + const post = schema.parse(await client.fetch(query))[0]; + + const r = post.mainImage.match(/(?\d+)x(?\d+)/); + + return ( +
+
+ {/* the mainimage with the text on top of it */} +
+
+
+

+ {post.title} +

+ +

+ {post.subtitle} +

+
+
+ {post.title} +
+
+ + {/* the content */} +
+ { + const { width, height } = props.src.match( + /(?\d+)x(?\d+)/ + ).groups; + return ( + {props.alt} + ); + }, + } as any + } + > + {post?.content || ""} + +
+
+ ); +} diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx new file mode 100644 index 0000000..1d8ca5f --- /dev/null +++ b/src/app/blog/page.tsx @@ -0,0 +1,86 @@ +import { q } from "groqd"; +import { client } from "../../../sanity/lib/client"; +import Twemoji from "@/components/Twemoji"; +import Image from "next/image"; +import Link from "next/link"; + +export default async function Page() { + const { query, schema } = q("*") + .filterByType("post") + .order("publishedAt desc") + .grab$({ + title: q.string(), + subtitle: q.string(), + slug: q.slug("slug"), + publishedAt: q.date(), + mainImage: q("mainImage").grabOne$("asset->url", q.string()), + categories: q("categories") + .filter() + .deref() + .grabOne$("title", q.string()), + }); + + const posts = schema.parse(await client.fetch(query)); + + return ( +
+
+
+

+ Blog +

+

+ My thoughts on web, tech, and life. (other things too) +

+
+
+ +
+
+ {posts.map((post) => { + const r = post.mainImage.match(/(?\d+)x(?\d+)/); + + return ( + + {post.title} +

{post.title}

+

{post.subtitle}

+ +

+ Categories: + {post.categories.map((category) => ( + + {category} + + ))} +

+ +
+ +
+ + ); + })} +
+
+
+ ); +} diff --git a/src/app/internal/studio/[[...index]]/page.tsx b/src/app/internal/studio/[[...index]]/page.tsx index 70c35cd..027c14e 100644 --- a/src/app/internal/studio/[[...index]]/page.tsx +++ b/src/app/internal/studio/[[...index]]/page.tsx @@ -1,4 +1,4 @@ -'use client' +"use client"; /** * This route is responsible for the built-in authoring environment using Sanity Studio. @@ -9,9 +9,11 @@ * https://github.com/sanity-io/next-sanity */ -import { NextStudio } from 'next-sanity/studio' -import config from '../../../../../sanity.config' +import { NextStudio } from "next-sanity/studio"; +import config from "../../../../../sanity.config"; + +const isDev = process.env.NODE_ENV === "development" || !process.env.NODE_ENV; export default function StudioPage() { - return -} \ No newline at end of file + return isDev ? : null; +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2247498..c3cc330 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -24,9 +24,11 @@ export const metadata = { export default async function RootLayout({ children, project, + blogpost, }: { children: React.ReactNode; project?: React.ReactNode; + blogpost?: React.ReactNode; }) { const { query: projectQuery, schema: projectSchema } = q("*") .filterByType("project") @@ -37,6 +39,7 @@ export default async function RootLayout({ subtitle: q.string(), slug: q.slug("slug"), publishedAt: q.date(), + mainImage: q("mainImage").grabOne$("asset->url", q.string()), }); const { query: blogQuery, schema: blogSchema } = q("*") @@ -110,6 +113,7 @@ export default async function RootLayout({ {project} + {blogpost} ); diff --git a/src/app/projects/[id]/page.tsx b/src/app/projects/[id]/page.tsx index b701358..1bc6ea1 100644 --- a/src/app/projects/[id]/page.tsx +++ b/src/app/projects/[id]/page.tsx @@ -1,3 +1,86 @@ -export default function Project() { - return

This is a placeholder for the project page.

; +import { q } from "groqd"; +import { client } from "../../../../sanity/lib/client"; +import ReactMarkdown from "react-markdown"; +import CodeBlock from "@/components/Codeblock"; +import Image from "next/image"; +import remarkGfm from "remark-gfm"; +import rehypeRaw from "rehype-raw"; + +export default async function Page({ + params: { id: slug }, +}: { + params: { id: string }; +}) { + const { query: projectQuery, schema: projectSchema } = q("*") + .filterByType("project") + .filter(`slug.current == "${slug}"`) + .grab$({ + title: q.string(), + subtitle: q.string(), + slug: q.slug("slug"), + publishedAt: q.date(), + content: q.string(), + mainImage: q("mainImage").grabOne$("asset->url", q.string()), + }) + .slice(0, 1); + + const project = projectSchema.parse(await client.fetch(projectQuery))[0]; + + const r = project.mainImage.match(/(?\d+)x(?\d+)/); + + return ( +
+
+ {/* the mainimage with the text on top of it */} +
+
+
+

+ {project.title} +

+ +

+ {project.subtitle} +

+
+
+ {project.title} +
+
+ + {/* the content */} +
+ { + const { width, height } = props.src.match( + /(?\d+)x(?\d+)/ + ).groups; + return ( + {props.alt} + ); + }, + } as any + } + > + {project?.content || ""} + +
+
+ ); } diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx new file mode 100644 index 0000000..f1859e7 --- /dev/null +++ b/src/app/projects/page.tsx @@ -0,0 +1,86 @@ +import { q } from "groqd"; +import { client } from "../../../sanity/lib/client"; +import Twemoji from "@/components/Twemoji"; +import Image from "next/image"; +import Link from "next/link"; + +export default async function Page() { + const { query: projectQuery, schema: projectSchema } = q("*") + .filterByType("project") + .order("publishedAt desc") + .grab$({ + title: q.string(), + subtitle: q.string(), + slug: q.slug("slug"), + publishedAt: q.date(), + mainImage: q("mainImage").grabOne$("asset->url", q.string()), + categories: q("categories") + .filter() + .deref() + .grabOne$("title", q.string()), + }); + + const projects = projectSchema.parse(await client.fetch(projectQuery)); + + return ( +
+
+
+

+ Projects +

+

+ The weird and wonderful things I work on. +

+
+
+ +
+
+ {projects.map((project) => { + const r = project.mainImage.match(/(?\d+)x(?\d+)/); + + return ( + + {project.title} +

{project.title}

+

{project.subtitle}

+ +

+ Categories: + {project.categories.map((category) => ( + + {category} + + ))} +

+ +
+ +
+ + ); + })} +
+
+
+ ); +} diff --git a/src/components/ClientComponent.tsx b/src/components/ClientComponent.tsx new file mode 100644 index 0000000..886a509 --- /dev/null +++ b/src/components/ClientComponent.tsx @@ -0,0 +1,9 @@ +"use client"; + +export default function ClientComponent({ + children, +}: { + children: React.ReactNode; +}) { + return <>{children}; +} diff --git a/src/components/Codeblock.tsx b/src/components/Codeblock.tsx index be8d5e8..5752d20 100644 --- a/src/components/Codeblock.tsx +++ b/src/components/Codeblock.tsx @@ -1,3 +1,5 @@ +"use client"; + import { CopyIcon } from "@radix-ui/react-icons"; import { CopyCheckIcon } from "lucide-react"; import React, { useState } from "react"; diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 3008022..a2530e2 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -24,6 +24,7 @@ export default function Navbar({ title: string; subtitle: string; slug: string; + mainImage: string; }[]; blogPosts: { publishedAt: Date; @@ -51,13 +52,8 @@ export default function Navbar({ - - - Projects - + + Projects
    @@ -89,15 +85,30 @@ export default function Navbar({ -
    - {project.title} +
    +
    + {project.title} +
    +

    + {project.subtitle} +

    -

    - {project.subtitle} -

    + + {/* project image */} + {project.mainImage && ( +
    + +
    + )} @@ -159,9 +170,9 @@ export default function Navbar({ - About + About diff --git a/src/components/SidecardList.tsx b/src/components/SidecardList.tsx new file mode 100644 index 0000000..c4f981a --- /dev/null +++ b/src/components/SidecardList.tsx @@ -0,0 +1,63 @@ +"use client"; + +import { Crosshair2Icon, IdCardIcon, PersonIcon } from "@radix-ui/react-icons"; +import * as Tooltip from "@radix-ui/react-tooltip"; + +export default function SidecardList() { + return ( + +
      + + +
    • + + + Age + {new Date().getFullYear() - 2004} + +
    • +
      + + + Age + + +
      + + + +
    • + + + Pronouns + he/him + +
    • +
      + + + Pronouns + + +
      + + + +
    • + + + Location + Chicago, IL / Amherst, MA + +
    • +
      + + + Location + + +
      +
    +
    + ); +} diff --git a/tailwind.config.js b/tailwind.config.js index dd5a43b..3be9bd3 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -112,6 +112,22 @@ module.exports = { from: { opacity: 1 }, to: { opacity: 0 }, }, + slideDownAndFade: { + from: { opacity: 0, transform: "translateY(-2px)" }, + to: { opacity: 1, transform: "translateY(0)" }, + }, + slideLeftAndFade: { + from: { opacity: 0, transform: "translateX(2px)" }, + to: { opacity: 1, transform: "translateX(0)" }, + }, + slideUpAndFade: { + from: { opacity: 0, transform: "translateY(2px)" }, + to: { opacity: 1, transform: "translateY(0)" }, + }, + slideRightAndFade: { + from: { opacity: 0, transform: "translateX(-2px)" }, + to: { opacity: 1, transform: "translateX(0)" }, + }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", @@ -125,6 +141,13 @@ module.exports = { enterFromRight: "enterFromRight 250ms ease", exitToLeft: "exitToLeft 250ms ease", exitToRight: "exitToRight 250ms ease", + slideDownAndFade: + "slideDownAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)", + slideLeftAndFade: + "slideLeftAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)", + slideUpAndFade: "slideUpAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)", + slideRightAndFade: + "slideRightAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)", }, }, }, diff --git a/yarn.lock b/yarn.lock index 0eeed5f..6dbde1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -658,6 +658,11 @@ resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz" integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg== +"@floating-ui/core@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.3.0.tgz#113bc85fa102cf890ae801668f43ee265c547a09" + integrity sha512-vX1WVAdPjZg9DkDkC+zEx/tKtnST6/qcNpwcjeBgco3XRNHz5PUA+ivi/yr6G3o0kMR60uKBJcfOdfzOFI7PMQ== + "@floating-ui/dom@^0.5.3": version "0.5.4" resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz" @@ -672,6 +677,13 @@ dependencies: "@floating-ui/core" "^1.2.6" +"@floating-ui/dom@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.3.0.tgz#69456f2164fc3d33eb40837686eaf71537235ac9" + integrity sha512-qIAwejE3r6NeA107u4ELDKkH8+VtgRKdXqtSPaKflL2S2V+doyN+Wt9s5oHKXPDo4E8TaVXaHT3+6BbagH31xw== + dependencies: + "@floating-ui/core" "^1.3.0" + "@floating-ui/react-dom@0.7.2": version "0.7.2" resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz" @@ -687,6 +699,13 @@ dependencies: "@floating-ui/dom" "^1.1.0" +"@floating-ui/react-dom@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.1.tgz#7972a4fc488a8c746cded3cfe603b6057c308a91" + integrity sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA== + dependencies: + "@floating-ui/dom" "^1.3.0" + "@fullhuman/postcss-purgecss@^2.1.2": version "2.3.0" resolved "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz" @@ -930,6 +949,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.2" +"@radix-ui/react-arrow@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" + integrity sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-collection@1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.2.tgz" @@ -1166,6 +1193,23 @@ "@radix-ui/react-use-size" "1.0.0" "@radix-ui/rect" "1.0.0" +"@radix-ui/react-popper@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" + integrity sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-rect" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + "@radix-ui/rect" "1.0.1" + "@radix-ui/react-portal@1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.2.tgz" @@ -1248,6 +1292,25 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" +"@radix-ui/react-tooltip@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz#87a7786cd9f2b4de957ac645afae1575339c58b0" + integrity sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + "@radix-ui/react-use-callback-ref@1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz" @@ -1323,6 +1386,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/rect" "1.0.0" +"@radix-ui/react-use-rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" + integrity sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.1" + "@radix-ui/react-use-size@1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz" @@ -1331,6 +1402,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.0" +"@radix-ui/react-use-size@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" + integrity sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-visually-hidden@1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.2.tgz" @@ -1339,6 +1418,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.2" +"@radix-ui/react-visually-hidden@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" + integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/rect@1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz" @@ -1346,6 +1433,13 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" + integrity sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@rexxars/react-json-inspector@^8.0.1": version "8.0.1" resolved "https://registry.npmjs.org/@rexxars/react-json-inspector/-/react-json-inspector-8.0.1.tgz" @@ -5537,6 +5631,13 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +next-sanity-image@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/next-sanity-image/-/next-sanity-image-6.0.0.tgz#38968317aa294fd06c7ff2e9df64ef8c8d0b3255" + integrity sha512-U4fl8CfJRgsUh3sJGoxgVrJ4bovCZDmWsjwowzDYbf66ci97j1mjdB+i3pz2CGFz//qbfmG8v2XL6dsYx1xFBg== + dependencies: + "@sanity/image-url" "^1.0.2" + next-sanity@^4.3.3: version "4.3.3" resolved "https://registry.npmjs.org/next-sanity/-/next-sanity-4.3.3.tgz"