Rewrite as bring-your-own-markdown website generator

This commit is contained in:
whitney 2026-03-03 09:47:11 -08:00
parent 2456040d9d
commit ffa0a46213
63 changed files with 2817 additions and 263 deletions

17
build/asset-manifest.json Normal file
View File

@ -0,0 +1,17 @@
{
"files": {
"main.css": "/static/css/main.39fd778a.css",
"main.js": "/static/js/main.fd3a90d8.js",
"static/js/488.9561f9b8.chunk.js": "/static/js/488.9561f9b8.chunk.js",
"static/media/instagram-light.png": "/static/media/instagram-light.2173f1e5eaee4fd6d94f.png",
"static/media/instagram-dark.png": "/static/media/instagram-dark.60be80b890ecf588309c.png",
"index.html": "/index.html",
"main.39fd778a.css.map": "/static/css/main.39fd778a.css.map",
"main.fd3a90d8.js.map": "/static/js/main.fd3a90d8.js.map",
"488.9561f9b8.chunk.js.map": "/static/js/488.9561f9b8.chunk.js.map"
},
"entrypoints": [
"static/css/main.39fd778a.css",
"static/js/main.fd3a90d8.js"
]
}

BIN
build/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

1
build/index.html Normal file
View File

@ -0,0 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.fd3a90d8.js"></script><link href="/static/css/main.39fd778a.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>

BIN
build/logo192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
build/logo512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

25
build/manifest.json Normal file
View File

@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

3
build/robots.txt Normal file
View File

@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,86 @@
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*!
* Masonry v4.2.2
* Cascading grid layout library
* https://masonry.desandro.com
* MIT License
* by David DeSandro
*/
/*!
* Outlayer v2.1.1
* the brains and guts of a layout library
* MIT license
*/
/*!
* getSize v2.0.3
* measure size of elements
* MIT license
*/
/**
* @license React
* react-dom-client.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-dom.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-jsx-runtime.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* react-router v7.1.1
*
* Copyright (c) Remix Software Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE.md file in the root directory of this source tree.
*
* @license MIT
*/

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

13
content/_config.json Normal file
View File

@ -0,0 +1,13 @@
{
"siteTitle": "Jake Runyan Photography",
"footerCopyright": "Jake Runyan",
"nav": [
{ "label": "Gallery", "path": "/gallery" },
{ "label": "Contact", "path": "/contact" },
{ "label": "About", "path": "/about" }
],
"social": [
{ "label": "Instagram", "url": "https://www.instagram.com/jakerunyanphotography", "icon": "instagram" },
{ "label": "GitHub", "url": "https://github.com/runyanjake/jakesphotos", "icon": "github" }
]
}

11
content/about/index.md Normal file
View File

@ -0,0 +1,11 @@
---
template: default
title: About Me
profileImage: https://gallery.whitney.rip/api/v1/t/287329d8835b299400819437c9c2a2d192041159/2tdm690t/fit_4096
---
I'm Jake, a small time photographer out of the Bay Area. I started shooting as a kid on my dad's old Canon EOS 60D, and now have graduated to owning my own gear. Having an artistic outlet has always been a force of balance for me, and with a background in video and photo editing, this has been a fun one.
My current setup is a Sony Alpha 6300 with a 27mm pancake lens. This budget setup was perfect for bringing my camera along on bike rides, as cycling is another hobby. You can find me on Youtube as Jake's West Coast. My current photography interests include capturing the beauty of the Bay Area and California coast on our bike rides, as well as moments in my everyday life.
If you'd like to learn more about Jake, the person, you can find more at my instagram @runyanjake or on my personal website jake.runyan.dev.

6
content/contact/index.md Normal file
View File

@ -0,0 +1,6 @@
---
template: contact
title: Contact Me
email: jake@runyan.dev
instagram: jakerunyanphotography
---

21
content/gallery/index.md Normal file
View File

@ -0,0 +1,21 @@
---
template: menu
title: Gallery
description: Browse my photo collections
---
## [Landscapes](/gallery/landscapes)
![](https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)
Mountains, coastal cliffs, and open skies across California and the Bay Area.
## [Portraits](/gallery/portraits)
![](https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)
Candid moments and faces from everyday life.
## [Textures](/gallery/textures)
![](https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)
Abstract surfaces and patterns found in the world around us.
## [Nature](/gallery/nature)
![](https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)
Flora, fauna, and natural forms.

View File

