diff --git a/apps/nextjs/next.config.mjs b/apps/nextjs/next.config.mjs
index 017c62ac..866e07af 100644
--- a/apps/nextjs/next.config.mjs
+++ b/apps/nextjs/next.config.mjs
@@ -12,7 +12,7 @@ const config = {
eslint: { ignoreDuringBuilds: !!process.env.CI },
typescript: { ignoreBuildErrors: !!process.env.CI },
images: {
- domains: ["play.google.com", "tools.applemediaservices.com", "tools.applemediaservices.com"],
+ domains: ["play.google.com", "tools.applemediaservices.com", 'i.scdn.co', "misc.scdn.co", "image-cdn-ak.spotifycdn.com", "mosaic.scdn.co"],
},
};
diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json
index 970ec482..38223dcd 100644
--- a/apps/nextjs/package.json
+++ b/apps/nextjs/package.json
@@ -18,16 +18,21 @@
"@fissa/db": "*",
"@fissa/tailwind-config": "*",
"@fissa/utils": "*",
+ "@headlessui/react": "^2.1.8",
"@tanstack/react-query": "4.36.1",
"@trpc/client": "10.21.1",
"@trpc/next": "10.21.1",
"@trpc/react-query": "10.21.1",
"@trpc/server": "10.21.1",
"@vercel/analytics": "1.2.2",
+ "clsx": "^2.1.1",
+ "framer-motion": "^11.5.6",
+ "lucide-react": "^0.445.0",
"next": "14.2.3",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-toastify": "10.0.5",
+ "use-debounce": "^10.0.3",
"zod": "3.23.8"
},
"devDependencies": {
diff --git a/apps/nextjs/public/icon.svg b/apps/nextjs/public/icon.svg
new file mode 100644
index 00000000..3f49abab
--- /dev/null
+++ b/apps/nextjs/public/icon.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/nextjs/src/components/AppDemo.tsx b/apps/nextjs/src/components/AppDemo.tsx
new file mode 100644
index 00000000..8f04ada3
--- /dev/null
+++ b/apps/nextjs/src/components/AppDemo.tsx
@@ -0,0 +1,13 @@
+import { AppScreen } from './AppScreen'
+import { TrackList } from './TrackList'
+
+
+export function AppDemo() {
+ return (
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/AppScreen.tsx b/apps/nextjs/src/components/AppScreen.tsx
new file mode 100644
index 00000000..348b7593
--- /dev/null
+++ b/apps/nextjs/src/components/AppScreen.tsx
@@ -0,0 +1,72 @@
+import clsx from 'clsx'
+import { Settings } from 'lucide-react'
+import { forwardRef } from 'react'
+import { useTheme } from '~/providers/ThemeProvider'
+
+export function AppScreen({
+ children,
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef<'div'>) {
+ return (
+
+
+
Fissa 1994
+
+
+ {children}
+
+ )
+}
+
+AppScreen.Header = forwardRef<
+ React.ElementRef<'div'>,
+ { children: React.ReactNode }
+>(function AppScreenHeader({ children }, ref) {
+ return (
+
+ {children}
+
+ )
+})
+
+AppScreen.Title = forwardRef<
+ React.ElementRef<'div'>,
+ { children: React.ReactNode }
+>(function AppScreenTitle({ children }, ref) {
+ return (
+
+ {children}
+
+ )
+})
+
+AppScreen.Subtitle = forwardRef<
+ React.ElementRef<'div'>,
+ { children: React.ReactNode }
+>(function AppScreenSubtitle({ children }, ref) {
+ return (
+
+ {children}
+
+ )
+})
+
+AppScreen.Body = forwardRef<
+ React.ElementRef<'div'>,
+ { className?: string; children: React.ReactNode }
+>(function AppScreenBody({ children, className }, ref) {
+ const { theme } = useTheme()
+
+ return (
+
+ {children}
+
+ )
+})
diff --git a/apps/nextjs/src/components/AppStoreLink.tsx b/apps/nextjs/src/components/AppStoreLink.tsx
new file mode 100644
index 00000000..8865a159
--- /dev/null
+++ b/apps/nextjs/src/components/AppStoreLink.tsx
@@ -0,0 +1,19 @@
+import Image from "next/image";
+import Link from 'next/link';
+
+export function AppStoreLink() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/Button.tsx b/apps/nextjs/src/components/Button.tsx
new file mode 100644
index 00000000..11f854a9
--- /dev/null
+++ b/apps/nextjs/src/components/Button.tsx
@@ -0,0 +1,59 @@
+import clsx from 'clsx'
+import Link from 'next/link'
+
+const baseStyles = {
+ solid:
+ 'inline-flex justify-center rounded-lg py-2 px-3 text-sm font-semibold outline-2 outline-offset-2 transition-colors',
+ outline:
+ 'inline-flex justify-center rounded-lg border py-[calc(theme(spacing.2)-1px)] px-[calc(theme(spacing.3)-1px)] text-sm outline-2 outline-offset-2 transition-colors',
+}
+
+const variantStyles = {
+ solid: {
+ cyan: 'relative overflow-hidden bg-cyan-500 text-white before:absolute before:inset-0 active:before:bg-transparent hover:before:bg-white/10 active:bg-cyan-600 active:text-white/80 before:transition-colors',
+ white:
+ 'bg-white text-cyan-900 hover:bg-white/90 active:bg-white/90 active:text-cyan-900/70',
+ gray: 'bg-gray-800 text-white hover:bg-gray-900 active:bg-gray-800 active:text-white/80',
+ },
+ outline: {
+ gray: 'border-gray-300 text-gray-700 hover:border-gray-400 active:bg-gray-100 active:text-gray-700/80',
+ },
+}
+
+type ButtonProps = (
+ | {
+ variant?: 'solid'
+ color?: keyof typeof variantStyles.solid
+ }
+ | {
+ variant: 'outline'
+ color?: keyof typeof variantStyles.outline
+ }
+) &
+ (
+ | Omit, 'color'>
+ | (Omit, 'color'> & {
+ href?: undefined
+ })
+ )
+
+export function Button({ className, ...props }: ButtonProps) {
+ props.variant ??= 'solid'
+ props.color ??= 'gray'
+
+ className = clsx(
+ baseStyles[props.variant],
+ props.variant === 'outline'
+ ? variantStyles.outline[props.color]
+ : props.variant === 'solid'
+ ? variantStyles.solid[props.color]
+ : undefined,
+ className,
+ )
+
+ return typeof props.href === 'undefined' ? (
+
+ ) : (
+
+ )
+}
diff --git a/apps/nextjs/src/components/CircleBackground.tsx b/apps/nextjs/src/components/CircleBackground.tsx
new file mode 100644
index 00000000..6b513306
--- /dev/null
+++ b/apps/nextjs/src/components/CircleBackground.tsx
@@ -0,0 +1,45 @@
+import { useId } from 'react'
+
+export function CircleBackground({
+ color,
+ ...props
+}: React.ComponentPropsWithoutRef<'svg'> & {
+ color: string
+}) {
+ const id = useId()
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/Container.tsx b/apps/nextjs/src/components/Container.tsx
new file mode 100644
index 00000000..b99121d7
--- /dev/null
+++ b/apps/nextjs/src/components/Container.tsx
@@ -0,0 +1,17 @@
+import clsx from 'clsx'
+import { useTheme } from '~/providers/ThemeProvider'
+
+export function Container({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef<'div'>) {
+ const { theme } = useTheme()
+
+ return (
+
+ )
+}
diff --git a/apps/nextjs/src/components/Faqs.tsx b/apps/nextjs/src/components/Faqs.tsx
new file mode 100644
index 00000000..28ba6cdf
--- /dev/null
+++ b/apps/nextjs/src/components/Faqs.tsx
@@ -0,0 +1,109 @@
+import { useTheme } from '~/providers/ThemeProvider'
+import { Container } from './Container'
+
+const faqs = [
+ [
+ {
+ question: 'Why shouldn\'t I host a Spotify jam istead?',
+ answer:
+ 'Fissa does not require you to be on the same network to jam. Besides, Fissa allows you to vote on the next song, allowing you to skip those bad songs on top of the queue.',
+ },
+ {
+ question: 'Can I use Fissa without a Spotify account?',
+ answer:
+ 'Unfortunately not. Fissa is just a tool for handling the order of songs in a playlist. Spotify is still doing all the hard work.',
+ },
+ {
+ question: 'Do I need a Spotify premium account?',
+ answer:
+ 'If you would like to be the host of a Fissa, you are required to have a premium subscription. Others joining your Fissa can do so on a free account.',
+ },
+ ],
+ // [
+ // {
+ // question: 'Do the people giving you tips realize what they are doing?',
+ // answer:
+ // 'Again I would argue this isn’t really our responsibility. People make their own choices. If they don’t research the consequences that’s on them, not on us.',
+ // },
+ // {
+ // question: 'Where is Pocket based?',
+ // answer:
+ // 'Let’s just say it’s not somewhere where the SEC is going to find us.',
+ // },
+ // {
+ // question: 'Is there any age limit to trading on Pocket?',
+ // answer:
+ // 'For our free plan, the age limit is based on the minimum age to trade in your country of residence. Our VIP plan uses advanced transaction anonymization though, so you can use that plan even if you’re 9 years old. Or a dog.',
+ // },
+ // ],
+ [
+ {
+ question: 'Can Fissa also do...',
+ answer:
+ 'Probably not, but we love to hear your ideas! Reach out to us for any feature request you have. We are always looking for ways to improve Fissa.',
+ },
+ {
+ question: 'How can I support Fissa?',
+ answer:
+ 'Tell you friends, colleagues, grandma and her cat! Fissa is a small hobby project and we would love to see it grow.',
+ },
+ {
+ question: 'Fissa is awesome!',
+ answer:
+ 'Not realy a question, but thank you. You are awesome too!',
+ },
+ ],
+]
+
+export function Faqs() {
+ const { theme } = useTheme()
+
+ return (
+
+
+
+
+ Frequently asked questions
+
+
+ If you have anything else you want to ask,{' '}
+
+ reach out to us
+
+ .
+
+
+
+ {faqs.map((column, columnIndex) => (
+
+
+ {column.map((faq, faqIndex) => (
+
+
+ {faq.question}
+
+ {faq.answer}
+
+ ))}
+
+
+ ))}
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/Fields.tsx b/apps/nextjs/src/components/Fields.tsx
new file mode 100644
index 00000000..df9fa1ab
--- /dev/null
+++ b/apps/nextjs/src/components/Fields.tsx
@@ -0,0 +1,47 @@
+import clsx from 'clsx';
+import { useId } from 'react';
+
+const formClasses =
+ 'block w-full appearance-none rounded-lg border border-gray-200 bg-white py-[calc(theme(spacing.2)-1px)] px-[calc(theme(spacing.3)-1px)] text-gray-900 placeholder:text-gray-400 focus:border-cyan-500 focus:outline-none focus:ring-cyan-500 sm:text-sm'
+
+function Label({ id, children }: { id: string; children: React.ReactNode }) {
+ return (
+
+ {children}
+
+ )
+}
+
+export function TextField({
+ label,
+ type = 'text',
+ className,
+ ...props
+}: Omit, 'id'> & { label?: string }) {
+ const id = useId()
+
+ return (
+
+ {label && {label} }
+
+
+ )
+}
+
+export function SelectField({
+ label,
+ className,
+ ...props
+}: Omit, 'id'> & { label?: string }) {
+ const id = useId()
+
+ return (
+
+ {label && {label} }
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/FissaCode.tsx b/apps/nextjs/src/components/FissaCode.tsx
new file mode 100644
index 00000000..ccbe2cbf
--- /dev/null
+++ b/apps/nextjs/src/components/FissaCode.tsx
@@ -0,0 +1,126 @@
+"use client"
+
+import { useCallback, useMemo, useRef, useState, type ChangeEvent, type KeyboardEvent } from "react";
+import { useTheme } from "~/providers/ThemeProvider";
+import { api } from "~/utils/api";
+import { toast } from "./Toast";
+
+export function FissaCode() {
+ const { theme } = useTheme();
+ const [pin, setPin] = useState(["", "", "", ""]);
+ const [focussedIndex, setFocussedIndex] = useState(-1);
+
+ api.fissa.byId.useQuery(pin.includes("") ? "" : pin.join(""), {
+ retry: false,
+ enabled: !pin.includes(""),
+ onSuccess: (data) => {
+ window.location.href = `/fissa/${data.pin}`;
+ },
+ onError: (error) => {
+ toast.error({ message: error.message });
+ handleClear();
+ },
+ });
+
+ const key1 = useRef(null);
+ const key2 = useRef(null);
+ const key3 = useRef(null);
+ const key4 = useRef(null);
+
+ const keys = useMemo(() => [key1, key2, key3, key4], [key1, key2, key3, key4]);
+
+ const handleFocus = useCallback(
+ (selectedIndex: number) => () => {
+ keys.forEach(({ current }, index) => {
+ if (index < selectedIndex) return;
+ if (!current) return;
+ current.value = "";
+ setPin((prev) => {
+ const newPin = [...prev];
+ newPin[index] = "";
+ return newPin;
+ });
+ });
+
+ setFocussedIndex(selectedIndex);
+ if (selectedIndex === 0) return;
+ if (pin[selectedIndex - 1] === "") keys[selectedIndex - 1]?.current?.focus();
+ },
+ [keys, pin],
+ );
+
+ const handleChange = useCallback(
+ (index: number) => (e: ChangeEvent) => {
+ const { value } = e.target;
+ if (isNaN(Number(value))) return;
+ const nextIndex = index + (value === "" ? -1 : 1);
+ const next = keys[nextIndex];
+ setTimeout(() => {
+ next?.current?.focus();
+ }, 10);
+
+ setFocussedIndex(nextIndex);
+ setPin((prev) => {
+ const newPin = [...prev];
+ newPin[index] = value;
+ return newPin;
+ });
+ },
+ [keys],
+ );
+
+ const handleKeyDown = useCallback(
+ (index: number) => (e: KeyboardEvent) => {
+ if (e.key !== "Backspace") return;
+ if (index === 0) return;
+ if (pin[index] !== "") return;
+ keys[index - 1]?.current?.focus();
+ },
+ [keys, pin],
+ );
+
+ const handleClear = useCallback(() => {
+ setPin(["", "", "", ""]);
+ setFocussedIndex(-1);
+ setTimeout(() => {
+ keys[0]?.current?.focus();
+ }, 100);
+ }, [keys]);
+
+ return (
+
+
+ {keys.map((key, index) => (
+
+ ))}
+
+
+ clear code
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/Footer.tsx b/apps/nextjs/src/components/Footer.tsx
new file mode 100644
index 00000000..bd376d5c
--- /dev/null
+++ b/apps/nextjs/src/components/Footer.tsx
@@ -0,0 +1,42 @@
+
+import { useTheme } from '~/providers/ThemeProvider'
+import { AppStoreLink } from './AppStoreLink'
+import { Container } from './Container'
+import { Logomark } from './Logo'
+import { NavLinks } from './NavLinks'
+import { PlayStoreLink } from './PlayStoreLink'
+
+export function Footer() {
+ const { theme } = useTheme()
+
+ return (
+
+
+
+
+
+
+
+
Fissa
+
Everyone can be a DJ.
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/Header.tsx b/apps/nextjs/src/components/Header.tsx
new file mode 100644
index 00000000..ccabc4dc
--- /dev/null
+++ b/apps/nextjs/src/components/Header.tsx
@@ -0,0 +1,111 @@
+import {
+ Popover,
+ PopoverBackdrop,
+ PopoverButton,
+ PopoverPanel,
+} from '@headlessui/react'
+import { AnimatePresence, motion } from 'framer-motion'
+import Link from 'next/link'
+
+import { ChevronUp, MenuIcon } from 'lucide-react'
+import { useTheme } from '~/providers/ThemeProvider'
+import { Container } from './Container'
+import { Logo } from './Logo'
+import { NavLinks } from './NavLinks'
+
+function MobileNavLink(
+ props: Omit<
+ React.ComponentPropsWithoutRef>,
+ 'as' | 'className'
+ >,
+) {
+ const { theme } = useTheme()
+
+ return (
+
+ )
+}
+
+export function Header() {
+ const { theme } = useTheme()
+ return (
+
+
+
+
+
+
+ {({ open }) => (
+ <>
+
+ {({ open }) =>
+ open ? (
+
+ ) : (
+
+ )
+ }
+
+
+ {open && (
+ <>
+
+
+
+
+ Features
+
+
+ Join a Fissa
+
+ FAQs
+
+
+ >
+ )}
+
+ >
+ )}
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/Hero.tsx b/apps/nextjs/src/components/Hero.tsx
new file mode 100644
index 00000000..9898d6c5
--- /dev/null
+++ b/apps/nextjs/src/components/Hero.tsx
@@ -0,0 +1,93 @@
+import { useId } from 'react'
+
+// import logoBbc from '@/images/logos/bbc.svg'
+// import logoCbs from '@/images/logos/cbs.svg'
+// import logoCnn from '@/images/logos/cnn.svg'
+// import logoFastCompany from '@/images/logos/fast-company.svg'
+// import logoForbes from '@/images/logos/forbes.svg'
+// import logoHuffpost from '@/images/logos/huffpost.svg'
+// import logoTechcrunch from '@/images/logos/techcrunch.svg'
+// import logoWired from '@/images/logos/wired.svg'
+import { useTheme } from '~/providers/ThemeProvider'
+import { AppDemo } from './AppDemo'
+import { AppStoreLink } from './AppStoreLink'
+import { Container } from './Container'
+import { PhoneFrame } from './PhoneFrame'
+import { PlayStoreLink } from './PlayStoreLink'
+
+function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
+ const id = useId()
+ const {theme} = useTheme()
+
+ return (
+
+ )
+}
+
+export function Hero() {
+ const { theme } = useTheme()
+
+ return (
+
+
+
+
+
+ Not only one person should decide what is playing on a party
+
+
+ Having friends at a party with a bad taste in music stinks. Use Fissa to create a collaborative and democratic playlist for everyone to enjoy.
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/JoinAFissa.tsx b/apps/nextjs/src/components/JoinAFissa.tsx
new file mode 100644
index 00000000..1a8f7b61
--- /dev/null
+++ b/apps/nextjs/src/components/JoinAFissa.tsx
@@ -0,0 +1,57 @@
+import { useMemo } from "react";
+import { useTheme } from "~/providers/ThemeProvider";
+import { api } from "~/utils/api";
+import { Container } from "./Container";
+import { FissaCode } from "./FissaCode";
+
+export function JoinAFissa() {
+ const { theme } = useTheme();
+ const { data } = api.fissa.activeFissaCount.useQuery(undefined, {
+ refetchInterval: 1000 * 60 * 5
+ })
+
+ const amount = useMemo(() => {
+ if(data && data > 0) {
+ return data
+ }
+
+ return Math.ceil(Math.random() * 3)
+ }, [data])
+
+ const prefix = useMemo(() => {
+ if(amount === 1) {
+ return 'is'
+ }
+
+ return 'are'
+ }, [amount])
+
+ const suffix = useMemo(() => {
+ if(amount === 1) {
+ return 'Fissa'
+ }
+
+ return 'Fissa\'s'
+ }, [amount])
+
+ return (
+
+
+
+
+ Join a Fissa
+
+
+ There {prefix} {amount} active {suffix}
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/Layout.tsx b/apps/nextjs/src/components/Layout.tsx
index 93440baa..692096a3 100644
--- a/apps/nextjs/src/components/Layout.tsx
+++ b/apps/nextjs/src/components/Layout.tsx
@@ -1,16 +1,13 @@
import { type FC, type PropsWithChildren } from "react";
-import { theme } from "@fissa/tailwind-config";
+import { Footer } from "./Footer";
+import { Header } from "./Header";
export const Layout: FC = ({ children }) => {
return (
-
- {children}
-
+ <>
+
+ {children}
+
+ >
);
};
diff --git a/apps/nextjs/src/components/Logo.tsx b/apps/nextjs/src/components/Logo.tsx
new file mode 100644
index 00000000..60e4d30e
--- /dev/null
+++ b/apps/nextjs/src/components/Logo.tsx
@@ -0,0 +1,25 @@
+export function Logomark(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export function Logo(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/NavLinks.tsx b/apps/nextjs/src/components/NavLinks.tsx
new file mode 100644
index 00000000..2b9bfc6d
--- /dev/null
+++ b/apps/nextjs/src/components/NavLinks.tsx
@@ -0,0 +1,51 @@
+import { AnimatePresence, motion } from 'framer-motion'
+import Link from 'next/link'
+import { useRef, useState } from 'react'
+import { useTheme } from '~/providers/ThemeProvider'
+
+export function NavLinks() {
+ const [hoveredIndex, setHoveredIndex] = useState(null)
+ const timeoutRef = useRef(null)
+ const { theme} = useTheme()
+
+ return ([
+ ['Features', '/#features'],
+ ['Join a Fissa', '/#join-a-fissa'],
+ ['FAQs', '/#faqs'],
+ ] as const).map(([label, href], index) => (
+ {
+ if (timeoutRef.current) {
+ window.clearTimeout(timeoutRef.current)
+ }
+ setHoveredIndex(index)
+ }}
+ onMouseLeave={() => {
+ timeoutRef.current = window.setTimeout(() => {
+ setHoveredIndex(null)
+ }, 200)
+ }}
+ >
+
+ {hoveredIndex === index && (
+
+ )}
+
+ {label}
+
+ ))
+}
diff --git a/apps/nextjs/src/components/PhoneFrame.tsx b/apps/nextjs/src/components/PhoneFrame.tsx
new file mode 100644
index 00000000..a8c5fafa
--- /dev/null
+++ b/apps/nextjs/src/components/PhoneFrame.tsx
@@ -0,0 +1,47 @@
+import clsx from 'clsx'
+import Image from 'next/image'
+
+import { useTheme } from '~/providers/ThemeProvider'
+import frame from '../images/phone-frame.svg'
+
+function PlaceholderFrame(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+
+ )
+}
+
+export function PhoneFrame({
+ className,
+ children,
+ priority = false,
+ ...props
+}: React.ComponentPropsWithoutRef<'div'> & { priority?: boolean }) {
+ const { theme } = useTheme()
+
+ return (
+
+ )
+}
diff --git a/apps/nextjs/src/components/PlayStoreLink.tsx b/apps/nextjs/src/components/PlayStoreLink.tsx
new file mode 100644
index 00000000..c256d17e
--- /dev/null
+++ b/apps/nextjs/src/components/PlayStoreLink.tsx
@@ -0,0 +1,19 @@
+import Image from "next/image";
+import Link from 'next/link';
+
+export function PlayStoreLink() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/PrimaryFeatures.tsx b/apps/nextjs/src/components/PrimaryFeatures.tsx
new file mode 100644
index 00000000..c4437554
--- /dev/null
+++ b/apps/nextjs/src/components/PrimaryFeatures.tsx
@@ -0,0 +1,476 @@
+import { Tab, TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/react'
+import clsx from 'clsx'
+import {
+ AnimatePresence,
+ motion,
+ type MotionProps,
+ type Variant,
+ type Variants,
+} from 'framer-motion'
+import Image from 'next/image'
+import { Fragment, useEffect, useRef, useState } from 'react'
+import { useDebouncedCallback } from 'use-debounce'
+
+import { ArrowDown, ArrowUp, ChevronRight, Disc3, Music, SearchIcon, Vote } from 'lucide-react'
+import { useTheme } from '~/providers/ThemeProvider'
+import { AppScreen } from './AppScreen'
+import { CircleBackground } from './CircleBackground'
+import { Container } from './Container'
+import { PhoneFrame } from './PhoneFrame'
+import { TrackList } from './TrackList'
+
+const MotionAppScreenBody = motion(AppScreen.Body)
+
+interface CustomAnimationProps {
+ isForwards: boolean
+ changeCount: number
+}
+
+const features = [
+ {
+ name: 'Up- and down-vote songs',
+ description:
+ 'Vote on songs to make sure the best songs are played at the right time.',
+ icon: Vote,
+ screen: UpAndDownVote,
+ },
+ {
+ name: 'Add songs directly from your Spotify playlists',
+ description:
+ 'Show off your favorite tunes with easy access to all your playlists.',
+ icon: Music,
+ screen: AddSongsFromSpotify,
+ },
+ {
+ name: 'The Fissa never stops',
+ description:
+ 'Ensures there will always be music playing, based on the vibes of the Fissa.',
+ icon: Disc3,
+ screen: TheFissaNeverStops,
+ },
+]
+
+const headerAnimation: Variants = {
+ initial: { opacity: 0, transition: { duration: 0.3 } },
+ animate: { opacity: 1, transition: { duration: 0.3, delay: 0.3 } },
+ exit: { opacity: 0, transition: { duration: 0.3 } },
+}
+
+const maxZIndex = 2147483647
+
+const bodyVariantBackwards: Variant = {
+ opacity: 0.4,
+ scale: 0.8,
+ zIndex: 0,
+ filter: 'blur(4px)',
+ transition: { duration: 0.4 },
+}
+
+const bodyVariantForwards: Variant = (custom: CustomAnimationProps) => ({
+ y: '100%',
+ zIndex: maxZIndex - custom.changeCount,
+ transition: { duration: 0.4 },
+})
+
+const bodyAnimation: MotionProps = {
+ initial: 'initial',
+ animate: 'animate',
+ exit: 'exit',
+ variants: {
+ initial: (custom: CustomAnimationProps, ...props) =>
+ custom.isForwards
+ ? bodyVariantForwards(custom, ...props)
+ : bodyVariantBackwards,
+ animate: (custom: CustomAnimationProps) => ({
+ y: '0%',
+ opacity: 1,
+ scale: 1,
+ zIndex: maxZIndex / 2 - custom.changeCount,
+ filter: 'blur(0px)',
+ transition: { duration: 0.4 },
+ }),
+ exit: (custom: CustomAnimationProps, ...props) =>
+ custom.isForwards
+ ? bodyVariantBackwards
+ : bodyVariantForwards(custom, ...props),
+ },
+}
+
+type ScreenProps =
+ | {
+ animated: true
+ custom: CustomAnimationProps
+ }
+ | { animated?: false }
+
+function AddSongsFromSpotify(props: ScreenProps) {
+ const {theme} = useTheme()
+ return (
+
+
+
+
+ Your playlists
+
+
+
+
+
+ Liked songs
+
+
Xiduzo • 69 songs
+
+
+
+
+
+
+
+
+
+ Cozy uppers
+
+
Milan van der Maaten • 77 s...
+
+
+
+
+
+
+
+
+
+ Gezellige boel
+
+
Bella van Buren • 71 songs
+
+
+
+
+
+
+
+
+
+ Ritmo Latino
+
+
Val Oceguera • 17 songs
+
+
+
+
+
+
+
+
+
+ RapCaviar
+
+
Spotify • 50 songs
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function UpAndDownVote(props: ScreenProps) {
+ const {theme} = useTheme()
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ Up-vote song
+ It might move up the queue
+
+
+
+
+
+ Down-vote song
+ It might move down the queue
+
+
+
+
+
+
+
+ )
+}
+
+function TheFissaNeverStops(props: ScreenProps) {
+ const {theme} = useTheme()
+
+ return (
+
+
+
+
+ 🦦
+ Add songs or I'll fill the queue
+
+
+
+ )
+}
+
+function usePrevious(value: T) {
+ const ref = useRef()
+
+ useEffect(() => {
+ ref.current = value
+ }, [value])
+
+ return ref.current
+}
+
+function FeaturesDesktop() {
+ const { theme } = useTheme()
+
+ const [changeCount, setChangeCount] = useState(0)
+ const [selectedIndex, setSelectedIndex] = useState(0)
+ const prevIndex = usePrevious(selectedIndex)
+ const isForwards = prevIndex === undefined ? true : selectedIndex > prevIndex
+
+ const onChange = useDebouncedCallback(
+ (selectedIndex: number) => {
+ setSelectedIndex(selectedIndex)
+ setChangeCount((changeCount) => changeCount + 1)
+ },
+ 100,
+ { leading: true },
+ )
+
+ return (
+
+
+ {features.map((feature, featureIndex) => (
+
+ {featureIndex === selectedIndex && (
+
+ )}
+
+
+
+
+
+ {feature.name}
+
+
+
+ {feature.description}
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+ {features.map((feature, featureIndex) =>
+ selectedIndex === featureIndex ? (
+
+
+
+ ) : null,
+ )}
+
+
+
+
+
+ )
+}
+
+function FeaturesMobile() {
+ const [activeIndex, setActiveIndex] = useState(0)
+ const slideContainerRef = useRef>(null)
+ const slideRefs = useRef>>([])
+ const { theme } = useTheme()
+
+ useEffect(() => {
+ const observer = new window.IntersectionObserver(
+ (entries) => {
+ for (const entry of entries) {
+ if (entry.isIntersecting && entry.target instanceof HTMLDivElement) {
+ setActiveIndex(slideRefs.current.indexOf(entry.target))
+ break
+ }
+ }
+ },
+ {
+ root: slideContainerRef.current,
+ threshold: 0.6,
+ },
+ )
+
+ for (const slide of slideRefs.current) {
+ if (slide) {
+ observer.observe(slide)
+ }
+ }
+
+ return () => {
+ observer.disconnect()
+ }
+ }, [slideContainerRef, slideRefs])
+
+ return (
+ <>
+
+ {features.map((feature, featureIndex) => (
+
ref && (slideRefs.current[featureIndex] = ref)}
+ className="w-full flex-none snap-center px-4 sm:px-6"
+ >
+
+
+
+
+
+
+
+
+
+
+ {feature.name}
+
+
+ {feature.description}
+
+
+
+
+ ))}
+
+
+ {features.map((_, featureIndex) => (
+ {
+ slideRefs.current[featureIndex]?.scrollIntoView({
+ block: 'nearest',
+ inline: 'nearest',
+ })
+ }}
+ >
+
+
+ ))}
+
+ >
+ )
+}
+
+export function PrimaryFeatures() {
+ const { theme } = useTheme()
+
+ return (
+
+
+
+
+ A collaborative and democratic playlist
+
+
+ Powered by Spotify, controlled by you. Host a Fissa and let the crowd decide what to play next!
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/SecondaryFeatures.tsx b/apps/nextjs/src/components/SecondaryFeatures.tsx
new file mode 100644
index 00000000..7228d1a6
--- /dev/null
+++ b/apps/nextjs/src/components/SecondaryFeatures.tsx
@@ -0,0 +1,230 @@
+import { useId } from 'react'
+
+import { useTheme } from '~/providers/ThemeProvider'
+import { Container } from './Container'
+
+const features = [
+ {
+ name: 'Invest any amount',
+ description:
+ 'Whether it’s $1 or $1,000,000, we can put your money to work for you.',
+ icon: DeviceArrowIcon,
+ },
+ {
+ name: 'Build a balanced portfolio',
+ description:
+ 'Invest in different industries to find the most opportunities to win huge.',
+ icon: DeviceCardsIcon,
+ },
+ {
+ name: 'Trade in real-time',
+ description:
+ 'Get insider tips on big stock moves and act on them within seconds.',
+ icon: DeviceClockIcon,
+ },
+ {
+ name: 'Profit from your network',
+ description:
+ 'Invite new insiders to get tips faster and beat even other Pocket users.',
+ icon: DeviceListIcon,
+ },
+ {
+ name: 'Encrypted and anonymized',
+ description:
+ 'Cutting-edge security technology that even the NSA doesn’t know about keeps you hidden.',
+ icon: DeviceLockIcon,
+ },
+ {
+ name: 'Portfolio tracking',
+ description:
+ 'Watch your investments grow exponentially, leaving other investors in the dust.',
+ icon: DeviceChartIcon,
+ },
+]
+
+function DeviceArrowIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+
+
+ )
+}
+
+function DeviceCardsIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ const id = useId()
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function DeviceClockIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+
+
+ )
+}
+
+function DeviceListIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+
+
+
+
+
+ )
+}
+
+function DeviceLockIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+
+
+ )
+}
+
+function DeviceChartIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
+ return (
+
+
+
+
+
+
+ )
+}
+
+export function SecondaryFeatures() {
+ const { theme } = useTheme()
+
+ return (
+
+
+
+
+ Now is the time to build your portfolio.
+
+
+ With typical market returns, you have to start young to secure your
+ future. With Pocket, it’s never too late to build your nest egg.
+
+
+
+ {features.map((feature) => (
+
+
+
+ {feature.name}
+
+ {feature.description}
+
+ ))}
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/components/TrackList.tsx b/apps/nextjs/src/components/TrackList.tsx
new file mode 100644
index 00000000..5fec7029
--- /dev/null
+++ b/apps/nextjs/src/components/TrackList.tsx
@@ -0,0 +1,77 @@
+import { ArrowDown, ArrowUp, EllipsisVertical, SkipForward } from 'lucide-react'
+import Image from 'next/image'
+import { useTheme } from "~/providers/ThemeProvider"
+
+export function TrackList() {
+ const {theme} = useTheme()
+
+ return (
+
+
+
+
+
+ Ik Fok Met Jou
+ Hef, Frsh, Eves Laurent
+
+
+
+
+
+
+
+
+
+ Nunca Es Suficiente
+
+
+8
+
Los Angeles Azules, N...
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oh Devil (feat. Devin...
+
+
0
+
Electric Guest, Devin Di...
+
+
+
+
+
+
+
+
+
+ Never Gonna Give Yo...
+
+
+
+
+
+
+ )
+}
diff --git a/apps/nextjs/src/images/phone-frame.svg b/apps/nextjs/src/images/phone-frame.svg
new file mode 100644
index 00000000..369d9e8f
--- /dev/null
+++ b/apps/nextjs/src/images/phone-frame.svg
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/nextjs/src/images/qr-code.svg b/apps/nextjs/src/images/qr-code.svg
new file mode 100644
index 00000000..9157d930
--- /dev/null
+++ b/apps/nextjs/src/images/qr-code.svg
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/nextjs/src/pages/fissa/[pin].tsx b/apps/nextjs/src/pages/fissa/[pin].tsx
index 96834bb5..fc66bae3 100644
--- a/apps/nextjs/src/pages/fissa/[pin].tsx
+++ b/apps/nextjs/src/pages/fissa/[pin].tsx
@@ -1,8 +1,9 @@
import { type NextPage } from "next";
import Head from "next/head";
-import Image from "next/image";
import { useRouter } from "next/router";
import { useRef } from "react";
+import { Button } from "~/components/Button";
+import { Container } from "~/components/Container";
import { Layout } from "~/components/Layout";
import { toast } from "~/components/Toast";
@@ -12,6 +13,7 @@ import { api } from "~/utils/api";
const JoinFissa: NextPage = () => {
const { query } = useRouter();
const { theme } = useTheme();
+ console.log(theme)
const shown = useRef(false);
const router = useRouter();
@@ -37,38 +39,30 @@ const JoinFissa: NextPage = () => {
-
- Join the Fissa!
-
- You have been invited to join Fissa{" "}
-
- {query.pin}
-
- , become the DJ you have always dreamt to be.
-
-
+
+
+
+
+ You have been invited to join Fissa {query.pin},
+
+
+ become the DJ you have always dreamt to be.
+
+
{
+ window.location.replace(`com.fissa://fissa/${query.pin}`);
+ }}
+ >
+ Join Fissa {query.pin}
+
+
+
>
diff --git a/apps/nextjs/src/pages/index.tsx b/apps/nextjs/src/pages/index.tsx
index 37edaf75..612120ee 100644
--- a/apps/nextjs/src/pages/index.tsx
+++ b/apps/nextjs/src/pages/index.tsx
@@ -1,102 +1,13 @@
-import {
- useCallback,
- useEffect,
- useMemo,
- useRef,
- useState,
- type ChangeEvent,
- type KeyboardEvent,
-} from "react";
import type { NextPage } from "next";
import Head from "next/head";
+import { Faqs } from "~/components/Faqs";
-import { api } from "~/utils/api";
-import { hexToRgb } from "~/utils/hexToRgb";
+import { Hero } from "~/components/Hero";
+import { JoinAFissa } from "~/components/JoinAFissa";
import { Layout } from "~/components/Layout";
-import { toast } from "~/components/Toast";
-import { useTheme } from "~/providers/ThemeProvider";
+import { PrimaryFeatures } from "~/components/PrimaryFeatures";
const Home: NextPage = () => {
- const { theme } = useTheme();
- const [pin, setPin] = useState(["", "", "", ""]);
- api.fissa.byId.useQuery(pin.includes("") ? "" : pin.join(""), {
- retry: false,
- enabled: !pin.includes(""),
- onSuccess: (data) => {
- window.location.href = `/fissa/${data.pin}`;
- },
- onError: (error) => {
- toast.error({ message: error.message });
- handleClear();
- },
- });
-
- const key1 = useRef(null);
- const key2 = useRef(null);
- const key3 = useRef(null);
- const key4 = useRef(null);
-
- const keys = useMemo(() => [key1, key2, key3, key4], [key1, key2, key3, key4]);
-
- const handleFocus = useCallback(
- (selectedIndex: number) => () => {
- keys.forEach(({ current }, index) => {
- if (index < selectedIndex) return;
- if (!current) return;
- current.value = "";
- setPin((prev) => {
- const newPin = [...prev];
- newPin[index] = "";
- return newPin;
- });
- });
-
- if (selectedIndex === 0) return;
- if (pin[selectedIndex - 1] === "") keys[selectedIndex - 1]?.current?.focus();
- },
- [keys, pin],
- );
-
- const handleChange = useCallback(
- (index: number) => (e: ChangeEvent) => {
- const { value } = e.target;
- if (isNaN(Number(value))) return;
- const nextIndex = index + (value === "" ? -1 : 1);
- const next = keys[nextIndex];
- setTimeout(() => {
- next?.current?.focus();
- }, 10);
-
- setPin((prev) => {
- const newPin = [...prev];
- newPin[index] = value;
- return newPin;
- });
- },
- [keys],
- );
-
- const handleKeyDown = useCallback(
- (index: number) => (e: KeyboardEvent) => {
- if (e.key !== "Backspace") return;
- if (index === 0) return;
- if (pin[index] !== "") return;
- keys[index - 1]?.current?.focus();
- },
- [keys, pin],
- );
-
- const handleClear = useCallback(() => {
- setPin(["", "", "", ""]);
- setTimeout(() => {
- keys[0]?.current?.focus();
- }, 100);
- }, [keys]);
-
- useEffect(() => {
- keys[0]?.current?.focus();
- }, [keys]);
-
return (
<>
@@ -105,47 +16,10 @@ const Home: NextPage = () => {
-
-
- Enter the session code of the Fissa you want to join
-
-
- {keys.map((key, index) => (
-
- ))}
-
-
- clear code
-
-
+
+
+
+
>
);
diff --git a/apps/nextjs/src/providers/ThemeProvider.tsx b/apps/nextjs/src/providers/ThemeProvider.tsx
index 16c79c18..abe8834d 100644
--- a/apps/nextjs/src/providers/ThemeProvider.tsx
+++ b/apps/nextjs/src/providers/ThemeProvider.tsx
@@ -1,15 +1,17 @@
-import { theme } from "@fissa/tailwind-config";
-import { createContext, useContext, useEffect, type FC, type PropsWithChildren } from "react";
+import { themes, type Theme } from "@fissa/tailwind-config";
+import { createContext, useContext, type FC, type PropsWithChildren } from "react";
+
+function getTheme() {
+ const minute = new Date().getMinutes();
+
+ return themes.at(Math.floor(minute / 10))
+}
+
+const theme = getTheme() as Theme;
const ThemeContext = createContext({ theme });
export const ThemeProvider: FC = ({ children }) => {
- // TODO: make this neater
- useEffect(() => {
- document.getElementsByTagName("main")[0]?.style.setProperty("background-color", theme["900"]);
- document.getElementsByTagName("html")[0]?.style.setProperty("color", theme["100"]);
- }, []);
-
return {children} ;
};
diff --git a/apps/nextjs/src/utils/hexToRgb.ts b/apps/nextjs/src/utils/hexToRgb.ts
deleted file mode 100644
index 1dbb8888..00000000
--- a/apps/nextjs/src/utils/hexToRgb.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-export const hexToRgb = (hex: string) => {
- let r = "",
- g = "",
- b = "";
-
- // 3 digits
- if (hex.length < 7) {
- r = `0x${hex[1]}${hex[1]}`;
- g = `0x${hex[2]}${hex[2]}`;
- b = `0x${hex[3]}${hex[3]}`;
-
- // 6 digits
- } else {
- r = `0x${hex[1]}${hex[2]}`;
- g = `0x${hex[3]}${hex[4]}`;
- b = `0x${hex[5]}${hex[6]}`;
- }
-
- return { r: +r, g: +g, b: +b, rgb: `${+r} ${+g} ${+b}` };
-};
diff --git a/apps/nextjs/tailwind.config.cjs b/apps/nextjs/tailwind.config.cjs
index 589559b0..4d845f3e 100644
--- a/apps/nextjs/tailwind.config.cjs
+++ b/apps/nextjs/tailwind.config.cjs
@@ -3,6 +3,26 @@ const config = {
content: ["./src/**/*.tsx"],
// @ts-ignore
presets: [require("@fissa/tailwind-config")],
+ theme: {
+ extend: {
+ animation: {
+ 'fade-in': 'fade-in 0.5s linear forwards',
+ marquee: 'marquee var(--marquee-duration) linear infinite',
+ 'spin-slow': 'spin 4s linear infinite',
+ 'spin-slower': 'spin 6s linear infinite',
+ 'spin-reverse': 'spin-reverse 1s linear infinite',
+ 'spin-reverse-slow': 'spin-reverse 4s linear infinite',
+ 'spin-reverse-slower': 'spin-reverse 6s linear infinite',
+ },
+ keyframes: {
+ 'spin-reverse': {
+ to: {
+ transform: 'rotate(-360deg)',
+ },
+ },
+ }
+ }
+ }
};
module.exports = config;
diff --git a/packages/api/src/router/fissa.ts b/packages/api/src/router/fissa.ts
index 8d0a5a91..34b603ae 100644
--- a/packages/api/src/router/fissa.ts
+++ b/packages/api/src/router/fissa.ts
@@ -17,6 +17,10 @@ const sync = createTRPCRouter({
});
export const fissaRouter = createTRPCRouter({
+ activeFissaCount: publicProcedure.query(({ ctx }) => {
+ const service = new FissaService(ctx, new SpotifyService(), new BadgeService(ctx));
+ return service.activeFissasCount();
+ }),
skipTrack: protectedProcedure.input(Z_PIN).mutation(({ ctx, input }) => {
const service = new FissaService(ctx, new SpotifyService(), new BadgeService(ctx));
return service.skipTrack(input, ctx.session.user.id);
diff --git a/packages/api/src/service/FissaService.ts b/packages/api/src/service/FissaService.ts
index f85115b4..a6b40fd6 100644
--- a/packages/api/src/service/FissaService.ts
+++ b/packages/api/src/service/FissaService.ts
@@ -11,6 +11,7 @@ import {
randomize,
sleep,
sortFissaTracksOrder,
+ subDays,
UnableToCreateFissa,
type SpotifyService,
} from "@fissa/utils";
@@ -26,6 +27,11 @@ export class FissaService extends ServiceWithContext {
super(ctx);
}
+ activeFissasCount = async () => {
+ return this.db.fissa.count({ where: { lastUpdateAt: { gte: subDays(new Date(), 14) }}}); // Fake it till you make it
+ // return this.db.fissa.count({ where: { currentlyPlayingId: { not: null } } });
+ };
+
activeFissas = async () => {
return this.db.fissa.findMany({
where: { currentlyPlayingId: { not: null } },
diff --git a/packages/config/tailwind/index.d.ts b/packages/config/tailwind/index.d.ts
index 7c500c40..7980903c 100644
--- a/packages/config/tailwind/index.d.ts
+++ b/packages/config/tailwind/index.d.ts
@@ -1,14 +1,15 @@
declare module "@fissa/tailwind-config" {
- interface Theme {
+ export interface Theme {
gradient: string[]
- name: "pinkey" | "orangy" | "greeny" | "blueey" | "sunny" | "limey"
+ name: "pinkey" | "orangy" | "greeny" | "blueey" | "sunny" | "limey"
100: string,
500: string,
900: string
}
-
+
const theme: Theme
+ const themes: Theme[]
- export {theme}
-}
\ No newline at end of file
+ export { theme, themes }
+}
diff --git a/packages/config/tailwind/index.js b/packages/config/tailwind/index.js
index 90045faa..4089c40a 100644
--- a/packages/config/tailwind/index.js
+++ b/packages/config/tailwind/index.js
@@ -66,3 +66,4 @@ const config = {
module.exports = config;
module.exports.theme = theme;
+module.exports.themes = themes
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cd77495b..cf580995 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -37,7 +37,7 @@ importers:
version: 5.4.5
vitest:
specifier: 1.6.0
- version: 1.6.0(@types/node@20.12.11)(terser@5.30.4)
+ version: 1.6.0(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4)
apps/expo:
dependencies:
@@ -103,7 +103,7 @@ importers:
version: 0.28.9(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))
expo-router:
specifier: 3.5.16
- version: 3.5.16(a56kskiaed6hhesz4du2jdnage)
+ version: 3.5.16(expo-constants@16.0.2(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))))(expo-linking@6.3.1(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))))(expo-modules-autolinking@1.11.1)(expo-status-bar@1.12.1)(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))(react-native-reanimated@3.10.1(@babel/core@7.24.5)(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.5(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native-screens@3.32.0(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)(typescript@5.4.5)
expo-secure-store:
specifier: 13.0.1
version: 13.0.1(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))
@@ -198,27 +198,39 @@ importers:
'@fissa/utils':
specifier: '*'
version: link:../../packages/utils
+ '@headlessui/react':
+ specifier: ^2.1.8
+ version: 2.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@tanstack/react-query':
specifier: 4.36.1
- version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
+ version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
'@trpc/client':
specifier: 10.21.1
version: 10.21.1(@trpc/server@10.21.1)
'@trpc/next':
specifier: 10.21.1
- version: 10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.21.1)(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.21.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@trpc/react-query':
specifier: 10.21.1
- version: 10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@trpc/server':
specifier: 10.21.1
version: 10.21.1
'@vercel/analytics':
specifier: 1.2.2
- version: 1.2.2(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)
+ version: 1.2.2(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ framer-motion:
+ specifier: ^11.5.6
+ version: 11.5.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ lucide-react:
+ specifier: ^0.445.0
+ version: 0.445.0(react@18.2.0)
next:
specifier: 14.2.3
- version: 14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react:
specifier: 18.2.0
version: 18.2.0
@@ -228,6 +240,9 @@ importers:
react-toastify:
specifier: 10.0.5
version: 10.0.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ use-debounce:
+ specifier: ^10.0.3
+ version: 10.0.3(react@18.2.0)
zod:
specifier: 3.23.8
version: 3.23.8
@@ -310,13 +325,13 @@ importers:
version: link:../db
'@next-auth/prisma-adapter':
specifier: 1.0.7
- version: 1.0.7(@prisma/client@5.13.0(prisma@5.13.0))(next-auth@4.24.7(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))
+ version: 1.0.7(@prisma/client@5.13.0(prisma@5.13.0))(next-auth@4.24.7(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))
next:
specifier: 14.2.3
- version: 14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
next-auth:
specifier: 4.24.7
- version: 4.24.7(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ version: 4.24.7(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react:
specifier: 18.2.0
version: 18.2.0
@@ -403,7 +418,7 @@ importers:
version: 0.1.2
vitest-mock-extended:
specifier: 1.3.1
- version: 1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(terser@5.30.4))
+ version: 1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4))
packages/utils:
dependencies:
@@ -1497,6 +1512,27 @@ packages:
resolution: {integrity: sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==}
hasBin: true
+ '@floating-ui/core@1.6.8':
+ resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+
+ '@floating-ui/dom@1.6.11':
+ resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==}
+
+ '@floating-ui/react-dom@2.1.2':
+ resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/react@0.26.24':
+ resolution: {integrity: sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.8':
+ resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+
'@graphql-typed-document-node/core@3.2.0':
resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==}
peerDependencies:
@@ -1508,9 +1544,17 @@ packages:
'@hapi/topo@5.1.0':
resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
+ '@headlessui/react@2.1.8':
+ resolution: {integrity: sha512-uajqVkAcVG/wHwG9Fh5PFMcFpf2VxM4vNRNKxRjuK009kePVur8LkuuygHfIE+2uZ7z7GnlTtYsyUe6glPpTLg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^18
+ react-dom: ^18
+
'@humanwhocodes/config-array@0.11.14':
resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
'@humanwhocodes/module-importer@1.0.1':
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
@@ -1518,6 +1562,7 @@ packages:
'@humanwhocodes/object-schema@2.0.3':
resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ deprecated: Use @eslint/object-schema instead
'@ianvs/prettier-plugin-sort-imports@4.2.1':
resolution: {integrity: sha512-NKN1LVFWUDGDGr3vt+6Ey3qPeN/163uR1pOPAlkWpgvAqgxQ6kSdUf1F0it8aHUtKRUzEGcK38Wxd07O61d7+Q==}
@@ -1736,6 +1781,27 @@ packages:
peerDependencies:
react: ^16.8 || ^17.0 || ^18.0
+ '@react-aria/focus@3.18.2':
+ resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+
+ '@react-aria/interactions@3.22.2':
+ resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+
+ '@react-aria/ssr@3.9.5':
+ resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+
+ '@react-aria/utils@3.25.2':
+ resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+
'@react-native-community/cli-clean@13.6.8':
resolution: {integrity: sha512-B1uxlm1N4BQuWFvBL3yRl3LVvydjswsdbTi7tMrHMtSxfRio1p9HjcmDzlzKco09Y+8qBGgakm3jcMZGLbhXQQ==}
@@ -1877,6 +1943,16 @@ packages:
'@react-navigation/routers@6.1.9':
resolution: {integrity: sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==}
+ '@react-stately/utils@3.10.3':
+ resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+
+ '@react-types/shared@3.24.1':
+ resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+
'@remix-run/node@2.9.1':
resolution: {integrity: sha512-shicVsSmXepj4zotWHR2kLmyYCxQ25mHmfBL11ODIcIs7iSmQO+W7CNbmX1jcRvhHki/v+S/n4fMm0iKNeJ92w==}
engines: {node: '>=18.0.0'}
@@ -2162,6 +2238,15 @@ packages:
react-native:
optional: true
+ '@tanstack/react-virtual@3.10.8':
+ resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ '@tanstack/virtual-core@3.10.8':
+ resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==}
+
'@total-typescript/shoehorn@0.1.2':
resolution: {integrity: sha512-p7nNZbOZIofpDNyP0u1BctFbjxD44Qc+oO5jufgQdFdGIXJLc33QRloJpq7k5T59CTgLWfQSUxsuqLcmeurYRw==}
@@ -3712,6 +3797,20 @@ packages:
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+ framer-motion@11.5.6:
+ resolution: {integrity: sha512-JMwUpAxv/DWgul9vPgX0ElKn0G66sUc6O9tOXsYwn3zxwvhxFljSXC0XT2QCzuTYBshwC8nyDAa1SYcV0Ldbhw==}
+ peerDependencies:
+ '@emotion/is-prop-valid': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ peerDependenciesMeta:
+ '@emotion/is-prop-valid':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
freeport-async@2.0.0:
resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==}
engines: {node: '>=8'}
@@ -4520,6 +4619,11 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
+ lucide-react@0.445.0:
+ resolution: {integrity: sha512-YrLf3aAHvmd4dZ8ot+mMdNFrFpJD7YRwQ2pUcBhgqbmxtrMP4xDzIorcj+8y+6kpuXBF4JB0NOCTUWIYetJjgA==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
+
magic-string@0.30.10:
resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
@@ -5994,6 +6098,9 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
+ tabbable@6.2.0:
+ resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+
tailwindcss@3.3.1:
resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==}
engines: {node: '>=12.13.0'}
@@ -6292,6 +6399,12 @@ packages:
url-join@4.0.0:
resolution: {integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==}
+ use-debounce@10.0.3:
+ resolution: {integrity: sha512-DxQSI9ZKso689WM1mjgGU3ozcxU1TJElBJ3X6S4SMzMNcm2lVH0AHmyXB+K7ewjz2BSUKJTDqTcwtSMRfB89dg==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ react: '*'
+
use-latest-callback@0.1.9:
resolution: {integrity: sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw==}
peerDependencies:
@@ -8036,6 +8149,31 @@ snapshots:
find-up: 5.0.0
js-yaml: 4.1.0
+ '@floating-ui/core@1.6.8':
+ dependencies:
+ '@floating-ui/utils': 0.2.8
+
+ '@floating-ui/dom@1.6.11':
+ dependencies:
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/utils': 0.2.8
+
+ '@floating-ui/react-dom@2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@floating-ui/dom': 1.6.11
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+
+ '@floating-ui/react@0.26.24(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@floating-ui/utils': 0.2.8
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tabbable: 6.2.0
+
+ '@floating-ui/utils@0.2.8': {}
+
'@graphql-typed-document-node/core@3.2.0(graphql@15.8.0)':
dependencies:
graphql: 15.8.0
@@ -8046,6 +8184,15 @@ snapshots:
dependencies:
'@hapi/hoek': 9.3.0
+ '@headlessui/react@2.1.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ dependencies:
+ '@floating-ui/react': 0.26.24(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@react-aria/focus': 3.18.2(react@18.2.0)
+ '@react-aria/interactions': 3.22.2(react@18.2.0)
+ '@tanstack/react-virtual': 3.10.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+
'@humanwhocodes/config-array@0.11.14':
dependencies:
'@humanwhocodes/object-schema': 2.0.3
@@ -8180,10 +8327,10 @@ snapshots:
jju: 1.4.0
read-yaml-file: 1.1.0
- '@next-auth/prisma-adapter@1.0.7(@prisma/client@5.13.0(prisma@5.13.0))(next-auth@4.24.7(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))':
+ '@next-auth/prisma-adapter@1.0.7(@prisma/client@5.13.0(prisma@5.13.0))(next-auth@4.24.7(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))':
dependencies:
'@prisma/client': 5.13.0(prisma@5.13.0)
- next-auth: 4.24.7(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ next-auth: 4.24.7(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@next/env@14.2.3': {}
@@ -8287,6 +8434,37 @@ snapshots:
'@radix-ui/react-compose-refs': 1.0.0(react@18.2.0)
react: 18.2.0
+ '@react-aria/focus@3.18.2(react@18.2.0)':
+ dependencies:
+ '@react-aria/interactions': 3.22.2(react@18.2.0)
+ '@react-aria/utils': 3.25.2(react@18.2.0)
+ '@react-types/shared': 3.24.1(react@18.2.0)
+ '@swc/helpers': 0.5.5
+ clsx: 2.1.1
+ react: 18.2.0
+
+ '@react-aria/interactions@3.22.2(react@18.2.0)':
+ dependencies:
+ '@react-aria/ssr': 3.9.5(react@18.2.0)
+ '@react-aria/utils': 3.25.2(react@18.2.0)
+ '@react-types/shared': 3.24.1(react@18.2.0)
+ '@swc/helpers': 0.5.5
+ react: 18.2.0
+
+ '@react-aria/ssr@3.9.5(react@18.2.0)':
+ dependencies:
+ '@swc/helpers': 0.5.5
+ react: 18.2.0
+
+ '@react-aria/utils@3.25.2(react@18.2.0)':
+ dependencies:
+ '@react-aria/ssr': 3.9.5(react@18.2.0)
+ '@react-stately/utils': 3.10.3(react@18.2.0)
+ '@react-types/shared': 3.24.1(react@18.2.0)
+ '@swc/helpers': 0.5.5
+ clsx: 2.1.1
+ react: 18.2.0
+
'@react-native-community/cli-clean@13.6.8':
dependencies:
'@react-native-community/cli-tools': 13.6.8
@@ -8577,16 +8755,6 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.37
- '@react-native/virtualized-lists@0.74.84(@types/react@18.2.37)(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)':
- dependencies:
- invariant: 2.2.4
- nullthrows: 1.1.1
- react: 18.2.0
- react-native: 0.74.2(@types/react@18.2.37)(react@18.2.0)
- optionalDependencies:
- '@types/react': 18.2.37
- optional: true
-
'@react-navigation/bottom-tabs@6.5.20(@react-navigation/native@6.1.17(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.5(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native-screens@3.32.0(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)':
dependencies:
'@react-navigation/elements': 1.3.30(@react-navigation/native@6.1.17(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.5(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
@@ -8638,6 +8806,15 @@ snapshots:
dependencies:
nanoid: 3.3.7
+ '@react-stately/utils@3.10.3(react@18.2.0)':
+ dependencies:
+ '@swc/helpers': 0.5.5
+ react: 18.2.0
+
+ '@react-types/shared@3.24.1(react@18.2.0)':
+ dependencies:
+ react: 18.2.0
+
'@remix-run/node@2.9.1(typescript@5.4.5)':
dependencies:
'@remix-run/server-runtime': 2.9.1(typescript@5.4.5)
@@ -8936,14 +9113,13 @@ snapshots:
react-dom: 18.2.0(react@18.2.0)
react-native: 0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0)
- '@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)':
+ '@tanstack/react-virtual@3.10.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@tanstack/query-core': 4.36.1
+ '@tanstack/virtual-core': 3.10.8
react: 18.2.0
- use-sync-external-store: 1.2.2(react@18.2.0)
- optionalDependencies:
react-dom: 18.2.0(react@18.2.0)
- react-native: 0.74.2(@types/react@18.2.37)(react@18.2.0)
+
+ '@tanstack/virtual-core@3.10.8': {}
'@total-typescript/shoehorn@0.1.2': {}
@@ -8957,29 +9133,29 @@ snapshots:
dependencies:
'@trpc/server': 10.21.1
- '@trpc/next@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.21.1)(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@trpc/next@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.21.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
+ '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
'@trpc/client': 10.21.1(@trpc/server@10.21.1)
- '@trpc/react-query': 10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ '@trpc/react-query': 10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@trpc/server': 10.21.1
- next: 14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ next: 14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-ssr-prepass: 1.5.0(react@18.2.0)
- '@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.2(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
- '@trpc/client': 10.21.2(@trpc/server@10.21.1)
+ '@trpc/client': 10.21.1(@trpc/server@10.21.1)
'@trpc/server': 10.21.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- '@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.1(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
+ '@trpc/react-query@10.21.1(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(@trpc/client@10.21.2(@trpc/server@10.21.1))(@trpc/server@10.21.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
- '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
- '@trpc/client': 10.21.1(@trpc/server@10.21.1)
+ '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
+ '@trpc/client': 10.21.2(@trpc/server@10.21.1)
'@trpc/server': 10.21.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
@@ -9203,11 +9379,11 @@ snapshots:
graphql: 15.8.0
wonka: 4.0.15
- '@vercel/analytics@1.2.2(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)':
+ '@vercel/analytics@1.2.2(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)':
dependencies:
server-only: 0.0.1
optionalDependencies:
- next: 14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ next: 14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
'@vitest/expect@1.6.0':
@@ -10236,8 +10412,8 @@ snapshots:
'@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)
eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0)
eslint-plugin-react: 7.34.1(eslint@8.57.0)
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
@@ -10264,13 +10440,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0):
+ eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0):
dependencies:
debug: 4.3.4
enhanced-resolve: 5.16.0
eslint: 8.57.0
- eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)
fast-glob: 3.3.2
get-tsconfig: 4.7.3
is-core-module: 2.13.1
@@ -10281,18 +10457,28 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0):
+ eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5)
+ eslint: 8.57.0
+ eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
+ eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0):
dependencies:
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
@@ -10302,7 +10488,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0)
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
hasown: 2.0.2
is-core-module: 2.13.1
is-glob: 4.0.3
@@ -10313,7 +10499,7 @@ snapshots:
semver: 6.3.1
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5)
+ '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -10599,8 +10785,8 @@ snapshots:
- encoding
- supports-color
- expo-router@3.5.16(a56kskiaed6hhesz4du2jdnage):
- dependencies:
+ ? expo-router@3.5.16(expo-constants@16.0.2(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))))(expo-linking@6.3.1(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))))(expo-modules-autolinking@1.11.1)(expo-status-bar@1.12.1)(expo@51.0.14(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5)))(react-native-reanimated@3.10.1(@babel/core@7.24.5)(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.5(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native-screens@3.32.0(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)(typescript@5.4.5)
+ : dependencies:
'@expo/metro-runtime': 3.2.1(react-native@0.74.2(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))(@types/react@18.2.37)(react@18.2.0))
'@expo/server': 0.4.2(typescript@5.4.5)
'@radix-ui/react-slot': 1.0.1(react@18.2.0)
@@ -10839,6 +11025,13 @@ snapshots:
fraction.js@4.3.7: {}
+ framer-motion@11.5.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ dependencies:
+ tslib: 2.6.2
+ optionalDependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+
freeport-async@2.0.0: {}
fresh@0.5.2: {}
@@ -11641,6 +11834,10 @@ snapshots:
dependencies:
yallist: 4.0.0
+ lucide-react@0.445.0(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+
magic-string@0.30.10:
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
@@ -11983,13 +12180,13 @@ snapshots:
nested-error-stacks@2.0.1: {}
- next-auth@4.24.7(next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ next-auth@4.24.7(next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
'@babel/runtime': 7.24.5
'@panva/hkdf': 1.1.1
cookie: 0.5.0
jose: 4.15.5
- next: 14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ next: 14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
oauth: 0.9.15
openid-client: 5.6.5
preact: 10.20.2
@@ -11998,7 +12195,7 @@ snapshots:
react-dom: 18.2.0(react@18.2.0)
uuid: 8.3.2
- next@14.2.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
+ next@14.2.3(@babel/core@7.24.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
'@next/env': 14.2.3
'@swc/helpers': 0.5.5
@@ -12008,7 +12205,7 @@ snapshots:
postcss: 8.4.31
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
- styled-jsx: 5.1.1(react@18.2.0)
+ styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.2.0)
optionalDependencies:
'@next/swc-darwin-arm64': 14.2.3
'@next/swc-darwin-x64': 14.2.3
@@ -12639,57 +12836,6 @@ snapshots:
- supports-color
- utf-8-validate
- react-native@0.74.2(@types/react@18.2.37)(react@18.2.0):
- dependencies:
- '@jest/create-cache-key-function': 29.7.0
- '@react-native-community/cli': 13.6.8
- '@react-native-community/cli-platform-android': 13.6.8
- '@react-native-community/cli-platform-ios': 13.6.8
- '@react-native/assets-registry': 0.74.84
- '@react-native/codegen': 0.74.84(@babel/preset-env@7.24.5(@babel/core@7.24.5))
- '@react-native/community-cli-plugin': 0.74.84(@babel/core@7.24.5)(@babel/preset-env@7.24.5(@babel/core@7.24.5))
- '@react-native/gradle-plugin': 0.74.84
- '@react-native/js-polyfills': 0.74.84
- '@react-native/normalize-colors': 0.74.84
- '@react-native/virtualized-lists': 0.74.84(@types/react@18.2.37)(react-native@0.74.2(@types/react@18.2.37)(react@18.2.0))(react@18.2.0)
- abort-controller: 3.0.0
- anser: 1.4.10
- ansi-regex: 5.0.1
- base64-js: 1.5.1
- chalk: 4.1.2
- event-target-shim: 5.0.1
- flow-enums-runtime: 0.0.6
- invariant: 2.2.4
- jest-environment-node: 29.7.0
- jsc-android: 250231.0.0
- memoize-one: 5.2.1
- metro-runtime: 0.80.8
- metro-source-map: 0.80.8
- mkdirp: 0.5.6
- nullthrows: 1.1.1
- pretty-format: 26.6.2
- promise: 8.3.0
- react: 18.2.0
- react-devtools-core: 5.2.0
- react-refresh: 0.14.2
- react-shallow-renderer: 16.15.0(react@18.2.0)
- regenerator-runtime: 0.13.11
- scheduler: 0.24.0-canary-efb381bbf-20230505
- stacktrace-parser: 0.1.10
- whatwg-fetch: 3.6.20
- ws: 6.2.2
- yargs: 17.7.2
- optionalDependencies:
- '@types/react': 18.2.37
- transitivePeerDependencies:
- - '@babel/core'
- - '@babel/preset-env'
- - bufferutil
- - encoding
- - supports-color
- - utf-8-validate
- optional: true
-
react-refresh@0.14.2: {}
react-shallow-renderer@16.15.0(react@18.2.0):
@@ -13228,10 +13374,12 @@ snapshots:
structured-headers@0.4.1: {}
- styled-jsx@5.1.1(react@18.2.0):
+ styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.2.0):
dependencies:
client-only: 0.0.1
react: 18.2.0
+ optionalDependencies:
+ '@babel/core': 7.24.5
sucrase@3.34.0:
dependencies:
@@ -13298,6 +13446,8 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
+ tabbable@6.2.0: {}
+
tailwindcss@3.3.1(postcss@8.4.38):
dependencies:
arg: 5.0.2
@@ -13594,6 +13744,10 @@ snapshots:
url-join@4.0.0: {}
+ use-debounce@10.0.3(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+
use-latest-callback@0.1.9(react@18.2.0):
dependencies:
react: 18.2.0
@@ -13635,13 +13789,13 @@ snapshots:
vary@1.1.2: {}
- vite-node@1.6.0(@types/node@20.12.11)(terser@5.30.4):
+ vite-node@1.6.0(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4):
dependencies:
cac: 6.7.14
debug: 4.3.4
pathe: 1.1.2
picocolors: 1.0.0
- vite: 5.2.10(@types/node@20.12.11)(terser@5.30.4)
+ vite: 5.2.10(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4)
transitivePeerDependencies:
- '@types/node'
- less
@@ -13652,7 +13806,7 @@ snapshots:
- supports-color
- terser
- vite@5.2.10(@types/node@20.12.11)(terser@5.30.4):
+ vite@5.2.10(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4):
dependencies:
esbuild: 0.20.2
postcss: 8.4.38
@@ -13660,15 +13814,16 @@ snapshots:
optionalDependencies:
'@types/node': 20.12.11
fsevents: 2.3.3
+ lightningcss: 1.19.0
terser: 5.30.4
- vitest-mock-extended@1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(terser@5.30.4)):
+ vitest-mock-extended@1.3.1(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4)):
dependencies:
ts-essentials: 9.4.2(typescript@5.4.5)
typescript: 5.4.5
- vitest: 1.6.0(@types/node@20.12.11)(terser@5.30.4)
+ vitest: 1.6.0(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4)
- vitest@1.6.0(@types/node@20.12.11)(terser@5.30.4):
+ vitest@1.6.0(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4):
dependencies:
'@vitest/expect': 1.6.0
'@vitest/runner': 1.6.0
@@ -13687,8 +13842,8 @@ snapshots:
strip-literal: 2.1.0
tinybench: 2.8.0
tinypool: 0.8.4
- vite: 5.2.10(@types/node@20.12.11)(terser@5.30.4)
- vite-node: 1.6.0(@types/node@20.12.11)(terser@5.30.4)
+ vite: 5.2.10(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4)
+ vite-node: 1.6.0(@types/node@20.12.11)(lightningcss@1.19.0)(terser@5.30.4)
why-is-node-running: 2.2.2
optionalDependencies:
'@types/node': 20.12.11