From 4192a15779fec5205981d0a476d533549daa9b13 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Sun, 13 Apr 2025 20:31:34 +1200 Subject: [PATCH] some progress --- docker-compose.yml | 2 +- package.json | 8 +- payload-types.ts | 106 +++++++++++----- payload.config.ts | 5 +- pnpm-lock.yaml | 82 +++++++++++- postcss.config.mjs | 2 +- public/file.svg | 1 - public/globe.svg | 1 - public/ial-white-transp.png | Bin 0 -> 29301 bytes public/next.svg | 1 - public/vercel.svg | 1 - public/window.svg | 1 - .../(frontend)/components/Header/Client.tsx | 32 +++++ .../(frontend)/components/Header/Header.tsx | 10 ++ .../(frontend)/components/Header/Server.tsx | 44 +++++++ src/app/(frontend)/components/home/CTA.tsx | 22 ++++ src/app/(frontend)/components/home/Hero.tsx | 81 ++++++++++++ src/app/(frontend)/components/home/News.tsx | 59 +++++++++ .../(frontend)/components/home/Partners.tsx | 54 ++++++++ .../(frontend)/components/home/Projects.tsx | 79 ++++++++++++ .../components/home/ScrollToSection.tsx | 13 ++ src/app/(frontend)/components/ui/Button.tsx | 23 ++++ src/app/(frontend)/globals.css | 27 ---- src/app/(frontend)/layout.tsx | 41 +++--- src/app/(frontend)/page.tsx | 42 +------ src/app/globals.css | 119 ++++++++++++++++++ src/globals/Home.ts | 51 -------- src/globals/Home/Hero.ts | 83 ++++++++++++ src/globals/Home/Projects.ts | 22 ++++ 29 files changed, 837 insertions(+), 175 deletions(-) delete mode 100644 public/file.svg delete mode 100644 public/globe.svg create mode 100644 public/ial-white-transp.png delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg create mode 100644 src/app/(frontend)/components/Header/Client.tsx create mode 100644 src/app/(frontend)/components/Header/Header.tsx create mode 100644 src/app/(frontend)/components/Header/Server.tsx create mode 100644 src/app/(frontend)/components/home/CTA.tsx create mode 100644 src/app/(frontend)/components/home/Hero.tsx create mode 100644 src/app/(frontend)/components/home/News.tsx create mode 100644 src/app/(frontend)/components/home/Partners.tsx create mode 100644 src/app/(frontend)/components/home/Projects.tsx create mode 100644 src/app/(frontend)/components/home/ScrollToSection.tsx create mode 100644 src/app/(frontend)/components/ui/Button.tsx delete mode 100644 src/app/(frontend)/globals.css create mode 100644 src/app/globals.css delete mode 100644 src/globals/Home.ts create mode 100644 src/globals/Home/Hero.ts create mode 100644 src/globals/Home/Projects.ts diff --git a/docker-compose.yml b/docker-compose.yml index 27fd94c..4f08007 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,6 @@ services: environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=admin - - POSTGRES_DB=prisma + - POSTGRES_DB=website volumes: - ./pgdata:/var/lib/postgresql/data diff --git a/package.json b/package.json index 10189e6..14c13c0 100644 --- a/package.json +++ b/package.json @@ -11,25 +11,29 @@ }, "type": "module", "dependencies": { + "@heroicons/react": "^2.2.0", "@payloadcms/db-postgres": "^3.31.0", "@payloadcms/next": "^3.31.0", "@payloadcms/richtext-lexical": "^3.31.0", "cross-env": "^7.0.3", "graphql": "^16.10.0", + "motion": "^12.6.5", "next": "15.2.4", "payload": "^3.31.0", + "postcss": "^8.5.3", "react": "^19.0.0", "react-dom": "^19.0.0", "sharp": "^0.33.5" }, "devDependencies": { - "@tailwindcss/postcss": "^4", + "@tailwindcss/postcss": "^4.0.17", "@tailwindcss/typography": "^0.5.16", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "clsx": "^2.1.1", "prettier": "^3.5.3", - "tailwindcss": "^4", + "tailwindcss": "^4.0.17", "typescript": "^5" }, "pnpm": { diff --git a/payload-types.ts b/payload-types.ts index 857f4a8..9983911 100644 --- a/payload-types.ts +++ b/payload-types.ts @@ -93,10 +93,12 @@ export interface Config { defaultIDType: number; }; globals: { - home: Home; + homeHero: HomeHero; + homeProjects: HomeProject; }; globalsSelect: { - home: HomeSelect | HomeSelect; + homeHero: HomeHeroSelect | HomeHeroSelect; + homeProjects: HomeProjectsSelect | HomeProjectsSelect; }; locale: null; user: User & { @@ -549,33 +551,54 @@ export interface PayloadMigrationsSelect { } /** * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "home". + * via the `definition` "homeHero". */ -export interface Home { +export interface HomeHero { id: number; - title?: string | null; - heroTitle?: string | null; - heroDescription?: { - root: { - type: string; - children: { + titleGroup: { + title: string; + }; + heroGroup: { + heroTitle: string; + heroDescription: { + root: { type: string; + children: { + type: string; + version: number; + [k: string]: unknown; + }[]; + direction: ('ltr' | 'rtl') | null; + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; + indent: number; version: number; - [k: string]: unknown; - }[]; - direction: ('ltr' | 'rtl') | null; - format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; - indent: number; - version: number; + }; + [k: string]: unknown; }; - [k: string]: unknown; - } | null; - heroItems?: - | { - name: string; - id?: string | null; - }[] - | null; + heroItems?: + | { + name: string; + id?: string | null; + }[] + | null; + }; + /** + * This title will be used for SEO purposes, and displayed in the browser tab. + */ + metaTitle: string; + /** + * This description will be used for SEO purposes (e.g., shown in search results and on social media cards). + */ + metaDescription: string; + updatedAt?: string | null; + createdAt?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "homeProjects". + */ +export interface HomeProject { + id: number; projectsTitle?: string | null; projectsDescription?: { root: { @@ -597,18 +620,37 @@ export interface Home { } /** * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "home_select". + * via the `definition` "homeHero_select". */ -export interface HomeSelect { - title?: T; - heroTitle?: T; - heroDescription?: T; - heroItems?: +export interface HomeHeroSelect { + titleGroup?: | T | { - name?: T; - id?: T; + title?: T; }; + heroGroup?: + | T + | { + heroTitle?: T; + heroDescription?: T; + heroItems?: + | T + | { + name?: T; + id?: T; + }; + }; + metaTitle?: T; + metaDescription?: T; + updatedAt?: T; + createdAt?: T; + globalType?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "homeProjects_select". + */ +export interface HomeProjectsSelect { projectsTitle?: T; projectsDescription?: T; updatedAt?: T; diff --git a/payload.config.ts b/payload.config.ts index 65c2383..01847d6 100644 --- a/payload.config.ts +++ b/payload.config.ts @@ -3,13 +3,14 @@ import { FixedToolbarFeature, lexicalEditor } from '@payloadcms/richtext-lexical import { postgresAdapter } from '@payloadcms/db-postgres' import { buildConfig } from 'payload' -import { Home } from '@/globals/Home' +import { HomeHero } from '@/globals/Home/Hero' import { News } from './src/collections/News' import { Projects } from '@/collections/Projects' import { Images } from '@/collections/media/Images' import { Documents } from '@/collections/media/Documents' import { Data } from '@/collections/media/Data' +import { HomeProjects } from '@/globals/Home/Projects' export default buildConfig({ // If you'd like to use Rich Text, pass your editor here @@ -22,7 +23,7 @@ export default buildConfig({ serverURL: process.env.SERVER_URL || 'http://localhost:3000', - globals: [Home], + globals: [HomeHero, HomeProjects], // Define and configure your collections in this array collections: [Projects, News, Images, Documents, Data], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f75bcd..75a7c66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@heroicons/react': + specifier: ^2.2.0 + version: 2.2.0(react@19.0.0) '@payloadcms/db-postgres': specifier: ^3.31.0 version: 3.31.0(@types/react@19.0.12)(payload@3.31.0(graphql@16.10.0)(typescript@5.8.2))(react@19.0.0) @@ -23,12 +26,18 @@ importers: graphql: specifier: ^16.10.0 version: 16.10.0 + motion: + specifier: ^12.6.5 + version: 12.6.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: specifier: 15.2.4 version: 15.2.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) payload: specifier: ^3.31.0 version: 3.31.0(graphql@16.10.0)(typescript@5.8.2) + postcss: + specifier: ^8.5.3 + version: 8.5.3 react: specifier: ^19.0.0 version: 19.0.0 @@ -40,7 +49,7 @@ importers: version: 0.33.5 devDependencies: '@tailwindcss/postcss': - specifier: ^4 + specifier: ^4.0.17 version: 4.0.17 '@tailwindcss/typography': specifier: ^0.5.16 @@ -54,11 +63,14 @@ importers: '@types/react-dom': specifier: ^19 version: 19.0.4(@types/react@19.0.12) + clsx: + specifier: ^2.1.1 + version: 2.1.1 prettier: specifier: ^3.5.3 version: 3.5.3 tailwindcss: - specifier: ^4 + specifier: ^4.0.17 version: 4.0.17 typescript: specifier: ^5 @@ -651,6 +663,11 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@heroicons/react@2.2.0': + resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==} + peerDependencies: + react: '>= 16 || ^19.0.0-rc' + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1482,6 +1499,20 @@ packages: focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + framer-motion@12.6.5: + resolution: {integrity: sha512-MKvnWov0paNjvRJuIy6x418w23tFqRfS6CXHhZrCiSEpXVlo/F+usr8v4/3G6O0u7CpsaO1qop+v4Ip7PRCBqQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1837,6 +1868,26 @@ packages: monaco-editor@0.38.0: resolution: {integrity: sha512-11Fkh6yzEmwx7O0YoLxeae0qEGFwmyPRlVxpg7oF9czOOCB/iCjdJrG5I67da5WiXK3YJCxoz9TJFE8Tfq/v9A==} + motion-dom@12.6.5: + resolution: {integrity: sha512-jpM9TQLXzYMWMJ7Ec7sAj0iis8oIuu6WvjI3yNKJLdrZyrsI/b2cRInDVL8dCl683zQQq19DpL9cSMP+k8T1NA==} + + motion-utils@12.6.5: + resolution: {integrity: sha512-IsOeKsOF+FWBhxQEDFBO6ZYC8/jlidmVbbLpe9/lXSA9j9kzGIMUuIBx2SZY+0reAS0DjZZ1i7dJp4NHrjocPw==} + + motion@12.6.5: + resolution: {integrity: sha512-X3IIy76nxyk4I87xQEm5Ah8ojQ4qisd+/H592eXF14ha+xqpbDJcWOSf9PEKCOCC0K4PN/0UBaz+MvSQUkIeXQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2855,6 +2906,10 @@ snapshots: '@floating-ui/utils@0.2.9': {} + '@heroicons/react@2.2.0(react@19.0.0)': + dependencies: + react: 19.0.0 + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 @@ -3796,6 +3851,15 @@ snapshots: dependencies: tabbable: 6.2.0 + framer-motion@12.6.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + motion-dom: 12.6.5 + motion-utils: 12.6.5 + tslib: 2.8.1 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + fsevents@2.3.3: optional: true @@ -4229,6 +4293,20 @@ snapshots: monaco-editor@0.38.0: {} + motion-dom@12.6.5: + dependencies: + motion-utils: 12.6.5 + + motion-utils@12.6.5: {} + + motion@12.6.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + framer-motion: 12.6.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + tslib: 2.8.1 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + ms@2.1.3: {} nanoid@3.3.11: {} diff --git a/postcss.config.mjs b/postcss.config.mjs index c7bcb4b..4de2724 100644 --- a/postcss.config.mjs +++ b/postcss.config.mjs @@ -1,5 +1,5 @@ const config = { - plugins: ["@tailwindcss/postcss"], + plugins: { "@tailwindcss/postcss": {} }, }; export default config; diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/ial-white-transp.png b/public/ial-white-transp.png new file mode 100644 index 0000000000000000000000000000000000000000..17bcfb60520d4a620dc5835085572674c84a266b GIT binary patch literal 29301 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 aa(U(HVGp8}EeZ2C=5LfVUY01BfB9bs?<;Bm literal 0 HcmV?d00001 diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/(frontend)/components/Header/Client.tsx b/src/app/(frontend)/components/Header/Client.tsx new file mode 100644 index 0000000..35af8da --- /dev/null +++ b/src/app/(frontend)/components/Header/Client.tsx @@ -0,0 +1,32 @@ +"use client"; + +import clsx from "clsx"; +import { motion } from "motion/react"; +import React from "react"; + +export default function ClientHeader({ + children, +}: { + children: React.ReactNode; +}) { + // const { scrollY } = useScroll(); + // const [scrolled, setScrolled] = React.useState(0); + + // const scrollPoint = window.innerHeight / 2; + + // useMotionValueEvent(scrollY, "change", (latest) => { + // setScrolled( + // latest == 0 ? 0 : latest > scrollPoint ? 1 : latest / scrollPoint + // ); + // }); + + return ( + + {children} + + ); +} diff --git a/src/app/(frontend)/components/Header/Header.tsx b/src/app/(frontend)/components/Header/Header.tsx new file mode 100644 index 0000000..c76d1e7 --- /dev/null +++ b/src/app/(frontend)/components/Header/Header.tsx @@ -0,0 +1,10 @@ +import ClientHeader from "./Client"; +import ServerHeader from "./Server"; + +export default function Header() { + return ( + + + + ); +} diff --git a/src/app/(frontend)/components/Header/Server.tsx b/src/app/(frontend)/components/Header/Server.tsx new file mode 100644 index 0000000..04dd0b6 --- /dev/null +++ b/src/app/(frontend)/components/Header/Server.tsx @@ -0,0 +1,44 @@ +// import SignIn from "@/components/sign-in"; +// import SignOut from "@/components/sign-out"; +import Image from "next/image"; + +import ialLogo from "../../../../../public/ial-white-transp.png"; +import Link from "next/link"; +import Button from "../ui/Button"; + +// import { auth } from "@/auth"; + +export default async function ServerHeader() { + // const session = await auth(); + + return ( + + ); +} diff --git a/src/app/(frontend)/components/home/CTA.tsx b/src/app/(frontend)/components/home/CTA.tsx new file mode 100644 index 0000000..32ea95b --- /dev/null +++ b/src/app/(frontend)/components/home/CTA.tsx @@ -0,0 +1,22 @@ +import { ChevronRightIcon } from "@heroicons/react/20/solid"; +import Button from "../ui/Button"; + +export default function CTA() { + return ( +
+
+

+ Want to collaborate? +

+ +
+
+ ); +} diff --git a/src/app/(frontend)/components/home/Hero.tsx b/src/app/(frontend)/components/home/Hero.tsx new file mode 100644 index 0000000..23a46ac --- /dev/null +++ b/src/app/(frontend)/components/home/Hero.tsx @@ -0,0 +1,81 @@ +import React from "react"; + +import configPromise from "@payload-config"; +import { getPayload } from "payload"; + +import ScrollToSection from "./ScrollToSection"; +import { RichText } from "@payloadcms/richtext-lexical/react"; + +export default async function Hero() { + const payload = await getPayload({ config: configPromise }); + + const hero = await payload.findGlobal({ + slug: "homeHero", + }); + + return ( + <> +
+ hi +
+

+ {hero.titleGroup.title} +

+
+ +
+
+
+ +
+
+
+

+ {hero.heroGroup?.heroTitle} +

+
+ +
+
+
+
+
+ +
+
+
+ + ); +} + +const Oribal = () => { + return ( +
+
+
+
+ + + + + + + +
+ ); +}; + +const Planet = ({ text, className }: { text: string; className?: string }) => { + return ( +
+ + {text} + +
+ ); +}; diff --git a/src/app/(frontend)/components/home/News.tsx b/src/app/(frontend)/components/home/News.tsx new file mode 100644 index 0000000..e8cca76 --- /dev/null +++ b/src/app/(frontend)/components/home/News.tsx @@ -0,0 +1,59 @@ +import Button from "@/components/ui/button"; +import prisma from "@/lib/prisma"; +import { ChevronRightIcon } from "@heroicons/react/20/solid"; +import dayjs from "dayjs"; + +export default function News() { + return ( +
+
+
+

+ We've got some news +

+ +
+ +
+ +
+
+
+ ); +} + +async function Gallery() { + const news = await prisma.news.findMany({ + where: { + draft: false, + }, + orderBy: { + date: "desc", + }, + take: 3, + }); + + // TODO: parse markdown + return ( +
+ {news.map((item) => ( +
+
+ {dayjs(item.date).format("DD/MM/YYYY")} +
+

{item.title}

+
+

+ {item.body} +

+ +
+ ))} +
+ ); +} diff --git a/src/app/(frontend)/components/home/Partners.tsx b/src/app/(frontend)/components/home/Partners.tsx new file mode 100644 index 0000000..99c3304 --- /dev/null +++ b/src/app/(frontend)/components/home/Partners.tsx @@ -0,0 +1,54 @@ +"use client"; + +import clsx from "clsx"; +import { useState } from "react"; + +const PARTNERS = [ + { label: "Aotearoa", partners: [] }, + { label: "International", partners: [] }, +]; + +export default function Partners() { + const [partner, setPartner] = useState(PARTNERS[0].label); + + return ( +
+
+

+ We've worked with … +

+ +
+
    + {PARTNERS.map((group) => ( +
  • setPartner(group.label)} + > + {group.label} + +
  • + ))} +
+
+ {Array.from({ length: 12 }).map((_, index) => ( +
+ ))} +
+
+
+
+ ); +} diff --git a/src/app/(frontend)/components/home/Projects.tsx b/src/app/(frontend)/components/home/Projects.tsx new file mode 100644 index 0000000..f90f894 --- /dev/null +++ b/src/app/(frontend)/components/home/Projects.tsx @@ -0,0 +1,79 @@ +import Button from "@/components/ui/button"; +import prisma from "@/lib/prisma"; +import { ChevronRightIcon } from "@heroicons/react/20/solid"; +import Image from "next/image"; + +export default function Projects() { + return ( +
+
+
+

+ We do data differently +

+ +

+ Lorem, ipsum dolor sit amet consectetur adipisicing elit. Commodi + modi repudiandae deleniti ut at, voluptatibus alias asperiores + temporibus sed id numquam nemo error ipsa adipisci perferendis. + Consequuntur vitae tenetur dolore. +

+

+ Eveniet doloremque ducimus deserunt labore, distinctio odit sunt + mollitia ab repellat excepturi aliquam fuga impedit! Maiores porro + qui consequatur nisi voluptates, odit facere nobis corrupti labore + ducimus cumque! Voluptates, beatae? +

+ +
+ +
+ +
+
+
+ ); +} + +async function Gallery() { + const projects = await prisma.project.findMany({ + where: { + feature: true, + }, + }); + + return ( +
+ {projects.map((project) => ( +
+
+ {project.image && ( + {project.title} + )} +
+
+

+ {project.title} +

+ +
+

{project.summary}

+
+ ))} +
+ ); +} diff --git a/src/app/(frontend)/components/home/ScrollToSection.tsx b/src/app/(frontend)/components/home/ScrollToSection.tsx new file mode 100644 index 0000000..583a34b --- /dev/null +++ b/src/app/(frontend)/components/home/ScrollToSection.tsx @@ -0,0 +1,13 @@ +"use client"; +import { ArrowDownCircleIcon } from "@heroicons/react/20/solid"; + +export default function ScrollToSection({ anchor }: { anchor: string }) { + return ( + { + document.querySelector(anchor)?.scrollIntoView({ behavior: "smooth" }); + }} + /> + ); +} diff --git a/src/app/(frontend)/components/ui/Button.tsx b/src/app/(frontend)/components/ui/Button.tsx new file mode 100644 index 0000000..3229ed5 --- /dev/null +++ b/src/app/(frontend)/components/ui/Button.tsx @@ -0,0 +1,23 @@ +export default function Button({ + children, + type, + variant, + className, + ...props +}: { + children: React.ReactNode; + type: "primary" | "secondary" | "alternate"; + variant?: "filled" | "outlined"; + className?: string; + // [x: string]: +}) { + const btnVariant = variant ?? "filled"; + return ( + + ); +} diff --git a/src/app/(frontend)/globals.css b/src/app/(frontend)/globals.css deleted file mode 100644 index 37ff499..0000000 --- a/src/app/(frontend)/globals.css +++ /dev/null @@ -1,27 +0,0 @@ -@import "tailwindcss"; -@plugin "@tailwindcss/typography"; - -:root { - --background: #ffffff; - --foreground: #171717; -} - -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; -} diff --git a/src/app/(frontend)/layout.tsx b/src/app/(frontend)/layout.tsx index f7fa87e..13c6ede 100644 --- a/src/app/(frontend)/layout.tsx +++ b/src/app/(frontend)/layout.tsx @@ -1,21 +1,30 @@ import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import configPromise from "@payload-config"; +import { getPayload } from "payload"; -const geistSans = Geist({ - variable: "--font-geist-sans", +import "../globals.css"; +import Header from "./components/Header/Header"; + +import { Inter } from "next/font/google"; + +const inter = Inter({ subsets: ["latin"], + display: "swap", + variable: "--font-inter", }); -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); +export async function generateMetadata(): Promise { + const payload = await getPayload({ config: configPromise }); -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + const homeHero = await payload.findGlobal({ + slug: "homeHero", + }); + + return { + title: homeHero.metaTitle, + description: homeHero.metaDescription, + }; +} export default function RootLayout({ children, @@ -24,10 +33,10 @@ export default function RootLayout({ }>) { return ( - - {children} + +
+
{children}
+ {/*