Portfolio header
Welcome to my portfolio!
I'm Asherel, a designer combining natural inspiration with classic precision.
Click below to explore.
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
View Project Details
Lorem Ipsum
Lorem ipsum dolor sit amet
Attach file 5MB limit

Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.

Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis.

Thank you for taking the time to look through my work. I'd love to hear from you.

Let's talk.
Tell me about your project, and I'll be in touch.
ml> }) translate(${-cx},${-cy})`); if (contactRect) { const distToHome = r.left + 2 * W + currentBottomX; contactRect.setAttribute("width", Math.max(0, distToHome / ppu + 100).toFixed(1)); } } function alignBlurStrip() { const grid = document.querySelector('.cards-grid'); const strip = document.getElementById('blurStrip'); const overlay = document.getElementById('contactFormOverlay'); const heading = document.getElementById('contactHeading'); const navAbout = document.getElementById('navAbout'); const navContact = document.getElementById('navContact'); if (!grid) return; const left = window.innerWidth + grid.offsetLeft; const width = grid.offsetWidth; // Position heading from navAbout.right to navContact.left (in nav coords) if (heading && navAbout && navContact) { const aLeft = navAbout.offsetLeft; const cRight = navContact.offsetLeft + navContact.offsetWidth; heading.style.marginLeft = aLeft + 'px'; heading.style.width = (cRight - aLeft) + 'px'; heading.style.textAlign = 'right'; heading.style.paddingRight = '0'; heading.style.whiteSpace = 'nowrap'; heading.style.overflow = 'hidden'; heading.style.display = 'flex'; heading.style.alignItems = 'center'; heading.style.justifyContent = 'center'; // Scale to fill width heading.style.fontSize = '10px'; const targetW = cRight - aLeft; const ratio = targetW / heading.scrollWidth; heading.style.fontSize = (10 * ratio * 0.95) + 'px'; } const extendedWidth = window.innerWidth - grid.offsetLeft; if (strip) { strip.style.left = left + 'px'; strip.style.width = extendedWidth + 'px'; } } window.addEventListener('load', alignBlurStrip); window.addEventListener('resize', alignBlurStrip); function alignNameEmailBoxes() { const navGraphic = document.getElementById('navGraphic'); const navAbout = document.getElementById('navAbout'); const overlay = document.getElementById('contactFormOverlay'); const nameInput = overlay ? overlay.querySelector('input[type="text"]') : null; const emailInput = overlay ? overlay.querySelector('input[type="email"]') : null; if (!navGraphic || !navAbout || !overlay || !nameInput || !emailInput) return; const or = overlay.getBoundingClientRect(); const gr = navGraphic.getBoundingClientRect(); const ar = navAbout.getBoundingClientRect(); // Right edge of nav link relative to overlay left const nameRight = gr.right - or.left; const emailRight = ar.right - or.left; // Set max-width on name and email fields const nameField = nameInput.closest('.contact-field'); const emailField = emailInput.closest('.contact-field'); if (nameField) nameField.style.width = nameRight + 'px'; if (emailField) emailField.style.width = emailRight + 'px'; } window.addEventListener('load', alignNameEmailBoxes); window.addEventListener('resize', alignNameEmailBoxes); document.addEventListener('wheel', function(e) { const textarea = document.querySelector('#messageCol textarea'); if (!textarea) return; const rect = textarea.getBoundingClientRect(); const over = e.clientX >= rect.left && e.clientX <= rect.right && e.clientY >= rect.top && e.clientY <= rect.bottom; if (over && textarea.scrollHeight > textarea.clientHeight) { e.stopPropagation(); } }, { capture: true }); (function() { // ── CONTACT FORM SUBMIT ── (function() { var fileInput = document.getElementById('contactFile'); if (fileInput) { fileInput.addEventListener('change', function() { Array.from(this.files).forEach(function(f) { window._attachedFiles.push(f); }); this.value = ''; _renderAttached(); }); } var btn = document.querySelector('.contact-send'); if (!btn) return; btn.addEventListener('click', function() { var overlay = document.getElementById('contactFormOverlay'); if (!overlay) return; var name = overlay.querySelector('input[type="text"]'); var email = overlay.querySelector('input[type="email"]'); var message = overlay.querySelector('textarea'); if (!name || !email || !message) return; var nameVal = name.value.trim(); var emailVal = email.value.trim(); var msgVal = message.value.trim(); if (!nameVal || !emailVal || !msgVal) { btn.textContent = 'Please fill all fields'; setTimeout(function(){ btn.textContent = 'Send message'; }, 2500); return; } btn.textContent = 'Sending...'; btn.disabled = true; fetch('https://submit-form.com/eT1HwI8XG', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify({ name: nameVal, email: emailVal, message: msgVal, website: '' }) }) .then(function(r){ return r.json(); }) .then(function(res) { if (res.success) { btn.textContent = 'Sent!'; name.value = ''; email.value = ''; message.value = ''; window._attachedFiles = []; _renderAttached(); setTimeout(function(){ btn.textContent = 'Send message'; btn.disabled = false; }, 3000); } else { btn.textContent = 'Error — try again'; btn.disabled = false; setTimeout(function(){ btn.textContent = 'Send message'; }, 3000); } }) .catch(function() { btn.textContent = 'Error — try again'; btn.disabled = false; setTimeout(function(){ btn.textContent = 'Send message'; }, 3000); }); }); })(); '+files.map(function(f){return f.name;}).join(', ');disp.style.display='inline';}else{disp.style.display='none';}">