From 21772ae6cb119b2bdb452fd7fb30dd500fcde419 Mon Sep 17 00:00:00 2001 From: Timothy Pidashev Date: Mon, 6 Jan 2025 11:55:34 -0800 Subject: [PATCH] Add preliminary vines animation; more work on content --- src/public/projects/darkbox/thumbnail.jpeg | Bin 0 -> 1765 bytes .../projects/discord-bot/thumbnail.jpeg | Bin 0 -> 43037 bytes src/public/projects/web/thumbnail.jpeg | Bin 0 -> 32701 bytes src/src/components/header/index.tsx | 2 +- src/src/components/vines/index.tsx | 292 ++++++++++++++++++ src/src/content/projects/discord-bot.mdx | 2 +- src/src/layouts/index.astro | 3 + src/tailwind.config.cjs | 137 ++++---- 8 files changed, 370 insertions(+), 66 deletions(-) create mode 100644 src/public/projects/darkbox/thumbnail.jpeg create mode 100644 src/public/projects/discord-bot/thumbnail.jpeg create mode 100644 src/public/projects/web/thumbnail.jpeg create mode 100644 src/src/components/vines/index.tsx diff --git a/src/public/projects/darkbox/thumbnail.jpeg b/src/public/projects/darkbox/thumbnail.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5f769c208c4a18750b23a45b852b40df96e5a104 GIT binary patch literal 1765 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
diff --git a/src/src/components/vines/index.tsx b/src/src/components/vines/index.tsx new file mode 100644 index 0000000..09d9869 --- /dev/null +++ b/src/src/components/vines/index.tsx @@ -0,0 +1,292 @@ +import React, { useState, useEffect, useCallback } from 'react'; + +const VineAnimation = ({ side }) => { + const [vines, setVines] = useState([]); + const VINE_COLOR = '#b8bb26'; // Gruvbox green + const VINE_LIFETIME = 8000; // Time before fade starts + const FADE_DURATION = 3000; // How long the fade takes + const MAX_VINES = Math.max(3, Math.floor(window.innerWidth / 400)); // Adjust to screen width + const isMobile = window.innerWidth <= 768; + + const getDistance = (pointA, pointB) => { + return Math.sqrt( + Math.pow(pointA.x - pointB.x, 2) + Math.pow(pointA.y - pointB.y, 2) + ); + }; + + // Function to create a new branch + const createBranch = (startX, startY, baseRotation) => ({ + id: Date.now() + Math.random(), + points: [{ + x: startX, + y: startY, + rotation: baseRotation + }], + leaves: [], + growing: true, + phase: Math.random() * Math.PI * 2, + amplitude: Math.random() * 0.5 + 1.2 + }); + + // Function to create a new vine + const createNewVine = useCallback(() => ({ + id: Date.now() + Math.random(), + mainBranch: createBranch( + side === 'left' ? 0 : window.innerWidth, + Math.random() * (window.innerHeight * 0.8) + (window.innerHeight * 0.1), + side === 'left' ? 0 : Math.PI + ), + subBranches: [], + growing: true, + createdAt: Date.now(), + fadingOut: false, + opacity: 1 + }), [side]); + + // Update branch function + const updateBranch = (branch, isSubBranch = false) => { + if (!branch.growing) return branch; + + const lastPoint = branch.points[branch.points.length - 1]; + const progress = branch.points.length * 0.15; + + const safetyMargin = window.innerWidth * 0.2; + const minX = safetyMargin; + const maxX = window.innerWidth - safetyMargin; + + const baseAngle = side === 'left' ? 0 : Math.PI; + let curve = Math.sin(progress + branch.phase) * branch.amplitude; + + const distanceFromCenter = Math.abs(window.innerWidth/2 - lastPoint.x); + const centerRepulsion = Math.max(0, 1 - (distanceFromCenter / (window.innerWidth/4))); + curve += (side === 'left' ? -1 : 1) * centerRepulsion * 0.5; + + if (side === 'left' && lastPoint.x > minX) { + curve -= Math.pow((lastPoint.x - minX) / safetyMargin, 2); + } else if (side === 'right' && lastPoint.x < maxX) { + curve += Math.pow((maxX - lastPoint.x) / safetyMargin, 2); + } + + const currentAngle = baseAngle + curve; + const distance = isSubBranch ? 12 : 18; + const newX = lastPoint.x + Math.cos(currentAngle) * distance; + const newY = lastPoint.y + Math.sin(currentAngle) * distance; + + const newPoint = { + x: newX, + y: newY, + rotation: currentAngle + }; + + let newLeaves = [...branch.leaves]; + if (Math.random() < 0.2 && branch.points.length > 2) { + const maxLength = isSubBranch ? 15 : 30; + const progress = branch.points.length / maxLength; + const baseSize = isSubBranch ? 20 : 35; + const sizeGradient = Math.pow(1 - progress, 2); + const leafSize = Math.max(8, baseSize * sizeGradient); + + // Ensure leaves don't grow on the last point + const leafPosition = Math.min(branch.points.length - 2, Math.floor(Math.random() * branch.points.length)); + + newLeaves.push({ + position: leafPosition, // Use the selected point + size: leafSize, + side: Math.random() > 0.5 ? 'left' : 'right' + }); + } + + return { + ...branch, + points: [...branch.points, newPoint], + leaves: newLeaves, + growing: branch.points.length < (isSubBranch ? 15 : 30) + }; + }; + + // Update vine function + const updateVine = useCallback((vine) => { + const now = Date.now(); + const age = now - vine.createdAt; + + // Calculate opacity based on age + let newOpacity = vine.opacity; + if (age > VINE_LIFETIME) { + const fadeProgress = (age - VINE_LIFETIME) / FADE_DURATION; + newOpacity = Math.max(0, 1 - fadeProgress); + } + + // Update main branch + const newMainBranch = updateBranch(vine.mainBranch); + let newSubBranches = [...vine.subBranches]; + + // Add new branches with random probability + if ( + !vine.fadingOut && + age < VINE_LIFETIME && + Math.random() < 0.05 && + newMainBranch.points.length > 4 + ) { + // Choose a random point, excluding the last point + const allBranches = [newMainBranch, ...newSubBranches]; + const sourceBranch = allBranches[Math.floor(Math.random() * allBranches.length)]; + + const branchPointIndex = Math.floor(Math.random() * (sourceBranch.points.length - 1)); // Exclude the last point + const branchPoint = sourceBranch.points[branchPointIndex]; + + const rotationOffset = Math.random() * 0.8 - 0.4; + newSubBranches.push( + createBranch( + branchPoint.x, + branchPoint.y, + branchPoint.rotation + rotationOffset + ) + ); + } + + // Update existing branches + newSubBranches = newSubBranches.map(branch => updateBranch(branch, true)); + + return { + ...vine, + mainBranch: newMainBranch, + subBranches: newSubBranches, + growing: newMainBranch.growing || newSubBranches.some(b => b.growing), + opacity: newOpacity, + fadingOut: age > VINE_LIFETIME + }; + }, [side]); + + // Render functions for leaves and branches + const renderLeaf = (point, size, leafSide, parentOpacity = 1) => { + const sideMultiplier = leafSide === 'left' ? -1 : 1; + const angle = point.rotation + (Math.PI / 3) * sideMultiplier; + + const tipX = point.x + Math.cos(angle) * size * 2; + const tipY = point.y + Math.sin(angle) * size * 2; + + const ctrl1X = point.x + Math.cos(angle - Math.PI/8) * size * 1.8; + const ctrl1Y = point.y + Math.sin(angle - Math.PI/8) * size * 1.8; + + const ctrl2X = point.x + Math.cos(angle + Math.PI/8) * size * 1.8; + const ctrl2Y = point.y + Math.sin(angle + Math.PI/8) * size * 1.8; + + const baseCtrl1X = point.x + Math.cos(angle - Math.PI/4) * size * 0.5; + const baseCtrl1Y = point.y + Math.sin(angle - Math.PI/4) * size * 0.5; + + const baseCtrl2X = point.x + Math.cos(angle + Math.PI/4) * size * 0.5; + const baseCtrl2Y = point.y + Math.sin(angle + Math.PI/4) * size * 0.5; + + return ( + + ); + }; + + const renderBranch = (branch, parentOpacity = 1) => { + if (branch.points.length < 2) return null; + + const points = branch.points; + + const getStrokeWidth = (index) => { + const maxWidth = 5; + const progress = index / (points.length - 1); + const startTaper = Math.min(1, index / 3); + const endTaper = Math.pow(1 - progress, 1.5); + return maxWidth * startTaper * endTaper; + }; + + return ( + + {points.map((point, i) => { + if (i === 0) return null; + const prev = points[i - 1]; + const dx = point.x - prev.x; + const dy = point.y - prev.y; + const controlX = prev.x + dx * 0.7; + const controlY = prev.y + dy * 0.7; + + return ( + + ); + })} + {branch.leaves.map((leaf, i) => { + const point = points[Math.floor(leaf.position)]; + if (!point) return null; + return ( + + {renderLeaf(point, leaf.size, leaf.side, parentOpacity)} + + ); + })} + + ); + }; + + // Animation loop effect + useEffect(() => { + if (isMobile) return; + + // Initialize with staggered vines + if (vines.length === 0) { + setVines([ + createNewVine(), + { ...createNewVine(), createdAt: Date.now() - 2000 }, + { ...createNewVine(), createdAt: Date.now() - 4000 } + ]); + } + + const interval = setInterval(() => { + setVines(currentVines => { + // Update all vines + const updatedVines = currentVines + .map(vine => updateVine(vine)) + .filter(vine => vine.opacity > 0.01); + + // Add new vines to maintain constant activity + if (updatedVines.length < 3) { + return [...updatedVines, createNewVine()]; + } + + return updatedVines; + }); + }, 40); + + return () => clearInterval(interval); + }, [createNewVine, updateVine]); + + return ( +
+ + {vines.map(vine => ( + + {renderBranch(vine.mainBranch, vine.opacity)} + {vine.subBranches.map(branch => renderBranch(branch, vine.opacity))} + + ))} + +
+ ); +}; + +export default VineAnimation; diff --git a/src/src/content/projects/discord-bot.mdx b/src/src/content/projects/discord-bot.mdx index 9a13cec..5abca16 100644 --- a/src/src/content/projects/discord-bot.mdx +++ b/src/src/content/projects/discord-bot.mdx @@ -4,5 +4,5 @@ description: "A discord bot template" githubUrl: "https://github.com/timmypidashev/pycord-bot-template" techStack: ["Python", "SQlite", "Docker"] date: "2025-01-03" -image: "/projects/web/thumbnail.jpeg" +image: "/projects/discord-bot/thumbnail.jpeg" --- diff --git a/src/src/layouts/index.astro b/src/src/layouts/index.astro index d44e545..838a1b4 100644 --- a/src/src/layouts/index.astro +++ b/src/src/layouts/index.astro @@ -5,6 +5,7 @@ import "@/style/globals.css"; import Header from "@/components/header"; import Footer from "@/components/footer"; +import VineAnimation from "@/components/vines"; --- @@ -16,6 +17,8 @@ import Footer from "@/components/footer";
+ +
diff --git a/src/tailwind.config.cjs b/src/tailwind.config.cjs index 0152480..bea890b 100644 --- a/src/tailwind.config.cjs +++ b/src/tailwind.config.cjs @@ -34,146 +34,155 @@ module.exports = { bright: "#8ec07c" } }, + keyframes: { + "draw-line": { + "0%": { "stroke-dashoffset": "100" }, + "100%": { "stroke-dashoffset": "0" } + } + }, + animation: { + "draw-line": "draw-line 0.6s ease-out forwards" + }, typography: (theme) => ({ DEFAULT: { css: { - color: theme('colors.foreground'), - '--tw-prose-body': theme('colors.foreground'), - '--tw-prose-headings': theme('colors.yellow.bright'), - '--tw-prose-links': theme('colors.blue.bright'), - '--tw-prose-bold': theme('colors.orange.bright'), - '--tw-prose-quotes': theme('colors.green.bright'), - '--tw-prose-code': theme('colors.purple.bright'), - '--tw-prose-hr': theme('colors.foreground'), - '--tw-prose-bullets': theme('colors.foreground'), + color: theme("colors.foreground"), + "--tw-prose-body": theme("colors.foreground"), + "--tw-prose-headings": theme("colors.yellow.bright"), + "--tw-prose-links": theme("colors.blue.bright"), + "--tw-prose-bold": theme("colors.orange.bright"), + "--tw-prose-quotes": theme("colors.green.bright"), + "--tw-prose-code": theme("colors.purple.bright"), + "--tw-prose-hr": theme("colors.foreground"), + "--tw-prose-bullets": theme("colors.foreground"), // Base text color - color: theme('colors.foreground'), + color: theme("colors.foreground"), // Headings h1: { - color: theme('colors.yellow.bright'), - fontWeight: '700', + color: theme("colors.yellow.bright"), + fontWeight: "700", }, h2: { - color: theme('colors.yellow.bright'), - fontWeight: '600', + color: theme("colors.yellow.bright"), + fontWeight: "600", }, h3: { - color: theme('colors.yellow.bright'), - fontWeight: '600', + color: theme("colors.yellow.bright"), + fontWeight: "600", }, h4: { - color: theme('colors.yellow.bright'), - fontWeight: '600', + color: theme("colors.yellow.bright"), + fontWeight: "600", }, // Links a: { - color: theme('colors.blue.bright'), - '&:hover': { - color: theme('colors.blue.DEFAULT'), + color: theme("colors.blue.bright"), + "&:hover": { + color: theme("colors.blue.DEFAULT"), }, - textDecoration: 'none', - borderBottom: `1px solid ${theme('colors.blue.bright')}`, - transition: 'all 0.2s ease-in-out', + textDecoration: "none", + borderBottom: `1px solid ${theme("colors.blue.bright")}`, + transition: "all 0.2s ease-in-out", }, // Bold strong: { - color: theme('colors.orange.bright'), - fontWeight: '600', + color: theme("colors.orange.bright"), + fontWeight: "600", }, // Lists ul: { li: { - '&::before': { - backgroundColor: theme('colors.foreground'), + "&::before": { + backgroundColor: theme("colors.foreground"), }, }, }, // Blockquotes blockquote: { - borderLeftColor: theme('colors.green.bright'), - color: theme('colors.green.bright'), - fontStyle: 'italic', - quotes: '"\\201C""\\201D""\\2018""\\2019"', + borderLeftColor: theme("colors.green.bright"), + color: theme("colors.green.bright"), + fontStyle: "italic", + quotes: "\"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\"", p: { - '&::before': { content: 'none' }, - '&::after': { content: 'none' }, + "&::before": { content: "none" }, + "&::after": { content: "none" }, }, }, // Code code: { - color: theme('colors.purple.bright'), - backgroundColor: '#282828', // A dark gray that works with black - padding: '0.2em 0.4em', - borderRadius: '0.25rem', - fontWeight: '400', - '&::before': { - content: '""', + color: theme("colors.purple.bright"), + backgroundColor: "#282828", // A dark gray that works with black + padding: "0.2em 0.4em", + borderRadius: "0.25rem", + fontWeight: "400", + "&::before": { + content: "\"\"", }, - '&::after': { - content: '""', + "&::after": { + content: "\"\"", }, }, // Inline code - 'code::before': { - content: '""', + "code::before": { + content: "\"\"", }, - 'code::after': { - content: '""', + "code::after": { + content: "\"\"", }, // Pre pre: { - backgroundColor: '#282828', - color: theme('colors.foreground'), + backgroundColor: "#282828", + color: theme("colors.foreground"), code: { - backgroundColor: 'transparent', - padding: '0', - color: 'inherit', - fontSize: 'inherit', - fontWeight: 'inherit', - '&::before': { content: 'none' }, - '&::after': { content: 'none' }, + backgroundColor: "transparent", + padding: "0", + color: "inherit", + fontSize: "inherit", + fontWeight: "inherit", + "&::before": { content: "none" }, + "&::after": { content: "none" }, }, }, // Horizontal rules hr: { - borderColor: theme('colors.foreground'), - opacity: '0.2', + borderColor: theme("colors.foreground"), + opacity: "0.2", }, // Table table: { thead: { - borderBottomColor: theme('colors.foreground'), + borderBottomColor: theme("colors.foreground"), th: { - color: theme('colors.yellow.bright'), + color: theme("colors.yellow.bright"), }, }, tbody: { tr: { - borderBottomColor: theme('colors.foreground'), + borderBottomColor: theme("colors.foreground"), }, }, }, // Images img: { - borderRadius: '0.375rem', + borderRadius: "0.375rem", }, // Figures figcaption: { - color: theme('colors.foreground'), - opacity: '0.8', + color: theme("colors.foreground"), + opacity: "0.8", }, }, },