@ -0,0 +1,22 @@
[
"https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1114e4b3-99a7-4cdc-9ce2-ad52d1a0046f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1ce61b59-98a7-401c-9840-72dc51822494/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2250e289-03ae-4ee4-a63a-3ba29db99dd0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec93e5f8-ca2e-4078-8190-d884435513eb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/40cb4952-0b8a-4500-a692-a20acbe01ff4/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fe3919e-00d4-4afc-8140-a81dbf266c82/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3a89717a-b0b9-42a6-ab34-0f4dc3d90987/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8beaf017-029f-4827-a3c2-066f9453e271/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/87cd7f35-f4c5-4a1e-a56d-c6d8e9d082da/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2c55949d-7a2d-4bde-a87e-107ce352bc60/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/44f3ce06-3b34-42d2-9396-424ff95ba672/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d88e4a71-d645-48de-9b22-aad8f1ae3bde/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d84b166b-56fc-48cb-b932-7847d70ade04/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/01d40f57-dbf6-4c9d-8fc1-0ac22dfe17e5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e7055bf2-626a-47a5-9526-15b2de26249e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7635d87d-5ed6-4342-9cc2-0c6d0e0a1425/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0beaaf50-cb2c-4d84-b099-e1af24f7d2e3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/90052323-c4df-4820-8fe8-7658424991b8/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4749cdd5-aa5a-4911-9567-f3f5afca6ecc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]

View File

@ -0,0 +1,4 @@
---
template: gallery
title: Landscapes
---

View File

@ -0,0 +1,21 @@
[
"https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/72d0e30d-c27c-4d8e-8977-0ae438178324/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d496de3c-bf3a-4b49-a34a-96c998c288a0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fd4b8886-7a55-478e-8bc8-6cba70fe9cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30b56b85-3225-44df-903d-5ba14e07927c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/185d198a-a2d3-40f1-b508-11d03edf8162/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/92063a5c-0c50-46c1-9bb3-8c294305b5a7/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fb5267d-7b71-4612-ad9c-4be961704a67/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d0fbaa8-90c2-4a46-9b32-d463fac24ba1/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bb8cf2fc-a745-4ff9-87a3-51a5407de9a3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/abefba8f-c77e-46e7-9f62-9a3da5ec8128/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d9fc53c6-4645-4451-91d5-94927ff638ea/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddf6d29e-81f4-4c3b-8277-450a88b0d75f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/b66557e8-aa4a-4f0b-b252-ee0ece28b0b5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8f6df2db-6a63-446b-9c00-5830ff91ea5c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/00d4ad2e-d549-45ac-9a7c-d9f97cc2a0ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/97e8aa93-39fb-42d9-b1e0-0536eb81e4ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0eef2205-2260-4307-80fa-520aeb139558/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0fe37f58-c2c6-4007-ae6d-0230ab4a7507/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]

View File

@ -0,0 +1,4 @@
---
template: gallery
title: Nature
---

View File

@ -0,0 +1,22 @@
[
"https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1a8dd56a-3433-40ab-8619-f385560ee807/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe1b66b4-4f98-43a3-bb26-6d4661d5ffe2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/787274d8-d94b-479c-9a11-b60f3ca3e640/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/91d11918-7471-4e81-b101-23511e14f45d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bfa43b2b-4aa1-4792-ab2f-aff1e226cdf0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30273029-cba9-45a6-aa7c-3af27d0bd835/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f7bfc5b1-6ef6-42ce-b4a2-237939b03ae9/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e29ce2a5-987c-4453-81f2-b2e7b161e7d2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3082f0af-fb30-4e04-baae-5b47d310e380/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/15dd24ba-e2ae-4093-a098-988aac86e1e0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fc6c3d20-2521-4d31-9f31-19476ad30a65/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8a750cc3-7bef-4bc6-9727-83151dead578/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4db2ea6d-8998-40df-bf05-fc27beeb2085/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec92f32f-0c08-4317-b8e2-90c53c2e6416/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7d5803ea-20b9-448f-9659-6fb801f15c68/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dfb53a18-05dc-4cbc-bdd2-7f8b6f5a4e8e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e6934d1a-543c-4ed8-9c29-a94e915f9d94/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0e88d871-fc8e-4ac3-a96a-920fce3cc546/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/379a3b92-ff9b-4455-afe7-c2c6a8a270cd/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]

View File

@ -0,0 +1,4 @@
---
template: gallery
title: Portraits
---

View File

@ -0,0 +1,22 @@
[
"https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d759c78-64c8-4607-9b61-7d1f536fe98f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0ff98add-0a3c-408b-af91-6320df62910f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ce5eba3e-c444-4a20-a88a-92bfe56c6891/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/a837364d-ed8a-44cf-a8db-8db320bf81e6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8e254f41-7b14-48b3-ba98-a96fb9c05129/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1f877a0c-8e36-4751-b50a-5ea12c73aefc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1979efcd-ba01-4194-b0f7-8e64a996c1cc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4fcf415-7eb1-4131-8ef8-b0456aa31c62/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4e440673-7294-48ac-99a4-05cc3fb07cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/62baec73-487d-4a72-bdc4-7c168cf6f82a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/88cd4904-2ab1-4c60-b225-58d73945d724/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dd59bec7-d922-4a53-af12-3f252c109d0d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d33762bc-1204-4f33-8e6f-2ea5bde72f1a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe4c9bf0-334b-40fb-9a44-8b1984e2818a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/993736e1-a3ae-4ec5-8c67-c25c4c734f23/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/038e8d18-87cd-49f4-8e53-4c36a5f76cfb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/994408ea-6f04-473f-84ea-de3c77265298/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddaf8248-7cdf-4e39-9639-d2826dc9d038/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/214921e1-7b75-4059-ad53-1c1062f6df45/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]

View File

@ -0,0 +1,4 @@
---
template: gallery
title: Textures
---

81
content/images.json Normal file
View File

@ -0,0 +1,81 @@
[
"https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1114e4b3-99a7-4cdc-9ce2-ad52d1a0046f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1ce61b59-98a7-401c-9840-72dc51822494/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2250e289-03ae-4ee4-a63a-3ba29db99dd0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec93e5f8-ca2e-4078-8190-d884435513eb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/40cb4952-0b8a-4500-a692-a20acbe01ff4/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fe3919e-00d4-4afc-8140-a81dbf266c82/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3a89717a-b0b9-42a6-ab34-0f4dc3d90987/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8beaf017-029f-4827-a3c2-066f9453e271/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/87cd7f35-f4c5-4a1e-a56d-c6d8e9d082da/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2c55949d-7a2d-4bde-a87e-107ce352bc60/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/44f3ce06-3b34-42d2-9396-424ff95ba672/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d88e4a71-d645-48de-9b22-aad8f1ae3bde/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d84b166b-56fc-48cb-b932-7847d70ade04/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/01d40f57-dbf6-4c9d-8fc1-0ac22dfe17e5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e7055bf2-626a-47a5-9526-15b2de26249e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7635d87d-5ed6-4342-9cc2-0c6d0e0a1425/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0beaaf50-cb2c-4d84-b099-e1af24f7d2e3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/90052323-c4df-4820-8fe8-7658424991b8/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4749cdd5-aa5a-4911-9567-f3f5afca6ecc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1a8dd56a-3433-40ab-8619-f385560ee807/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe1b66b4-4f98-43a3-bb26-6d4661d5ffe2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/787274d8-d94b-479c-9a11-b60f3ca3e640/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/91d11918-7471-4e81-b101-23511e14f45d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bfa43b2b-4aa1-4792-ab2f-aff1e226cdf0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30273029-cba9-45a6-aa7c-3af27d0bd835/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f7bfc5b1-6ef6-42ce-b4a2-237939b03ae9/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e29ce2a5-987c-4453-81f2-b2e7b161e7d2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3082f0af-fb30-4e04-baae-5b47d310e380/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/15dd24ba-e2ae-4093-a098-988aac86e1e0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fc6c3d20-2521-4d31-9f31-19476ad30a65/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8a750cc3-7bef-4bc6-9727-83151dead578/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4db2ea6d-8998-40df-bf05-fc27beeb2085/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec92f32f-0c08-4317-b8e2-90c53c2e6416/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7d5803ea-20b9-448f-9659-6fb801f15c68/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dfb53a18-05dc-4cbc-bdd2-7f8b6f5a4e8e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e6934d1a-543c-4ed8-9c29-a94e915f9d94/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0e88d871-fc8e-4ac3-a96a-920fce3cc546/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/379a3b92-ff9b-4455-afe7-c2c6a8a270cd/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d759c78-64c8-4607-9b61-7d1f536fe98f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0ff98add-0a3c-408b-af91-6320df62910f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ce5eba3e-c444-4a20-a88a-92bfe56c6891/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/a837364d-ed8a-44cf-a8db-8db320bf81e6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8e254f41-7b14-48b3-ba98-a96fb9c05129/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1f877a0c-8e36-4751-b50a-5ea12c73aefc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1979efcd-ba01-4194-b0f7-8e64a996c1cc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4fcf415-7eb1-4131-8ef8-b0456aa31c62/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4e440673-7294-48ac-99a4-05cc3fb07cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/62baec73-487d-4a72-bdc4-7c168cf6f82a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/88cd4904-2ab1-4c60-b225-58d73945d724/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dd59bec7-d922-4a53-af12-3f252c109d0d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d33762bc-1204-4f33-8e6f-2ea5bde72f1a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe4c9bf0-334b-40fb-9a44-8b1984e2818a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/993736e1-a3ae-4ec5-8c67-c25c4c734f23/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/038e8d18-87cd-49f4-8e53-4c36a5f76cfb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/994408ea-6f04-473f-84ea-de3c77265298/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddaf8248-7cdf-4e39-9639-d2826dc9d038/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/214921e1-7b75-4059-ad53-1c1062f6df45/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/72d0e30d-c27c-4d8e-8977-0ae438178324/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d496de3c-bf3a-4b49-a34a-96c998c288a0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fd4b8886-7a55-478e-8bc8-6cba70fe9cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30b56b85-3225-44df-903d-5ba14e07927c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/185d198a-a2d3-40f1-b508-11d03edf8162/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/92063a5c-0c50-46c1-9bb3-8c294305b5a7/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fb5267d-7b71-4612-ad9c-4be961704a67/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d0fbaa8-90c2-4a46-9b32-d463fac24ba1/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bb8cf2fc-a745-4ff9-87a3-51a5407de9a3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/abefba8f-c77e-46e7-9f62-9a3da5ec8128/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d9fc53c6-4645-4451-91d5-94927ff638ea/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddf6d29e-81f4-4c3b-8277-450a88b0d75f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/b66557e8-aa4a-4f0b-b252-ee0ece28b0b5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8f6df2db-6a63-446b-9c00-5830ff91ea5c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/00d4ad2e-d549-45ac-9a7c-d9f97cc2a0ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/97e8aa93-39fb-42d9-b1e0-0536eb81e4ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0eef2205-2260-4307-80fa-520aeb139558/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0fe37f58-c2c6-4007-ae6d-0230ab4a7507/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]

17
content/index.md Normal file
View File

@ -0,0 +1,17 @@
---
template: homepage
title: Jake Runyan Photography
subtitle: Bay Area · Cycling · Life
---
## Bay Area Life
![](https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)
I'm Jake, a small-time photographer out of the Bay Area. I shoot the world around me — the coastlines, the hills, the everyday scenes that make this place feel like home.
## On Two Wheels
![](https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)
My Sony Alpha 6300 comes along on every ride. There's something about cycling that puts you right in the middle of a scene — no glass between you and the world.
## Everyday Moments
![](https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)
Beyond landscapes, it's the small details that catch my eye — textures, light, the quiet moments between everything else.

1380
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,11 +8,14 @@
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-helmet": "^6.1.0",
"react-markdown": "^9.1.0",
"react-router-dom": "^7.1.1",
"react-scripts": "5.0.1",
"web-vitals": "^4.2.4"
},
"scripts": {
"prebuild": "node scripts/build-content.js",
"prestart": "node scripts/build-content.js",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
@ -35,5 +38,17 @@
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1"
},
"jest": {
"moduleNameMapper": {
"^react-router-dom$": "<rootDir>/node_modules/react-router-dom/dist/index.js",
"^react-router$": "<rootDir>/node_modules/react-router/dist/development/index.js",
"^react-router/dom$": "<rootDir>/node_modules/react-router/dist/development/dom-export.js"
}
}
}

95
scripts/build-content.js Normal file
View File

@ -0,0 +1,95 @@
#!/usr/bin/env node
/**
* Prebuild script: reads content/ files and generates src/generated/content.js
* Run automatically via npm prestart / prebuild hooks.
*/
const fs = require('fs');
const path = require('path');
const CONTENT_DIR = path.resolve(__dirname, '../content');
const OUTPUT_FILE = path.resolve(__dirname, '../src/generated/content.js');
// --- Frontmatter parser ---
function parseFrontmatter(raw) {
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n)?([\s\S]*)$/);
if (!match) return { frontmatter: {}, content: raw.trim() };
const lines = match[1].split('\n');
const frontmatter = {};
for (const line of lines) {
const m = line.match(/^(\w[\w-]*)\s*:\s*(.*)/);
if (m) frontmatter[m[1]] = m[2].trim();
}
return { frontmatter, content: match[2].trim() };
}
// --- Route derivation ---
function routeFromDir(dirName) {
// content/index.md -> /
// content/about/index.md -> /about
if (dirName === '') return '/';
return '/' + dirName;
}
// --- Load site config ---
const configPath = path.join(CONTENT_DIR, '_config.json');
if (!fs.existsSync(configPath)) {
console.error('Missing content/_config.json');
process.exit(1);
}
const siteConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));
// --- Discover page dirs ---
// Root-level index.md lives directly in content/
// Subdir index.md lives in content/<slug>/
const pages = {};
function processDir(dirPath, slug) {
const indexPath = path.join(dirPath, 'index.md');
if (!fs.existsSync(indexPath)) return;
const raw = fs.readFileSync(indexPath, 'utf8');
const { frontmatter, content } = parseFrontmatter(raw);
// Resolve images: check dirPath/images.json first, then dirPath/images/ subfolder
let images = [];
const localImagesJsonPath = path.join(dirPath, 'images.json');
if (fs.existsSync(localImagesJsonPath)) {
images = JSON.parse(fs.readFileSync(localImagesJsonPath, 'utf8'));
} else {
const imagesDirPath = path.join(dirPath, 'images');
if (fs.existsSync(imagesDirPath)) {
const files = fs.readdirSync(imagesDirPath);
images = files.map(f => `/content-images/${slug}/${f}`);
}
}
const route = routeFromDir(slug);
pages[route] = { frontmatter, content, images };
}
function walkContent(dirPath, slug) {
processDir(dirPath, slug);
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
for (const entry of entries) {
if (!entry.isDirectory() || entry.name.startsWith('_')) continue;
const childSlug = slug ? `${slug}/${entry.name}` : entry.name;
walkContent(path.join(dirPath, entry.name), childSlug);
}
}
walkContent(CONTENT_DIR, '');
// --- Write output ---
const output = `// AUTO-GENERATED by scripts/build-content.js — do not edit by hand.
export const siteConfig = ${JSON.stringify(siteConfig, null, 2)};
export const pages = ${JSON.stringify(pages, null, 2)};
`;
fs.mkdirSync(path.dirname(OUTPUT_FILE), { recursive: true });
fs.writeFileSync(OUTPUT_FILE, output, 'utf8');
console.log(`[build-content] Generated ${OUTPUT_FILE}`);
console.log(`[build-content] Pages: ${Object.keys(pages).join(', ')}`);

