Skip to content

coffee-for-coding/Art-Page

Repository files navigation

Naabi Kage β€” Art Portfolio

A dark-then-light, minimalist gallery site for the artist Naabi Kage, built with Next.js 14 (App Router), TypeScript, and Tailwind. The gallery auto-advances, the background animates with Vanta.BIRDS (Three.js), and every page transitions with a smooth ease-in fade.

Preview

If the inline player does not render on GitHub, click here to watch / download: media/nabi-kage-arts.mp4

This README is the operating manual: how to run the site, how to add new artwork, how to update the words on every page, and how to deploy.


1. Quick start

git clone https://github.com/coffee-for-coding/Art-Page.git
cd Art-Page
npm install
npm run dev

Open http://localhost:3000.

Production build:

npm run build
npm run start

Lint / format:

npm run lint
npm run format

Requirements: Node 18.17+.


2. Project map

Art-Page/
β”œβ”€ public/
β”‚  β”œβ”€ dp.png                 ← profile picture (used on About if you wire it)
β”‚  β”œβ”€ images/
β”‚  β”‚  └─ {YEAR}/{slug}/      ← every artwork lives here
β”‚  β”‚     β”œβ”€ cover.jpg        ← any image file: jpg/jpeg/png/webp/avif/gif
β”‚  β”‚     └─ meta.json        ← optional: title / series / medium / bg
β”‚  └─ sketches/              ← every sketch lives here (flat folder)
β”‚     β”œβ”€ <slug>.png          ← any image file: jpg/jpeg/png/webp/avif/gif
β”‚     └─ <slug>.json         ← optional: title / date / medium / notes
β”œβ”€ src/
β”‚  β”œβ”€ app/
β”‚  β”‚  β”œβ”€ layout.tsx          ← <html>, fonts, Vanta background, page-transition wrapper
β”‚  β”‚  β”œβ”€ globals.css         ← theme variables + page-transition keyframes
β”‚  β”‚  β”œβ”€ page.tsx            ← Home (Gallery)
β”‚  β”‚  β”œβ”€ about/page.tsx      ← About page (bio + email)
β”‚  β”‚  └─ sketches/page.tsx   ← Sketches page (grid of sketch images + metadata)
β”‚  β”œβ”€ components/
β”‚  β”‚  β”œβ”€ Navbar.tsx          ← logo + WORK/SKETCHES/ABOUT + WORK year dropdown
β”‚  β”‚  β”œβ”€ Gallery.tsx         ← slide carousel, autoplay, prev/next previews, dots
β”‚  β”‚  β”œβ”€ Slide.tsx           ← single artwork slide (image + caption)
β”‚  β”‚  β”œβ”€ NavButton.tsx       ← left/right arrow buttons
β”‚  β”‚  β”œβ”€ RadialMenu.tsx      ← logo-click radial overlay menu
β”‚  β”‚  β”œβ”€ VantaBackground.tsx ← loads Three.js + Vanta.BIRDS into a fixed bg
β”‚  β”‚  └─ PageTransition.tsx  ← rerouting fade-in keyed off pathname
β”‚  β”œβ”€ data/
β”‚  β”‚  └─ works.ts            ← seed artworks (used only if /public/images/ is empty)
β”‚  └─ lib/
β”‚     β”œβ”€ loadWorks.ts        ← scans /public/images/ at build time
β”‚     └─ loadSketches.ts     ← scans /public/sketches/ at build time
β”œβ”€ next.config.js
β”œβ”€ tailwind.config.ts
β”œβ”€ tsconfig.json
β”œβ”€ package.json
└─ README.md

3. Add or update artwork

This is the part you'll touch most often. The loader scans public/images/ at build time; no code changes are required to add new pieces.

3.1 Folder convention

public/images/
  2024/
    moonlit-figure/
      cover.jpg          ← the image file (any name; first image found is used)
      meta.json          ← optional, for nicer titles / series / medium / bg
    veil/
      veil.png
  2023/
    the-quiet-hour/
      photo.webp

Rules the loader (src/lib/loadWorks.ts) enforces:

Layer Rule
1st level Folder name must be a 4-digit year (e.g. 2024).
2nd level Folder name is the slug for one artwork.
Image First file with extension jpg/jpeg/png/webp/avif/gif is the cover.
Title Auto-derived from slug (moonlit-figure β†’ Moonlit Figure).
Series / medium Auto-defaulted unless overridden in meta.json.
Background Picked from a soft palette unless overridden.

3.2 Optional meta.json per artwork

Place inside the artwork folder. Every key is optional.

{
  "title": "Moonlit Figure",
  "series": "Nocturnes",
  "medium": "Oil on linen",
  "bg": "#1a1814"
}

3.3 Step-by-step: add a new artwork

  1. Create the folder: public/images/2024/<slug-with-hyphens>/.
  2. Drop the image inside (any filename).
  3. (Optional) Add meta.json for a custom title / series / medium.
  4. Restart dev (npm run dev) β€” in production, the next npm run build picks it up.

3.4 Step-by-step: rename / retitle an artwork

  • Rename β†’ rename the folder; URL slug + auto-title both update.
  • Retitle without renaming β†’ set "title" in meta.json.

3.5 Step-by-step: remove an artwork

Delete its folder. Done. Year folder can stay empty or be deleted.

3.6 No images? Fall back to seed data

If public/images/ has zero year folders, the site uses src/data/works.ts as the seed. Edit that array to add objects with shape:

{
  id: "unique-id",
  title: "Title",
  year: 2024,
  series: "Series Name",
  medium: "Oil on linen",
  image: "/images/your-image.jpg",
  bg: "#1a1814"
}

