# portfolio_scaffold.py # Run this script to generate a clean, modern, dark-mode developer portfolio # using React + Tailwind (files are written as .tsx/.ts/.css from Python) import os from pathlib import Path BASE = Path("src") COMP = BASE / "components" HOOKS = BASE / "hooks" PAGES = BASE / "pages" paths = [BASE, COMP, HOOKS, PAGES] for p in paths: p.mkdir(parents=True, exist_ok=True) files = { "tailwind.config.ts": """ import type { Config } from "tailwindcss" export default { darkMode: "class", content: ["./src/**/*.{ts,tsx}"], theme: { extend: { colors: { bg: "#05060a", panel: "rgba(15,18,32,0.65)", blueGlow: "#3b82f6" }, fontFamily: { inter: ["Inter", "sans-serif"] }, keyframes: { float: { "0%,100%": { transform: "translateY(0px)" }, "50%": { transform: "translateY(-12px)" } } }, animation: { float: "float 6s ease-in-out infinite" } } }, plugins: [] } satisfies Config """, "src/index.css": """ @tailwind base; @tailwind components; @tailwind utilities; html, body { background: #05060a; color: #e5e7eb; font-family: Inter, sans-serif; } .glass { background: rgba(15,18,32,0.65); backdrop-filter: blur(14px); border: 1px solid rgba(255,255,255,0.06); } """, "src/pages/Index.tsx": """ import HeroSection from "../components/HeroSection" import AboutSection from "../components/AboutSection" import SkillsSection from "../components/SkillsSection" import Footer from "../components/Footer" export default function Index() { return (
) } """, "src/components/HeroSection.tsx": """ export default function HeroSection() { return (

Shamar Pryce

Discord Bot Developer · Website Developer · Graphics Designer
Aspiring to become the world’s greatest coder

) } """, "src/components/AboutSection.tsx": """ export default function AboutSection() { return (

About Me

I’m a Python-focused developer with a strong emphasis on Discord bot development. I also build websites and design graphics, constantly pushing myself to improve and grow long-term in tech.

) } """, "src/components/SkillsSection.tsx": """ const skills = [ { name: "Discord Bot Development", value: 95 }, { name: "Website Development", value: 50 }, { name: "Graphic Design", value: 90 } ] export default function SkillsSection() { return (

Skills

{skills.map(skill => (
{skill.name} {skill.value}%
))}
) } """, "src/components/Footer.tsx": """ export default function Footer() { return ( ) } """, "src/hooks/useInView.ts": """ import { useEffect, useRef, useState } from "react" export function useInView() { const ref = useRef(null) const [visible, setVisible] = useState(false) useEffect(() => { const obs = new IntersectionObserver( ([entry]) => setVisible(entry.isIntersecting), { threshold: 0.2 } ) if (ref.current) obs.observe(ref.current) return () => obs.disconnect() }, []) return { ref, visible } } """ } for path, content in files.items(): p = Path(path) p.parent.mkdir(parents=True, exist_ok=True) p.write_text(content.strip()) print("Portfolio scaffold generated successfully.")