diff --git a/public/images/partner/banner01.png b/public/images/partner/banner01.png new file mode 100644 index 0000000..b6d7d68 Binary files /dev/null and b/public/images/partner/banner01.png differ diff --git a/public/images/partner/banner02.png b/public/images/partner/banner02.png new file mode 100644 index 0000000..c7dc8bb Binary files /dev/null and b/public/images/partner/banner02.png differ diff --git a/public/images/partner/banner03.png b/public/images/partner/banner03.png new file mode 100644 index 0000000..02a98bb Binary files /dev/null and b/public/images/partner/banner03.png differ diff --git a/public/images/partner/banner04.png b/public/images/partner/banner04.png new file mode 100644 index 0000000..b6bf549 Binary files /dev/null and b/public/images/partner/banner04.png differ diff --git a/public/images/partner/banner05.png b/public/images/partner/banner05.png new file mode 100644 index 0000000..e83b1d6 Binary files /dev/null and b/public/images/partner/banner05.png differ diff --git a/public/images/partner/banner06.png b/public/images/partner/banner06.png new file mode 100644 index 0000000..8273629 Binary files /dev/null and b/public/images/partner/banner06.png differ diff --git a/public/images/partner/banner07.png b/public/images/partner/banner07.png new file mode 100644 index 0000000..1c8b1b1 Binary files /dev/null and b/public/images/partner/banner07.png differ diff --git a/public/images/partner/banner08.png b/public/images/partner/banner08.png new file mode 100644 index 0000000..ec81593 Binary files /dev/null and b/public/images/partner/banner08.png differ diff --git a/public/images/partner/banner09.png b/public/images/partner/banner09.png new file mode 100644 index 0000000..47594be Binary files /dev/null and b/public/images/partner/banner09.png differ diff --git a/public/images/partner/banner10.png b/public/images/partner/banner10.png new file mode 100644 index 0000000..4e772a4 Binary files /dev/null and b/public/images/partner/banner10.png differ diff --git a/public/images/partner/banner11.png b/public/images/partner/banner11.png new file mode 100644 index 0000000..7dc0cd5 Binary files /dev/null and b/public/images/partner/banner11.png differ diff --git a/public/images/partner/banner12.png b/public/images/partner/banner12.png new file mode 100644 index 0000000..219f022 Binary files /dev/null and b/public/images/partner/banner12.png differ diff --git a/public/images/partner/banner13.png b/public/images/partner/banner13.png new file mode 100644 index 0000000..f80f7de Binary files /dev/null and b/public/images/partner/banner13.png differ diff --git a/public/images/partner/banner14.png b/public/images/partner/banner14.png new file mode 100644 index 0000000..5b8ae7f Binary files /dev/null and b/public/images/partner/banner14.png differ diff --git a/public/images/partner/banner15.png b/public/images/partner/banner15.png new file mode 100644 index 0000000..dd44b28 Binary files /dev/null and b/public/images/partner/banner15.png differ diff --git a/public/images/partner/banner16.png b/public/images/partner/banner16.png new file mode 100644 index 0000000..6dae46a Binary files /dev/null and b/public/images/partner/banner16.png differ diff --git a/public/images/partner/banner18.png b/public/images/partner/banner18.png new file mode 100644 index 0000000..e31db2e Binary files /dev/null and b/public/images/partner/banner18.png differ diff --git a/public/images/partner/banner19.png b/public/images/partner/banner19.png new file mode 100644 index 0000000..5e10756 Binary files /dev/null and b/public/images/partner/banner19.png differ diff --git a/public/images/partner/banner20.png b/public/images/partner/banner20.png new file mode 100644 index 0000000..cb9aefe Binary files /dev/null and b/public/images/partner/banner20.png differ diff --git a/public/images/partner/banner21.png b/public/images/partner/banner21.png new file mode 100644 index 0000000..6c8dd7c Binary files /dev/null and b/public/images/partner/banner21.png differ diff --git a/public/images/partner/banner22.png b/public/images/partner/banner22.png new file mode 100644 index 0000000..07566a4 Binary files /dev/null and b/public/images/partner/banner22.png differ diff --git a/public/images/partner/banner23.png b/public/images/partner/banner23.png new file mode 100644 index 0000000..44f948b Binary files /dev/null and b/public/images/partner/banner23.png differ diff --git a/public/images/partner/banner24.png b/public/images/partner/banner24.png new file mode 100644 index 0000000..990f24a Binary files /dev/null and b/public/images/partner/banner24.png differ diff --git a/src/components/MeshWaveBg.jsx b/src/components/MeshWaveBg.jsx new file mode 100644 index 0000000..24c7cb0 --- /dev/null +++ b/src/components/MeshWaveBg.jsx @@ -0,0 +1,145 @@ +import { useEffect, useRef } from "react"; + +export default function MeshWaveBg() { + const canvasRef = useRef(null); + + useEffect(() => { + const canvas = canvasRef.current; + const ctx = canvas.getContext("2d"); + let raf; + let t = 0; + + const COLS = 18; + const ROWS = 10; + const COLORS = ["#d94889", "#7b3fa0", "#593a84", "#198dc7", "#1a1f5e"]; + + function resize() { + canvas.width = canvas.offsetWidth; + canvas.height = canvas.offsetHeight; + } + + function getPoint(col, row, w, h) { + const cellW = w / (COLS - 1); + const cellH = h / (ROWS - 1); + const baseX = col * cellW; + const baseY = row * cellH; + + const waveX = + Math.sin(t * 0.6 + row * 0.7 + col * 0.3) * cellW * 0.28 + + Math.sin(t * 0.3 + col * 0.5) * cellW * 0.12; + const waveY = + Math.sin(t * 0.5 + col * 0.6 + row * 0.4) * cellH * 0.38 + + Math.cos(t * 0.4 + row * 0.5) * cellH * 0.14; + + return { x: baseX + waveX, y: baseY + waveY }; + } + + function draw() { + const w = canvas.width; + const h = canvas.height; + ctx.clearRect(0, 0, w, h); + + t += 0.008; + + const pts = []; + for (let r = 0; r < ROWS; r++) { + pts[r] = []; + for (let c = 0; c < COLS; c++) { + pts[r][c] = getPoint(c, r, w, h); + } + } + + // 메시 선 + for (let r = 0; r < ROWS; r++) { + for (let c = 0; c < COLS; c++) { + const p = pts[r][c]; + const colorIdx = (r * COLS + c) % COLORS.length; + const alpha = 0.06 + ((Math.sin(t + r + c) + 1) / 2) * 0.07; + + // 가로 선 + if (c < COLS - 1) { + const p2 = pts[r][c + 1]; + const grad = ctx.createLinearGradient(p.x, p.y, p2.x, p2.y); + grad.addColorStop(0, COLORS[colorIdx] + toHex(alpha)); + grad.addColorStop( + 1, + COLORS[(colorIdx + 1) % COLORS.length] + toHex(alpha), + ); + ctx.beginPath(); + ctx.moveTo(p.x, p.y); + ctx.lineTo(p2.x, p2.y); + ctx.strokeStyle = grad; + ctx.lineWidth = 0.7; + ctx.stroke(); + } + // 세로 선 + if (r < ROWS - 1) { + const p2 = pts[r + 1][c]; + const grad = ctx.createLinearGradient(p.x, p.y, p2.x, p2.y); + grad.addColorStop(0, COLORS[colorIdx] + toHex(alpha)); + grad.addColorStop( + 1, + COLORS[(colorIdx + 2) % COLORS.length] + toHex(alpha), + ); + ctx.beginPath(); + ctx.moveTo(p.x, p.y); + ctx.lineTo(p2.x, p2.y); + ctx.strokeStyle = grad; + ctx.lineWidth = 0.7; + ctx.stroke(); + } + // 대각선 + if (c < COLS - 1 && r < ROWS - 1) { + const p2 = pts[r + 1][c + 1]; + ctx.beginPath(); + ctx.moveTo(p.x, p.y); + ctx.lineTo(p2.x, p2.y); + ctx.strokeStyle = COLORS[colorIdx] + toHex(alpha * 0.5); + ctx.lineWidth = 0.4; + ctx.stroke(); + } + + // 교차점 노드 + const nodeAlpha = + 0.12 + ((Math.sin(t * 1.2 + r * 1.3 + c * 0.9) + 1) / 2) * 0.18; + ctx.beginPath(); + ctx.arc(p.x, p.y, 1.2, 0, Math.PI * 2); + ctx.fillStyle = COLORS[colorIdx] + toHex(nodeAlpha); + ctx.fill(); + } + } + + raf = requestAnimationFrame(draw); + } + + function toHex(alpha) { + return Math.round(Math.min(1, Math.max(0, alpha)) * 255) + .toString(16) + .padStart(2, "0"); + } + + resize(); + draw(); + + const ro = new ResizeObserver(resize); + ro.observe(canvas); + + return () => { + cancelAnimationFrame(raf); + ro.disconnect(); + }; + }, []); + + return ( + + ); +} diff --git a/src/components/SubHero.jsx b/src/components/SubHero.jsx index ea271fe..955c3c2 100644 --- a/src/components/SubHero.jsx +++ b/src/components/SubHero.jsx @@ -105,7 +105,8 @@ function NetworkGlobe() { const d = Math.sqrt(dx * dx + dy * dy + dz * dz); if (d < 0.55) { const depth = (a.sz + b.sz) * 0.5; - const alpha = Math.max(0, 0.05 + (depth + 1) * 0.1) * (1 - d / 0.55); + const alpha = + Math.max(0, 0.05 + (depth + 1) * 0.1) * (1 - d / 0.55); const aHex = Math.round(Math.min(255, alpha * 255)) .toString(16) .padStart(2, "0"); @@ -134,7 +135,14 @@ function NetworkGlobe() { .toString(16) .padStart(2, "0"); - const glow = ctx.createRadialGradient(n.sx, n.sy, 0, n.sx, n.sy, r * 3.5); + const glow = ctx.createRadialGradient( + n.sx, + n.sy, + 0, + n.sx, + n.sy, + r * 3.5, + ); glow.addColorStop(0, n.color + gHex); glow.addColorStop(1, n.color + "00"); ctx.beginPath(); @@ -172,7 +180,12 @@ function NetworkGlobe() { function TitleLine({ children, delay }) { return ( - + {children} @@ -202,7 +215,9 @@ export default function SubHero({ title, desc, navItems, rightSlot }) { )) : // JSX:
로 나뉜 형태 → 직접 TitleLine 배열로 변환 (() => { - const children = Array.isArray(title.props?.children) ? title.props.children : [title]; + const children = Array.isArray(title.props?.children) + ? title.props.children + : [title]; const lines = []; let current = []; children.forEach((child, i) => { @@ -228,7 +243,12 @@ export default function SubHero({ title, desc, navItems, rightSlot }) {
- + {menuMap["/" + pathname.split("/")[1]]?.label}

{titleContent}

@@ -239,7 +259,11 @@ export default function SubHero({ title, desc, navItems, rightSlot }) { animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.6, - delay: 0.1 + (typeof title === "string" ? title.split("\n").length : 2) * 0.1 + 0.15, + delay: + 0.1 + + (typeof title === "string" ? title.split("\n").length : 2) * + 0.1 + + 0.15, ease: [0.16, 1, 0.3, 1], }} > @@ -249,7 +273,12 @@ export default function SubHero({ title, desc, navItems, rightSlot }) {
{rightSlot && ( - + {rightSlot} )} @@ -257,10 +286,18 @@ export default function SubHero({ title, desc, navItems, rightSlot }) {
{navItems?.length > 1 && ( -