{"id":2,"date":"2026-08-03T10:55:53","date_gmt":"2026-08-03T10:55:53","guid":{"rendered":"http:\/\/127.0.0.1\/?page_id=2"},"modified":"2026-08-25T15:06:24","modified_gmt":"2026-08-25T15:06:24","slug":"sample-page","status":"publish","type":"page","link":"https:\/\/donis.uk\/","title":{"rendered":"Home"},"content":{"rendered":"\n<div class=\"wp-block-group alignfull has-contrast-background-color has-background is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)\">\n<style data-wp-block-html=\"css\">\n#chrome-logo-widget{width:100%; margin:0 auto;color:#eee;font-family:Inter,ui-sans-serif,system-ui,sans-serif}#chrome-logo-widget,#chrome-logo-widget *{box-sizing:border-box}#chrome-logo-widget .cl-stage{position:relative;width:100%;height:80vh; min-height: 500px; overflow:hidden;isolation:isolate;border-radius:clamp(14px,2vw,30px);background:#100300;box-shadow:0 24px 80px rgba(64,14,0,.22)}#chrome-logo-widget canvas{position:absolute;inset:0;display:block;width:100%!important;height:100%!important}#chrome-logo-widget .cl-wave-canvas{z-index:0;pointer-events:none}#chrome-logo-widget .cl-logo-canvas{z-index:1;cursor:grab;touch-action:pan-y}#chrome-logo-widget .cl-logo-canvas:active{cursor:grabbing}#chrome-logo-widget .cl-grain,#chrome-logo-widget .cl-retro{position:absolute;inset:0;z-index:2;pointer-events:none}#chrome-logo-widget .cl-grain{opacity:.5;mix-blend-mode:soft-light;background-image:url(\"data:image\/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='4' stitchTiles='stitch'\/%3E%3C\/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.9'\/%3E%3C\/svg%3E\")}#chrome-logo-widget .cl-retro{--cl-vignette:.9;--cl-grid-a:#000;--cl-grid-b:#fff;--cl-vignette-color:#000;--cl-grid-size:96px;opacity:.22;mix-blend-mode:multiply;background-image:linear-gradient(color-mix(in srgb,var(--cl-grid-a) 18%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--cl-grid-b) 14%,transparent) 1px,transparent 1px),repeating-linear-gradient(0deg,rgba(0,0,0,.045) 0 1px,transparent 1px 4px);background-size:var(--cl-grid-size) var(--cl-grid-size),var(--cl-grid-size) var(--cl-grid-size),100% 4px}#chrome-logo-widget .cl-retro:after{content:\"\";position:absolute;inset:0;opacity:min(1,calc(var(--cl-vignette)*.72));background:radial-gradient(circle at center,transparent 32%,color-mix(in srgb,var(--cl-vignette-color) 72%,transparent) 125%);box-shadow:inset 0 0 calc(22vw*var(--cl-vignette)) calc(1.5vw*var(--cl-vignette)) color-mix(in srgb,var(--cl-vignette-color) 22%,transparent)}#chrome-logo-widget .cl-loading{position:absolute;inset:0;z-index:8;display:grid;place-items:center;background:#100300;transition:opacity .45s ease}#chrome-logo-widget .cl-loading.cl-hide{opacity:0;pointer-events:none}#chrome-logo-widget .cl-loading span{color:rgba(255,255,255,.55); text-transform:uppercase}#chrome-logo-widget .cl-culture-strip{position:absolute;right:16px;bottom:16px;left:74px;z-index:3;display:flex;justify-content:center;gap:7px;pointer-events:none}#chrome-logo-widget .cl-culture-strip span{display:inline-flex;align-items:center;min-height:31px;padding:0 13px;color:rgba(255,255,255,.94);border:1px solid rgba(255,255,255,.3);border-radius:999px;background:linear-gradient(135deg,rgba(255,255,255,.24),rgba(255,255,255,.07));box-shadow:inset 0 1px 0 rgba(255,255,255,.22),0 8px 22px rgba(45,8,0,.16);backdrop-filter:blur(12px) saturate(125%);  line-height:1;text-transform:uppercase;text-shadow:0 1px 8px rgba(47,8,0,.34)}#chrome-logo-widget .cl-config-toggle{position:absolute;left:16px;bottom:16px;z-index:7;display:grid;width:42px;height:42px;margin:0;padding:10px;place-items:center;color:#fff;border:1px solid rgba(255,255,255,.24);border-radius:50%;background:rgba(20,7,2,.72);box-shadow:0 10px 30px rgba(40,8,0,.3);backdrop-filter:blur(14px);cursor:pointer}#chrome-logo-widget .cl-config-toggle svg{display:block;width:100%;fill:currentColor}#chrome-logo-widget .cl-config-toggle:hover,#chrome-logo-widget .cl-config-toggle[aria-expanded=true]{color:#180600;border-color:#ff6b1a;background:#ff6b1a}#chrome-logo-widget .cl-panel{position:absolute;left:16px;bottom:68px;z-index:6;width:min(330px,calc(100% - 32px));max-height:calc(100% - 84px);overflow:auto;padding:16px;color:#eee;border:1px solid #3d2118;border-radius:14px;background:rgba(14,5,2,.9);box-shadow:0 16px 60px rgba(0,0,0,.6);backdrop-filter:blur(16px);opacity:0;visibility:hidden;transform:translateY(10px) scale(.98);transform-origin:left bottom;transition:opacity .18s ease,transform .18s ease,visibility .18s;scrollbar-width:thin;scrollbar-color:#70402e transparent}#chrome-logo-widget .cl-panel.cl-open{opacity:1;visibility:visible;transform:none}#chrome-logo-widget .cl-section{margin:2px 0 13px;padding-top:12px;border-top:1px solid rgba(255,255,255,.09)}#chrome-logo-widget .cl-section:first-child{padding-top:0;border-top:0}#chrome-logo-widget .cl-section-title{margin:0 0 10px;color:#ff9b67; text-transform:uppercase}#chrome-logo-widget .cl-row{display:grid;grid-template-columns:76px 1fr 42px;gap:8px;align-items:center;margin:8px 0;color:#aaa; text-transform:uppercase}#chrome-logo-widget .cl-row output{color:#eee;text-align:right;font-variant-numeric:tabular-nums}#chrome-logo-widget .cl-row.cl-color,#chrome-logo-widget .cl-row.cl-choice{grid-template-columns:76px 1fr}#chrome-logo-widget input,#chrome-logo-widget select,#chrome-logo-widget button{font:inherit}#chrome-logo-widget input[type=range]{width:100%;accent-color:#ff6b1a}#chrome-logo-widget input[type=color]{width:100%;height:24px;padding:0;border:1px solid rgba(255,255,255,.14);border-radius:6px;background:none;cursor:pointer}#chrome-logo-widget select{width:100%;min-width:0;padding:6px 7px;color:#eee;border:1px solid rgba(255,255,255,.14);border-radius:6px;background:#1d0c07; }#chrome-logo-widget .cl-presets,#chrome-logo-widget .cl-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}#chrome-logo-widget .cl-actions{grid-template-columns:1fr 1fr}#chrome-logo-widget .cl-panel button{width:100%;margin-top:6px;padding:9px 5px;color:#ddd;border:1px solid #4b2c22;border-radius:8px;background:#1d0c07; text-transform:uppercase;cursor:pointer}#chrome-logo-widget .cl-panel button:hover,#chrome-logo-widget .cl-panel button.cl-active{color:#180600;border-color:#ff6b1a;background:#ff6b1a}#chrome-logo-widget #logoSource{display:none}@media(max-width:700px){#chrome-logo-widget .cl-config-toggle{left:10px;bottom:10px;width:38px;height:38px}#chrome-logo-widget .cl-panel{left:10px;bottom:58px;width:min(304px,calc(100% - 20px));max-height:calc(100% - 68px)}#chrome-logo-widget .cl-row{grid-template-columns:70px 1fr 36px;margin:6px 0}#chrome-logo-widget .cl-row.cl-color,#chrome-logo-widget .cl-row.cl-choice{grid-template-columns:70px 1fr}#chrome-logo-widget .cl-culture-strip{right:10px;bottom:10px;left:58px;gap:4px}#chrome-logo-widget .cl-culture-strip span{min-height:27px;padding:0 7px;font-size:7px;letter-spacing:.09em}}@media(prefers-reduced-motion:reduce){#chrome-logo-widget .cl-panel{transition:none}}\n@media (max-width:700px){\n  #chrome-logo-widget .cl-logo-canvas,\n  #chrome-logo-widget .cl-logo-canvas:active{\n    pointer-events:none;\n    cursor:default;\n    touch-action:auto;\n  }\n}\n<\/style>\n\n<script data-wp-block-html=\"js\">\n(async () => {\n  \/\/ Gutenberg outputs this script before both the widget markup and import map.\n  \/\/ Wait for the markup, then use absolute ESM URLs so block order is irrelevant.\n  if (document.readyState === 'loading') {\n    await new Promise(resolve => {\n      document.addEventListener('DOMContentLoaded', resolve, { once: true });\n    });\n  }\n\n  const [THREE, svgModule, controlsModule] = await Promise.all([\n    import('https:\/\/esm.sh\/three@0.170.0'),\n    import('https:\/\/esm.sh\/three@0.170.0\/examples\/jsm\/loaders\/SVGLoader.js'),\n    import('https:\/\/esm.sh\/three@0.170.0\/examples\/jsm\/controls\/OrbitControls.js')\n  ]);\n  const { SVGLoader } = svgModule;\n  const { OrbitControls } = controlsModule;\n\n  const widget = document.querySelector('#chrome-logo-widget');\n  if (!widget || widget.dataset.ready) return;\n  widget.dataset.ready = 'true';\n\n  const stage = widget.querySelector('.cl-stage');\n  const $ = selector => widget.querySelector(selector);\n  const $$ = selector => [...widget.querySelectorAll(selector)];\n  const lowPower = (navigator.hardwareConcurrency || 4) <= 4;\n\n  const settings = {\n    logo: {\n      spin: .48, depth: 80, size: 1.2, roughness: .13, reflection: 1,\n      anisotropy: .35, anisotropyRotation: .8,\n      glintStrength: .8, glintSpeed: .22, glintWidth: 22, glintColour: '#fff2dc',\n      colour: '#000000', reflectionMode: 'acid', reflectionRate: 'live',\n      interaction: 'orbit', detail: 'auto', quality: 'low'\n    },\n    finish: {\n      paperGrain: .98, gridStrength: 1, gridSize: 180, vignette: 2,\n      gridA: '#ff0000', gridB: '#ff0000', vignetteColour: '#ff0000',\n      gridBlend: 'multiply'\n    }\n  };\n\n  const waveDefaults = {\n    scale: 1.18, warp: 0, swirl: 2.3, bands: 1, sharpness: 2,\n    balance: .74, waveSpeed: 1, grain: .131, pointerForce: 1.5,\n    paletteMode: 4, loopScale: 1, loopStretch: 1.25, foldStrength: 1,\n    contourCount: 4, contourWidth: .025, contourStrength: 0, regionSoftness: .06,\n    cream: '#ffb48f', orange: '#ff7041', hot: '#ff5128', dark: '#dc3f20',\n    flowStyle: 'vortex'\n  };\n  const wavePresets = {\n    Print: { ...waveDefaults },\n    Coffee: { scale: 1.02, warp: .18, swirl: 1.55, bands: 1.15, sharpness: .72, balance: .52, waveSpeed: .1, grain: .12, pointerForce: .14, paletteMode: 2, loopScale: 1.12, loopStretch: 1.5, foldStrength: 1.28, contourCount: 5, contourWidth: .024, contourStrength: .52, regionSoftness: .045, cream: '#f78252', orange: '#f85426', hot: '#f85426', dark: '#f85426', flowStyle: 'loops' },\n    Pools: { scale: .9, warp: .32, swirl: 1.2, bands: 1.35, sharpness: .55, balance: .44, waveSpeed: .14, grain: .035, pointerForce: .32, paletteMode: 3, loopScale: 1.35, loopStretch: .85, foldStrength: .78, contourCount: 3, contourWidth: .035, contourStrength: .18, regionSoftness: .09, cream: '#fff1d6', orange: '#ff9a4c', hot: '#ff3c16', dark: '#9e1707', flowStyle: 'pools' },\n    Contours: { scale: 1.25, warp: .12, swirl: 1.9, bands: 1.05, sharpness: .9, balance: .6, waveSpeed: .08, grain: .05, pointerForce: .12, paletteMode: 2, loopScale: .9, loopStretch: 1.75, foldStrength: 1.45, contourCount: 9, contourWidth: .016, contourStrength: .78, regionSoftness: .03, cream: '#ffd2aa', orange: '#ec4b20', hot: '#ec4b20', dark: '#ec4b20', flowStyle: 'loops' },\n    Silk: { scale: 1.8, warp: .78, swirl: .75, bands: 3.1, sharpness: .55, balance: .18, waveSpeed: .12, grain: .008, pointerForce: .25, cream: '#fffaf2', orange: '#ffb36b', hot: '#ff7518', dark: '#d74308', flowStyle: 'combed' },\n    Rave: { scale: 2.55, warp: 1.46, swirl: 1.75, bands: 7.3, sharpness: 1.18, balance: .02, waveSpeed: .38, grain: .04, pointerForce: .6, cream: '#fff5df', orange: '#ff9d00', hot: '#ff3d00', dark: '#9f1700', flowStyle: 'vortex' },\n    Marble: { scale: 1.16, warp: .17, swirl: 3, bands: 3, sharpness: .33, balance: .68, waveSpeed: .37, grain: .15, pointerForce: .42, cream: '#fff9ef', orange: '#ff9b3d', hot: '#ff5a0a', dark: '#b92d00', flowStyle: 'combed' },\n    Molten: { scale: 1.55, warp: 1.7, swirl: 2.05, bands: 2.4, sharpness: .42, balance: .27, waveSpeed: .18, grain: .02, pointerForce: .74, cream: '#fff4e2', orange: '#ff8a22', hot: '#f44800', dark: '#741900', flowStyle: 'vortex' }\n  };\n  const culturePresets = {\n    sun: { line: 'Heat, freedom and football after dark.', waves: { scale: 1.1, warp: .18, swirl: 1.7, bands: 2.2, sharpness: .75, balance: .58, waveSpeed: .1, grain: .09, pointerForce: .32, paletteMode: 3, loopScale: 1.2, loopStretch: 1.55, foldStrength: 1.15, contourCount: 4, contourWidth: .026, contourStrength: .25, regionSoftness: .07, cream: '#ffd28b', orange: '#ff7c21', hot: '#ef3011', dark: '#7c1208', flowStyle: 'loops' }, finish: { paperGrain: .6, gridStrength: .35, gridSize: 140, vignette: 1.15, gridA: '#ffb44d', gridB: '#ffe0a1', vignetteColour: '#6d1408', gridBlend: 'soft-light' } },\n    sea: { line: 'Salt water, open horizons and movement.', waves: { scale: 1.05, warp: .34, swirl: 1.15, bands: 1.2, sharpness: .5, balance: .42, waveSpeed: .13, grain: .045, pointerForce: .42, paletteMode: 3, loopScale: 1.35, loopStretch: .9, foldStrength: .82, contourCount: 3, contourWidth: .035, contourStrength: .16, regionSoftness: .1, cream: '#d9fff3', orange: '#44d5d0', hot: '#087aaf', dark: '#062d62', flowStyle: 'pools' }, finish: { paperGrain: .22, gridStrength: .22, gridSize: 120, vignette: .8, gridA: '#8cf5e9', gridB: '#b8fff7', vignetteColour: '#062e5d', gridBlend: 'screen' } },\n    sand: { line: 'Barefoot football where the street meets the coast.', waves: { scale: .92, warp: .1, swirl: .7, bands: 1.05, sharpness: .38, balance: .52, waveSpeed: .055, grain: .17, pointerForce: .15, paletteMode: 3, loopScale: 1.65, loopStretch: 1.8, foldStrength: .72, contourCount: 2, contourWidth: .045, contourStrength: .11, regionSoftness: .14, cream: '#fff1c4', orange: '#e5b66c', hot: '#bd7942', dark: '#5d3a22', flowStyle: 'combed' }, finish: { paperGrain: .92, gridStrength: .08, gridSize: 180, vignette: .65, gridA: '#fff0bf', gridB: '#d9ac67', vignetteColour: '#493021', gridBlend: 'multiply' } },\n    snow: { line: 'Cold air, bright streets and football through winter.', waves: { scale: 1.12, warp: .48, swirl: 1.35, bands: 2.8, sharpness: .62, balance: .48, waveSpeed: 0, grain: .12, pointerForce: 0, paletteMode: 4, loopScale: 1.3, loopStretch: 1.1, foldStrength: 1.08, contourCount: 6, contourWidth: .022, contourStrength: .46, regionSoftness: .065, cream: '#ffffff', orange: '#dff6ff', hot: '#91cde8', dark: '#183f68', flowStyle: 'pools' }, finish: { paperGrain: .74, gridStrength: .18, gridSize: 128, vignette: .88, gridA: '#ffffff', gridB: '#bcecff', vignetteColour: '#12385f', gridBlend: 'screen' } },\n    style: { line: 'A statement on the pitch, in the crowd and beyond.', waves: { scale: 1.42, warp: .35, swirl: 2.15, bands: 5.2, sharpness: 1.05, balance: .18, waveSpeed: .09, grain: .035, pointerForce: .28, paletteMode: 4, loopScale: .8, loopStretch: 1.8, foldStrength: 1.42, contourCount: 8, contourWidth: .014, contourStrength: .72, regionSoftness: .025, cream: '#fff9ec', orange: '#ff4326', hot: '#3d1528', dark: '#080808', flowStyle: 'loops' }, finish: { paperGrain: .16, gridStrength: .52, gridSize: 92, vignette: 1.4, gridA: '#ffffff', gridB: '#ff4930', vignetteColour: '#050505', gridBlend: 'screen' } },\n    sound: { line: 'Bass, crowd noise and a place coming alive.', waves: { scale: 1.85, warp: 1.05, swirl: 2.55, bands: 7.6, sharpness: 1.12, balance: .08, waveSpeed: .28, grain: .07, pointerForce: .7, paletteMode: 4, loopScale: .72, loopStretch: 1.15, foldStrength: 1.75, contourCount: 7, contourWidth: .018, contourStrength: .42, regionSoftness: .04, cream: '#ffccb8', orange: '#f34920', hot: '#ad124a', dark: '#1a0725', flowStyle: 'vortex' }, finish: { paperGrain: .4, gridStrength: .34, gridSize: 74, vignette: 1.55, gridA: '#ff4d2a', gridB: '#d93d90', vignetteColour: '#130419', gridBlend: 'screen' } }\n  };\n  const cultureStyle = document.createElement('style');\n  cultureStyle.textContent = `#chrome-logo-widget .cl-culture-strip{right:16px!important;bottom:16px!important;left:16px!important;z-index:10!important;display:block!important;gap:0!important;padding:7px!important;border:1px solid rgba(255,255,255,.18);border-radius:18px;background:linear-gradient(135deg,rgba(16,4,3,.82),rgba(38,8,5,.68));box-shadow:inset 0 1px 0 rgba(255,255,255,.12),0 12px 34px rgba(20,2,0,.34);backdrop-filter:blur(18px) saturate(120%);pointer-events:auto!important}#chrome-logo-widget .cl-culture-actions{display:grid!important;grid-template-columns:repeat(6,minmax(0,1fr));width:100%!important;gap:0!important}#chrome-logo-widget .cl-culture-button{min-width:0;margin:0!important;padding:10px 8px!important;color:rgba(255,255,255,.92)!important;border:0!important;border-right:1px solid rgba(255,255,255,.14)!important;border-radius:0!important;background:transparent!important;box-shadow:none!important;font-size:clamp(8px,.7vw,10px);line-height:1;cursor:pointer!important;touch-action:manipulation;transition:background .35s ease,color .35s ease}#chrome-logo-widget .cl-culture-button:first-child{border-radius:11px 0 0 11px!important}#chrome-logo-widget .cl-culture-button:last-child{border-right:0!important;border-radius:0 11px 11px 0!important}#chrome-logo-widget .cl-culture-button strong{display:block;font-weight:750;letter-spacing:.16em;text-transform:uppercase}#chrome-logo-widget .cl-culture-button small{display:block;margin-top:6px;color:rgba(255,255,255,.55);font-size:clamp(6px,.55vw,8px);font-weight:500;letter-spacing:.01em;line-height:1.25;text-transform:none}#chrome-logo-widget .cl-culture-button:hover,#chrome-logo-widget .cl-culture-button.cl-active{color:#fff!important;background:linear-gradient(135deg,rgba(112,24,13,.72),rgba(211,54,26,.5))!important}#chrome-logo-widget .cl-culture-button.cl-active small{color:rgba(255,241,225,.92)}#chrome-logo-widget .cl-config-toggle{top:16px!important;bottom:auto!important;z-index:30!important}#chrome-logo-widget .cl-panel{top:68px!important;bottom:auto!important;z-index:31!important;max-height:calc(100% - 84px)!important}@media(max-width:700px){#chrome-logo-widget .cl-culture-strip{right:10px!important;bottom:10px!important;left:10px!important;padding:5px!important;border-radius:14px}#chrome-logo-widget .cl-culture-button{padding:8px 3px!important}#chrome-logo-widget .cl-culture-button strong{font-size:7px;letter-spacing:.08em}#chrome-logo-widget .cl-culture-button small{margin-top:4px;font-size:5.5px;letter-spacing:0;line-height:1.15}#chrome-logo-widget .cl-config-toggle{top:10px!important;bottom:auto!important}#chrome-logo-widget .cl-panel{top:58px!important;bottom:auto!important}}`;\n  document.head.append(cultureStyle);\n  let waveConfig = { ...waveDefaults };\n  let wavesRunning = true;\n  let logoRunning = true;\n  let componentVisible = true;\n\n  const acidUniforms = {\n    uTime: { value: 0 },\n    uScale: { value: waveConfig.scale },\n    uWarp: { value: waveConfig.warp },\n    uSwirl: { value: waveConfig.swirl },\n    uBands: { value: waveConfig.bands },\n    uSharpness: { value: waveConfig.sharpness },\n    uBalance: { value: waveConfig.balance },\n    uGrain: { value: waveConfig.grain },\n    uPointerForce: { value: waveConfig.pointerForce },\n    uFlowStyle: { value: 1 },\n    uPaletteMode: { value: waveConfig.paletteMode },\n    uLoopScale: { value: waveConfig.loopScale },\n    uLoopStretch: { value: waveConfig.loopStretch },\n    uFoldStrength: { value: waveConfig.foldStrength },\n    uContourCount: { value: waveConfig.contourCount },\n    uContourWidth: { value: waveConfig.contourWidth },\n    uContourStrength: { value: waveConfig.contourStrength },\n    uRegionSoftness: { value: waveConfig.regionSoftness },\n    uPointer: { value: new THREE.Vector2(.5, .5) },\n    uCream: { value: new THREE.Color(waveConfig.cream) },\n    uOrange: { value: new THREE.Color(waveConfig.orange) },\n    uHot: { value: new THREE.Color(waveConfig.hot) },\n    uDark: { value: new THREE.Color(waveConfig.dark) }\n  };\n\n  const acidFragment = `\n    precision highp float;\n    varying vec2 vUv;\n    uniform float uTime,uScale,uWarp,uSwirl,uBands,uSharpness,uBalance,uGrain,uPointerForce,uFlowStyle;\n    uniform float uPaletteMode,uLoopScale,uLoopStretch,uFoldStrength,uContourCount,uContourWidth,uContourStrength,uRegionSoftness;\n    uniform vec2 uPointer;\n    uniform vec3 uCream,uOrange,uHot,uDark;\n    mat2 rot(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);}\n    vec2 vortex(vec2 p,vec2 c,float strength,float falloff){vec2 d=p-c;float pull=exp(-dot(d,d)*falloff)*strength;return c+rot(pull)*d;}\n    float hash21(vec2 p){p=fract(p*vec2(123.34,456.21));p+=dot(p,p+45.32);return fract(p.x*p.y);}\n    float noise(vec2 p){vec2 i=floor(p),f=fract(p);f=f*f*(3.0-2.0*f);return mix(mix(hash21(i),hash21(i+vec2(1,0)),f.x),mix(hash21(i+vec2(0,1)),hash21(i+1.0),f.x),f.y);}\n    float fbm(vec2 p){float f=0.,a=.5;mat2 m=rot(.58);for(int i=0;i<5;i++){f+=a*noise(p);p=m*p*2.03+7.1;a*=.5;}return f;}\n    vec3 palette(float x){\n      float soft=max(.002,uRegionSoftness);\n      if(uPaletteMode<2.5) return mix(uCream,uOrange,smoothstep(.5-soft,.5+soft,x));\n      if(uPaletteMode<3.5){\n        float a=smoothstep(.3-soft,.3+soft,x),b=smoothstep(.7-soft,.7+soft,x);\n        return mix(mix(uCream,uOrange,a),uHot,b);\n      }\n      float a=smoothstep(.08,.38,x),b=smoothstep(.36,.63,x),c=smoothstep(.68,.9,x);\n      return mix(mix(mix(uCream,uOrange,a),uHot,b),uDark,c);\n    }\n    void main(){\n      vec2 uv=vUv;\n      float t=uTime;\n      vec2 p=(uv-.5)*vec2(4.5,3.0)*uScale;\n      vec2 pd=(uv-uPointer)*vec2(2.,1.);\n      float influence=exp(-dot(pd,pd)*2.)*uPointerForce;\n      p=rot(influence*.65)*p+vec2(-pd.y,pd.x)*influence*.25;\n\n      vec2 original=p;\n      vec2 local=p;\n      local=vortex(local,vec2(-1.25+sin(t*.17)*.28,.55+cos(t*.11)*.22),uSwirl*.72,.72);\n      local=vortex(local,vec2(1.05+cos(t*.13)*.35,-.55+sin(t*.19)*.2),-uSwirl*.58,.86);\n      local=vortex(local,vec2(.1+sin(t*.09)*.25,.05+cos(t*.16)*.28),uSwirl*.32,1.45);\n      local.x+=sin(local.y*1.35+t*.23)*uSwirl*.07;\n\n      vec2 combed=p;\n      combed.x+=sin(combed.y*1.2+t*.31)*uSwirl*.38;\n      p=uFlowStyle<.5?combed:local;\n\n      vec2 q=vec2(fbm(p+vec2(t*.12,-t*.07)),fbm(p+vec2(5.2,-3.7)-t*.09));\n      vec2 r=vec2(fbm(p+uWarp*q*1.8+vec2(1.7,9.2)+t*.08),fbm(p+uWarp*q*1.5+vec2(8.3,2.8)-t*.06));\n      vec2 w=p+uWarp*(r-.5)*2.4;\n      float flow=w.x*.22+w.y*.48+fbm(w*1.08+uSwirl*r)*1.75+.16*sin(w.x*1.4-w.y*.7+t*.25);\n\n      if(uFlowStyle>1.5&&uFlowStyle<2.5){\n        vec2 lp=original\/max(.2,uLoopScale);\n        lp.x\/=max(.25,uLoopStretch);\n        lp=vortex(lp,vec2(-1.05+.18*sin(t*.08),.42),uSwirl*.58,.42);\n        lp=vortex(lp,vec2(.92,-.38+.16*cos(t*.07)),-uSwirl*.52,.48);\n        lp=vortex(lp,vec2(.08,.05),uSwirl*.24,.9);\n        vec2 smoothWarp=vec2(noise(lp*.34+vec2(t*.025,0.)),noise(lp*.34+vec2(6.1,2.7)-vec2(0.,t*.021)));\n        lp+=(smoothWarp-.5)*uFoldStrength*1.45;\n        flow=lp.y*.34+sin(lp.x*.72+sin(lp.y*.68+t*.035))*.31+noise(lp*.3)*uFoldStrength*1.15;\n      }else if(uFlowStyle>2.5){\n        vec2 pp=original\/max(.2,uLoopScale);\n        pp.x\/=max(.25,uLoopStretch);\n        vec2 c1=vec2(-.9+.22*sin(t*.07),.25+.18*cos(t*.05));\n        vec2 c2=vec2(.75+.18*cos(t*.06),-.35+.2*sin(t*.08));\n        vec2 c3=vec2(.15+.12*sin(t*.04),.72);\n        float blobs=exp(-dot(pp-c1,pp-c1)*.6)+exp(-dot(pp-c2,pp-c2)*.72)+.72*exp(-dot(pp-c3,pp-c3)*.85);\n        flow=blobs*uFoldStrength+noise(pp*.38+vec2(t*.018,-t*.014))*.62+pp.x*.06;\n      }\n      float folded=abs(fract(flow*uBands+uBalance)-.5)*2.;\n      float ink=smoothstep(.16,.88,pow(folded,max(.25,uSharpness)));\n      float fine=pow(.5+.5*cos(6.28318*(flow*uBands*2.+.12)),10.);\n      ink=clamp(ink-fine*.16,0.,1.);\n      vec3 colour=palette(ink);\n      float contourDistance=abs(fract(flow*max(1.,uContourCount)+uBalance)-.5);\n      float contour=1.-smoothstep(uContourWidth,uContourWidth*2.2,contourDistance);\n      colour=mix(colour,uCream,contour*uContourStrength);\n      colour+=vec3(hash21(gl_FragCoord.xy+fract(uTime)*91.7)-.5)*uGrain;\n      gl_FragColor=vec4(colour,1.);\n    }\n  `;\n\n  const planeVertex = `varying vec2 vUv;void main(){vUv=uv;gl_Position=vec4(position.xy,0.,1.);}`;\n  const sphereVertex = `\n    varying vec2 vUv;\n    void main(){\n      vec3 d=normalize(position);\n      vUv=vec2(atan(d.z,d.x)\/6.283185+.5,asin(d.y)\/3.141593+.5);\n      gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.);\n    }\n  `;\n\n  \/\/ The background owns its own flat, orthographic renderer. Camera movement\n  \/\/ in the chrome scene therefore cannot rotate or distort it.\n  const bgCanvas = $('.cl-wave-canvas');\n  const bgRenderer = new THREE.WebGLRenderer({ canvas: bgCanvas, antialias: false, powerPreference: 'high-performance' });\n  const bgScene = new THREE.Scene();\n  const bgCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n  const bgMaterial = new THREE.ShaderMaterial({ uniforms: acidUniforms, vertexShader: planeVertex, fragmentShader: acidFragment, depthWrite: false });\n  bgScene.add(new THREE.Mesh(new THREE.PlaneGeometry(2, 2), bgMaterial));\n\n  const scene = new THREE.Scene();\n  const camera = new THREE.PerspectiveCamera(28, stage.clientWidth \/ stage.clientHeight, .1, 4000);\n  camera.position.set(0, -40, 1150);\n  const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: !lowPower, powerPreference: 'high-performance' });\n  renderer.domElement.className = 'cl-logo-canvas';\n  renderer.setClearColor(0x000000, 0);\n  renderer.outputColorSpace = THREE.SRGBColorSpace;\n  renderer.toneMapping = THREE.ACESFilmicToneMapping;\n  renderer.toneMappingExposure = 1.35;\n  stage.append(renderer.domElement);\n\n  const orbit = new OrbitControls(camera, renderer.domElement);\n  orbit.enableDamping = true;\n  orbit.dampingFactor = .06;\n  orbit.enablePan = false;\n  orbit.enableZoom = false; \/\/ the page keeps normal wheel scrolling\n  orbit.minPolarAngle = .55;\n  orbit.maxPolarAngle = 2.58;\n  orbit.target.set(0, 0, 0);\n  orbit.enabled = false;\n\n  const acidMaterial = new THREE.ShaderMaterial({ side: THREE.BackSide, uniforms: acidUniforms, vertexShader: sphereVertex, fragmentShader: acidFragment, depthWrite: false });\n  const acidWorld = new THREE.Mesh(new THREE.SphereGeometry(1550, lowPower ? 20 : 28, lowPower ? 12 : 18), acidMaterial);\n  acidWorld.layers.set(1);\n  scene.add(acidWorld);\n  const cubeTarget = new THREE.WebGLCubeRenderTarget(lowPower ? 64 : 128, { type: THREE.HalfFloatType, generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter });\n  const cubeCamera = new THREE.CubeCamera(1, 1600, cubeTarget);\n  cubeCamera.layers.set(1);\n  scene.add(cubeCamera);\n\n  const pmrem = new THREE.PMREMGenerator(renderer);\n  const studioScene = new THREE.Scene();\n  studioScene.background = new THREE.Color(0x090909);\n  for (const [colour, position, scale] of [\n    [0xffffff, [-4, 4, 5], [6, 2, 1]],\n    [0xff6a18, [5, -2, 3], [3, 6, 1]],\n    [0xfff0dc, [0, -5, -1], [7, 2, 1]],\n    [0x351105, [-5, 0, -4], [3, 7, 1]]\n  ]) {\n    const card = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), new THREE.MeshBasicMaterial({ color: colour }));\n    card.position.set(...position); card.scale.set(...scale); card.lookAt(0, 0, 0); studioScene.add(card);\n  }\n  const studioMap = pmrem.fromScene(studioScene, .05).texture;\n\n  const material = new THREE.MeshPhysicalMaterial({\n    color: settings.logo.colour, metalness: 1, roughness: settings.logo.roughness,\n    clearcoat: 1, clearcoatRoughness: .015, envMap: cubeTarget.texture,\n    envMapIntensity: settings.logo.reflection, anisotropy: settings.logo.anisotropy,\n    anisotropyRotation: settings.logo.anisotropyRotation, side: THREE.DoubleSide\n  });\n\n  const logo = new THREE.Group();\n  scene.add(logo);\n  const svgData = new SVGLoader().parse($('#logoSource').outerHTML);\n  let rawLogoWidth = 2255;\n  let detailUsed = '';\n  let depthUsed = -1;\n  let rebuildTimer;\n  let meshBuilding = false;\n  let acidEnvironmentReady = false;\n\n  function inside(point, polygon) {\n    let hit = false;\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n      const a = polygon[i], b = polygon[j];\n      if (((a.y > point.y) !== (b.y > point.y)) && point.x < (b.x - a.x) * (point.y - a.y) \/ (b.y - a.y) + a.x) hit = !hit;\n    }\n    return hit;\n  }\n\n  function resolvedDetail() {\n    if (settings.logo.detail !== 'auto') return settings.logo.detail;\n    return lowPower ? 'low' : 'balanced';\n  }\n\n  function buildLogo() {\n    if (meshBuilding) return;\n    meshBuilding = true;\n    const detail = resolvedDetail();\n    const profiles = {\n      low: { curve: 8, bevel: 4, hole: 20, owner: 150 },\n      balanced: { curve: 18, bevel: 8, hole: 38, owner: 300 },\n      smooth: { curve: 24, bevel: 10, hole: 48, owner: 420 }\n    };\n    const profile = profiles[detail];\n    const nextMeshes = [];\n    try {\n      const shapes = SVGLoader.createShapes(svgData.paths[0]);\n      for (const knockout of svgData.paths.slice(1)) {\n        for (const hole of SVGLoader.createShapes(knockout)) {\n          const points = hole.getSpacedPoints(profile.hole);\n          const probe = points.reduce((sum, point) => sum.add(point), new THREE.Vector2()).multiplyScalar(1 \/ points.length);\n          const owner = shapes.find(shape => inside(probe, shape.getSpacedPoints(profile.owner)));\n          if (owner) owner.holes.push(hole);\n        }\n      }\n      const geometries = [];\n      const bounds = new THREE.Box3();\n      for (const shape of shapes) {\n        const geometry = new THREE.ExtrudeGeometry(shape, {\n          depth: settings.logo.depth, steps: 1, curveSegments: profile.curve,\n          bevelEnabled: true, bevelThickness: 5.2, bevelSize: 3.6,\n          bevelSegments: profile.bevel\n        });\n        geometry.computeBoundingBox(); bounds.union(geometry.boundingBox); geometries.push(geometry);\n      }\n      const size = bounds.getSize(new THREE.Vector3());\n      const centre = bounds.getCenter(new THREE.Vector3());\n      for (const geometry of geometries) {\n        geometry.translate(-centre.x, -centre.y, -centre.z);\n        geometry.computeVertexNormals();\n        nextMeshes.push(new THREE.Mesh(geometry, material));\n      }\n\n      const oldMeshes = [...logo.children];\n      logo.clear();\n      logo.add(...nextMeshes);\n      oldMeshes.forEach(mesh => mesh.geometry.dispose());\n      rawLogoWidth = size.x;\n      detailUsed = detail;\n      depthUsed = settings.logo.depth;\n      logo.position.set(0, 0, 0);\n      fitLogo();\n      acidEnvironmentReady = false;\n    } catch (error) {\n      nextMeshes.forEach(mesh => mesh.geometry.dispose());\n      console.error('Logo mesh rebuild failed; keeping previous mesh.', error);\n    } finally {\n      meshBuilding = false;\n    }\n  }\n\n  function queueLogoBuild(delay = 80) {\n    clearTimeout(rebuildTimer);\n    rebuildTimer = setTimeout(buildLogo, delay);\n  }\n\n  function fitLogo() {\n    const distance = camera.position.z;\n    const visibleHeight = 2 * Math.tan(THREE.MathUtils.degToRad(camera.fov * .5)) * distance;\n    const visibleWidth = visibleHeight * camera.aspect;\n    const desired = Math.min(visibleWidth * (stage.clientWidth < 700 ? .88 : .72), 850);\n    logo.scale.setScalar(desired \/ rawLogoWidth * settings.logo.size);\n  }\n\n  buildLogo();\n  const key = new THREE.DirectionalLight(0xffffff, 7); key.position.set(-450, -300, 650); scene.add(key);\n  const rim = new THREE.DirectionalLight(0xffe5d2, 9); rim.position.set(500, 180, -320); scene.add(rim);\n  const warm = new THREE.PointLight(0xff5a0a, 120, 1300); warm.position.set(-500, 220, 180); scene.add(warm);\n  const glint = new THREE.SpotLight(settings.logo.glintColour, settings.logo.glintStrength * 260, 2200, THREE.MathUtils.degToRad(settings.logo.glintWidth), .72, 1);\n  glint.position.set(-900, -180, 520);\n  glint.target = logo;\n  scene.add(glint);\n\n  let spinAngle = -.12, dragPitch = 0, dragYaw = 0, dragging = false;\n  const lastPointer = new THREE.Vector2();\n  renderer.domElement.addEventListener('pointerdown', event => {\n    if (settings.logo.interaction !== 'direct') return;\n    dragging = true; lastPointer.set(event.clientX, event.clientY); renderer.domElement.setPointerCapture(event.pointerId);\n  });\n  renderer.domElement.addEventListener('pointermove', event => {\n    if (!dragging || settings.logo.interaction !== 'direct') return;\n    dragYaw += (event.clientX - lastPointer.x) * .006;\n    dragPitch = THREE.MathUtils.clamp(dragPitch + (event.clientY - lastPointer.y) * .004, -.75, .75);\n    lastPointer.set(event.clientX, event.clientY);\n  });\n  renderer.domElement.addEventListener('pointerup', event => {\n    if (!dragging) return;\n    dragging = false; renderer.domElement.releasePointerCapture(event.pointerId);\n  });\n  renderer.domElement.addEventListener('dblclick', () => {\n    spinAngle = -.12; dragPitch = 0; dragYaw = 0;\n    camera.position.set(0, -40, 1150); orbit.target.set(0, 0, 0); orbit.update();\n    settings.logo.size = 1.2; $('#cl-size').value = 1.2; updateOutput($('#cl-size'));\n    fitLogo();\n  });\n\n  function updateOutput(input) {\n    const output = input.closest('.cl-row')?.querySelector('output');\n    if (!output) return;\n    const step = Number(input.step);\n    const decimals = step < .01 ? 3 : step < 1 ? 2 : 0;\n    output.value = Number(input.value).toFixed(decimals);\n  }\n\n  function bindRange(id, fn) {\n    const input = $(id);\n    input.addEventListener('input', () => { updateOutput(input); fn(Number(input.value)); });\n  }\n\n  bindRange('#cl-spin', value => settings.logo.spin = value);\n  bindRange('#cl-depth', value => {\n    settings.logo.depth = value;\n    queueLogoBuild(140);\n  });\n  bindRange('#cl-size', value => { settings.logo.size = value; fitLogo(); });\n  bindRange('#cl-rough', value => { settings.logo.roughness = value; material.roughness = value; });\n  bindRange('#cl-reflect', value => { settings.logo.reflection = value; material.envMapIntensity = value; });\n  bindRange('#cl-anisotropy', value => { settings.logo.anisotropy = value; material.anisotropy = value; material.needsUpdate = true; });\n  bindRange('#cl-anisotropy-rotation', value => { settings.logo.anisotropyRotation = value; material.anisotropyRotation = value; });\n  bindRange('#cl-glint-strength', value => { settings.logo.glintStrength = value; glint.intensity = value * 260; });\n  bindRange('#cl-glint-speed', value => settings.logo.glintSpeed = value);\n  bindRange('#cl-glint-width', value => { settings.logo.glintWidth = value; glint.angle = THREE.MathUtils.degToRad(value); });\n  $('#cl-glint-colour').addEventListener('input', event => { settings.logo.glintColour = event.target.value; glint.color.set(event.target.value); });\n  $('#cl-logo-color').addEventListener('input', event => { settings.logo.colour = event.target.value; material.color.set(event.target.value); });\n  $('#cl-reflection-mode').addEventListener('change', event => { settings.logo.reflectionMode = event.target.value; material.envMap = event.target.value === 'acid' ? cubeTarget.texture : studioMap; material.needsUpdate = true; });\n  $('#cl-reflection-rate').addEventListener('change', event => settings.logo.reflectionRate = event.target.value);\n  $('#cl-interaction').addEventListener('change', event => { settings.logo.interaction = event.target.value; orbit.enabled = event.target.value === 'orbit'; });\n  $('#cl-detail').addEventListener('change', event => { settings.logo.detail = event.target.value; queueLogoBuild(); });\n  $('#cl-quality').addEventListener('change', event => { settings.logo.quality = event.target.value; resize(); });\n  $('#cl-pause-logo').addEventListener('click', event => { logoRunning = !logoRunning; event.target.textContent = logoRunning ? 'Pause rotation' : 'Resume rotation'; });\n\n  const waveSpecs = [\n    ['scale', 'Scale', .7, 4, .01], ['warp', 'Distortion', 0, 2.5, .01],\n    ['swirl', 'Swirl', 0, 3, .01], ['bands', 'Stripe density', 1, 12, .1],\n    ['sharpness', 'Sharpness', .2, 2, .01], ['balance', 'Balance', 0, 1, .01],\n    ['waveSpeed', 'Motion', 0, 1, .01], ['grain', 'Shader grain', 0, .3, .001],\n    ['pointerForce', 'Pointer pull', 0, 1.5, .01], ['loopScale', 'Loop size', .35, 2.5, .01],\n    ['loopStretch', 'Loop stretch', .25, 3, .01], ['foldStrength', 'Fold strength', 0, 2.5, .01],\n    ['contourCount', 'Contour count', 1, 14, .1], ['contourWidth', 'Contour width', .004, .09, .001],\n    ['contourStrength', 'Contour mix', 0, 1, .01], ['regionSoftness', 'Edge softness', .002, .2, .001],\n    ['cream', 'Colour 1'], ['orange', 'Colour 2'], ['hot', 'Colour 3'], ['dark', 'Colour 4']\n  ];\n  const waveWrap = $('#cl-wave-controls');\n  for (const [key, label, min, max, step] of waveSpecs) {\n    const colour = min === undefined;\n    waveWrap.insertAdjacentHTML('beforeend', `<div class=\"cl-row ${colour ? 'cl-color' : ''}\"><label for=\"cl-wave-${key}\">${label}<\/label><input id=\"cl-wave-${key}\" data-wave=\"${key}\" type=\"${colour ? 'color' : 'range'}\" ${colour ? '' : `min=\"${min}\" max=\"${max}\" step=\"${step}\"`}><output><\/output><\/div>`);\n  }\n  const uniformNames = {\n    scale: 'uScale', warp: 'uWarp', swirl: 'uSwirl', bands: 'uBands', sharpness: 'uSharpness',\n    balance: 'uBalance', grain: 'uGrain', pointerForce: 'uPointerForce', loopScale: 'uLoopScale',\n    loopStretch: 'uLoopStretch', foldStrength: 'uFoldStrength', contourCount: 'uContourCount',\n    contourWidth: 'uContourWidth', contourStrength: 'uContourStrength', regionSoftness: 'uRegionSoftness',\n    cream: 'uCream', orange: 'uOrange', hot: 'uHot', dark: 'uDark'\n  };\n\n  function applyWave(next) {\n    Object.assign(waveConfig, next);\n    if (next.flowStyle) $('#cl-flow-style').value = next.flowStyle;\n    if (next.paletteMode !== undefined) $('#cl-palette-mode').value = String(next.paletteMode);\n    acidUniforms.uFlowStyle.value = ({ combed: 0, vortex: 1, loops: 2, pools: 3 })[waveConfig.flowStyle] ?? 1;\n    acidUniforms.uPaletteMode.value = Number(waveConfig.paletteMode);\n    for (const [key, , , , step] of waveSpecs) {\n      const input = $(`#cl-wave-${key}`);\n      const value = waveConfig[key];\n      input.value = value;\n      const output = input.closest('.cl-row').querySelector('output');\n      output.value = typeof value === 'number' ? value.toFixed(step < .01 ? 3 : 2) : '';\n      const uniform = acidUniforms[uniformNames[key]];\n      if (uniform) typeof value === 'string' ? uniform.value.set(value) : uniform.value = value;\n    }\n    $$('[data-preset]').forEach(button => {\n      const preset = wavePresets[button.dataset.preset];\n      const completePreset = { ...waveDefaults, ...preset };\n      button.classList.toggle('cl-active', Object.keys(completePreset).every(key => completePreset[key] === waveConfig[key]));\n    });\n  }\n\n  waveWrap.addEventListener('input', event => {\n    const key = event.target.dataset.wave;\n    if (!key) return;\n    applyWave({ [key]: event.target.type === 'color' ? event.target.value : Number(event.target.value) });\n  });\n  $$('[data-preset]').forEach(button => button.addEventListener('click', () => applyWave({ ...waveDefaults, ...wavePresets[button.dataset.preset] })));\n  $('#cl-flow-style').addEventListener('change', event => applyWave({ flowStyle: event.target.value }));\n  $('#cl-palette-mode').addEventListener('change', event => applyWave({ paletteMode: Number(event.target.value) }));\n  $('#cl-pause-waves').addEventListener('click', event => { wavesRunning = !wavesRunning; event.target.textContent = wavesRunning ? 'Pause waves' : 'Resume waves'; });\n  $('#cl-reset-waves').addEventListener('click', () => applyWave(waveDefaults));\n  $('#cl-randomise').addEventListener('click', () => applyWave({\n    scale: 1 + Math.random() * 2.4, warp: .4 + Math.random() * 2,\n    swirl: .3 + Math.random() * 2.7, bands: 1.5 + Math.random() * 9,\n    sharpness: .3 + Math.random() * 1.5, balance: Math.random(),\n    waveSpeed: .08 + Math.random() * .55, grain: Math.random() * .15,\n    pointerForce: Math.random(), loopScale: .55 + Math.random() * 1.5,\n    loopStretch: .45 + Math.random() * 2.1, foldStrength: Math.random() * 2,\n    contourCount: 2 + Math.random() * 10, contourWidth: .008 + Math.random() * .05,\n    contourStrength: Math.random() * .8, regionSoftness: .01 + Math.random() * .12\n  }));\n\n  bindRange('#cl-paper-grain', value => { settings.finish.paperGrain = value; $('.cl-grain').style.opacity = value; });\n  bindRange('#cl-grid-strength', value => { settings.finish.gridStrength = value; $('.cl-retro').style.opacity = value; });\n  bindRange('#cl-grid-size', value => { settings.finish.gridSize = value; $('.cl-retro').style.setProperty('--cl-grid-size', `${value}px`); });\n  bindRange('#cl-vignette', value => { settings.finish.vignette = value; $('.cl-retro').style.setProperty('--cl-vignette', value); });\n  for (const [id, key, property] of [\n    ['#cl-grid-color-a', 'gridA', '--cl-grid-a'],\n    ['#cl-grid-color-b', 'gridB', '--cl-grid-b'],\n    ['#cl-vignette-color', 'vignetteColour', '--cl-vignette-color']\n  ]) $(id).addEventListener('input', event => { settings.finish[key] = event.target.value; $('.cl-retro').style.setProperty(property, event.target.value); });\n  $('#cl-grid-blend').addEventListener('change', event => { settings.finish.gridBlend = event.target.value; $('.cl-retro').style.mixBlendMode = event.target.value; });\n\n  function setControl(id, value) {\n    const input = $(id);\n    if (!input || value === undefined) return;\n    input.value = value;\n    if (input.type === 'range') updateOutput(input);\n  }\n\n  function applyConfig(config, rebuild = true) {\n    if (!config || typeof config !== 'object') throw new TypeError('Config must be a JSON object.');\n    const previousDepth = settings.logo.depth;\n    const previousDetail = settings.logo.detail;\n    if (config.logo) Object.assign(settings.logo, config.logo);\n    if (config.finish) Object.assign(settings.finish, config.finish);\n    if (config.waves) applyWave(config.waves);\n\n    for (const [id, key] of [\n      ['#cl-spin', 'spin'], ['#cl-depth', 'depth'], ['#cl-size', 'size'],\n      ['#cl-rough', 'roughness'], ['#cl-reflect', 'reflection'],\n      ['#cl-anisotropy', 'anisotropy'], ['#cl-anisotropy-rotation', 'anisotropyRotation'],\n      ['#cl-glint-strength', 'glintStrength'], ['#cl-glint-speed', 'glintSpeed'],\n      ['#cl-glint-width', 'glintWidth'], ['#cl-glint-colour', 'glintColour'],\n      ['#cl-logo-color', 'colour'], ['#cl-reflection-mode', 'reflectionMode'],\n      ['#cl-reflection-rate', 'reflectionRate'], ['#cl-interaction', 'interaction'],\n      ['#cl-detail', 'detail'], ['#cl-quality', 'quality']\n    ]) setControl(id, settings.logo[key]);\n    for (const [id, key] of [\n      ['#cl-paper-grain', 'paperGrain'], ['#cl-grid-strength', 'gridStrength'],\n      ['#cl-grid-size', 'gridSize'], ['#cl-vignette', 'vignette'],\n      ['#cl-grid-color-a', 'gridA'], ['#cl-grid-color-b', 'gridB'],\n      ['#cl-vignette-color', 'vignetteColour'], ['#cl-grid-blend', 'gridBlend']\n    ]) setControl(id, settings.finish[key]);\n\n    material.color.set(settings.logo.colour);\n    material.roughness = settings.logo.roughness;\n    material.envMapIntensity = settings.logo.reflection;\n    material.anisotropy = settings.logo.anisotropy;\n    material.anisotropyRotation = settings.logo.anisotropyRotation;\n    material.envMap = settings.logo.reflectionMode === 'acid' ? cubeTarget.texture : studioMap;\n    material.needsUpdate = true;\n    glint.intensity = settings.logo.glintStrength * 260;\n    glint.angle = THREE.MathUtils.degToRad(settings.logo.glintWidth);\n    glint.color.set(settings.logo.glintColour);\n    orbit.enabled = settings.logo.interaction === 'orbit';\n    $('.cl-grain').style.opacity = settings.finish.paperGrain;\n    const retro = $('.cl-retro');\n    retro.style.opacity = settings.finish.gridStrength;\n    retro.style.setProperty('--cl-grid-size', `${settings.finish.gridSize}px`);\n    retro.style.setProperty('--cl-vignette', settings.finish.vignette);\n    retro.style.setProperty('--cl-grid-a', settings.finish.gridA);\n    retro.style.setProperty('--cl-grid-b', settings.finish.gridB);\n    retro.style.setProperty('--cl-vignette-color', settings.finish.vignetteColour);\n    retro.style.mixBlendMode = settings.finish.gridBlend;\n    acidEnvironmentReady = false;\n    resize();\n    if (rebuild && (settings.logo.depth !== previousDepth || settings.logo.detail !== previousDetail)) queueLogoBuild();\n    else fitLogo();\n  }\n\n  const cultureOrder = ['sun', 'sea', 'sand', 'snow', 'style', 'sound'];\n  let cultureIndex = 0;\n  let cultureTimer;\n\n  function startCultureLoop() {\n    clearInterval(cultureTimer);\n    cultureTimer = setInterval(() => {\n      cultureIndex = (cultureIndex + 1) % cultureOrder.length;\n      applyCulture(cultureOrder[cultureIndex], false);\n    }, 3000);\n  }\n\n  function applyCulture(name, restartLoop = false) {\n    const preset = culturePresets[name];\n    if (!preset) return;\n    cultureIndex = Math.max(0, cultureOrder.indexOf(name));\n    applyConfig({ waves: preset.waves, finish: preset.finish }, false);\n    $$('[data-culture]').forEach(button => button.classList.toggle('cl-active', button.dataset.culture === name));\n    if (restartLoop) startCultureLoop();\n  }\n\n  $$('[data-culture]').forEach(button => button.addEventListener('click', event => {\n    event.stopPropagation();\n    applyCulture(button.dataset.culture, true);\n  }));\n\n  $('#cl-copy-config').addEventListener('click', async event => {\n    const config = { logo: { ...settings.logo }, waves: { ...waveConfig }, finish: { ...settings.finish } };\n    const old = event.target.textContent;\n    try { await navigator.clipboard.writeText(JSON.stringify(config, null, 2)); event.target.textContent = 'Copied'; }\n    catch { console.log(config); event.target.textContent = 'See console'; }\n    setTimeout(() => event.target.textContent = old, 1200);\n  });\n\n  $('#cl-load-config').addEventListener('click', () => {\n    const json = window.prompt('Paste the config JSON copied from this widget:');\n    if (json === null || !json.trim()) return;\n    try {\n      applyConfig(JSON.parse(json));\n    } catch (error) {\n      window.alert(`Could not load config: ${error.message}`);\n    }\n  });\n\n  stage.addEventListener('pointermove', event => {\n    const bounds = stage.getBoundingClientRect();\n    acidUniforms.uPointer.value.set((event.clientX - bounds.left) \/ bounds.width, 1 - (event.clientY - bounds.top) \/ bounds.height);\n  }, { passive: true });\n\n  const toggle = $('.cl-config-toggle');\n  const panel = $('.cl-panel');\n  toggle.addEventListener('click', () => {\n    const open = panel.classList.toggle('cl-open');\n    toggle.setAttribute('aria-expanded', String(open));\n  });\n\n  function qualityRatio() {\n    const quality = settings.logo.quality;\n    if (quality === 'low') return 1;\n    if (quality === 'high') return Math.min(devicePixelRatio || 1, 1.75);\n    return Math.min(devicePixelRatio || 1, lowPower ? 1 : 1.35);\n  }\n\n  function resize() {\n    const width = stage.clientWidth, height = stage.clientHeight;\n    camera.aspect = width \/ height; camera.updateProjectionMatrix();\n    const ratio = qualityRatio();\n    renderer.setPixelRatio(ratio); renderer.setSize(width, height, false);\n    bgRenderer.setPixelRatio(Math.min(ratio, lowPower ? 1 : 1.25)); bgRenderer.setSize(width, height, false);\n    fitLogo();\n  }\n  new ResizeObserver(resize).observe(stage);\n  new IntersectionObserver(entries => componentVisible = entries[0]?.isIntersecting ?? true, { rootMargin: '120px' }).observe(stage);\n\n  applyWave(waveConfig);\n  applyConfig({ logo: settings.logo, waves: waveConfig, finish: settings.finish }, false);\n  applyCulture('sun', false);\n  startCultureLoop();\n  resize();\n  if (matchMedia('(prefers-reduced-motion: reduce)').matches) {\n    settings.logo.spin = 0;\n    waveConfig.waveSpeed = .04;\n  }\n\n  let waveTime = 0;\n  let last = performance.now();\n  let frame = 0;\n  function animate(now) {\n    requestAnimationFrame(animate);\n    const dt = Math.min((now - last) \/ 1000, .05); last = now;\n    if (!componentVisible) return;\n\n    if (wavesRunning) waveTime += dt * waveConfig.waveSpeed;\n    acidUniforms.uTime.value = waveTime;\n    if (logoRunning && !dragging) spinAngle += dt * settings.logo.spin * 1.7;\n    logo.rotation.set(Math.PI + dragPitch, spinAngle + dragYaw, 0);\n    orbit.update();\n    warm.position.x = Math.sin(now * .00035) * 620;\n    key.position.y = Math.cos(now * .00022) * 380;\n    const glintPhase = now * .00035 * settings.logo.glintSpeed;\n    glint.position.x = Math.sin(glintPhase) * 940;\n    glint.position.y = -220 + Math.cos(glintPhase * .73) * 260;\n\n    if (settings.logo.reflectionMode === 'acid' && !meshBuilding) {\n      const interval = settings.logo.reflectionRate === 'live' ? (lowPower ? 6 : 3) : settings.logo.reflectionRate === 'static' ? Infinity : (lowPower ? 12 : 7);\n      if (!acidEnvironmentReady || (wavesRunning && frame % interval === 0)) {\n        const wasVisible = logo.visible;\n        try {\n          logo.visible = false;\n          cubeCamera.update(renderer, scene);\n          acidEnvironmentReady = true;\n        } finally {\n          logo.visible = wasVisible;\n        }\n      }\n    }\n\n    bgRenderer.render(bgScene, bgCamera);\n    renderer.render(scene, camera);\n    frame++;\n  }\n\n  $('.cl-loading').classList.add('cl-hide');\n  requestAnimationFrame(animate);\n})().catch(error => console.error('Chrome acid widget failed to initialise', error));\n<\/script>\n\n<script type=\"importmap\">\n{\"imports\":{\"three\":\"https:\/\/cdn.jsdelivr.net\/npm\/three@0.170.0\/build\/three.module.js\",\"three\/addons\/\":\"https:\/\/cdn.jsdelivr.net\/npm\/three@0.170.0\/examples\/jsm\/\"}}\n<\/script>\n\n<div id=\"chrome-logo-widget\">\n  <div class=\"cl-stage\">\n    <canvas class=\"cl-wave-canvas\" aria-hidden=\"true\"><\/canvas>\n    <div class=\"cl-loading\"><\/div>\n    <div class=\"cl-grain\"><\/div>\n    <div class=\"cl-retro\"><\/div>\n\n   <div class=\"cl-culture-strip\" aria-label=\"Donis culture\">\n  <div class=\"cl-culture-actions\" role=\"group\" aria-label=\"Choose a Donis world\">\n    <button class=\"cl-culture-button cl-active\" type=\"button\" data-culture=\"sun\"><strong>Sun<\/strong><\/button>\n    <button class=\"cl-culture-button\" type=\"button\" data-culture=\"sea\"><strong>Sea<\/strong><\/button>\n    <button class=\"cl-culture-button\" type=\"button\" data-culture=\"sand\"><strong>Sand<\/strong><\/button>\n    <button class=\"cl-culture-button\" type=\"button\" data-culture=\"snow\"><strong>Snow<\/strong><\/button>\n    <button class=\"cl-culture-button\" type=\"button\" data-culture=\"style\"><strong>Style<\/strong><\/button>\n    <button class=\"cl-culture-button\" type=\"button\" data-culture=\"sound\"><strong>Sound<\/strong><\/button>\n  <\/div>\n<\/div>\n\n    <button class=\"cl-config-toggle\" type=\"button\" style=\"display:none;\" aria-label=\"Open chrome settings\" aria-expanded=\"false\">\n      <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M19.14 12.94a7.6 7.6 0 0 0 .05-.94 7.6 7.6 0 0 0-.05-.94l2.03-1.58-1.92-3.32-2.39.96a7.1 7.1 0 0 0-1.63-.94L14.87 3h-3.84l-.36 3.18c-.58.23-1.12.54-1.63.94l-2.39-.96-1.92 3.32 2.03 1.58a7.6 7.6 0 0 0-.05.94c0 .32.02.63.05.94l-2.03 1.58 1.92 3.32 2.39-.96c.5.4 1.05.71 1.63.94l.36 3.18h3.84l.36-3.18a7.1 7.1 0 0 0 1.63-.94l2.39.96 1.92-3.32-2.03-1.58ZM12.95 15.5a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Z\"><\/path><\/svg>\n    <\/button>\n\n    <div class=\"cl-panel\">\n      <section class=\"cl-section\">\n        <h2 class=\"cl-section-title\">Chrome object<\/h2>\n        <div class=\"cl-row\"><label for=\"cl-spin\">Spin<\/label><input id=\"cl-spin\" type=\"range\" min=\"-1\" max=\"1\" step=\".01\" value=\".4\"><output>0.40<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-depth\">Depth<\/label><input id=\"cl-depth\" type=\"range\" min=\"12\" max=\"500\" step=\"2\" value=\"110\"><output>110<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-size\">Logo size<\/label><input id=\"cl-size\" type=\"range\" min=\".45\" max=\"1.5\" step=\".01\" value=\"1.2\"><output>1.20<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-rough\">Roughness<\/label><input id=\"cl-rough\" type=\"range\" min=\"0\" max=\".35\" step=\".005\" value=\".025\"><output>0.025<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-reflect\">Reflection<\/label><input id=\"cl-reflect\" type=\"range\" min=\"1\" max=\"10\" step=\".1\" value=\"6.5\"><output>6.5<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-anisotropy\">Anisotropy<\/label><input id=\"cl-anisotropy\" type=\"range\" min=\"0\" max=\"1\" step=\".01\" value=\".35\"><output>0.35<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-anisotropy-rotation\">Aniso angle<\/label><input id=\"cl-anisotropy-rotation\" type=\"range\" min=\"0\" max=\"6.28\" step=\".01\" value=\".8\"><output>0.80<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-glint-strength\">Glint<\/label><input id=\"cl-glint-strength\" type=\"range\" min=\"0\" max=\"4\" step=\".01\" value=\".8\"><output>0.80<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-glint-speed\">Glint speed<\/label><input id=\"cl-glint-speed\" type=\"range\" min=\"0\" max=\"2\" step=\".01\" value=\".22\"><output>0.22<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-glint-width\">Glint width<\/label><input id=\"cl-glint-width\" type=\"range\" min=\"4\" max=\"60\" step=\"1\" value=\"22\"><output>22<\/output><\/div>\n        <div class=\"cl-row cl-color\"><label for=\"cl-glint-colour\">Glint colour<\/label><input id=\"cl-glint-colour\" type=\"color\" value=\"#fff2dc\"><\/div>\n        <div class=\"cl-row cl-color\"><label for=\"cl-logo-color\">Logo colour<\/label><input id=\"cl-logo-color\" type=\"color\" value=\"#ffffff\"><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-reflection-mode\">Reflection<\/label><select id=\"cl-reflection-mode\"><option value=\"acid\">Live acid<\/option><option value=\"studio\">Studio cards<\/option><\/select><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-reflection-rate\">Reflect motion<\/label><select id=\"cl-reflection-rate\"><option value=\"eco\">Eco<\/option><option value=\"live\">Smooth<\/option><option value=\"static\">Static<\/option><\/select><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-interaction\">Interaction<\/label><select id=\"cl-interaction\"><option value=\"direct\">Direct drag<\/option><option value=\"orbit\">Orbit<\/option><\/select><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-detail\">Mesh detail<\/label><select id=\"cl-detail\"><option value=\"auto\">Auto<\/option><option value=\"low\">Low<\/option><option value=\"balanced\">Balanced<\/option><option value=\"smooth\">Smooth<\/option><\/select><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-quality\">Render quality<\/label><select id=\"cl-quality\"><option value=\"auto\">Auto<\/option><option value=\"low\">Low<\/option><option value=\"high\">High<\/option><\/select><\/div>\n        <button id=\"cl-pause-logo\" type=\"button\">Pause rotation<\/button>\n      <\/section>\n\n      <section class=\"cl-section\">\n        <h2 class=\"cl-section-title\">Acid background<\/h2>\n        <div class=\"cl-presets\"><button data-preset=\"Coffee\">Orange loops<\/button><button data-preset=\"Pools\">Liquid pools<\/button><button data-preset=\"Contours\">Contours<\/button><button data-preset=\"Print\">Print<\/button><button data-preset=\"Silk\">Silk<\/button><button data-preset=\"Rave\">Rave<\/button><button data-preset=\"Marble\">Marble<\/button><button data-preset=\"Molten\">Molten<\/button><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-flow-style\">Flow style<\/label><select id=\"cl-flow-style\"><option value=\"loops\">Smooth loops<\/option><option value=\"pools\">Liquid pools<\/option><option value=\"vortex\">Local swirls<\/option><option value=\"combed\">Combed marble<\/option><\/select><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-palette-mode\">Colours used<\/label><select id=\"cl-palette-mode\"><option value=\"2\">Two colours<\/option><option value=\"3\">Three colours<\/option><option value=\"4\">Four colours<\/option><\/select><\/div>\n        <div id=\"cl-wave-controls\"><\/div>\n        <div class=\"cl-actions\"><button id=\"cl-pause-waves\">Pause waves<\/button><button id=\"cl-randomise\">Randomise<\/button><button id=\"cl-reset-waves\">Reset waves<\/button><button id=\"cl-copy-config\">Copy config<\/button><button id=\"cl-load-config\">Load config<\/button><\/div>\n      <\/section>\n\n      <section class=\"cl-section\">\n        <h2 class=\"cl-section-title\">Retro print finish<\/h2>\n        <div class=\"cl-row\"><label for=\"cl-paper-grain\">Paper grain<\/label><input id=\"cl-paper-grain\" type=\"range\" min=\"0\" max=\"1\" step=\".01\" value=\".5\"><output>0.50<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-grid-strength\">Grid<\/label><input id=\"cl-grid-strength\" type=\"range\" min=\"0\" max=\"1\" step=\".01\" value=\".22\"><output>0.22<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-grid-size\">Grid size<\/label><input id=\"cl-grid-size\" type=\"range\" min=\"24\" max=\"180\" step=\"2\" value=\"96\"><output>96<\/output><\/div>\n        <div class=\"cl-row\"><label for=\"cl-vignette\">Vignette<\/label><input id=\"cl-vignette\" type=\"range\" min=\"0\" max=\"2\" step=\".01\" value=\".9\"><output>0.90<\/output><\/div>\n        <div class=\"cl-row cl-color\"><label for=\"cl-grid-color-a\">Grid colour 1<\/label><input id=\"cl-grid-color-a\" type=\"color\" value=\"#000000\"><\/div>\n        <div class=\"cl-row cl-color\"><label for=\"cl-grid-color-b\">Grid colour 2<\/label><input id=\"cl-grid-color-b\" type=\"color\" value=\"#ffffff\"><\/div>\n        <div class=\"cl-row cl-color\"><label for=\"cl-vignette-color\">Vignette<\/label><input id=\"cl-vignette-color\" type=\"color\" value=\"#000000\"><\/div>\n        <div class=\"cl-row cl-choice\"><label for=\"cl-grid-blend\">Grid blend<\/label><select id=\"cl-grid-blend\"><option value=\"multiply\">Multiply<\/option><option value=\"screen\">Screen<\/option><option value=\"soft-light\">Soft light<\/option><\/select><\/div>\n      <\/section>\n    <\/div>\n\n    <svg id=\"logoSource\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 2255 601.33\" style=\"display:none\" aria-hidden=\"true\">\n        <path d=\"M1561.3,479.6l64.04-116.17,9.18,82.24c10.14,26.69,32.05,46.22,59.95,52.93,46.59,6.14,91.95-17.93,111.7-60.29,14.32-30.71-7.11-51.23-31.77-69.7l-28.15-19.56-141.31-.16-74.25,141.32,52.2,52.03-244.38,4.67-72.16,1.85-31.63-198.85-81.47.39-78.91,151.83,26.45,49.66-159.98,2.85,81.84-53.7,13.17-24.84-5.46-3.75c-62.44,54.44-140.74,95.27-225.16,94.11-41.16-1.2-80.32-13.12-100.04-51.36-77.87,56.7-187.8,80.24-268.46,21.56-12.98-9.44-24.42-19.79-35.83-31.1-18.01,18.45-36.42,34.81-57.97,48.07-62.21,38.26-144.92,41.45-213.39,18.49-40.75-13.67-79.25-41.79-93.39-82.98-11.43-33.3-7.02-70.23,11.73-99.99,33.16-52.63,112.26-62.82,168.58-39.04,26.96,11.38,45.32,36.01,47.74,65.35-39.15-22.49-94.32-40.49-136.6-25.87-24.52,8.48-38.7,28.96-39.94,54.18s8.49,45.95,29.21,60.03c30.57,20.77,68.11,29.82,105.06,24.3,14.15-2.12,26.67-6.66,38.56-14.27,54.83-35.07,96.36-102.93,130.28-158.71-46.29-4.61-88.8-16.38-120.9-50.64-52.43-55.96-33.8-138.37,20.97-189.13,16.69-15.47,34.48-28.28,54.73-39.22,44.2-23.88,91.44-40.91,140.93-50.2,54.42-10.22,109.07-6.25,160.5,12.96,39.65-21.4,78.91-25.93,123.06-26.49,19.79-.25,38.91,2.36,56.39,11.28,21.55,11.01,36.56,30.86,38.78,54.93,1.86,20.23-5.38,39.34-21.12,51.6-3.09-31.76-22.59-59.32-53.61-66.91-27.02-6.62-55.44-3.12-80.99,7.5,17.61,13.13,33.67,25.03,48.2,40.45,30.35,32.21,49.82,71.41,60.75,114.62,52.06-51.66,114-91.65,183.77-110.28,57.33-14.98,140.03-16.45,168.76,41.62,5.57,11.25,7.97,22.86,9.61,35.48l1.31,2.13,14.36-27.26-29.97-49.25-1.34-2.2c-.27-.45.46-.54,2.11-.71l135.06-2.47,26.71,184.64,85.58-.32,71.33-135.11-29.86-49.14-1-2.36c-.2-.48,1.69-.57,2.89-.6l356.08-6.43-111.19,59.34-69.61,132.51,64.89-.41c-13.5-25.13-13.89-53.69-1.88-79.48,40.54-87.06,166.77-127.6,258.36-123.88,25.32,1.03,48.94,8.27,69.76,21.1l6.75,4.78,1.84,1.34c.46.33-.06,1.4-.64,2.46l-69.21,125.61-2.73,4.96-1.48,1.06-15.22-86.75c-1.55-8.81-9.02-15.29-16.84-19.49-27.53-11.73-68.09-.51-94.88,14.29-13.77,7.61-24.97,17.69-33.25,30.58-9.54,14.88-7.7,30.9,3.95,44.31,12.18,14.02,26.46,25.67,41.6,36.94l17.15,12.76,1.57.97c4.78,6.75,11.13,7.36,19.19,6.01l2.59.27h2.5s132.44-1.84,132.44-1.84l2.64-.04,2.64-.04,2.92-.02c.43,0,.47-.39.23-.71l-1.48-1.98c-17.31-18.82-32.88-38.15-46.08-60.88,56.97,20.09,105.68,59.97,148.53,96.64l-34.19,18.53-1.67.89-60.06,29.85-1.85.84c-30.74,13.98-61.48,26.63-94.09,35.78l-16.87,4.73-2.29.5c-.39.09-2.17-.26-1.88-.52l2.26-2.01,12-10.58,57.26-43.9,1.53-1.05,1.48-1.01,5.26-3.59,2-1.37c.4-.27.42-.88-.04-.89l-3.12-.03-84.86-.47c5.48,20.26,3.14,39.49-1.58,59.12-16.5,68.61-67.39,112.53-134.51,130.77-29.11,7.91-58.57,11.79-88.8,10.82-39.56-1.27-101.47-34.83-123.56-70.8Z\"><\/path>\n        <path d=\"M610.61,496.52c-22.97,13.81-47.01,21.75-73.54,22.68-41.36.46-78.85-21.43-100.41-55.96,25.47-34.14,45.93-69.69,65.69-107.05l217.9-2.39c-14.51,37.66-34.85,71.7-61.15,101.58-14.74,15.94-29.68,29.48-48.49,41.14Z\"><\/path>\n        <path d=\"M917.04,494.26c-35.55,24.09-106.29,40.58-124.54-1.69-13.32-30.84,1.8-77.96,15.56-109.34,4.47-10.19,7.2-20.31,12.79-30.39l217.58-1.77c-30.36,54.94-68.95,109.35-121.39,143.19Z\"><\/path>\n        <path d=\"M335.33,248.46c-10.5-10.87-14.07-24.77-10.41-39.15,8.98-35.27,41.74-67.74,72.2-87.93,53.84-35.69,124.5-56.08,189.9-41.45-66.24,62.8-114.55,135.09-160.02,212.65-33.43-7.05-67.46-19.53-91.67-44.12Z\"><\/path>\n        <path d=\"M734.47,298.13l-199.97-.55c16.83-29.93,33.63-58.27,51.92-86.99,14.57-21.65,28.18-42.8,45.26-62.28l31.65-36.1c18.69,13.41,35.54,27.24,49.55,44.93,28.15,40.2,30.12,92.03,21.6,140.99Z\"><\/path>\n        <path d=\"M1064.51,298.28l-214.08-.04c17.65-29.29,36.96-54.63,59.92-78.04,18.42-18.6,37.82-34.46,60.74-46.93,25.27-13.69,57.03-23.28,84.56-16,15.8,4.17,25.97,16.3,29.77,32.06,6.89,35.58-6.85,74.84-20.91,108.95Z\"><\/path>\n        <path d=\"M1448.05,487.02l-108.91,57.71,101.45-195.57,79.87-.21-72.41,138.07Z\"><\/path>\n        <path d=\"M1548.2,296.23l-80.28.52,69.3-133.49,52.65-32.93,29.87,29.68-71.54,136.22Z\"><\/path>\n        <path d=\"M1347.49,423.52l-11.15-74.11,50.47-.04-39.32,74.15Z\"><\/path>\n        <path d=\"M1226.45,297.8l-45.94.17,35.08-67.47,10.86,67.3Z\"><\/path>\n      <\/svg>\n  <\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-base-color has-contrast-background-color has-text-color has-background has-link-color wp-elements-1 has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-a0fa8490 wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-group has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-e2ab0d00 wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)\">\n<h2 class=\"wp-block-heading has-xx-large-font-size\">We are a <mark style=\"background-color:rgba(0, 0, 0, 0);color:#28ff49\" class=\"has-inline-color\">cultural movement<\/mark> forging opportunities for people in inner cities and sea-side towns.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Donis is a cultural movement creating opportunities, experiences and space for raw expression through football, fashion and music. Built for the streets, the beaches and the people finding their own direction.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-cover alignfull is-light has-custom-content-position is-position-bottom-right has-base-color has-text-color has-link-color wp-elements-2\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50);min-height:566px;aspect-ratio:unset;\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" class=\"wp-block-cover__image-background wp-image-124 size-large\" alt=\"\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/donis-1024x576.jpeg\" data-object-fit=\"cover\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/donis-1024x576.jpeg 1024w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/donis-300x169.jpeg 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/donis-768x432.jpeg 768w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/donis.jpeg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-10 has-background-dim\" style=\"background-color:#999b9d\"><\/span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<h2 class=\"wp-block-heading has-xx-large-font-size\">Donis 26: London<\/h2>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">3 October 2026 Riverside East, Stratford, London<\/h2>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-contrast-color has-text-color has-background has-link-color wp-element-button\" href=\"https:\/\/www.eventbrite.co.uk\/e\/donis-london-2026-2v2-street-football-team-ticket-tickets-1998357098877?aff=oddtdtcreator\" style=\"background-color:#28ff49\">BUY TICKETS<\/a><\/div>\n\n\n<\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-1dd75b38 wp-block-columns-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Welcome to Our Culture<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Donis brings together players, creators, artists, musicians and brands to build something that goes beyond sport.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Our tournaments transform streets and beaches into stages. The pitch becomes a canvas. Players become creators. Music, style and the spirit of each location shape the atmosphere.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h2 class=\"wp-block-heading\">More Than What You See<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Donis is about what you feel. The energy of the crowd. The freedom of the game. The sound of a place coming alive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We create opportunities for young adults in inner cities and seaside towns to find direction, express themselves and experience something new.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-base-color has-text-color has-link-color wp-elements-3 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained has-background\" style=\"padding-top:var(--wp--preset--spacing--80);padding-bottom:var(--wp--preset--spacing--80);background-image:url(&apos;https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis-Background-Grey.webp&apos;);background-size:cover;background-attachment:scroll;\">\n<p class=\"has-text-align-center is-style-text-subtitle has-gfs-didot-font-family has-large-font-size is-style-text-subtitle--1 wp-block-paragraph\" style=\"text-transform:uppercase\">Our actions<\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/1-1024x1024.webp\" alt=\"\" class=\"wp-image-36\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/1-1024x1024.webp 1024w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/1-300x300.webp 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/1-150x150.webp 150w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/1-768x768.webp 768w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/1.webp 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">We Defy<\/h2>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size wp-block-paragraph\">Defiance is in our nature. We challenge convention, reject empty trends and play by instinct.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/2-1024x1024.webp\" alt=\"\" class=\"wp-image-35\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/2-1024x1024.webp 1024w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/2-300x300.webp 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/2-150x150.webp 150w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/2-768x768.webp 768w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/2.webp 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">We Create<\/h2>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size wp-block-paragraph\">We create culture, memories and stages where people can express themselves freely.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/3-1024x1024.webp\" alt=\"\" class=\"wp-image-34\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/3-1024x1024.webp 1024w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/3-300x300.webp 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/3-150x150.webp 150w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/3-768x768.webp 768w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/3.webp 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">We Blaze<\/h2>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size wp-block-paragraph\">We move forward with intent, opening new paths and taking the people around us with us.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-global-padding is-content-justification-center is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-group alignwide has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group alignwide has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-236ffaf5 wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading has-text-align-left has-text-color has-link-color wp-elements-4\" style=\"color:#ff2a00\">Donis Events<\/h2>\n\n\n\n<p class=\"has-contrast-color has-text-color has-link-color wp-elements-5 wp-block-paragraph\">Street and beach football meets music, fashion, food and local culture. From city pitches to open beaches.<\/p>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column has-border-color has-contrast-border-color has-base-background-color has-background is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30);flex-basis:100%\">\n<h3 class=\"wp-block-heading\">DONIS 26: LONDON<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3 October 2026 \u00b7 Venue TBC<\/strong><br>A full day and night of street football, music, food, fashion and culture.<\/p>\n\n\n<\/div>\n\n\n\n<div class=\"wp-block-column has-border-color has-contrast-border-color has-base-background-color has-background is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30);flex-basis:100%\">\n<h3 class=\"wp-block-heading\">BRISTOL EVENT <br>Coming November 2026<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">More information coming soon<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-border-color has-contrast-border-color has-base-background-color has-background is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30);flex-basis:100%\">\n<h3 class=\"wp-block-heading\">Essex event<br>Coming in December 2026<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">More information coming soon<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-border-color has-contrast-border-color has-base-background-color has-background is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30);flex-basis:100%\">\n<h3 class=\"wp-block-heading\">Snow and sand events coming in 2027<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">More information coming soon<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"background-color:#dcdcdc;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)\">\n<h2 class=\"wp-block-heading has-text-align-center\">Featured SponsorS<\/h2>\n\n\n\n<div class=\"wp-block-group alignwide is-layout-grid wp-container-core-group-is-layout-77fdcb96 wp-block-group-is-layout-grid\" style=\"padding-top:var(--wp--preset--spacing--50)\">\n<div class=\"wp-block-group has-base-background-color has-background wp-container-content-7d4755b8 has-global-padding is-layout-constrained wp-container-core-group-is-layout-d756b54c wp-block-group-is-layout-constrained\" style=\"border-radius:1em;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-0351fb30 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized is-style-rounded wp-container-content-759e20a8\"><img loading=\"lazy\" decoding=\"async\" width=\"280\" height=\"268\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Screenshot-2026-08-04-at-17.39.35.png\" alt=\"\" class=\"wp-image-138\" style=\"aspect-ratio:1;object-fit:cover;width:100px\"\/><\/figure>\n\n\n\n<div class=\"wp-block-group has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-1b50859a wp-block-group-is-layout-constrained\">\n<p class=\"has-gfs-didot-font-family has-large-font-size wp-block-paragraph\" style=\"text-transform:uppercase\"><strong>Favela Cerveja<\/strong><\/p>\n\n\n\n<p class=\"is-style-text-annotation has-small-font-size is-style-text-annotation--2 wp-block-paragraph\">Headline Sponsor<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-base-background-color has-background wp-container-content-7d4755b8 has-global-padding is-layout-constrained wp-container-core-group-is-layout-d756b54c wp-block-group-is-layout-constrained\" style=\"border-radius:1em;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-0351fb30 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-style-rounded wp-container-content-759e20a8\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"734\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-1.png\" alt=\"\" class=\"wp-image-152\" style=\"aspect-ratio:1;object-fit:cover\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-1.png 770w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-1-300x286.png 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-1-768x732.png 768w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-group has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-1b50859a wp-block-group-is-layout-constrained\">\n<p class=\"has-gfs-didot-font-family has-large-font-size wp-block-paragraph\" style=\"line-height:1;text-transform:uppercase\">With <strong>Flair<\/strong><br><strong>Digital Agency<\/strong><\/p>\n\n\n\n<p class=\"is-style-text-annotation has-small-font-size is-style-text-annotation--3 wp-block-paragraph\">Headline Sponsor<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-base-color has-text-color has-link-color wp-elements-6 has-global-padding is-layout-constrained wp-block-group-is-layout-constrained has-background\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60);background-image:url(&apos;https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donnis-Background-Black.webp&apos;);background-size:cover;\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<h1 class=\"wp-block-heading\">Built Through Collaboration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Donis works with brands, artists, musicians, filmmakers, clubs and local communities to create cultural moments people genuinely want to be part of.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We build partnerships into the experience itself\u2014from the kits worn on the pitch to live activations, original content and the stories that continue after the final whistle.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<h2 class=\"wp-block-heading\">Event Partners<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Reach new audiences through event presence, cultural activations, advertising and content before, during and after each event.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Futbol Club Sponsors<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Put your brand on the pitch through kit sponsorship, team partnerships and collaborative campaigns.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Content and Streaming Partners<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Help take Donis beyond the venue through live coverage, original films, highlights and stories built to travel.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignwide has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"padding-top:0;padding-bottom:0\">\n<div class=\"wp-block-group alignwide has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"padding-top:0;padding-bottom:0\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-0a9f6745 wp-block-columns-is-layout-flex\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large has-custom-border\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Beach_Soccer-1024x576.jpg\" alt=\"\" class=\"wp-image-167\" style=\"border-radius:3em;aspect-ratio:1;object-fit:cover\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Beach_Soccer-1024x576.jpg 1024w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Beach_Soccer-300x169.jpg 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Beach_Soccer-768x432.jpg 768w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Beach_Soccer-1536x864.jpg 1536w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Beach_Soccer.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<h1 class=\"wp-block-heading\">Creating More Than Memories<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Our events create memories that last a life time. They connect local communities and create opportunities for the lost youth.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Our Mission focuses on four key areas<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creativity<\/li>\n\n\n\n<li>Fun<\/li>\n\n\n\n<li>Team sport<\/li>\n\n\n\n<li>Making a difference<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Because sometimes people need more than advice. They need somewhere to go, something to be part of and a chance to discover what they can become.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-0a9f6745 wp-block-columns-is-layout-flex\" style=\"margin-top:var(--wp--preset--spacing--60);margin-bottom:var(--wp--preset--spacing--60)\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<h1 class=\"wp-block-heading\">The Future Is Global<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In 2027 and beyond, Donis will take its culture to new places.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From Mediterranean coastlines to the heart of South America, every location will create its own moment, shaped by local culture and elevated through football, fashion and sound.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beach tournaments. Street football. Music. Travel. Extreme environments. New collaborations. A global culture with its roots firmly in the streets.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large has-custom-border\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"822\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-1024x822.png\" alt=\"\" class=\"wp-image-71\" style=\"border-top-left-radius:3em;border-top-right-radius:3em;border-bottom-left-radius:3em;border-bottom-right-radius:3em\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-1024x822.png 1024w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-300x241.png 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image-768x617.png 768w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/image.png 1076w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-cover alignfull\" style=\"margin-top:0;margin-bottom:0\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" class=\"wp-block-cover__image-background wp-image-169 size-large\" alt=\"\" src=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Movement-1024x576.jpg\" data-object-fit=\"cover\" srcset=\"https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Movement-1024x576.jpg 1024w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Movement-300x169.jpg 300w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Movement-768x432.jpg 768w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Movement-1536x864.jpg 1536w, https:\/\/donis.uk\/wp-content\/uploads\/2026\/08\/Donis_Movement.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><span aria-hidden=\"true\" class=\"wp-block-cover__background has-contrast-background-color has-background-dim-60 has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container has-global-padding is-layout-constrained wp-block-cover-is-layout-constrained\">\n<p class=\"has-text-align-center has-large-font-size wp-block-paragraph\">Join the Movement<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Hear about upcoming events, team opportunities, collaborations and everything happening inside the Donis universe.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-35f06ea7 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\">BUY TICKETS<\/a><\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Sun Sea Sand Snow Style Sound Chrome object Spin0.40 Depth110 Logo size1.20 Roughness0.025 Reflection6.5 Anisotropy0.35 Aniso angle0.80 Glint0.80 Glint speed0.22 Glint width22 Glint colour Logo colour ReflectionLive acidStudio cards Reflect motionEcoSmoothStatic InteractionDirect dragOrbit Mesh detailAutoLowBalancedSmooth Render qualityAutoLowHigh Pause rotation Acid background Orange loopsLiquid poolsContoursPrintSilkRaveMarbleMolten Flow styleSmooth loopsLiquid poolsLocal swirlsCombed marble Colours usedTwo coloursThree coloursFour colours [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-2","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/donis.uk\/index.php?rest_route=\/wp\/v2\/pages\/2","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/donis.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/donis.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/donis.uk\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/donis.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2"}],"version-history":[{"count":102,"href":"https:\/\/donis.uk\/index.php?rest_route=\/wp\/v2\/pages\/2\/revisions"}],"predecessor-version":[{"id":191,"href":"https:\/\/donis.uk\/index.php?rest_route=\/wp\/v2\/pages\/2\/revisions\/191"}],"wp:attachment":[{"href":"https:\/\/donis.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}