
<!DOCTYPE html>
<html lang="en-US" itemscope itemtype="https://schema.org/WebPage">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <title>Gonia Pawinska</title>
<meta name='robots' content='max-image-preview:large' />
<link rel="alternate" type="application/rss+xml" title="Gonia Pawinska &raquo; Feed" href="https://gonia.harea.digital/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="Gonia Pawinska &raquo; Comments Feed" href="https://gonia.harea.digital/?feed=comments-rss2" />
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://gonia.harea.digital/index.php?rest_route=%2Foembed%2F1.0%2Fembed&#038;url=https%3A%2F%2Fgonia.harea.digital%2F" />
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://gonia.harea.digital/index.php?rest_route=%2Foembed%2F1.0%2Fembed&#038;url=https%3A%2F%2Fgonia.harea.digital%2F&#038;format=xml" />
<style id='wp-img-auto-sizes-contain-inline-css' type='text/css'>
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<style id='wp-block-library-inline-css' type='text/css'>
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}

/*# sourceURL=wp-block-library-inline-css */
</style>
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
/*# sourceURL=/wp-includes/css/classic-themes.min.css */
</style>
<style id='global-styles-inline-css' type='text/css'>
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}:root :where(.is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.is-layout-flow) > *{margin-block-start: 24px;margin-block-end: 0;}:root :where(.is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.is-layout-constrained) > *{margin-block-start: 24px;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 24px;}:root :where(.is-layout-grid){gap: 24px;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
/*# sourceURL=global-styles-inline-css */
</style>

<link rel='stylesheet' id='wpo_min-header-0-css' href='https://gonia.harea.digital/wp-content/cache/wpo-minify/1761769066/assets/wpo-minify-header-3a6c1138.min.css' type='text/css' media='all' />
<script type="text/javascript" src="https://gonia.harea.digital/wp-content/cache/wpo-minify/1761769066/assets/wpo-minify-header-7ba40e52.min.js" id="wpo_min-header-0-js"></script>
<link rel="https://api.w.org/" href="https://gonia.harea.digital/index.php?rest_route=/" /><link rel="alternate" title="JSON" type="application/json" href="https://gonia.harea.digital/index.php?rest_route=/wp/v2/pages/5" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://gonia.harea.digital/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 6.9.4" />
<link rel="canonical" href="https://gonia.harea.digital/" />
<link rel='shortlink' href='https://gonia.harea.digital/' />
</head>
<body class="home wp-singular page-template page-template-page-templates page-template-home page-template-page-templateshome-php page page-id-5 wp-embed-responsive wp-theme-GoniaPawinska">
<div id="wrapper" class="hfeed">

    <nav id="main-nav">
        <div class="logo">
            <h1 class=""><a class="ib" href="https://gonia.harea.digital">gonia pawińska</a></h1>
        </div>

        <a class="mobile-nav-btn" id="mobile-nav-trigger">
            menu
        </a>

        <div class="black-box-menu-container nav-box cr" id="nav-box">
            <ul class="black-box-menu"><li id="menu-item-12" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-item page_item page-item-5 current_page_item menu-item-12"><a href="https://gonia.harea.digital/" aria-current="page" itemprop="url">Projects</a></li>
<li id="menu-item-13" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-13"><a href="https://gonia.harea.digital/?page_id=7" itemprop="url">About</a></li>
<li id="menu-item-14" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14"><a href="https://gonia.harea.digital/?page_id=9" itemprop="url">Contact</a></li>
<li id="menu-item-16" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16"><a href="https://www.instagram.com/gonia_ognia/" itemprop="url">Instagram</a></li>
</ul>        </div>


    </nav>



    <div id="container">
        <main id="content" role="main">
<canvas id="canvas"></canvas>



<style>

canvas {
            display: block;
            /*width: 50vw;*/
            /*height: 50vh;*/
            position: fixed;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%)
        }


</style>

<section class="stack" id="stack" aria-label="Scrolling glass cards">
    

