Wykrojnik dzwonkowy
@import url('https://fonts.googleapis.com/css2?family=Anton&display=swap'); .mistrz-product-desc { --red: #ff0000; --dark-red: #9b0000; --black: #0f0f0f; --white: #ffffff; --light: #f4f4f4; position: relative; width: 100%; max-width: 1150px; margin: 36px auto; padding: 18px; font-family: 'Anton', sans-serif; box-sizing: border-box; } .mistrz-blood-frame { position: relative; border-radius: 22px; padding: 5px; background: #ffffff; overflow: hidden; box-shadow: 0 16px 38px rgba(0, 0, 0, 0.10), 0 0 0 1px rgba(255, 0, 0, 0.12); transform-style: preserve-3d; perspective: 900px; transition: transform 0.45s ease; } .mistrz-blood-frame::before { content: ""; position: absolute; inset: 0; border-radius: 22px; background: linear-gradient(120deg, rgba(255, 0, 0, 0.08), transparent 30%, rgba(255, 0, 0, 0.07) 58%, transparent 82%), radial-gradient(circle at 15% 25%, rgba(255, 0, 0, 0.09), transparent 24%), radial-gradient(circle at 85% 70%, rgba(255, 0, 0, 0.08), transparent 26%); animation: mistrzFramePulse 8s ease-in-out infinite; pointer-events: none; z-index: 1; } .mistrz-blood-canvas { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 2; pointer-events: none; } .mistrz-desc-inner { position: relative; z-index: 3; overflow: hidden; border-radius: 18px; background: linear-gradient(135deg, #ffffff 0%, #f4f4f4 52%, #ffffff 100%); padding: 38px; min-height: 440px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.04); } .mistrz-desc-inner::before { content: ""; position: absolute; top: -120px; right: -130px; width: 330px; height: 330px; background: radial-gradient(circle, rgba(255, 0, 0, 0.08), transparent 62%); filter: blur(8px); animation: mistrzRedGlow 10s ease-in-out infinite alternate; pointer-events: none; } .mistrz-desc-inner::after { content: ""; position: absolute; inset: 0; background: linear-gradient(110deg, transparent 0%, transparent 44%, rgba(255,255,255,0.45) 49%, transparent 55%, transparent 100%); transform: translateX(-130%); animation: mistrzShine 12s ease-in-out infinite; pointer-events: none; } .mistrz-top-label { display: inline-flex; align-items: center; gap: 10px; margin-bottom: 18px; padding: 9px 16px; border-radius: 999px; background: #111111; color: #ffffff; font-size: 15px; letter-spacing: 0.7px; text-transform: uppercase; box-shadow: 0 8px 22px rgba(0,0,0,0.14); } .mistrz-top-label span { color: var(--red); } .mistrz-title { margin: 0 0 14px; color: #111111; font-size: clamp(38px, 5vw, 70px); line-height: 0.98; letter-spacing: 0.3px; text-transform: none; } .mistrz-title strong { color: var(--red); font-weight: 400; } .mistrz-lead { margin: 0 0 24px; max-width: 900px; font-size: clamp(22px, 2.4vw, 34px); line-height: 1.15; color: #111111; } .mistrz-lead span { color: var(--red); } .mistrz-copy { max-width: 950px; position: relative; z-index: 4; } .mistrz-copy p { margin: 0 0 18px; font-family: Arial, sans-serif; font-size: 17px; line-height: 1.75; font-weight: 700; color: #222222; } .mistrz-copy b { color: #000000; } .mistrz-info-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 28px; position: relative; z-index: 4; } .mistrz-info-box { position: relative; overflow: hidden; padding: 20px; border-radius: 16px; background: #ffffff; border: 2px solid rgba(255, 0, 0, 0.10); box-shadow: 0 10px 24px rgba(0,0,0,0.06); transform: translateZ(0); transition: transform 0.35s ease, box-shadow 0.35s ease; } .mistrz-info-box:hover { transform: translateY(-2px); box-shadow: 0 14px 28px rgba(0,0,0,0.10); } .mistrz-info-box::before { content: ""; position: absolute; top: 0; left: -90%; width: 55%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,0,0,0.06), transparent); animation: mistrzBoxMove 9s ease-in-out infinite; } .mistrz-info-label { margin-bottom: 8px; color: var(--red); font-size: 18px; line-height: 1; text-transform: uppercase; } .mistrz-info-value { font-family: Arial, sans-serif; font-size: 16px; line-height: 1.55; font-weight: 800; color: #111111; } .mistrz-price { font-size: 28px; font-family: 'Anton', sans-serif; color: #111111; font-weight: 400; } .mistrz-tags { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 24px; position: relative; z-index: 4; } .mistrz-tag { padding: 10px 14px; border-radius: 999px; background: #111111; color: #ffffff; font-size: 15px; letter-spacing: 0.4px; box-shadow: 0 8px 18px rgba(0,0,0,0.12); } .mistrz-tag.red { background: var(--red); color: #ffffff; } @keyframes mistrzFramePulse { 0%, 100% { opacity: 0.45; transform: scale(1); } 50% { opacity: 0.75; transform: scale(1.006); } } @keyframes mistrzRedGlow { 0% { opacity: 0.25; transform: translate3d(0, 0, 0) scale(1); } 100% { opacity: 0.45; transform: translate3d(-18px, 12px, 0) scale(1.08); } } @keyframes mistrzShine { 0% { transform: translateX(-130%); opacity: 0; } 42% { transform: translateX(-130%); opacity: 0; } 55% { opacity: 0.45; } 72% { transform: translateX(130%); opacity: 0; } 100% { transform: translateX(130%); opacity: 0; } } @keyframes mistrzBoxMove { 0% { left: -90%; opacity: 0; } 35% { opacity: 0; } 50% { opacity: 0.8; } 70% { left: 130%; opacity: 0; } 100% { left: 130%; opacity: 0; } } @media (max-width: 850px) { .mistrz-product-desc { padding: 10px; margin: 24px auto; } .mistrz-desc-inner { padding: 26px 20px; min-height: auto; } .mistrz-info-grid { grid-template-columns: 1fr; } .mistrz-copy p { font-size: 15.5px; line-height: 1.7; } .mistrz-top-label { font-size: 13px; } } ``` Produkt MISTRZ Wykrojnik dzwonkowy do styropianu i wełny Rób czyste zagłębienia pod kołki i zapomnij o efekcie biedronki na elewacji. Szybciej, równiej i bez dokupywania osobnych zaślepek. Jeżeli robisz ocieplenia i chcesz, żeby elewacja wyglądała równo, czysto i profesjonalnie, ten wykrojnik dzwonkowy bardzo szybko stanie się jednym z tych narzędzi, które po prostu warto mieć pod ręką. Został zaprojektowany do precyzyjnego wykonywania zagłębień pod talerzyki kołków montażowych, czyli łączników izolacji. Dzięki temu kołek nie odstaje, powierzchnia zostaje lepiej przygotowana pod kolejne warstwy, a cała praca idzie szybciej i czyściej. Największa przewaga tego wykrojnika to odzysk wyciętego krążka materiału. Narzędzie wycina otwór, a wyciągnięty krążek możesz później wykorzystać jako idealnie pasującą zaślepkę do zakrycia zamontowanego kołka. W praktyce oznacza to mniej odpadów, mniej kombinowania i lepszą ciągłość izolacji termicznej. Nie musisz dokupować osobnych zaślepek, bo wykorzystujesz materiał, który i tak został wycięty podczas pracy. Wykrojnik sprawdzi się zarówno przy styropianie EPS/XPS, jak i przy wełnie mineralnej. To dobry wybór dla ekip ociepleniowych, fachowców oraz osób, które chcą zrobić elewację dokładnie, a nie byle szybciej. Całość dostajesz w poręcznej, wytrzymałej walizce z tworzywa sztucznego, która ułatwia przechowywanie i chroni narzędzie podczas transportu oraz pracy na budowie. Cena 470 zł Zastosowanie Do wykonywania czystych zagłębień pod talerzyki kołków w styropianie EPS/XPS oraz wełnie mineralnej. Efekt Równa powierzchnia, mniejsze ryzyko mostków termicznych i brak odznaczających się kołków na elewacji. Odzysk krążka Pod styropian EPS/XPS Pod wełnę mineralną Bez efektu biedronki Walizka w zestawie ``` (function () { var canvas = document.getElementById('mistrzBloodCanvasWykrojnik'); var frame = document.getElementById('mistrzBloodFrameWykrojnik'); if (!canvas || !frame) return; var ctx = canvas.getContext('2d'); var width = 0; var height = 0; var dpr = window.devicePixelRatio || 1; var drops = []; var running = true; function resizeCanvas() { var rect = frame.getBoundingClientRect(); width = rect.width; height = rect.height; canvas.width = width * dpr; canvas.height = height * dpr; canvas.style.width = width + 'px'; canvas.style.height = height + 'px'; ctx.setTransform(dpr, 0, 0, dpr, 0, 0); createDrops(); } function createDrops() { drops = []; var count = Math.max(18, Math.floor((width + height) / 62)); for (var i = 0; i < count; i++) { drops.push({ t: Math.random(), speed: 0.00018 + Math.random() * 0.00032, size: 2 + Math.random() * 4, length: 18 + Math.random() * 38, alpha: 0.12 + Math.random() * 0.18 }); } } function getPointOnRect(t) { var pad = 9; var w = width - pad * 2; var h = height - pad * 2; var perimeter = 2 * (w + h); var p = (t % 1) * perimeter; if (p < w) return { x: pad + p, y: pad }; p -= w; if (p < h) return { x: pad + w, y: pad + p }; p -= h; if (p < w) return { x: pad + w - p, y: pad + h }; p -= w; return { x: pad, y: pad + h - p }; } function draw() { if (!running) return; ctx.clearRect(0, 0, width, height); ctx.lineWidth = 1.2; ctx.strokeStyle = 'rgba(255, 0, 0, 0.16)'; ctx.shadowColor = 'rgba(255, 0, 0, 0.25)'; ctx.shadowBlur = 8; roundRect(ctx, 8, 8, width - 16, height - 16, 20); ctx.stroke(); drops.forEach(function (drop) { drop.t += drop.speed; var p = getPointOnRect(drop.t); var back = getPointOnRect(drop.t - drop.length / (2 * (width + height))); var gradient = ctx.createLinearGradient(back.x, back.y, p.x, p.y); gradient.addColorStop(0, 'rgba(255, 0, 0, 0)'); gradient.addColorStop(0.55, 'rgba(255, 0, 0,' + drop.alpha + ')'); gradient.addColorStop(1, 'rgba(150, 0, 0,' + (drop.alpha + 0.08) + ')'); ctx.beginPath(); ctx.lineCap = 'round'; ctx.lineWidth = drop.size; ctx.strokeStyle = gradient; ctx.shadowColor = 'rgba(255, 0, 0, 0.28)'; ctx.shadowBlur = 9; ctx.moveTo(back.x, back.y); ctx.lineTo(p.x, p.y); ctx.stroke(); ctx.beginPath(); ctx.fillStyle = 'rgba(255, 0, 0,' + Math.min(0.42, drop.alpha + 0.12) + ')'; ctx.shadowColor = 'rgba(255, 0, 0, 0.35)'; ctx.shadowBlur = 8; ctx.arc(p.x, p.y, drop.size * 0.45, 0, Math.PI * 2); ctx.fill(); }); requestAnimationFrame(draw); } function roundRect(ctx, x, y, w, h, r) { ctx.beginPath(); ctx.moveTo(x + r, y); ctx.lineTo(x + w - r, y); ctx.quadraticCurveTo(x + w, y, x + w, y + r); ctx.lineTo(x + w, y + h - r); ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); ctx.lineTo(x + r, y + h); ctx.quadraticCurveTo(x, y + h, x, y + h - r); ctx.lineTo(x, y + r); ctx.quadraticCurveTo(x, y, x + r, y); ctx.closePath(); } frame.addEventListener('mousemove', function (e) { var rect = frame.getBoundingClientRect(); var x = (e.clientX - rect.left) / rect.width - 0.5; var y = (e.clientY - rect.top) / rect.height - 0.5; frame.style.transform = 'rotateX(' + (-y * 1.1).toFixed(2) + 'deg) rotateY(' + (x * 1.1).toFixed(2) + 'deg)'; }); frame.addEventListener('mouseleave', function () { frame.style.transform = 'rotateX(0deg) rotateY(0deg)'; }); if ('IntersectionObserver' in window) { var observer = new IntersectionObserver(function(entries) { entries.forEach(function(entry) { running = entry.isIntersecting; if (running) requestAnimationFrame(draw); }); }, { threshold: 0.1 }); observer.observe(frame); } window.addEventListener('resize', resizeCanvas); resizeCanvas(); requestAnimationFrame(draw); })();