<!doctype html>

<html lang="en">

<head>

<meta charset="utf-8" />

<meta name="viewport" content="width=device-width,initial-scale=1" />

<title>Unapologetic Struggle Art by Poverty Fueled Artistry</title>


<!-- Fonts -->

<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700;900&family=Space+Grotesk:wght@400;700&family=Cormorant+Garamond:wght@300;600&family=Syne:wght@700&display=swap" rel="stylesheet">


<style>

:root{

--bg:#0a0a0a; --panel:#f5f5f5;

--accent1:#ff6b6b; --accent2:#4ecdc4; --accent3:#ffe66d;

--muted:#2a2a2a; --gap:1.25rem; --row-h:6.5vw;

}

*{box-sizing:border-box;margin:0;padding:0}

html,body{height:100%}

body{

font-family:"Space Grotesk",system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial;

background:var(--bg); color:var(--panel);

-webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale;

overflow-x:hidden; line-height:1.45;

}

a{color:inherit;text-decoration:none}

img{max-width:100%;display:block}


/* HERO */

header.hero{

min-height:70vh; display:flex; align-items:center; justify-content:center;

position:relative; padding:3rem 1.25rem;

background: linear-gradient(135deg, #ffefef 0%, #fff9e6 40%, #eafffb 100%);

color:#0a0a0a; overflow:hidden;

}

header.hero::after{ content:""; position:absolute; inset:0;

background:

linear-gradient(135deg, rgba(10,10,10,0.02) 0 1px, transparent 1px 2px),

radial-gradient(800px 400px at 10% 20%, rgba(255,107,107,0.08), transparent 30%),

radial-gradient(600px 300px at 90% 80%, rgba(78,205,196,0.06), transparent 30%);

pointer-events:none;

}

.hero-inner{ z-index:2; text-align:center; max-width:1100px; width:100% }

h1.title{

font-family:"Playfair Display",serif; font-size:clamp(2.4rem,6.5vw,5.2rem);

letter-spacing:-0.02em; line-height:0.92; font-weight:900; margin-bottom:.4rem;

color:var(--muted); text-transform:uppercase;

text-shadow: 3px 3px 0 rgba(255,255,255,0.4);

}

p.lead{

font-family:"Cormorant Garamond",serif; font-weight:300;

font-size:clamp(1rem,2.2vw,1.25rem); color:var(--muted); margin-bottom:1rem;

}

.hero-badges{ margin-top:1rem; display:flex; gap:0.75rem; justify-content:center; flex-wrap:wrap }

.badge{

font-family:"Syne",sans-serif; background:var(--accent2); color:#071014;

padding:.6rem 1rem; border-radius:8px; font-weight:700; letter-spacing:.06em;

box-shadow:6px 6px 0 rgba(10,10,10,0.06); transition:transform .18s ease,box-shadow .18s ease;

}

.badge:hover{ transform:translateY(-4px); box-shadow:10px 10px 0 rgba(10,10,10,0.08) }


/* BIO */

section.bio{ background:var(--panel); color:var(--bg); padding:4rem 1.25rem; position:relative }

.bio-inner{ max-width:1000px; margin:0 auto; position:relative; z-index:2;

background:#fff; padding:2.25rem; box-shadow:18px 18px 0 var(--accent2); border-left:8px solid var(--accent1);

}

.bio-inner h2{ font-family:"Playfair Display",serif; color:var(--accent1); font-size:clamp(1.6rem,4vw,2.6rem); margin-bottom:1rem }

.bio-inner p{ color:var(--muted); font-size:1.02rem; margin-bottom:1rem }

section.bio::before{ content:""; position:absolute; left:0; top:0; height:100%; width:36%;

background:linear-gradient(180deg,var(--accent1), #ff8b8b 70%);

clip-path: polygon(0 0,100% 0,85% 100%,0 100%); z-index:1; opacity:0.95;

}


/* GALLERY */

section.gallery{ background:var(--bg); padding:3rem 1rem 5rem }

.gallery-header{ text-align:center; margin-bottom:1.25rem }

.gallery-header h2{ font-family:"Playfair Display",serif; color:var(--accent3); font-size:clamp(2rem,5.5vw,3.5rem); margin-bottom:.25rem }

.gallery-sub{ color:#9a9a9a; font-size:.95rem; margin-bottom:.75rem }


.collage-grid{

max-width:1200px; margin:0 auto; display:grid;

grid-template-columns: repeat(auto-fill, minmax(160px,1fr));

grid-auto-rows: var(--row-h); gap:var(--gap); align-items:start; grid-auto-flow:dense;

}

.collage-item{

position:relative; overflow:hidden; display:block;

border:4px solid rgba(255,255,255,0.04);

background:linear-gradient(180deg, rgba(255,255,255,0.02), rgba(0,0,0,0.02));

transition: transform .35s ease, box-shadow .35s ease, border-color .25s ease;

transform-origin:center; cursor:pointer; will-change:transform; border-radius:8px;

}

.span-4{ grid-row-end: span 4; } .span-3{ grid-row-end: span 3; } .span-2{ grid-row-end: span 2; } .span-1{ grid-row-end: span 1; }

.collage-item img{ width:100%; height:100%; object-fit:cover; display:block; transition: transform .8s cubic-bezier(.2,.9,.2,1); transform-origin:center center; }

.collage-item:hover{ transform:translateY(-8px) rotate(-0.6deg) scale(1.02); box-shadow:16px 24px 40px rgba(0,0,0,0.45); z-index:20; border-color:var(--accent3) }

.collage-item:hover img{ transform: scale(1.08) rotate(-0.6deg); }


/* ---------- BOLD HOVER TAG (STYLE B) ---------- */

.collage-caption{

position:absolute; left:12px; bottom:12px; font-family:"Syne",sans-serif;

background:var(--accent3); color:#071014; padding:.45rem .75rem; font-size:0.88rem;

border-radius:6px; font-weight:700; letter-spacing:.03em; text-transform:none;

box-shadow:4px 6px 0 rgba(0,0,0,0.12);

}


/* CTA & Footer */

.cta{ padding:3rem 1rem; background: linear-gradient(45deg,var(--accent2),var(--accent1)); text-align:center }

.cta h2{ font-family:"Playfair Display",serif; color:#0a0a0a; font-size:clamp(1.4rem,3.5vw,2.4rem); margin-bottom:.6rem }

.cta .cta-actions{ display:flex; justify-content:center; gap:1rem; flex-wrap:wrap; margin-top:1rem }

.btn{ font-family:"Space Grotesk",sans-serif; padding:.85rem 1.4rem; border-radius:10px; font-weight:700; text-transform:uppercase; letter-spacing:.08em; cursor:pointer; border:0; box-shadow:6px 6px 0 rgba(10,10,10,0.08); transition:transform .18s ease,box-shadow .18s ease }

.btn-ig{ background:rgba(10,10,10,0.95); color:var(--accent3) } .btn-coffee{ background:rgba(255,255,255,0.95); color:#071014 }

.btn:hover{ transform: translateY(-4px) }


footer{ padding:1.25rem; text-align:center; color:#9a9a9a; border-top:4px solid var(--accent1); background:linear-gradient(180deg, rgba(255,255,255,0.02), transparent) }

footer p{ font-family:"Cormorant Garamond",serif; font-size:.95rem }


/* Lightbox */

.lb-backdrop{ position:fixed; inset:0; background:rgba(0,0,0,0.85); display:none; align-items:center; justify-content:center; z-index:9999; }

.lb-active{ display:flex }

.lb-stage{ max-width:95vw; max-height:92vh; display:flex; align-items:center; justify-content:center; position:relative; gap:1rem }

.lb-img{ max-width:calc(95vw - 200px); max-height:92vh; display:block; border-radius:6px; box-shadow:0 30px 80px rgba(0,0,0,.7) }

.lb-meta{ position:absolute; right:24px; bottom:24px; color:#fff; text-align:right; font-family:"Cormorant Garamond",serif; max-width:360px }

.lb-title{ font-size:1.35rem; font-weight:700; margin-bottom:.35rem }

.lb-count{ font-size:.9rem; color:rgba(255,255,255,0.8) }


.lb-close, .lb-prev, .lb-next{

position:absolute; top:50%; transform:translateY(-50%); background:rgba(255,255,255,0.06); color:#fff; border:0; padding:.7rem .9rem; border-radius:8px; cursor:pointer;

}

.lb-close{ right:18px; top:18px; transform:none }

.lb-prev{ left:8px } .lb-next{ right:8px }


.lb-arrow{ font-size:1.15rem; font-weight:700; opacity:0.95 }


@media (min-width:1100px){ :root{ --row-h:6.5vw } .collage-grid{ grid-template-columns: repeat(4,1fr) } }

@media (min-width:1400px){ .collage-grid{ grid-template-columns: repeat(5,1fr) } }

@media (max-width:900px){ :root{ --row-h:8.5vw } }

@media (max-width:560px){ :root{ --row-h:12.5vw; --gap:.75rem } .collage-caption{ font-size:.78rem } .lb-meta{ display:none } .lb-img{ max-width:95vw } }

.collage-item:focus{ outline:3px solid rgba(255,230,109,0.25); outline-offset:4px }

</style>

</head>

<body>


<!-- HERO -->

<header class="hero" role="banner">

<div class="hero-inner">

<h1 class="title">Unapologetic Struggle Art

<small style="font-size:.35em;display:block;margin-top:.45rem;font-family:'Space Grotesk',sans-serif;letter-spacing:.12em;text-transform:uppercase;color:#333">by Poverty Fueled Artistry</small>

</h1>

<p class="lead">30+ years of boundary-breaking work — a chaotic, colorful manifesto on the page.</p>


<div class="hero-badges" aria-hidden="true">

<div class="badge">Experimental</div>

<div class="badge">Color-Block</div>

<div class="badge">Unfiltered</div>

</div>

</div>

</header>


<!-- BIO -->

<section class="bio" id="about">

<div class="bio-inner" role="region" aria-labelledby="about-title">

<h2 id="about-title">About the Artist</h2>

<p>For over three decades, Poverty Fueled Artistry has refused to be confined by medium, genre, or convention. Their expansive practice spans drawing, painting, photography, digital art & graphic design — each discipline serving as another language in an ever-evolving creative vocabulary.</p>

<p>What began with traditional media has evolved into a primary focus on digital art, where pixels become as malleable as paint. The work demands attention, provokes reaction, and challenges viewers to confront their own boundaries.</p>

<p>Eclecticism isn’t a phase — it’s a philosophy. This portfolio is a creative odyssey: raw, messy, exacting, and unapologetic.</p>

</div>

</section>


<!-- GALLERY -->

<section class="gallery" aria-labelledby="gallery-title">

<div class="gallery-header">

<h2 id="gallery-title">Featured Works</h2>

<div class="gallery-sub">Unlimited. Add image files to the folder (artwork1.jpg, artwork1.webp, or your-optimized names). Titles appear on hover and in the lightbox.</div>

</div>


<div class="collage-grid" id="collage" aria-live="polite"></div>

</section>


<!-- CTA -->

<section class="cta" aria-labelledby="cta-title">

<h2 id="cta-title">Connect & Support</h2>

<div class="cta-actions">

<a class="btn btn-ig" href="https://instagram.com/PovertyFueledArtistry" target="_blank" rel="noopener">Follow on Instagram</a>

<a class="btn btn-coffee" href="https://buymeacoffee.com/PovertyFueledArtistry" target="_blank" rel="noopener">Buy Me a Coffee</a>

</div>

</section>


<footer>

<p>&copy; <span id="year"></span> Poverty Fueled Artistry — Unapologetically Creative</p>

</footer>


<!-- LIGHTBOX MARKUP -->

<div id="lb" class="lb-backdrop" aria-hidden="true" role="dialog" aria-label="Image viewer">

<button class="lb-close" aria-label="Close (Esc)">✕</button>

<button class="lb-prev" aria-label="Previous (Left arrow)"><span class="lb-arrow">‹</span></button>

<div class="lb-stage" role="document">

<img class="lb-img" src="" alt="" />

<div class="lb-meta" aria-hidden="false">

<div class="lb-title"></div>

<div class="lb-count"></div>

</div>

</div>

<button class="lb-next" aria-label="Next (Right arrow)"><span class="lb-arrow">›</span></button>

</div>


<script>

(function(){

// CONFIG

const MAX_IMAGES = 60; // how many filenames to probe

const container = document.getElementById('collage');

const lightbox = document.getElementById('lb');

const lbImg = lightbox.querySelector('.lb-img');

const lbTitle = lightbox.querySelector('.lb-title');

const lbCount = lightbox.querySelector('.lb-count');

const closeBtn = lightbox.querySelector('.lb-close');

const prevBtn = lightbox.querySelector('.lb-prev');

const nextBtn = lightbox.querySelector('.lb-next');


// Title map (locked-in titles)

const titleMap = {

1: "Sunrise Over the Struggle Line",

2: "Dressed for a World That Isn’t Coming",

3: "Golden Ratio of Resistance"

// additional titles can be added here keyed by image index

};


// fallback name alternatives to try when probing

const tryExtensions = ['.webp','.jpg','.jpeg','.png'];


// If you have individually named optimized files in the folder,

// you can add them here to map index -> filename

// e.g. manualMap[1] = "getimg_ai_img-tOZc5QmMQ2OB9cUIjtTRe.webp"

const manualMap = {

// Example (auto-detected too): uncomment and edit if you want explicit names

// 1: "getimg_ai_img-tOZc5QmMQ2OB9cUIjtTRe.webp",

// 2: "weekshot dog n lady.webp",

// 3: "getimg_ai_img-LNwow9XDtjIzeefSucOd3.webp"

};


// store loaded items for lightbox navigation

const galleryItems = [];


function probeSrcNamed(base){

// try various extensions and thumb variants

const candidates = [];

for (const ext of tryExtensions){

candidates.push(base + ext);

candidates.push(base + ext.replace('.', '_thumb.'));

// also try explicit thumb suffix

candidates.push(base + '_thumb' + ext);

}

return probeCandidates(candidates);

}


function probeCandidates(list){

return new Promise(resolve=>{

let found = null, i=0;

function tryNext(){

if (i>=list.length){ resolve(null); return; }

const url = list[i++];

const img = new Image();

img.onload = ()=>resolve(url);

img.onerror = ()=>tryNext();

img.src = url;

}

tryNext();

});

}


// given a base name (artworkN) try to find existing file (webp,jpg,png)

async function findArtworkByIndex(index){

// first: explicit manual map

if (manualMap[index]) {

// check file exists quickly

const ok = await probeCandidates([manualMap[index]]);

if (ok) return manualMap[index];

}


// try several naming conventions

const bases = [

`artwork${index}`,

`artwork-${index}`,

`artwork_${index}`,

`getimg_ai_img-${index}`,

`image${index}`,

`img${index}`,

// also check original numeric names

`artwork${index}`

];

for (const b of bases){

const found = await probeSrcNamed(b);

if (found) return found;

}

// lastly try common explicit original names the user uploaded (best-effort)

if (index === 1) {

const try1 = await probeCandidates(["getimg_ai_img-tOZc5QmMQ2OB9cUIjtTRe.webp","getimg_ai_img-tOZc5QmMQ2OB9cUIjtTRe.jpg"]);

if (try1) return try1;

}

if (index === 2) {

const try2 = await probeCandidates(["weekshot dog n lady.webp","weekshot dog n lady.jpg","weekshot%20dog%20n%20lady.webp"]);

if (try2) return try2;

}

if (index === 3) {

const try3 = await probeCandidates(["getimg_ai_img-LNwow9XDtjIzeefSucOd3.webp","getimg_ai_img-LNwow9XDtjIzeefSucOd3.jpg"]);

if (try3) return try3;

}

return null;

}


// create element for grid using thumbnail if available

function makeItem(src, thumbSrc, idx, naturalW, naturalH){

const a = document.createElement('a');

a.href = src;

a.className = 'collage-item';

a.dataset.index = idx;

a.setAttribute('aria-label', `Artwork ${idx}`);

a.tabIndex = 0;


const img = document.createElement('img');

img.src = thumbSrc || src;

img.alt = titleMap[idx] || `Artwork ${idx}`;

img.loading = 'lazy';

a.appendChild(img);


const cap = document.createElement('span');

cap.className = 'collage-caption';

cap.textContent = titleMap[idx] || `Artwork ${idx}`;

a.appendChild(cap);


// choose span based on aspect ratio favoring portrait

let span = 'span-2';

if (naturalW && naturalH){

const ratio = naturalH / naturalW;

if (ratio > 1.6) span = 'span-4';

else if (ratio > 1.15) span = 'span-3';

else if (ratio > 0.85) span = 'span-2';

else span = 'span-1';

} else {

// random-ish with portrait bias

const r = Math.random();

span = (r > 0.7) ? 'span-4' : (r > 0.35 ? 'span-3' : 'span-2');

}

a.classList.add(span);


// click opens lightbox

a.addEventListener('click', function(ev){

ev.preventDefault();

openLightboxByIndex(galleryItems.findIndex(it => it.src === src));

});

// keyboard accessibility (Enter)

a.addEventListener('keydown', function(ev){

if (ev.key === 'Enter') { ev.preventDefault(); a.click(); }

});


return a;

}


// probe one index, detect src & thumb & natural sizes

async function probeIndex(i){

// possible names to try for thumbnail

const primary = await findArtworkByIndex(i);

if (!primary) return null;


// try to find thumb version

const baseNoExt = primary.replace(/\.(webp|jpg|jpeg|png)$/i,'');

const thumbCandidates = [

baseNoExt + '_thumb.webp', baseNoExt + '_thumb.jpg',

baseNoExt + '_thumb.png', baseNoExt + '.webp', baseNoExt + '.jpg'

];

// detect actual thumb file exists

let thumbFound = null;

for (const c of thumbCandidates){

const ok = await probeCandidates([c]);

if (ok){ thumbFound = ok; break; }

}


// measure natural size by creating Image

const m = await new Promise((res)=>{

const tester = new Image();

tester.onload = ()=>res({w:tester.naturalWidth, h:tester.naturalHeight});

tester.onerror = ()=>res({w:0,h:0});

tester.src = primary;

});


return { src: primary, thumb: thumbFound, w:m.w, h:m.h, index:i };

}


// sequential load to keep order (and not hammer server)

(async function loadGallery(){

for (let i=1;i<=MAX_IMAGES;i++){

const p = await probeIndex(i);

if (p){

const itemEl = makeItem(p.src, p.thumb, i, p.w, p.h);

container.appendChild(itemEl);

galleryItems.push({ src:p.src, title: (titleMap[i] || `Artwork ${i}`) , thumb:p.thumb });

}

}

// if none loaded, show placeholders instructing filenames

if (galleryItems.length === 0){

for (let j=1;j<=3;j++){

const ph = document.createElement('div');

ph.className = 'collage-item span-3';

ph.style.display='flex'; ph.style.alignItems='center'; ph.style.justifyContent='center';

ph.style.minHeight='220px';

ph.style.background=`linear-gradient(45deg, rgba(255,107,107,0.07), rgba(78,205,196,0.04))`;

ph.innerHTML = `<div style="text-align:center;padding:1rem;color:rgba(255,255,255,0.85)"><strong style="display:block;font-family:'Syne',sans-serif;margin-bottom:.35rem">No artworks found</strong><span style="font-family: 'Space Grotesk',sans-serif;font-size:.95rem">Add files named <code>artwork1.webp</code>, <code>artwork2.webp</code> etc. to this folder.</span></div>`;

container.appendChild(ph);

}

}

})();


// LIGHTBOX FUNCTIONS

let currentIndex = -1;

function openLightboxByIndex(idx){

if (idx < 0 || idx >= galleryItems.length) return;

currentIndex = idx;

const item = galleryItems[idx];

lbImg.src = item.src;

lbImg.alt = item.title;

lbTitle.textContent = item.title;

lbCount.textContent = `${idx+1} / ${galleryItems.length}`;

lightbox.classList.add('lb-active');

lightbox.setAttribute('aria-hidden','false');

document.body.style.overflow = 'hidden';

// set focus

closeBtn.focus();

}


function closeLightbox(){

lightbox.classList.remove('lb-active');

lightbox.setAttribute('aria-hidden','true');

lbImg.src = '';

document.body.style.overflow = '';

currentIndex = -1;

}


function showPrev(){

if (galleryItems.length === 0) return;

currentIndex = (currentIndex - 1 + galleryItems.length) % galleryItems.length;

openLightboxByIndex(currentIndex);

}

function showNext(){

if (galleryItems.length === 0) return;

currentIndex = (currentIndex + 1) % galleryItems.length;

openLightboxByIndex(currentIndex);

}


// events

closeBtn.addEventListener('click', closeLightbox);

prevBtn.addEventListener('click', showPrev);

nextBtn.addEventListener('click', showNext);


// keyboard nav

document.addEventListener('keydown', function(e){

if (!lightbox.classList.contains('lb-active')) return;

if (e.key === 'Escape') { closeLightbox(); }

if (e.key === 'ArrowLeft') { showPrev(); }

if (e.key === 'ArrowRight') { showNext(); }

});


// click backdrop to close (but not clicks inside stage)

lightbox.addEventListener('click', function(e){

if (e.target === lightbox) closeLightbox();

});


// touch / swipe support for mobile

(function addSwipe(){

let startX=0, startY=0, distX=0, distY=0, startTime=0;

const threshold = 80; // required min distance

const allowedTime = 500;

lightbox.addEventListener('touchstart', function(e){

const t = e.changedTouches[0];

startX = t.pageX; startY = t.pageY; startTime = new Date().getTime();

}, {passive:true});

lightbox.addEventListener('touchend', function(e){

const t = e.changedTouches[0];

distX = t.pageX - startX; distY = t.pageY - startY;

const elapsed = new Date().getTime() - startTime;

if (elapsed <= allowedTime){

if (Math.abs(distX) >= threshold && Math.abs(distY) <= 100){

if (distX > 0) showPrev(); else showNext();

} else if (Math.abs(distY) >= threshold && Math.abs(distX) <= 100){

// vertical swipe closes

closeLightbox();

}

}

}, {passive:true});

})();


// update copyright year

document.getElementById('year').textContent = new Date().getFullYear();

})();

</script>

</body>

</html>