{"id":413,"date":"2026-08-05T15:12:38","date_gmt":"2026-08-05T15:12:38","guid":{"rendered":"https:\/\/togrowagencia.com\/en\/?page_id=413"},"modified":"2026-08-14T16:39:27","modified_gmt":"2026-08-14T16:39:27","slug":"contact","status":"publish","type":"page","link":"https:\/\/togrowagencia.com\/en\/contact\/","title":{"rendered":"Contact"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"413\" class=\"elementor elementor-413\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-50733bc e-flex e-con-boxed e-con e-parent\" data-id=\"50733bc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f60fe14 elementor-widget elementor-widget-html\" data-id=\"f60fe14\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"tgus-contact\" class=\"tgus-contact\">\r\n  <style>\r\n    #tgus-contact {\r\n      --tgus-bg-0: #05050a;\r\n      --tgus-bg-2: #15151f;\r\n      --tgus-blue: #3b82f6;\r\n      --tgus-blue-d: #2563eb;\r\n      --tgus-violet: #8b7cf6;\r\n      --tgus-cyan: #5ec8f2;\r\n      --tgus-text: #f4f4f8;\r\n      --tgus-text-dim: #9a9aa8;\r\n      --tgus-border: rgba(255,255,255,.08);\r\n      --tgus-ease: cubic-bezier(.16,1,.3,1);\r\n      --tgus-font-display: 'Bricolage Grotesque', system-ui, sans-serif;\r\n      --tgus-font-body: 'Plus Jakarta Sans', system-ui, sans-serif;\r\n\r\n      position: relative;\r\n      background: var(--tgus-bg-0);\r\n      color: var(--tgus-text);\r\n      font-family: var(--tgus-font-body) !important;\r\n      padding: clamp(5rem, 10vw, 7rem) clamp(1.25rem, 5vw, 4rem);\r\n      overflow: hidden;\r\n      isolation: isolate;\r\n      min-width: 0;\r\n    }\r\n    #tgus-contact *, #tgus-contact *::before, #tgus-contact *::after { box-sizing: border-box; }\r\n\r\n    \/* ================================================================\r\n       GRADIENT BLINDS \u2014 ported from a React\/ogl WebGL shader (GLSL\r\n       fragment: rotated color-blind stripes + a cursor-following\r\n       spotlight + noise) to plain WebGL1 + vanilla JS, no library.\r\n       ================================================================ *\/\r\n    #tgus-contact .tgus-ct-bg-canvas {\r\n      position: absolute; inset: 0; z-index: 0;\r\n      width: 100%; height: 100%;\r\n      display: block;\r\n      opacity: .55;\r\n    }\r\n    #tgus-contact .tgus-ct-bg-overlay {\r\n      position: absolute; inset: 0; z-index: 1;\r\n      pointer-events: none;\r\n      background:\r\n        radial-gradient(ellipse 900px 500px at 50% 20%, transparent 0%, rgba(5,5,10,.55) 65%, var(--tgus-bg-0) 100%),\r\n        linear-gradient(180deg, rgba(5,5,10,.35) 0%, transparent 25%, transparent 75%, var(--tgus-bg-0) 100%);\r\n    }\r\n\r\n    #tgus-contact .tgus-ct-wrap { position: relative; z-index: 2; max-width: 1200px; margin: 0 auto; }\r\n\r\n    #tgus-contact .tgus-ct-head { text-align: center; max-width: 720px; margin: 0 auto 3.5rem; }\r\n    #tgus-contact h1 {\r\n      font-family: var(--tgus-font-display) !important;\r\n      font-size: clamp(2.4rem, 5.5vw, 4rem) !important;\r\n      font-weight: 700 !important;\r\n      line-height: 1.2 !important;\r\n      letter-spacing: -0.02em !important;\r\n      margin: 0 0 1.1rem !important;\r\n    }\r\n    #tgus-contact .tgus-ct-head p {\r\n      font-size: 1.08rem !important;\r\n      line-height: 1.6 !important;\r\n      color: var(--tgus-text-dim) !important;\r\n      margin: 0 auto !important;\r\n      max-width: 46ch;\r\n    }\r\n    #tgus-contact .tgus-ct-head p strong { color: var(--tgus-text) !important; font-weight: 700 !important; }\r\n\r\n    #tgus-contact .tgus-reveal {\r\n      display: inline-block;\r\n      background-clip: text; -webkit-background-clip: text;\r\n      color: transparent;\r\n      background-size: 100% 100%;\r\n      padding-bottom: .1em;\r\n    }\r\n    #tgus-contact .tgus-grad-word { display: inline-block; color: transparent; padding-bottom: .1em; }\r\n    #tgus-contact .tgus-grad-word.tgus-grad-active {\r\n      background-image: linear-gradient(to right, var(--tgus-cyan), var(--tgus-blue), var(--tgus-violet), var(--tgus-cyan));\r\n      background-size: 300% 100%;\r\n      background-clip: text; -webkit-background-clip: text;\r\n      animation: tgus-grad-move 3.2s ease-in-out infinite alternate;\r\n    }\r\n    @keyframes tgus-grad-move { 0% { background-position: 0% 50%; } 100% { background-position: 100% 50%; } }\r\n\r\n    \/* ================================================================\r\n       BENTO GRID \u2014 CTA banner full-width on top (headline + button),\r\n       row of 5 equal social cards below (Facebook, Instagram, TikTok,\r\n       YouTube, LinkedIn). Border-glow ported from MagicBento kept on\r\n       every card.\r\n       ================================================================ *\/\r\n    #tgus-contact .tgus-bento-grid {\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 1.1rem;\r\n    }\r\n    #tgus-contact .tgus-social-row {\r\n      display: grid;\r\n      grid-template-columns: repeat(5, 1fr);\r\n      gap: 1.1rem;\r\n    }\r\n    #tgus-contact .tgus-bento-card {\r\n      position: relative;\r\n      isolation: isolate;\r\n      overflow: hidden;\r\n      border-radius: 20px;\r\n      border: 1px solid rgba(255,255,255,.12);\r\n      background: rgba(21,21,31,.38);\r\n      backdrop-filter: blur(18px) saturate(140%);\r\n      -webkit-backdrop-filter: blur(18px) saturate(140%);\r\n      transition: transform .3s var(--tgus-ease), box-shadow .3s var(--tgus-ease), background .3s var(--tgus-ease);\r\n      --glow-x: 50%; --glow-y: 50%; --glow-intensity: 0; --glow-radius: 220px;\r\n    }\r\n    #tgus-contact .tgus-bento-card:hover { transform: translateY(-2px); background: rgba(21,21,31,.5); }\r\n    #tgus-contact .tgus-bento-card::after {\r\n      content: '';\r\n      position: absolute; inset: 0;\r\n      padding: 2px;\r\n      background: radial-gradient(var(--glow-radius) circle at var(--glow-x) var(--glow-y),\r\n        rgba(94,200,242, calc(var(--glow-intensity) * .9)) 0%,\r\n        rgba(139,124,246, calc(var(--glow-intensity) * .5)) 40%,\r\n        transparent 70%);\r\n      border-radius: inherit;\r\n      -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\r\n      -webkit-mask-composite: xor;\r\n      mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);\r\n      mask-composite: exclude;\r\n      pointer-events: none;\r\n      z-index: 1;\r\n    }\r\n\r\n    \/* ---- small social cards ---- *\/\r\n    #tgus-contact .tgus-bento-info {\r\n      padding: 1.4rem;\r\n      min-height: 168px;\r\n      display: flex;\r\n      flex-direction: column;\r\n      justify-content: center;\r\n      align-items: center;\r\n      text-align: center;\r\n      gap: .8rem;\r\n    }\r\n    #tgus-contact .tgus-icon-btn {\r\n      background: transparent;\r\n      border: none;\r\n      position: relative;\r\n      flex-shrink: 0;\r\n      width: 3.2em;\r\n      height: 3.2em;\r\n      perspective: 24em;\r\n      cursor: default;\r\n      font-size: 16px;\r\n      z-index: 2;\r\n    }\r\n    #tgus-contact .tgus-icon-back,\r\n    #tgus-contact .tgus-icon-front {\r\n      position: absolute; inset: 0;\r\n      border-radius: 1.1em;\r\n      transition: transform .3s cubic-bezier(.83,0,.17,1);\r\n    }\r\n    #tgus-contact .tgus-icon-back {\r\n      transform: rotate(15deg);\r\n      transform-origin: 100% 100%;\r\n      box-shadow: .5em -.5em .75em hsla(223,10%,10%,.25);\r\n      background: linear-gradient(135deg, hsl(199,80%,55%), hsl(258,75%,60%));\r\n    }\r\n    #tgus-contact .tgus-icon-front {\r\n      background: hsla(0,0%,100%,.15);\r\n      box-shadow: 0 0 0 .1em hsla(0,0%,100%,.3) inset;\r\n      backdrop-filter: blur(.75em);\r\n      -webkit-backdrop-filter: blur(.75em);\r\n      display: flex; align-items: center; justify-content: center;\r\n      transform-origin: 80% 50%;\r\n    }\r\n    #tgus-contact .tgus-icon-front svg { width: 1.3em; height: 1.3em; stroke: #fff; fill: none; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }\r\n    #tgus-contact .tgus-bento-info:hover .tgus-icon-back { transform: rotate(25deg) translate3d(-.4em,-.4em,.4em); }\r\n    #tgus-contact .tgus-bento-info:hover .tgus-icon-front { transform: translate3d(0,0,1.6em); }\r\n\r\n    #tgus-contact .tgus-ct-info-label {\r\n      display: block;\r\n      font-size: .72rem !important;\r\n      font-weight: 700 !important;\r\n      letter-spacing: .08em;\r\n      text-transform: uppercase;\r\n      color: var(--tgus-text-dim) !important;\r\n      margin: 0 0 .3rem !important;\r\n      position: relative; z-index: 2;\r\n    }\r\n    #tgus-contact .tgus-ct-info-value {\r\n      font-size: 1rem !important;\r\n      font-weight: 600 !important;\r\n      color: var(--tgus-text) !important;\r\n      margin: 0 !important;\r\n      line-height: 1.4 !important;\r\n      position: relative; z-index: 2;\r\n    }\r\n    #tgus-contact .tgus-ct-info-value a { color: inherit; text-decoration: none; }\r\n    #tgus-contact .tgus-ct-info-value a:hover { color: var(--tgus-cyan); }\r\n\r\n    \/* ---- CTA card: full-width banner, headline + button, no form ---- *\/\r\n    #tgus-contact .tgus-bento-cta {\r\n      padding: clamp(1.75rem, 3vw, 2.5rem);\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      justify-content: space-between;\r\n      align-items: center;\r\n      gap: 1.5rem;\r\n    }\r\n    #tgus-contact .tgus-bento-cta-copy { max-width: 46ch; }\r\n    #tgus-contact .tgus-bento-cta h2 {\r\n      position: relative; z-index: 2;\r\n      font-family: var(--tgus-font-display) !important;\r\n      font-size: clamp(1.4rem, 2.4vw, 1.8rem) !important;\r\n      font-weight: 700 !important;\r\n      margin: 0 0 .5rem !important;\r\n      color: var(--tgus-text) !important;\r\n    }\r\n    #tgus-contact .tgus-bento-cta p {\r\n      position: relative; z-index: 2;\r\n      font-size: .96rem !important;\r\n      line-height: 1.6 !important;\r\n      color: var(--tgus-text-dim) !important;\r\n      margin: 0 !important;\r\n    }\r\n    #tgus-contact .tgus-cta-btn {\r\n      position: relative;\r\n      z-index: 2;\r\n      isolation: isolate;\r\n      display: inline-flex;\r\n      align-items: center;\r\n      flex-shrink: 0;\r\n      gap: .55rem;\r\n      border: 1px solid rgba(255,255,255,.14);\r\n      border-radius: 10px;\r\n      background: linear-gradient(180deg, var(--tgus-blue), var(--tgus-blue-d));\r\n      color: #fff !important;\r\n      font-family: var(--tgus-font-body) !important;\r\n      font-weight: 700 !important;\r\n      font-size: .98rem !important;\r\n      padding: .9em 1.6em;\r\n      text-decoration: none;\r\n      box-shadow: 0 10px 28px -10px rgba(59,130,246,.6);\r\n      transition: transform .25s var(--tgus-ease), filter .25s var(--tgus-ease);\r\n    }\r\n    #tgus-contact .tgus-cta-btn:hover { filter: brightness(1.1); transform: translateY(-2px); }\r\n    #tgus-contact .tgus-cta-btn:focus-visible { outline: 2px solid var(--tgus-cyan); outline-offset: 3px; }\r\n    #tgus-contact .tgus-cta-btn svg { width: 1.1em; height: 1.1em; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }\r\n\r\n    @media (prefers-reduced-motion: reduce) {\r\n      #tgus-contact .tgus-cta-btn,\r\n      #tgus-contact .tgus-bento-card,\r\n      #tgus-contact .tgus-icon-back,\r\n      #tgus-contact .tgus-icon-front { transition: none; }\r\n      #tgus-contact .tgus-grad-word.tgus-grad-active { animation: none !important; background-position: 50% 50% !important; }\r\n    }\r\n    @media (max-width: 900px) {\r\n      #tgus-contact .tgus-social-row { grid-template-columns: repeat(3, 1fr); }\r\n    }\r\n    @media (max-width: 640px) {\r\n      #tgus-contact .tgus-bento-cta { flex-direction: column; align-items: flex-start; }\r\n      #tgus-contact .tgus-cta-btn { width: 100%; justify-content: center; }\r\n      #tgus-contact .tgus-social-row { grid-template-columns: repeat(2, 1fr); }\r\n      #tgus-contact .tgus-bento-info { min-height: 140px; }\r\n    }\r\n  <\/style>\r\n\r\n  <canvas class=\"tgus-ct-bg-canvas\" id=\"tgus-ct-canvas\" aria-hidden=\"true\"><\/canvas>\r\n  <div class=\"tgus-ct-bg-overlay\" aria-hidden=\"true\"><\/div>\r\n\r\n  <div class=\"tgus-ct-wrap\">\r\n    <div class=\"tgus-ct-head\">\r\n      <h1><span class=\"tgus-reveal\" id=\"tgus-ct-reveal\">Let's talk about <span class=\"tgus-grad-word\">your business<\/span><\/span><\/h1>\r\n      <p>Fifteen minutes is usually enough to tell you <strong>what's worth automating<\/strong> and what isn't.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"tgus-bento-grid\" id=\"tgus-bento-grid\">\r\n      <div class=\"tgus-bento-card tgus-bento-cta\">\r\n        <div class=\"tgus-bento-cta-copy\">\r\n          <h2>Ready when you are<\/h2>\r\n          <p>Send us a message and someone from our team will get back to you within one business day \u2014 no forms to fill, no sales script.<\/p>\r\n        <\/div>\r\n        <a class=\"tgus-cta-btn\" href=\"https:\/\/api.whatsapp.com\/send?phone=573103597580\" target=\"_blank\" rel=\"noopener\">\r\n          <svg viewBox=\"0 0 24 24\"><path d=\"M21 11.5a8.38 8.38 0 0 1-8.5 8.5 8.5 8.5 0 0 1-4.2-1.1L3 20l1.1-5.3A8.5 8.5 0 1 1 21 11.5z\"\/><\/svg>\r\n          Send us a message\r\n        <\/a>\r\n      <\/div>\r\n\r\n      <div class=\"tgus-social-row\">\r\n        <div class=\"tgus-bento-card tgus-bento-info\">\r\n          <button class=\"tgus-icon-btn\" type=\"button\" aria-label=\"Facebook\">\r\n            <span class=\"tgus-icon-back\"><\/span>\r\n            <span class=\"tgus-icon-front\"><svg viewBox=\"0 0 24 24\"><path d=\"M15 8h-2a3 3 0 0 0-3 3v2H8v3h2v6h3v-6h2l1-3h-3v-2a1 1 0 0 1 1-1h2z\"\/><\/svg><\/span>\r\n          <\/button>\r\n          <div>\r\n            <span class=\"tgus-ct-info-label\">Facebook<\/span>\r\n            <p class=\"tgus-ct-info-value\"><a href=\"https:\/\/www.facebook.com\/ToGrowAgenciaDigital\" target=\"_blank\" rel=\"noopener\">ToGrow Agencia<\/a><\/p>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"tgus-bento-card tgus-bento-info\">\r\n          <button class=\"tgus-icon-btn\" type=\"button\" aria-label=\"Instagram\">\r\n            <span class=\"tgus-icon-back\"><\/span>\r\n            <span class=\"tgus-icon-front\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"\/><circle cx=\"12\" cy=\"12\" r=\"4\"\/><circle cx=\"17.5\" cy=\"6.5\" r=\"1\" fill=\"#fff\" stroke=\"none\"\/><\/svg><\/span>\r\n          <\/button>\r\n          <div>\r\n            <span class=\"tgus-ct-info-label\">Instagram<\/span>\r\n            <p class=\"tgus-ct-info-value\"><a href=\"https:\/\/www.instagram.com\/togrow_agencia_digital\/\" target=\"_blank\" rel=\"noopener\">@togrow_agencia_digital<\/a><\/p>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"tgus-bento-card tgus-bento-info\">\r\n          <button class=\"tgus-icon-btn\" type=\"button\" aria-label=\"TikTok\">\r\n            <span class=\"tgus-icon-back\"><\/span>\r\n            <span class=\"tgus-icon-front\"><svg viewBox=\"0 0 24 24\"><path d=\"M14 4v9.5a3.5 3.5 0 1 1-3-3.46\"\/><path d=\"M14 4c0 2.5 1.5 4 4 4\"\/><\/svg><\/span>\r\n          <\/button>\r\n          <div>\r\n            <span class=\"tgus-ct-info-label\">TikTok<\/span>\r\n            <p class=\"tgus-ct-info-value\"><a href=\"https:\/\/www.tiktok.com\/@togrowagencia\" target=\"_blank\" rel=\"noopener\">@togrowagencia<\/a><\/p>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"tgus-bento-card tgus-bento-info\">\r\n          <button class=\"tgus-icon-btn\" type=\"button\" aria-label=\"YouTube\">\r\n            <span class=\"tgus-icon-back\"><\/span>\r\n            <span class=\"tgus-icon-front\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"4\"\/><path d=\"M10 9l6 3-6 3V9z\" fill=\"#fff\" stroke=\"none\"\/><\/svg><\/span>\r\n          <\/button>\r\n          <div>\r\n            <span class=\"tgus-ct-info-label\">YouTube<\/span>\r\n            <p class=\"tgus-ct-info-value\"><a href=\"https:\/\/www.youtube.com\/@ToGrowAgencia\" target=\"_blank\" rel=\"noopener\">@ToGrowAgencia<\/a><\/p>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"tgus-bento-card tgus-bento-info\">\r\n          <button class=\"tgus-icon-btn\" type=\"button\" aria-label=\"LinkedIn\">\r\n            <span class=\"tgus-icon-back\"><\/span>\r\n            <span class=\"tgus-icon-front\"><svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"4\"\/><circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#fff\" stroke=\"none\"\/><path d=\"M8 11v7M12 11v7M12 14c0-2 4-2 4 0v4\"\/><\/svg><\/span>\r\n          <\/button>\r\n          <div>\r\n            <span class=\"tgus-ct-info-label\">LinkedIn<\/span>\r\n            <p class=\"tgus-ct-info-value\"><a href=\"https:\/\/www.linkedin.com\/company\/51721113\" target=\"_blank\" rel=\"noopener\">ToGrow Agencia<\/a><\/p>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    (function(){\r\n      var root = document.getElementById('tgus-contact');\r\n      if(!root) return;\r\n      var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n      \/* ============ GradientBlinds background \u2014 ported from React\/ogl to plain WebGL1 ============ *\/\r\n      function tgusInitGradientBlinds(canvas, opts){\r\n        opts = opts || {};\r\n        var gl = canvas.getContext('webgl', { antialias: true, alpha: true }) ||\r\n                 canvas.getContext('experimental-webgl', { antialias: true, alpha: true });\r\n        if(!gl) return function(){};\r\n\r\n        var vertexSrc = [\r\n          'attribute vec2 position;',\r\n          'attribute vec2 uv;',\r\n          'varying vec2 vUv;',\r\n          'void main(){ vUv = uv; gl_Position = vec4(position, 0.0, 1.0); }'\r\n        ].join('\\n');\r\n\r\n        var fragmentSrc = [\r\n          '#ifdef GL_ES',\r\n          'precision mediump float;',\r\n          '#endif',\r\n          'uniform vec3 iResolution;',\r\n          'uniform vec2 iMouse;',\r\n          'uniform float iTime;',\r\n          'uniform float uAngle;',\r\n          'uniform float uNoise;',\r\n          'uniform float uBlindCount;',\r\n          'uniform float uSpotlightRadius;',\r\n          'uniform float uSpotlightSoftness;',\r\n          'uniform float uSpotlightOpacity;',\r\n          'uniform float uMirror;',\r\n          'uniform float uDistort;',\r\n          'uniform float uShineFlip;',\r\n          'uniform vec3 uColor0; uniform vec3 uColor1; uniform vec3 uColor2; uniform vec3 uColor3;',\r\n          'uniform vec3 uColor4; uniform vec3 uColor5; uniform vec3 uColor6; uniform vec3 uColor7;',\r\n          'uniform int uColorCount;',\r\n          'varying vec2 vUv;',\r\n          'float rand(vec2 co){ return fract(sin(dot(co, vec2(12.9898,78.233))) * 43758.5453); }',\r\n          'vec2 rotate2D(vec2 p, float a){ float c=cos(a); float s=sin(a); return mat2(c,-s,s,c)*p; }',\r\n          'vec3 getGradientColor(float t){',\r\n          'float tt=clamp(t,0.0,1.0); int count=uColorCount; if(count<2) count=2;',\r\n          'float scaled=tt*float(count-1); float seg=floor(scaled); float f=fract(scaled);',\r\n          'if(seg<1.0) return mix(uColor0,uColor1,f);',\r\n          'if(seg<2.0 && count>2) return mix(uColor1,uColor2,f);',\r\n          'if(seg<3.0 && count>3) return mix(uColor2,uColor3,f);',\r\n          'if(seg<4.0 && count>4) return mix(uColor3,uColor4,f);',\r\n          'if(seg<5.0 && count>5) return mix(uColor4,uColor5,f);',\r\n          'if(seg<6.0 && count>6) return mix(uColor5,uColor6,f);',\r\n          'if(seg<7.0 && count>7) return mix(uColor6,uColor7,f);',\r\n          'if(count>7) return uColor7; if(count>6) return uColor6; if(count>5) return uColor5;',\r\n          'if(count>4) return uColor4; if(count>3) return uColor3; if(count>2) return uColor2;',\r\n          'return uColor1; }',\r\n          'void mainImage(out vec4 fragColor, in vec2 fragCoord){',\r\n          'vec2 uv0 = fragCoord.xy \/ iResolution.xy;',\r\n          'float aspect = iResolution.x \/ iResolution.y;',\r\n          'vec2 p = uv0*2.0-1.0; p.x*=aspect;',\r\n          'vec2 pr = rotate2D(p, uAngle); pr.x\/=aspect;',\r\n          'vec2 uv = pr*0.5+0.5;',\r\n          'vec2 uvMod = uv;',\r\n          'if(uDistort>0.0){ float a=uvMod.y*6.0; float b=uvMod.x*6.0; float w=0.01*uDistort; uvMod.x+=sin(a)*w; uvMod.y+=cos(b)*w; }',\r\n          'float t = uvMod.x;',\r\n          'if(uMirror>0.5){ t = 1.0 - abs(1.0 - 2.0*fract(t)); }',\r\n          'vec3 base = getGradientColor(t);',\r\n          'vec2 offset = vec2(iMouse.x\/iResolution.x, iMouse.y\/iResolution.y);',\r\n          'float d = length(uv0-offset); float r = max(uSpotlightRadius, 1e-4); float dn = d\/r;',\r\n          'float spot = (1.0 - 2.0*pow(dn, uSpotlightSoftness)) * uSpotlightOpacity;',\r\n          'vec3 cir = vec3(spot);',\r\n          'float stripe = fract(uvMod.x * max(uBlindCount, 1.0));',\r\n          'if(uShineFlip>0.5) stripe = 1.0 - stripe;',\r\n          'vec3 ran = vec3(stripe);',\r\n          'vec3 col = cir + base - ran;',\r\n          'col += (rand(gl_FragCoord.xy + iTime) - 0.5) * uNoise;',\r\n          'fragColor = vec4(col, 1.0);',\r\n          '}',\r\n          'void main(){ vec4 color; mainImage(color, vUv * iResolution.xy); gl_FragColor = color; }'\r\n        ].join('\\n');\r\n\r\n        function compile(type, src){\r\n          var s = gl.createShader(type);\r\n          gl.shaderSource(s, src);\r\n          gl.compileShader(s);\r\n          if(!gl.getShaderParameter(s, gl.COMPILE_STATUS)){ gl.deleteShader(s); return null; }\r\n          return s;\r\n        }\r\n        var vs = compile(gl.VERTEX_SHADER, vertexSrc);\r\n        var fs = compile(gl.FRAGMENT_SHADER, fragmentSrc);\r\n        if(!vs || !fs) return function(){};\r\n        var program = gl.createProgram();\r\n        gl.attachShader(program, vs);\r\n        gl.attachShader(program, fs);\r\n        gl.linkProgram(program);\r\n        if(!gl.getProgramParameter(program, gl.LINK_STATUS)) return function(){};\r\n        gl.useProgram(program);\r\n\r\n        var posBuffer = gl.createBuffer();\r\n        gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);\r\n        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1, 3,-1, -1,3]), gl.STATIC_DRAW);\r\n        var posLoc = gl.getAttribLocation(program, 'position');\r\n        gl.enableVertexAttribArray(posLoc);\r\n        gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);\r\n\r\n        var uvBuffer = gl.createBuffer();\r\n        gl.bindBuffer(gl.ARRAY_BUFFER, uvBuffer);\r\n        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0,0, 2,0, 0,2]), gl.STATIC_DRAW);\r\n        var uvLoc = gl.getAttribLocation(program, 'uv');\r\n        gl.enableVertexAttribArray(uvLoc);\r\n        gl.vertexAttribPointer(uvLoc, 2, gl.FLOAT, false, 0, 0);\r\n\r\n        function hexToRGB(hex){\r\n          var c = hex.replace('#', '');\r\n          return [\r\n            parseInt(c.slice(0,2), 16) \/ 255,\r\n            parseInt(c.slice(2,4), 16) \/ 255,\r\n            parseInt(c.slice(4,6), 16) \/ 255\r\n          ];\r\n        }\r\n        var stops = (opts.gradientColors || ['#5ec8f2', '#8b7cf6']).slice(0, 8);\r\n        if(stops.length === 1) stops.push(stops[0]);\r\n        while(stops.length < 8) stops.push(stops[stops.length - 1]);\r\n        var colorArr = stops.map(hexToRGB);\r\n        var colorCount = Math.max(2, Math.min(8, (opts.gradientColors || []).length || 2));\r\n\r\n        var U = {};\r\n        ['iResolution','iMouse','iTime','uAngle','uNoise','uBlindCount','uSpotlightRadius',\r\n         'uSpotlightSoftness','uSpotlightOpacity','uMirror','uDistort','uShineFlip',\r\n         'uColor0','uColor1','uColor2','uColor3','uColor4','uColor5','uColor6','uColor7','uColorCount'\r\n        ].forEach(function(name){ U[name] = gl.getUniformLocation(program, name); });\r\n\r\n        gl.uniform1f(U.uAngle, (opts.angle || 0) * Math.PI \/ 180);\r\n        gl.uniform1f(U.uNoise, opts.noise !== undefined ? opts.noise : 0.15);\r\n        gl.uniform1f(U.uSpotlightRadius, opts.spotlightRadius !== undefined ? opts.spotlightRadius : 0.5);\r\n        gl.uniform1f(U.uSpotlightSoftness, opts.spotlightSoftness !== undefined ? opts.spotlightSoftness : 1);\r\n        gl.uniform1f(U.uSpotlightOpacity, opts.spotlightOpacity !== undefined ? opts.spotlightOpacity : 0.6);\r\n        gl.uniform1f(U.uMirror, opts.mirrorGradient ? 1 : 0);\r\n        gl.uniform1f(U.uDistort, opts.distortAmount || 0);\r\n        gl.uniform1f(U.uShineFlip, opts.shineDirection === 'right' ? 1 : 0);\r\n        colorArr.forEach(function(c, i){ gl.uniform3f(U['uColor' + i], c[0], c[1], c[2]); });\r\n        gl.uniform1i(U.uColorCount, colorCount);\r\n\r\n        var blindCount = opts.blindCount || 14;\r\n        var blindMinWidth = opts.blindMinWidth || 60;\r\n\r\n        var parent = canvas.parentElement;\r\n        function resize(){\r\n          var w = parent.clientWidth, h = parent.clientHeight;\r\n          var dpr = Math.min(window.devicePixelRatio || 1, 2);\r\n          canvas.width = Math.max(1, Math.floor(w * dpr));\r\n          canvas.height = Math.max(1, Math.floor(h * dpr));\r\n          gl.viewport(0, 0, canvas.width, canvas.height);\r\n          gl.uniform3f(U.iResolution, canvas.width, canvas.height, 1);\r\n          var maxByMinWidth = Math.max(1, Math.floor(canvas.width \/ blindMinWidth));\r\n          gl.uniform1f(U.uBlindCount, Math.max(1, Math.min(blindCount, maxByMinWidth)));\r\n        }\r\n        var ro = null;\r\n        if('ResizeObserver' in window){ ro = new ResizeObserver(resize); ro.observe(parent); }\r\n        else { window.addEventListener('resize', resize); }\r\n        resize();\r\n\r\n        var mouseTarget = [canvas.width \/ 2, canvas.height \/ 2];\r\n        var mouseCur = mouseTarget.slice();\r\n        var dampening = opts.mouseDampening !== undefined ? opts.mouseDampening : 0.15;\r\n        function onPointerMove(e){\r\n          var rect = canvas.getBoundingClientRect();\r\n          var scale = Math.min(window.devicePixelRatio || 1, 2);\r\n          var x = (e.clientX - rect.left) * scale;\r\n          var y = (rect.height - (e.clientY - rect.top)) * scale;\r\n          mouseTarget = [x, y];\r\n        }\r\n        canvas.addEventListener('pointermove', onPointerMove);\r\n\r\n        var lastTime = 0;\r\n        var raf = null;\r\n        function draw(t){\r\n          gl.uniform1f(U.iTime, t * 0.001);\r\n          if(dampening > 0){\r\n            if(!lastTime) lastTime = t;\r\n            var dt = (t - lastTime) \/ 1000;\r\n            lastTime = t;\r\n            var factor = Math.min(1, 1 - Math.exp(-dt \/ Math.max(1e-4, dampening)));\r\n            mouseCur[0] += (mouseTarget[0] - mouseCur[0]) * factor;\r\n            mouseCur[1] += (mouseTarget[1] - mouseCur[1]) * factor;\r\n          } else {\r\n            mouseCur = mouseTarget;\r\n          }\r\n          gl.uniform2f(U.iMouse, mouseCur[0], mouseCur[1]);\r\n          gl.drawArrays(gl.TRIANGLES, 0, 3);\r\n        }\r\n        function loop(t){ draw(t); raf = requestAnimationFrame(loop); }\r\n\r\n        if(reduceMotion){ draw(0); }\r\n        else {\r\n          raf = requestAnimationFrame(loop);\r\n          if('IntersectionObserver' in window){\r\n            var io = new IntersectionObserver(function(entries){\r\n              entries.forEach(function(e){\r\n                if(e.isIntersecting){ if(!raf) raf = requestAnimationFrame(loop); }\r\n                else if(raf){ cancelAnimationFrame(raf); raf = null; }\r\n              });\r\n            }, { threshold: 0 });\r\n            io.observe(canvas);\r\n          }\r\n        }\r\n\r\n        return function cleanup(){\r\n          if(raf) cancelAnimationFrame(raf);\r\n          canvas.removeEventListener('pointermove', onPointerMove);\r\n          if(ro) ro.disconnect(); else window.removeEventListener('resize', resize);\r\n        };\r\n      }\r\n\r\n      var blindsCanvas = root.querySelector('#tgus-ct-canvas');\r\n      if(blindsCanvas){\r\n        tgusInitGradientBlinds(blindsCanvas, {\r\n          gradientColors: ['#5ec8f2', '#3b82f6', '#8b7cf6'],\r\n          angle: 15,\r\n          noise: 0.12,\r\n          blindCount: 14,\r\n          blindMinWidth: 60,\r\n          mouseDampening: 0.15,\r\n          spotlightRadius: 0.55,\r\n          spotlightSoftness: 1.2,\r\n          spotlightOpacity: 0.55\r\n        });\r\n      }\r\n\r\n      \/* ============ Headline reveal \u2014 same system used site-wide ============ *\/\r\n      var revealEl = root.querySelector('#tgus-ct-reveal');\r\n      if(revealEl){\r\n        var TGUS_COLORS = ['#5ec8f2', '#3b82f6', '#8b7cf6', '#ffffff', '#6d5ef0'];\r\n        var TGUS_TEXT_COLOR = '#f4f4f8';\r\n        var BAND_HALF = 17;\r\n        var SWEEP_START = -BAND_HALF;\r\n        var SWEEP_END = 100 + BAND_HALF;\r\n\r\n        var sweepEase = function(t){ return t < 0.5 ? 4 * t*t*t : 1 - Math.pow(-2*t+2, 3) \/ 2; };\r\n        var buildGradient = function(pos){\r\n          var bandStart = pos - BAND_HALF, bandEnd = pos + BAND_HALF;\r\n          if(bandStart >= 100) return 'linear-gradient(90deg,' + TGUS_TEXT_COLOR + ',' + TGUS_TEXT_COLOR + ')';\r\n          var n = TGUS_COLORS.length, parts = [];\r\n          if(bandStart > 0) parts.push(TGUS_TEXT_COLOR + ' 0%', TGUS_TEXT_COLOR + ' ' + bandStart.toFixed(2) + '%');\r\n          TGUS_COLORS.forEach(function(c, i){\r\n            var pct = n === 1 ? pos : bandStart + (i \/ (n - 1)) * BAND_HALF * 2;\r\n            parts.push(c + ' ' + pct.toFixed(2) + '%');\r\n          });\r\n          if(bandEnd < 100) parts.push('transparent ' + bandEnd.toFixed(2) + '%', 'transparent 100%');\r\n          return 'linear-gradient(90deg,' + parts.join(',') + ')';\r\n        };\r\n        var activateGradWord = function(lineEl){\r\n          var word = lineEl.querySelector('.tgus-grad-word');\r\n          if(word) word.classList.add('tgus-grad-active');\r\n        };\r\n        var sweepOne = function(el, duration){\r\n          var start = performance.now();\r\n          el.style.backgroundImage = buildGradient(SWEEP_START);\r\n          function tick(){\r\n            var t = Math.min((performance.now() - start) \/ duration, 1);\r\n            var pos = SWEEP_START + (SWEEP_END - SWEEP_START) * sweepEase(t);\r\n            el.style.backgroundImage = buildGradient(pos);\r\n            if(t < 1) requestAnimationFrame(tick);\r\n            else activateGradWord(el);\r\n          }\r\n          requestAnimationFrame(tick);\r\n        };\r\n\r\n        if(reduceMotion){\r\n          revealEl.style.backgroundImage = buildGradient(SWEEP_END);\r\n          activateGradWord(revealEl);\r\n        } else {\r\n          setTimeout(function(){ sweepOne(revealEl, 900); }, 200);\r\n        }\r\n      }\r\n\r\n      \/* ============ Bento card border glow \u2014 ported from MagicBento's\r\n         --glow-x\/--glow-y\/--glow-intensity + masked ::after ring, minus\r\n         the particle burst and page-wide spotlight ============ *\/\r\n      if(!reduceMotion){\r\n        root.querySelectorAll('.tgus-bento-card').forEach(function(card){\r\n          card.addEventListener('mousemove', function(e){\r\n            var rect = card.getBoundingClientRect();\r\n            var x = ((e.clientX - rect.left) \/ rect.width) * 100;\r\n            var y = ((e.clientY - rect.top) \/ rect.height) * 100;\r\n            card.style.setProperty('--glow-x', x.toFixed(2) + '%');\r\n            card.style.setProperty('--glow-y', y.toFixed(2) + '%');\r\n            card.style.setProperty('--glow-intensity', '1');\r\n          });\r\n          card.addEventListener('mouseleave', function(){\r\n            card.style.setProperty('--glow-intensity', '0');\r\n          });\r\n        });\r\n      }\r\n    })();\r\n  <\/script>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Let&#8217;s talk about your business Fifteen minutes is usually enough to tell you what&#8217;s worth automating and what isn&#8217;t. Ready when you are Send us a message and someone from our team will get back to you within one business day \u2014 no forms to fill, no sales script. Send us a message Facebook ToGrow [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-413","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/pages\/413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/comments?post=413"}],"version-history":[{"count":37,"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/pages\/413\/revisions"}],"predecessor-version":[{"id":1248,"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/pages\/413\/revisions\/1248"}],"wp:attachment":[{"href":"https:\/\/togrowagencia.com\/en\/wp-json\/wp\/v2\/media?parent=413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}