{"id":1272,"date":"2026-06-17T11:07:56","date_gmt":"2026-06-17T09:07:56","guid":{"rendered":""},"modified":"2026-06-21T20:09:31","modified_gmt":"2026-06-21T18:09:31","slug":"cases","status":"publish","type":"page","link":"https:\/\/growyu.nl\/en\/cases\/","title":{"rendered":"Cases"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row preset--module--divi-row--default\">\n<div class=\"et_pb_column_0 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24\">\n<div class=\"et_pb_code_0 et_pb_code et_pb_module preset--module--divi-code--default\"><div class=\"et_pb_code_inner\"><style>\n  html,body{overflow-x:clip}\n  #meshCanvas{position:absolute;inset:0;z-index:0;display:block;pointer-events:none}\n  .gy-fx-scrim{position:absolute;inset:0;z-index:1;pointer-events:none;\n    background:\n      radial-gradient(105% 105% at 4% 48%, rgba(33,32,37,.86) 0%, rgba(33,32,37,.35) 38%, transparent 64%),\n      linear-gradient(180deg, rgba(33,32,37,.45) 0%, transparent 20%, transparent 72%, rgba(33,32,37,.70) 100%)}\n<\/style>\n<canvas id=\"meshCanvas\" aria-hidden=\"true\"><\/canvas>\n<div class=\"gy-fx-scrim\" aria-hidden=\"true\"><\/div>\n<script>\n(function () {\n  var canvas = document.getElementById('meshCanvas');\n  if (!canvas) return;\n  var ctx = canvas.getContext('2d');\n\n  \/* Zoek de hero-SECTIE als container (robuust: tag SECTION of class met 'section'),\n     verplaats canvas + scrim erin als achtergrondlaag, en zet de content erboven. *\/\n  function isSection(el){\n    return el && (el.tagName === 'SECTION' || \/et_pb_section|(^|[\\s_-])section([\\s_-]|$)\/i.test(el.className || ''));\n  }\n  var box = canvas.parentElement;\n  while (box.parentElement && box.parentElement.tagName !== 'BODY' && !isSection(box)) box = box.parentElement;\n  box.style.position = 'relative';\n  box.style.overflow = 'hidden';\n  var scrim = document.querySelector('.gy-fx-scrim');\n  box.insertBefore(canvas, box.firstChild);\n  if (scrim) box.insertBefore(scrim, canvas.nextSibling);\n  Array.prototype.forEach.call(box.children, function (c) {\n    if (c !== canvas && c !== scrim) { c.style.position = 'relative'; c.style.zIndex = '2'; }\n  });\n\n  var SPEED = 0.8, AMP = 1.0, BRI = 1.0, PARALLAX = true;\n  var DPR = Math.min(window.devicePixelRatio || 1, 1.6);\n  var BG = [33, 32, 37];\n  var GX = 30, GY = 32, TS = 0.9, VAMP = 0.30;\n  function heightField(X, Z, t) {\n    return 0.7 * Math.sin(X * 0.4 + t) + 0.6 * Math.cos(Z * 0.45 - t * 0.8) + 0.3 * Math.sin((X + Z) * 0.35 + t * 1.3);\n  }\n  var state = { mx: 0, my: 0, cmx: 0, cmy: 0, mpxT: -9999, mpyT: -9999, mpx: -9999, mpy: -9999, hover: 0, hoverT: 0 };\n\n  function sizeCanvas() {\n    var w = box.clientWidth, h = box.clientHeight;\n    if (!w || !h) return;\n    canvas.width = Math.round(w * DPR); canvas.height = Math.round(h * DPR);\n    canvas.style.width = w + 'px'; canvas.style.height = h + 'px';\n  }\n  \/\/ Robuuste sizing: ResizeObserver pakt de echte sectie-hoogte zodra die bekend is.\n  if (window.ResizeObserver) { try { new ResizeObserver(sizeCanvas).observe(box); } catch (e) {} }\n  window.addEventListener('resize', sizeCanvas);\n  window.addEventListener('load', sizeCanvas);\n  setTimeout(sizeCanvas, 200); setTimeout(sizeCanvas, 800);\n\n  if (PARALLAX) {\n    window.addEventListener('mousemove', function (e) {\n      var r = canvas.getBoundingClientRect();\n      state.mpxT = (e.clientX - r.left) * DPR; state.mpyT = (e.clientY - r.top) * DPR; state.hoverT = 1;\n      state.mx = (e.clientX \/ window.innerWidth - 0.5) * 2; state.my = (e.clientY \/ window.innerHeight - 0.5) * 2;\n    });\n    document.addEventListener('mouseleave', function () { state.hoverT = 0; });\n  }\n\n  function fogColor(near, alpha) {\n    var g = [123, 242, 66];\n    return 'rgba(' + Math.round(BG[0] + (g[0] - BG[0]) * near) + ',' + Math.round(BG[1] + (g[1] - BG[1]) * near) + ',' + Math.round(BG[2] + (g[2] - BG[2]) * near) + ',' + alpha.toFixed(3) + ')';\n  }\n\n  var startT = performance.now();\n  function frame(now) {\n    var t = (now - startT) \/ 1000, W = canvas.width, H = canvas.height;\n    if (!W || !H) { requestAnimationFrame(frame); return; }\n    state.cmx += (state.mx - state.cmx) * 0.006; state.cmy += (state.my - state.cmy) * 0.006;\n    if (state.mpx < -9000) { state.mpx = state.mpxT; state.mpy = state.mpyT; }\n    state.mpx += (state.mpxT - state.mpx) * 0.04; state.mpy += (state.mpyT - state.mpy) * 0.04;\n    state.hover += (state.hoverT - state.hover) * 0.025;\n    ctx.clearRect(0, 0, W, H);\n    var f = H * 0.95, cx = W * 0.60 + state.cmx * W * 0.0022, cy = H * 0.44 + state.cmy * H * 0.0015;\n    var ZN = 1.15, ZF = 16, XR = 9, tt = t * SPEED * TS, A = VAMP * AMP;\n    var DENT = 0, Xc = 0, Zc = 0, SIG2 = 4.5;\n    if (state.hover > 0.001 && state.mpy > cy + 6) { Zc = f \/ (state.mpy - cy); Xc = (state.mpx - cx) * Zc \/ f; DENT = 0.2 * state.hover; }\n    var glow = ctx.createRadialGradient(cx, cy, 0, cx, cy, H * 0.9);\n    glow.addColorStop(0, 'rgba(123,242,66,' + (0.16 * BRI).toFixed(3) + ')');\n    glow.addColorStop(0.4, 'rgba(123,242,66,' + (0.05 * BRI).toFixed(3) + ')');\n    glow.addColorStop(1, 'rgba(123,242,66,0)');\n    ctx.fillStyle = glow; ctx.fillRect(0, 0, W, H);\n    var pts = [];\n    for (var j = 0; j <= GY; j++) {\n      var rowArr = new Array(GX + 1), Z = ZN + (j \/ GY) * (ZF - ZN);\n      for (var i = 0; i <= GX; i++) {\n        var X = (i \/ GX - 0.5) * 2 * XR, wv = heightField(X, Z, tt), Y = -1.0 + wv * A;\n        if (DENT) { var ddx = X - Xc, ddz = Z - Zc; Y -= DENT * Math.exp(-(ddx * ddx + ddz * ddz) \/ (2 * SIG2)); }\n        rowArr[i] = [cx + (X \/ Z) * f, cy - (Y \/ Z) * f, wv];\n      }\n      pts.push(rowArr);\n    }\n    ctx.lineJoin = 'round';\n    for (var jm = 0; jm <= GY; jm++) {\n      var nm = Math.pow(1 - jm \/ GY, 0.85); ctx.beginPath();\n      for (var im = 0; im <= GX; im++) { var pm = pts[jm][im]; if (im === 0) ctx.moveTo(pm[0], pm[1]); else ctx.lineTo(pm[0], pm[1]); }\n      ctx.strokeStyle = fogColor(nm, (0.04 + nm * 0.22) * BRI); ctx.lineWidth = 0.6 * DPR; ctx.stroke();\n    }\n    for (var imc = 0; imc <= GX; imc++) {\n      ctx.beginPath();\n      for (var jmc = 0; jmc <= GY; jmc++) { var p3 = pts[jmc][imc]; if (jmc === 0) ctx.moveTo(p3[0], p3[1]); else ctx.lineTo(p3[0], p3[1]); }\n      ctx.strokeStyle = fogColor(0.5, 0.07 * BRI); ctx.lineWidth = 0.6 * DPR; ctx.stroke();\n    }\n    ctx.globalCompositeOperation = 'lighter';\n    for (var jmd = 0; jmd <= GY; jmd++) {\n      var ndd = 1 - jmd \/ GY;\n      for (var imd = 0; imd <= GX; imd++) {\n        var pdd = pts[jmd][imd], hd = (pdd[2] + 2) \/ 4, rd = (0.5 + hd * 2.4) * ndd * DPR;\n        if (rd < 0.3) continue;\n        ctx.beginPath(); ctx.arc(pdd[0], pdd[1], rd, 0, 6.2832);\n        ctx.fillStyle = 'rgba(150,255,110,' + ((0.14 + hd * 0.7) * ndd * BRI).toFixed(3) + ')'; ctx.fill();\n      }\n    }\n    ctx.globalCompositeOperation = 'source-over';\n    requestAnimationFrame(frame);\n  }\n  requestAnimationFrame(frame);\n})();\n<\/script><\/div><\/div>\n\n<div class=\"et_pb_text_0 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module preset--module--divi-text--default\"><div class=\"et_pb_text_inner\"><h1 class=\"page-hero__h1\">Results that pay for <span style=\"color: #7bf242;\">themselves.<\/span><\/h1>\n<\/div><\/div>\n\n<div class=\"et_pb_text_1 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module preset--module--divi-text--w0skgr2je8\"><div class=\"et_pb_text_inner\"><p><span>A selection of projects where we made a measurable difference \u2014 from Power Apps that replace FTEs to Microsoft Fabric implementations on millions of rows of data.<\/span><\/p>\n<\/div><\/div>\n\n<div class=\"et_pb_code_1 et_pb_code et_pb_module preset--module--divi-code--default\"><div class=\"et_pb_code_inner\"><style>\n.gy-hero-chips{margin-top:40px;display:flex;flex-wrap:wrap;gap:10px}\n.gy-hero-chips a{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.06em;color:#fff;background:rgba(255,255,255,.05);border:1px solid #36353c;padding:9px 16px;border-radius:9999px;text-decoration:none;display:inline-flex;align-items:center;transition:background .22s,border-color .22s,color .22s}\n.gy-hero-chips a:hover{background:rgba(123,242,66,.12);border-color:rgba(123,242,66,.5);color:#7bf242}\n.gy-hero-chips .c{font-size:11px;margin-left:8px;padding-left:8px;border-left:1px solid #36353c;color:rgba(255,255,255,.5)}\n<\/style><nav class=\"gy-hero-chips\" aria-label=\"Snel naar groep\"><a href=\"#erp\">ERP implementations <span class=\"c\">2<\/span><\/a><a href=\"#data\">Power BI, data &amp; Fabric <span class=\"c\">5<\/span><\/a><a href=\"#apps\">Apps &amp; automation <span class=\"c\">2<\/span><\/a><\/nav><script>(function(){function isSection(el){return el&&(el.tagName==='SECTION'||\/et_pb_section|(^|[\\s_-])section([\\s_-]|$)\/i.test(el.className||''));}function section(el){while(el&&el!==document.body){if(isSection(el))return el;el=el.parentElement;}return null;}function headerH(){var s=['.et-l--header','#main-header','header'];for(var i=0;i<s.length;i++){var h=document.querySelector(s[i]);if(h&&h.offsetHeight)return h.offsetHeight;}return 80;}function go(id,smooth){var t=document.getElementById(id);if(!t)return false;var sec=section(t)||t;var y=sec.getBoundingClientRect().top+window.pageYOffset-(headerH()+8);window.scrollTo({top:y<0?0:y,behavior:smooth?'smooth':'auto'});return true;}document.addEventListener('click',function(e){var a=e.target.closest&&e.target.closest('.gy-hero-chips a[href^=\"#\"]');if(!a)return;e.preventDefault();e.stopPropagation();var id=a.getAttribute('href').slice(1);if(go(id,true)&&history.replaceState)history.replaceState(null,'','#'+id);},true);function fromHash(){var id=(location.hash||'').slice(1);if(!id)return;go(id,false);setTimeout(function(){go(id,false);},80);setTimeout(function(){go(id,false);},500);}if(location.hash){if(document.readyState==='complete')fromHash();else window.addEventListener('load',fromHash);}window.addEventListener('hashchange',function(){var id=(location.hash||'').slice(1);if(id)go(id,true);});})();<\/script><\/div><\/div>\n\n<div class=\"et_pb_text_2 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module preset--module--divi-text--w0skgr2je8\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_1 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_1 et_pb_row et_flex_row preset--module--divi-row--default\">\n<div class=\"et_pb_column_1 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_2 et_pb_code et_pb_module preset--module--divi-code--default\"><div class=\"et_pb_code_inner\"><style>\n.gy-cases .case-group__head{display:flex;align-items:flex-end;justify-content:space-between;gap:28px;flex-wrap:wrap;margin-bottom:44px;padding-bottom:24px;border-bottom:1px solid #e5e5e8}\n.gy-cases--dark .case-group__head{border-bottom-color:#36353c}\n.gy-cases .case-group__head-main{max-width:720px}\n.gy-cases .case-group__eyebrow{display:inline-flex;align-items:center;gap:10px;margin-bottom:16px}\n.gy-cases .case-group__num{font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.06em;color:#16210a;background:#7bf242;border-radius:8px;padding:4px 9px;line-height:1}\n.gy-cases .eyebrow{font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:500;letter-spacing:.18em;text-transform:uppercase;color:#7bf242}\n.gy-cases .eyebrow--on-light{color:rgba(33,32,37,.6)}\n.gy-cases .case-group__head h2{font-family:Montserrat,sans-serif;font-weight:800;font-size:clamp(26px,3vw,38px);line-height:1.08;letter-spacing:-.025em;color:#212025;margin:0;text-wrap:balance}\n.gy-cases--dark .case-group__head h2{color:#fff}\n.gy-cases .case-group__count{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:rgba(33,32,37,.5);white-space:nowrap;padding-bottom:6px}\n.gy-cases--dark .case-group__count{color:rgba(255,255,255,.5)}\n.gy-cases .case-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}\n.gy-cases .case-grid--two{grid-template-columns:repeat(2,1fr)}\n.gy-cases .cs-card{background:#fff;border:1px solid #e5e5e8;border-radius:16px;padding:30px 30px 26px;display:flex;flex-direction:column;box-shadow:0 6px 16px rgba(33,32,37,.08),0 2px 4px rgba(33,32,37,.04);position:relative;overflow:hidden;transition:transform .22s cubic-bezier(.22,1,.36,1),box-shadow .22s,border-color .22s}\n.gy-cases .cs-card:hover{transform:translateY(-3px);box-shadow:0 20px 40px rgba(33,32,37,.12),0 6px 12px rgba(33,32,37,.06);border-color:#212025}\n.gy-cases--dark .cs-card{background:rgba(28,27,32,.52);border-color:#36353c;box-shadow:0 24px 70px -28px rgba(0,0,0,.7);-webkit-backdrop-filter:blur(8px) saturate(118%);backdrop-filter:blur(8px) saturate(118%)}\n.gy-cases--dark .cs-card:hover{transform:translateY(-3px);box-shadow:0 30px 80px -28px rgba(0,0,0,.7);border-color:#36353c}\n.gy-cases .cs-card__label{display:inline-flex;align-items:center;gap:8px;align-self:flex-start;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#212025;background:#a9f57e;border-radius:9999px;padding:6px 13px;margin-bottom:18px}\n.gy-cases--dark .cs-card__label{color:#fff;background:rgba(123,242,66,.12);border:1px solid rgba(123,242,66,.28)}\n.gy-cases .cs-card__name{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.04em;color:rgba(33,32,37,.55);margin:0 0 8px;display:flex;align-items:center;gap:8px}\n.gy-cases .cs-card__name::before{content:\"\";width:5px;height:5px;border-radius:50%;background:#6dd936;flex:none}\n.gy-cases--dark .cs-card__name{color:rgba(255,255,255,.55)}\n.gy-cases--dark .cs-card__name::before{background:#7bf242}\n.gy-cases .cs-card__title{font-family:Montserrat,sans-serif;font-weight:700;font-size:21px;line-height:1.2;letter-spacing:-.015em;color:#212025;margin:0 0 16px}\n.gy-cases--dark .cs-card__title{color:#fff}\n.gy-cases .cs-card__body{font-family:Inter,sans-serif;font-size:14.5px;line-height:1.6;color:#6e6d75;margin:0 0 26px}\n.gy-cases--dark .cs-card__body{color:#b8b7bd}\n.gy-cases .cs-stats{margin-top:auto;display:grid;grid-template-columns:1fr 1fr;gap:0;border-top:1px solid #e5e5e8}\n.gy-cases--dark .cs-stats{border-top-color:#36353c}\n.gy-cases .cs-stat{padding:20px 22px 4px 0;display:flex;flex-direction:column}\n.gy-cases .cs-stat + .cs-stat{padding-left:22px;border-left:1px solid #e5e5e8}\n.gy-cases--dark .cs-stat + .cs-stat{border-left-color:#36353c}\n.gy-cases .cs-stat__value{font-family:Montserrat,sans-serif;font-weight:800;font-size:clamp(24px,2.4vw,30px);line-height:1;letter-spacing:-.03em;color:#212025;margin:0 0 8px}\n.gy-cases--dark .cs-stat__value{color:#fff}\n.gy-cases .cs-stat__value .plus,.gy-cases .cs-stat__value .arrow{color:#6dd936}\n.gy-cases--dark .cs-stat__value .plus,.gy-cases--dark .cs-stat__value .arrow{color:#7bf242}\n.gy-cases .cs-stat__label{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:rgba(33,32,37,.5);line-height:1.4;margin:0}\n.gy-cases--dark .cs-stat__label{color:rgba(255,255,255,.5)}\n.gy-cases .cases-note{margin-top:56px;padding-top:28px;border-top:1px solid #e5e5e8;display:flex;align-items:center;gap:12px;font-family:'JetBrains Mono',monospace;font-size:12.5px;letter-spacing:.04em;color:rgba(33,32,37,.6)}\n.gy-cases .cases-note__dot{width:7px;height:7px;border-radius:50%;background:#7bf242;box-shadow:0 0 8px rgba(123,242,66,.6);flex:none}\n@media(max-width:980px){.gy-cases .case-grid{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:680px){.gy-cases .case-grid,.gy-cases .case-grid--two{grid-template-columns:1fr}.gy-cases .case-group__head{align-items:flex-start}}\n<\/style><div class=\"gy-cases\"><div class=\"case-group\" id=\"erp\"><div class=\"case-group__head\"><div class=\"case-group__head-main\"><span class=\"case-group__eyebrow\"><span class=\"case-group__num\">01<\/span><span class=\"eyebrow eyebrow--on-light\">ERP IMPLEMENTATIONS<\/span><\/span><h2>Dynamics 365 &amp; Business Central<\/h2><\/div><span class=\"case-group__count\">2 cases<\/span><\/div><div class=\"case-grid case-grid--two\"><article class=\"cs-card\"><span class=\"cs-card__label\">Dynamics 365 F&amp;SCM<\/span><p class=\"cs-card__name\">IT service provider \u00b7 Belgium<\/p><h3 class=\"cs-card__title\">Multi-country finance on one standard<\/h3><p class=\"cs-card__body\">Finance consultant on an internal Dynamics 365 F&amp;SCM implementation with multi-country rollout. Standardisation of finance processes, configuration per country, end-user training and migration of transactional data.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">Multi-country<\/p><p class=\"cs-stat__label\">rollout<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">F&amp;SCM<\/p><p class=\"cs-stat__label\">finance consultant<\/p><\/div><\/div><\/article><article class=\"cs-card\"><span class=\"cs-card__label\">Business Central<\/span><p class=\"cs-card__name\">International agricultural company<\/p><h3 class=\"cs-card__title\">From NAV to BC, across 20+ countries<\/h3><p class=\"cs-card__body\">Finance SME on a Business Central implementation: procure-to-pay, goods process and data migration from NAV to BC. In addition, a Navision SCOA renumbering rolled out across 20+ countries, including standardisation of posting groups.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">20<span class=\"plus\">+<\/span><\/p><p class=\"cs-stat__label\">countries SCOA<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">3<\/p><p class=\"cs-stat__label\">parallel projects<\/p><\/div><\/div><\/article><\/div><\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_2 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_2 et_pb_row et_flex_row preset--module--divi-row--default\">\n<div class=\"et_pb_column_2 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_3 et_pb_code et_pb_module preset--module--divi-code--default\"><div class=\"et_pb_code_inner\"><style>.gy-mesh-scrim{background:radial-gradient(120% 110% at 50% 50%,transparent 0%,rgba(33,32,37,.42) 78%),linear-gradient(180deg,rgba(33,32,37,.55) 0%,transparent 26%,transparent 74%,rgba(33,32,37,.6) 100%)}<\/style><canvas data-mesh=\"cases\" aria-hidden=\"true\"><\/canvas><div class=\"gy-mesh-scrim\" aria-hidden=\"true\"><\/div><script>\/* Growyu golf-mesh background \u2014 multi-instance.\n   Renders the animated green point-cloud mesh into every\n   <canvas data-mesh> on the page, each sized to its parent element.\n   Gentle mouse parallax + soft cursor depression. Pauses rendering\n   while the canvas is scrolled out of view. Self-contained, no deps.\n   (Derived from hero-mesh.js, generalised to N canvases.) *\/\n(function () {\n  function initMesh(canvas) {\n    var ctx = canvas.getContext('2d');\n    var box = canvas.parentElement || canvas;\n\n    \/\/ ---- locked settings (chosen config) ----\n    var SPEED = 0.8;       \/\/ Snelheid 0.8\u00d7\n    var AMP   = 1.0;       \/\/ Amplitude 100%\n    var BRI   = 1.0;       \/\/ Helderheid 100%\n    var PARALLAX = true;   \/\/ Muis-parallax aan\n\n    var DPR = Math.min(window.devicePixelRatio || 1, 1.6);\n    var BG = [33, 32, 37];\n\n    \/\/ which mesh to draw \u2014 value of data-mesh (\"\" => default \"verbonden\")\n    var VARIANT = (canvas.getAttribute('data-mesh') || '').trim() || 'verbonden';\n\n    var GX, GY, TS, VAMP, heightField;\n    if (VARIANT === 'cases') {\n      \/\/ ascending growth curves \u2014 set in render(); grid params unused\n      GX = 2; GY = 2; TS = 1.0; VAMP = 0.30;\n      heightField = function () { return 0; };\n    } else if (VARIANT === 'apps') {\n      \/\/ calm field of app-icon tiles (rounded squares) on a gentle swell\n      GX = 28; GY = 30; TS = 0.55; VAMP = 0.22;\n      heightField = function (X, Z, t) {\n        return 0.6 * Math.sin(X * 0.40 + t * 0.9)\n             + 0.45 * Math.cos(Z * 0.38 - t * 0.7)\n             + 0.25 * Math.sin((X + Z) * 0.28 + t);\n      };\n    } else {\n      \/\/ \"Verbonden\" variant: point cloud + connecting lines\n      GX = 30; GY = 32; TS = 0.9; VAMP = 0.30;\n      heightField = function (X, Z, t) {\n        return 0.7 * Math.sin(X * 0.4 + t)\n             + 0.6 * Math.cos(Z * 0.45 - t * 0.8)\n             + 0.3 * Math.sin((X + Z) * 0.35 + t * 1.3);\n      };\n    }\n\n    var state = {\n      mx: 0, my: 0, cmx: 0, cmy: 0,\n      mpxT: -9999, mpyT: -9999, mpx: -9999, mpy: -9999,\n      hover: 0, hoverT: 0\n    };\n\n    function sizeCanvas() {\n      var w = box.clientWidth, h = box.clientHeight;\n      canvas.width = Math.round(w * DPR);\n      canvas.height = Math.round(h * DPR);\n      canvas.style.width = w + 'px';\n      canvas.style.height = h + 'px';\n    }\n    window.addEventListener('resize', function () { sizeCanvas(); render(performance.now()); });\n\n    if (PARALLAX) {\n      window.addEventListener('mousemove', function (e) {\n        var r = canvas.getBoundingClientRect();\n        state.mpxT = (e.clientX - r.left) * DPR;\n        state.mpyT = (e.clientY - r.top) * DPR;\n        state.hoverT = 1;\n        state.mx = (e.clientX \/ window.innerWidth - 0.5) * 2;\n        state.my = (e.clientY \/ window.innerHeight - 0.5) * 2;\n      });\n      document.addEventListener('mouseleave', function () { state.hoverT = 0; });\n    }\n\n    function fogColor(near, alpha) {\n      var g = [123, 242, 66];\n      var r = Math.round(BG[0] + (g[0] - BG[0]) * near);\n      var gg = Math.round(BG[1] + (g[1] - BG[1]) * near);\n      var b = Math.round(BG[2] + (g[2] - BG[2]) * near);\n      return 'rgba(' + r + ',' + gg + ',' + b + ',' + alpha.toFixed(3) + ')';\n    }\n\n    \/\/ decorrelated per-cell hash (0..1) \u2014 no diagonal streaks\n    function hash2(i, j) {\n      var n = Math.sin(i * 127.1 + j * 311.7) * 43758.5453;\n      return n - Math.floor(n);\n    }\n    \/\/ screen-aligned rounded square \u2014 an \"app icon\" glyph\n    function roundRect(x, y, w, h, r) {\n      if (r > w \/ 2) r = w \/ 2; if (r > h \/ 2) r = h \/ 2;\n      ctx.beginPath();\n      ctx.moveTo(x + r, y);\n      ctx.arcTo(x + w, y, x + w, y + h, r);\n      ctx.arcTo(x + w, y + h, x, y + h, r);\n      ctx.arcTo(x, y + h, x, y, r);\n      ctx.arcTo(x, y, x + w, y, r);\n      ctx.closePath();\n    }\n\n    \/\/ ---- app-raster renderer: drifting field of app-icon tiles ----\n    function renderAppGrid(pts) {\n      for (var ja = GY; ja >= 0; ja--) {\n        var na = 1 - ja \/ GY;                       \/\/ 1 near .. 0 far\n        if (na < 0.05) continue;\n        for (var ia = 0; ia <= GX; ia++) {\n          var pa = pts[ja][ia];\n          \/\/ presence hash \u2014 leaves gaps so it's not a solid grid\n          if (hash2(ia, ja) < 0.30) continue;\n          var hv = (pa[2] + 2) \/ 4;                  \/\/ wave height 0..1\n          var sz = (2.8 + hv * 7.2) * na * DPR;      \/\/ icon half-size\n          if (sz < 1.1) continue;\n          var rr = sz * 0.52;                        \/\/ rounded-square radius\n          var lift = 0.4 + hv * 0.55;                \/\/ crest tiles read brighter\n          var baseA = (0.06 + 0.19 * na) * lift * BRI;\n          \/\/ fill rule: independent hash, must be a strict LOCAL MAXIMUM among 4\n          \/\/ orthogonal neighbours and above threshold -> filled tiles never touch\n          \/\/ and stay a sparse minority.\n          var hf = hash2(ia + 41, ja + 17);\n          var filled = hf > 0.60 &&\n            hf > hash2(ia + 42, ja + 17) && hf > hash2(ia + 40, ja + 17) &&\n            hf > hash2(ia + 41, ja + 18) && hf > hash2(ia + 41, ja + 16);\n          roundRect(pa[0] - sz, pa[1] - sz, sz * 2, sz * 2, rr);\n          ctx.strokeStyle = fogColor(na, baseA);\n          ctx.lineWidth = (0.5 + na * 0.7) * DPR;\n          ctx.stroke();\n          if (filled) {\n            ctx.globalCompositeOperation = 'lighter';\n            roundRect(pa[0] - sz, pa[1] - sz, sz * 2, sz * 2, rr);\n            ctx.fillStyle = 'rgba(123,242,66,' + (baseA * 1.25).toFixed(3) + ')';\n            ctx.fill();\n            ctx.globalCompositeOperation = 'source-over';\n          }\n        }\n      }\n    }\n\n    var startT = performance.now();\n    var visible = true;\n    var running = false;\n\n    \/\/ ---- cases renderer: calm ascending growth curves ----\n    var growthC = null;\n    function renderGrowth(W, H, t) {\n      \/\/ Clean 2D growth chart in screen space \u2014 identical look at any canvas size.\n      var tt = t * SPEED, bri = BRI, amp = VAMP * AMP \/ 0.30;\n\n      var chartH = W * 0.34;                    \/\/ band height tied to WIDTH \u2192 consistent slope\n      var midY = H * 0.52 + state.cmy * H * 0.01;\n      var by = midY + chartH * 0.5, ty = midY - chartH * 0.5;\n      var span = chartH;\n      var x0 = -W * 0.05, cw = W * 1.10;        \/\/ slight overscan off both edges\n\n      var gx = W * 0.66 + state.cmx * W * 0.01;\n      var gy = midY - chartH * 0.15;\n      var gl = ctx.createRadialGradient(gx, gy, 0, gx, gy, Math.max(W, H) * 0.62);\n      gl.addColorStop(0, 'rgba(123,242,66,' + (0.13 * bri).toFixed(3) + ')');\n      gl.addColorStop(0.5, 'rgba(123,242,66,' + (0.03 * bri).toFixed(3) + ')');\n      gl.addColorStop(1, 'rgba(123,242,66,0)');\n      ctx.fillStyle = gl; ctx.fillRect(0, 0, W, H);\n\n      if (!growthC) {\n        growthC = [\n          { hs: 1.00, freq: 4.2, phase: 0.0, main: true },\n          { hs: 0.70, freq: 5.0, phase: 1.9, main: false },\n          { hs: 0.47, freq: 6.1, phase: 3.6, main: false }\n        ];\n      }\n      function curveY(c, u) {\n        var rise = u * u * (3 - 2 * u);\n        var wave = 0.045 * Math.sin(u * c.freq + c.phase + tt * 0.45)\n                 + 0.025 * Math.sin(u * c.freq * 2.1 - c.phase - tt * 0.32);\n        var h = (0.05 + rise * 0.92 + wave * amp) * c.hs;\n        return by - h * span;\n      }\n      ctx.lineCap = 'round';\n      ctx.lineJoin = 'round';\n      var steps = 150;\n      for (var n = growthC.length - 1; n >= 0; n--) {\n        var c = growthC[n];\n        var P = [];\n        for (var s = 0; s <= steps; s++) {\n          var u = s \/ steps;\n          P.push([x0 + u * cw, curveY(c, u)]);\n        }\n        if (c.main) {\n          ctx.globalCompositeOperation = 'lighter';\n          ctx.strokeStyle = 'rgba(123,242,66,' + (0.10 * bri).toFixed(3) + ')';\n          ctx.lineWidth = 7 * DPR;\n          ctx.beginPath(); ctx.moveTo(P[0][0], P[0][1]);\n          for (var sg = 1; sg < P.length; sg++) ctx.lineTo(P[sg][0], P[sg][1]);\n          ctx.stroke();\n          ctx.globalCompositeOperation = 'source-over';\n          ctx.strokeStyle = 'rgba(155,255,125,' + (0.55 * bri).toFixed(3) + ')';\n          ctx.lineWidth = 1.7 * DPR;\n          ctx.beginPath(); ctx.moveTo(P[0][0], P[0][1]);\n          for (var sc = 1; sc < P.length; sc++) ctx.lineTo(P[sc][0], P[sc][1]);\n          ctx.stroke();\n        } else {\n          ctx.strokeStyle = 'rgba(123,242,66,' + (0.15 * bri).toFixed(3) + ')';\n          ctx.lineWidth = 1.1 * DPR;\n          ctx.beginPath(); ctx.moveTo(P[0][0], P[0][1]);\n          for (var ss = 1; ss < P.length; ss++) ctx.lineTo(P[ss][0], P[ss][1]);\n          ctx.stroke();\n        }\n      }\n      var main = growthC[0];\n      ctx.globalCompositeOperation = 'lighter';\n      var DOTS = 9;\n      for (var d = 0; d <= DOTS; d++) {\n        var ud = d \/ DOTS;\n        var twk = 0.55 + 0.45 * Math.sin(tt * 1.3 + d * 1.7);\n        ctx.beginPath();\n        ctx.arc(x0 + ud * cw, curveY(main, ud), 2.0 * DPR, 0, 6.2832);\n        ctx.fillStyle = 'rgba(185,255,145,' + (0.32 * twk * bri).toFixed(3) + ')';\n        ctx.fill();\n      }\n      var hp = (tt * 0.05) % 1;\n      var fade = Math.sin(hp * Math.PI);\n      var mx = x0 + hp * cw, my = curveY(main, hp);\n      var R = 3.4 * DPR;\n      ctx.beginPath(); ctx.arc(mx, my, R * 3.6, 0, 6.2832);\n      ctx.fillStyle = 'rgba(123,242,66,' + (0.12 * fade * bri).toFixed(3) + ')'; ctx.fill();\n      ctx.beginPath(); ctx.arc(mx, my, R, 0, 6.2832);\n      ctx.fillStyle = 'rgba(215,255,175,' + (0.9 * fade * bri).toFixed(3) + ')'; ctx.fill();\n      ctx.globalCompositeOperation = 'source-over';\n    }\n\n    function render(now) {\n      var t = (now - startT) \/ 1000;\n      var W = canvas.width, H = canvas.height;\n\n      state.cmx += (state.mx - state.cmx) * 0.006;\n      state.cmy += (state.my - state.cmy) * 0.006;\n      if (state.mpx < -9000) { state.mpx = state.mpxT; state.mpy = state.mpyT; }\n      state.mpx += (state.mpxT - state.mpx) * 0.04;\n      state.mpy += (state.mpyT - state.mpy) * 0.04;\n      state.hover += (state.hoverT - state.hover) * 0.025;\n\n      ctx.clearRect(0, 0, W, H);\n\n      var f  = H * 0.95;\n      var cx = W * 0.60 + state.cmx * W * 0.0022;\n      var cy = H * 0.44 + state.cmy * H * 0.0015;\n      var XR = 9, ZN = 1.15, ZF = 16;\n      var tt = t * SPEED * TS;\n      var A  = VAMP * AMP;\n\n      var DENT = 0, Xc = 0, Zc = 0, SIG2 = 4.5;\n      if (state.hover > 0.001 && state.mpy > cy + 6) {\n        Zc = f \/ (state.mpy - cy);\n        Xc = (state.mpx - cx) * Zc \/ f;\n        DENT = 0.2 * state.hover;\n      }\n\n      \/\/ cases = ascending growth curves with their own (width-based) camera + glow\n      if (VARIANT === 'cases') { renderGrowth(W, H, t); return; }\n\n      var glow = ctx.createRadialGradient(cx, cy, 0, cx, cy, H * 0.9);\n      glow.addColorStop(0, 'rgba(123,242,66,' + (0.16 * BRI).toFixed(3) + ')');\n      glow.addColorStop(0.4, 'rgba(123,242,66,' + (0.05 * BRI).toFixed(3) + ')');\n      glow.addColorStop(1, 'rgba(123,242,66,0)');\n      ctx.fillStyle = glow;\n      ctx.fillRect(0, 0, W, H);\n\n      var pts = [];\n      for (var j = 0; j <= GY; j++) {\n        var rowArr = new Array(GX + 1);\n        var Z = ZN + (j \/ GY) * (ZF - ZN);\n        for (var i = 0; i <= GX; i++) {\n          var X = (i \/ GX - 0.5) * 2 * XR;\n          var wv = heightField(X, Z, tt);\n          var Y = -1.0 + wv * A;\n          if (DENT) {\n            var ddx = X - Xc, ddz = Z - Zc;\n            Y -= DENT * Math.exp(-(ddx * ddx + ddz * ddz) \/ (2 * SIG2));\n          }\n          rowArr[i] = [cx + (X \/ Z) * f, cy - (Y \/ Z) * f, wv];\n        }\n        pts.push(rowArr);\n      }\n\n      ctx.lineJoin = 'round';\n\n      if (VARIANT === 'apps') { renderAppGrid(pts); return; }\n\n      \/\/ dim connecting lines: rows\n      for (var jm = 0; jm <= GY; jm++) {\n        var nm = Math.pow(1 - jm \/ GY, 0.85);\n        ctx.beginPath();\n        for (var im = 0; im <= GX; im++) {\n          var pm = pts[jm][im];\n          if (im === 0) ctx.moveTo(pm[0], pm[1]); else ctx.lineTo(pm[0], pm[1]);\n        }\n        ctx.strokeStyle = fogColor(nm, (0.04 + nm * 0.22) * BRI);\n        ctx.lineWidth = 0.6 * DPR;\n        ctx.stroke();\n      }\n      \/\/ columns\n      for (var imc = 0; imc <= GX; imc++) {\n        ctx.beginPath();\n        for (var jmc = 0; jmc <= GY; jmc++) {\n          var p3 = pts[jmc][imc];\n          if (jmc === 0) ctx.moveTo(p3[0], p3[1]); else ctx.lineTo(p3[0], p3[1]);\n        }\n        ctx.strokeStyle = fogColor(0.5, 0.07 * BRI);\n        ctx.lineWidth = 0.6 * DPR;\n        ctx.stroke();\n      }\n      \/\/ bright points\n      ctx.globalCompositeOperation = 'lighter';\n      for (var jmd = 0; jmd <= GY; jmd++) {\n        var ndd = 1 - jmd \/ GY;\n        for (var imd = 0; imd <= GX; imd++) {\n          var pdd = pts[jmd][imd];\n          var hd = (pdd[2] + 2) \/ 4;\n          var rd = (0.5 + hd * 2.4) * ndd * DPR;\n          if (rd < 0.3) continue;\n          ctx.beginPath();\n          ctx.arc(pdd[0], pdd[1], rd, 0, 6.2832);\n          ctx.fillStyle = 'rgba(150,255,110,' + ((0.14 + hd * 0.7) * ndd * BRI).toFixed(3) + ')';\n          ctx.fill();\n        }\n      }\n      ctx.globalCompositeOperation = 'source-over';\n    }\n\n    function frame(now) {\n      if (!visible) { running = false; return; }\n      render(now);\n      requestAnimationFrame(frame);\n    }\n\n    function start() {\n      if (!running) { running = true; requestAnimationFrame(frame); }\n    }\n\n    \/\/ Only animate while the canvas is on screen.\n    if ('IntersectionObserver' in window) {\n      var io = new IntersectionObserver(function (entries) {\n        visible = entries[0].isIntersecting;\n        if (visible) start();\n      }, { rootMargin: '120px' });\n      io.observe(canvas);\n    }\n\n    sizeCanvas();\n    render(performance.now()); \/\/ immediate paint (also covers print \/ paused-rAF)\n    start();\n  }\n\n  function boot() {\n    var list = document.querySelectorAll('canvas[data-mesh=\"cases\"]');\n    for (var bi = 0; bi < list.length; bi++) {\n      var canvas = list[bi];\n      var sec = canvas.parentElement;\n      while (sec.parentElement && sec.parentElement.tagName !== 'BODY' && !\/et_pb_section|(^|[\\s_-])section([\\s_-]|$)\/i.test(sec.className||'')) sec = sec.parentElement;\n      sec.style.position='relative'; sec.style.overflow='hidden';\n      var scrim = sec.querySelector('.gy-mesh-scrim') || document.querySelector('.gy-mesh-scrim');\n      sec.insertBefore(canvas, sec.firstChild);\n      canvas.style.position='absolute'; canvas.style.inset='0'; canvas.style.zIndex='0'; canvas.style.display='block'; canvas.style.pointerEvents='none';\n      if (scrim) { sec.insertBefore(scrim, canvas.nextSibling); scrim.style.position='absolute'; scrim.style.inset='0'; scrim.style.zIndex='1'; scrim.style.pointerEvents='none'; }\n      Array.prototype.forEach.call(sec.children, function(c){ if(c!==canvas&&c!==scrim){c.style.position='relative'; if(!c.style.zIndex)c.style.zIndex='2';} });\n      initMesh(canvas);\n      (function(s){ setTimeout(function(){window.dispatchEvent(new Event('resize'));},300); setTimeout(function(){window.dispatchEvent(new Event('resize'));},900); if(window.ResizeObserver){try{new ResizeObserver(function(){window.dispatchEvent(new Event('resize'));}).observe(s);}catch(e){}} })(sec);\n    }\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot);\n  } else {\n    boot();\n  }\n})();\n<\/script><\/div><\/div>\n\n<div class=\"et_pb_code_4 et_pb_code et_pb_module preset--module--divi-code--default\"><div class=\"et_pb_code_inner\"><style>\n.gy-cases .case-group__head{display:flex;align-items:flex-end;justify-content:space-between;gap:28px;flex-wrap:wrap;margin-bottom:44px;padding-bottom:24px;border-bottom:1px solid #e5e5e8}\n.gy-cases--dark .case-group__head{border-bottom-color:#36353c}\n.gy-cases .case-group__head-main{max-width:720px}\n.gy-cases .case-group__eyebrow{display:inline-flex;align-items:center;gap:10px;margin-bottom:16px}\n.gy-cases .case-group__num{font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.06em;color:#16210a;background:#7bf242;border-radius:8px;padding:4px 9px;line-height:1}\n.gy-cases .eyebrow{font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:500;letter-spacing:.18em;text-transform:uppercase;color:#7bf242}\n.gy-cases .eyebrow--on-light{color:rgba(33,32,37,.6)}\n.gy-cases .case-group__head h2{font-family:Montserrat,sans-serif;font-weight:800;font-size:clamp(26px,3vw,38px);line-height:1.08;letter-spacing:-.025em;color:#212025;margin:0;text-wrap:balance}\n.gy-cases--dark .case-group__head h2{color:#fff}\n.gy-cases .case-group__count{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:rgba(33,32,37,.5);white-space:nowrap;padding-bottom:6px}\n.gy-cases--dark .case-group__count{color:rgba(255,255,255,.5)}\n.gy-cases .case-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}\n.gy-cases .case-grid--two{grid-template-columns:repeat(2,1fr)}\n.gy-cases .cs-card{background:#fff;border:1px solid #e5e5e8;border-radius:16px;padding:30px 30px 26px;display:flex;flex-direction:column;box-shadow:0 6px 16px rgba(33,32,37,.08),0 2px 4px rgba(33,32,37,.04);position:relative;overflow:hidden;transition:transform .22s cubic-bezier(.22,1,.36,1),box-shadow .22s,border-color .22s}\n.gy-cases .cs-card:hover{transform:translateY(-3px);box-shadow:0 20px 40px rgba(33,32,37,.12),0 6px 12px rgba(33,32,37,.06);border-color:#212025}\n.gy-cases--dark .cs-card{background:rgba(28,27,32,.52);border-color:#36353c;box-shadow:0 24px 70px -28px rgba(0,0,0,.7);-webkit-backdrop-filter:blur(8px) saturate(118%);backdrop-filter:blur(8px) saturate(118%)}\n.gy-cases--dark .cs-card:hover{transform:translateY(-3px);box-shadow:0 30px 80px -28px rgba(0,0,0,.7);border-color:#36353c}\n.gy-cases .cs-card__label{display:inline-flex;align-items:center;gap:8px;align-self:flex-start;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#212025;background:#a9f57e;border-radius:9999px;padding:6px 13px;margin-bottom:18px}\n.gy-cases--dark .cs-card__label{color:#fff;background:rgba(123,242,66,.12);border:1px solid rgba(123,242,66,.28)}\n.gy-cases .cs-card__name{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.04em;color:rgba(33,32,37,.55);margin:0 0 8px;display:flex;align-items:center;gap:8px}\n.gy-cases .cs-card__name::before{content:\"\";width:5px;height:5px;border-radius:50%;background:#6dd936;flex:none}\n.gy-cases--dark .cs-card__name{color:rgba(255,255,255,.55)}\n.gy-cases--dark .cs-card__name::before{background:#7bf242}\n.gy-cases .cs-card__title{font-family:Montserrat,sans-serif;font-weight:700;font-size:21px;line-height:1.2;letter-spacing:-.015em;color:#212025;margin:0 0 16px}\n.gy-cases--dark .cs-card__title{color:#fff}\n.gy-cases .cs-card__body{font-family:Inter,sans-serif;font-size:14.5px;line-height:1.6;color:#6e6d75;margin:0 0 26px}\n.gy-cases--dark .cs-card__body{color:#b8b7bd}\n.gy-cases .cs-stats{margin-top:auto;display:grid;grid-template-columns:1fr 1fr;gap:0;border-top:1px solid #e5e5e8}\n.gy-cases--dark .cs-stats{border-top-color:#36353c}\n.gy-cases .cs-stat{padding:20px 22px 4px 0;display:flex;flex-direction:column}\n.gy-cases .cs-stat + .cs-stat{padding-left:22px;border-left:1px solid #e5e5e8}\n.gy-cases--dark .cs-stat + .cs-stat{border-left-color:#36353c}\n.gy-cases .cs-stat__value{font-family:Montserrat,sans-serif;font-weight:800;font-size:clamp(24px,2.4vw,30px);line-height:1;letter-spacing:-.03em;color:#212025;margin:0 0 8px}\n.gy-cases--dark .cs-stat__value{color:#fff}\n.gy-cases .cs-stat__value .plus,.gy-cases .cs-stat__value .arrow{color:#6dd936}\n.gy-cases--dark .cs-stat__value .plus,.gy-cases--dark .cs-stat__value .arrow{color:#7bf242}\n.gy-cases .cs-stat__label{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:rgba(33,32,37,.5);line-height:1.4;margin:0}\n.gy-cases--dark .cs-stat__label{color:rgba(255,255,255,.5)}\n.gy-cases .cases-note{margin-top:56px;padding-top:28px;border-top:1px solid #e5e5e8;display:flex;align-items:center;gap:12px;font-family:'JetBrains Mono',monospace;font-size:12.5px;letter-spacing:.04em;color:rgba(33,32,37,.6)}\n.gy-cases .cases-note__dot{width:7px;height:7px;border-radius:50%;background:#7bf242;box-shadow:0 0 8px rgba(123,242,66,.6);flex:none}\n@media(max-width:980px){.gy-cases .case-grid{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:680px){.gy-cases .case-grid,.gy-cases .case-grid--two{grid-template-columns:1fr}.gy-cases .case-group__head{align-items:flex-start}}\n<\/style><div class=\"gy-cases gy-cases--dark\"><div class=\"case-group\" id=\"data\"><div class=\"case-group__head\"><div class=\"case-group__head-main\"><span class=\"case-group__eyebrow\"><span class=\"case-group__num\">02<\/span><span class=\"eyebrow\">DATA &amp; ANALYTICS<\/span><\/span><h2>Power BI, data &amp; Fabric<\/h2><\/div><span class=\"case-group__count\">5 cases<\/span><\/div><div class=\"case-grid\"><article class=\"cs-card\"><span class=\"cs-card__label\">Synapse + Power BI<\/span><p class=\"cs-card__name\">Enterprise security \u00b7 Norway<\/p><h3 class=\"cs-card__title\">Two ERPs, one reporting layer<\/h3><p class=\"cs-card__body\">Financial reporting built on Synapse and Power BI. We designed the architecture that brings together AX2012 and D365 data and automated the migration with complex SQL queries. One reporting layer that runs effortlessly on millions of rows.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">M<span class=\"plus\">+<\/span><\/p><p class=\"cs-stat__label\">rows of data<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">2<\/p><p class=\"cs-stat__label\">ERPs consolidated<\/p><\/div><\/div><\/article><article class=\"cs-card\"><span class=\"cs-card__label\">Microsoft Fabric<\/span><p class=\"cs-card__name\">Technical service provider<\/p><h3 class=\"cs-card__title\">Medallion for project &amp; finance reporting<\/h3><p class=\"cs-card__body\">Microsoft Fabric implementation for project and finance reporting. Medallion architecture (bronze, silver, gold) with Python and SQL in notebooks, and data models built for scalable analytics.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">Fabric<\/p><p class=\"cs-stat__label\">medallion<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">PM + finance<\/p><p class=\"cs-stat__label\">rapportage<\/p><\/div><\/div><\/article><article class=\"cs-card\"><span class=\"cs-card__label\">Dynamics 365 + Power BI<\/span><p class=\"cs-card__name\">Seafood producer<\/p><h3 class=\"cs-card__title\">Gold-layer DWH with Fabric roadmap<\/h3><p class=\"cs-card__body\">Power BI reports on top of Dynamics 365 data. A gold-layer data warehouse on Synapse (with a Fabric roadmap), plus advice and troubleshooting on the configuration and data challenges.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">Gold<\/p><p class=\"cs-stat__label\">DWH layer<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">Dynamics 365<\/p><p class=\"cs-stat__label\">F&amp;SCM<\/p><\/div><\/div><\/article><article class=\"cs-card\"><span class=\"cs-card__label\">Microsoft Fabric (advisory)<\/span><p class=\"cs-card__name\">Agricultural service provider<\/p><h3 class=\"cs-card__title\">Architecture advice &amp; QA on Fabric<\/h3><p class=\"cs-card__body\">Architecture advisor on the build of Microsoft Fabric, as the link between the client and the implementation partner. Migration away from a legacy cube solution, with test guidance and quality assurance on the new architecture.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">Fabric<\/p><p class=\"cs-stat__label\">migration<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">QA<\/p><p class=\"cs-stat__label\">architecture<\/p><\/div><\/div><\/article><article class=\"cs-card\"><span class=\"cs-card__label\">Power BI<\/span><p class=\"cs-card__name\">Transport company<\/p><h3 class=\"cs-card__title\">Excel reports to BI &amp; AFAS<\/h3><p class=\"cs-card__body\">Power BI reports and automation of manual Excel reports. Data models for future use cases, and Power BI as a bridge between the legacy system and AFAS for invoice export and import.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">AFAS<\/p><p class=\"cs-stat__label\">integration<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">Excel <span class=\"arrow\">\u2192<\/span> BI<\/p><p class=\"cs-stat__label\">automation<\/p><\/div><\/div><\/article><\/div><\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<div class=\"et_pb_section_3 et_pb_section et_section_regular et_flex_section\">\n<div class=\"et_pb_row_3 et_pb_row et_flex_row preset--module--divi-row--default\">\n<div class=\"et_pb_column_3 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone\">\n<div class=\"et_pb_code_5 et_pb_code et_pb_module preset--module--divi-code--default\"><div class=\"et_pb_code_inner\"><style>\n.gy-cases .case-group__head{display:flex;align-items:flex-end;justify-content:space-between;gap:28px;flex-wrap:wrap;margin-bottom:44px;padding-bottom:24px;border-bottom:1px solid #e5e5e8}\n.gy-cases--dark .case-group__head{border-bottom-color:#36353c}\n.gy-cases .case-group__head-main{max-width:720px}\n.gy-cases .case-group__eyebrow{display:inline-flex;align-items:center;gap:10px;margin-bottom:16px}\n.gy-cases .case-group__num{font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:500;letter-spacing:.06em;color:#16210a;background:#7bf242;border-radius:8px;padding:4px 9px;line-height:1}\n.gy-cases .eyebrow{font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:500;letter-spacing:.18em;text-transform:uppercase;color:#7bf242}\n.gy-cases .eyebrow--on-light{color:rgba(33,32,37,.6)}\n.gy-cases .case-group__head h2{font-family:Montserrat,sans-serif;font-weight:800;font-size:clamp(26px,3vw,38px);line-height:1.08;letter-spacing:-.025em;color:#212025;margin:0;text-wrap:balance}\n.gy-cases--dark .case-group__head h2{color:#fff}\n.gy-cases .case-group__count{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:rgba(33,32,37,.5);white-space:nowrap;padding-bottom:6px}\n.gy-cases--dark .case-group__count{color:rgba(255,255,255,.5)}\n.gy-cases .case-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}\n.gy-cases .case-grid--two{grid-template-columns:repeat(2,1fr)}\n.gy-cases .cs-card{background:#fff;border:1px solid #e5e5e8;border-radius:16px;padding:30px 30px 26px;display:flex;flex-direction:column;box-shadow:0 6px 16px rgba(33,32,37,.08),0 2px 4px rgba(33,32,37,.04);position:relative;overflow:hidden;transition:transform .22s cubic-bezier(.22,1,.36,1),box-shadow .22s,border-color .22s}\n.gy-cases .cs-card:hover{transform:translateY(-3px);box-shadow:0 20px 40px rgba(33,32,37,.12),0 6px 12px rgba(33,32,37,.06);border-color:#212025}\n.gy-cases--dark .cs-card{background:rgba(28,27,32,.52);border-color:#36353c;box-shadow:0 24px 70px -28px rgba(0,0,0,.7);-webkit-backdrop-filter:blur(8px) saturate(118%);backdrop-filter:blur(8px) saturate(118%)}\n.gy-cases--dark .cs-card:hover{transform:translateY(-3px);box-shadow:0 30px 80px -28px rgba(0,0,0,.7);border-color:#36353c}\n.gy-cases .cs-card__label{display:inline-flex;align-items:center;gap:8px;align-self:flex-start;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#212025;background:#a9f57e;border-radius:9999px;padding:6px 13px;margin-bottom:18px}\n.gy-cases--dark .cs-card__label{color:#fff;background:rgba(123,242,66,.12);border:1px solid rgba(123,242,66,.28)}\n.gy-cases .cs-card__name{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.04em;color:rgba(33,32,37,.55);margin:0 0 8px;display:flex;align-items:center;gap:8px}\n.gy-cases .cs-card__name::before{content:\"\";width:5px;height:5px;border-radius:50%;background:#6dd936;flex:none}\n.gy-cases--dark .cs-card__name{color:rgba(255,255,255,.55)}\n.gy-cases--dark .cs-card__name::before{background:#7bf242}\n.gy-cases .cs-card__title{font-family:Montserrat,sans-serif;font-weight:700;font-size:21px;line-height:1.2;letter-spacing:-.015em;color:#212025;margin:0 0 16px}\n.gy-cases--dark .cs-card__title{color:#fff}\n.gy-cases .cs-card__body{font-family:Inter,sans-serif;font-size:14.5px;line-height:1.6;color:#6e6d75;margin:0 0 26px}\n.gy-cases--dark .cs-card__body{color:#b8b7bd}\n.gy-cases .cs-stats{margin-top:auto;display:grid;grid-template-columns:1fr 1fr;gap:0;border-top:1px solid #e5e5e8}\n.gy-cases--dark .cs-stats{border-top-color:#36353c}\n.gy-cases .cs-stat{padding:20px 22px 4px 0;display:flex;flex-direction:column}\n.gy-cases .cs-stat + .cs-stat{padding-left:22px;border-left:1px solid #e5e5e8}\n.gy-cases--dark .cs-stat + .cs-stat{border-left-color:#36353c}\n.gy-cases .cs-stat__value{font-family:Montserrat,sans-serif;font-weight:800;font-size:clamp(24px,2.4vw,30px);line-height:1;letter-spacing:-.03em;color:#212025;margin:0 0 8px}\n.gy-cases--dark .cs-stat__value{color:#fff}\n.gy-cases .cs-stat__value .plus,.gy-cases .cs-stat__value .arrow{color:#6dd936}\n.gy-cases--dark .cs-stat__value .plus,.gy-cases--dark .cs-stat__value .arrow{color:#7bf242}\n.gy-cases .cs-stat__label{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:rgba(33,32,37,.5);line-height:1.4;margin:0}\n.gy-cases--dark .cs-stat__label{color:rgba(255,255,255,.5)}\n.gy-cases .cases-note{margin-top:56px;padding-top:28px;border-top:1px solid #e5e5e8;display:flex;align-items:center;gap:12px;font-family:'JetBrains Mono',monospace;font-size:12.5px;letter-spacing:.04em;color:rgba(33,32,37,.6)}\n.gy-cases .cases-note__dot{width:7px;height:7px;border-radius:50%;background:#7bf242;box-shadow:0 0 8px rgba(123,242,66,.6);flex:none}\n@media(max-width:980px){.gy-cases .case-grid{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:680px){.gy-cases .case-grid,.gy-cases .case-grid--two{grid-template-columns:1fr}.gy-cases .case-group__head{align-items:flex-start}}\n<\/style><div class=\"gy-cases\"><div class=\"case-group\" id=\"apps\"><div class=\"case-group__head\"><div class=\"case-group__head-main\"><span class=\"case-group__eyebrow\"><span class=\"case-group__num\">03<\/span><span class=\"eyebrow eyebrow--on-light\">LOW-CODE &amp; AUTOMATION<\/span><\/span><h2>Apps &amp; automation<\/h2><\/div><span class=\"case-group__count\">2 cases<\/span><\/div><div class=\"case-grid case-grid--two\"><article class=\"cs-card\"><span class=\"cs-card__label\">Power Apps<\/span><p class=\"cs-card__name\">Facility services provider<\/p><h3 class=\"cs-card__title\">Time tracking that freed up 1 FTE<\/h3><p class=\"cs-card__body\">A time-tracking app for approving hours and assignments, with Power BI dashboards for insight into approvals and activities. The app replaced 1 FTE of manual work.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">1 FTE<\/p><p class=\"cs-stat__label\">freed up<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">Power Apps<\/p><p class=\"cs-stat__label\">+ Power BI<\/p><\/div><\/div><\/article><article class=\"cs-card\"><span class=\"cs-card__label\">Dox42<\/span><p class=\"cs-card__name\">Manufacturer of cleaning products<\/p><h3 class=\"cs-card__title\">Document automation across multiple countries<\/h3><p class=\"cs-card__body\">Document automation with Dox42 for invoices, order confirmations and related documents. Multi-country template standardisation, so each country meets local requirements on one platform.<\/p><div class=\"cs-stats\"><div class=\"cs-stat\"><p class=\"cs-stat__value\">Dox42<\/p><p class=\"cs-stat__label\">document generation<\/p><\/div><div class=\"cs-stat\"><p class=\"cs-stat__value\">Multi<\/p><p class=\"cs-stat__label\">countries<\/p><\/div><\/div><\/article><\/div><p class=\"cases-note\"><span class=\"cases-note__dot\" aria-hidden=\"true\"><\/span>\n        Full reference list on request, partly under NDA.\n      <\/p><\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1272","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/pages\/1272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/comments?post=1272"}],"version-history":[{"count":7,"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/pages\/1272\/revisions"}],"predecessor-version":[{"id":1279,"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/pages\/1272\/revisions\/1279"}],"wp:attachment":[{"href":"https:\/\/growyu.nl\/en\/wp-json\/wp\/v2\/media?parent=1272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}