<div class="project-panel glass-effect">
    <div class="glass2"></div>

    <div class="head">
        <a href="https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-7"><h4 class="project-title ib">PEPSI: Pomeranian Puppy</h4></a>
        <p class="project-scope cr">scope: <span class="cr">art direction, 3d, mapping</span><span class="cr year">2025</span></p>
    </div>
    <div class="media">
        <div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-7  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-quang-nguyen-vinh-222549-2176593.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-7  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kqpho-1583582.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-7  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-david-besh-884788.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-7  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kripesh-adwani-223818-709143.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-7  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-jefriwibawa-1387037.jpg" alt="PEPSI: Pomeranian Puppy"></a></div>    </div>
</div>


<div class="project-panel glass-effect">
    <div class="glass2"></div>

    <div class="head">
        <a href="https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-6"><h4 class="project-title ib">PEPSI: Pomeranian Puppy</h4></a>
        <p class="project-scope cr">scope: <span class="cr">art direction, 3d, mapping</span><span class="cr year">2025</span></p>
    </div>
    <div class="media">
        <div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-6  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-quang-nguyen-vinh-222549-2176593.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-6  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kqpho-1583582.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-6  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-david-besh-884788.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-6  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kripesh-adwani-223818-709143.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-6  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-jefriwibawa-1387037.jpg" alt="PEPSI: Pomeranian Puppy"></a></div>    </div>
</div>


<div class="project-panel glass-effect">
    <div class="glass2"></div>

    <div class="head">
        <a href="https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-5"><h4 class="project-title ib">PEPSI: Pomeranian Puppy</h4></a>
        <p class="project-scope cr">scope: <span class="cr">art direction, 3d, mapping</span><span class="cr year">2025</span></p>
    </div>
    <div class="media">
        <div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-5  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-quang-nguyen-vinh-222549-2176593.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-5  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kqpho-1583582.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-5  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-david-besh-884788.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-5  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kripesh-adwani-223818-709143.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-5  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-jefriwibawa-1387037.jpg" alt="PEPSI: Pomeranian Puppy"></a></div>    </div>
</div>


<div class="project-panel glass-effect">
    <div class="glass2"></div>

    <div class="head">
        <a href="https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-4"><h4 class="project-title ib">PEPSI: Pomeranian Puppy</h4></a>
        <p class="project-scope cr">scope: <span class="cr">art direction, 3d, mapping</span><span class="cr year">2025</span></p>
    </div>
    <div class="media">
        <div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-4  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-quang-nguyen-vinh-222549-2176593.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-4  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kqpho-1583582.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-4  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-david-besh-884788.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-4  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kripesh-adwani-223818-709143.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-4  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-jefriwibawa-1387037.jpg" alt="PEPSI: Pomeranian Puppy"></a></div>    </div>
</div>


<div class="project-panel glass-effect">
    <div class="glass2"></div>

    <div class="head">
        <a href="https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-3"><h4 class="project-title ib">PEPSI: Pomeranian Puppy</h4></a>
        <p class="project-scope cr">scope: <span class="cr">art direction, 3d, mapping</span><span class="cr year">2025</span></p>
    </div>
    <div class="media">
        <div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-3  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-quang-nguyen-vinh-222549-2176593.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-3  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kqpho-1583582.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-3  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-david-besh-884788.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-3  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kripesh-adwani-223818-709143.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-3  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-jefriwibawa-1387037.jpg" alt="PEPSI: Pomeranian Puppy"></a></div>    </div>
</div>


<div class="project-panel glass-effect">
    <div class="glass2"></div>

    <div class="head">
        <a href="https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-2"><h4 class="project-title ib">PEPSI: Pomeranian Puppy</h4></a>
        <p class="project-scope cr">scope: <span class="cr">art direction, 3d, mapping</span><span class="cr year">2025</span></p>
    </div>
    <div class="media">
        <div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-2  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-quang-nguyen-vinh-222549-2176593.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-2  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kqpho-1583582.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-2  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-david-besh-884788.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-2  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kripesh-adwani-223818-709143.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy-2  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-jefriwibawa-1387037.jpg" alt="PEPSI: Pomeranian Puppy"></a></div>    </div>
