import zipfile

project_files = {
    "gaurify-os/package.json": """{
  "name": "gaurify-os",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "react": "^19.0.0",
    "react-dom": "^19.0.0",
    "next": "^15.0.0",
    "framer-motion": "^11.11.0",
    "lucide-react": "^0.453.0",
    "clsx": "^2.1.1",
    "tailwind-merge": "^2.5.4"
  },
  "devDependencies": {
    "typescript": "^5",
    "@types/node": "^20",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "tailwindcss": "^4.0.0",
    "@tailwindcss/postcss": "^4.0.0",
    "postcss": "^8"
  }
}""",

    "gaurify-os/tsconfig.json": """{
  "compilerOptions": {
    "target": "ES2017",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "plugins": [{ "name": "next" }],
    "paths": { "@/*": ["./*"] }
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
  "exclude": ["node_modules"]
}""",

    "gaurify-os/next.config.ts": """import type { NextConfig } from 'next';
const nextConfig: NextConfig = {};
export default nextConfig;""",

    "gaurify-os/postcss.config.mjs": """export default {
  plugins: {
    "@tailwindcss/postcss": {},
  },
};""",

    "gaurify-os/lib/utils.ts": """import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}""",

    "gaurify-os/app/globals.css": """@import "tailwindcss";

@theme {
  --color-lime-400: #a3e635;
  --color-lime-500: #84cc16;
}

:root {
  --background: #000000;
  --foreground: #ffffff;
}

body {
  background-color: var(--background);
  color: var(--foreground);
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.film-grain {
  pointer-events: none;
  position: fixed;
  inset: 0;
  z-index: 50;
  opacity: 0.05;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");
}

.vignette {
  pointer-events: none;
  position: fixed;
  inset: 0;
  z-index: 40;
  background: radial-gradient(circle at center, transparent 30%, rgba(0,0,0,0.85) 100%);
}""",

    "gaurify-os/app/layout.tsx": """import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
  title: "Gaurify OS | Modern Content Production",
  description: "Built for creators, production teams and growing brands. Currently under active development.",
};

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en" className="dark">
      <body className={`${inter.className} bg-black text-white selection:bg-lime-500/30 selection:text-lime-200`}>
        <div className="film-grain" />
        <div className="vignette" />
        {children}
      </body>
    </html>
  );
}""",

    "gaurify-os/app/page.tsx": """"use client";

import { useState, useEffect } from "react";
import { AnimatePresence } from "framer-motion";
import LoadingScreen from "@/components/LoadingScreen";
import Hero from "@/components/Hero";
import Modal from "@/components/Modal";
import MouseGlow from "@/components/MouseGlow";
import Particles from "@/components/Particles";

export default function Home() {
  const [isLoading, setIsLoading] = useState(true);
  const [isModalOpen, setIsModalOpen] = useState(false);

  useEffect(() => {
    const timer = setTimeout(() => setIsLoading(false), 2400);
    return () => clearTimeout(timer);
  }, []);

  return (
    <main className="relative min-h-screen bg-black flex flex-col items-center justify-center overflow-hidden">
      {/* Soft upper-left ambient lime light */}
      <div className="absolute top-0 left-0 w-[800px] h-[800px] bg-lime-500/5 blur-[120px] rounded-full -translate-y-1/2 -translate-x-1/3 pointer-events-none" />
      
      <MouseGlow />
      <Particles />

      <AnimatePresence mode="wait">
        {isLoading ? (
          <LoadingScreen key="loading" />
        ) : (
          <Hero key="hero" onOpenModal={() => setIsModalOpen(true)} />
        )}
      </AnimatePresence>

      <AnimatePresence>
        {isModalOpen && <Modal onClose={() => setIsModalOpen(false)} />}
      </AnimatePresence>
    </main>
  );
}""",

    "gaurify-os/components/LoadingScreen.tsx": """"use client";
import { motion } from "framer-motion";

export default function LoadingScreen() {
  return (
    <motion.div
      initial={{ opacity: 1 }}
      exit={{ opacity: 0, filter: "blur(10px)" }}
      transition={{ duration: 0.8, ease: [0.16, 1, 0.3, 1] }}
      className="fixed inset-0 z-50 flex items-center justify-center bg-black"
    >
      <motion.div
        initial={{ opacity: 0, scale: 0.95, filter: "blur(8px)" }}
        animate={{ opacity: 1, scale: 1, filter: "blur(0px)" }}
        transition={{ duration: 1.2, ease: "easeOut" }}
        className="relative overflow-hidden px-4 py-2"
      >
        <div className="text-4xl md:text-5xl font-bold tracking-tighter text-white">
          Gaurify <span className="text-lime-400">OS</span>
        </div>
        
        {/* Glow Sweep */}
        <motion.div
          initial={{ left: "-100%" }}
          animate={{ left: "200%" }}
          transition={{ duration: 1.5, ease: "easeInOut", delay: 0.3 }}
          className="absolute top-0 bottom-0 w-[150%] bg-gradient-to-r from-transparent via-white/20 to-transparent skew-x-[-20deg]"
        />
      </motion.div>
    </motion.div>
  );
}""",

    "gaurify-os/components/Hero.tsx": """"use client";
import { motion } from "framer-motion";

interface HeroProps {
  onOpenModal: () => void;
}

export default function Hero({ onOpenModal }: HeroProps) {
  return (
    <motion.div
      initial={{ opacity: 0, y: 15, filter: "blur(12px)" }}
      animate={{ opacity: 1, y: 0, filter: "blur(0px)" }}
      transition={{ duration: 1.2, ease: [0.16, 1, 0.3, 1] }}
      className="relative z-10 flex flex-col items-center text-center px-6 w-full max-w-5xl mx-auto"
    >
      <motion.div 
        initial={{ opacity: 0, scale: 0.96 }}
        animate={{ opacity: 1, scale: 1 }}
        transition={{ delay: 0.1, duration: 1, ease: "easeOut" }}
        className="mb-10"
      >
        <h1 className="text-7xl md:text-9xl font-bold tracking-tighter text-white drop-shadow-2xl">
          Gaurify <span className="text-lime-400 tracking-widest">OS</span>
        </h1>
      </motion.div>

      <motion.h2
        initial={{ opacity: 0, y: 10 }}
        animate={{ opacity: 1, y: 0 }}
        transition={{ delay: 0.3, duration: 0.8, ease: "easeOut" }}
        className="text-2xl md:text-4xl font-medium tracking-tight text-neutral-200 mb-6"
      >
        The operating system for modern content production.
      </motion.h2>

      <motion.p
        initial={{ opacity: 0 }}
        animate={{ opacity: 1 }}
        transition={{ delay: 0.5, duration: 0.8 }}
        className="text-lg md:text-xl text-neutral-400 mb-14 max-w-2xl font-light"
      >
        Built for creators, production teams and growing brands. <br className="hidden md:block" />
        Currently under active development.
      </motion.p>

      <motion.div
        initial={{ opacity: 0, y: 10 }}
        animate={{ opacity: 1, y: 0 }}
        transition={{ delay: 0.7, duration: 0.8 }}
        className="flex flex-col sm:flex-row gap-5 w-full sm:w-auto"
      >
        <button
          onClick={onOpenModal}
          className="px-10 py-4 rounded-full bg-white text-black font-semibold text-sm uppercase tracking-wide hover:bg-neutral-200 hover:scale-[1.02] hover:shadow-[0_0_30px_rgba(163,230,53,0.3)] transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-lime-400 focus:ring-offset-2 focus:ring-offset-black"
        >
          Enter Preview
        </button>
        <a
          href="https://gaurifyproductions.com"
          target="_blank"
          rel="noopener noreferrer"
          className="px-10 py-4 rounded-full bg-transparent border border-neutral-700 text-white font-semibold text-sm uppercase tracking-wide hover:bg-neutral-900 hover:border-neutral-500 transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-lime-400 focus:ring-offset-2 focus:ring-offset-black flex items-center justify-center"
        >
          Visit Gaurify Productions
        </a>
      </motion.div>
    </motion.div>
  );
}""",

    "gaurify-os/components/Modal.tsx": """"use client";
import { useEffect } from "react";
import { motion } from "framer-motion";
import { X } from "lucide-react";

interface ModalProps {
  onClose: () => void;
}

export default function Modal({ onClose }: ModalProps) {
  useEffect(() => {
    const handleKeyDown = (e: KeyboardEvent) => {
      if (e.key === "Escape") onClose();
    };
    window.addEventListener("keydown", handleKeyDown);
    return () => window.removeEventListener("keydown", handleKeyDown);
  }, [onClose]);

  return (
    <div className="fixed inset-0 z-50 flex items-center justify-center p-4">
      <motion.div
        initial={{ opacity: 0 }}
        animate={{ opacity: 1 }}
        exit={{ opacity: 0 }}
        transition={{ duration: 0.3 }}
        className="absolute inset-0 bg-black/80 backdrop-blur-md"
        onClick={onClose}
      />
      <motion.div
        initial={{ opacity: 0, scale: 0.95, y: 15, filter: "blur(4px)" }}
        animate={{ opacity: 1, scale: 1, y: 0, filter: "blur(0px)" }}
        exit={{ opacity: 0, scale: 0.95, y: 10, filter: "blur(4px)" }}
        transition={{ duration: 0.4, ease: [0.16, 1, 0.3, 1] }}
        className="relative w-full max-w-md bg-neutral-950 border border-neutral-800 p-8 rounded-3xl shadow-[0_0_50px_rgba(0,0,0,0.5)] overflow-hidden"
        role="dialog"
        aria-modal="true"
      >
        {/* Subtle top lime gradient line */}
        <div className="absolute top-0 left-0 w-full h-[2px] bg-gradient-to-r from-transparent via-lime-500 to-transparent opacity-50" />

        <button
          onClick={onClose}
          className="absolute top-5 right-5 text-neutral-500 hover:text-white transition-colors focus:outline-none focus:ring-2 focus:ring-lime-400 rounded-full p-1 bg-neutral-900/50 hover:bg-neutral-800"
          aria-label="Close modal"
        >
          <X size={18} />
        </button>

        <h2 className="text-2xl font-semibold text-white mb-3 tracking-tight">Preview Access</h2>
        <p className="text-neutral-400 mb-8 leading-relaxed text-sm">
          Gaurify OS is currently under active development. Access is currently limited while we build the first version.
        </p>

        <div className="flex flex-col gap-3">
          <a
            href="https://gaurifyproductions.com"
            target="_blank"
            rel="noopener noreferrer"
            className="w-full py-3.5 rounded-full bg-white text-black font-semibold text-sm tracking-wide text-center hover:bg-neutral-200 transition-colors focus:outline-none focus:ring-2 focus:ring-lime-400 focus:ring-offset-2 focus:ring-offset-neutral-950"
          >
            Visit Gaurify Productions
          </a>
          <button
            onClick={onClose}
            className="w-full py-3.5 rounded-full bg-transparent border border-neutral-800 text-neutral-300 font-semibold text-sm tracking-wide hover:bg-neutral-900 hover:text-white transition-colors focus:outline-none focus:ring-2 focus:ring-lime-400 focus:ring-offset-2 focus:ring-offset-neutral-950"
          >
            Close
          </button>
        </div>
      </motion.div>
    </div>
  );
}""",

    "gaurify-os/components/MouseGlow.tsx": """"use client";
import { useEffect, useState } from "react";
import { motion } from "framer-motion";

export default function MouseGlow() {
  const [position, setPosition] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const handleMouseMove = (e: MouseEvent) => {
      requestAnimationFrame(() => {
        setPosition({ x: e.clientX, y: e.clientY });
      });
    };
    window.addEventListener("mousemove", handleMouseMove);
    return () => window.removeEventListener("mousemove", handleMouseMove);
  }, []);

  return (
    <motion.div
      className="pointer-events-none fixed top-0 left-0 w-[500px] h-[500px] rounded-full bg-lime-500/10 blur-[120px] z-0 mix-blend-screen"
      animate={{
        x: position.x - 250,
        y: position.y - 250,
      }}
      transition={{ type: "tween", ease: "linear", duration: 0 }}
    />
  );
}""",

    "gaurify-os/components/Particles.tsx": """"use client";
import { useEffect, useState } from "react";
import { motion } from "framer-motion";

interface Particle {
  id: number;
  x: number;
  y: number;
  size: number;
  duration: number;
  delay: number;
}

export default function Particles() {
  const [particles, setParticles] = useState<Particle[]>([]);

  useEffect(() => {
    const generated = Array.from({ length: 40 }).map((_, i) => ({
      id: i,
      x: Math.random() * 100,
      y: Math.random() * 100,
      size: Math.random() * 2 + 0.5,
      duration: Math.random() * 20 + 15,
      delay: Math.random() * 5,
    }));
    setParticles(generated);
  }, []);

  return (
    <div className="absolute inset-0 z-0 pointer-events-none overflow-hidden mix-blend-screen opacity-60">
      {particles.map((p) => (
        <motion.div
          key={p.id}
          className="absolute bg-neutral-300 rounded-full"
          style={{ width: p.size, height: p.size, left: `${p.x}%`, top: `${p.y}%` }}
          animate={{
            y: ["0%", "-30%", "0%"],
            opacity: [0, 0.8, 0],
          }}
          transition={{
            duration: p.duration,
            repeat: Infinity,
            delay: p.delay,
            ease: "linear",
          }}
        />
      ))}
    </div>
  );
}"""
}

def generate_zip():
    print("Packing Gaurify OS project...")
    with zipfile.ZipFile('gaurify-os.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
        for filepath, content in project_files.items():
            zf.writestr(filepath, content.strip() + '\\n')
    print("Success! Created gaurify-os.zip in the current directory.")

if __name__ == "__main__":
    generate_zip()