{"id":8633,"date":"2026-01-14T20:49:24","date_gmt":"2026-01-14T19:49:24","guid":{"rendered":"https:\/\/innovacore.group\/?post_type=portfolio&p=8633"},"modified":"2026-03-17T15:34:16","modified_gmt":"2026-03-17T13:34:16","slug":"shopisan","status":"publish","type":"portfolio","link":"https:\/\/innovacore.group\/ro\/portfolio\/shopisan\/","title":{"rendered":"Shopisan &#8211; Revitalizarea Comer\u021bului Local"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Shopisan is the first private &#8222;local attention operator&#8221; dedicated to revitalizing city center commerce. By combining physical event management with a digital platform (Live &amp; Replay), they transform passive retail spaces into dynamic, traffic-generating hubs. Their B2B model aligns the interests of merchants, cities, and private partners to create &#8222;Shopisan Weeks&#8221;\u2014industrialized promotional events that boost footfall and sales while digitizing local inventory.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Standardul european pentru activarea comer\u021bului local, \u00eembin\u00e2nd evenimentele fizice cu cump\u0103r\u0103turile \u00een direct.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"Shopisan","summary":"<span class=\"ic-nycd\">Revitalizarea<\/span> Comer\u021b Local","mission":"<p>S\u0103 transform\u0103m criza comer\u021bului local \u00eentr-un activ sustenabil. Shopisan \u00ee\u0219i propune s\u0103 fie bra\u021bul opera\u021bional pe care autorit\u0103\u021bile publice nu \u00eel au, oferind o solu\u021bie la cheie care aduce convivialitate, vizibilitate digital\u0103 \u0219i dinamism comercial \u00eenapoi \u00een centrele ora\u0219elor, beneficiind \u00een egal\u0103 m\u0103sur\u0103 comercian\u021bii independen\u021bi \u0219i comunit\u0103\u021bile locale.<\/p>\n","impact":"<p>Shopisan abordeaz\u0103 \u201ecriza t\u0103cut\u0103\u201d a spa\u021biilor comerciale vacante maximiz\u00e2nd bunurile imobiliare comerciale existente, \u00een loc s\u0103 construiasc\u0103 structuri noi (sobrietatea terenurilor). Prin profesionalizarea promov\u0103rii comer\u021bului local, relocalizeaz\u0103 consumul, sus\u021bine segmentele sustenabile (second-hand, artizani locali) \u0219i reconstrui\u021bi leg\u0103turile sociale \u00een zonele urbane.<\/p>\n","company_logo":"https:\/\/innovacore.group\/wp-content\/uploads\/shopisan-logo-innov-innovacore-optimized.jpg","website_url":"","linkedin_url":"","location":"Paris, Fran\u021ba","founded_year":"2026","key_numbers":{"item-0":{"metric_label":"\u021aint\u0103 de puncte de v\u00e2nzare K+","metric_value":"270"},"item-1":{"metric_label":"% Model B2B &amp; B2C","metric_value":"100"},"item-2":{"metric_label":"% EBITDA \u021bint\u0103","metric_value":"20"}},"hiring_status":"angajare","sector":"pia\u021b\u0103 online","company_type":"start-up","audience":["b2b_a_b2c"],"geo_scope":["na\u021bional"],"business_model":["pia\u021b\u0103 online","servicii"],"funding_stage":"\u00een derulare","partnership_type":"creare","logo_animation":"<div id=\"shopisan-particle-root\">rn    <canvas id=\"shopisanCanvas\"><\/canvas>rn<\/div>rnrn<style>rn    #shopisan-particle-root {rn        width: 100%;rn        height: 300px;rn        display: flex;rn        justify-content: center;rn        align-items: center;rn        background: transparent;rn        overflow: hidden;rn        cursor: crosshair;rn    }rn<\/style>rnrn<script>rn(function() {rn    const canvas = document.getElementById('shopisanCanvas');rn    const ctx = canvas.getContext('2d', { willReadFrequently: true });rn    const root = document.getElementById('shopisan-particle-root');rn    rn    let width, height;rn    let particles = [];rn    let mouse = { x: -1000, y: -1000 };rn    const particleColor = '#f5f5f5';rn    let time = 0;rnrn    function init() {rn        width = root.offsetWidth;rn        height = 300;rn        rn        const dpr = window.devicePixelRatio || 1;rn        canvas.width = width * dpr;rn        canvas.height = height * dpr;rn        canvas.style.width = width + 'px';rn        canvas.style.height = height + 'px';rn        ctx.scale(dpr, dpr);rnrn        createLogoParticles();rn    }rnrn    function createLogoParticles() {rn        particles = [];rn        const cx = width \/ 2;rn        const cy = height \/ 2;rn        const isMobile = width < 600;rnrn        \/\/ --- 1. CONFIGURATION ---rn        ctx.fillStyle = 'white';rn        ctx.strokeStyle = 'white';rn        rn        const iconSize = isMobile ? 60 : 90;rn        const fontSize = isMobile ? 35 : 60;rn        const separatorH = isMobile ? 50 : 80;rn        const gap = isMobile ? 20 : 35;rnrn        ctx.font = `bold ${fontSize}px Arial, Helvetica, sans-serif`;rn        const textMetrics = ctx.measureText('SHOPISAN');rn        const textWidth = textMetrics.width;rnrn        const totalWidth = iconSize + gap + 2 + gap + textWidth;rn        const startX = cx - (totalWidth \/ 2);rnrn        \/\/ --- 2. DESSIN DU GABARIT (Invisible) ---rn        const ix = startX + (iconSize \/ 2);rn        const iy = cy - (iconSize * 0.1);rn        const radius = iconSize * 0.35;rn        rn        ctx.lineWidth = iconSize * 0.08;rn        ctx.lineCap = 'round';rn        ctx.lineJoin = 'round';rnrn        \/\/ Srn        ctx.font = `bold ${iconSize * 0.5}px Arial, sans-serif`;rn        ctx.textAlign = 'center';rn        ctx.textBaseline = 'middle';rn        ctx.fillText('S', ix, iy);rnrn        \/\/ Arcsrn        ctx.beginPath();rn        ctx.arc(ix, iy, radius * 0.8, Math.PI, 0); rn        ctx.stroke();rn        ctx.beginPath();rn        ctx.arc(ix, iy, radius * 1.3, Math.PI, 0); rn        ctx.stroke();rnrn        \/\/ Pointern        ctx.beginPath();rn        ctx.moveTo(ix - radius * 0.8, iy + 5);rn        ctx.lineTo(ix, iy + iconSize * 0.5);rn        ctx.lineTo(ix + radius * 0.8, iy + 5);rn        ctx.stroke();rn        ctx.beginPath();rn        ctx.moveTo(ix - radius * 1.3, iy + 5);rn        ctx.lineTo(ix, iy + iconSize * 0.8);rn        ctx.lineTo(ix + radius * 1.3, iy + 5);rn        ctx.stroke();rnrn        \/\/ Barrern        const lineX = startX + iconSize + gap;rn        ctx.lineWidth = 2;rn        ctx.beginPath();rn        ctx.moveTo(lineX, cy - separatorH \/ 2);rn        ctx.lineTo(lineX, cy + separatorH \/ 2);rn        ctx.stroke();rnrn        \/\/ Textern        const textX = lineX + gap;rn        ctx.textAlign = 'left';rn        ctx.fillStyle = 'white';rn        ctx.font = `bold ${fontSize}px Arial, Helvetica, sans-serif`;rn        ctx.fillText('SHOPISAN', textX, cy);rnrn        \/\/ --- 3. SCAN ---rn        const density = 4;rn        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;rn        const dataWidth = canvas.width; rnrn        for (let y = 0; y < canvas.height; y += density) {rn            for (let x = 0; x < canvas.width; x += density) {rn                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {rn                    const dpr = window.devicePixelRatio || 1;rn                    particles.push({rn                        x: x \/ dpr,rn                        y: y \/ dpr,rn                        originX: x \/ dpr,rn                        originY: y \/ dpr,rn                        vx: 0, rn                        vy: 0,rn                        size: Math.random() * 1.5 + 0.5,rn                        force: Math.random() rn                    });rn                }rn            }rn        }rn        ctx.clearRect(0, 0, width, height);rn    }rnrn    function draw() {rn        ctx.clearRect(0, 0, width, height);rn        rn        \/\/ MODIF 1 : Animation de vague beaucoup plus lentern        time += 0.02; \/\/ Avant c'\u00e9tait 0.05rnrn        ctx.fillStyle = particleColor;rn        rn        particles.forEach(p => {rn            \/\/ Vague doucern            const waveX = Math.sin(time * 0.5 + p.y * 0.05) * 2;rn            const waveY = Math.cos(time * 0.3 + p.x * 0.05) * 2;rn            rn            const dx = mouse.x - p.x;rn            const dy = mouse.y - p.y;rn            const dist = Math.sqrt(dx*dx + dy*dy);rn            const radius = 80;rn            rn            let repelX = 0;rn            let repelY = 0;rnrn            if (dist < radius) {rn                const force = (radius - dist) \/ radius;rn                const angle = Math.atan2(dy, dx);rn                rn                \/\/ MODIF 2 : R\u00e9pulsion beaucoup plus douce (8 au lieu de 20)rn                repelX = -Math.cos(angle) * force * 8;rn                repelY = -Math.sin(angle) * force * 8;rn            }rnrn            const targetX = p.originX + waveX;rn            const targetY = p.originY + waveY;rnrn            \/\/ MODIF 3 : Retour \u00e0 la position tr\u00e8s souple (0.03 au lieu de 0.08)rn            const ax = (targetX - p.x) * 0.03;rn            const ay = (targetY - p.y) * 0.03;rnrn            p.vx += ax;rn            p.vy += ay;rn            p.vx += repelX * 0.3; \/\/ On applique aussi moins de force sourisrn            p.vy += repelY * 0.3;rn            rn            \/\/ MODIF 4 : Friction plus \u00e9lev\u00e9e pour que \u00e7a \"glisse\" (0.90 au lieu de 0.85)rn            p.vx *= 0.90; rn            p.vy *= 0.90;rnrn            p.x += p.vx;rn            p.y += p.vy;rnrn            ctx.beginPath();rn            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);rn            ctx.fill();rn        });rnrn        requestAnimationFrame(draw);rn    }rnrn    const updateMouse = (e) => {rn        const r = canvas.getBoundingClientRect();rn        const cx = e.touches ? e.touches[0].clientX : e.clientX;rn        const cy = e.touches ? e.touches[0].clientY : e.clientY;rn        mouse.x = cx - r.left;rn        mouse.y = cy - r.top;rn    };rnrn    window.addEventListener('resize', init);rn    canvas.addEventListener('mousemove', updateMouse);rn    canvas.addEventListener('touchmove', updateMouse, {passive: true});rn    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });rn    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });rnrn    setTimeout(init, 50);rn    draw();rn})();rn<\/script>"},"pt":[],"pipeline":[],"class_list":["post-8633","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/portfolio\/8633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":1,"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/portfolio\/8633\/revisions"}],"predecessor-version":[{"id":8634,"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/portfolio\/8633\/revisions\/8634"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/media?parent=8633"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/pt?post=8633"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/innovacore.group\/ro\/wp-json\/wp\/v2\/pipeline?post=8633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}