</div>


<div class="project-panel glass-effect">
    <div class="glass2"></div>

    <div class="head">
        <a href="https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy"><h4 class="project-title ib">PEPSI: Pomeranian Puppy</h4></a>
        <p class="project-scope cr">scope: <span class="cr">art direction, 3d, mapping</span><span class="cr year">2025</span></p>
    </div>
    <div class="media">
        <div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-quang-nguyen-vinh-222549-2176593.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kqpho-1583582.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-david-besh-884788.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-kripesh-adwani-223818-709143.jpg" alt="PEPSI: Pomeranian Puppy"></a></div><div class="single-media"><a class="cr image-container" href=" https://gonia.harea.digital/?projekt=pepsi-pomeranian-puppy  "><img      width="1600" height="900"   loading="eager" fetchpriority="high" decoding="async" src="https://gonia.harea.digital/wp-content/uploads/2025/10/pexels-jefriwibawa-1387037.jpg" alt="PEPSI: Pomeranian Puppy"></a></div>    </div>
</div>
    </div>

</section>


<!-- <div class="scroll-driver" id="driver" aria-hidden="true">
 Set total “scroll length” here
    <div class="scroll-space"></div>
</div> -->

<script>
    const heroBgImage = "https://gonia.harea.digital/wp-content/themes/GoniaPawinska/assets/gonia2.jpg";

    document.querySelectorAll('.image-container img').forEach(img => {
        if (img.decode) img.decode().catch(() => {});
    });
</script>

<script id="fragmentShader" type="x-shader/x-fragment">
    precision mediump float;

    #define MAX_BOXES 12

    uniform float u_dpr;
    uniform sampler2D u_background;
    uniform vec2 u_resolution;

    uniform int  u_boxCount;
    uniform vec2 u_boxesPos[MAX_BOXES];   // centers in DEVICE px (top-left origin)
    uniform vec2 u_boxesSize[MAX_BOXES];  // FULL sizes in DEVICE px
    uniform float u_frost; // 0.0 (no extra frost) .. 1.0 (max frost)

    varying vec2 v_uv;

    /* ---------- helpers ---------- */
    float roundedBox(vec2 px, vec2 center, vec2 halfSize, float radius) {
      vec2 q = abs(px - center) - halfSize + radius;
      return length(max(q, 0.0)) - radius; // <0 inside, >0 outside
    }
    float roundedBoxSDF(vec2 p, vec2 b, float r) {
      vec2 d = abs(p) - b + vec2(r);
      return length(max(d, 0.0)) - r;
    }
