Portfolio 01
A Few Favorites
From the Portfolio
Prev
Next
02
Another Client
03
Client Name
04
Another Client
05
Client Name
06
Another Client
Portfolio 02
High Tide Photo
From Home
Thrive Marketing
Memoir Photo
Benji Forge
Portfolio 03
The Portfolio
Client Name
Brand Strategy & Positioning
Client Name
Brand Strategy & Positioning
Client Name
Brand Strategy & Positioning
Client Name
Brand Strategy & Positioning
Portfolio 04
Selected Work
The PROOF is in the WORK
Each project here represents a clear problem, a deliberate approach, and a measurable outcome. This is what it looks like when strategy and craft move together.
Portfolio 04








Following Stick / unstick canvases
The following nine Portfolio 05 canvases utilize a special javascript and Canvas CSS Classes to tell the window to unstick from top on scroll. Be sure to also include this javascript when adding to your page. Only use once per page to prevent issues. Paste all code in the Page loaded Javascript:
/* ===================================================================
UNSTICK ON TRIGGER — releases stick-to-top canvases
=================================================================== */
(function () {
var UNSTICK_CONFIG = {
/* ----------------------------- CUSTOMIZE -------------------------- */
triggerSelector: '.sticky-trigger',
stickySelectors: [
'.sticky-1',
'.sticky-2',
'.sticky-3',
'.sticky-4',
'.sticky-5',
'.sticky-6',
'.sticky-7'
],
// Release line, measured from the top of the viewport.
// releaseUnit: 'px' → fixed pixels (same on every screen)
// releaseUnit: '%' → percent of viewport height (scales with screen)
releasePoint: 99, // specific number (no quotes, no unit)
releaseUnit: '%' // set to either 'px' or '%'
};
/* --------------------------- LEAVE AS IS --------------------------- */
var trigger = null;
var stickyEls = [];
var unstickY = 0;
var ticking = false;
function collectElements() {
trigger = document.querySelector(UNSTICK_CONFIG.triggerSelector);
stickyEls = [];
UNSTICK_CONFIG.stickySelectors.forEach(function (sel) {
document.querySelectorAll(sel).forEach(function (el) {
stickyEls.push(el);
});
});
}
function resolveReleasePoint() {
var n = parseFloat(UNSTICK_CONFIG.releasePoint) || 0;
if (UNSTICK_CONFIG.releaseUnit === '%') {
return window.innerHeight * (n / 100);
}
return n;
}
function measure() {
if (!trigger) return;
var rect = trigger.getBoundingClientRect();
var triggerDocTop = rect.top + window.scrollY;
unstickY = triggerDocTop - resolveReleasePoint();
update();
}
function update() {
if (!trigger || !stickyEls.length) return;
var delta = window.scrollY - unstickY;
stickyEls.forEach(function (el) {
if (delta > 0) {
el.style.setProperty('transform', 'translateY(' + (-delta) + 'px)', 'important');
} else {
el.style.removeProperty('transform');
}
});
}
function onScroll() {
if (ticking) return;
ticking = true;
requestAnimationFrame(function () {
update();
ticking = false;
});
}
function init() {
collectElements();
if (!trigger) return;
measure();
window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', measure);
window.addEventListener('load', measure);
if ('ResizeObserver' in window) {
new ResizeObserver(measure).observe(document.body);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
UNSTICK ON TRIGGER — releases stick-to-top canvases
=================================================================== */
(function () {
var UNSTICK_CONFIG = {
/* ----------------------------- CUSTOMIZE -------------------------- */
triggerSelector: '.sticky-trigger',
stickySelectors: [
'.sticky-1',
'.sticky-2',
'.sticky-3',
'.sticky-4',
'.sticky-5',
'.sticky-6',
'.sticky-7'
],
// Release line, measured from the top of the viewport.
// releaseUnit: 'px' → fixed pixels (same on every screen)
// releaseUnit: '%' → percent of viewport height (scales with screen)
releasePoint: 99, // specific number (no quotes, no unit)
releaseUnit: '%' // set to either 'px' or '%'
};
/* --------------------------- LEAVE AS IS --------------------------- */
var trigger = null;
var stickyEls = [];
var unstickY = 0;
var ticking = false;
function collectElements() {
trigger = document.querySelector(UNSTICK_CONFIG.triggerSelector);
stickyEls = [];
UNSTICK_CONFIG.stickySelectors.forEach(function (sel) {
document.querySelectorAll(sel).forEach(function (el) {
stickyEls.push(el);
});
});
}
function resolveReleasePoint() {
var n = parseFloat(UNSTICK_CONFIG.releasePoint) || 0;
if (UNSTICK_CONFIG.releaseUnit === '%') {
return window.innerHeight * (n / 100);
}
return n;
}
function measure() {
if (!trigger) return;
var rect = trigger.getBoundingClientRect();
var triggerDocTop = rect.top + window.scrollY;
unstickY = triggerDocTop - resolveReleasePoint();
update();
}
function update() {
if (!trigger || !stickyEls.length) return;
var delta = window.scrollY - unstickY;
stickyEls.forEach(function (el) {
if (delta > 0) {
el.style.setProperty('transform', 'translateY(' + (-delta) + 'px)', 'important');
} else {
el.style.removeProperty('transform');
}
});
}
function onScroll() {
if (ticking) return;
ticking = true;
requestAnimationFrame(function () {
update();
ticking = false;
});
}
function init() {
collectElements();
if (!trigger) return;
measure();
window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', measure);
window.addEventListener('load', measure);
if ('ResizeObserver' in window) {
new ResizeObserver(measure).observe(document.body);
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
Portfolio 05 (lines)
Portfolio 05 (Stack 1)
Selected
Work
01
Portfolio 05 (Stack 2)
02
Portfolio 05 (Stack 3)
03
Portfolio 05 (Stack 4)
04
Portfolio 05 (Stack 5)
05
Portfolio 05 (Stack 6)
06