View File

@ -1,25 +1,33 @@
import React from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import { ContentProvider, usePages } from './framework/ContentProvider';
import { getTemplate } from './framework/TemplateRegistry';
import Navbar from './components/Navbar';
import Home from './components/Home';
import Contact from './components/Contact';
import About from './components/About';
import Footer from './components/Footer';
import './plugins/index';
const App = () => {
const PageRoutes = () => {
const pages = usePages();
return (
<Router>
<>
<Navbar />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/contact" element={<Contact />} />
<Route path="/about" element={<About />} />
{Object.entries(pages).map(([route, page]) => {
const Template = getTemplate(page.frontmatter.template);
return <Route key={route} path={route} element={<Template page={page} />} />;
})}
</Routes>
<Footer />
</>
</Router>
);
};
const App = () => (
<Router>
<ContentProvider>
<>
<Navbar />
<PageRoutes />
<Footer />
</>
</ContentProvider>
</Router>
);
export default App;

View File

@ -3,19 +3,24 @@ import App from './App';
// masonry-layout requires DOM layout APIs not available in jsdom
jest.mock('masonry-layout', () => {
return jest.fn().mockImplementation(() => ({
layout: jest.fn(),
destroy: jest.fn(),
}));
const MockMasonry = function () {};
MockMasonry.prototype.layout = jest.fn();
MockMasonry.prototype.destroy = jest.fn();
return MockMasonry;
});
test('renders site title in navbar', () => {
render(<App />);
expect(screen.getByText(/Jake Runyan Photography/i)).toBeInTheDocument();
// Use getAllByText since the title also appears in the homepage hero
const matches = screen.getAllByText(/Jake Runyan Photography/i);
expect(matches.length).toBeGreaterThan(0);
});
test('renders navigation links', () => {
render(<App />);
expect(screen.getByRole('link', { name: /contact/i })).toBeInTheDocument();
expect(screen.getByRole('link', { name: /about/i })).toBeInTheDocument();
// Use getAllByRole to handle multiple matching links (navbar + footer)
const contactLinks = screen.getAllByRole('link', { name: /^contact$/i });
const aboutLinks = screen.getAllByRole('link', { name: /^about$/i });
expect(contactLinks.length).toBeGreaterThan(0);
expect(aboutLinks.length).toBeGreaterThan(0);
});

View File

@ -1,46 +0,0 @@
.about-container {
display: flex;
justify-content: center;
align-items: center;
width: 100%; /* Full width container */
height: 100vh; /* Full height of viewport */
background-color: #333;
}
.about-content {
width: 33%; /* 1/3 of the viewport width */
max-width: 800px; /* Limit maximum width */
padding: 20px;
background-color: #222;
border: 1px solid black; /* Light border for contrast */
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* Subtle shadow */
border-radius: 10px; /* Rounded corners */
text-align: center; /* Center align headers and image */
}
@media (max-width: 768px) {
.about-content {
width: 90%; /* Full width on smaller screens */
}
}
.about-image {
width: 100px;
height: 100px;
border-radius: 50%;
margin-bottom: 20px;
object-fit: cover;
}
.about-title {
font-size: 1.5rem;
margin-bottom: 10px;
color: whitesmoke;
}
.about-content p {
text-align: left;
color: #999;
line-height: 1.6;
margin-bottom: 15px;
}

View File

@ -1,34 +0,0 @@
import React from 'react';
import './About.css';
const About = () => {
return (
<div className="about-container">
<div className="about-content">
<img
src="https://gallery.whitney.rip/api/v1/t/287329d8835b299400819437c9c2a2d192041159/2tdm690t/fit_4096"
alt="Jake"
className="about-image"
/>
<h1 className="about-title">About Me</h1>
<p>
I'm Jake, a small time photographer out of the Bay Area. I started shooting as a kid on my dad's old
Canon EOS 60D, and now have graduated to owning my own gear. Having an artistic outlet has always been
a force of balance for me, and with a background in video and photo editing, this has been a fun one.
</p>
<p>
My current setup is a Sony Alpha 6300 with a 27mm pancake lens. This budget setup was perfect for bringing
my camera along on bike rides, as cycing is another hobby. You can find me on Youtube as Jake's West Coast.
My current photography interests include capturing the beauty of the Bay Area and California coast on
our bike rides, as well as moments in my everyday life.
</p>
<p>
If you'd like to learn more about Jake, the person, you can find more at my instagram @runyanjake or on my
personal website jake.runyan.dev.
</p>
</div>
</div>
);
};
export default About;

View File

@ -1,17 +0,0 @@
.contact {
background-color: #333;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.contact h1 {
color:white;
font-weight: bold;
}
.contact p {
color:white;
}

View File

@ -1,16 +0,0 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import './Contact.css';
const Contact = () => {
return (
<div className="contact">
<Helmet><title>Contact</title></Helmet>
<h1>Contact Me</h1>
<p>Email: jake@runyan.dev</p>
<p>Instagram: @jakerunyanphotography</p>
</div>
);
};
export default Contact;

View File

@ -2,8 +2,8 @@
display: flex;
justify-content: space-evenly;
align-items: center;
background-color: #0b0b0b;
color: white;
background-color: var(--color-bg-nav);
color: var(--color-text-nav);
padding: 10px 20px;
}
@ -14,7 +14,7 @@
}
.footer-links a {
color: gray;
color: var(--color-text-footer);
text-decoration: none;
margin: 5px 0;
user-select: none;

View File

@ -1,21 +1,25 @@
import React from 'react';
import { Link } from 'react-router-dom';
import { useSiteConfig } from '../framework/ContentProvider';
import './Footer.css';
const Footer = () => {
const { footerCopyright, nav, social } = useSiteConfig();
return (
<footer className="footer">
<div className="footer-links left">
<a href="https://github.com/runyanjake/jakesphotos" rel="noopener noreferrer">GitHub</a>
<a href="https://www.instagram.com/jakerunyanphotography" rel="noopener noreferrer">Instagram</a>
{social.map(({ label, url }) => (
<a key={url} href={url} rel="noopener noreferrer">{label}</a>
))}
</div>
<div className="footer-title">
<p>&copy; {new Date().getFullYear()} Jake Runyan</p>
<p>&copy; {new Date().getFullYear()} {footerCopyright}</p>
</div>
<div className="footer-links right">
<Link to="/">Home</Link>
<Link to="/contact">Contact</Link>
<Link to="/about">About</Link>
{nav.map(({ label, path }) => (
<Link key={path} to={path}>{label}</Link>
))}
</div>
</footer>
);

View File

@ -0,0 +1,23 @@
.markdown-body {
color: var(--color-text-muted);
font-family: var(--font-body);
font-size: var(--font-size-base);
line-height: var(--line-height-body);
text-align: left;
}
.markdown-body p {
margin-bottom: 15px;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3 {
color: var(--color-text);
font-family: var(--font-heading);
margin-bottom: var(--space-sm);
}
.markdown-body a {
color: var(--color-accent);
}

View File

@ -0,0 +1,11 @@
import React from 'react';
import ReactMarkdown from 'react-markdown';
import './MarkdownRenderer.css';
const MarkdownRenderer = ({ content }) => (
<div className="markdown-body">
<ReactMarkdown>{content}</ReactMarkdown>
</div>
);
export default MarkdownRenderer;

View File

@ -2,7 +2,7 @@
display: flex;
justify-content: space-between;
align-items: center;
background-color: #0b0b0b;
background-color: var(--color-bg-nav);
padding: 10px 20px;
gap: 10px;
}
@ -15,7 +15,7 @@
.navbar-logo .logo {
height: 50px;
border-radius: 10px;
border-radius: var(--radius-lg);
}
.navbar-links {
@ -25,10 +25,11 @@
}
.navbar-links a {
color: white;
color: var(--color-text-nav);
text-decoration: none;
font-family: 'Arial', sans-serif;
font-size: 16px;
font-family: var(--font-heading);
font-size: var(--font-size-base);
transition: text-decoration var(--transition-fast);
}
.navbar-links a:hover {
@ -36,8 +37,8 @@
}
.navbar-title h1 {
color: white;
font-family: 'Arial', sans-serif;
color: var(--color-text-nav);
font-family: var(--font-heading);
font-size: 24px;
margin: 0;
}
@ -51,7 +52,7 @@
.navbar-icons .icon {
height: 30px;
width: 30px;
transition: transform 0.2s;
transition: transform var(--transition-fast);
}
.navbar-icons .icon:hover {

View File

@ -1,5 +1,6 @@
import React, { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { useSiteConfig } from '../framework/ContentProvider';
import './Navbar.css';
import logo from './static/navbar-logo.png';
import github_dark from './static/github-dark.png';
@ -7,9 +8,15 @@ import github_light from './static/github-light.png';
import instagram_dark from './static/instagram-dark.png';
import instagram_light from './static/instagram-light.png';
const ICON_MAP = {
github: { dark: github_light, light: github_dark },
instagram: { dark: instagram_light, light: instagram_dark },
};
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
const Navbar = () => {
const { siteTitle, nav, social } = useSiteConfig();
const [isDarkMode, setIsDarkMode] = useState(darkModeQuery.matches);
useEffect(() => {
@ -18,9 +25,6 @@ const Navbar = () => {
return () => darkModeQuery.removeEventListener('change', handler);
}, []);
const githubIcon = isDarkMode ? github_light : github_dark;
const instagramIcon = isDarkMode ? instagram_light : instagram_dark;
return (
<nav className="navbar">
<div className="navbar-logo">
@ -28,20 +32,24 @@ const Navbar = () => {
<img src={logo} alt="Logo" className="logo" />
</Link>
<div className="navbar-links">
<Link to="/contact">Contact</Link>
<Link to="/about">About</Link>
{nav.map(({ label, path }) => (
<Link key={path} to={path}>{label}</Link>
))}
</div>
</div>
<div className="navbar-title">
<h1>Jake Runyan Photography</h1>
<h1>{siteTitle}</h1>
</div>
<div className="navbar-icons">
<a href="https://www.instagram.com/jakerunyanphotography" target="_blank" rel="noopener noreferrer">
<img src={instagramIcon} alt="Instagram" className="icon" title="My Instagram" />
</a>
<a href="https://github.com/runyanjake/jakesphotos" target="_blank" rel="noopener noreferrer">
<img src={githubIcon} alt="GitHub" className="icon" title="This Website's Source Code!" />
{social.map(({ label, url, icon }) => {
const icons = ICON_MAP[icon];
const src = icons ? (isDarkMode ? icons.dark : icons.light) : null;
return (
<a key={icon} href={url} target="_blank" rel="noopener noreferrer">
{src && <img src={src} alt={label} className="icon" title={label} />}
</a>
);
})}
</div>
</nav>
);

View File

@ -1,84 +0,0 @@
/* Images are loaded from urls to avoid checking everything in to git. */
const images = [
"https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1114e4b3-99a7-4cdc-9ce2-ad52d1a0046f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1ce61b59-98a7-401c-9840-72dc51822494/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2250e289-03ae-4ee4-a63a-3ba29db99dd0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec93e5f8-ca2e-4078-8190-d884435513eb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/40cb4952-0b8a-4500-a692-a20acbe01ff4/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fe3919e-00d4-4afc-8140-a81dbf266c82/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3a89717a-b0b9-42a6-ab34-0f4dc3d90987/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8beaf017-029f-4827-a3c2-066f9453e271/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/87cd7f35-f4c5-4a1e-a56d-c6d8e9d082da/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2c55949d-7a2d-4bde-a87e-107ce352bc60/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/44f3ce06-3b34-42d2-9396-424ff95ba672/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d88e4a71-d645-48de-9b22-aad8f1ae3bde/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d84b166b-56fc-48cb-b932-7847d70ade04/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/01d40f57-dbf6-4c9d-8fc1-0ac22dfe17e5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e7055bf2-626a-47a5-9526-15b2de26249e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7635d87d-5ed6-4342-9cc2-0c6d0e0a1425/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0beaaf50-cb2c-4d84-b099-e1af24f7d2e3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/90052323-c4df-4820-8fe8-7658424991b8/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4749cdd5-aa5a-4911-9567-f3f5afca6ecc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1a8dd56a-3433-40ab-8619-f385560ee807/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe1b66b4-4f98-43a3-bb26-6d4661d5ffe2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/787274d8-d94b-479c-9a11-b60f3ca3e640/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/91d11918-7471-4e81-b101-23511e14f45d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bfa43b2b-4aa1-4792-ab2f-aff1e226cdf0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30273029-cba9-45a6-aa7c-3af27d0bd835/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f7bfc5b1-6ef6-42ce-b4a2-237939b03ae9/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e29ce2a5-987c-4453-81f2-b2e7b161e7d2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3082f0af-fb30-4e04-baae-5b47d310e380/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/15dd24ba-e2ae-4093-a098-988aac86e1e0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fc6c3d20-2521-4d31-9f31-19476ad30a65/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8a750cc3-7bef-4bc6-9727-83151dead578/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4db2ea6d-8998-40df-bf05-fc27beeb2085/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec92f32f-0c08-4317-b8e2-90c53c2e6416/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7d5803ea-20b9-448f-9659-6fb801f15c68/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dfb53a18-05dc-4cbc-bdd2-7f8b6f5a4e8e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e6934d1a-543c-4ed8-9c29-a94e915f9d94/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0e88d871-fc8e-4ac3-a96a-920fce3cc546/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/379a3b92-ff9b-4455-afe7-c2c6a8a270cd/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d759c78-64c8-4607-9b61-7d1f536fe98f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0ff98add-0a3c-408b-af91-6320df62910f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ce5eba3e-c444-4a20-a88a-92bfe56c6891/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/a837364d-ed8a-44cf-a8db-8db320bf81e6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8e254f41-7b14-48b3-ba98-a96fb9c05129/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1f877a0c-8e36-4751-b50a-5ea12c73aefc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1979efcd-ba01-4194-b0f7-8e64a996c1cc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4fcf415-7eb1-4131-8ef8-b0456aa31c62/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4e440673-7294-48ac-99a4-05cc3fb07cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/62baec73-487d-4a72-bdc4-7c168cf6f82a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/88cd4904-2ab1-4c60-b225-58d73945d724/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dd59bec7-d922-4a53-af12-3f252c109d0d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d33762bc-1204-4f33-8e6f-2ea5bde72f1a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe4c9bf0-334b-40fb-9a44-8b1984e2818a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/993736e1-a3ae-4ec5-8c67-c25c4c734f23/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/038e8d18-87cd-49f4-8e53-4c36a5f76cfb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/994408ea-6f04-473f-84ea-de3c77265298/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddaf8248-7cdf-4e39-9639-d2826dc9d038/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/214921e1-7b75-4059-ad53-1c1062f6df45/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/72d0e30d-c27c-4d8e-8977-0ae438178324/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d496de3c-bf3a-4b49-a34a-96c998c288a0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fd4b8886-7a55-478e-8bc8-6cba70fe9cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30b56b85-3225-44df-903d-5ba14e07927c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/185d198a-a2d3-40f1-b508-11d03edf8162/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/92063a5c-0c50-46c1-9bb3-8c294305b5a7/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fb5267d-7b71-4612-ad9c-4be961704a67/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d0fbaa8-90c2-4a46-9b32-d463fac24ba1/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bb8cf2fc-a745-4ff9-87a3-51a5407de9a3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/abefba8f-c77e-46e7-9f62-9a3da5ec8128/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d9fc53c6-4645-4451-91d5-94927ff638ea/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddf6d29e-81f4-4c3b-8277-450a88b0d75f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/b66557e8-aa4a-4f0b-b252-ee0ece28b0b5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8f6df2db-6a63-446b-9c00-5830ff91ea5c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/00d4ad2e-d549-45ac-9a7c-d9f97cc2a0ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/97e8aa93-39fb-42d9-b1e0-0536eb81e4ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0eef2205-2260-4307-80fa-520aeb139558/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0fe37f58-c2c6-4007-ae6d-0230ab4a7507/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
];
export default images;

View File

@ -0,0 +1,16 @@
import React, { createContext, useContext } from 'react';
import { siteConfig, pages } from '../generated/content';
const SiteConfigContext = createContext(siteConfig);
const PagesContext = createContext(pages);
export const ContentProvider = ({ children }) => (
<SiteConfigContext.Provider value={siteConfig}>
<PagesContext.Provider value={pages}>
{children}
</PagesContext.Provider>
</SiteConfigContext.Provider>
);
export const useSiteConfig = () => useContext(SiteConfigContext);
export const usePages = () => useContext(PagesContext);

View File

@ -0,0 +1,19 @@
import GalleryTemplate from '../templates/GalleryTemplate';
import DefaultTemplate from '../templates/DefaultTemplate';
import ContactTemplate from '../templates/ContactTemplate';
import HomepageTemplate from '../templates/HomepageTemplate';
import MenuTemplate from '../templates/MenuTemplate';
const registry = {
gallery: GalleryTemplate,
default: DefaultTemplate,
contact: ContactTemplate,
homepage: HomepageTemplate,
menu: MenuTemplate,
};
export const getTemplate = (name) => registry[name] || registry['default'];
export const registerTemplate = (name, Component) => {
registry[name] = Component;
};

267
src/generated/content.js Normal file
View File

@ -0,0 +1,267 @@
// AUTO-GENERATED by scripts/build-content.js — do not edit by hand.
export const siteConfig = {
"siteTitle": "Jake Runyan Photography",
"footerCopyright": "Jake Runyan",
"nav": [
{
"label": "Gallery",
"path": "/gallery"
},
{
"label": "Contact",
"path": "/contact"
},
{
"label": "About",
"path": "/about"
}
],
"social": [
{
"label": "Instagram",
"url": "https://www.instagram.com/jakerunyanphotography",
"icon": "instagram"
},
{
"label": "GitHub",
"url": "https://github.com/runyanjake/jakesphotos",
"icon": "github"
}
]
};
export const pages = {
"/": {
"frontmatter": {
"template": "homepage",
"title": "Jake Runyan Photography",
"subtitle": "Bay Area · Cycling · Life"
},
"content": "## Bay Area Life\n![](https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)\nI'm Jake, a small-time photographer out of the Bay Area. I shoot the world around me — the coastlines, the hills, the everyday scenes that make this place feel like home.\n\n## On Two Wheels\n![](https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)\nMy Sony Alpha 6300 comes along on every ride. There's something about cycling that puts you right in the middle of a scene — no glass between you and the world.\n\n## Everyday Moments\n![](https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)\nBeyond landscapes, it's the small details that catch my eye — textures, light, the quiet moments between everything else.",
"images": [
"https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1114e4b3-99a7-4cdc-9ce2-ad52d1a0046f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1ce61b59-98a7-401c-9840-72dc51822494/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2250e289-03ae-4ee4-a63a-3ba29db99dd0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec93e5f8-ca2e-4078-8190-d884435513eb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/40cb4952-0b8a-4500-a692-a20acbe01ff4/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fe3919e-00d4-4afc-8140-a81dbf266c82/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3a89717a-b0b9-42a6-ab34-0f4dc3d90987/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8beaf017-029f-4827-a3c2-066f9453e271/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/87cd7f35-f4c5-4a1e-a56d-c6d8e9d082da/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2c55949d-7a2d-4bde-a87e-107ce352bc60/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/44f3ce06-3b34-42d2-9396-424ff95ba672/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d88e4a71-d645-48de-9b22-aad8f1ae3bde/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d84b166b-56fc-48cb-b932-7847d70ade04/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/01d40f57-dbf6-4c9d-8fc1-0ac22dfe17e5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e7055bf2-626a-47a5-9526-15b2de26249e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7635d87d-5ed6-4342-9cc2-0c6d0e0a1425/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0beaaf50-cb2c-4d84-b099-e1af24f7d2e3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/90052323-c4df-4820-8fe8-7658424991b8/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4749cdd5-aa5a-4911-9567-f3f5afca6ecc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1a8dd56a-3433-40ab-8619-f385560ee807/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe1b66b4-4f98-43a3-bb26-6d4661d5ffe2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/787274d8-d94b-479c-9a11-b60f3ca3e640/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/91d11918-7471-4e81-b101-23511e14f45d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bfa43b2b-4aa1-4792-ab2f-aff1e226cdf0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30273029-cba9-45a6-aa7c-3af27d0bd835/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f7bfc5b1-6ef6-42ce-b4a2-237939b03ae9/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e29ce2a5-987c-4453-81f2-b2e7b161e7d2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3082f0af-fb30-4e04-baae-5b47d310e380/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/15dd24ba-e2ae-4093-a098-988aac86e1e0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fc6c3d20-2521-4d31-9f31-19476ad30a65/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8a750cc3-7bef-4bc6-9727-83151dead578/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4db2ea6d-8998-40df-bf05-fc27beeb2085/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec92f32f-0c08-4317-b8e2-90c53c2e6416/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7d5803ea-20b9-448f-9659-6fb801f15c68/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dfb53a18-05dc-4cbc-bdd2-7f8b6f5a4e8e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e6934d1a-543c-4ed8-9c29-a94e915f9d94/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0e88d871-fc8e-4ac3-a96a-920fce3cc546/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/379a3b92-ff9b-4455-afe7-c2c6a8a270cd/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d759c78-64c8-4607-9b61-7d1f536fe98f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0ff98add-0a3c-408b-af91-6320df62910f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ce5eba3e-c444-4a20-a88a-92bfe56c6891/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/a837364d-ed8a-44cf-a8db-8db320bf81e6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8e254f41-7b14-48b3-ba98-a96fb9c05129/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1f877a0c-8e36-4751-b50a-5ea12c73aefc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1979efcd-ba01-4194-b0f7-8e64a996c1cc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4fcf415-7eb1-4131-8ef8-b0456aa31c62/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4e440673-7294-48ac-99a4-05cc3fb07cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/62baec73-487d-4a72-bdc4-7c168cf6f82a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/88cd4904-2ab1-4c60-b225-58d73945d724/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dd59bec7-d922-4a53-af12-3f252c109d0d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d33762bc-1204-4f33-8e6f-2ea5bde72f1a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe4c9bf0-334b-40fb-9a44-8b1984e2818a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/993736e1-a3ae-4ec5-8c67-c25c4c734f23/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/038e8d18-87cd-49f4-8e53-4c36a5f76cfb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/994408ea-6f04-473f-84ea-de3c77265298/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddaf8248-7cdf-4e39-9639-d2826dc9d038/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/214921e1-7b75-4059-ad53-1c1062f6df45/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/72d0e30d-c27c-4d8e-8977-0ae438178324/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d496de3c-bf3a-4b49-a34a-96c998c288a0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fd4b8886-7a55-478e-8bc8-6cba70fe9cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30b56b85-3225-44df-903d-5ba14e07927c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/185d198a-a2d3-40f1-b508-11d03edf8162/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/92063a5c-0c50-46c1-9bb3-8c294305b5a7/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fb5267d-7b71-4612-ad9c-4be961704a67/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d0fbaa8-90c2-4a46-9b32-d463fac24ba1/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bb8cf2fc-a745-4ff9-87a3-51a5407de9a3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/abefba8f-c77e-46e7-9f62-9a3da5ec8128/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d9fc53c6-4645-4451-91d5-94927ff638ea/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddf6d29e-81f4-4c3b-8277-450a88b0d75f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/b66557e8-aa4a-4f0b-b252-ee0ece28b0b5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8f6df2db-6a63-446b-9c00-5830ff91ea5c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/00d4ad2e-d549-45ac-9a7c-d9f97cc2a0ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/97e8aa93-39fb-42d9-b1e0-0536eb81e4ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0eef2205-2260-4307-80fa-520aeb139558/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0fe37f58-c2c6-4007-ae6d-0230ab4a7507/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]
},
"/about": {
"frontmatter": {
"template": "default",
"title": "About Me",
"profileImage": "https://gallery.whitney.rip/api/v1/t/287329d8835b299400819437c9c2a2d192041159/2tdm690t/fit_4096"
},
"content": "I'm Jake, a small time photographer out of the Bay Area. I started shooting as a kid on my dad's old Canon EOS 60D, and now have graduated to owning my own gear. Having an artistic outlet has always been a force of balance for me, and with a background in video and photo editing, this has been a fun one.\n\nMy current setup is a Sony Alpha 6300 with a 27mm pancake lens. This budget setup was perfect for bringing my camera along on bike rides, as cycling is another hobby. You can find me on Youtube as Jake's West Coast. My current photography interests include capturing the beauty of the Bay Area and California coast on our bike rides, as well as moments in my everyday life.\n\nIf you'd like to learn more about Jake, the person, you can find more at my instagram @runyanjake or on my personal website jake.runyan.dev.",
"images": []
},
"/contact": {
"frontmatter": {
"template": "contact",
"title": "Contact Me",
"email": "jake@runyan.dev",
"instagram": "jakerunyanphotography"
},
"content": "",
"images": []
},
"/gallery": {
"frontmatter": {
"template": "menu",
"title": "Gallery",
"description": "Browse my photo collections"
},
"content": "## [Landscapes](/gallery/landscapes)\n![](https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)\nMountains, coastal cliffs, and open skies across California and the Bay Area.\n\n## [Portraits](/gallery/portraits)\n![](https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)\nCandid moments and faces from everyday life.\n\n## [Textures](/gallery/textures)\n![](https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)\nAbstract surfaces and patterns found in the world around us.\n\n## [Nature](/gallery/nature)\n![](https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D)\nFlora, fauna, and natural forms.",
"images": []
},
"/gallery/landscapes": {
"frontmatter": {
"template": "gallery",
"title": "Landscapes"
},
"content": "",
"images": [
"https://images.whitney.rip/api/assets/d14fcd1e-5479-4312-ae39-055283c8fd75/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1114e4b3-99a7-4cdc-9ce2-ad52d1a0046f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1ce61b59-98a7-401c-9840-72dc51822494/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2250e289-03ae-4ee4-a63a-3ba29db99dd0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec93e5f8-ca2e-4078-8190-d884435513eb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/40cb4952-0b8a-4500-a692-a20acbe01ff4/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fe3919e-00d4-4afc-8140-a81dbf266c82/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3a89717a-b0b9-42a6-ab34-0f4dc3d90987/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8beaf017-029f-4827-a3c2-066f9453e271/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/87cd7f35-f4c5-4a1e-a56d-c6d8e9d082da/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2c55949d-7a2d-4bde-a87e-107ce352bc60/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/44f3ce06-3b34-42d2-9396-424ff95ba672/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d88e4a71-d645-48de-9b22-aad8f1ae3bde/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d84b166b-56fc-48cb-b932-7847d70ade04/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/01d40f57-dbf6-4c9d-8fc1-0ac22dfe17e5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e7055bf2-626a-47a5-9526-15b2de26249e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7635d87d-5ed6-4342-9cc2-0c6d0e0a1425/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0beaaf50-cb2c-4d84-b099-e1af24f7d2e3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/90052323-c4df-4820-8fe8-7658424991b8/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4749cdd5-aa5a-4911-9567-f3f5afca6ecc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]
},
"/gallery/nature": {
"frontmatter": {
"template": "gallery",
"title": "Nature"
},
"content": "",
"images": [
"https://images.whitney.rip/api/assets/18e59afb-8d23-433d-9f91-fb78d6efc729/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/72d0e30d-c27c-4d8e-8977-0ae438178324/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d496de3c-bf3a-4b49-a34a-96c998c288a0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fd4b8886-7a55-478e-8bc8-6cba70fe9cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30b56b85-3225-44df-903d-5ba14e07927c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/185d198a-a2d3-40f1-b508-11d03edf8162/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/92063a5c-0c50-46c1-9bb3-8c294305b5a7/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/2fb5267d-7b71-4612-ad9c-4be961704a67/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d0fbaa8-90c2-4a46-9b32-d463fac24ba1/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bb8cf2fc-a745-4ff9-87a3-51a5407de9a3/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/abefba8f-c77e-46e7-9f62-9a3da5ec8128/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d9fc53c6-4645-4451-91d5-94927ff638ea/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddf6d29e-81f4-4c3b-8277-450a88b0d75f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/b66557e8-aa4a-4f0b-b252-ee0ece28b0b5/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8f6df2db-6a63-446b-9c00-5830ff91ea5c/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/00d4ad2e-d549-45ac-9a7c-d9f97cc2a0ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/97e8aa93-39fb-42d9-b1e0-0536eb81e4ba/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0eef2205-2260-4307-80fa-520aeb139558/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0fe37f58-c2c6-4007-ae6d-0230ab4a7507/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]
},
"/gallery/portraits": {
"frontmatter": {
"template": "gallery",
"title": "Portraits"
},
"content": "",
"images": [
"https://images.whitney.rip/api/assets/f4c18690-b0fe-4ed1-a1d7-ea49b8828aa6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1a8dd56a-3433-40ab-8619-f385560ee807/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe1b66b4-4f98-43a3-bb26-6d4661d5ffe2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/787274d8-d94b-479c-9a11-b60f3ca3e640/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/91d11918-7471-4e81-b101-23511e14f45d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/bfa43b2b-4aa1-4792-ab2f-aff1e226cdf0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/30273029-cba9-45a6-aa7c-3af27d0bd835/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f7bfc5b1-6ef6-42ce-b4a2-237939b03ae9/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e29ce2a5-987c-4453-81f2-b2e7b161e7d2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/3082f0af-fb30-4e04-baae-5b47d310e380/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/15dd24ba-e2ae-4093-a098-988aac86e1e0/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fc6c3d20-2521-4d31-9f31-19476ad30a65/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8a750cc3-7bef-4bc6-9727-83151dead578/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4db2ea6d-8998-40df-bf05-fc27beeb2085/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ec92f32f-0c08-4317-b8e2-90c53c2e6416/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/7d5803ea-20b9-448f-9659-6fb801f15c68/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dfb53a18-05dc-4cbc-bdd2-7f8b6f5a4e8e/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/e6934d1a-543c-4ed8-9c29-a94e915f9d94/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0e88d871-fc8e-4ac3-a96a-920fce3cc546/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/379a3b92-ff9b-4455-afe7-c2c6a8a270cd/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]
},
"/gallery/textures": {
"frontmatter": {
"template": "gallery",
"title": "Textures"
},
"content": "",
"images": [
"https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4d759c78-64c8-4607-9b61-7d1f536fe98f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/0ff98add-0a3c-408b-af91-6320df62910f/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ce5eba3e-c444-4a20-a88a-92bfe56c6891/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/a837364d-ed8a-44cf-a8db-8db320bf81e6/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/8e254f41-7b14-48b3-ba98-a96fb9c05129/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1f877a0c-8e36-4751-b50a-5ea12c73aefc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/1979efcd-ba01-4194-b0f7-8e64a996c1cc/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/f4fcf415-7eb1-4131-8ef8-b0456aa31c62/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/4e440673-7294-48ac-99a4-05cc3fb07cd2/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/62baec73-487d-4a72-bdc4-7c168cf6f82a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/88cd4904-2ab1-4c60-b225-58d73945d724/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/dd59bec7-d922-4a53-af12-3f252c109d0d/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/d33762bc-1204-4f33-8e6f-2ea5bde72f1a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/fe4c9bf0-334b-40fb-9a44-8b1984e2818a/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/993736e1-a3ae-4ec5-8c67-c25c4c734f23/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/038e8d18-87cd-49f4-8e53-4c36a5f76cfb/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/994408ea-6f04-473f-84ea-de3c77265298/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/ddaf8248-7cdf-4e39-9639-d2826dc9d038/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D",
"https://images.whitney.rip/api/assets/214921e1-7b75-4059-ad53-1c1062f6df45/thumbnail?size=preview&key=3bkhzXZq8wkOQRjr58hDYLhenYNOyIDDCoq0tJ0G1nYOnJg04e-PLvFj9zJHEYV3ni8&c=iSbUaYtTBiWbtzPKIazyFcbZYFQ%3D"
]
}
};

View File

@ -1,5 +1,6 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import './theme/theme.css';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

5
src/plugins/index.js Normal file
View File

@ -0,0 +1,5 @@
// Register custom templates here using registerTemplate from the framework.
// Example:
// import { registerTemplate } from '../framework/TemplateRegistry';
// import MyCustomTemplate from './MyCustomTemplate';
// registerTemplate('custom', MyCustomTemplate);

View File

@ -3,3 +3,26 @@
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';
// react-router v7 requires TextEncoder/TextDecoder; polyfill for jsdom
const { TextEncoder, TextDecoder } = require('util');
if (typeof globalThis.TextEncoder === 'undefined') globalThis.TextEncoder = TextEncoder;
if (typeof globalThis.TextDecoder === 'undefined') globalThis.TextDecoder = TextDecoder;
// window.matchMedia is not implemented in jsdom
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation(query => ({
matches: false,
media: query,
onchange: null,
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
})),
});
// react-markdown v9 is ESM-only; mock it for jsdom tests
jest.mock('react-markdown', () => {
const React = require('react');
return ({ children }) => React.createElement('div', null, children);
});

View File

@ -0,0 +1,44 @@
.contact-container {
background-color: var(--color-bg);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
}
.contact-content {
width: 33%;
max-width: var(--content-max-width);
padding: var(--content-padding);
background-color: var(--color-bg-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
text-align: center;
}
@media (max-width: 768px) {
.contact-content {
width: 90%;
}
}
.contact-title {
color: var(--color-text);
font-family: var(--font-heading);
font-weight: bold;
margin-bottom: var(--space-md);
}
.contact-item {
color: var(--color-text);
}
.contact-item a {
color: var(--color-text);
text-decoration: none;
}
.contact-item a:hover {
text-decoration: underline;
}

View File

@ -0,0 +1,33 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import MarkdownRenderer from '../components/MarkdownRenderer';
import './ContactTemplate.css';
const ContactTemplate = ({ page }) => {
const { title, email, instagram } = page.frontmatter;
return (
<div className="contact-container">
<Helmet><title>{title}</title></Helmet>
<div className="contact-content">
<h1 className="contact-title">{title}</h1>
{email && (
<p className="contact-item">
Email: <a href={`mailto:${email}`}>{email}</a>
</p>
)}
{instagram && (
<p className="contact-item">
Instagram: <a
href={`https://www.instagram.com/${instagram}`}
target="_blank"
rel="noopener noreferrer"
>@{instagram}</a>
</p>
)}
{page.content && <MarkdownRenderer content={page.content} />}
</div>
</div>
);
};
export default ContactTemplate;

View File

@ -0,0 +1,40 @@
.default-container {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
min-height: 100vh;
background-color: var(--color-bg);
}
.default-content {
width: 33%;
max-width: var(--content-max-width);
padding: var(--content-padding);
background-color: var(--color-bg-surface);
border: 1px solid var(--color-border);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
border-radius: var(--radius-lg);
text-align: center;
}
@media (max-width: 768px) {
.default-content {
width: 90%;
}
}
.default-profile-image {
width: 100px;
height: 100px;
border-radius: 50%;
margin-bottom: var(--space-lg);
object-fit: cover;
}
.default-title {
font-size: 1.5rem;
margin-bottom: var(--space-sm);
color: var(--color-text);
font-family: var(--font-heading);
}

View File

@ -0,0 +1,22 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import MarkdownRenderer from '../components/MarkdownRenderer';
import './DefaultTemplate.css';
const DefaultTemplate = ({ page }) => {
const { title, profileImage } = page.frontmatter;
return (
<div className="default-container">
<Helmet><title>{title}</title></Helmet>
<div className="default-content">
{profileImage && (
<img src={profileImage} alt={title} className="default-profile-image" />
)}
<h1 className="default-title">{title}</h1>
<MarkdownRenderer content={page.content} />
</div>
</div>
);
};
export default DefaultTemplate;

View File

@ -2,7 +2,7 @@
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
margin: 0 auto;
background-color: #333;
background-color: var(--color-bg);
}
.gallery-photo {
@ -14,9 +14,8 @@
object-fit: cover;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.gallery-photo {
width: calc(100% - 10px); /* Single column on smaller screens */
width: calc(100% - 10px);
}
}

View File

@ -1,9 +1,8 @@
import React, { useEffect, useMemo, useRef, useState } from 'react';
import Masonry from 'masonry-layout';
import images from '../data/Images';
import { Helmet } from 'react-helmet';
import './Home.css';
import Lightbox from './Lightbox';
import Lightbox from '../components/Lightbox';
import './GalleryTemplate.css';
const shuffleArray = (array) => {
for (let i = array.length - 1; i > 0; i--) {
@ -13,12 +12,11 @@ const shuffleArray = (array) => {
return array;
};
const Home = () => {
const GalleryTemplate = ({ page }) => {
const masonryRef = useRef(null);
const [focusedImage, setFocusedImage] = useState(null);
// Compute once on mount; avoids a re-shuffle on every render
const shuffledImages = useMemo(() => shuffleArray([...images]), []);
const shuffledImages = useMemo(() => shuffleArray([...page.images]), [page.images]);
useEffect(() => {
const masonry = new Masonry(masonryRef.current, {
@ -28,7 +26,6 @@ const Home = () => {
});
const relayout = () => masonry.layout();
const imgElements = masonryRef.current.querySelectorAll('img');
imgElements.forEach(img => img.addEventListener('load', relayout));
@ -40,10 +37,17 @@ const Home = () => {
return (
<>
<Helmet><title>{page.frontmatter.title}</title></Helmet>
<div className="gallery" ref={masonryRef}>
<Helmet><title>Jake Runyan Photography</title></Helmet>
{shuffledImages.map((image) => (
<img key={image} src={image} alt="© Jake Runyan" className="gallery-photo" style={{ cursor: 'pointer' }} onClick={() => setFocusedImage(image)} />
<img
key={image}
src={image}
alt="© Jake Runyan"
className="gallery-photo"
style={{ cursor: 'pointer' }}
onClick={() => setFocusedImage(image)}
/>
))}
</div>
{focusedImage && <Lightbox src={focusedImage} onClose={() => setFocusedImage(null)} />}
@ -51,4 +55,4 @@ const Home = () => {
);
};
export default Home;
export default GalleryTemplate;

View File

@ -0,0 +1,91 @@
.homepage {
background-color: var(--color-bg);
min-height: 100vh;
}
.homepage-hero {
text-align: center;
padding: 80px 20px 60px;
}
.homepage-hero-title {
font-size: 3rem;
font-weight: 300;
letter-spacing: 0.05em;
color: var(--color-text);
margin: 0 0 var(--space-md) 0;
}
.homepage-hero-subtitle {
text-transform: uppercase;
color: var(--color-text-muted);
letter-spacing: 0.15em;
font-size: 0.9rem;
margin: 0;
}
.homepage-sections {
max-width: 1100px;
margin: 0 auto;
padding: 0 var(--content-padding) 60px;
}
.homepage-section {
display: flex;
gap: var(--space-xl);
background-color: var(--color-bg-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
padding: var(--space-xl);
margin-bottom: 60px;
align-items: center;
}
.homepage-section.image-right {
flex-direction: row-reverse;
}
.homepage-section-image {
flex: 0 0 45%;
}
.homepage-section-image img {
width: 100%;
height: 300px;
object-fit: cover;
border-radius: var(--radius-sm);
display: block;
}
.homepage-section-text {
flex: 1;
}
.homepage-section-text h2 {
font-size: 1.6rem;
font-weight: 400;
color: var(--color-text);
margin: 0 0 var(--space-md) 0;
}
.homepage-section-text p {
color: var(--color-text-muted);
line-height: var(--line-height-body);
margin: 0 0 var(--space-sm) 0;
}
@media (max-width: 700px) {
.homepage-hero-title {
font-size: 2rem;
}
.homepage-section,
.homepage-section.image-right {
flex-direction: column;
}
.homepage-section-image {
flex: none;
width: 100%;
}
}

View File

@ -0,0 +1,64 @@
import React from 'react';
import './HomepageTemplate.css';
function parseSections(content) {
const parts = content.split(/^## /m);
return parts
.filter(part => part.trim())
.map(part => {
const lines = part.split('\n');
const heading = lines[0].trim();
const rest = lines.slice(1);
let imageUrl = null;
const textLines = [];
for (const line of rest) {
const imgMatch = line.match(/!\[.*?\]\((.*?)\)/);
if (imgMatch && !imageUrl) {
imageUrl = imgMatch[1];
} else if (line.trim()) {
textLines.push(line.trim());
}
}
return { heading, imageUrl, textLines };
});
}
export default function HomepageTemplate({ page }) {
const { frontmatter, content } = page;
const sections = parseSections(content);
return (
<div className="homepage">
<div className="homepage-hero">
<h1 className="homepage-hero-title">{frontmatter.title}</h1>
{frontmatter.subtitle && (
<p className="homepage-hero-subtitle">{frontmatter.subtitle}</p>
)}
</div>
<div className="homepage-sections">
{sections.map((section, i) => (
<div
key={i}
className={`homepage-section ${i % 2 === 0 ? 'image-left' : 'image-right'}`}
>
{section.imageUrl && (
<div className="homepage-section-image">
<img src={section.imageUrl} alt={section.heading} />
</div>
)}
<div className="homepage-section-text">
<h2>{section.heading}</h2>
{section.textLines.map((line, j) => (
<p key={j}>{line}</p>
))}
</div>
</div>
))}
</div>
</div>
);
}

View File

@ -0,0 +1,68 @@
.menu-page {
background-color: var(--color-bg);
min-height: 100vh;
padding: 60px var(--content-padding) 60px;
}
.menu-header {
text-align: center;
margin-bottom: var(--space-xl);
}
.menu-header h1 {
font-size: 2.5rem;
font-weight: 300;
color: var(--color-text);
margin: 0 0 var(--space-md) 0;
}
.menu-description {
color: var(--color-text-muted);
font-size: 1rem;
margin: 0;
}
.menu-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
max-width: 900px;
margin: 0 auto;
gap: var(--space-lg);
}
.menu-card {
background-color: var(--color-bg-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
padding: var(--space-md);
text-decoration: none;
display: block;
transition: transform var(--transition-fast), border-color var(--transition-fast);
}
.menu-card:hover {
transform: translateY(-2px);
border-color: var(--color-accent);
}
.menu-card-image {
width: 100%;
height: 180px;
object-fit: cover;
border-radius: var(--radius-sm);
margin-bottom: var(--space-md);
display: block;
}
.menu-card-title {
color: var(--color-text);
font-size: 1.3rem;
font-weight: 400;
margin-bottom: var(--space-sm);
}
.menu-card-desc {
color: var(--color-text-muted);
font-size: 0.9rem;
line-height: var(--line-height-body);
}

View File

@ -0,0 +1,83 @@
import React from 'react';
import { Link } from 'react-router-dom';
import './MenuTemplate.css';
function parseMenuItems(content) {
const parts = content.split(/^## /m);
return parts
.filter(part => part.trim())
.map(part => {
const lines = part.split('\n');
const headingLine = lines[0].trim();
const rest = lines.slice(1);
// Extract label + path from [Label](path), fallback to plain text
const linkMatch = headingLine.match(/^\[(.+?)\]\((.+?)\)/);
const label = linkMatch ? linkMatch[1] : headingLine;
const path = linkMatch ? linkMatch[2] : null;
let imageUrl = null;
const descLines = [];
for (const line of rest) {
const imgMatch = line.match(/!\[.*?\]\((.*?)\)/);
if (imgMatch && !imageUrl) {
imageUrl = imgMatch[1];
} else if (line.trim()) {
descLines.push(line.trim());
}
}
return { label, path, imageUrl, desc: descLines.join(' ') };
});
}
export default function MenuTemplate({ page }) {
const { frontmatter, content } = page;
const items = parseMenuItems(content);
return (
<div className="menu-page">
<div className="menu-header">
<h1>{frontmatter.title}</h1>
{frontmatter.description && (
<p className="menu-description">{frontmatter.description}</p>
)}
</div>
<div className="menu-grid">
{items.map((item, i) => (
item.path ? (
<Link key={i} to={item.path} className="menu-card">
{item.imageUrl && (
<img
className="menu-card-image"
src={item.imageUrl}
alt={item.label}
/>
)}
<div className="menu-card-title">{item.label}</div>
{item.desc && (
<div className="menu-card-desc">{item.desc}</div>
)}
</Link>
) : (
<div key={i} className="menu-card">
{item.imageUrl && (
<img
className="menu-card-image"
src={item.imageUrl}
alt={item.label}
/>
)}
<div className="menu-card-title">{item.label}</div>
{item.desc && (
<div className="menu-card-desc">{item.desc}</div>
)}
</div>
)
))}
</div>
</div>
);
}

28
src/theme/theme.css Normal file
View File

@ -0,0 +1,28 @@
:root {
--color-bg: #333;
--color-bg-surface: #222;
--color-bg-nav: #0b0b0b;
--color-text: #f5f5f5;
--color-text-muted: #999;
--color-text-nav: #fff;
--color-text-footer: #808080;
--color-border: #000;
--color-accent: #fff;
--font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-heading: 'Arial', sans-serif;
--font-size-base: 16px;
--line-height-body: 1.6;
--nav-height: 70px;
--content-max-width: 800px;
--content-padding: 20px;
--space-xs: 4px;
--space-sm: 8px;
--space-md: 16px;
--space-lg: 24px;
--space-xl: 40px;
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 10px;
--transition-fast: 0.2s ease;
--transition-base: 0.3s ease;
}