{"id":79,"date":"2024-04-29T14:10:40","date_gmt":"2024-04-29T14:10:40","guid":{"rendered":"https:\/\/bettaweb.co.za\/?page_id=79"},"modified":"2026-09-23T12:45:41","modified_gmt":"2026-09-23T12:45:41","slug":"contact-us","status":"publish","type":"page","link":"https:\/\/bettaweb.co.za\/?page_id=79","title":{"rendered":"Contact Us"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"79\" class=\"elementor elementor-79\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ecc8ba e-flex e-con-boxed e-con e-parent\" data-id=\"6ecc8ba\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-1c6d1b4 e-flex e-con-boxed e-con e-child\" data-id=\"1c6d1b4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-0885737 e-con-full e-flex e-con e-child\" data-id=\"0885737\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ad1d3a5 e-flex e-con-boxed e-con e-child\" data-id=\"ad1d3a5\" 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-90b0f14 elementor-widget elementor-widget-heading\" data-id=\"90b0f14\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">LET'S CONNECT<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-92697de elementor-widget elementor-widget-heading\" data-id=\"92697de\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Contact Us<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-282a1d2 elementor-widget elementor-widget-heading\" data-id=\"282a1d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">We'd Love to Hear From you<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-56dc8e9 elementor-widget elementor-widget-text-editor\" data-id=\"56dc8e9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Have a question, a project in mind, or just want to say hello? Get in touch \u2014 we&#8217;re here to help you grow your online presence.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-fbcd357 e-flex e-con-boxed e-con e-child\" data-id=\"fbcd357\" 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-4cf69d5 elementor-widget__width-auto elementor-widget elementor-widget-button\" data-id=\"4cf69d5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Get a Free Qoute<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d0b8b8 elementor-widget elementor-widget-button\" data-id=\"4d0b8b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Chat With us<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c81844d e-flex e-con-boxed e-con e-child\" data-id=\"c81844d\" 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-44a2ac7 elementor-widget elementor-widget-heading\" data-id=\"44a2ac7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Great Websites <br>\nStart with a <br>\nConversation<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86914b6 elementor-widget elementor-widget-image\" data-id=\"86914b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"768\" height=\"576\" src=\"https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/laptop-768x576.png\" class=\"attachment-medium_large size-medium_large wp-image-161\" alt=\"laptop\" srcset=\"https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/laptop-768x576.png 768w, https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/laptop-300x225.png 300w, https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/laptop-1024x768.png 1024w, https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/laptop.png 1448w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\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\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-001ca8a betta-smoke-main e-flex e-con-boxed e-con e-parent\" data-id=\"001ca8a\" 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-26a4cf0 elementor-widget elementor-widget-html\" data-id=\"26a4cf0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"betta-smoke-layer\" aria-hidden=\"true\">\n  <canvas id=\"bettaSmokeCanvas\"><\/canvas>\n<\/div>\n\n<style>\n\/* =========================================================\n   BETTAWEB FULL-BLEED SMOKE LAYER\n   The smoke layer is moved onto .betta-smoke-main at runtime,\n   so it covers the ENTIRE outer Elementor container.\n   ========================================================= *\/\n\n.betta-smoke-layer {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    min-width: 100% !important;\n    min-height: 100% !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    overflow: hidden !important;\n    pointer-events: none !important;\n    z-index: 0 !important;\n\n    \/* EXACT same base as the outer main container *\/\n    background:\n        radial-gradient(circle at 12% 25%, rgba(255, 42, 190, 0.11), transparent 26%),\n        radial-gradient(circle at 88% 18%, rgba(46, 131, 255, 0.14), transparent 28%),\n        radial-gradient(circle at 70% 82%, rgba(142, 61, 255, 0.12), transparent 30%),\n        linear-gradient(135deg, #090329 0%, #10043d 28%, #18065d 58%, #160653 100%);\n}\n\n#bettaSmokeCanvas {\n    position: absolute !important;\n    inset: 0 !important;\n    display: block !important;\n    width: 100% !important;\n    height: 100% !important;\n    min-width: 100% !important;\n    min-height: 100% !important;\n    max-width: none !important;\n    max-height: none !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    background: transparent !important;\n    pointer-events: none !important;\n\n    \/* Empty WebGL pixels disappear; neon smoke remains *\/\n    mix-blend-mode: screen;\n    opacity: .96;\n    filter: saturate(1.18) contrast(1.04);\n}\n\n@media (max-width: 1024px) {\n    #bettaSmokeCanvas { opacity: .88; }\n}\n\n@media (max-width: 767px) {\n    #bettaSmokeCanvas { opacity: .76; }\n}\n<\/style>\n\n<script>\n(function(){\n'use strict';\n\nvar canvas = document.getElementById('bettaSmokeCanvas');\nif (!canvas) return;\n\n\/* =========================================================\n   ELEMENTOR FULL-BLEED SETUP\n   Add CSS class: betta-smoke-main\n   to the OUTERMOST purple container.\n\n   The HTML widget may stay where it is in Navigator.\n   This script physically moves ONLY the smoke layer into that\n   outer container, then stretches it edge-to-edge.\n   ========================================================= *\/\nvar htmlWidget = canvas.closest('.elementor-widget-html');\nvar smokeLayer = canvas.closest('.betta-smoke-layer');\nvar mainParent = document.querySelector('.betta-smoke-main');\n\n\/* Fallback if the class was forgotten *\/\nif (!mainParent && htmlWidget) {\n    mainParent = htmlWidget.parentElement;\n}\n\nif (!mainParent || !smokeLayer) return;\n\nmainParent.style.setProperty('position', 'relative');\nmainParent.style.setProperty('overflow', 'hidden');\nmainParent.style.setProperty('isolation', 'isolate');\n\n\/* Move the actual smoke layer into the FULL outer container *\/\nif (smokeLayer.parentElement !== mainParent) {\n    mainParent.insertBefore(smokeLayer, mainParent.firstChild);\n}\n\n\/* Force full coverage *\/\nsmokeLayer.style.setProperty('position', 'absolute', 'important');\nsmokeLayer.style.setProperty('inset', '0', 'important');\nsmokeLayer.style.setProperty('width', '100%', 'important');\nsmokeLayer.style.setProperty('height', '100%', 'important');\nsmokeLayer.style.setProperty('min-width', '100%', 'important');\nsmokeLayer.style.setProperty('min-height', '100%', 'important');\nsmokeLayer.style.setProperty('margin', '0', 'important');\nsmokeLayer.style.setProperty('padding', '0', 'important');\nsmokeLayer.style.setProperty('z-index', '0', 'important');\nsmokeLayer.style.setProperty('pointer-events', 'none', 'important');\n\n\/* The original Elementor HTML widget should consume ZERO layout space *\/\nif (htmlWidget) {\n    htmlWidget.style.setProperty('position', 'absolute', 'important');\n    htmlWidget.style.setProperty('width', '0', 'important');\n    htmlWidget.style.setProperty('height', '0', 'important');\n    htmlWidget.style.setProperty('min-width', '0', 'important');\n    htmlWidget.style.setProperty('min-height', '0', 'important');\n    htmlWidget.style.setProperty('margin', '0', 'important');\n    htmlWidget.style.setProperty('padding', '0', 'important');\n    htmlWidget.style.setProperty('overflow', 'hidden', 'important');\n    htmlWidget.style.setProperty('pointer-events', 'none', 'important');\n}\n\ncanvas.width  = Math.max(2, smokeLayer.clientWidth);\ncanvas.height = Math.max(2, smokeLayer.clientHeight);\n\n\nvar config = {\n    TEXTURE_DOWNSAMPLE: 2,\n    DENSITY_DISSIPATION: 0.98,\n    VELOCITY_DISSIPATION: 0.99,\n    PRESSURE_DISSIPATION: 0.8,\n    PRESSURE_ITERATIONS: 12,\n    CURL: 36,\n    SPLAT_RADIUS: 0.006\n};\n\nvar pointers   = [];\nvar splatStack = [];\n\n\/* BettaWeb neon palette: cyan, blue, violet, magenta, pink *\/\nvar bettaPalette = [\n    [0.20, 1.25, 1.85],\n    [0.18, 0.55, 1.90],\n    [0.62, 0.24, 1.80],\n    [1.10, 0.18, 1.70],\n    [1.75, 0.10, 1.00],\n    [1.90, 0.14, 0.62]\n];\nvar bettaColorIndex = 0;\nfunction getBettaColor() {\n    var c = bettaPalette[bettaColorIndex % bettaPalette.length];\n    bettaColorIndex++;\n    return [c[0], c[1], c[2]];\n}\n\n\nvar _getWebGLContext     = getWebGLContext( canvas );\nvar gl                   = _getWebGLContext.gl;\nvar ext                  = _getWebGLContext.ext;\nvar support_linear_float = _getWebGLContext.support_linear_float;\n\nfunction getWebGLContext( canvas ) {\n\n    var params = {\n        alpha: true,\n        depth: false,\n        stencil: false,\n        antialias: false\n    };\n\n    var gl = canvas.getContext( 'webgl2', params );\n\n    var isWebGL2 = !!gl;\n\n    if ( !isWebGL2 ) gl = canvas.getContext( 'webgl', params ) || canvas.getContext( 'experimental-webgl', params );\n\n    var halfFloat            = gl.getExtension( 'OES_texture_half_float' );\n    var support_linear_float = gl.getExtension( 'OES_texture_half_float_linear' );\n\n    if ( isWebGL2 ) {\n        gl.getExtension( 'EXT_color_buffer_float' );\n        support_linear_float = gl.getExtension( 'OES_texture_float_linear' );\n    }\n\n    gl.clearColor( 0.0, 0.0, 0.0, 0.0 );\n\n    var internalFormat   = isWebGL2 ? gl.RGBA16F : gl.RGBA;\n    var internalFormatRG = isWebGL2 ? gl.RG16F : gl.RGBA;\n    var formatRG         = isWebGL2 ? gl.RG : gl.RGBA;\n    var texType          = isWebGL2 ? gl.HALF_FLOAT : halfFloat.HALF_FLOAT_OES;\n\n    return {\n        gl: gl,\n        ext: {\n            internalFormat: internalFormat,\n            internalFormatRG: internalFormatRG,\n            formatRG: formatRG,\n            texType: texType\n        },\n        support_linear_float: support_linear_float\n    };\n}\n\nfunction pointerPrototype() {\n    this.id    = -1;\n    this.x     = 0;\n    this.y     = 0;\n    this.dx    = 0;\n    this.dy    = 0;\n    this.down  = false;\n    this.moved = false;\n    this.color = getBettaColor();\n}\n\npointers.push( new pointerPrototype() );\n\nvar GLProgram = function () {\n    \n    function GLProgram( vertexShader, fragmentShader ) {\n\n        if ( !(this instanceof GLProgram) )\n            throw new TypeError( \"Cannot call a class as a function\" );\n\n        this.uniforms = {};\n        this.program  = gl.createProgram();\n\n        gl.attachShader( this.program, vertexShader );\n        gl.attachShader( this.program, fragmentShader );\n        gl.linkProgram( this.program );\n\n        if ( !gl.getProgramParameter( this.program, gl.LINK_STATUS ) ) throw gl.getProgramInfoLog( this.program );\n\n        var uniformCount = gl.getProgramParameter( this.program, gl.ACTIVE_UNIFORMS );\n        \n        for ( var i = 0; i < uniformCount; i++ ) {\n            \n            var uniformName = gl.getActiveUniform( this.program, i ).name;\n            \n            this.uniforms[ uniformName ] = gl.getUniformLocation( this.program, uniformName );\n            \n        }\n    }\n\n    GLProgram.prototype.bind = function bind() {\n        gl.useProgram( this.program );\n    };\n\n    return GLProgram;\n    \n}();\n\nfunction compileShader( type, source ) {\n\n    var shader = gl.createShader( type );\n    \n    gl.shaderSource( shader, source );\n    gl.compileShader( shader );\n\n    if ( !gl.getShaderParameter( shader, gl.COMPILE_STATUS ) ) throw gl.getShaderInfoLog( shader );\n\n    return shader;\n\n}\n\nvar baseVertexShader               = compileShader( gl.VERTEX_SHADER, 'precision highp float; precision mediump sampler2D; attribute vec2 aPosition; varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB; uniform vec2 texelSize; void main () {     vUv = aPosition * 0.5 + 0.5;     vL = vUv - vec2(texelSize.x, 0.0);     vR = vUv + vec2(texelSize.x, 0.0);     vT = vUv + vec2(0.0, texelSize.y);     vB = vUv - vec2(0.0, texelSize.y);     gl_Position = vec4(aPosition, 0.0, 1.0); }' );\nvar clearShader                    = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; uniform sampler2D uTexture; uniform float value; void main () {     gl_FragColor = value * texture2D(uTexture, vUv); }' );\nvar displayShader                  = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; uniform sampler2D uTexture; void main () { vec3 c = texture2D(uTexture, vUv).rgb; float a = clamp(max(max(c.r,c.g),c.b) * 1.15, 0.0, 1.0); gl_FragColor = vec4(c, a); }' );\nvar splatShader                    = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; uniform sampler2D uTarget; uniform float aspectRatio; uniform vec3 color; uniform vec2 point; uniform float radius; void main () {     vec2 p = vUv - point.xy;     p.x *= aspectRatio;     vec3 splat = exp(-dot(p, p) \/ radius) * color;     vec3 base = texture2D(uTarget, vUv).xyz;     gl_FragColor = vec4(base + splat, 1.0); }' );\nvar advectionManualFilteringShader = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; uniform sampler2D uVelocity; uniform sampler2D uSource; uniform vec2 texelSize; uniform float dt; uniform float dissipation; vec4 bilerp (in sampler2D sam, in vec2 p) {     vec4 st;     st.xy = floor(p - 0.5) + 0.5;     st.zw = st.xy + 1.0;     vec4 uv = st * texelSize.xyxy;     vec4 a = texture2D(sam, uv.xy);     vec4 b = texture2D(sam, uv.zy);     vec4 c = texture2D(sam, uv.xw);     vec4 d = texture2D(sam, uv.zw);     vec2 f = p - st.xy;     return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); } void main () {     vec2 coord = gl_FragCoord.xy - dt * texture2D(uVelocity, vUv).xy;     gl_FragColor = dissipation * bilerp(uSource, coord);     gl_FragColor.a = 1.0; }' );\nvar advectionShader                = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; uniform sampler2D uVelocity; uniform sampler2D uSource; uniform vec2 texelSize; uniform float dt; uniform float dissipation; void main () {     vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;     gl_FragColor = dissipation * texture2D(uSource, coord); }' );\nvar divergenceShader               = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB; uniform sampler2D uVelocity; vec2 sampleVelocity (in vec2 uv) {     vec2 multiplier = vec2(1.0, 1.0);     if (uv.x < 0.0) { uv.x = 0.0; multiplier.x = -1.0; }     if (uv.x > 1.0) { uv.x = 1.0; multiplier.x = -1.0; }     if (uv.y < 0.0) { uv.y = 0.0; multiplier.y = -1.0; }     if (uv.y > 1.0) { uv.y = 1.0; multiplier.y = -1.0; }     return multiplier * texture2D(uVelocity, uv).xy; } void main () {     float L = sampleVelocity(vL).x;     float R = sampleVelocity(vR).x;     float T = sampleVelocity(vT).y;     float B = sampleVelocity(vB).y;     float div = 0.5 * (R - L + T - B);     gl_FragColor = vec4(div, 0.0, 0.0, 1.0); }' );\nvar curlShader                     = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB; uniform sampler2D uVelocity; void main () {     float L = texture2D(uVelocity, vL).y;     float R = texture2D(uVelocity, vR).y;     float T = texture2D(uVelocity, vT).x;     float B = texture2D(uVelocity, vB).x;     float vorticity = R - L - T + B;     gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); }' );\nvar vorticityShader                = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB; uniform sampler2D uVelocity; uniform sampler2D uCurl; uniform float curl; uniform float dt; void main () {     float L = texture2D(uCurl, vL).y;     float R = texture2D(uCurl, vR).y;     float T = texture2D(uCurl, vT).x;     float B = texture2D(uCurl, vB).x;     float C = texture2D(uCurl, vUv).x;     vec2 force = vec2(abs(T) - abs(B), abs(R) - abs(L));     force *= 1.0 \/ length(force + 0.00001) * curl * C;     vec2 vel = texture2D(uVelocity, vUv).xy;     gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); }' );\nvar pressureShader                 = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB; uniform sampler2D uPressure; uniform sampler2D uDivergence; vec2 boundary (in vec2 uv) {     uv = min(max(uv, 0.0), 1.0);     return uv; } void main () {     float L = texture2D(uPressure, boundary(vL)).x;     float R = texture2D(uPressure, boundary(vR)).x;     float T = texture2D(uPressure, boundary(vT)).x;     float B = texture2D(uPressure, boundary(vB)).x;     float C = texture2D(uPressure, vUv).x;     float divergence = texture2D(uDivergence, vUv).x;     float pressure = (L + R + B + T - divergence) * 0.25;     gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0); }' );\nvar gradientSubtractShader         = compileShader( gl.FRAGMENT_SHADER, 'precision highp float; precision mediump sampler2D; varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB; uniform sampler2D uPressure; uniform sampler2D uVelocity; vec2 boundary (in vec2 uv) {     uv = min(max(uv, 0.0), 1.0);     return uv; } void main () {     float L = texture2D(uPressure, boundary(vL)).x;     float R = texture2D(uPressure, boundary(vR)).x;     float T = texture2D(uPressure, boundary(vT)).x;     float B = texture2D(uPressure, boundary(vB)).x;     vec2 velocity = texture2D(uVelocity, vUv).xy;     velocity.xy -= vec2(R - L, T - B);     gl_FragColor = vec4(velocity, 0.0, 1.0); }' );\n\nvar textureWidth  = void 0;\nvar textureHeight = void 0;\nvar density       = void 0;\nvar velocity      = void 0;\nvar divergence    = void 0;\nvar curl          = void 0;\nvar pressure      = void 0;\n\ninitFramebuffers();\n\nvar clearProgram           = new GLProgram( baseVertexShader, clearShader );\nvar displayProgram         = new GLProgram( baseVertexShader, displayShader );\nvar splatProgram           = new GLProgram( baseVertexShader, splatShader );\nvar advectionProgram       = new GLProgram( baseVertexShader, support_linear_float ? advectionShader : advectionManualFilteringShader );\nvar divergenceProgram      = new GLProgram( baseVertexShader, divergenceShader );\nvar curlProgram            = new GLProgram( baseVertexShader, curlShader );\nvar vorticityProgram       = new GLProgram( baseVertexShader, vorticityShader );\nvar pressureProgram        = new GLProgram( baseVertexShader, pressureShader );\nvar gradienSubtractProgram = new GLProgram( baseVertexShader, gradientSubtractShader );\n\nfunction initFramebuffers() {\n\n    textureWidth  = gl.drawingBufferWidth >> config.TEXTURE_DOWNSAMPLE;\n    textureHeight = gl.drawingBufferHeight >> config.TEXTURE_DOWNSAMPLE;\n\n    var iFormat   = ext.internalFormat;\n    var iFormatRG = ext.internalFormatRG;\n    var formatRG  = ext.formatRG;\n    var texType   = ext.texType;\n\n    density    = createDoubleFBO( 0, textureWidth, textureHeight, iFormat, gl.RGBA, texType, support_linear_float ? gl.LINEAR : gl.NEAREST );\n    velocity   = createDoubleFBO( 2, textureWidth, textureHeight, iFormatRG, formatRG, texType, support_linear_float ? gl.LINEAR : gl.NEAREST );\n    divergence = createFBO( 4, textureWidth, textureHeight, iFormatRG, formatRG, texType, gl.NEAREST );\n    curl       = createFBO( 5, textureWidth, textureHeight, iFormatRG, formatRG, texType, gl.NEAREST );\n    pressure   = createDoubleFBO( 6, textureWidth, textureHeight, iFormatRG, formatRG, texType, gl.NEAREST );\n\n}\n\nfunction createFBO( texId, w, h, internalFormat, format, type, param ) {\n\n    gl.activeTexture( gl.TEXTURE0 + texId );\n\n    var texture = gl.createTexture();\n\n    gl.bindTexture( gl.TEXTURE_2D, texture );\n    gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, param );\n    gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, param );\n    gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE );\n    gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE );\n    gl.texImage2D( gl.TEXTURE_2D, 0, internalFormat, w, h, 0, format, type, null );\n\n    var fbo = gl.createFramebuffer();\n\n    gl.bindFramebuffer( gl.FRAMEBUFFER, fbo );\n    gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0 );\n    gl.viewport( 0, 0, w, h );\n    gl.clear( gl.COLOR_BUFFER_BIT );\n\n    return [ texture, fbo, texId ];\n\n}\n\nfunction createDoubleFBO( texId, w, h, internalFormat, format, type, param ) {\n\n    var fbo1 = createFBO( texId, w, h, internalFormat, format, type, param );\n    var fbo2 = createFBO( texId + 1, w, h, internalFormat, format, type, param );\n\n    return {\n        get first() {\n            return fbo1;\n        },\n        get second() {\n            return fbo2;\n        },\n        swap: function swap() {\n            var temp = fbo1;\n\n            fbo1 = fbo2;\n            fbo2 = temp;\n        }\n    };\n\n}\n\nvar blit = function () {\n\n    gl.bindBuffer( gl.ARRAY_BUFFER, gl.createBuffer() );\n    gl.bufferData( gl.ARRAY_BUFFER, new Float32Array( [ -1, -1, -1, 1, 1, 1, 1, -1 ] ), gl.STATIC_DRAW );\n    gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer() );\n    gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, new Uint16Array( [ 0, 1, 2, 0, 2, 3 ] ), gl.STATIC_DRAW );\n    gl.vertexAttribPointer( 0, 2, gl.FLOAT, false, 0, 0 );\n    gl.enableVertexAttribArray( 0 );\n\n    return function ( destination ) {\n        gl.bindFramebuffer( gl.FRAMEBUFFER, destination );\n        gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n    };\n\n}();\n\nvar lastTime = Date.now();\n\nupdate();\n\nfunction update() {\n\n    resizeCanvas();\n\n    var dt = Math.min( (Date.now() - lastTime) \/ 1000, 0.016 );\n    lastTime = Date.now();\n\n    gl.viewport( 0, 0, textureWidth, textureHeight );\n\n    if ( splatStack.length > 0 ) {\n        for ( var m = 0; m < splatStack.pop(); m++ ) {\n\n            var color = getBettaColor();\n            var x     = canvas.width * Math.random();\n            var y     = canvas.height * Math.random();\n            var dx    = 1000 * (Math.random() - 0.5);\n            var dy    = 1000 * (Math.random() - 0.5);\n\n            splat( x, y, dx, dy, color );\n        }\n    }\n\n    advectionProgram.bind();\n    gl.uniform2f( advectionProgram.uniforms.texelSize, 1.0 \/ textureWidth, 1.0 \/ textureHeight );\n    gl.uniform1i( advectionProgram.uniforms.uVelocity, velocity.first[ 2 ] );\n    gl.uniform1i( advectionProgram.uniforms.uSource, velocity.first[ 2 ] );\n    gl.uniform1f( advectionProgram.uniforms.dt, dt );\n    gl.uniform1f( advectionProgram.uniforms.dissipation, config.VELOCITY_DISSIPATION );\n    blit( velocity.second[ 1 ] );\n    velocity.swap();\n\n    gl.uniform1i( advectionProgram.uniforms.uVelocity, velocity.first[ 2 ] );\n    gl.uniform1i( advectionProgram.uniforms.uSource, density.first[ 2 ] );\n    gl.uniform1f( advectionProgram.uniforms.dissipation, config.DENSITY_DISSIPATION );\n    blit( density.second[ 1 ] );\n    density.swap();\n\n    for ( var i = 0, len =  pointers.length; i < len; i++ ) {\n        var pointer = pointers[ i ];\n\n        if ( pointer.moved ) {\n            splat( pointer.x, pointer.y, pointer.dx, pointer.dy, pointer.color );\n            pointer.moved = false;\n        }\n    }\n\n    curlProgram.bind();\n    gl.uniform2f( curlProgram.uniforms.texelSize, 1.0 \/ textureWidth, 1.0 \/ textureHeight );\n    gl.uniform1i( curlProgram.uniforms.uVelocity, velocity.first[ 2 ] );\n    blit( curl[ 1 ] );\n\n    vorticityProgram.bind();\n    gl.uniform2f( vorticityProgram.uniforms.texelSize, 1.0 \/ textureWidth, 1.0 \/ textureHeight );\n    gl.uniform1i( vorticityProgram.uniforms.uVelocity, velocity.first[ 2 ] );\n    gl.uniform1i( vorticityProgram.uniforms.uCurl, curl[ 2 ] );\n    gl.uniform1f( vorticityProgram.uniforms.curl, config.CURL );\n    gl.uniform1f( vorticityProgram.uniforms.dt, dt );\n    blit( velocity.second[ 1 ] );\n    velocity.swap();\n\n    divergenceProgram.bind();\n    gl.uniform2f( divergenceProgram.uniforms.texelSize, 1.0 \/ textureWidth, 1.0 \/ textureHeight );\n    gl.uniform1i( divergenceProgram.uniforms.uVelocity, velocity.first[ 2 ] );\n    blit( divergence[ 1 ] );\n\n    clearProgram.bind();\n\n    var pressureTexId = pressure.first[ 2 ];\n\n    gl.activeTexture( gl.TEXTURE0 + pressureTexId );\n    gl.bindTexture( gl.TEXTURE_2D, pressure.first[ 0 ] );\n    gl.uniform1i( clearProgram.uniforms.uTexture, pressureTexId );\n    gl.uniform1f( clearProgram.uniforms.value, config.PRESSURE_DISSIPATION );\n    blit( pressure.second[ 1 ] );\n    pressure.swap();\n\n    pressureProgram.bind();\n    gl.uniform2f( pressureProgram.uniforms.texelSize, 1.0 \/ textureWidth, 1.0 \/ textureHeight );\n    gl.uniform1i( pressureProgram.uniforms.uDivergence, divergence[ 2 ] );\n    pressureTexId = pressure.first[ 2 ];\n    gl.activeTexture( gl.TEXTURE0 + pressureTexId );\n\n    for ( var _i = 0; _i < config.PRESSURE_ITERATIONS; _i++ ) {\n        gl.bindTexture( gl.TEXTURE_2D, pressure.first[ 0 ] );\n        gl.uniform1i( pressureProgram.uniforms.uPressure, pressureTexId );\n        blit( pressure.second[ 1 ] );\n        pressure.swap();\n    }\n\n    gradienSubtractProgram.bind();\n    gl.uniform2f( gradienSubtractProgram.uniforms.texelSize, 1.0 \/ textureWidth, 1.0 \/ textureHeight );\n    gl.uniform1i( gradienSubtractProgram.uniforms.uPressure, pressure.first[ 2 ] );\n    gl.uniform1i( gradienSubtractProgram.uniforms.uVelocity, velocity.first[ 2 ] );\n    blit( velocity.second[ 1 ] );\n    velocity.swap();\n\n    gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );\n    displayProgram.bind();\n    gl.uniform1i( displayProgram.uniforms.uTexture, density.first[ 2 ] );\n    blit( null );\n\n    requestAnimationFrame( update );\n\n}\n\nfunction splat( x, y, dx, dy, color ) {\n\n    splatProgram.bind();\n    gl.uniform1i( splatProgram.uniforms.uTarget, velocity.first[ 2 ] );\n    gl.uniform1f( splatProgram.uniforms.aspectRatio, canvas.width \/ canvas.height );\n    gl.uniform2f( splatProgram.uniforms.point, x \/ canvas.width, 1.0 - y \/ canvas.height );\n    gl.uniform3f( splatProgram.uniforms.color, dx, -dy, 1.0 );\n    gl.uniform1f( splatProgram.uniforms.radius, config.SPLAT_RADIUS );\n    blit( velocity.second[ 1 ] );\n    velocity.swap();\n\n    gl.uniform1i( splatProgram.uniforms.uTarget, density.first[ 2 ] );\n    gl.uniform3f( splatProgram.uniforms.color, color[ 0 ] * 0.45, color[ 1 ] * 0.45, color[ 2 ] * 0.45 );\n    blit( density.second[ 1 ] );\n    density.swap();\n\n}\n\nfunction resizeCanvas() {\n\n    var w = Math.max(2, Math.floor(smokeLayer.clientWidth));\n    var h = Math.max(2, Math.floor(smokeLayer.clientHeight));\n\n    if ( canvas.width !== w || canvas.height !== h ) {\n        canvas.width = w;\n        canvas.height = h;\n        initFramebuffers();\n    }\n\n}\n\nvar count = 0;\nvar colorArr = getBettaColor();\nvar pointerStarted = false;\n\nfunction getCanvasPoint(e) {\n    var rect = canvas.getBoundingClientRect();\n    if (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom) return null;\n    return {\n        x: (e.clientX - rect.left) * (canvas.width \/ rect.width),\n        y: (e.clientY - rect.top) * (canvas.height \/ rect.height)\n    };\n}\n\ndocument.addEventListener('pointermove', function(e) {\n    var pt = getCanvasPoint(e);\n    if (!pt) {\n        pointerStarted = false;\n        return;\n    }\n\n    count++;\n    if (count > 28) {\n        colorArr = getBettaColor();\n        count = 0;\n    }\n\n    if (!pointerStarted) {\n        pointers[0].x = pt.x;\n        pointers[0].y = pt.y;\n        pointers[0].dx = 0;\n        pointers[0].dy = 0;\n        pointers[0].moved = false;\n        pointerStarted = true;\n        return;\n    }\n\n    pointers[0].down  = true;\n    pointers[0].color = colorArr;\n    pointers[0].moved = true;\n    pointers[0].dx    = (pt.x - pointers[0].x) * 7.0;\n    pointers[0].dy    = (pt.y - pointers[0].y) * 7.0;\n    pointers[0].x     = pt.x;\n    pointers[0].y     = pt.y;\n}, { passive: true });\n\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1248d9b e-flex e-con-boxed e-con e-child\" data-id=\"1248d9b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2c433e1 e-flex e-con-boxed e-con e-child\" data-id=\"2c433e1\" 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-edd495e elementor-widget elementor-widget-image\" data-id=\"edd495e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"583\" height=\"791\" src=\"https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/BossMike-583x791-1.png\" class=\"attachment-medium_large size-medium_large wp-image-265\" alt=\"BossMike-583x791\" srcset=\"https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/BossMike-583x791-1.png 583w, https:\/\/bettaweb.co.za\/wp-content\/uploads\/2026\/09\/BossMike-583x791-1-221x300.png 221w\" sizes=\"(max-width: 583px) 100vw, 583px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ba49fc6 elementor-view-default elementor-position-block-start elementor-mobile-position-block-start elementor-widget elementor-widget-icon-box\" data-id=\"ba49fc6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<span  class=\"elementor-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-hands-helping\" viewBox=\"0 0 640 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M488 192H336v56c0 39.7-32.3 72-72 72s-72-32.3-72-72V126.4l-64.9 39C107.8 176.9 96 197.8 96 220.2v47.3l-80 46.2C.7 322.5-4.6 342.1 4.3 357.4l80 138.6c8.8 15.3 28.4 20.5 43.7 11.7L231.4 448H368c35.3 0 64-28.7 64-64h16c17.7 0 32-14.3 32-32v-64h8c13.3 0 24-10.7 24-24v-48c0-13.3-10.7-24-24-24zm147.7-37.4L555.7 16C546.9.7 527.3-4.5 512 4.3L408.6 64H306.4c-12 0-23.7 3.4-33.9 9.7L239 94.6c-9.4 5.8-15 16.1-15 27.1V248c0 22.1 17.9 40 40 40s40-17.9 40-40v-88h184c30.9 0 56 25.1 56 56v28.5l80-46.2c15.3-8.9 20.5-28.4 11.7-43.7z\"><\/path><\/svg>\t\t\t\t<\/span>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tReal People. Real Support.\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tSpeak directly with our team. We're here to help you succeed.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7c2442b e-flex e-con-boxed e-con e-child\" data-id=\"7c2442b\" 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-b9eb111 elementor-widget elementor-widget-text-editor\" data-id=\"b9eb111\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>GET IN TOUCH<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-97c2507 elementor-widget elementor-widget-heading\" data-id=\"97c2507\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">BettaWeb<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-09855f1 elementor-view-default elementor-position-block-start elementor-mobile-position-block-start elementor-widget elementor-widget-icon-box\" data-id=\"09855f1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<span  class=\"elementor-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-phone\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z\"><\/path><\/svg>\t\t\t\t<\/span>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tCall Us\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\t+27 83 959 4389\nMon - Fri, 8am - 5pm\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f186365 elementor-widget elementor-widget-button\" data-id=\"f186365\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-phone\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Call +27 83 959 4389<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2091bb6 elementor-widget elementor-widget-text-editor\" data-id=\"2091bb6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"bw-email-row\"><div class=\"bw-email-icon\">\u2709<\/div><div class=\"bw-email-copy\"><strong>Email Us<\/strong><p><a href=\"mailto:info@bettaweb.co.za\"><br \/>info@bettaweb.co.za<br \/><\/a><\/p><p>We usually respond within 24 hours.<\/p><\/div><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-55b38c9 e-flex e-con-boxed e-con e-parent\" data-id=\"55b38c9\" 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-156d574 elementor-widget elementor-widget-html\" data-id=\"156d574\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"betta-dog-widget\" id=\"bettaDogWidget\">\n\n    <div class=\"bd-track\" id=\"bdTrack\">\n\n        <div class=\"bd-dog\" id=\"bdDog\" aria-label=\"Drag me left or right\">\n\n            <!-- CURVED ERROR MESSAGE -->\n            <svg class=\"bd-error-message\"\n                 viewBox=\"0 0 500 180\"\n                 aria-hidden=\"true\">\n\n                <path\n                    id=\"bdErrorCurve\"\n                    fill=\"transparent\"\n                    d=\"M65,145 C145,35 355,35 435,145\"\n                \/>\n\n                <text\n                    class=\"bd-error-text\"\n                    text-anchor=\"middle\">\n\n                    <textPath\n                        href=\"#bdErrorCurve\"\n                        startOffset=\"50%\"\n                        id=\"bdErrorText\">\n                        Oops \u2014 check that field!\n                    <\/textPath>\n\n                <\/text>\n            <\/svg>\n\n\n            <!-- DOG -->\n            <svg class=\"bd-dog-svg\"\n                 width=\"240\"\n                 height=\"185\"\n                 viewBox=\"0 0 240 185\"\n                 fill=\"none\"\n                 xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n\n\n                <defs>\n\n                    <linearGradient id=\"bdHeadGradient\"\n                                    x1=\"40\"\n                                    y1=\"10\"\n                                    x2=\"195\"\n                                    y2=\"175\"\n                                    gradientUnits=\"userSpaceOnUse\">\n\n                        <stop offset=\"0\" stop-color=\"#6EE6FF\"\/>\n                        <stop offset=\".38\" stop-color=\"#3188FF\"\/>\n                        <stop offset=\".72\" stop-color=\"#504CFF\"\/>\n                        <stop offset=\"1\" stop-color=\"#9B35F4\"\/>\n\n                    <\/linearGradient>\n\n\n                    <linearGradient id=\"bdEarGradient\"\n                                    x1=\"0\"\n                                    y1=\"0\"\n                                    x2=\"1\"\n                                    y2=\"1\">\n\n                        <stop offset=\"0\" stop-color=\"#246BDE\"\/>\n                        <stop offset=\"1\" stop-color=\"#3521A5\"\/>\n\n                    <\/linearGradient>\n\n\n                    <linearGradient id=\"bdEyeGradient\"\n                                    x1=\"0\"\n                                    y1=\"0\"\n                                    x2=\"1\"\n                                    y2=\"1\">\n\n                        <stop offset=\"0\" stop-color=\"#21DFFF\"\/>\n                        <stop offset=\".5\" stop-color=\"#346DFF\"\/>\n                        <stop offset=\"1\" stop-color=\"#A62DFF\"\/>\n\n                    <\/linearGradient>\n\n\n                    <filter id=\"bdGlow\"\n                            x=\"-50%\"\n                            y=\"-50%\"\n                            width=\"200%\"\n                            height=\"200%\">\n\n                        <feGaussianBlur stdDeviation=\"5\"\n                                        result=\"blur\"\/>\n\n                        <feMerge>\n                            <feMergeNode in=\"blur\"\/>\n                            <feMergeNode in=\"SourceGraphic\"\/>\n                        <\/feMerge>\n\n                    <\/filter>\n\n                <\/defs>\n\n\n                <!-- LEFT FLOPPY EAR -->\n                <path\n                    class=\"bd-ear bd-ear-left\"\n                    d=\"\n                    M64 27\n                    C44 8 15 18 12 44\n                    C8 78 33 100 57 91\n                    C72 85 75 65 70 48\n                    C68 39 66 32 64 27Z\n                    \"\n                    fill=\"url(#bdEarGradient)\"\n                \/>\n\n\n                <!-- RIGHT FLOPPY EAR -->\n                <path\n                    class=\"bd-ear bd-ear-right\"\n                    d=\"\n                    M176 27\n                    C196 8 225 18 228 44\n                    C232 78 207 100 183 91\n                    C168 85 165 65 170 48\n                    C172 39 174 32 176 27Z\n                    \"\n                    fill=\"url(#bdEarGradient)\"\n                \/>\n\n\n                <!-- HEAD -->\n                <path\n                    class=\"bd-head\"\n                    d=\"\n                    M120 12\n                    C75 12 48 42 48 85\n                    C48 132 77 159 120 159\n                    C163 159 192 132 192 85\n                    C192 42 165 12 120 12Z\n                    \"\n                    fill=\"url(#bdHeadGradient)\"\n                \/>\n\n\n                <!-- CYAN FOREHEAD STRIPE -->\n                <path\n                    d=\"\n                    M120 20\n                    C107 31 102 47 104 62\n                    C109 55 114 52 120 52\n                    C126 52 131 55 136 62\n                    C138 47 133 31 120 20Z\n                    \"\n                    fill=\"#AEF4FF\"\n                    opacity=\".65\"\n                \/>\n\n\n                <!-- FACE PATCH -->\n                <ellipse\n                    cx=\"120\"\n                    cy=\"101\"\n                    rx=\"61\"\n                    ry=\"54\"\n                    fill=\"#DFF9FF\"\n                \/>\n\n\n                <!-- LEFT EYE WHITE -->\n                <ellipse\n                    cx=\"91\"\n                    cy=\"89\"\n                    rx=\"20\"\n                    ry=\"27\"\n                    fill=\"white\"\n                    stroke=\"#338DFF\"\n                    stroke-width=\"2\"\n                \/>\n\n\n                <!-- RIGHT EYE WHITE -->\n                <ellipse\n                    cx=\"149\"\n                    cy=\"89\"\n                    rx=\"20\"\n                    ry=\"27\"\n                    fill=\"white\"\n                    stroke=\"#338DFF\"\n                    stroke-width=\"2\"\n                \/>\n\n\n                <!-- LEFT PUPIL -->\n                <g class=\"bd-pupil bd-pupil-left\"\n                   id=\"bdPupilLeft\">\n\n                    <circle\n                        cx=\"91\"\n                        cy=\"91\"\n                        r=\"15\"\n                        fill=\"url(#bdEyeGradient)\"\n                    \/>\n\n                    <circle\n                        cx=\"86\"\n                        cy=\"84\"\n                        r=\"5\"\n                        fill=\"white\"\n                    \/>\n\n                    <circle\n                        cx=\"96\"\n                        cy=\"95\"\n                        r=\"2.6\"\n                        fill=\"white\"\n                    \/>\n\n                <\/g>\n\n\n                <!-- RIGHT PUPIL -->\n                <g class=\"bd-pupil bd-pupil-right\"\n                   id=\"bdPupilRight\">\n\n                    <circle\n                        cx=\"149\"\n                        cy=\"91\"\n                        r=\"15\"\n                        fill=\"url(#bdEyeGradient)\"\n                    \/>\n\n                    <circle\n                        cx=\"144\"\n                        cy=\"84\"\n                        r=\"5\"\n                        fill=\"white\"\n                    \/>\n\n                    <circle\n                        cx=\"154\"\n                        cy=\"95\"\n                        r=\"2.6\"\n                        fill=\"white\"\n                    \/>\n\n                <\/g>\n\n\n                <!-- MUZZLE -->\n                <ellipse\n                    cx=\"120\"\n                    cy=\"123\"\n                    rx=\"32\"\n                    ry=\"23\"\n                    fill=\"#C5F1FF\"\n                \/>\n\n\n                <!-- NOSE -->\n                <path\n                    class=\"bd-nose\"\n                    d=\"\n                    M108 115\n                    C108 107 132 107 132 115\n                    C132 123 124 129 120 129\n                    C116 129 108 123 108 115Z\n                    \"\n                    fill=\"#11194E\"\n                \/>\n\n\n                <ellipse\n                    cx=\"115\"\n                    cy=\"113\"\n                    rx=\"4\"\n                    ry=\"2\"\n                    fill=\"white\"\n                    opacity=\".7\"\n                \/>\n\n\n                <!-- NORMAL SMILE -->\n                <path\n                    class=\"bd-mouth bd-mouth-normal\"\n                    d=\"\n                    M120 129\n                    V135\n\n                    M120 135\n                    C112 144 101 142 97 136\n\n                    M120 135\n                    C128 144 139 142 143 136\n                    \"\n                    stroke=\"#283179\"\n                    stroke-width=\"3\"\n                    stroke-linecap=\"round\"\n                    fill=\"none\"\n                \/>\n\n\n                <!-- ERROR MOUTH -->\n                <ellipse\n                    class=\"bd-mouth bd-mouth-error\"\n                    cx=\"120\"\n                    cy=\"141\"\n                    rx=\"7\"\n                    ry=\"10\"\n                    fill=\"#27316F\"\n                \/>\n\n\n                <!-- SUCCESS MOUTH -->\n                <path\n                    class=\"bd-mouth bd-mouth-success\"\n                    d=\"\n                    M96 136\n                    C104 158 136 158 144 136\n                    \"\n                    stroke=\"#283179\"\n                    stroke-width=\"4\"\n                    stroke-linecap=\"round\"\n                    fill=\"none\"\n                \/>\n\n\n                <!-- LEFT PAW -->\n                <path\n                    class=\"bd-paw\"\n                    d=\"\n                    M23 146\n                    H69\n                    C77 146 81 152 81 160\n\n                    H52\n\n                    C52 173 43 180 30 180\n                    C18 180 10 172 10 162\n                    C10 153 15 147 23 146Z\n                    \"\n                    fill=\"#C7F4FF\"\n                    stroke=\"#3698FF\"\n                    stroke-width=\"2\"\n                \/>\n\n\n                <!-- RIGHT PAW -->\n                <path\n                    class=\"bd-paw\"\n                    d=\"\n                    M217 146\n                    H171\n                    C163 146 159 152 159 160\n\n                    H188\n\n                    C188 173 197 180 210 180\n                    C222 180 230 172 230 162\n                    C230 153 225 147 217 146Z\n                    \"\n                    fill=\"#C7F4FF\"\n                    stroke=\"#3698FF\"\n                    stroke-width=\"2\"\n                \/>\n\n\n                <!-- PAW HIGHLIGHTS -->\n                <ellipse\n                    cx=\"30\"\n                    cy=\"158\"\n                    rx=\"5\"\n                    ry=\"9\"\n                    fill=\"white\"\n                    opacity=\".65\"\n                \/>\n\n                <ellipse\n                    cx=\"210\"\n                    cy=\"158\"\n                    rx=\"5\"\n                    ry=\"9\"\n                    fill=\"white\"\n                    opacity=\".65\"\n                \/>\n\n\n                <!-- LITTLE TAIL -->\n                <path\n                    class=\"bd-tail\"\n                    d=\"\n                    M182 126\n                    C214 121 222 103 210 93\n                    \"\n                    stroke=\"#57CBFF\"\n                    stroke-width=\"9\"\n                    stroke-linecap=\"round\"\n                \/>\n\n\n                <!-- FOREHEAD GLOW -->\n                <path\n                    d=\"\n                    M88 43\n                    C107 31 133 31 152 43\n                    \"\n                    stroke=\"#C9F7FF\"\n                    stroke-width=\"3\"\n                    stroke-linecap=\"round\"\n                    opacity=\".7\"\n                    filter=\"url(#bdGlow)\"\n                \/>\n\n            <\/svg>\n\n        <\/div>\n\n    <\/div>\n\n<\/div>\n\n\n<style>\n\n\/* =========================================\n   BETTAWEB DOG WIDGET\n   Completely scoped \u2014 won't affect Elementor\n   ========================================= *\/\n\n.betta-dog-widget,\n.betta-dog-widget * {\n    box-sizing: border-box;\n}\n\n\n\/* -----------------------------------------\n   WIDGET WRAPPER\n   ----------------------------------------- *\/\n\n.betta-dog-widget {\n    --bd-blue: #42CFFF;\n    --bd-blue-2: #3387FF;\n    --bd-purple: #8345FF;\n    --bd-pink: #F625BF;\n\n    position: relative;\n\n    width: 100%;\n\n    font-family: inherit;\n\n    z-index: 20;\n\n    pointer-events: none;\n\n    \/*\n       Negative bottom margin allows the paws\n       to overlap the form\/card underneath.\n    *\/\n    margin-bottom: -45px;\n}\n\n\n\/* -----------------------------------------\n   DRAG TRACK\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-track {\n    position: relative;\n\n    width: min(100%, 1240px);\n    height: 185px;\n\n    margin: 0 auto;\n\n    overflow: visible;\n\n    pointer-events: auto;\n}\n\n\n\/* subtle neon rail *\/\n\n.betta-dog-widget .bd-track::after {\n    content: \"\";\n\n    position: absolute;\n\n    left: 30px;\n    right: 30px;\n    bottom: 3px;\n\n    height: 2px;\n\n    border-radius: 999px;\n\n    background:\n        linear-gradient(\n            90deg,\n            transparent,\n            rgba(78, 219, 255, .75),\n            rgba(122, 88, 255, .65),\n            rgba(246, 37, 191, .75),\n            transparent\n        );\n\n    opacity: .55;\n\n    box-shadow:\n        0 0 15px rgba(72, 199, 255, .25);\n\n    pointer-events: none;\n}\n\n\n\/* -----------------------------------------\n   DOG\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-dog {\n    --bd-x: 0px;\n\n    position: absolute;\n\n    left: 0;\n    top: 0;\n\n    width: 240px;\n    height: 185px;\n\n    display: block;\n\n    transform:\n        translateX(var(--bd-x));\n\n    cursor: grab;\n\n    user-select: none;\n    touch-action: none;\n\n    pointer-events: auto;\n\n    transition:\n        transform 220ms cubic-bezier(.22,.61,.36,1);\n\n    will-change: transform;\n\n    filter:\n        drop-shadow(\n            0 18px 25px\n            rgba(10, 4, 60, .30)\n        );\n}\n\n\n.betta-dog-widget .bd-dog.dragging {\n    cursor: grabbing;\n}\n\n\n\/* -----------------------------------------\n   DOG SVG\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-dog-svg {\n    position: relative;\n\n    display: block;\n\n    width: 240px;\n    height: 185px;\n\n    z-index: 2;\n\n    overflow: visible;\n}\n\n\n\/* -----------------------------------------\n   EYES\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-pupil {\n    transform-box: fill-box;\n    transform-origin: center;\n\n    transition:\n        transform 100ms\n        cubic-bezier(.22,.61,.36,1);\n\n    will-change: transform;\n}\n\n\n\/* -----------------------------------------\n   MOUTHS\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-mouth-error,\n.betta-dog-widget .bd-mouth-success {\n    display: none;\n}\n\n\n.betta-dog-widget.has-error\n.bd-mouth-normal {\n    display: none;\n}\n\n\n.betta-dog-widget.has-error\n.bd-mouth-error {\n    display: block;\n}\n\n\n.betta-dog-widget.is-success\n.bd-mouth-normal,\n.betta-dog-widget.is-success\n.bd-mouth-error {\n    display: none;\n}\n\n\n.betta-dog-widget.is-success\n.bd-mouth-success {\n    display: block;\n}\n\n\n\/* -----------------------------------------\n   ERROR MESSAGE\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-error-message {\n    position: absolute;\n\n    width: 330px;\n    height: 120px;\n\n    left: 50%;\n    top: -58px;\n\n    transform:\n        translateX(-50%)\n        translateY(5px);\n\n    z-index: 10;\n\n    opacity: 0;\n    visibility: hidden;\n\n    pointer-events: none;\n\n    transition:\n        opacity .3s ease,\n        transform .3s ease,\n        visibility .3s ease;\n}\n\n\n.betta-dog-widget .bd-error-text {\n    fill: #8DE7FF;\n\n    font-family: inherit;\n\n    font-size: 26px;\n    font-weight: 800;\n\n    letter-spacing: .5px;\n\n    paint-order: stroke fill;\n\n    stroke: rgba(17, 8, 80, .8);\n    stroke-width: 3px;\n\n    filter:\n        drop-shadow(\n            0 0 8px\n            rgba(58, 213, 255, .5)\n        );\n}\n\n\n.betta-dog-widget.has-error\n.bd-error-message {\n    opacity: 1;\n    visibility: visible;\n\n    transform:\n        translateX(-50%)\n        translateY(0);\n}\n\n\n\/* -----------------------------------------\n   ERROR DOG REACTION\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-ear {\n    transform-box: fill-box;\n    transform-origin: top center;\n\n    transition:\n        transform .3s ease;\n}\n\n\n.betta-dog-widget.has-error\n.bd-ear-left {\n    transform:\n        translateY(5px)\n        rotate(-8deg);\n}\n\n\n.betta-dog-widget.has-error\n.bd-ear-right {\n    transform:\n        translateY(5px)\n        rotate(8deg);\n}\n\n\n\/* -----------------------------------------\n   SUCCESS REACTION\n   ----------------------------------------- *\/\n\n.betta-dog-widget .bd-tail {\n    transform-box: fill-box;\n    transform-origin: left center;\n}\n\n\n.betta-dog-widget.is-success\n.bd-tail {\n    animation:\n        bdTailWag .15s ease-in-out\n        8 alternate;\n}\n\n\n.betta-dog-widget.is-success\n.bd-dog {\n    animation:\n        bdHappyBounce .65s\n        cubic-bezier(.34,1.56,.64,1);\n}\n\n\n@keyframes bdTailWag {\n\n    from {\n        transform: rotate(-14deg);\n    }\n\n    to {\n        transform: rotate(18deg);\n    }\n\n}\n\n\n@keyframes bdHappyBounce {\n\n    0% {\n        margin-top: 0;\n    }\n\n    35% {\n        margin-top: -16px;\n    }\n\n    60% {\n        margin-top: 4px;\n    }\n\n    100% {\n        margin-top: 0;\n    }\n\n}\n\n\n\/* -----------------------------------------\n   MOBILE\n   ----------------------------------------- *\/\n\n@media (max-width: 767px) {\n\n    .betta-dog-widget {\n        margin-bottom: -30px;\n    }\n\n\n    .betta-dog-widget .bd-track {\n        height: 155px;\n    }\n\n\n    .betta-dog-widget .bd-dog {\n        width: 190px;\n        height: 148px;\n    }\n\n\n    .betta-dog-widget .bd-dog-svg {\n        width: 190px;\n        height: auto;\n    }\n\n\n    .betta-dog-widget .bd-error-message {\n        width: 260px;\n\n        top: -48px;\n    }\n\n\n    .betta-dog-widget .bd-error-text {\n        font-size: 22px;\n    }\n\n}\n\n\n\/* -----------------------------------------\n   ACCESSIBILITY\n   ----------------------------------------- *\/\n\n@media (prefers-reduced-motion: reduce) {\n\n    .betta-dog-widget .bd-dog,\n    .betta-dog-widget .bd-pupil,\n    .betta-dog-widget .bd-ear,\n    .betta-dog-widget .bd-error-message {\n\n        transition: none !important;\n        animation: none !important;\n\n    }\n\n}\n\n<\/style>\n\n\n<script>\n\n(function () {\n\n    \/*\n    ==========================================\n    BETTAWEB DOG INTERACTION\n    ==========================================\n\n    Automatically looks for:\n\n    .bw-form\n    OR\n    .bw-contact-form\n\n    So it can react to the existing\n    contact form below it.\n    ==========================================\n    *\/\n\n\n    function initBettaDog() {\n\n        const widget =\n            document.getElementById('bettaDogWidget');\n\n        if (!widget) return;\n\n\n        const track =\n            document.getElementById('bdTrack');\n\n        const dog =\n            document.getElementById('bdDog');\n\n        const leftPupil =\n            document.getElementById('bdPupilLeft');\n\n        const rightPupil =\n            document.getElementById('bdPupilRight');\n\n        const errorText =\n            document.getElementById('bdErrorText');\n\n\n        if (\n            !track ||\n            !dog ||\n            !leftPupil ||\n            !rightPupil\n        ) return;\n\n\n\n        \/*\n        ========================================\n        FIND EXISTING CONTACT FORM\n        ========================================\n        *\/\n\n        const form =\n            document.querySelector(\n                '.bw-form, .bw-contact-form'\n            );\n\n\n        const fields =\n            form\n                ? Array.from(\n                    form.querySelectorAll(\n                        'input, textarea'\n                    )\n                )\n                : [];\n\n\n\n        \/*\n        ========================================\n        DRAG STATE\n        ========================================\n        *\/\n\n        const state = {\n\n            dragging: false,\n\n            pointerStart: 0,\n\n            startOffset: 0,\n\n            offset: 0,\n\n            previousOffset: 0,\n\n            velocity: 0,\n\n            previousTime: 0,\n\n            maxOffset: 0\n\n        };\n\n\n        const clamp =\n            (value, min, max) =>\n                Math.min(\n                    Math.max(value, min),\n                    max\n                );\n\n\n        const SMOOTH =\n            'cubic-bezier(.22,.61,.36,1)';\n\n        const BOUNCE =\n            'cubic-bezier(.34,1.56,.64,1)';\n\n\n\n        \/*\n        ========================================\n        RUBBER BAND\n        ========================================\n        *\/\n\n        function rubberBand(\n            over,\n            limit = 110\n        ) {\n\n            return limit *\n                (\n                    1 -\n                    1 \/\n                    (\n                        over \/ limit + 1\n                    )\n                );\n\n        }\n\n\n\n        \/*\n        ========================================\n        DOG POSITION\n        ========================================\n        *\/\n\n        function setOffset(\n            px,\n            smooth = true\n        ) {\n\n            state.offset = px;\n\n\n            if (!smooth) {\n\n                dog.style.transition =\n                    'none';\n\n            }\n\n\n            dog.style.setProperty(\n                '--bd-x',\n                `${Math.round(px)}px`\n            );\n\n\n            if (!smooth) {\n\n                dog.getBoundingClientRect();\n\n                dog.style.transition =\n                    `transform 220ms ${SMOOTH}`;\n\n            }\n\n        }\n\n\n\n        function computeMaxOffset() {\n\n            const trackWidth =\n                track.clientWidth;\n\n            const dogWidth =\n                dog.getBoundingClientRect()\n                    .width;\n\n\n            state.maxOffset =\n                Math.max(\n                    0,\n                    trackWidth - dogWidth\n                );\n\n\n            setOffset(\n\n                clamp(\n                    state.offset,\n                    0,\n                    state.maxOffset\n                ),\n\n                false\n\n            );\n\n        }\n\n\n\n        \/*\n        ========================================\n        EYE TRACKING\n        ========================================\n        *\/\n\n        const maxEyeX = 8;\n        const maxEyeY = 10;\n\n        const sensitivity = 330;\n\n\n        function pupilCenter(\n            element\n        ) {\n\n            const rect =\n                element.getBoundingClientRect();\n\n\n            return {\n\n                x:\n                    rect.left +\n                    rect.width \/ 2,\n\n                y:\n                    rect.top +\n                    rect.height \/ 2\n\n            };\n\n        }\n\n\n\n        function calculateEyeOffset(\n            pupil,\n            x,\n            y\n        ) {\n\n            const center =\n                pupilCenter(pupil);\n\n\n            const dx =\n                x - center.x;\n\n            const dy =\n                y - center.y;\n\n\n            const distance =\n                Math.hypot(dx, dy);\n\n\n            const pressure =\n                Math.min(\n                    1,\n                    distance \/\n                    sensitivity\n                );\n\n\n            const angle =\n                Math.atan2(\n                    dy,\n                    dx\n                );\n\n\n            return {\n\n                x:\n                    Math.cos(angle) *\n                    maxEyeX *\n                    pressure,\n\n                y:\n                    Math.sin(angle) *\n                    maxEyeY *\n                    pressure\n\n            };\n\n        }\n\n\n\n        function lookAt(\n            x,\n            y\n        ) {\n\n            const L =\n                calculateEyeOffset(\n                    leftPupil,\n                    x,\n                    y\n                );\n\n\n            const R =\n                calculateEyeOffset(\n                    rightPupil,\n                    x,\n                    y\n                );\n\n\n            leftPupil.style.transform =\n                `translate(${L.x}px, ${L.y}px)`;\n\n\n            rightPupil.style.transform =\n                `translate(${R.x}px, ${R.y}px)`;\n\n        }\n\n\n\n        function neutralEyes() {\n\n            leftPupil.style.transform =\n                'translate(0,0)';\n\n            rightPupil.style.transform =\n                'translate(0,0)';\n\n        }\n\n\n\n        \/*\n        ========================================\n        POINTER EYE TRACKING\n        ========================================\n        *\/\n\n        let lastPointer = {\n            x: null,\n            y: null\n        };\n\n\n        document.addEventListener(\n            'pointermove',\n            function (event) {\n\n                lastPointer.x =\n                    event.clientX;\n\n                lastPointer.y =\n                    event.clientY;\n\n\n                const focused =\n                    fields.includes(\n                        document.activeElement\n                    );\n\n\n                if (!focused) {\n\n                    lookAt(\n                        event.clientX,\n                        event.clientY\n                    );\n\n                }\n\n            }\n        );\n\n\n\n        \/*\n        ========================================\n        FIELD \/ CARET TRACKING\n        ========================================\n        *\/\n\n        const measureCanvas =\n            document.createElement(\n                'canvas'\n            );\n\n\n        const measureContext =\n            measureCanvas.getContext(\n                '2d'\n            );\n\n\n\n        function getCaretPoint(\n            input\n        ) {\n\n            const rect =\n                input.getBoundingClientRect();\n\n\n            const style =\n                getComputedStyle(input);\n\n\n            measureContext.font =\n\n                `${style.fontWeight || 400}\n                 ${style.fontSize || '16px'}\n                 ${style.fontFamily || 'Arial'}`;\n\n\n            const position =\n                input.selectionStart ??\n                input.value.length;\n\n\n            const before =\n                input.value.slice(\n                    0,\n                    position\n                );\n\n\n            const textWidth =\n                measureContext\n                    .measureText(before)\n                    .width;\n\n\n            const paddingLeft =\n                parseFloat(\n                    style.paddingLeft\n                ) || 0;\n\n\n            const paddingRight =\n                parseFloat(\n                    style.paddingRight\n                ) || 0;\n\n\n            const innerWidth =\n                rect.width -\n                paddingLeft -\n                paddingRight;\n\n\n            const xInside =\n\n                Math.min(\n                    textWidth,\n                    innerWidth\n                ) -\n\n                (input.scrollLeft || 0);\n\n\n            return {\n\n                x:\n                    rect.left +\n                    paddingLeft +\n                    Math.max(\n                        0,\n                        xInside\n                    ),\n\n                y:\n                    rect.top +\n                    rect.height \/ 2\n\n            };\n\n        }\n\n\n\n        function lookAtField(\n            field\n        ) {\n\n            requestAnimationFrame(\n                function () {\n\n                    \/*\n                    textarea caret measurement gets\n                    complicated, so look at its center.\n                    *\/\n\n                    if (\n                        field.tagName ===\n                        'TEXTAREA'\n                    ) {\n\n                        const rect =\n                            field.getBoundingClientRect();\n\n\n                        lookAt(\n                            rect.left +\n                            rect.width \/ 2,\n\n                            rect.top +\n                            rect.height \/ 2\n                        );\n\n\n                        return;\n\n                    }\n\n\n                    const point =\n                        getCaretPoint(field);\n\n\n                    lookAt(\n                        point.x,\n                        point.y\n                    );\n\n                }\n            );\n\n        }\n\n\n\n        fields.forEach(\n            function (field) {\n\n                [\n                    'input',\n                    'keyup',\n                    'keydown',\n                    'click',\n                    'mouseup',\n                    'focus'\n                ].forEach(\n                    function (eventName) {\n\n                        field.addEventListener(\n                            eventName,\n                            function () {\n\n                                lookAtField(\n                                    field\n                                );\n\n                            }\n                        );\n\n                    }\n                );\n\n\n                field.addEventListener(\n                    'blur',\n                    function () {\n\n                        if (\n                            lastPointer.x !== null\n                        ) {\n\n                            lookAt(\n                                lastPointer.x,\n                                lastPointer.y\n                            );\n\n                        } else {\n\n                            neutralEyes();\n\n                        }\n\n                    }\n                );\n\n            }\n        );\n\n\n\n        \/*\n        ========================================\n        DRAGGING\n        ========================================\n        *\/\n\n        function pointerDown(\n            event\n        ) {\n\n            event.preventDefault();\n\n\n            widget.classList.remove(\n                'has-error'\n            );\n\n\n            dog.classList.add(\n                'dragging'\n            );\n\n\n            state.dragging =\n                true;\n\n\n            dog.setPointerCapture?.(\n                event.pointerId\n            );\n\n\n            dog.style.transition =\n                'none';\n\n\n            state.pointerStart =\n                event.clientX;\n\n\n            state.startOffset =\n                state.offset;\n\n\n            state.previousOffset =\n                state.offset;\n\n\n            state.velocity =\n                0;\n\n\n            state.previousTime =\n                performance.now();\n\n        }\n\n\n\n        function pointerMove(\n            event\n        ) {\n\n            if (\n                !state.dragging\n            ) return;\n\n\n            const now =\n                performance.now();\n\n\n            const deltaTime =\n                Math.max(\n                    1,\n                    now -\n                    state.previousTime\n                );\n\n\n            const deltaX =\n                event.clientX -\n                state.pointerStart;\n\n\n            let target =\n                state.startOffset +\n                deltaX;\n\n\n            if (\n                target < 0\n            ) {\n\n                target =\n                    -rubberBand(\n                        -target\n                    );\n\n            }\n\n\n            else if (\n                target >\n                state.maxOffset\n            ) {\n\n                target =\n\n                    state.maxOffset +\n\n                    rubberBand(\n                        target -\n                        state.maxOffset\n                    );\n\n            }\n\n\n            state.velocity =\n\n                (\n                    target -\n                    state.previousOffset\n                ) \/\n\n                deltaTime;\n\n\n            state.previousOffset =\n                target;\n\n\n            state.previousTime =\n                now;\n\n\n            setOffset(\n                target,\n                true\n            );\n\n        }\n\n\n\n        function pointerUp(\n            event\n        ) {\n\n            if (\n                !state.dragging\n            ) return;\n\n\n            state.dragging =\n                false;\n\n\n            dog.classList.remove(\n                'dragging'\n            );\n\n\n            dog.releasePointerCapture?.(\n                event.pointerId\n            );\n\n\n            const current =\n                state.offset;\n\n\n            const bounded =\n                clamp(\n                    current,\n                    0,\n                    state.maxOffset\n                );\n\n\n            const outsideDistance =\n                Math.abs(\n                    current -\n                    bounded\n                );\n\n\n            \/*\n            Outside edge:\n            bounce back.\n            *\/\n\n            if (\n                current < 0 ||\n                current >\n                state.maxOffset\n            ) {\n\n                const duration =\n\n                    Math.min(\n                        600,\n                        260 +\n                        outsideDistance *\n                        .9\n                    );\n\n\n                dog.style.transition =\n\n                    `transform\n                     ${duration}ms\n                     ${BOUNCE}`;\n\n\n                setOffset(\n                    bounded,\n                    true\n                );\n\n\n                return;\n\n            }\n\n\n            \/*\n            Normal inertia.\n            *\/\n\n            const inertia =\n                state.velocity *\n                160;\n\n\n            const projected =\n                clamp(\n                    current +\n                    inertia,\n                    0,\n                    state.maxOffset\n                );\n\n\n            const duration =\n\n                Math.min(\n                    420,\n                    180 +\n                    Math.abs(inertia) *\n                    .6\n                );\n\n\n            dog.style.transition =\n\n                `transform\n                 ${duration}ms\n                 ${SMOOTH}`;\n\n\n            setOffset(\n                projected,\n                true\n            );\n\n        }\n\n\n\n        dog.addEventListener(\n            'pointerdown',\n            pointerDown\n        );\n\n\n        window.addEventListener(\n            'pointermove',\n            pointerMove\n        );\n\n\n        window.addEventListener(\n            'pointerup',\n            pointerUp\n        );\n\n\n        window.addEventListener(\n            'pointercancel',\n            pointerUp\n        );\n\n\n\n        \/*\n        ========================================\n        ERRORS\n        ========================================\n        *\/\n\n        function errorTextFor(\n            field\n        ) {\n\n            const fieldName =\n                (\n                    field?.name ||\n                    ''\n                ).toLowerCase();\n\n\n            if (\n                fieldName.includes(\n                    'name'\n                )\n            ) {\n\n                return 'Your name first!';\n\n            }\n\n\n            if (\n                fieldName.includes(\n                    'phone'\n                )\n            ) {\n\n                return 'Phone number, please!';\n\n            }\n\n\n            if (\n                fieldName.includes(\n                    'email'\n                )\n            ) {\n\n                return 'That email looks off!';\n\n            }\n\n\n            if (\n                fieldName.includes(\n                    'message'\n                )\n            ) {\n\n                return 'Tell us what you need!';\n\n            }\n\n\n            return 'Oops \u2014 check that field!';\n\n        }\n\n\n\n        function showError(\n            field\n        ) {\n\n            widget.classList.remove(\n                'is-success'\n            );\n\n\n            widget.classList.add(\n                'has-error'\n            );\n\n\n            if (\n                errorText\n            ) {\n\n                errorText.textContent =\n                    errorTextFor(field);\n\n            }\n\n\n            if (\n                field\n            ) {\n\n                const rect =\n                    field.getBoundingClientRect();\n\n\n                lookAt(\n                    rect.left +\n                    rect.width \/ 2,\n\n                    rect.top +\n                    rect.height \/ 2\n                );\n\n            }\n\n        }\n\n\n\n        function clearError() {\n\n            widget.classList.remove(\n                'has-error'\n            );\n\n        }\n\n\n\n        \/*\n        ========================================\n        SUCCESS \/ CONFETTI\n        ========================================\n        *\/\n\n        let confettiPromise = null;\n\n\n        function getConfetti() {\n\n            if (\n                !confettiPromise\n            ) {\n\n                confettiPromise =\n\n                    import(\n                        'https:\/\/esm.sh\/canvas-confetti'\n                    )\n\n                    .then(\n                        module =>\n                            module.default\n                    )\n\n                    .catch(\n                        () => null\n                    );\n\n            }\n\n\n            return confettiPromise;\n\n        }\n\n\n\n        function fireConfetti() {\n\n            const rect =\n                dog.getBoundingClientRect();\n\n\n            const origin = {\n\n                x:\n                    (\n                        rect.left +\n                        rect.width \/ 2\n                    ) \/\n                    window.innerWidth,\n\n                y:\n                    (\n                        rect.top +\n                        rect.height \/ 2\n                    ) \/\n                    window.innerHeight\n\n            };\n\n\n            getConfetti().then(\n                function (confetti) {\n\n                    if (\n                        !confetti\n                    ) return;\n\n\n                    confetti({\n\n                        particleCount: 75,\n\n                        spread: 70,\n\n                        startVelocity: 35,\n\n                        origin: origin,\n\n                        colors: [\n                            '#42CFFF',\n                            '#3387FF',\n                            '#8345FF',\n                            '#F625BF',\n                            '#FFFFFF'\n                        ]\n\n                    });\n\n\n                    confetti({\n\n                        particleCount: 40,\n\n                        spread: 110,\n\n                        startVelocity: 22,\n\n                        origin: origin,\n\n                        colors: [\n                            '#42CFFF',\n                            '#3387FF',\n                            '#8345FF',\n                            '#F625BF'\n                        ]\n\n                    });\n\n                }\n            );\n\n        }\n\n\n\n        function showSuccess() {\n\n            clearError();\n\n\n            widget.classList.add(\n                'is-success'\n            );\n\n\n            fireConfetti();\n\n\n            window.setTimeout(\n                function () {\n\n                    widget.classList.remove(\n                        'is-success'\n                    );\n\n                },\n\n                1800\n            );\n\n        }\n\n\n\n        \/*\n        ========================================\n        CONNECT TO CONTACT FORM\n        ========================================\n        *\/\n\n        if (\n            form\n        ) {\n\n            form.addEventListener(\n                'submit',\n                function (event) {\n\n                    const invalidField =\n                        form.querySelector(\n                            ':invalid'\n                        );\n\n\n                    if (\n                        invalidField\n                    ) {\n\n                        event.preventDefault();\n\n\n                        showError(\n                            invalidField\n                        );\n\n\n                        invalidField.focus();\n\n\n                        \/*\n                        Display browser validation\n                        if supported.\n                        *\/\n\n                        invalidField\n                            .reportValidity?.();\n\n\n                        return;\n\n                    }\n\n\n                    \/*\n                    Valid form.\n\n                    IMPORTANT:\n                    No preventDefault() here.\n\n                    So when you eventually attach\n                    a real WordPress\/PHP endpoint,\n                    this widget won't block it.\n                    *\/\n\n                    showSuccess();\n\n                }\n            );\n\n\n\n            fields.forEach(\n                function (field) {\n\n                    field.addEventListener(\n                        'input',\n                        function () {\n\n                            widget.classList.remove(\n                                'is-success'\n                            );\n\n\n                            if (\n                                field.validity.valid\n                            ) {\n\n                                clearError();\n\n                            }\n\n                        }\n                    );\n\n                }\n            );\n\n        }\n\n\n\n        \/*\n        ========================================\n        RESIZE \/ INITIAL POSITION\n        ========================================\n        *\/\n\n        function onLayoutChange() {\n\n            computeMaxOffset();\n\n        }\n\n\n        window.addEventListener(\n            'resize',\n            onLayoutChange\n        );\n\n\n        computeMaxOffset();\n\n\n        \/*\n        Start roughly centered.\n        *\/\n\n        setOffset(\n\n            Math.round(\n                state.maxOffset \/ 2\n            ),\n\n            false\n\n        );\n\n\n        neutralEyes();\n\n    }\n\n\n\n    if (\n        document.readyState ===\n        'loading'\n    ) {\n\n        document.addEventListener(\n            'DOMContentLoaded',\n            initBettaDog\n        );\n\n    }\n\n    else {\n\n        initBettaDog();\n\n    }\n\n})();\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b711480 e-flex e-con-boxed e-con e-child\" data-id=\"b711480\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-7cf492f e-con-full e-flex e-con e-child\" data-id=\"7cf492f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-89a6d1d elementor-widget elementor-widget-heading\" data-id=\"89a6d1d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">SEND US A MESSAGE<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-509255c elementor-widget elementor-widget-heading\" data-id=\"509255c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Let's Talk About<br>Your Next Project<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-60aadad elementor-widget elementor-widget-text-editor\" data-id=\"60aadad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Tell us what you need and we\u2019ll get back to you as soon as possible. Whether it\u2019s a website, redesign, SEO, or digital support, we\u2019re ready to help.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1882ec9 elementor-view-default elementor-position-block-start elementor-mobile-position-block-start elementor-widget elementor-widget-icon-box\" data-id=\"1882ec9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<span  class=\"elementor-icon\">\n\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-headset\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M192 208c0-17.67-14.33-32-32-32h-16c-35.35 0-64 28.65-64 64v48c0 35.35 28.65 64 64 64h16c17.67 0 32-14.33 32-32V208zm176 144c35.35 0 64-28.65 64-64v-48c0-35.35-28.65-64-64-64h-16c-17.67 0-32 14.33-32 32v112c0 17.67 14.33 32 32 32h16zM256 0C113.18 0 4.58 118.83 0 256v16c0 8.84 7.16 16 16 16h16c8.84 0 16-7.16 16-16v-16c0-114.69 93.31-208 208-208s208 93.31 208 208h-.12c.08 2.43.12 165.72.12 165.72 0 23.35-18.93 42.28-42.28 42.28H320c0-26.51-21.49-48-48-48h-32c-26.51 0-48 21.49-48 48s21.49 48 48 48h181.72c49.86 0 90.28-40.42 90.28-90.28V256C507.42 118.83 398.82 0 256 0z\"><\/path><\/svg>\t\t\t\t<\/span>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\tQuick Response. Friendly Support.\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tNo pressure. No complicated process. Just send your details and we\u2019ll reach out with the best next step.\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ff7b969 e-flex e-con-boxed e-con e-child\" data-id=\"ff7b969\" 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-7d26e45 elementor-widget elementor-widget-html\" data-id=\"7d26e45\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n\/* =========================================\n   BETTAWEB CONTACT FORM\n   ========================================= *\/\n\n.bw-contact-form {\n    width: 100%;\n    display: flex;\n    flex-direction: column;\n    gap: 14px;\n    font-family: inherit;\n}\n\n.bw-form-row {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 14px;\n}\n\n.bw-field {\n    position: relative;\n}\n\n.bw-field svg {\n    position: absolute;\n    left: 18px;\n    top: 19px;\n\n    width: 21px;\n    height: 21px;\n\n    stroke: #285eff;\n    stroke-width: 2;\n    fill: none;\n\n    pointer-events: none;\n}\n\n.bw-contact-form input,\n.bw-contact-form textarea {\n    width: 100%;\n    box-sizing: border-box;\n\n    background: #f3f6ff;\n\n    color: #15194d;\n\n    border: 1px solid #e1e6ff;\n    border-radius: 14px;\n\n    outline: none;\n\n    padding: 18px 18px 18px 52px;\n\n    font-family: inherit;\n    font-size: 15px;\n    font-weight: 500;\n\n    transition:\n        border-color 0.25s ease,\n        box-shadow 0.25s ease,\n        background 0.25s ease;\n}\n\n.bw-contact-form input {\n    min-height: 60px;\n}\n\n.bw-contact-form textarea {\n    min-height: 165px;\n    resize: vertical;\n    padding-top: 19px;\n}\n\n.bw-contact-form input::placeholder,\n.bw-contact-form textarea::placeholder {\n    color: #727a9d;\n    opacity: 1;\n}\n\n.bw-contact-form input:focus,\n.bw-contact-form textarea:focus {\n    background: #ffffff;\n\n    border-color: #685aff;\n\n    box-shadow:\n        0 0 0 4px rgba(104, 90, 255, 0.10),\n        0 12px 30px rgba(42, 52, 140, 0.06);\n}\n\n\n\/* BUTTON *\/\n.bw-submit {\n    width: 100%;\n    min-height: 60px;\n\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 10px;\n\n    border: 0;\n    border-radius: 999px;\n\n    background:\n        linear-gradient(\n            90deg,\n            #fb219f 0%,\n            #bd25ec 48%,\n            #7140ff 100%\n        );\n\n    color: #ffffff;\n\n    font-family: inherit;\n    font-size: 16px;\n    font-weight: 800;\n\n    cursor: pointer;\n\n    box-shadow:\n        0 14px 32px rgba(133, 49, 244, 0.23);\n\n    transition:\n        transform 0.3s ease,\n        box-shadow 0.3s ease;\n}\n\n.bw-submit:hover {\n    transform: translateY(-2px);\n\n    box-shadow:\n        0 20px 42px rgba(133, 49, 244, 0.32);\n}\n\n.bw-submit svg {\n    width: 18px;\n    height: 18px;\n\n    fill: none;\n    stroke: currentColor;\n    stroke-width: 2;\n}\n\n\n\/* PRIVACY NOTE *\/\n.bw-form-note {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    gap: 7px;\n\n    margin-top: -2px;\n\n    color: #8086a3;\n\n    font-size: 12px;\n    line-height: 1.4;\n}\n\n.bw-form-note svg {\n    width: 13px;\n    height: 13px;\n\n    stroke: #6a70a0;\n    fill: none;\n    stroke-width: 2;\n}\n\n\n\/* MOBILE *\/\n@media (max-width: 767px) {\n\n    .bw-form-row {\n        grid-template-columns: 1fr;\n    }\n\n    .bw-contact-form input,\n    .bw-contact-form textarea {\n        font-size: 16px;\n    }\n}\n<\/style>\n\n\n<form class=\"bw-contact-form\">\n\n    <!-- NAME + PHONE -->\n    <div class=\"bw-form-row\">\n\n        <div class=\"bw-field\">\n            <svg viewBox=\"0 0 24 24\">\n                <circle cx=\"12\" cy=\"8\" r=\"4\"><\/circle>\n                <path d=\"M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8\"><\/path>\n            <\/svg>\n\n            <input\n                type=\"text\"\n                name=\"name\"\n                placeholder=\"Your Name*\"\n                required\n            >\n        <\/div>\n\n\n        <div class=\"bw-field\">\n            <svg viewBox=\"0 0 24 24\">\n                <path d=\"M5 4h4l2 5-3 2c1.6 3 3.9 5.4 7 7l2-3 5 2v4c0 1.1-.9 2-2 2C10.1 23 2 14.9 2 5c0-1.1.9-2 2-2z\"><\/path>\n            <\/svg>\n\n            <input\n                type=\"tel\"\n                name=\"phone\"\n                placeholder=\"Your Phone*\"\n                required\n            >\n        <\/div>\n\n    <\/div>\n\n\n    <!-- EMAIL -->\n    <div class=\"bw-field\">\n        <svg viewBox=\"0 0 24 24\">\n            <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"><\/rect>\n            <path d=\"m3 7 9 6 9-6\"><\/path>\n        <\/svg>\n\n        <input\n            type=\"email\"\n            name=\"email\"\n            placeholder=\"Your Email*\"\n            required\n        >\n    <\/div>\n\n\n    <!-- MESSAGE -->\n    <div class=\"bw-field\">\n        <svg viewBox=\"0 0 24 24\">\n            <path d=\"M21 15a4 4 0 0 1-4 4H8l-5 3V7a4 4 0 0 1 4-4h10a4 4 0 0 1 4 4z\"><\/path>\n        <\/svg>\n\n        <textarea\n            name=\"message\"\n            placeholder=\"Your Message*\"\n            required\n        ><\/textarea>\n    <\/div>\n\n\n    <!-- SUBMIT -->\n    <button type=\"submit\" class=\"bw-submit\">\n\n        Send Message\n\n        <svg viewBox=\"0 0 24 24\">\n            <path d=\"M5 12h14\"><\/path>\n            <path d=\"m13 6 6 6-6 6\"><\/path>\n        <\/svg>\n\n    <\/button>\n\n\n    <!-- PRIVACY -->\n    <div class=\"bw-form-note\">\n\n        <svg viewBox=\"0 0 24 24\">\n            <rect x=\"5\" y=\"10\" width=\"14\" height=\"11\" rx=\"2\"><\/rect>\n            <path d=\"M8 10V7a4 4 0 0 1 8 0v3\"><\/path>\n        <\/svg>\n\n        Your information is safe with us. We'll never share your details.\n\n    <\/div>\n\n<\/form>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\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 CONNECT Contact Us We&#8217;d Love to Hear From you Have a question, a project in mind, or just want to say hello? Get in touch \u2014 we&#8217;re here to help you grow your online presence. Get a Free Qoute Chat With us Great Websites Start with a Conversation Real People. Real Support. Speak directly [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-79","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=\/wp\/v2\/pages\/79","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=79"}],"version-history":[{"count":58,"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=\/wp\/v2\/pages\/79\/revisions"}],"predecessor-version":[{"id":395,"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=\/wp\/v2\/pages\/79\/revisions\/395"}],"wp:attachment":[{"href":"https:\/\/bettaweb.co.za\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}