{"id":8605,"date":"2026-01-14T20:43:37","date_gmt":"2026-01-14T19:43:37","guid":{"rendered":"https:\/\/innovacore.group\/?post_type=portfolio&p=8605"},"modified":"2026-03-17T15:32:04","modified_gmt":"2026-03-17T13:32:04","slug":"wydarzenia-znizkowe","status":"publish","type":"portfolio","link":"https:\/\/innovacore.group\/pl\/portfolio\/wydarzenia-znizkowe\/","title":{"rendered":"discount.events &#8211; Odzyskaj Swoj\u0105 Si\u0142\u0119 Nabywcz\u0105"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">discount.events is a hybrid platform dedicated to maximizing consumer value through three strategic axes: Social Live Selling, a massive marketplace, and exclusive physical events. Offering daily discounts on over 200,000 items, from everyday goods to travel\u2014plus private clearance sales, it blends digital convenience with community engagement. It serves as a comprehensive ecosystem designed to protect household budgets against inflation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zakupy na \u017cywo w sieci, codzienne promocje i ekskluzywne wydarzenia, aby zwi\u0119kszy\u0107 si\u0142\u0119 zakupow\u0105.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"discount.events","summary":"Odzyskaj swoj\u0105 <span class=\"ic-nycd\">si\u0142\u0119 nabywcz\u0105<\/span","mission":"<p>A przywr\u00f3ceniu si\u0142y nabywczej konsumentom. Uzyskuj\u0105c przekonanie, \u017ce ka\u017cdy euro ma znaczenie, discount.events wykorzystuje skal\u0119 i technologi\u0119 do wynegocjowania ekskluzywnych stawek w handlu detalicznym, podr\u00f3\u017cach i do\u015bwiadczeniach, zapewniaj\u0105c u\u017cytkownikom utrzymanie stylu \u017cycia bez konieczno\u015bci rezygnowania z jako\u015bci lub bud\u017cetu.<\/p>\n","impact":"<p>discount.events przekszta\u0142ca sektor detaliczny, \u0142\u0105cz\u0105c wirusowy zaanga\u017cowanie Social Live Selling z masowym zasi\u0119giem dystrybucji. Dzia\u0142a jako dwustronne rozwi\u0105zanie: kluczowy magazyn zapas\u00f3w dla du\u017cych marek oraz istotny tarcz antyinflacyjny dla milion\u00f3w gospodarstw domowych.<\/p>\n","company_logo":"https:\/\/innovacore.group\/wp-content\/uploads\/d-events-logo-innov-innovacore-optimized.jpg","website_url":"https:\/\/discount.events\/","linkedin_url":"https:\/\/www.linkedin.com\/company\/104703917\/","location":"Miami, FL, USA","founded_year":"2025","key_numbers":{"item-0":{"metric_label":"Zasi\u0119g odbiorc\u00f3w M+ (FR)","metric_value":"20"},"item-1":{"metric_label":"K+ wydarze\u0144 zorganizowanych","metric_value":"18"},"item-2":{"metric_label":"Kana\u0142y sprzeda\u017cy","metric_value":"3"}},"hiring_status":"rekrutacja","sector":"rynek","company_type":"przedsi\u0119biorstwo","audience":["b2b_a_b2c"],"geo_scope":["globalny"],"business_model":["rynek","us\u0142ugi","subskrypcja"],"funding_stage":"pre_seed","partnership_type":"tworzenie","logo_animation":"<div id=\"discount-particle-root\">\r\n    <canvas id=\"discountCanvas\"><\/canvas>\r\n<\/div>\r\n\r\n<style>\r\n    #discount-particle-root {\r\n        width: 100%;\r\n        height: 300px; \/* Hauteur fixe respect\u00e9e *\/\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        background: transparent;\r\n        overflow: hidden;\r\n        cursor: crosshair;\r\n    }\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n    const canvas = document.getElementById('discountCanvas');\r\n    const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n    const root = document.getElementById('discount-particle-root');\r\n    \r\n    let width, height;\r\n    let particles = [];\r\n    let mouse = { x: -1000, y: -1000 };\r\n    const particleColor = '#f5f5f5'; \/\/ Gris clair Innovacore\r\n    let time = 0;\r\n\r\n    function init() {\r\n        width = root.offsetWidth;\r\n        height = 300;\r\n        \r\n        const dpr = window.devicePixelRatio || 1;\r\n        canvas.width = width * dpr;\r\n        canvas.height = height * dpr;\r\n        canvas.style.width = width + 'px';\r\n        canvas.style.height = height + 'px';\r\n        ctx.scale(dpr, dpr);\r\n\r\n        createLogoParticles();\r\n    }\r\n\r\n    function createLogoParticles() {\r\n        particles = [];\r\n        const cx = width \/ 2;\r\n        const cy = height \/ 2;\r\n        const isMobile = width < 600;\r\n\r\n        \/\/ --- 1. CONFIGURATION ---\r\n        \/\/ On dessine en blanc pour le scan\r\n        ctx.fillStyle = 'white';\r\n        ctx.strokeStyle = 'white';\r\n\r\n        \/\/ Dimensions relatives\r\n        const fontSizeMain = isMobile ? 40 : 70;\r\n        const fontSizeSub = isMobile ? 20 : 35; \/\/ Pour \"events\"\r\n        \r\n        \/\/ Polices\r\n        const fontMain = `bold ${fontSizeMain}px \"Poppins\", Arial, sans-serif`;\r\n        const fontSub = `normal ${fontSizeSub}px \"Poppins\", Arial, sans-serif`;\r\n\r\n        \/\/ Calcul des largeurs pour le centrage\r\n        ctx.font = fontMain;\r\n        const wDiscount = ctx.measureText('discount').width;\r\n        \r\n        ctx.font = fontSub;\r\n        const wEvents = ctx.measureText('events').width;\r\n        \r\n        \/\/ Ticket dimensions\r\n        const ticketPaddingX = fontSizeSub * 1.5;\r\n        const ticketHeight = fontSizeSub * 1.8;\r\n        const ticketWidth = wEvents + ticketPaddingX; \r\n        \r\n        \/\/ Largeur totale approximative (discount + d\u00e9calage visuel)\r\n        \/\/ Le ticket est align\u00e9 \u00e0 droite du mot discount g\u00e9n\u00e9ralement, ou centr\u00e9 sous la fin\r\n        \/\/ On va faire une compo \u00e9quilibr\u00e9e : discount centr\u00e9, ticket d\u00e9cal\u00e9 droite\r\n        const totalWidth = Math.max(wDiscount, ticketWidth + (wDiscount * 0.3));\r\n        \r\n        const startX = cx - (totalWidth \/ 2);\r\n        const startY = cy - (fontSizeMain * 0.2); \/\/ Remonter un peu\r\n\r\n        \/\/ --- 2. DESSIN DE \"discount\" ---\r\n        ctx.textAlign = 'left';\r\n        ctx.textBaseline = 'alphabetic';\r\n        ctx.font = fontMain;\r\n        ctx.fillText('discount', startX, startY);\r\n\r\n        \/\/ --- 3. DESSIN DU TICKET ---\r\n        const ticketX = startX + (wDiscount - ticketWidth * 0.8); \/\/ D\u00e9cal\u00e9 vers la droite\r\n        const ticketY = startY + (fontSizeMain * 0.2); \/\/ Un peu en dessous\r\n        \r\n        \/\/ A. Le Rectangle plein\r\n        ctx.fillRect(ticketX, ticketY, ticketWidth, ticketHeight);\r\n\r\n        \/\/ B. Les d\u00e9coupes (Espace n\u00e9gatif)\r\n        ctx.globalCompositeOperation = 'destination-out'; \/\/ Mode Gomme\r\n\r\n        \/\/ 1. Les trous du ticket (encoches sur les c\u00f4t\u00e9s)\r\n        const punchRadius = ticketHeight * 0.15;\r\n        const punchY = ticketY + (ticketHeight \/ 2);\r\n        \r\n        ctx.beginPath();\r\n        ctx.arc(ticketX, punchY, punchRadius, 0, Math.PI * 2); \/\/ Gauche\r\n        ctx.fill();\r\n        \r\n        ctx.beginPath();\r\n        ctx.arc(ticketX + ticketWidth, punchY, punchRadius, 0, Math.PI * 2); \/\/ Droite\r\n        ctx.fill();\r\n\r\n        \/\/ 2. Le texte \"events\" en d\u00e9fonce (vide) \u00e0 l'int\u00e9rieur\r\n        ctx.font = fontSub;\r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        ctx.fillText('events', ticketX + (ticketWidth \/ 2), ticketY + (ticketHeight \/ 2));\r\n\r\n        \/\/ Retour normal\r\n        ctx.globalCompositeOperation = 'source-over';\r\n\r\n        \/\/ --- 4. SCAN DES PIXELS ---\r\n        const density = 4;\r\n        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\r\n        const dataWidth = canvas.width; \r\n\r\n        for (let y = 0; y < canvas.height; y += density) {\r\n            for (let x = 0; x < canvas.width; x += density) {\r\n                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {\r\n                    const dpr = window.devicePixelRatio || 1;\r\n                    particles.push({\r\n                        x: x \/ dpr,\r\n                        y: y \/ dpr,\r\n                        originX: x \/ dpr,\r\n                        originY: y \/ dpr,\r\n                        vx: 0, \r\n                        vy: 0,\r\n                        size: Math.random() * 1.5 + 0.5,\r\n                        force: Math.random() \r\n                    });\r\n                }\r\n            }\r\n        }\r\n        \r\n        \/\/ Nettoyage\r\n        ctx.clearRect(0, 0, width, height);\r\n    }\r\n\r\n    function draw() {\r\n        ctx.clearRect(0, 0, width, height);\r\n        time += 0.05;\r\n\r\n        ctx.fillStyle = particleColor;\r\n        \r\n        particles.forEach(p => {\r\n            \/\/ 1. Respiration\r\n            const waveX = Math.sin(time * 0.5 + p.y * 0.05) * 2;\r\n            const waveY = Math.cos(time * 0.3 + p.x * 0.05) * 2;\r\n\r\n            \/\/ 2. Interaction\r\n            const dx = mouse.x - p.x;\r\n            const dy = mouse.y - p.y;\r\n            const dist = Math.sqrt(dx*dx + dy*dy);\r\n            const radius = 80;\r\n\r\n            let repelX = 0;\r\n            let repelY = 0;\r\n\r\n            if (dist < radius) {\r\n                const force = (radius - dist) \/ radius;\r\n                const angle = Math.atan2(dy, dx);\r\n                repelX = -Math.cos(angle) * force * 20;\r\n                repelY = -Math.sin(angle) * force * 20;\r\n            }\r\n\r\n            \/\/ 3. Physique\r\n            const targetX = p.originX + waveX;\r\n            const targetY = p.originY + waveY;\r\n\r\n            const ax = (targetX - p.x) * 0.08;\r\n            const ay = (targetY - p.y) * 0.08;\r\n\r\n            p.vx += ax;\r\n            p.vy += ay;\r\n            p.vx += repelX * 0.5;\r\n            p.vy += repelY * 0.5;\r\n            p.vx *= 0.85; \r\n\r\n            p.x += p.vx;\r\n            p.y += p.vy;\r\n\r\n            ctx.beginPath();\r\n            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\r\n            ctx.fill();\r\n        });\r\n\r\n        requestAnimationFrame(draw);\r\n    }\r\n\r\n    const updateMouse = (e) => {\r\n        const r = canvas.getBoundingClientRect();\r\n        const cx = e.touches ? e.touches[0].clientX : e.clientX;\r\n        const cy = e.touches ? e.touches[0].clientY : e.clientY;\r\n        mouse.x = cx - r.left;\r\n        mouse.y = cy - r.top;\r\n    };\r\n\r\n    window.addEventListener('resize', init);\r\n    canvas.addEventListener('mousemove', updateMouse);\r\n    canvas.addEventListener('touchmove', updateMouse, {passive: true});\r\n    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });\r\n    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });\r\n\r\n    setTimeout(init, 50);\r\n    draw();\r\n})();\r\n<\/script>"},"pt":[],"pipeline":[],"class_list":["post-8605","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio\/8605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":1,"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio\/8605\/revisions"}],"predecessor-version":[{"id":8606,"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/portfolio\/8605\/revisions\/8606"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/media?parent=8605"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/pt?post=8605"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/innovacore.group\/pl\/wp-json\/wp\/v2\/pipeline?post=8605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}