diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..726a201
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+20.11.1
\ No newline at end of file
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..f3489a9
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,8 @@
+{
+ "plugins": [
+ "prettier-plugin-organize-imports",
+ "prettier-plugin-tailwindcss"
+ ],
+ "tailwindConfig": "./tailwind.config.js",
+ "tailwindFunctions": ["tv"]
+}
diff --git a/app/layout.tsx b/app/layout.tsx
index 43c910f..48358f2 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,24 +1,8 @@
import 'tailwindcss/tailwind.css'
-import { IBM_Plex_Mono, Inter, PT_Serif } from 'next/font/google'
+import { karelia } from '@/fonts/fonts'
-const serif = PT_Serif({
- variable: '--font-serif',
- style: ['normal', 'italic'],
- subsets: ['latin'],
- weight: ['400', '700'],
-})
-const sans = Inter({
- variable: '--font-sans',
- subsets: ['latin'],
- // @todo: understand why extrabold (800) isn't being respected when explicitly specified in this weight array
- // weight: ['500', '700', '800'],
-})
-const mono = IBM_Plex_Mono({
- variable: '--font-mono',
- subsets: ['latin'],
- weight: ['500', '700'],
-})
+import { Providers } from './providers'
export default async function RootLayout({
children,
@@ -26,11 +10,10 @@ export default async function RootLayout({
children: React.ReactNode
}) {
return (
-
-
{children}
+
+
+ {children}
+
)
}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..096776c
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,11 @@
+import type { Metadata } from 'next/types'
+
+import { HomePage } from '@/components/pages/home/HomePage'
+
+export const metadata: Metadata = {
+ title: 'Datum',
+}
+
+export default async function Homepage() {
+ return
+}
diff --git a/app/providers.tsx b/app/providers.tsx
new file mode 100644
index 0000000..1012cc7
--- /dev/null
+++ b/app/providers.tsx
@@ -0,0 +1,15 @@
+'use client'
+
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
+
+const queryClient = new QueryClient()
+
+export function Providers({ children }: { children: React.ReactNode }) {
+ return (
+
+ {children}
+
+
+ )
+}
diff --git a/components.json b/components.json
new file mode 100644
index 0000000..d2b9162
--- /dev/null
+++ b/components.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "styles/index.css",
+ "baseColor": "slate",
+ "cssVariables": false,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils"
+ }
+}
\ No newline at end of file
diff --git a/components/global/Logo.tsx b/components/global/Logo.tsx
new file mode 100644
index 0000000..c03515a
--- /dev/null
+++ b/components/global/Logo.tsx
@@ -0,0 +1,25 @@
+type LogoProps = {
+ w?: number
+ h?: number
+}
+
+export const Logo = ({ w = 145, h = 39 }: LogoProps) => {
+ return (
+
+ )
+}
diff --git a/components/pages/home/HomePage.animation.tsx b/components/pages/home/HomePage.animation.tsx
new file mode 100644
index 0000000..2e6503a
--- /dev/null
+++ b/components/pages/home/HomePage.animation.tsx
@@ -0,0 +1,161 @@
+'use client'
+import Matter from 'matter-js'
+import React, { useEffect, useRef } from 'react'
+
+export const HomePageAnimation = () => {
+ const sceneRef = useRef(null)
+
+ useEffect(() => {
+ const {
+ Engine,
+ Render,
+ Runner,
+ Bodies,
+ Composite,
+ Composites,
+ Constraint,
+ Mouse,
+ MouseConstraint,
+ Common,
+ Events,
+ Body,
+ } = Matter
+
+ const currentRef = sceneRef.current
+ if (!currentRef) return
+
+ const engine = Engine.create()
+ const world = engine.world
+ const render = Render.create({
+ element: currentRef,
+ engine: engine,
+ options: {
+ width: 1000,
+ height: 1100,
+ wireframes: true,
+ background: 'white',
+ },
+ })
+
+ Render.run(render)
+ const runner = Runner.create()
+ Runner.run(runner, engine)
+
+ // create obstacles
+ const obstacles = Composites.stack(10, 0, 15, 3, 10, 10, function (x, y) {
+ let sides = Math.round(Common.random(1, 8)),
+ options = {
+ render: {
+ fillStyle: Common.choose([
+ '#48f164',
+ '#f5d259',
+ '#f55a3c',
+ '#063e7b',
+ '#ececd1',
+ ]),
+ },
+ }
+
+ switch (Math.round(Common.random(0, 1))) {
+ case 0:
+ if (Common.random() < 0.8) {
+ return Bodies.rectangle(
+ x,
+ y,
+ Common.random(25, 50),
+ Common.random(25, 50),
+ options,
+ )
+ } else {
+ return Bodies.rectangle(
+ x,
+ y,
+ Common.random(80, 120),
+ Common.random(25, 30),
+ options,
+ )
+ }
+ case 1:
+ return Bodies.polygon(x, y, sides, Common.random(25, 50), options)
+ }
+ })
+
+ Composite.add(world, [obstacles])
+
+ let timeScaleTarget = 1,
+ lastTime = Common.now()
+
+ Events.on(engine, 'afterUpdate', function (event) {
+ var timeScale = (event.delta || 1000 / 60) / 1000
+
+ // tween the timescale for slow-mo
+ if (mouse.button === -1) {
+ engine.timing.timeScale +=
+ (timeScaleTarget - engine.timing.timeScale) * 3 * timeScale
+ } else {
+ engine.timing.timeScale = 1
+ }
+
+ // every 2 sec (real time)
+ if (Common.now() - lastTime >= 2000) {
+ // flip the timescale
+ if (timeScaleTarget < 1) {
+ timeScaleTarget = 1
+ } else {
+ timeScaleTarget = 0.05
+ }
+
+ // update last time
+ lastTime = Common.now()
+ }
+
+ for (let i = 0; i < obstacles.bodies.length; i += 1) {
+ var body = obstacles.bodies[i],
+ bounds = body.bounds
+
+ // move obstacles back to the top of the screen
+ if (bounds.min.y > render.bounds.max.y + 100) {
+ Body.translate(body, {
+ x: -bounds.min.x,
+ y: -render.bounds.max.y - 300,
+ })
+ }
+ }
+ })
+
+ // add mouse control and make the mouse revolute
+ var mouse = Mouse.create(render.canvas),
+ mouseConstraint = MouseConstraint.create(engine, {
+ mouse: mouse,
+ constraint: {
+ stiffness: 0.6,
+ length: 0,
+ angularStiffness: 0,
+ render: {
+ visible: false,
+ },
+ },
+ })
+
+ Composite.add(world, mouseConstraint)
+
+ // keep the mouse in sync with rendering
+ render.mouse = mouse
+
+ // fit the render viewport to the scene
+ Render.lookAt(render, {
+ min: { x: 0, y: 0 },
+ max: { x: 800, y: 600 },
+ })
+
+ return () => {
+ Render.stop(render)
+ Runner.stop(runner)
+ while (currentRef.firstChild) {
+ currentRef.removeChild(currentRef.firstChild)
+ }
+ }
+ }, [])
+
+ return
+}
diff --git a/components/pages/home/HomePage.newsletter.tsx b/components/pages/home/HomePage.newsletter.tsx
new file mode 100644
index 0000000..5a0947b
--- /dev/null
+++ b/components/pages/home/HomePage.newsletter.tsx
@@ -0,0 +1,86 @@
+'use client'
+
+import { zodResolver } from '@hookform/resolvers/zod'
+import { LoaderCircle, MailCheck } from 'lucide-react'
+import { useForm } from 'react-hook-form'
+import { z } from 'zod'
+
+import {
+ Button,
+ Form,
+ FormControl,
+ FormField,
+ FormMessage,
+ Input,
+} from '@/components/ui'
+import { useSubscribeMutation } from '@/hooks/mutations/useSubscribeMutation'
+
+import { newsletterStyles } from './HomePage.styles'
+
+const formSchema = z.object({
+ email: z.string().email(),
+})
+
+export const HomePageNewsletter = () => {
+ const {
+ wrapper,
+ input,
+ button,
+ errorMessage,
+ success,
+ successMessage,
+ successIcon,
+ } = newsletterStyles()
+ const { mutate, status, isError, error, data } = useSubscribeMutation()
+ const isLoading = status === 'pending'
+
+ const form = useForm>({
+ resolver: zodResolver(formSchema),
+ defaultValues: {
+ email: '',
+ },
+ })
+
+ const onSubmit = ({ email }: z.infer) => {
+ mutate(email)
+ }
+
+ return (
+ <>
+ {status === 'success' ? (
+
+
+ {data.message}
+
+ ) : (
+
+ {isError && {error.message}
}
+
+ )}
+ >
+ )
+}
diff --git a/components/pages/home/HomePage.styles.ts b/components/pages/home/HomePage.styles.ts
new file mode 100644
index 0000000..03d970e
--- /dev/null
+++ b/components/pages/home/HomePage.styles.ts
@@ -0,0 +1,34 @@
+import { tv, type VariantProps } from 'tailwind-variants'
+
+const homeStyles = tv({
+ slots: {
+ base: 'font-mono text-white h-screen overflow-hidden flex flex-col-reverse md:flex-row',
+ left: 'w-full bg-blackberry-800 flex justify-center py-10 md:py-16 md:w-1/2',
+ right: 'w-full bg-white flex flex-1 relative md:w-1/2',
+ leftInner:
+ 'relative gap-9 md:gap-0 md:max-w-xl flex flex-col justify-between px-6',
+ rightImage: 'object-cover',
+ heading: 'text-2xl leading-snug md:text-4xl',
+ footer: 'hidden md:block',
+ githubMobile: 'z-auto block absolute top-0 right-8 md:hidden',
+ },
+})
+
+const newsletterStyles = tv({
+ slots: {
+ wrapper: 'relative mt-14 flex flex-col gap-5 md:flex-row',
+ input: 'w-full h-12 md:h-auto',
+ button:
+ 'absolute top-2 h-8 right-2 text-xs md:relative md:text-sm md:top-0 md:h-14',
+ errorMessage: 'text-sunglow-900 mt-3',
+ success:
+ 'mt-14 bg-white bg-opacity-20 p-5 rounded-md text-white flex gap-3 ',
+ successMessage: 'flex-1',
+ successIcon: 'mt-1',
+ },
+})
+
+export type HomeVariants = VariantProps
+export type NewsletterVariants = VariantProps
+
+export { homeStyles, newsletterStyles }
diff --git a/components/pages/home/HomePage.tsx b/components/pages/home/HomePage.tsx
index b8e70ba..c307c30 100644
--- a/components/pages/home/HomePage.tsx
+++ b/components/pages/home/HomePage.tsx
@@ -1,52 +1,74 @@
-import { ProjectListItem } from 'components/pages/home/ProjectListItem'
-import { Header } from 'components/shared/Header'
-import Layout from 'components/shared/Layout'
-import ScrollUp from 'components/shared/ScrollUp'
-import { resolveHref } from 'lib/sanity.links'
+import Image from 'next/image'
import Link from 'next/link'
-import type { HomePagePayload } from 'types'
-import { SettingsPayload } from 'types'
-import HomePageHead from './HomePageHead'
+import { Logo } from '@/components/global/Logo'
+import { Button } from '@/components/ui'
+import { GITHUB_URL } from '@/constants'
-export interface HomePageProps {
- settings?: SettingsPayload
- page?: HomePagePayload
- preview?: boolean
-}
+import { HomePageNewsletter } from './HomePage.newsletter'
+import { homeStyles } from './HomePage.styles'
-export function HomePage({ page, settings, preview }: HomePageProps) {
- const { overview, showcaseProjects, title = 'Personal website' } = page ?? {}
+export function HomePage() {
+ const {
+ base,
+ left,
+ right,
+ rightImage,
+ leftInner,
+ heading,
+ footer,
+ githubMobile,
+ } = homeStyles()
return (
- <>
-
-
-
-
- {/* Header */}
- {title &&
}
- {/* Showcase projects */}
- {showcaseProjects && showcaseProjects.length > 0 && (
-
- {showcaseProjects.map((project, key) => {
- const href = resolveHref(project._type, project.slug)
- if (!href) {
- return null
- }
- return (
-
-
-
- )
- })}
-
- )}
-
- {/* Workaround: scroll to top on route change */}
-
+
+
+
+
+
+
+
+
+ Every foundational tool that software companies need for
+ hyper-scale, backed by open source.
+
+
+
+
+
+
+
+
+
-
- >
+
+
+
+
+
)
}
diff --git a/components/pages/home/HomePageHead.tsx b/components/pages/home/HomePageHead.tsx
deleted file mode 100644
index 3a18a5d..0000000
--- a/components/pages/home/HomePageHead.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { toPlainText } from '@portabletext/react'
-import { SiteMeta } from 'components/global/SiteMeta'
-import { HomePagePayload, SettingsPayload } from 'types'
-
-export interface HomePageHeadProps {
- settings?: SettingsPayload
- page?: HomePagePayload
-}
-
-export default function HomePageHead({ settings, page }: HomePageHeadProps) {
- return (
-
- )
-}
diff --git a/components/pages/home/HomePagePreview.tsx b/components/pages/home/HomePagePreview.tsx
deleted file mode 100644
index 277ea55..0000000
--- a/components/pages/home/HomePagePreview.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { homePageQuery } from 'lib/sanity.queries'
-import { useLiveQuery } from 'next-sanity/preview'
-import type { HomePagePayload } from 'types'
-
-import { HomePage, HomePageProps } from './HomePage'
-
-export default function HomePagePreview({
- page: initialPage,
- settings,
-}: HomePageProps) {
- const [page] = useLiveQuery
(
- initialPage,
- homePageQuery,
- )
-
- if (!page) {
- return (
-
- Please start editing your Home document to see the preview!
-
- )
- }
-
- return
-}
diff --git a/components/pages/home/ProjectListItem.tsx b/components/pages/home/ProjectListItem.tsx
deleted file mode 100644
index 98fcade..0000000
--- a/components/pages/home/ProjectListItem.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { CustomPortableText } from 'components/shared/CustomPortableText'
-import ImageBox from 'components/shared/ImageBox'
-import type { ShowcaseProject } from 'types'
-
-interface ProjectProps {
- project: ShowcaseProject
- odd: number
-}
-
-export function ProjectListItem(props: ProjectProps) {
- const { project, odd } = props
-
- return (
-
- )
-}
-
-function TextBox({ project }: { project: ShowcaseProject }) {
- return (
-
-
- {/* Title */}
-
- {project.title}
-
- {/* Overview */}
-
-
-
-
- {/* Tags */}
-
- {project.tags?.map((tag, key) => (
-
- #{tag}
-
- ))}
-
-
- )
-}
diff --git a/components/ui/Button/Button.styles.tsx b/components/ui/Button/Button.styles.tsx
new file mode 100644
index 0000000..8298ee4
--- /dev/null
+++ b/components/ui/Button/Button.styles.tsx
@@ -0,0 +1,38 @@
+import { tv, type VariantProps } from 'tailwind-variants'
+
+export const button = tv({
+ base: 'font-mono inline-flex items-center gap-2 justify-center whitespace-nowrap rounded-md text-sm ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-slate-950 dark:focus-visible:ring-slate-300',
+ variants: {
+ variant: {
+ default:
+ 'bg-slate-900 text-slate-50 hover:bg-slate-900/90 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/90',
+ destructive:
+ 'bg-red-500 text-slate-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/90',
+ outline:
+ 'border border-slate-200 bg-white hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:bg-slate-950 dark:hover:bg-slate-800 dark:hover:text-slate-50',
+ secondary: 'bg-sunglow-900',
+ ghost:
+ 'hover:bg-slate-100 hover:text-slate-900 dark:hover:bg-slate-800 dark:hover:text-slate-50',
+ link: 'text-slate-900 underline-offset-4 hover:underline dark:text-slate-50',
+ white: 'bg-white text-blackberry-800',
+ },
+ size: {
+ default: 'h-14 px-7 text-lg',
+ sm: 'h-9 rounded-md px-3',
+ lg: 'h-11 rounded-md px-8',
+ icon: 'h-10 w-10 px-0 py-0',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+})
+
+type ButtonVariants = VariantProps
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ ButtonVariants {
+ asChild?: boolean
+}
diff --git a/components/ui/Button/Button.tsx b/components/ui/Button/Button.tsx
new file mode 100644
index 0000000..7dd393f
--- /dev/null
+++ b/components/ui/Button/Button.tsx
@@ -0,0 +1,21 @@
+import { Slot } from '@radix-ui/react-slot'
+import { forwardRef } from 'react'
+
+import { button, type ButtonProps } from './Button.styles'
+
+const Button = forwardRef(
+ ({ asChild = false, className, ...props }, ref) => {
+ const Comp = asChild ? Slot : 'button'
+ return (
+
+ )
+ },
+)
+
+Button.displayName = 'Button'
+
+export { Button, button }
diff --git a/components/ui/Form/Form.tsx b/components/ui/Form/Form.tsx
new file mode 100644
index 0000000..6e9a1a0
--- /dev/null
+++ b/components/ui/Form/Form.tsx
@@ -0,0 +1,181 @@
+'use client'
+
+import * as LabelPrimitive from '@radix-ui/react-label'
+import { Slot } from '@radix-ui/react-slot'
+import { createContext, forwardRef, useContext, useId } from 'react'
+import {
+ Controller,
+ ControllerProps,
+ FieldPath,
+ FieldValues,
+ FormProvider,
+ useFormContext,
+} from 'react-hook-form'
+
+import { Label } from '@/components/ui/Label/Label'
+import { cn } from '@/lib/utils'
+
+const Form = FormProvider
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath,
+> = {
+ name: TName
+}
+
+const FormFieldContext = createContext(
+ {} as FormFieldContextValue,
+)
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath,
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ )
+}
+
+const useFormField = () => {
+ const fieldContext = useContext(FormFieldContext)
+ const itemContext = useContext(FormItemContext)
+ const { getFieldState, formState } = useFormContext()
+
+ const fieldState = getFieldState(fieldContext.name, formState)
+
+ if (!fieldContext) {
+ throw new Error('useFormField should be used within ')
+ }
+
+ const { id } = itemContext
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ }
+}
+
+type FormItemContextValue = {
+ id: string
+}
+
+const FormItemContext = createContext(
+ {} as FormItemContextValue,
+)
+
+const FormItem = forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = useId()
+
+ return (
+
+
+
+ )
+})
+FormItem.displayName = 'FormItem'
+
+const FormLabel = forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField()
+
+ return (
+
+ )
+})
+FormLabel.displayName = 'FormLabel'
+
+const FormControl = forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
+
+ return (
+
+ )
+})
+FormControl.displayName = 'FormControl'
+
+const FormDescription = forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField()
+
+ return (
+
+ )
+})
+FormDescription.displayName = 'FormDescription'
+
+const FormMessage = forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField()
+ const body = error ? String(error?.message) : children
+
+ if (!body) {
+ return null
+ }
+
+ return (
+
+ {body}
+
+ )
+})
+FormMessage.displayName = 'FormMessage'
+
+export {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+ useFormField,
+}
diff --git a/components/ui/Input/Input.styles.tsx b/components/ui/Input/Input.styles.tsx
new file mode 100644
index 0000000..756d4b8
--- /dev/null
+++ b/components/ui/Input/Input.styles.tsx
@@ -0,0 +1,16 @@
+import { tv, type VariantProps } from 'tailwind-variants'
+
+export const input = tv({
+ base: 'font-mono px-7 inline-flex items-center gap-2 justify-center whitespace-nowrap rounded-md text-sm ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-slate-950 dark:focus-visible:ring-slate-300',
+ variants: {
+ variant: {
+ outline: 'border-white border border-solid bg-transparent',
+ },
+ },
+})
+
+type InputVariants = VariantProps
+
+export interface InputProps
+ extends React.InputHTMLAttributes,
+ InputVariants {}
diff --git a/components/ui/Input/Input.tsx b/components/ui/Input/Input.tsx
new file mode 100644
index 0000000..af91ace
--- /dev/null
+++ b/components/ui/Input/Input.tsx
@@ -0,0 +1,19 @@
+import { forwardRef } from 'react'
+
+import { input, type InputProps } from './Input.styles'
+
+const Input = forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ )
+ },
+)
+Input.displayName = 'Input'
+
+export { Input }
diff --git a/components/ui/Label/Label.tsx b/components/ui/Label/Label.tsx
new file mode 100644
index 0000000..ff1c62a
--- /dev/null
+++ b/components/ui/Label/Label.tsx
@@ -0,0 +1,24 @@
+'use client'
+
+import * as LabelPrimitive from '@radix-ui/react-label'
+import { forwardRef } from 'react'
+import { tv } from 'tailwind-variants'
+
+const label = tv({
+ base: 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',
+})
+
+const Label = forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+
+Label.displayName = LabelPrimitive.Root.displayName
+
+export { Label }
diff --git a/components/ui/index.ts b/components/ui/index.ts
new file mode 100644
index 0000000..3130689
--- /dev/null
+++ b/components/ui/index.ts
@@ -0,0 +1,13 @@
+export { Button } from './Button/Button'
+export {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+ useFormField,
+} from './Form/Form'
+export { Input } from './Input/Input'
+export { Label } from './Label/Label'
diff --git a/constants/index.ts b/constants/index.ts
new file mode 100644
index 0000000..6031558
--- /dev/null
+++ b/constants/index.ts
@@ -0,0 +1,3 @@
+export const GITHUB_HANDLE = 'datumforge'
+export const GITHUB_URL = `https://github.com/${GITHUB_HANDLE}`
+export const SUBSCRIPTION_ENDPOINT = 'https://api.datum.net/v1/subscribe'
diff --git a/fonts/KareliaWeb-Medium.woff2 b/fonts/KareliaWeb-Medium.woff2
new file mode 100644
index 0000000..8660365
Binary files /dev/null and b/fonts/KareliaWeb-Medium.woff2 differ
diff --git a/fonts/KareliaWeb-Regular.woff2 b/fonts/KareliaWeb-Regular.woff2
new file mode 100644
index 0000000..f30d6f0
Binary files /dev/null and b/fonts/KareliaWeb-Regular.woff2 differ
diff --git a/fonts/fonts.ts b/fonts/fonts.ts
new file mode 100644
index 0000000..d941498
--- /dev/null
+++ b/fonts/fonts.ts
@@ -0,0 +1,17 @@
+import localFont from 'next/font/local'
+
+export const karelia = localFont({
+ src: [
+ {
+ path: './KareliaWeb-Regular.woff2',
+ weight: '400',
+ style: 'normal',
+ },
+ {
+ path: '/KareliaWeb-Medium.woff2',
+ weight: '500',
+ style: 'medium',
+ },
+ ],
+ variable: '--font-karelia',
+})
diff --git a/hooks/mutations/useSubscribeMutation.ts b/hooks/mutations/useSubscribeMutation.ts
new file mode 100644
index 0000000..92c4051
--- /dev/null
+++ b/hooks/mutations/useSubscribeMutation.ts
@@ -0,0 +1,22 @@
+import { useMutation } from '@tanstack/react-query'
+
+import { SUBSCRIPTION_ENDPOINT } from '@/constants'
+
+const subscribeToNewsletter = async (email: string) => {
+ const encodedEmail = encodeURIComponent(email)
+ const response = await fetch(`${SUBSCRIPTION_ENDPOINT}?email=${encodedEmail}`)
+
+ const data = await response.json()
+
+ if (!response.ok) {
+ throw new Error(data.error)
+ }
+
+ return data
+}
+
+export const useSubscribeMutation = () => {
+ return useMutation({
+ mutationFn: subscribeToNewsletter,
+ })
+}
diff --git a/lib/utils.ts b/lib/utils.ts
new file mode 100644
index 0000000..d084cca
--- /dev/null
+++ b/lib/utils.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from "clsx"
+import { twMerge } from "tailwind-merge"
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}
diff --git a/package-lock.json b/package-lock.json
index b89818c..da99944 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,10 @@
"": {
"name": "sanity-template-vercel-visual-editing",
"dependencies": {
+ "@hookform/resolvers": "^3.3.4",
"@portabletext/react": "3.0.11",
+ "@radix-ui/react-label": "^2.0.2",
+ "@radix-ui/react-slot": "^1.0.2",
"@sanity/client": "6.15.1",
"@sanity/demo": "2.0.0",
"@sanity/icons": "2.10.3",
@@ -15,20 +18,31 @@
"@sanity/vision": "3.31.0",
"@sanity/visual-editing": "1.6.0",
"@tailwindcss/typography": "0.5.10",
+ "@tanstack/react-query": "^5.28.4",
+ "@tanstack/react-query-devtools": "^5.28.4",
"@vercel/og": "0.6.2",
+ "class-variance-authority": "^0.7.0",
"classnames": "2.5.1",
+ "clsx": "^2.1.0",
"get-youtube-id": "1.0.1",
"intl-segmenter-polyfill": "0.4.4",
+ "lucide-react": "^0.358.0",
+ "matter-js": "^0.19.0",
"next": "14.1.2",
"next-google-fonts": "2.2.0",
"next-sanity": "8.1.3",
"react": "18.2.0",
"react-dom": "18.2.0",
+ "react-hook-form": "^7.51.0",
"react-is": "18.2.0",
"react-lite-youtube-embed": "2.4.0",
"sanity": "3.31.0",
"sanity-plugin-asset-source-unsplash": "1.1.2",
- "styled-components": "6.1.8"
+ "styled-components": "6.1.8",
+ "tailwind-merge": "^2.2.1",
+ "tailwind-variants": "^0.2.1",
+ "tailwindcss-animate": "^1.0.7",
+ "zod": "^3.22.4"
},
"devDependencies": {
"@types/react": "18.2.63",
@@ -37,9 +51,10 @@
"eslint-config-next": "14.1.2",
"eslint-plugin-simple-import-sort": "12.0.0",
"postcss": "8.4.35",
- "prettier": "3.2.5",
+ "prettier": "^3.2.5",
+ "prettier-plugin-organize-attributes": "^1.0.0",
"prettier-plugin-packagejson": "2.4.12",
- "prettier-plugin-tailwindcss": "0.5.11",
+ "prettier-plugin-tailwindcss": "^0.5.12",
"tailwindcss": "3.4.1",
"typescript": "5.3.3"
}
@@ -65,12 +80,12 @@
}
},
"node_modules/@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
@@ -171,20 +186,20 @@
}
},
"node_modules/@babel/core": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
- "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz",
+ "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.23.5",
"@babel/generator": "^7.23.6",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@babel/template": "^7.23.9",
- "@babel/traverse": "^7.23.9",
- "@babel/types": "^7.23.9",
+ "@babel/helpers": "^7.24.0",
+ "@babel/parser": "^7.24.0",
+ "@babel/template": "^7.24.0",
+ "@babel/traverse": "^7.24.0",
+ "@babel/types": "^7.24.0",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -313,9 +328,9 @@
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
- "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz",
+ "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==",
"engines": {
"node": ">=6.9.0"
}
@@ -367,13 +382,13 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz",
- "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz",
+ "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==",
"dependencies": {
- "@babel/template": "^7.23.9",
- "@babel/traverse": "^7.23.9",
- "@babel/types": "^7.23.9"
+ "@babel/template": "^7.24.0",
+ "@babel/traverse": "^7.24.0",
+ "@babel/types": "^7.24.0"
},
"engines": {
"node": ">=6.9.0"
@@ -457,9 +472,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz",
- "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz",
+ "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -496,9 +511,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz",
- "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz",
+ "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@@ -507,22 +522,22 @@
}
},
"node_modules/@babel/template": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz",
- "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz",
+ "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
"dependencies": {
"@babel/code-frame": "^7.23.5",
- "@babel/parser": "^7.23.9",
- "@babel/types": "^7.23.9"
+ "@babel/parser": "^7.24.0",
+ "@babel/types": "^7.24.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz",
- "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz",
+ "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==",
"dependencies": {
"@babel/code-frame": "^7.23.5",
"@babel/generator": "^7.23.6",
@@ -530,8 +545,8 @@
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.23.9",
- "@babel/types": "^7.23.9",
+ "@babel/parser": "^7.24.0",
+ "@babel/types": "^7.24.0",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -548,9 +563,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz",
- "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
+ "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
"dependencies": {
"@babel/helper-string-parser": "^7.23.4",
"@babel/helper-validator-identifier": "^7.22.20",
@@ -591,9 +606,9 @@
}
},
"node_modules/@codemirror/autocomplete": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz",
- "integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==",
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.15.0.tgz",
+ "integrity": "sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
@@ -682,9 +697,9 @@
}
},
"node_modules/@codemirror/view": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.24.1.tgz",
- "integrity": "sha512-sBfP4rniPBRQzNakwuQEqjEuiJDWJyF2kqLLqij4WXRoVwPPJfjx966Eq3F7+OPQxDtMt/Q9MWLoZLWjeveBlg==",
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.0.tgz",
+ "integrity": "sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==",
"dependencies": {
"@codemirror/state": "^6.4.0",
"style-mod": "^4.1.0",
@@ -1192,11 +1207,11 @@
}
},
"node_modules/@floating-ui/react-dom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.0.tgz",
- "integrity": "sha512-Ke0oU3SeuABC2C4OFu2mSAwHIP5WUiV98O9YWoHV4Q5aT6E9k06DV0Khi5uYspR8xmmBk08t8ZDcz3TR3ARkEg==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
+ "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
"dependencies": {
- "@floating-ui/dom": "^1.2.7"
+ "@floating-ui/dom": "^1.6.1"
},
"peerDependencies": {
"react": ">=16.8.0",
@@ -1208,6 +1223,14 @@
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
"integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
},
+ "node_modules/@hookform/resolvers": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.4.tgz",
+ "integrity": "sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==",
+ "peerDependencies": {
+ "react-hook-form": "^7.0.0"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@@ -1283,13 +1306,13 @@
}
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz",
- "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==",
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
"dependencies": {
- "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
@@ -1304,9 +1327,9 @@
}
},
"node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"engines": {
"node": ">=6.0.0"
}
@@ -1317,9 +1340,9 @@
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.23",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz",
- "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==",
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
@@ -1597,6 +1620,87 @@
"node": "^14.13.1 || >=16.0.0 || >=18.0.0"
}
},
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
+ "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz",
+ "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz",
+ "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "1.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@resvg/resvg-wasm": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@resvg/resvg-wasm/-/resvg-wasm-2.4.0.tgz",
@@ -1705,9 +1809,12 @@
}
},
"node_modules/@sanity/color": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/@sanity/color/-/color-2.2.5.tgz",
- "integrity": "sha512-tTi22KoKuER3sldXYl4c1Dq2zU7tMLDkljFiaUKVkBbu4PBvRGCFw75kXZnD2b4Bsp6vin+7sI+AKdCKRhfRuw=="
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sanity/color/-/color-3.0.0.tgz",
+ "integrity": "sha512-JLIsloyyn0lhta/JivmYlxlcN7U3dpBNqtH7uAzM9/kPirFxWJ8LAVuF5vxK5JHwTNbgpVy6AmfIss/av7N96w==",
+ "engines": {
+ "node": ">=18.0.0"
+ }
},
"node_modules/@sanity/demo": {
"version": "2.0.0",
@@ -1916,6 +2023,15 @@
"node": ">=18"
}
},
+ "node_modules/@sanity/migrate/node_modules/@sanity/types": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/@sanity/types/-/types-3.31.0.tgz",
+ "integrity": "sha512-6DC/1yEwEplvjOq5wgsQDvDEUCKNbiCyvRNE1AJN1uXti+yroQEzBLqSeo4PeFeqbSydQmXpAQOhNwdfW8lhAQ==",
+ "dependencies": {
+ "@sanity/client": "^6.15.0",
+ "@types/react": "^18.0.25"
+ }
+ },
"node_modules/@sanity/migrate/node_modules/arrify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
@@ -1959,6 +2075,15 @@
"styled-components": "^5.2 || ^6"
}
},
+ "node_modules/@sanity/portable-text-editor/node_modules/@sanity/types": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/@sanity/types/-/types-3.31.0.tgz",
+ "integrity": "sha512-6DC/1yEwEplvjOq5wgsQDvDEUCKNbiCyvRNE1AJN1uXti+yroQEzBLqSeo4PeFeqbSydQmXpAQOhNwdfW8lhAQ==",
+ "dependencies": {
+ "@sanity/client": "^6.15.0",
+ "@types/react": "^18.0.25"
+ }
+ },
"node_modules/@sanity/portable-text-editor/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
@@ -1992,71 +2117,6 @@
"@sanity/client": "^6.15.0"
}
},
- "node_modules/@sanity/presentation/node_modules/@floating-ui/react-dom": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
- "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
- "dependencies": {
- "@floating-ui/dom": "^1.6.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@sanity/presentation/node_modules/@sanity/color": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@sanity/color/-/color-3.0.0.tgz",
- "integrity": "sha512-JLIsloyyn0lhta/JivmYlxlcN7U3dpBNqtH7uAzM9/kPirFxWJ8LAVuF5vxK5JHwTNbgpVy6AmfIss/av7N96w==",
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@sanity/presentation/node_modules/@sanity/ui": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@sanity/ui/-/ui-2.0.7.tgz",
- "integrity": "sha512-Z8V92PHrQayzqh+3NHo0mBmZoFvO/CufYtkd6L83yKaPwq19aDXd5aW3bc7vS99zze1Z+T7BVG75/K6sPGf0hA==",
- "dependencies": {
- "@floating-ui/react-dom": "^2.0.8",
- "@sanity/color": "^3.0.0",
- "@sanity/icons": "^2.10.2",
- "csstype": "^3.1.3",
- "framer-motion": "^11.0.5",
- "react-refractor": "^2.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": "^18",
- "react-dom": "^18",
- "react-is": "^18",
- "styled-components": "^5.2 || ^6"
- }
- },
- "node_modules/@sanity/presentation/node_modules/framer-motion": {
- "version": "11.0.6",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.0.6.tgz",
- "integrity": "sha512-BpO3mWF8UwxzO3Ca5AmSkrg14QYTeJa9vKgoLOoBdBdTPj0e81i1dMwnX6EQJXRieUx20uiDBXq8bA6y7N6b8Q==",
- "dependencies": {
- "tslib": "^2.4.0"
- },
- "optionalDependencies": {
- "@emotion/is-prop-valid": "^0.8.2"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@sanity/preview-kit": {
"version": "5.0.27",
"resolved": "https://registry.npmjs.org/@sanity/preview-kit/-/preview-kit-5.0.27.tgz",
@@ -2122,6 +2182,15 @@
"object-inspect": "^1.6.0"
}
},
+ "node_modules/@sanity/schema/node_modules/@sanity/types": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/@sanity/types/-/types-3.31.0.tgz",
+ "integrity": "sha512-6DC/1yEwEplvjOq5wgsQDvDEUCKNbiCyvRNE1AJN1uXti+yroQEzBLqSeo4PeFeqbSydQmXpAQOhNwdfW8lhAQ==",
+ "dependencies": {
+ "@sanity/client": "^6.15.0",
+ "@types/react": "^18.0.25"
+ }
+ },
"node_modules/@sanity/telemetry": {
"version": "0.7.7",
"resolved": "https://registry.npmjs.org/@sanity/telemetry/-/telemetry-0.7.7.tgz",
@@ -2138,24 +2207,40 @@
}
},
"node_modules/@sanity/types": {
- "version": "3.31.0",
- "resolved": "https://registry.npmjs.org/@sanity/types/-/types-3.31.0.tgz",
- "integrity": "sha512-6DC/1yEwEplvjOq5wgsQDvDEUCKNbiCyvRNE1AJN1uXti+yroQEzBLqSeo4PeFeqbSydQmXpAQOhNwdfW8lhAQ==",
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/@sanity/types/-/types-3.34.0.tgz",
+ "integrity": "sha512-xwY6RJBsEBdB8x0g08qhRmDBBo7l/ZDbyHKGp4h+sSwBquB2wQd3hazPCh+lPuBMJI0M7kzMISG3FkbuuFlfxQ==",
+ "peer": true,
"dependencies": {
- "@sanity/client": "^6.15.0",
+ "@sanity/client": "^6.15.4",
"@types/react": "^18.0.25"
}
},
+ "node_modules/@sanity/types/node_modules/@sanity/client": {
+ "version": "6.15.5",
+ "resolved": "https://registry.npmjs.org/@sanity/client/-/client-6.15.5.tgz",
+ "integrity": "sha512-IGJPfk0bHRASPxSWEq5jY4MxECLbMVPqT3Nz0dfyZp2Pw9sIeYp528I9BQXI4dlEVWE/fEHbyvluagHn/HFqWQ==",
+ "peer": true,
+ "dependencies": {
+ "@sanity/eventsource": "^5.0.0",
+ "@vercel/stega": "0.1.0",
+ "get-it": "^8.4.13",
+ "rxjs": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ }
+ },
"node_modules/@sanity/ui": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@sanity/ui/-/ui-1.9.3.tgz",
- "integrity": "sha512-AdWEVFaK0Snk6xxP0lGPVP3QQYKwzkfGFpFZnL9d6UtWt8yeuS8BMLVAzmXzg14hrqH50ex9nvNl3eq6a0MWiw==",
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/@sanity/ui/-/ui-2.0.10.tgz",
+ "integrity": "sha512-7z8QglF7DJlP/GaGL2y5NqUpKpD9raEsSc4sDgLq4hiqAsXMBemtN8ENPFsoXUT2eOMly7CrUsQ84smcjneHtw==",
"dependencies": {
- "@floating-ui/react-dom": "2.0.0",
- "@sanity/color": "^2.2.5",
- "@sanity/icons": "^2.4.1",
- "csstype": "^3.1.2",
- "framer-motion": "^10.16.2",
+ "@floating-ui/react-dom": "^2.0.8",
+ "@sanity/color": "^3.0.0",
+ "@sanity/icons": "^2.11.2",
+ "csstype": "^3.1.3",
+ "framer-motion": "11.0.8",
"react-refractor": "^2.1.7"
},
"engines": {
@@ -2168,6 +2253,17 @@
"styled-components": "^5.2 || ^6"
}
},
+ "node_modules/@sanity/ui/node_modules/@sanity/icons": {
+ "version": "2.11.2",
+ "resolved": "https://registry.npmjs.org/@sanity/icons/-/icons-2.11.2.tgz",
+ "integrity": "sha512-TDA854ZCvMENPoQBqgcpTZk0r/ts+2rrcWeJcwF56BtrTFKFWU2KAgj/u2o7QDTJ3OuBOsihy8B70VZ6ab9YUw==",
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": "^18"
+ }
+ },
"node_modules/@sanity/util": {
"version": "3.31.0",
"resolved": "https://registry.npmjs.org/@sanity/util/-/util-3.31.0.tgz",
@@ -2183,6 +2279,15 @@
"node": ">=18"
}
},
+ "node_modules/@sanity/util/node_modules/@sanity/types": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/@sanity/types/-/types-3.31.0.tgz",
+ "integrity": "sha512-6DC/1yEwEplvjOq5wgsQDvDEUCKNbiCyvRNE1AJN1uXti+yroQEzBLqSeo4PeFeqbSydQmXpAQOhNwdfW8lhAQ==",
+ "dependencies": {
+ "@sanity/client": "^6.15.0",
+ "@types/react": "^18.0.25"
+ }
+ },
"node_modules/@sanity/uuid": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@sanity/uuid/-/uuid-3.0.2.tgz",
@@ -2192,14 +2297,6 @@
"uuid": "^8.0.0"
}
},
- "node_modules/@sanity/uuid/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/@sanity/vision": {
"version": "3.31.0",
"resolved": "https://registry.npmjs.org/@sanity/vision/-/vision-3.31.0.tgz",
@@ -2230,71 +2327,6 @@
"styled-components": "^5.2 || ^6"
}
},
- "node_modules/@sanity/vision/node_modules/@floating-ui/react-dom": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
- "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
- "dependencies": {
- "@floating-ui/dom": "^1.6.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@sanity/vision/node_modules/@sanity/color": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@sanity/color/-/color-3.0.0.tgz",
- "integrity": "sha512-JLIsloyyn0lhta/JivmYlxlcN7U3dpBNqtH7uAzM9/kPirFxWJ8LAVuF5vxK5JHwTNbgpVy6AmfIss/av7N96w==",
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@sanity/vision/node_modules/@sanity/ui": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@sanity/ui/-/ui-2.0.7.tgz",
- "integrity": "sha512-Z8V92PHrQayzqh+3NHo0mBmZoFvO/CufYtkd6L83yKaPwq19aDXd5aW3bc7vS99zze1Z+T7BVG75/K6sPGf0hA==",
- "dependencies": {
- "@floating-ui/react-dom": "^2.0.8",
- "@sanity/color": "^3.0.0",
- "@sanity/icons": "^2.10.2",
- "csstype": "^3.1.3",
- "framer-motion": "^11.0.5",
- "react-refractor": "^2.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": "^18",
- "react-dom": "^18",
- "react-is": "^18",
- "styled-components": "^5.2 || ^6"
- }
- },
- "node_modules/@sanity/vision/node_modules/framer-motion": {
- "version": "11.0.8",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.0.8.tgz",
- "integrity": "sha512-1KSGNuqe1qZkS/SWQlDnqK2VCVzRVEoval379j0FiUBJAZoqgwyvqFkfvJbgW2IPFo4wX16K+M0k5jO23lCIjA==",
- "dependencies": {
- "tslib": "^2.4.0"
- },
- "optionalDependencies": {
- "@emotion/is-prop-valid": "^0.8.2"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@sanity/visual-editing": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@sanity/visual-editing/-/visual-editing-1.6.0.tgz",
@@ -2381,6 +2413,55 @@
"tailwindcss": ">=3.0.0 || insiders"
}
},
+ "node_modules/@tanstack/query-core": {
+ "version": "5.28.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.28.4.tgz",
+ "integrity": "sha512-uQZqOFqLWUvXNIQZ63XdKzg22NtHzgCBUfDmjDHi3BoF+nUYeBNvMi/xFPtFrMhqRzG2Ir4mYaGsWZzmiEjXpA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/query-devtools": {
+ "version": "5.28.3",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.28.3.tgz",
+ "integrity": "sha512-Kxch05PVnxLUAyRiz2gXYQhXATHfXbQQwvz858YPjYYQyi7yk8SyS9Z5hyw90bRb0pd3rjelXyGFCsNMWvEghw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.28.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.28.4.tgz",
+ "integrity": "sha512-BErcoB/QQG6YwLSUKnaGxF+lSc270RH2w3kMBpG0i4YzDCsFs2pdxPX1WVknQvFk9bNgukMb158hc2Zb4SdwSA==",
+ "dependencies": {
+ "@tanstack/query-core": "5.28.4"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@tanstack/react-query-devtools": {
+ "version": "5.28.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.28.4.tgz",
+ "integrity": "sha512-oS+3INjCIX4Nkh0IAV6LH2mgLqJjkcd/DDxp8dwdWCGloLrz6IBj+bOuuI2wD0zb8r7l45wIAYIhl4Z6XyTupQ==",
+ "dependencies": {
+ "@tanstack/query-devtools": "5.28.3"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "@tanstack/react-query": "^5.28.4",
+ "react": "^18.0.0"
+ }
+ },
"node_modules/@tanstack/react-virtual": {
"version": "3.0.0-beta.54",
"resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.0.0-beta.54.tgz",
@@ -2481,9 +2562,9 @@
"dev": true
},
"node_modules/@types/lodash": {
- "version": "4.14.202",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
- "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ=="
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz",
+ "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA=="
},
"node_modules/@types/lodash.isequal": {
"version": "4.5.8",
@@ -2499,9 +2580,9 @@
"integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
},
"node_modules/@types/node": {
- "version": "20.11.20",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz",
- "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==",
+ "version": "20.11.28",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz",
+ "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==",
"dependencies": {
"undici-types": "~5.26.4"
}
@@ -2904,49 +2985,121 @@
}
},
"node_modules/archiver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.0.tgz",
- "integrity": "sha512-R9HM9egs8FfktSqUqyjlKmvF4U+CWNqm/2tlROV+lOFg79MLdT67ae1l3hU47pGy8twSXxHoiefMCh43w0BriQ==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz",
+ "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==",
"dependencies": {
- "archiver-utils": "^5.0.0",
+ "archiver-utils": "^5.0.2",
"async": "^3.2.4",
"buffer-crc32": "^1.0.0",
"readable-stream": "^4.0.0",
"readdir-glob": "^1.1.2",
"tar-stream": "^3.0.0",
- "zip-stream": "^6.0.0"
+ "zip-stream": "^6.0.1"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/archiver-utils": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.1.tgz",
- "integrity": "sha512-MMAoLdMvT/nckofX1tCLrf7uJce4jTNkiT6smA2u57AOImc1nce7mR3EDujxL5yv6/MnILuQH4sAsPtDS8kTvg==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz",
+ "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==",
"dependencies": {
"glob": "^10.0.0",
"graceful-fs": "^4.2.0",
+ "is-stream": "^2.0.1",
"lazystream": "^1.0.0",
"lodash": "^4.17.15",
"normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
+ "readable-stream": "^4.0.0"
},
"engines": {
"node": ">= 14"
}
},
+ "node_modules/archiver-utils/node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/archiver-utils/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
"node_modules/archiver-utils/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
+ "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
},
"engines": {
- "node": ">= 6"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/archiver-utils/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/archiver-utils/node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
}
},
"node_modules/archiver/node_modules/base64-js": {
@@ -2991,14 +3144,6 @@
"ieee754": "^1.2.1"
}
},
- "node_modules/archiver/node_modules/buffer-crc32": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
- "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
- "engines": {
- "node": ">=8.0.0"
- }
- },
"node_modules/archiver/node_modules/readable-stream": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
@@ -3123,6 +3268,25 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz",
+ "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/array.prototype.findlastindex": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz",
@@ -3178,6 +3342,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/array.prototype.toreversed": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+ "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
"node_modules/array.prototype.tosorted": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
@@ -3335,9 +3511,9 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/bare-events": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz",
- "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.1.tgz",
+ "integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A==",
"optional": true
},
"node_modules/base64-js": {
@@ -3357,34 +3533,23 @@
}
},
"node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "node_modules/bl/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
+ "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
+ "readable-stream": "^2.3.5",
+ "safe-buffer": "^5.1.1"
}
},
"node_modules/brace-expansion": {
@@ -3484,11 +3649,11 @@
"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
},
"node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
+ "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
"engines": {
- "node": "*"
+ "node": ">=8.0.0"
}
},
"node_modules/buffer-fill": {
@@ -3580,9 +3745,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001591",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz",
- "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==",
+ "version": "1.0.30001597",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
+ "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==",
"funding": [
{
"type": "opencollective",
@@ -3679,6 +3844,25 @@
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
},
+ "node_modules/class-variance-authority": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz",
+ "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==",
+ "dependencies": {
+ "clsx": "2.0.0"
+ },
+ "funding": {
+ "url": "https://joebell.co.uk"
+ }
+ },
+ "node_modules/class-variance-authority/node_modules/clsx": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
+ "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/classnames": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
@@ -3736,6 +3920,14 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/clsx": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
+ "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/codemirror": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz",
@@ -3792,20 +3984,18 @@
}
},
"node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "engines": {
- "node": ">= 6"
- }
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
"node_modules/compress-commons": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.1.tgz",
- "integrity": "sha512-l7occIJn8YwlCEbWUCrG6gPms9qnJTCZSaznCa5HaV+yJMH4kM8BDc7q9NyoQuoiB2O6jKgTcTeY462qw6MyHw==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
+ "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
"dependencies": {
"crc-32": "^1.2.0",
"crc32-stream": "^6.0.0",
+ "is-stream": "^2.0.1",
"normalize-path": "^3.0.0",
"readable-stream": "^4.0.0"
},
@@ -4320,15 +4510,6 @@
"node": ">=4"
}
},
- "node_modules/decompress-tar/node_modules/bl": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
- "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
- "dependencies": {
- "readable-stream": "^2.3.5",
- "safe-buffer": "^5.1.1"
- }
- },
"node_modules/decompress-tar/node_modules/is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -4428,18 +4609,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/decompress-unzip/node_modules/get-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
- "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==",
- "dependencies": {
- "object-assign": "^4.0.1",
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/decompress/node_modules/make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
@@ -4617,14 +4786,14 @@
}
},
"node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+ "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
"dependencies": {
"end-of-stream": "^1.4.1",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
+ "stream-shift": "^1.0.2"
}
},
"node_modules/duplexify/node_modules/readable-stream": {
@@ -4646,9 +4815,9 @@
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
},
"node_modules/electron-to-chromium": {
- "version": "1.4.682",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz",
- "integrity": "sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA=="
+ "version": "1.4.707",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.707.tgz",
+ "integrity": "sha512-qRq74Mo7ChePOU6GHdfAJ0NREXU8vQTlVlfWz3wNygFay6xrd/fY2J7oGHwrhFeU30OVctGLdTh/FcnokTWpng=="
},
"node_modules/emoji-regex": {
"version": "9.2.2",
@@ -4664,9 +4833,9 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.15.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
- "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz",
+ "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -4696,18 +4865,18 @@
}
},
"node_modules/es-abstract": {
- "version": "1.22.4",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz",
- "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==",
+ "version": "1.22.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz",
+ "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==",
"dev": true,
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
"arraybuffer.prototype.slice": "^1.0.3",
- "available-typed-arrays": "^1.0.6",
+ "available-typed-arrays": "^1.0.7",
"call-bind": "^1.0.7",
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.2",
+ "es-set-tostringtag": "^2.0.3",
"es-to-primitive": "^1.2.1",
"function.prototype.name": "^1.1.6",
"get-intrinsic": "^1.2.4",
@@ -4715,15 +4884,15 @@
"globalthis": "^1.0.3",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.1",
+ "has-proto": "^1.0.3",
"has-symbols": "^1.0.3",
"hasown": "^2.0.1",
"internal-slot": "^1.0.7",
"is-array-buffer": "^3.0.4",
"is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
+ "is-negative-zero": "^2.0.3",
"is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
+ "is-shared-array-buffer": "^1.0.3",
"is-string": "^1.0.7",
"is-typed-array": "^1.1.13",
"is-weakref": "^1.0.2",
@@ -4736,10 +4905,10 @@
"string.prototype.trim": "^1.2.8",
"string.prototype.trimend": "^1.0.7",
"string.prototype.trimstart": "^1.0.7",
- "typed-array-buffer": "^1.0.1",
- "typed-array-byte-length": "^1.0.0",
- "typed-array-byte-offset": "^1.0.0",
- "typed-array-length": "^1.0.4",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.5",
"unbox-primitive": "^1.0.2",
"which-typed-array": "^1.1.14"
},
@@ -5160,27 +5329,29 @@
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.33.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
- "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+ "version": "7.34.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz",
+ "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==",
"dev": true,
"dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "array.prototype.tosorted": "^1.1.1",
+ "array-includes": "^3.1.7",
+ "array.prototype.findlast": "^1.2.4",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.toreversed": "^1.1.2",
+ "array.prototype.tosorted": "^1.1.3",
"doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.12",
+ "es-iterator-helpers": "^1.0.17",
"estraverse": "^5.3.0",
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
"minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "object.hasown": "^1.1.2",
- "object.values": "^1.1.6",
+ "object.entries": "^1.1.7",
+ "object.fromentries": "^2.0.7",
+ "object.hasown": "^1.1.3",
+ "object.values": "^1.1.7",
"prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.4",
+ "resolve": "^2.0.0-next.5",
"semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.8"
+ "string.prototype.matchall": "^4.0.10"
},
"engines": {
"node": ">=4"
@@ -5383,6 +5554,20 @@
"node": "^8.12.0 || >=9.7.0"
}
},
+ "node_modules/execa/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/execa/node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -5574,9 +5759,9 @@
}
},
"node_modules/focus-lock": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.3.tgz",
- "integrity": "sha512-hfXkZha7Xt4RQtrL1HBfspAuIj89Y0fb6GX0dfJilb8S2G/lvL4akPAcHq6xoD2NuZnDMCnZL/zQesMyeu6Psg==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.4.tgz",
+ "integrity": "sha512-Gv0N3mvej3pD+HWkNryrF8sExzEHqhQ6OSFxD4DPxm9n5HGCaHme98ZMBZroNEAJcsdtHxk+skvThGKyUeoEGA==",
"dependencies": {
"tslib": "^2.0.3"
},
@@ -5654,9 +5839,9 @@
}
},
"node_modules/framer-motion": {
- "version": "10.18.0",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.18.0.tgz",
- "integrity": "sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==",
+ "version": "11.0.8",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.0.8.tgz",
+ "integrity": "sha512-1KSGNuqe1qZkS/SWQlDnqK2VCVzRVEoval379j0FiUBJAZoqgwyvqFkfvJbgW2IPFo4wX16K+M0k5jO23lCIjA==",
"dependencies": {
"tslib": "^2.4.0"
},
@@ -5812,16 +5997,16 @@
}
},
"node_modules/get-it": {
- "version": "8.4.10",
- "resolved": "https://registry.npmjs.org/get-it/-/get-it-8.4.10.tgz",
- "integrity": "sha512-yFcSKM8qyGvycYPcnoQGYC3mxeUxXnlQnA+2DF5TyrEHWN2G5pirXylJX+/AyCQrpctEWu/163fS0g0tFnhYcw==",
+ "version": "8.4.13",
+ "resolved": "https://registry.npmjs.org/get-it/-/get-it-8.4.13.tgz",
+ "integrity": "sha512-uY9sMQmiG3RCXqzfpIwt7uI6FuL0XNHgO1U8DhWbpxWgOZ8cCNJOAwr+xkLZxpYRcQ6jFEwdr6oTG55l8u415g==",
"workspaces": [
"test-next"
],
"dependencies": {
"debug": "^4.3.4",
"decompress-response": "^7.0.0",
- "follow-redirects": "^1.15.4",
+ "follow-redirects": "^1.15.6",
"into-stream": "^6.0.0",
"is-plain-object": "^5.0.0",
"is-retry-allowed": "^2.2.0",
@@ -5866,17 +6051,15 @@
}
},
"node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
+ "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==",
"dependencies": {
- "pump": "^3.0.0"
+ "object-assign": "^4.0.1",
+ "pinkie-promise": "^2.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10.0"
}
},
"node_modules/get-symbol-description": {
@@ -5897,9 +6080,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
- "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+ "version": "4.7.3",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
+ "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==",
"dev": true,
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -6090,9 +6273,9 @@
"dev": true
},
"node_modules/groq": {
- "version": "3.30.0",
- "resolved": "https://registry.npmjs.org/groq/-/groq-3.30.0.tgz",
- "integrity": "sha512-5IV9SgX1mssyxNX2SPdCAdV9YfvGemXplDlzp4XTlvT3TCmEUmxxFZIv99Z0HFpL4SVjASuYq9A4Ne+W//BNwA==",
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/groq/-/groq-3.34.0.tgz",
+ "integrity": "sha512-Toi6xfpVo1GtL1u56B73MgciTTNERLMYMVREdyv0aGJGjuDSvs4KgKd90xRF+U/QxHhusbhHT3PII9GLRsQBBw==",
"engines": {
"node": ">=18"
}
@@ -6195,9 +6378,9 @@
"integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A=="
},
"node_modules/hasown": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
- "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -6308,9 +6491,9 @@
"integrity": "sha512-4+p3fCRF21oUqxhK0yZ6yaSP/H5/wZumc7q1fH99RkW7Q13aAxDeP78BKjoR+6y+kaHqKF/JWuQhsNuuI2NKtA=="
},
"node_modules/i18next": {
- "version": "23.10.0",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.0.tgz",
- "integrity": "sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==",
+ "version": "23.10.1",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz",
+ "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==",
"funding": [
{
"type": "individual",
@@ -6368,9 +6551,9 @@
}
},
"node_modules/immer": {
- "version": "10.0.3",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz",
- "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==",
+ "version": "10.0.4",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz",
+ "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
@@ -6690,10 +6873,13 @@
"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
},
"node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
"dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -6808,10 +6994,13 @@
}
},
"node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
"dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -6901,10 +7090,13 @@
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
"node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
"dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -6922,13 +7114,16 @@
}
},
"node_modules/is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -7341,6 +7536,14 @@
"node": "14 || >=16.14"
}
},
+ "node_modules/lucide-react": {
+ "version": "0.358.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.358.0.tgz",
+ "integrity": "sha512-rBSptRjZTMBm24zsFhR6pK/NgbT18JegZGKcH4+1H3+UigMSRpeoWLtR/fAwMYwYnlJOZB+y8WpeHne9D6X6Kg==",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/make-dir": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -7363,6 +7566,11 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/matter-js": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/matter-js/-/matter-js-0.19.0.tgz",
+ "integrity": "sha512-v2huwvQGOHTGOkMqtHd2hercCG3f6QAObTisPPHg8TZqq2lz7eIY/5i/5YUV8Ibf3mEioFEmwibcPUF2/fnKKQ=="
+ },
"node_modules/md5-o-matic": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz",
@@ -8442,9 +8650,9 @@
}
},
"node_modules/postcss-nested/node_modules/postcss-selector-parser": {
- "version": "6.0.15",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
- "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+ "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -8494,6 +8702,18 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
+ "node_modules/prettier-plugin-organize-attributes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-organize-attributes/-/prettier-plugin-organize-attributes-1.0.0.tgz",
+ "integrity": "sha512-+NmameaLxbCcylEXsKPmawtzla5EE6ECqvGkpfQz4KM847fXDifB1gFnPQEpoADAq6IXg+cMI8Z0ISJEXa6fhg==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "prettier": "^3.0.0"
+ }
+ },
"node_modules/prettier-plugin-packagejson": {
"version": "2.4.12",
"resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.12.tgz",
@@ -8513,9 +8733,9 @@
}
},
"node_modules/prettier-plugin-tailwindcss": {
- "version": "0.5.11",
- "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.11.tgz",
- "integrity": "sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==",
+ "version": "0.5.12",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.12.tgz",
+ "integrity": "sha512-o74kiDBVE73oHW+pdkFSluHBL3cYEvru5YgEqNkBMFF7Cjv+w1vI565lTlfoJT4VLWDe0FMtZ7FkE/7a4pMXSQ==",
"dev": true,
"engines": {
"node": ">=14.21.3"
@@ -8533,6 +8753,7 @@
"prettier-plugin-marko": "*",
"prettier-plugin-organize-attributes": "*",
"prettier-plugin-organize-imports": "*",
+ "prettier-plugin-sort-imports": "*",
"prettier-plugin-style-order": "*",
"prettier-plugin-svelte": "*"
},
@@ -8570,6 +8791,9 @@
"prettier-plugin-organize-imports": {
"optional": true
},
+ "prettier-plugin-sort-imports": {
+ "optional": true
+ },
"prettier-plugin-style-order": {
"optional": true
},
@@ -8793,9 +9017,9 @@
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
},
"node_modules/react-focus-lock": {
- "version": "2.11.1",
- "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.11.1.tgz",
- "integrity": "sha512-IXLwnTBrLTlKTpASZXqqXJ8oymWrgAlOfuuDYN4XCuN1YJ72dwX198UCaF1QqGUk5C3QOnlMik//n3ufcfe8Ig==",
+ "version": "2.11.2",
+ "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.11.2.tgz",
+ "integrity": "sha512-DDTbEiov0+RthESPVSTIdAWPPKic+op3sCcP+icbMRobvQNt7LuAlJ3KoarqQv5sCgKArru3kXmlmFTa27/CdQ==",
"dependencies": {
"@babel/runtime": "^7.0.0",
"focus-lock": "^1.3.2",
@@ -8814,6 +9038,21 @@
}
}
},
+ "node_modules/react-hook-form": {
+ "version": "7.51.0",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.0.tgz",
+ "integrity": "sha512-BggOy5j58RdhdMzzRUHGOYhSz1oeylFAv6jUSG86OvCIvlAvS7KvnRY7yoAf2pfEiPN7BesnR0xx73nEk3qIiw==",
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18"
+ }
+ },
"node_modules/react-i18next": {
"version": "13.5.0",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.5.0.tgz",
@@ -9301,13 +9540,13 @@
}
},
"node_modules/safe-array-concat": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz",
- "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.5",
- "get-intrinsic": "^1.2.2",
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
"has-symbols": "^1.0.3",
"isarray": "^2.0.5"
},
@@ -9513,36 +9752,33 @@
"styled-components": "^5.2 || ^6"
}
},
- "node_modules/sanity/node_modules/@floating-ui/react-dom": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
- "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
+ "node_modules/sanity-plugin-asset-source-unsplash/node_modules/@floating-ui/react-dom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.0.tgz",
+ "integrity": "sha512-Ke0oU3SeuABC2C4OFu2mSAwHIP5WUiV98O9YWoHV4Q5aT6E9k06DV0Khi5uYspR8xmmBk08t8ZDcz3TR3ARkEg==",
"dependencies": {
- "@floating-ui/dom": "^1.6.1"
+ "@floating-ui/dom": "^1.2.7"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
- "node_modules/sanity/node_modules/@sanity/color": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@sanity/color/-/color-3.0.0.tgz",
- "integrity": "sha512-JLIsloyyn0lhta/JivmYlxlcN7U3dpBNqtH7uAzM9/kPirFxWJ8LAVuF5vxK5JHwTNbgpVy6AmfIss/av7N96w==",
- "engines": {
- "node": ">=18.0.0"
- }
+ "node_modules/sanity-plugin-asset-source-unsplash/node_modules/@sanity/color": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/@sanity/color/-/color-2.2.5.tgz",
+ "integrity": "sha512-tTi22KoKuER3sldXYl4c1Dq2zU7tMLDkljFiaUKVkBbu4PBvRGCFw75kXZnD2b4Bsp6vin+7sI+AKdCKRhfRuw=="
},
- "node_modules/sanity/node_modules/@sanity/ui": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@sanity/ui/-/ui-2.0.7.tgz",
- "integrity": "sha512-Z8V92PHrQayzqh+3NHo0mBmZoFvO/CufYtkd6L83yKaPwq19aDXd5aW3bc7vS99zze1Z+T7BVG75/K6sPGf0hA==",
+ "node_modules/sanity-plugin-asset-source-unsplash/node_modules/@sanity/ui": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@sanity/ui/-/ui-1.9.3.tgz",
+ "integrity": "sha512-AdWEVFaK0Snk6xxP0lGPVP3QQYKwzkfGFpFZnL9d6UtWt8yeuS8BMLVAzmXzg14hrqH50ex9nvNl3eq6a0MWiw==",
"dependencies": {
- "@floating-ui/react-dom": "^2.0.8",
- "@sanity/color": "^3.0.0",
- "@sanity/icons": "^2.10.2",
- "csstype": "^3.1.3",
- "framer-motion": "^11.0.5",
+ "@floating-ui/react-dom": "2.0.0",
+ "@sanity/color": "^2.2.5",
+ "@sanity/icons": "^2.4.1",
+ "csstype": "^3.1.2",
+ "framer-motion": "^10.16.2",
"react-refractor": "^2.1.7"
},
"engines": {
@@ -9555,10 +9791,10 @@
"styled-components": "^5.2 || ^6"
}
},
- "node_modules/sanity/node_modules/framer-motion": {
- "version": "11.0.8",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.0.8.tgz",
- "integrity": "sha512-1KSGNuqe1qZkS/SWQlDnqK2VCVzRVEoval379j0FiUBJAZoqgwyvqFkfvJbgW2IPFo4wX16K+M0k5jO23lCIjA==",
+ "node_modules/sanity-plugin-asset-source-unsplash/node_modules/framer-motion": {
+ "version": "10.18.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.18.0.tgz",
+ "integrity": "sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==",
"dependencies": {
"tslib": "^2.4.0"
},
@@ -9578,6 +9814,15 @@
}
}
},
+ "node_modules/sanity/node_modules/@sanity/types": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/@sanity/types/-/types-3.31.0.tgz",
+ "integrity": "sha512-6DC/1yEwEplvjOq5wgsQDvDEUCKNbiCyvRNE1AJN1uXti+yroQEzBLqSeo4PeFeqbSydQmXpAQOhNwdfW8lhAQ==",
+ "dependencies": {
+ "@sanity/client": "^6.15.0",
+ "@types/react": "^18.0.25"
+ }
+ },
"node_modules/sanity/node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -9650,11 +9895,6 @@
"seek-table": "bin/seek-bzip-table"
}
},
- "node_modules/seek-bzip/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
"node_modules/semver": {
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
@@ -9686,17 +9926,17 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/set-function-length": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
- "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
"dependencies": {
- "define-data-property": "^1.1.2",
+ "define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.3",
+ "get-intrinsic": "^1.2.4",
"gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9747,12 +9987,12 @@
}
},
"node_modules/side-channel": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz",
- "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4",
"object-inspect": "^1.13.1"
@@ -10173,9 +10413,9 @@
}
},
"node_modules/style-mod": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.1.tgz",
- "integrity": "sha512-nFSNaYG2I8jgB3GZ67q7WjnHlZBzyX5OKgx89k6JkPlaNoyMlRstdBvWgo95qRgUa6tUuvpt4zZM6KWCj+oU6Q=="
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
+ "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="
},
"node_modules/styled-components": {
"version": "6.1.8",
@@ -10302,6 +10542,14 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -10353,6 +10601,33 @@
"url": "https://opencollective.com/unts"
}
},
+ "node_modules/tailwind-merge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.1.tgz",
+ "integrity": "sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.7"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwind-variants": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.2.1.tgz",
+ "integrity": "sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==",
+ "dependencies": {
+ "tailwind-merge": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=16.x",
+ "pnpm": ">=7.x"
+ },
+ "peerDependencies": {
+ "tailwindcss": "*"
+ }
+ },
"node_modules/tailwindcss": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz",
@@ -10389,10 +10664,18 @@
"node": ">=14.0.0"
}
},
+ "node_modules/tailwindcss-animate": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
+ "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders"
+ }
+ },
"node_modules/tailwindcss/node_modules/postcss-selector-parser": {
- "version": "6.0.15",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
- "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+ "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -10421,6 +10704,16 @@
"tar-stream": "^2.1.4"
}
},
+ "node_modules/tar-fs/node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
"node_modules/tar-fs/node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -10576,9 +10869,9 @@
}
},
"node_modules/ts-api-utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz",
- "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+ "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
"dev": true,
"engines": {
"node": ">=16"
@@ -10967,6 +11260,14 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/uuidv7": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-0.4.4.tgz",
@@ -11543,31 +11844,34 @@
"dev": true
},
"node_modules/which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
"dev": true,
"dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-typed-array": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
- "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
"dev": true,
"dependencies": {
- "available-typed-arrays": "^1.0.6",
- "call-bind": "^1.0.5",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-tostringtag": "^1.0.1"
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -11755,9 +12059,9 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"node_modules/yaml": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz",
- "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==",
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+ "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
"bin": {
"yaml": "bin.mjs"
},
@@ -11817,6 +12121,14 @@
"fd-slicer": "~1.1.0"
}
},
+ "node_modules/yauzl/node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -11834,12 +12146,12 @@
"integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA=="
},
"node_modules/zip-stream": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.0.tgz",
- "integrity": "sha512-X0WFquRRDtL9HR9hc1OrabOP/VKJEX7gAr2geayt3b7dLgXgSXI6ucC4CphLQP/aQt2GyHIYgmXxtC+dVdghAQ==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",
+ "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==",
"dependencies": {
"archiver-utils": "^5.0.0",
- "compress-commons": "^6.0.0",
+ "compress-commons": "^6.0.2",
"readable-stream": "^4.0.0"
},
"engines": {
@@ -11929,6 +12241,14 @@
"dependencies": {
"safe-buffer": "~5.2.0"
}
+ },
+ "node_modules/zod": {
+ "version": "3.22.4",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz",
+ "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
}
}
}
diff --git a/package.json b/package.json
index 9c75a93..f46dcf2 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,10 @@
"singleQuote": true
},
"dependencies": {
+ "@hookform/resolvers": "^3.3.4",
"@portabletext/react": "3.0.11",
+ "@radix-ui/react-label": "^2.0.2",
+ "@radix-ui/react-slot": "^1.0.2",
"@sanity/client": "6.15.1",
"@sanity/demo": "2.0.0",
"@sanity/icons": "2.10.3",
@@ -24,20 +27,31 @@
"@sanity/vision": "3.31.0",
"@sanity/visual-editing": "1.6.0",
"@tailwindcss/typography": "0.5.10",
+ "@tanstack/react-query": "^5.28.4",
+ "@tanstack/react-query-devtools": "^5.28.4",
"@vercel/og": "0.6.2",
+ "class-variance-authority": "^0.7.0",
"classnames": "2.5.1",
+ "clsx": "^2.1.0",
"get-youtube-id": "1.0.1",
"intl-segmenter-polyfill": "0.4.4",
+ "lucide-react": "^0.358.0",
+ "matter-js": "^0.19.0",
"next": "14.1.2",
"next-google-fonts": "2.2.0",
"next-sanity": "8.1.3",
"react": "18.2.0",
"react-dom": "18.2.0",
+ "react-hook-form": "^7.51.0",
"react-is": "18.2.0",
"react-lite-youtube-embed": "2.4.0",
"sanity": "3.31.0",
"sanity-plugin-asset-source-unsplash": "1.1.2",
- "styled-components": "6.1.8"
+ "styled-components": "6.1.8",
+ "tailwind-merge": "^2.2.1",
+ "tailwind-variants": "^0.2.1",
+ "tailwindcss-animate": "^1.0.7",
+ "zod": "^3.22.4"
},
"devDependencies": {
"@types/react": "18.2.63",
@@ -46,9 +60,10 @@
"eslint-config-next": "14.1.2",
"eslint-plugin-simple-import-sort": "12.0.0",
"postcss": "8.4.35",
- "prettier": "3.2.5",
+ "prettier": "^3.2.5",
+ "prettier-plugin-organize-attributes": "^1.0.0",
"prettier-plugin-packagejson": "2.4.12",
- "prettier-plugin-tailwindcss": "0.5.11",
+ "prettier-plugin-tailwindcss": "^0.5.12",
"tailwindcss": "3.4.1",
"typescript": "5.3.3"
}
diff --git a/pages/index.tsx b/pages/index.tsx
deleted file mode 100644
index 0e8dfde..0000000
--- a/pages/index.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { HomePage } from 'components/pages/home/HomePage'
-import HomePagePreview from 'components/pages/home/HomePagePreview'
-import { readToken } from 'lib/sanity.api'
-import { getClient } from 'lib/sanity.client'
-import { homePageQuery, settingsQuery } from 'lib/sanity.queries'
-import { GetStaticProps } from 'next'
-import { HomePagePayload, SettingsPayload } from 'types'
-
-import type { SharedPageProps } from './_app'
-
-interface PageProps extends SharedPageProps {
- page: HomePagePayload
- settings: SettingsPayload
-}
-
-interface Query {
- [key: string]: string
-}
-
-export default function IndexPage(props: PageProps) {
- const { page, settings, draftMode } = props
-
- if (draftMode) {
- return
- }
-
- return
-}
-
-const fallbackPage: HomePagePayload = {
- title: '',
- overview: [],
- showcaseProjects: [],
-}
-
-export const getStaticProps: GetStaticProps = async (ctx) => {
- const { draftMode = false } = ctx
- const client = getClient(draftMode ? { token: readToken } : undefined)
-
- const [settings, page] = await Promise.all([
- client.fetch(settingsQuery),
- client.fetch(homePageQuery),
- ])
-
- return {
- props: {
- page: page ?? fallbackPage,
- settings: settings ?? {},
- draftMode,
- token: draftMode ? readToken : null,
- },
- }
-}
diff --git a/public/icons/github.svg b/public/icons/github.svg
new file mode 100644
index 0000000..e9c6421
--- /dev/null
+++ b/public/icons/github.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/images/landing-page-bg.png b/public/images/landing-page-bg.png
new file mode 100644
index 0000000..c3f82b3
Binary files /dev/null and b/public/images/landing-page-bg.png differ
diff --git a/styles/index.css b/styles/index.css
index cfa52cd..b5c61c9 100644
--- a/styles/index.css
+++ b/styles/index.css
@@ -1,33 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
-
-html,
-body,
-#__next {
- height: 100%;
-}
-
-body {
- -webkit-font-smoothing: antialiased;
- margin: 0;
-}
-
-html {
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- overflow-x: hidden;
-}
-
-p:not(:last-child) {
- margin-bottom: 0.875rem;
-}
-
-ol,
-ul {
- margin-left: 1rem;
-}
-
-ol {
- list-style-type: disc;
-}
diff --git a/tailwind.config.js b/tailwind.config.js
deleted file mode 100644
index 22957a8..0000000
--- a/tailwind.config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const { theme } = require('@sanity/demo/tailwind')
-
-/** @type {import('tailwindcss').Config} */
-module.exports = {
- content: [
- './app/**/*.{js,ts,jsx,tsx}',
- './components/**/*.{js,ts,jsx,tsx}',
- './intro-template/**/*.{js,ts,jsx,tsx}',
- ],
- theme: {
- ...theme,
- // Overriding fontFamily to use @next/font loaded families
- fontFamily: {
- mono: 'var(--font-mono)',
- sans: 'var(--font-sans)',
- serif: 'var(--font-serif)',
- },
- },
- plugins: [require('@tailwindcss/typography')],
-}
diff --git a/tailwind.config.ts b/tailwind.config.ts
new file mode 100644
index 0000000..8f96e45
--- /dev/null
+++ b/tailwind.config.ts
@@ -0,0 +1,115 @@
+import type { Config } from 'tailwindcss'
+
+const config = {
+ darkMode: ['class'],
+ content: [
+ './pages/**/*.{ts,tsx}',
+ './components/**/*.{ts,tsx}',
+ './app/**/*.{ts,tsx}',
+ './src/**/*.{ts,tsx}',
+ ],
+ prefix: '',
+ theme: {
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px',
+ },
+ },
+ extend: {
+ keyframes: {
+ 'accordion-down': {
+ from: { height: '0' },
+ to: { height: 'var(--radix-accordion-content-height)' },
+ },
+ 'accordion-up': {
+ from: { height: 'var(--radix-accordion-content-height)' },
+ to: { height: '0' },
+ },
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+ },
+ colors: {
+ blackberry: {
+ 900: '#312847',
+ 800: '#433A5B',
+ 700: '#62587A',
+ 600: '#72688C',
+ 500: '#9C94B0',
+ 400: '#BBB5C6',
+ 300: '#D5D1DC',
+ 200: '#DFDCE5',
+ 100: '#ECEBEF',
+ 50: '#F5F5F7',
+ },
+ 'mulled-wine': {
+ 900: '#564663',
+ },
+ peat: {
+ 900: '#383238',
+ 800: '#4C464C',
+ 700: '#625B62',
+ 600: '#7A727A',
+ 500: '#908990',
+ 400: '#A5A1A5',
+ 300: '#CBC7CB',
+ 200: '#EAE8EA',
+ 100: '#F3F3F3',
+ 50: '#F9FAFB',
+ },
+ tangerine: {
+ 900: '#F08C00',
+ },
+ sunglow: {
+ 900: '#F27A67',
+ 800: '#F39182',
+ 700: '#F4A79A',
+ 600: '#FABBB1',
+ 500: '#FAC7BE',
+ 400: '#F7D3CD',
+ 300: '#F8DFDB',
+ 200: '#F3E6E4',
+ 100: '#F4EDEB',
+ 50: '#F9F7F6',
+ },
+ 'winter-sky': {
+ 900: '#E1EBEA',
+ 800: '#EEF3F2',
+ },
+ 'util-green': {
+ 900: '#014737',
+ 800: '#03543F',
+ 700: '#046C4E',
+ 600: '#057A55',
+ 500: '#0E9F6E',
+ 400: '#31C48D',
+ 300: '#84E1BC',
+ 200: '#BCF0DA',
+ 100: '#DEF7EC',
+ 50: '#F3FAF7',
+ },
+ 'util-red': {
+ 900: '#771D1D',
+ 800: '#9B1C1C',
+ 700: '#C81E1E',
+ 600: '#E02424',
+ 500: '#F05252',
+ 400: '#F98080',
+ 300: '#F8B4B4',
+ 200: '#FBD5D5',
+ 100: '#FDE8E8',
+ 50: '#FDF2F2',
+ },
+ },
+ fontFamily: {
+ mono: ['var(--font-karelia)'],
+ },
+ },
+ },
+ plugins: [require('tailwindcss-animate'), require('@tailwindcss/typography')],
+} satisfies Config
+
+export default config
diff --git a/tsconfig.json b/tsconfig.json
index defcc62..64606eb 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -15,6 +15,9 @@
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
+ "paths": {
+ "@/*": ["./*"]
+ },
"plugins": [
{
"name": "next"