4. Edit page text

4.1 Sketches page (/sketches)

The Sketches page renders a grid of sketch images, scanned at build time from public/sketches/ by src/lib/loadSketches.ts. No code changes are required to add new sketches.

Folder convention (flat β€” no year subfolders):

public/sketches/
  dummy.png
  dummy.json          ← optional metadata, same basename as image
  study-hand.jpg
  study-hand.json

Rules the loader enforces:

Layer Rule
Image Any file with extension jpg/jpeg/png/webp/avif/gif.
Metadata Optional <basename>.json alongside the image.
Title From meta.title, otherwise the file basename.
Sort order Alphabetical by basename.

Optional <basename>.json shape β€” every key is optional:

{
  "title": "Dummy Sketch",
  "date": "2026-04-26",
  "medium": "Graphite on paper",
  "notes": "Placeholder sketch entry."
}

Step-by-step: add a new sketch

  1. Drop the image into public/sketches/ (any filename).
  2. (Optional) Add <same-basename>.json next to it for title / date / medium / notes.
  3. Restart npm run dev β€” in production, the next npm run build picks it up.

To remove a sketch, delete the image (and its JSON if present).

4.2 About page (/about)

Open src/app/about/page.tsx. The bio is plain JSX in two <p> blocks. Edit the text directly. The contact link's href and label can also be updated in place.

4.3 Navbar links

Open src/components/Navbar.tsx. The NAV_LINKS array drives the centre nav. To add a link:

const NAV_LINKS = [
  { label: "WORK", href: "/" },
  { label: "SKETCHES", href: "/sketches" },
  { label: "ABOUT", href: "/about" },
  { label: "JOURNAL", href: "/journal" }, // ← new
];

(You'd then create src/app/journal/page.tsx to back it.)

The WORK link gets a special hover dropdown listing every year (and how many works are in it). That data is computed automatically from whatever loadWorks() returned, so you never edit it by hand.

4.4 Radial menu (logo click)

Open src/components/RadialMenu.tsx. Two arrays:

  • INNER β€” six items closer to the centre.
  • OUTER β€” six items further out (year shortcuts, social, archive).

Each item is { label, href }. Replace href to point at real Instagram / store / journal URLs.

4.5 Background animation (Vanta)

Open src/components/VantaBackground.tsx. The current effect is Vanta.BIRDS. To swap effects:

  1. Change the script URL (e.g. vanta.birds.min.js β†’ vanta.waves.min.js).
  2. Update the call from window.VANTA.BIRDS({...}) to window.VANTA.WAVES({...}) (or NET, FOG, CELLS, RINGS, etc.).
  3. Adjust the option object β€” Vanta's docs list every effect's options.

4.6 Theme colors / fonts

Open src/app/globals.css. The two theme variables:

--ink:  #ffffff;   /* page background */
--bone: #1a1814;   /* primary text */

Fonts are loaded from Google Fonts in src/app/layout.tsx (Cormorant Garamond + EB Garamond). Swap the <link> URL to change them.

4.7 Browser tab title / share metadata

Open src/app/layout.tsx. Edit the metadata export:

export const metadata: Metadata = {
  title: "Naabi Kage",
  description: "Selected works by Naabi Kage.",
  openGraph: { title: "Naabi Kage", description: "…", type: "website" },
};

5. Animations & timing

What Where Default
Gallery autoplay interval src/components/Gallery.tsx 10000 ms
Slide cross-fade src/components/Slide.tsx 1600 ms
Title / caption text reveal src/components/Slide.tsx 1200 ms
Page-route fade-in src/app/globals.css 700 ms
Easing curve (most things) global cubic-bezier(0.42, 0, 0.58, 1) ease-in-out

Tweak any number in the file shown β€” no rebuild gymnastics required.


6. Deploy to Vercel

  1. Push to GitHub (see Β§ 7).
  2. Go to https://vercel.com/new, import the repo, accept defaults.
  3. After every push to main, Vercel rebuilds. loadWorks() runs at build time, so newly added images appear after the next deploy.

No environment variables are required.


7. Push to GitHub

git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/coffee-for-coding/Art-Page.git
git push -u origin main

If the remote already has commits and git push is rejected, either pull and merge:

git pull --rebase origin main
git push -u origin main

…or reset the remote (only if you intend to overwrite it):

git push -u origin main --force

8. Common questions

Q β€” I added an image but it isn't showing. A β€” Make sure the path is public/images/{4-digit-year}/{slug-folder}/{file}. The slug must be a folder, not a file. Restart npm run dev (or rebuild on Vercel).

Q β€” Can I have multiple images per artwork? A β€” Yes. Drop them all into the same artwork folder; the first image (alphabetical) is used as the cover. Future-proofing for a "details" page is easy β€” loadWorks() could be extended to return an array of images instead of one.

Q β€” How do I change the artist name shown in the navbar? A β€” Edit the button text in src/components/Navbar.tsx (search for NAABI KAGE). Also update the page title in src/app/layout.tsx.

Q β€” How do I disable the background animation? A β€” Remove <VantaBackground /> from src/app/layout.tsx and set background: var(--ink); back on body in globals.css.

Q β€” How do I disable autoplay on the gallery? A β€” In src/components/Gallery.tsx, comment out the setTimeout call inside the autoplay useEffect.


9. Credits

  • Typography: Cormorant Garamond + EB Garamond via Google Fonts.
  • Background: Vanta.js BIRDS effect, Three.js r134.
  • Layout / engineering: built on Next.js 14 App Router with TypeScript strict mode, no external animation libraries beyond Vanta.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors