From f571af2c42d88c09fc57e7f184e51d557717db11 Mon Sep 17 00:00:00 2001 From: Manuel Bustillo Date: Sun, 11 Aug 2024 12:34:16 +0200 Subject: [PATCH] Initial layout --- app/dashboard/expenses/page.tsx | 11 + app/dashboard/guests/page.tsx | 11 + app/dashboard/layout.tsx | 12 ++ app/dashboard/page.tsx | 3 + app/dashboard/tables/page.tsx | 11 + app/layout.tsx | 5 +- app/lib/data.ts | 217 -------------------- app/lib/definitions.ts | 6 +- app/lib/placeholder-data.ts | 4 +- app/page.tsx | 27 +-- app/seed/route.ts | 16 +- app/ui/customers/table.tsx | 6 +- app/ui/dashboard/cards.tsx | 10 +- app/ui/dashboard/latest-invoices.tsx | 10 +- app/ui/dashboard/loading.tsx | 3 + app/ui/dashboard/nav-links.tsx | 35 ++-- app/ui/dashboard/sidenav.tsx | 7 +- app/ui/fonts.ts | 5 + app/ui/{invoices => guests}/breadcrumbs.tsx | 0 app/ui/{invoices => guests}/buttons.tsx | 4 +- app/ui/{invoices => guests}/create-form.tsx | 2 +- app/ui/{invoices => guests}/edit-form.tsx | 2 +- app/ui/{invoices => guests}/pagination.tsx | 0 app/ui/{invoices => guests}/status.tsx | 2 +- app/ui/{invoices => guests}/table.tsx | 18 +- app/ui/home.module.css | 7 + app/ui/search.tsx | 22 ++ app/ui/skeletons.tsx | 32 +-- pnpm-lock.yaml | 15 +- 29 files changed, 180 insertions(+), 323 deletions(-) create mode 100644 app/dashboard/expenses/page.tsx create mode 100644 app/dashboard/guests/page.tsx create mode 100644 app/dashboard/layout.tsx create mode 100644 app/dashboard/page.tsx create mode 100644 app/dashboard/tables/page.tsx delete mode 100644 app/lib/data.ts create mode 100644 app/ui/dashboard/loading.tsx create mode 100644 app/ui/fonts.ts rename app/ui/{invoices => guests}/breadcrumbs.tsx (100%) rename app/ui/{invoices => guests}/buttons.tsx (93%) rename app/ui/{invoices => guests}/create-form.tsx (99%) rename app/ui/{invoices => guests}/edit-form.tsx (99%) rename app/ui/{invoices => guests}/pagination.tsx (100%) rename app/ui/{invoices => guests}/status.tsx (90%) rename app/ui/{invoices => guests}/table.tsx (89%) create mode 100644 app/ui/home.module.css diff --git a/app/dashboard/expenses/page.tsx b/app/dashboard/expenses/page.tsx new file mode 100644 index 0000000..7d656a0 --- /dev/null +++ b/app/dashboard/expenses/page.tsx @@ -0,0 +1,11 @@ +import { lusitana } from '@/app/ui/fonts'; + +export default function Page () { + return ( +
+
+

Expenses

+
+
+ ); +} \ No newline at end of file diff --git a/app/dashboard/guests/page.tsx b/app/dashboard/guests/page.tsx new file mode 100644 index 0000000..4a4cb1e --- /dev/null +++ b/app/dashboard/guests/page.tsx @@ -0,0 +1,11 @@ +import { lusitana } from '@/app/ui/fonts'; + +export default function Page () { + return ( +
+
+

Guests

+
+
+ ); +} \ No newline at end of file diff --git a/app/dashboard/layout.tsx b/app/dashboard/layout.tsx new file mode 100644 index 0000000..79bd4c3 --- /dev/null +++ b/app/dashboard/layout.tsx @@ -0,0 +1,12 @@ +import SideNav from '@/app/ui/dashboard/sidenav'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+
+ +
+
{children}
+
+ ); +} \ No newline at end of file diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx new file mode 100644 index 0000000..c820d9f --- /dev/null +++ b/app/dashboard/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Dashboard Page

; +} \ No newline at end of file diff --git a/app/dashboard/tables/page.tsx b/app/dashboard/tables/page.tsx new file mode 100644 index 0000000..81c472e --- /dev/null +++ b/app/dashboard/tables/page.tsx @@ -0,0 +1,11 @@ +import { lusitana } from '@/app/ui/fonts'; + +export default function Page () { + return ( +
+
+

Table distributions

+
+
+ ); +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index 225b603..e18935c 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,3 +1,6 @@ +import '@/app/ui/global.css' +import { inter } from '@/app/ui/fonts'; + export default function RootLayout({ children, }: { @@ -5,7 +8,7 @@ export default function RootLayout({ }) { return ( - {children} + {children} ); } diff --git a/app/lib/data.ts b/app/lib/data.ts deleted file mode 100644 index edb4964..0000000 --- a/app/lib/data.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { sql } from '@vercel/postgres'; -import { - CustomerField, - CustomersTableType, - InvoiceForm, - InvoicesTable, - LatestInvoiceRaw, - Revenue, -} from './definitions'; -import { formatCurrency } from './utils'; - -export async function fetchRevenue() { - try { - // Artificially delay a response for demo purposes. - // Don't do this in production :) - - // console.log('Fetching revenue data...'); - // await new Promise((resolve) => setTimeout(resolve, 3000)); - - const data = await sql`SELECT * FROM revenue`; - - // console.log('Data fetch completed after 3 seconds.'); - - return data.rows; - } catch (error) { - console.error('Database Error:', error); - throw new Error('Failed to fetch revenue data.'); - } -} - -export async function fetchLatestInvoices() { - try { - const data = await sql` - SELECT invoices.amount, customers.name, customers.image_url, customers.email, invoices.id - FROM invoices - JOIN customers ON invoices.customer_id = customers.id - ORDER BY invoices.date DESC - LIMIT 5`; - - const latestInvoices = data.rows.map((invoice) => ({ - ...invoice, - amount: formatCurrency(invoice.amount), - })); - return latestInvoices; - } catch (error) { - console.error('Database Error:', error); - throw new Error('Failed to fetch the latest invoices.'); - } -} - -export async function fetchCardData() { - try { - // You can probably combine these into a single SQL query - // However, we are intentionally splitting them to demonstrate - // how to initialize multiple queries in parallel with JS. - const invoiceCountPromise = sql`SELECT COUNT(*) FROM invoices`; - const customerCountPromise = sql`SELECT COUNT(*) FROM customers`; - const invoiceStatusPromise = sql`SELECT - SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS "paid", - SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS "pending" - FROM invoices`; - - const data = await Promise.all([ - invoiceCountPromise, - customerCountPromise, - invoiceStatusPromise, - ]); - - const numberOfInvoices = Number(data[0].rows[0].count ?? '0'); - const numberOfCustomers = Number(data[1].rows[0].count ?? '0'); - const totalPaidInvoices = formatCurrency(data[2].rows[0].paid ?? '0'); - const totalPendingInvoices = formatCurrency(data[2].rows[0].pending ?? '0'); - - return { - numberOfCustomers, - numberOfInvoices, - totalPaidInvoices, - totalPendingInvoices, - }; - } catch (error) { - console.error('Database Error:', error); - throw new Error('Failed to fetch card data.'); - } -} - -const ITEMS_PER_PAGE = 6; -export async function fetchFilteredInvoices( - query: string, - currentPage: number, -) { - const offset = (currentPage - 1) * ITEMS_PER_PAGE; - - try { - const invoices = await sql` - SELECT - invoices.id, - invoices.amount, - invoices.date, - invoices.status, - customers.name, - customers.email, - customers.image_url - FROM invoices - JOIN customers ON invoices.customer_id = customers.id - WHERE - customers.name ILIKE ${`%${query}%`} OR - customers.email ILIKE ${`%${query}%`} OR - invoices.amount::text ILIKE ${`%${query}%`} OR - invoices.date::text ILIKE ${`%${query}%`} OR - invoices.status ILIKE ${`%${query}%`} - ORDER BY invoices.date DESC - LIMIT ${ITEMS_PER_PAGE} OFFSET ${offset} - `; - - return invoices.rows; - } catch (error) { - console.error('Database Error:', error); - throw new Error('Failed to fetch invoices.'); - } -} - -export async function fetchInvoicesPages(query: string) { - try { - const count = await sql`SELECT COUNT(*) - FROM invoices - JOIN customers ON invoices.customer_id = customers.id - WHERE - customers.name ILIKE ${`%${query}%`} OR - customers.email ILIKE ${`%${query}%`} OR - invoices.amount::text ILIKE ${`%${query}%`} OR - invoices.date::text ILIKE ${`%${query}%`} OR - invoices.status ILIKE ${`%${query}%`} - `; - - const totalPages = Math.ceil(Number(count.rows[0].count) / ITEMS_PER_PAGE); - return totalPages; - } catch (error) { - console.error('Database Error:', error); - throw new Error('Failed to fetch total number of invoices.'); - } -} - -export async function fetchInvoiceById(id: string) { - try { - const data = await sql` - SELECT - invoices.id, - invoices.customer_id, - invoices.amount, - invoices.status - FROM invoices - WHERE invoices.id = ${id}; - `; - - const invoice = data.rows.map((invoice) => ({ - ...invoice, - // Convert amount from cents to dollars - amount: invoice.amount / 100, - })); - - return invoice[0]; - } catch (error) { - console.error('Database Error:', error); - throw new Error('Failed to fetch invoice.'); - } -} - -export async function fetchCustomers() { - try { - const data = await sql` - SELECT - id, - name - FROM customers - ORDER BY name ASC - `; - - const customers = data.rows; - return customers; - } catch (err) { - console.error('Database Error:', err); - throw new Error('Failed to fetch all customers.'); - } -} - -export async function fetchFilteredCustomers(query: string) { - try { - const data = await sql` - SELECT - customers.id, - customers.name, - customers.email, - customers.image_url, - COUNT(invoices.id) AS total_invoices, - SUM(CASE WHEN invoices.status = 'pending' THEN invoices.amount ELSE 0 END) AS total_pending, - SUM(CASE WHEN invoices.status = 'paid' THEN invoices.amount ELSE 0 END) AS total_paid - FROM customers - LEFT JOIN invoices ON customers.id = invoices.customer_id - WHERE - customers.name ILIKE ${`%${query}%`} OR - customers.email ILIKE ${`%${query}%`} - GROUP BY customers.id, customers.name, customers.email, customers.image_url - ORDER BY customers.name ASC - `; - - const customers = data.rows.map((customer) => ({ - ...customer, - total_pending: formatCurrency(customer.total_pending), - total_paid: formatCurrency(customer.total_paid), - })); - - return customers; - } catch (err) { - console.error('Database Error:', err); - throw new Error('Failed to fetch customer table.'); - } -} diff --git a/app/lib/definitions.ts b/app/lib/definitions.ts index b1a4fbf..3f601a9 100644 --- a/app/lib/definitions.ts +++ b/app/lib/definitions.ts @@ -44,7 +44,7 @@ export type LatestInvoiceRaw = Omit & { amount: number; }; -export type InvoicesTable = { +export type guestsTable = { id: string; customer_id: string; name: string; @@ -60,7 +60,7 @@ export type CustomersTableType = { name: string; email: string; image_url: string; - total_invoices: number; + total_guests: number; total_pending: number; total_paid: number; }; @@ -70,7 +70,7 @@ export type FormattedCustomersTable = { name: string; email: string; image_url: string; - total_invoices: number; + total_guests: number; total_pending: string; total_paid: string; }; diff --git a/app/lib/placeholder-data.ts b/app/lib/placeholder-data.ts index 257fb14..76892d5 100644 --- a/app/lib/placeholder-data.ts +++ b/app/lib/placeholder-data.ts @@ -48,7 +48,7 @@ const customers = [ }, ]; -const invoices = [ +const guests = [ { customer_id: customers[0].id, amount: 15795, @@ -144,4 +144,4 @@ const revenue = [ { month: 'Dec', revenue: 4800 }, ]; -export { users, customers, invoices, revenue }; +export { users, customers, guests, revenue }; diff --git a/app/page.tsx b/app/page.tsx index 8e0184f..ce4a8cf 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,33 +1,10 @@ -import AcmeLogo from '@/app/ui/acme-logo'; -import { ArrowRightIcon } from '@heroicons/react/24/outline'; import Link from 'next/link'; +import styles from '@/app/ui/home.module.css'; export default function Page() { return (
-
- {/* */} -
-
-
-

- Welcome to Acme. This is the example for the{' '} - - Next.js Learn Course - - , brought to you by Vercel. -

- - Log in - -
-
- {/* Add Hero Images Here */} -
-
+
); } diff --git a/app/seed/route.ts b/app/seed/route.ts index ce31c7a..944672c 100644 --- a/app/seed/route.ts +++ b/app/seed/route.ts @@ -1,6 +1,6 @@ // import bcrypt from 'bcrypt'; // import { db } from '@vercel/postgres'; -// import { invoices, customers, revenue, users } from '../lib/placeholder-data'; +// import { guests, customers, revenue, users } from '../lib/placeholder-data'; // const client = await db.connect(); @@ -29,11 +29,11 @@ // return insertedUsers; // } -// async function seedInvoices() { +// async function seedguests() { // await client.sql`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`; // await client.sql` -// CREATE TABLE IF NOT EXISTS invoices ( +// CREATE TABLE IF NOT EXISTS guests ( // id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, // customer_id UUID NOT NULL, // amount INT NOT NULL, @@ -42,17 +42,17 @@ // ); // `; -// const insertedInvoices = await Promise.all( -// invoices.map( +// const insertedguests = await Promise.all( +// guests.map( // (invoice) => client.sql` -// INSERT INTO invoices (customer_id, amount, status, date) +// INSERT INTO guests (customer_id, amount, status, date) // VALUES (${invoice.customer_id}, ${invoice.amount}, ${invoice.status}, ${invoice.date}) // ON CONFLICT (id) DO NOTHING; // `, // ), // ); -// return insertedInvoices; +// return insertedguests; // } // async function seedCustomers() { @@ -110,7 +110,7 @@ export async function GET() { // await client.sql`BEGIN`; // await seedUsers(); // await seedCustomers(); - // await seedInvoices(); + // await seedguests(); // await seedRevenue(); // await client.sql`COMMIT`; diff --git a/app/ui/customers/table.tsx b/app/ui/customers/table.tsx index fce2f55..190a43d 100644 --- a/app/ui/customers/table.tsx +++ b/app/ui/customers/table.tsx @@ -57,7 +57,7 @@ export default async function CustomersTable({
-

{customer.total_invoices} invoices

+

{customer.total_guests} guests

))} @@ -72,7 +72,7 @@ export default async function CustomersTable({ Email - Total Invoices + Total guests Total Pending @@ -102,7 +102,7 @@ export default async function CustomersTable({ {customer.email} - {customer.total_invoices} + {customer.total_guests} {customer.total_pending} diff --git a/app/ui/dashboard/cards.tsx b/app/ui/dashboard/cards.tsx index 526e6f9..e66e70b 100644 --- a/app/ui/dashboard/cards.tsx +++ b/app/ui/dashboard/cards.tsx @@ -10,7 +10,7 @@ const iconMap = { collected: BanknotesIcon, customers: UserGroupIcon, pending: ClockIcon, - invoices: InboxIcon, + guests: InboxIcon, }; export default async function CardWrapper() { @@ -18,9 +18,9 @@ export default async function CardWrapper() { <> {/* NOTE: Uncomment this code in Chapter 9 */} - {/* - - + {/* + +

- Latest Invoices + Latest guests

{/* NOTE: Uncomment this code in Chapter 7 */} {/*
- {latestInvoices.map((invoice, i) => { + {latestguests.map((invoice, i) => { return (
Loading...
; +} \ No newline at end of file diff --git a/app/ui/dashboard/nav-links.tsx b/app/ui/dashboard/nav-links.tsx index 72fa462..82415b9 100644 --- a/app/ui/dashboard/nav-links.tsx +++ b/app/ui/dashboard/nav-links.tsx @@ -1,35 +1,42 @@ +'use client' + import { UserGroupIcon, - HomeIcon, - DocumentDuplicateIcon, + RectangleGroupIcon, + BanknotesIcon, } from '@heroicons/react/24/outline'; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; +import clsx from 'clsx'; -// Map of links to display in the side navigation. -// Depending on the size of the application, this would be stored in a database. const links = [ - { name: 'Home', href: '/dashboard', icon: HomeIcon }, - { - name: 'Invoices', - href: '/dashboard/invoices', - icon: DocumentDuplicateIcon, - }, - { name: 'Customers', href: '/dashboard/customers', icon: UserGroupIcon }, + { name: 'Guests', href: '/dashboard/guests', icon: UserGroupIcon }, + { name: 'Expenses', href: '/dashboard/expenses', icon: BanknotesIcon }, + { name: 'Table distributions', href: '/dashboard/tables', icon: RectangleGroupIcon }, ]; + export default function NavLinks() { + const pathname = usePathname(); + return ( <> {links.map((link) => { const LinkIcon = link.icon; return ( -

{link.name}

-
+ ); })} diff --git a/app/ui/dashboard/sidenav.tsx b/app/ui/dashboard/sidenav.tsx index 3d55b46..8f0ca14 100644 --- a/app/ui/dashboard/sidenav.tsx +++ b/app/ui/dashboard/sidenav.tsx @@ -2,16 +2,17 @@ import Link from 'next/link'; import NavLinks from '@/app/ui/dashboard/nav-links'; import AcmeLogo from '@/app/ui/acme-logo'; import { PowerIcon } from '@heroicons/react/24/outline'; +import { gloriaHallelujah } from '@/app/ui/fonts'; export default function SideNav() { return (
-
- +
+

Wedding Planner

diff --git a/app/ui/fonts.ts b/app/ui/fonts.ts new file mode 100644 index 0000000..3299f09 --- /dev/null +++ b/app/ui/fonts.ts @@ -0,0 +1,5 @@ +import { Inter, Lusitana, Gloria_Hallelujah} from 'next/font/google'; + +export const inter = Inter({ subsets: ['latin'] }); +export const lusitana = Lusitana({ subsets: ['latin'], weight: '400' }); +export const gloriaHallelujah = Gloria_Hallelujah({ subsets: ['latin'], weight: '400' }); \ No newline at end of file diff --git a/app/ui/invoices/breadcrumbs.tsx b/app/ui/guests/breadcrumbs.tsx similarity index 100% rename from app/ui/invoices/breadcrumbs.tsx rename to app/ui/guests/breadcrumbs.tsx diff --git a/app/ui/invoices/buttons.tsx b/app/ui/guests/buttons.tsx similarity index 93% rename from app/ui/invoices/buttons.tsx rename to app/ui/guests/buttons.tsx index 0edfca3..2f3fbf6 100644 --- a/app/ui/invoices/buttons.tsx +++ b/app/ui/guests/buttons.tsx @@ -4,7 +4,7 @@ import Link from 'next/link'; export function CreateInvoice() { return ( Create Invoice{' '} @@ -16,7 +16,7 @@ export function CreateInvoice() { export function UpdateInvoice({ id }: { id: string }) { return ( diff --git a/app/ui/invoices/create-form.tsx b/app/ui/guests/create-form.tsx similarity index 99% rename from app/ui/invoices/create-form.tsx rename to app/ui/guests/create-form.tsx index 35099ce..e44b169 100644 --- a/app/ui/invoices/create-form.tsx +++ b/app/ui/guests/create-form.tsx @@ -100,7 +100,7 @@ export default function Form({ customers }: { customers: CustomerField[] }) {
Cancel diff --git a/app/ui/invoices/edit-form.tsx b/app/ui/guests/edit-form.tsx similarity index 99% rename from app/ui/invoices/edit-form.tsx rename to app/ui/guests/edit-form.tsx index 8673667..859396f 100644 --- a/app/ui/invoices/edit-form.tsx +++ b/app/ui/guests/edit-form.tsx @@ -111,7 +111,7 @@ export default function EditInvoiceForm({
Cancel diff --git a/app/ui/invoices/pagination.tsx b/app/ui/guests/pagination.tsx similarity index 100% rename from app/ui/invoices/pagination.tsx rename to app/ui/guests/pagination.tsx diff --git a/app/ui/invoices/status.tsx b/app/ui/guests/status.tsx similarity index 90% rename from app/ui/invoices/status.tsx rename to app/ui/guests/status.tsx index 108bda5..2c78d93 100644 --- a/app/ui/invoices/status.tsx +++ b/app/ui/guests/status.tsx @@ -1,7 +1,7 @@ import { CheckIcon, ClockIcon } from '@heroicons/react/24/outline'; import clsx from 'clsx'; -export default function InvoiceStatus({ status }: { status: string }) { +export default function gueststatus({ status }: { status: string }) { return (
- {invoices?.map((invoice) => ( + {guests?.map((invoice) => (

{invoice.email}

- +
@@ -78,7 +78,7 @@ export default async function InvoicesTable({ - {invoices?.map((invoice) => ( + {guests?.map((invoice) => ( - +
diff --git a/app/ui/home.module.css b/app/ui/home.module.css new file mode 100644 index 0000000..2311768 --- /dev/null +++ b/app/ui/home.module.css @@ -0,0 +1,7 @@ +.shape { + height: 0; + width: 0; + border-bottom: 30px solid black; + border-left: 20px solid transparent; + border-right: 20px solid transparent; + } \ No newline at end of file diff --git a/app/ui/search.tsx b/app/ui/search.tsx index e6e9391..f02de58 100644 --- a/app/ui/search.tsx +++ b/app/ui/search.tsx @@ -1,8 +1,26 @@ 'use client'; import { MagnifyingGlassIcon } from '@heroicons/react/24/outline'; +import { useSearchParams, usePathname, useRouter } from 'next/navigation'; +import { useDebouncedCallback } from 'use-debounce'; + export default function Search({ placeholder }: { placeholder: string }) { + const searchParams = useSearchParams(); + const pathname = usePathname(); + const { replace } = useRouter(); + + const handleSearch = useDebouncedCallback((term) => { + const params = new URLSearchParams(searchParams); + if (term) { + params.set('query', term); + } else { + params.delete('query'); + } + replace(`${pathname}?${params.toString()}`); + + }, 300); + return (
diff --git a/app/ui/skeletons.tsx b/app/ui/skeletons.tsx index 1edcf96..f26dcb8 100644 --- a/app/ui/skeletons.tsx +++ b/app/ui/skeletons.tsx @@ -44,7 +44,7 @@ export function RevenueChartSkeleton() { ); } -export function InvoiceSkeleton() { +export function guestskeleton() { return (
@@ -59,7 +59,7 @@ export function InvoiceSkeleton() { ); } -export function LatestInvoicesSkeleton() { +export function LatestguestsSkeleton() { return (
- - - - - + + + + +
@@ -96,7 +96,7 @@ export default function DashboardSkeleton() {
- +
); @@ -139,7 +139,7 @@ export function TableRowSkeleton() { ); } -export function InvoicesMobileSkeleton() { +export function guestsMobileSkeleton() { return (
@@ -163,18 +163,18 @@ export function InvoicesMobileSkeleton() { ); } -export function InvoicesTableSkeleton() { +export function guestsTableSkeleton() { return (
- - - - - - + + + + + +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e9f8f2f..d3848c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,10 +28,10 @@ importers: version: 2.1.1 next: specifier: 15.0.0-canary.56 - version: 15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704)(react@19.0.0-rc-f38c22b244-20240704) + version: 15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704) next-auth: specifier: 5.0.0-beta.19 - version: 5.0.0-beta.19(next@15.0.0-canary.56)(react@19.0.0-rc-f38c22b244-20240704) + version: 5.0.0-beta.19(next@15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704) postcss: specifier: 8.4.38 version: 8.4.38 @@ -1732,13 +1732,13 @@ snapshots: nanoid@3.3.7: {} - next-auth@5.0.0-beta.19(next@15.0.0-canary.56)(react@19.0.0-rc-f38c22b244-20240704): + next-auth@5.0.0-beta.19(next@15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704): dependencies: '@auth/core': 0.32.0 - next: 15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704)(react@19.0.0-rc-f38c22b244-20240704) + next: 15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704) react: 19.0.0-rc-f38c22b244-20240704 - next@15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704)(react@19.0.0-rc-f38c22b244-20240704): + next@15.0.0-canary.56(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704): dependencies: '@next/env': 15.0.0-canary.56 '@swc/helpers': 0.5.11 @@ -1845,8 +1845,9 @@ snapshots: postcss-load-config@4.0.2(postcss@8.4.38): dependencies: lilconfig: 3.1.1 - postcss: 8.4.38 yaml: 2.4.3 + optionalDependencies: + postcss: 8.4.38 postcss-nested@6.0.1(postcss@8.4.38): dependencies: @@ -2131,7 +2132,7 @@ snapshots: wrappy@1.0.2: {} ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): - dependencies: + optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.3