vec3 blurBackground(vec2 uv, vec2 resolution, float spreadPx, float sigma) {
    // 7x7 gaussian-like blur; spreadPx controls how far each tap samples in pixels
    vec3 result = vec3(0.0);
    float total = 0.0;
    for (int x = -3; x <= 3; x++) {
        for (int y = -3; y <= 3; y++) {
            vec2 o = vec2(float(x), float(y));
            float w = exp(-(dot(o, o)) / (2.0 * sigma));
            // convert pixel offsets to UV using spreadPx
            vec2 offset = o * (spreadPx / resolution);
            result += texture2D(u_background, uv + offset).rgb * w;
            total  += w;
        }
    }
    return result / max(total, 1e-5);
}
    vec2 boxNormal(vec2 pixel, vec2 center, vec2 halfSize, float radius) {
      vec2 p = pixel - center;
      vec2 e = vec2(1.0); // 1 device px
      float dx = (roundedBoxSDF(p + vec2(e.x, 0.0), halfSize, radius) -
                  roundedBoxSDF(p - vec2(e.x, 0.0), halfSize, radius)) * 0.5;
      float dy = (roundedBoxSDF(p + vec2(0.0, e.y), halfSize, radius) -
                  roundedBoxSDF(p - vec2(0.0, e.y), halfSize, radius)) * 0.5;
      vec2 g = vec2(dx, dy);
      float dxy1 = roundedBoxSDF(p + e, halfSize, radius);
      float dxy2 = roundedBoxSDF(p - e, halfSize, radius);
      g = mix(g, vec2(dxy1 - dxy2), 0.25);
      float L = length(g);
      return (L < 1e-4) ? vec2(0.0) : g / L;
    }

    /* ---------- main ---------- */
    void main() {
      // GL bottom-left -> DOM top-left device pixels
      vec2 fragPx = vec2(gl_FragCoord.x, u_resolution.y - gl_FragCoord.y);

      // Background (fixed)
      vec4 outColor = vec4(texture2D(u_background, v_uv).rgb, 1.0);

      // Base demo-like settings
      const float BASE_RADIUS_PX = 4.0;
      const float BASE_HALO_PX   = 10.0;
      const float eta            = 1.0 / 1.5;

      for (int i = 0; i < MAX_BOXES; i++) {
        if (i >= u_boxCount) break;

        vec2 center   = u_boxesPos[i];
        vec2 halfSize = u_boxesSize[i] * 0.5;

// -------- size-adaptive scaling (small ↔ large) --------
// box “scale” measures the smaller half-dimension
float minHalf = max(min(halfSize.x, halfSize.y), 1.0); // px
float heightPx = halfSize.y * 2.0;

// Normalize around a desktop-ish reference (half ≈ 200px => height ≈ 400px)
float sizeNorm = clamp(minHalf / 200.0, 0.25, 3.0);

// 1) Base: keep your existing small-card tuning (more refraction, less blur)
float domeScale   = mix(2.0, 1.0, clamp(sizeNorm, 0.0, 1.0));   // up to +100% when tiny
float edgeScale   = mix(1.6, 1.0, clamp(sizeNorm, 0.0, 1.0));   // up to +60% when tiny
// Frost controls: map u_frost -> blur spread & weight
// Feel free to nudge these numbers to taste.
float spreadPx = mix(2.0, 6.0, u_frost);   // how many pixels the blur reaches
float sigma    = mix(1.0, 2.0, u_frost);   // gaussian falloff (higher = softer)

// Base blur mix you already use (e.g., 0.45..0.56). Then add frost.
float blurMix = /* your existing blurMix */ + (0.25 * u_frost);
blurMix = clamp(blurMix, 0.0, 0.85);       // cap so it doesn’t go fully frosted

float haloPx      = mix(6.0,  10.0, clamp(sizeNorm, 0.0, 1.0)); // tighten halo when tiny

// 2) Large-card boost (kicks in smoothly from ~500px height)
float largeBoost = smoothstep(100.0, 900.0, heightPx); // 0 at 500px, 1 by 900px
domeScale *= mix(1.0, 1.9, largeBoost);
edgeScale *= mix(1.0, 1.6, largeBoost);
blurMix    = mix(blurMix, 0.80, largeBoost);
haloPx     = mix(haloPx,  14.0, largeBoost); // a touch softer edges on huge panels

// Corner radius can stay constant, or scale gently if you like:
float radiusPx = BASE_RADIUS_PX; // or: mix(BASE_RADIUS_PX, BASE_RADIUS_PX * 1.2, largeBoost);
        float topShadowEnable = step(160.0, minHalf); // 0 on small, 1 on large

        // float radiusPx = BASE_RADIUS_PX;

        /* ---------- box SDF & masks ---------- */
        float dist = roundedBox(fragPx, center, halfSize, radiusPx);
        float insideHalo = (dist <= 0.0) ? 1.0 : 1.0 - smoothstep(0.0, haloPx, dist);
        if (insideHalo <= 0.0) continue;

        // Local coords for dome
        vec2 local = (fragPx - center) / max(halfSize, vec2(1.0));
        local.y *= u_resolution.x / u_resolution.y;

        /* ---------- dome (center) refraction ---------- */
        float r = clamp(length(local), 0.0, 1.0);
        float curvature = r; // same “feel” as demo
        vec2 domeN = normalize(local + 1e-6) * curvature;
        vec2 domeRefract = refract(-domeN, domeN, eta);
        vec2 uvDome = v_uv + domeRefract * (0.03 * domeScale);

        /* ---------- edge (contour) refraction ---------- */
        float edgeFall = exp(-abs(dist) * 0.4);
        vec2 n = boxNormal(fragPx, center, halfSize, radiusPx);
        vec2 edgeN = n * pow(edgeFall, 1.5);
        vec2 edgeRefract = refract(vec2(0.0), edgeN, eta);
        vec2 uvEdge = v_uv + edgeRefract * (0.35 * edgeScale) * edgeFall;

        // Demo-like blend between dome and edge
        float edgeWeight   = smoothstep(0.0, 1.0, abs(dist));
        float radialWeight = smoothstep(0.5, 1.0, r);
        float mixW = clamp(edgeWeight - 0.5 * radialWeight, 0.0, 1.0);
        vec2 refractUV = mix(uvDome, uvEdge, mixW);

        /* ---------- sample + adaptive blur ---------- */
vec3 refracted = texture2D(u_background, refractUV).rgb;
vec3 blurred   = blurBackground(refractUV, u_resolution, spreadPx, sigma);
vec3 baseGlass = mix(refracted, blurred, blurMix);
float nf = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898,78.233))) * 43758.5453);
baseGlass = mix(baseGlass, baseGlass * (1.0 + (nf - 0.5) * 0.04), 0.35 * u_frost);

        /* ---------- top shadow (disabled on small) ---------- */
        // Keep the same formula, but multiply by topShadowEnable (0 for small cards)
        float edgeFalloff = smoothstep(0.01, 0.0, dist);
        float fy = clamp((fragPx.y - center.y) / max(halfSize.y, 1.0), -1.0, 1.0);
        float topBand = 1.0 - smoothstep(-1.5, -0.2, fy * (u_resolution.y / u_resolution.x));
        baseGlass = mix(baseGlass, vec3(0.0), edgeFalloff * topBand * 0.0 * topShadowEnable);

        /* ---------- edge glow (subtle on small) ---------- */
        float glowEdge = 1.0 - smoothstep(0.0, 0.03, dist * -2.0);
        float glowScale = mix(0.30, 0.50, clamp(sizeNorm, 0.0, 1.0)); // weaker glow when tiny
        vec3 glassRGB = mix(baseGlass, vec3(0.9), glowEdge * glowScale);

        /* ---------- composite ---------- */
        float glassAlpha = 0.95 * insideHalo;
        outColor.rgb = mix(outColor.rgb, glassRGB, glassAlpha);
      }

      gl_FragColor = vec4(outColor.rgb, 1.0);
    }
</script>
<script id="vertexShader" type="x-shader/x-vertex">
    attribute vec2 a_position;
    varying vec2 v_uv;
    void main() {
        v_uv = vec2(a_position.x, -a_position.y) * 0.5 + 0.5;
        gl_Position = vec4(a_position, 0.0, 1.0);
    }
</script>
<script>

    let bgAspect = null;
    const canvas = document.getElementById("canvas");
    const gl =
        canvas.getContext("webgl", { antialias: true }) ||
        canvas.getContext("experimental-webgl", { antialias: true });

    // --- sizing: render at half-res for perf, but compute positions correctly
    function isMobile() {
        // tweak breakpoint if you prefer (e.g., 768 or 820)
        return window.matchMedia("(max-width: 768px)").matches;
    }

    function cssCanvasSize() {
        const vw = window.innerWidth;
        const targetWidth = Math.round(vw * (isMobile() ? 0.80 : 0.50)); // 80% mobile, 50% tablet/desktop

        // If we don't know the image aspect yet, assume a safe fallback (16:9).
        const aspect = bgAspect || (16 / 9);
        const targetHeight = Math.round(targetWidth / aspect);

        return { w: targetWidth, h: targetHeight };
    }

    function dpr() {
        return window.devicePixelRatio || 1;
    }

    function resize() {
        const css = cssCanvasSize();
        const ratio = dpr();

        // framebuffer size in device pixels
        canvas.width = Math.round(css.w * ratio);
        canvas.height = Math.round(css.h * ratio);

        // CSS size (what the user sees)
        canvas.style.width = `${css.w}px`;
        canvas.style.height = `${css.h}px`;

        gl.viewport(0, 0, canvas.width, canvas.height);
    }
    window.addEventListener("resize", resize);
    resize();

    // --- shaders
    const vertexShaderSrc = document.getElementById("vertexShader").textContent;
    const fragmentShaderSrc = document.getElementById("fragmentShader").textContent;

    function compileShader(type, source) {
        const shader = gl.createShader(type);
        gl.shaderSource(shader, source);
        gl.compileShader(shader);
        if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
            console.error("Shader compile error:", gl.getShaderInfoLog(shader));
            return null;
        }
        return shader;
    }

    const vertexShader = compileShader(gl.VERTEX_SHADER, vertexShaderSrc);
    const fragmentShader = compileShader(gl.FRAGMENT_SHADER, fragmentShaderSrc);
    if (!vertexShader || !fragmentShader) {
        throw new Error("Shader compilation failed. Check the console for errors.");
    }

    const program = gl.createProgram();
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
    gl.linkProgram(program);
    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
        console.error("Program link error:", gl.getProgramInfoLog(program));
    }
    gl.useProgram(program);

    // --- fullscreen quad
    const positionBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
    gl.bufferData(
        gl.ARRAY_BUFFER,
        new Float32Array([
            -1, -1,
            1, -1,
            -1,  1,
            -1,  1,
            1, -1,
            1,  1
        ]),
        gl.STATIC_DRAW
    );
    const positionLocation = gl.getAttribLocation(program, "a_position");
    gl.enableVertexAttribArray(positionLocation);
    gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);

    // --- uniforms
    const u_resolution = gl.getUniformLocation(program, "u_resolution");
    const u_dpr        = gl.getUniformLocation(program, "u_dpr");
    const u_bg         = gl.getUniformLocation(program, "u_background");

    // multi-box uniforms
    const u_boxCount   = gl.getUniformLocation(program, "u_boxCount");
    // array base locations (WebGL1: ask for [0] and then use uniform*fv with flattened data)
    const u_boxesPos0  = gl.getUniformLocation(program, "u_boxesPos[0]");
    const u_boxesSize0 = gl.getUniformLocation(program, "u_boxesSize[0]");
    const u_frost = gl.getUniformLocation(program, "u_frost");

    // --- background texture (unchanged behavior)
    const background = gl.createTexture();
    const image = new Image();
    image.crossOrigin = "anonymous";
    // keep your URL
    image.src = heroBgImage;
    // image.src = "http://localhost:8080/wp-content/themes/GoniaPawinska/assets/gonia2.jpg";
    // image.src = "http://localhost:8080/wp-content/themes/GoniaPawinska/assets/about-merged.jpg";
    image.onload = () => {
        const c = document.createElement('canvas');
        c.width = image.naturalWidth;
        c.height = image.naturalHeight;

        const ctx = c.getContext('2d', { colorSpace: 'srgb' }) || c.getContext('2d');
        ctx.drawImage(image, 0, 0);

        gl.activeTexture(gl.TEXTURE0);
        gl.bindTexture(gl.TEXTURE_2D, background);
        gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE);
        gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c);

        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);

        gl.uniform1i(u_bg, 0);
        gl.uniform1f(u_dpr, dpr());
        gl.uniform1f(u_frost, 0.6);

        // >>> set image aspect, then resize canvas using that aspect <<<
        bgAspect = image.naturalWidth / image.naturalHeight;
        console.log(bgAspect)
        resize();

        requestAnimationFrame(draw);
    };

    // --- helper: gather panel rects and convert to device-pixel coords
    const MAX_BOXES = 12; // must match shader
    function gatherBoxes() {
        const panels = Array.from(document.querySelectorAll(".glass-effect")).slice(0, MAX_BOXES);

        const boxesPos = [];   // [x0, y0, x1, y1, ...] center positions
        const boxesSize = [];  // [w0, h0, w1, h1, ...] sizes

        const canvasRect = canvas.getBoundingClientRect();
        const ratio = dpr();

        // padding: enlarge a bit around panel
        const PAD_X = 0.08; // 8% width
        const PAD_Y = 0.1; // 20% height (tweak to taste)

        for (const el of panels) {
            const r = el.getBoundingClientRect();

            // center relative to canvas in CSS pixels
            const cx_css = (r.left + r.width * 0.5) - canvasRect.left;
            const cy_css = (r.top  + r.height * 0.5) - canvasRect.top;

            // convert to device pixels (because u_resolution is in device pixels)
            const cx = cx_css * ratio;
            const cy = cy_css * ratio;


            // console.log(cy);

            // console.log(r.height);
            // size with padding, also in device pixels
            const w = r.width * ratio
            const h = r.height * ratio;
            // console.log(h)
            boxesPos.push(cx, cy);
            boxesSize.push(w, h);
        }

        return { count: boxesPos.length / 2, boxesPos, boxesSize };
    }

    let lastTime = performance.now();
    function draw(now) {
        const delta = (now - lastTime) / 1000;
        lastTime = now;

        resize(); // keep viewport and sizes in sync if something changed

        const css = cssCanvasSize();
        gl.clear(gl.COLOR_BUFFER_BIT);

        // base uniforms
        gl.uniform2f(u_resolution, canvas.width, canvas.height);
        gl.uniform1f(u_dpr, dpr());

        // gather and upload boxes
        const { count, boxesPos, boxesSize } = gatherBoxes();
        gl.uniform1i(u_boxCount, count);

        // WebGL1: flatten arrays and set starting at [0]
        // Each is a vec2 array -> use uniform2fv with Float32Array
        gl.uniform2fv(u_boxesPos0, new Float32Array(boxesPos));
        gl.uniform2fv(u_boxesSize0, new Float32Array(boxesSize));

        gl.activeTexture(gl.TEXTURE0);
        gl.bindTexture(gl.TEXTURE_2D, background);

        gl.drawArrays(gl.TRIANGLES, 0, 6);

        requestAnimationFrame(draw);
    }

</script>


    </main>
</div>
<footer id="footer" role="contentinfo">
  <p class="cr">designed by <a class="cr" href="https://hanzidesign.com" target="_blank">hanzidesign.com</a></p>
</footer>
</div>
</div>

    <script>
        jQuery(document).ready(function ($) {
            var deviceAgent = navigator.userAgent.toLowerCase();
            if (deviceAgent.match(/(iphone|ipod|ipad)/)) {
                $("html").addClass("ios");
                $("html").addClass("mobile");
            }
            if (deviceAgent.match(/(Android)/)) {
                $("html").addClass("android");
                $("html").addClass("mobile");
            }
            if (navigator.userAgent.search("MSIE") >= 0) {
                $("html").addClass("ie");
            } else if (navigator.userAgent.search("Chrome") >= 0) {
                $("html").addClass("chrome");
            } else if (navigator.userAgent.search("Firefox") >= 0) {
                $("html").addClass("firefox");
            } else if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0) {
                $("html").addClass("safari");
            } else if (navigator.userAgent.search("Opera") >= 0) {
                $("html").addClass("opera");
            }
        });
    </script>
    <script type="text/javascript" src="https://gonia.harea.digital/wp-content/cache/wpo-minify/1761769066/assets/wpo-minify-footer-479505f1.min.js" id="wpo_min-footer-0-js"></script>
</body>
</html>
<!-- Cached by WP-Optimize - https://teamupdraft.com/wp-optimize/ - Last modified: April 22, 2026 7:36 pm (UTC:0) -->
