Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f983eb9
feat: introduce interactive 2.5D hero visual, enhance video demo with…
yamcodes Dec 25, 2025
fba74bc
feat: Add dynamic theme support to hero visual tooltip and refine POR…
yamcodes Dec 25, 2025
843c51b
feat: improve syntax highlighting for the code snippet in the hero vi…
yamcodes Dec 25, 2025
c700c93
docs: Update hero visual code snippet to `const env = arkenv` and add…
yamcodes Dec 25, 2025
b58cfa4
Refactor: update theme-dependent text colors and structure for `PORT`…
yamcodes Dec 25, 2025
0008e65
style: Adjust text-yellow shades for improved visual consistency in t…
yamcodes Dec 25, 2025
2cd4a29
feat: Enhance hero visual accessibility, standardize Tailwind classes…
yamcodes Dec 25, 2025
23349d2
chore: Update arkenv dependency to ^0.8.0 and remove a console.log st…
yamcodes Dec 25, 2025
6eeedb3
deps: Update arkenv, vite-plugin, and bun-plugin dependencies in exam…
yamcodes Dec 25, 2025
0f973d2
Merge branch 'main' into 612-spinning-icon-has-a-visible-background-o…
yamcodes Dec 25, 2025
29b388a
refactor: simplify tooltip styling by removing specific Tailwind clas…
yamcodes Dec 25, 2025
15aa66e
feat: update video demo GIF styling to cover its container fully
yamcodes Dec 25, 2025
88a4ea3
feat: remove hero video component and its associated video assets.
yamcodes Dec 25, 2025
55ab2a2
chore: update hero icon title
yamcodes Dec 25, 2025
da5bf2c
docs: Add JSDoc comments to `VideoDemo` and `HeroVisual` components.
yamcodes Dec 25, 2025
eae7026
refactor: centralize syntax color definitions in hero visual component
yamcodes Dec 25, 2025
15a9384
style: Replace inline background and border styles with Tailwind clas…
yamcodes Dec 25, 2025
93936b1
feat: Add dark mode styles to hero visual floating accents.
yamcodes Dec 25, 2025
fc9ef6f
style: update dark mode background color for hero visual tooltip
yamcodes Dec 25, 2025
2958fb0
feat: Make the entire video demo browser frame clickable to open the …
yamcodes Dec 25, 2025
ab16116
feat: add arrow icon and styling to interactive playground hint
yamcodes Dec 25, 2025
86df7ba
style: adjust syntax highlighting and filename text colors for improv…
yamcodes Dec 25, 2025
a386a39
feat: Enhance video demo layout and object fit, add GitHub links to n…
yamcodes Dec 25, 2025
b7ad232
fix: Correct closing curly brace in hero visual code snippet.
yamcodes Dec 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apps/www/app/(home)/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { SiGithub } from "@icons-pack/react-simple-icons";
import { HomeLayout } from "fumadocs-ui/layouts/home";
import type { ReactNode } from "react";
import { baseOptions } from "~/app/layout.config";
Expand All @@ -12,6 +13,13 @@ export default function Layout({ children }: { children: ReactNode }) {
url: "/docs/arkenv",
active: "none",
},
{
text: "GitHub",
url: "https://github.com/yamcodes/arkenv",
active: "none",
type: "icon",
icon: <SiGithub aria-label="GitHub" />,
},
]}
>
{children}
Expand Down
8 changes: 4 additions & 4 deletions apps/www/app/(home)/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Metadata } from "next";
import { Bricolage_Grotesque } from "next/font/google";
import { HeroVideo } from "~/components/hero-video";
import { HeroVisual } from "~/components/hero-visual";
import { SailButton, StarUsButton, VideoDemo } from "~/components/page";

const bricolageGrotesque = Bricolage_Grotesque({
Expand All @@ -21,7 +21,7 @@ export default function HomePage() {
viewBox="0 0 1440 181"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="pointer-events-none absolute w-full top-0 left-0 h-[160px] z-10 opacity-100 text-blue-50 dark:text-[#011537]"
className="pointer-events-none absolute w-full top-0 left-0 h-40 z-10 opacity-100 text-blue-50 dark:text-[#011537]"
preserveAspectRatio="none"
aria-hidden="true"
role="presentation"
Expand Down Expand Up @@ -96,11 +96,11 @@ export default function HomePage() {
</div>
</div>
<div className="hidden md:flex flex-1 w-full justify-center lg:justify-end">
<HeroVideo />
<HeroVisual />
</div>
</div>

<div className="sm:mt-8 max-w-[1024px] mx-auto w-full relative z-20 px-4">
<div className="sm:mt-8 max-w-5xl mx-auto w-full relative z-20 px-4">
<VideoDemo />
</div>
</main>
Expand Down
10 changes: 10 additions & 0 deletions apps/www/app/docs/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { SiGithub } from "@icons-pack/react-simple-icons";
import { DocsLayout } from "fumadocs-ui/layouts/docs";
import type { ReactNode } from "react";
import { baseOptions } from "~/app/layout.config";
Expand All @@ -12,6 +13,15 @@ export default function Layout({ children }: { children: ReactNode }) {
banner: <InstallButton />,
}}
{...baseOptions}
links={[
{
text: "GitHub",
url: "https://github.com/yamcodes/arkenv",
active: "none",
type: "icon",
icon: <SiGithub aria-label="GitHub" />,
},
]}
>
{children}
</DocsLayout>
Expand Down
13 changes: 13 additions & 0 deletions apps/www/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,16 @@ button[data-search-full] {
background-color: var(--background);
background-image: none !important;
}

@keyframes spin-slow {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

.animate-spin-slow {
animation: spin-slow 60s linear infinite;
}
1 change: 0 additions & 1 deletion apps/www/app/layout.config.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,4 @@ export const baseOptions: BaseLayoutProps = {
nav: {
title: <Logo />,
},
githubUrl: process.env.NEXT_PUBLIC_GITHUB_URL,
};
46 changes: 0 additions & 46 deletions apps/www/components/hero-video.tsx

This file was deleted.

178 changes: 178 additions & 0 deletions apps/www/components/hero-visual.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
"use client";

import { useTheme } from "next-themes";
import { useEffect, useRef, useState } from "react";

/**
* HeroVisual component creates an interactive 2.5D visual using CSS transforms.
* It features a mouse-following tilt effect and theme-aware code highlights.
*/
export function HeroVisual() {
const { resolvedTheme } = useTheme();
const [mounted, setMounted] = useState(false);
const containerRef = useRef<HTMLDivElement>(null);
const [mousePos, setMousePos] = useState({ x: 0, y: 0 });

useEffect(() => {
setMounted(true);
}, []);

const handleMouseMove = (e: React.MouseEvent) => {
if (!containerRef.current) return;
const rect = containerRef.current.getBoundingClientRect();
const x = (e.clientX - rect.left) / rect.width - 0.5;
const y = (e.clientY - rect.top) / rect.height - 0.5;
setMousePos({ x, y });
};

const handleMouseLeave = () => {
setMousePos({ x: 0, y: 0 });
};

if (!mounted) {
return <div className="w-full aspect-square" />;
}

const syntaxColors = {
primary: resolvedTheme === "dark" ? "text-white" : "text-blue-950",
secondary: resolvedTheme === "dark" ? "text-white" : "text-blue-800",
punctuation:
resolvedTheme === "dark" ? "text-yellow-200" : "text-yellow-900",
};

return (
<div
ref={containerRef}
onMouseMove={handleMouseMove}
onMouseLeave={handleMouseLeave}
role="img"
aria-label="Interactive 2.5D visual representing ArkEnv's typesafe environment variables"
className="relative w-full max-w-125 mx-auto lg:ml-auto lg:mt-8 aspect-square flex items-center justify-center perspective-[1000px] group select-none"
>
{/* Ambient Glow Background */}
<div
className="absolute inset-0 bg-blue-500/10 dark:bg-blue-400/5 rounded-full blur-[80px] transform-gpu transition-transform duration-500"
style={{
transform: `translate3d(${mousePos.x * 40}px, ${mousePos.y * 40}px, 0)`,
}}
/>
Comment on lines +43 to +58
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Find Tailwind configuration files
find . -name "tailwind.config.*" -type f

Repository: yamcodes/arkenv

Length of output: 41


🏁 Script executed:

# Search for max-w-125, w-75, h-75 usage and definitions
rg "max-w-125|w-75|h-75" --type-list | head -20
rg "max-w-125|w-75|h-75" -n

Repository: yamcodes/arkenv

Length of output: 789


🏁 Script executed:

# Check apps/www directory structure for config files
ls -la apps/www/ | grep -E "tailwind|config"
find apps/www -name "*.config.*" -o -name "*theme*" -o -name "*css*" | head -20

Repository: yamcodes/arkenv

Length of output: 1010


🏁 Script executed:

# Look for the specific file mentioned in the review
cat -n apps/www/components/hero-visual.tsx | head -60

Repository: yamcodes/arkenv

Length of output: 2418


🏁 Script executed:

# Search for Tailwind configuration in apps/www
find apps/www -name "tailwind.config.*" -type f

Repository: yamcodes/arkenv

Length of output: 41


🏁 Script executed:

# Check the next.config.ts file for Tailwind configuration
cat apps/www/next.config.ts

Repository: yamcodes/arkenv

Length of output: 3069


🏁 Script executed:

# Look for tailwind configuration or custom theme definitions
rg -n "tailwind|theme|extend" apps/www/next.config.ts
rg -n "max-w|spacing|width|height" apps/www --type ts | grep -E "theme|extend|config" | head -20

Repository: yamcodes/arkenv

Length of output: 41


🏁 Script executed:

# Search for any tailwind.config file at root or in apps/www
find . -maxdepth 3 -name "tailwind.config*"

Repository: yamcodes/arkenv

Length of output: 41


🏁 Script executed:

# Check globals.css for custom utility definitions
cat -n apps/www/app/globals.css

Repository: yamcodes/arkenv

Length of output: 1291


🏁 Script executed:

# Check base.css for custom utilities
cat -n apps/www/app/styles/base.css

Repository: yamcodes/arkenv

Length of output: 758


🏁 Script executed:

# Search for tailwind in package.json
rg -n "tailwind" package.json

Repository: yamcodes/arkenv

Length of output: 86


🏁 Script executed:

# Look for @layer utilities or custom utility definitions
rg -n "max-w-125|w-75|h-75|@layer|@apply" apps/www/app --type css

Repository: yamcodes/arkenv

Length of output: 225


🏁 Script executed:

# Check if there's a tailwind config at project root
ls -la | grep tailwind
cat tailwind.config.* 2>/dev/null || echo "No tailwind.config found at root"

Repository: yamcodes/arkenv

Length of output: 91


🏁 Script executed:

# More thorough search for tailwind config files
find . -type f -name "tailwind.config*" -o -name "postcss.config*" 2>/dev/null

Repository: yamcodes/arkenv

Length of output: 88


🏁 Script executed:

# Check postcss.config.mjs in apps/www
cat apps/www/postcss.config.mjs

Repository: yamcodes/arkenv

Length of output: 124


🏁 Script executed:

# Search for theme configuration or custom utilities in any config file
rg -n "theme|extend|max-w|utilities" apps/www --type ts --type js | grep -i "config\|theme" | head -30

Repository: yamcodes/arkenv

Length of output: 519


🏁 Script executed:

# Check if Tailwind v4 is using @source directives or inline theme
rg -n "@source|theme|corePlugins" apps/www/app/globals.css

Repository: yamcodes/arkenv

Length of output: 227


🏁 Script executed:

# Look for any CSS custom properties or utility definitions that might define these values
rg -n "125|w-75|h-75|500px" apps/www --type css

Repository: yamcodes/arkenv

Length of output: 172


🏁 Script executed:

# Check package.json to see Tailwind version
rg -A 2 "tailwindcss" package.json

Repository: yamcodes/arkenv

Length of output: 122


🏁 Script executed:

# Check if tailwind config is in package.json
cat package.json | grep -A 20 '"tailwindcss"' || rg -A 10 'tailwind' package.json | head -30

Repository: yamcodes/arkenv

Length of output: 156


🏁 Script executed:

# Search entire apps/www for any definition of these utilities
rg -n "max-w-125|w-75|h-75" apps/www

Repository: yamcodes/arkenv

Length of output: 382


🏁 Script executed:

# Look for theme configuration in package.json or any config that might extend Tailwind
rg -B 5 -A 10 'theme|extend' package.json

Repository: yamcodes/arkenv

Length of output: 41


🏁 Script executed:

# Check for any tailwindcss configuration in any file
rg -n "tailwindcss.*config|export.*config" apps/www --type ts --type js

Repository: yamcodes/arkenv

Length of output: 161


🏁 Script executed:

# Look at the entire package.json for Tailwind configuration
cat package.json

Repository: yamcodes/arkenv

Length of output: 1763


🏁 Script executed:

# Check if there's any CSS or config that might define these as custom utilities
rg -n "max-w-125|w-75|h-75" --type css --type ts --type js --type json

Repository: yamcodes/arkenv

Length of output: 382


🏁 Script executed:

# Check the tailwindcss import to see if it's generating anything special
rg -B 5 -A 5 "@import.*tailwindcss" apps/www

Repository: yamcodes/arkenv

Length of output: 414


🏁 Script executed:

# Look for any theme or corePlugins configuration
rg -n "corePlugins|theme" apps/www --type ts --type js

Repository: yamcodes/arkenv

Length of output: 417


🏁 Script executed:

# Check if Tailwind v4 might be auto-generating these from somewhere
npm ls tailwindcss 2>/dev/null || cat package.json | grep -A 5 -B 5 dependencies

Repository: yamcodes/arkenv

Length of output: 107


🏁 Script executed:

# Verify: are these utilities actually being used correctly in rendered output?
# Look for any build artifacts or compiled CSS
find apps/www -name "*.css" -type f -exec grep -l "max-w-125\|w-75\|h-75" {} \;

Repository: yamcodes/arkenv

Length of output: 41


🏁 Script executed:

# Final verification: Check if these utilities could possibly be defined via Tailwind's dynamic generation
# Tailwind v4 with @tailwindcss/oxide - check their documentation approach
# Look for any inline theme configuration
rg -n "extend|theme:" apps/www --type ts --type js | head -20

Repository: yamcodes/arkenv

Length of output: 388


🏁 Script executed:

# Check fumadocs-ui to see if it defines these utilities
rg -n "max-w-125|w-75|h-75" node_modules/fumadocs-ui 2>/dev/null | head -10

Repository: yamcodes/arkenv

Length of output: 41


🏁 Script executed:

# One more check: look at the exact error or warnings during build
# Check if there's any config file that might be generating arbitrary values
find apps/www -type f \( -name "*.ts" -o -name "*.js" -o -name "*.json" \) -exec grep -l "125\|75" {} \;

Repository: yamcodes/arkenv

Length of output: 151


Replace undefined Tailwind utilities with explicit arbitrary values or configure custom utilities.

Lines 50 and 62 use max-w-125, w-75, and h-75, which are not standard Tailwind utilities and are not defined in the codebase. These classes will not apply any styles. Use explicit arbitrary value syntax instead: max-w-[500px], w-[300px], and h-[300px], or define these utilities in a Tailwind configuration file.

🤖 Prompt for AI Agents
In apps/www/components/hero-visual.tsx around lines 43 to 58, the classes
max-w-125, w-75, and h-75 are not standard Tailwind utilities and therefore
don’t apply; replace them with explicit arbitrary-value classes (e.g.
max-w-[500px], w-[300px], h-[300px]) where those elements need fixed sizes, or
alternatively add matching custom utilities to the Tailwind config and rebuild;
update the JSX className strings accordingly so the intended widths/heights take
effect.


{/* The 2.5D Platform / Card */}
<div
className="relative w-75 h-75 transition-transform duration-300 ease-out transform-gpu"
style={{
transformStyle: "preserve-3d",
transform: `rotateY(${mousePos.x * 20}deg) rotateX(${-mousePos.y * 20}deg)`,
}}
>
{/* Glass Base Layer */}
<div
className="absolute inset-0 bg-white/5 dark:bg-white/5 border border-white/20 dark:border-white/10 rounded-3xl backdrop-blur-md shadow-2xl"
style={{ transform: "translateZ(0px)" }}
/>

{/* Floating SVG Icon */}
<div
className="absolute inset-0 flex items-center justify-center transform-gpu"
style={{ transform: "translateZ(60px)" }}
>
<svg
width="160"
height="160"
viewBox="0 0 12 12"
className="drop-shadow-[0_20px_40px_rgba(59,130,246,0.3)] filter brightness-110 animate-spin-slow origin-center"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="hero-icon-title"
>
<title id="hero-icon-title">ArkEnv Icon</title>
<path
className="stroke-blue-500 dark:stroke-blue-400"
style={{
fill: "none",
strokeWidth: ".9",
strokeLinecap: "round",
strokeLinejoin: "round",
strokeMiterlimit: "10",
}}
d="M8.5 6c0-1.379-1.121-2.5-2.5-2.5A2.502 2.502 0 0 0 3.5 6c0 1.379 1.121 2.5 2.5 2.5S8.5 7.379 8.5 6ZM6 11V8.5M1 6h2.5m5 0H11M6 3.5V1M2.464 2.464l1.768 1.768m3.536 3.536 1.768 1.768m-7.072 0 1.768-1.768m3.536-3.536 1.768-1.768"
/>
<circle
cx="6"
cy="6"
r="0.9"
className="fill-blue-500 dark:fill-blue-400 animate-pulse"
/>
</svg>
</div>
Comment on lines +60 to +107
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify custom utilities in globals.css and Tailwind configuration
echo "=== Checking for animate-spin-slow ==="
rg -n "spin-slow" apps/www/app/globals.css 2>/dev/null || echo "Not found in globals.css"

echo -e "\n=== Checking for w-75 and h-75 ==="
rg -n "w-75|h-75" apps/www/app/globals.css 2>/dev/null || echo "Not found in globals.css"

echo -e "\n=== Searching for Tailwind config files ==="
fd -t f "tailwind|next.config" apps/www/ --type f

echo -e "\n=== Checking for custom animation definitions ==="
rg -n "spin-slow|w-75|h-75" apps/www/

Repository: yamcodes/arkenv

Length of output: 834


🏁 Script executed:

#!/bin/bash
# View the actual file to verify code style (tabs vs spaces, quotes, etc.)
echo "=== Checking file indentation and style ==="
head -120 apps/www/components/hero-visual.tsx | tail -65 | cat -A | head -30

Repository: yamcodes/arkenv

Length of output: 1291


🏁 Script executed:

#!/bin/bash
# Check if Tailwind extends these custom utilities
echo "=== Checking tailwind.config ==="
find apps/www -name "tailwind.config.*" -o -name "next.config.*" | head -5

Repository: yamcodes/arkenv

Length of output: 115


Define custom utility classes w-75 and h-75 in Tailwind configuration or globals.css.

The code uses w-75 and h-75 on line 62, but these custom utilities are not defined in the project. The animate-spin-slow animation is correctly defined in globals.css (lines 40-41), but the sizing utilities are missing, which breaks the visual layout of the card.

The 3D transforms and SVG accessibility are well-implemented. Code style correctly uses tabs and double quotes per guidelines.

🤖 Prompt for AI Agents
In apps/www/components/hero-visual.tsx lines 60-107, the component uses
non-standard Tailwind classes w-75 and h-75 which aren't defined and break
layout; fix by adding these utilities either in tailwind.config.js (recommended)
under theme.extend.spacing: { "75": "18.75rem" } so w-75/h-75 become available
(or alternatively add plain CSS in globals.css like .w-75{width:75px}
.h-75{height:75px} if you prefer pixel values), then rebuild to ensure the
classes are generated.


{/* Floating Accents (Code Samples / Particles) */}
<div
className="absolute -top-4 -right-4 bg-white/20 dark:bg-black/40 border border-white/20 dark:border-white/10 rounded-lg p-3 backdrop-blur-xl shadow-xl transform-gpu transition-all duration-300 group-hover:translate-x-4 opacity-80 group-hover:opacity-100"
style={{
transform: "translateZ(90px) rotate(-5deg)",
}}
>
<div className="text-[10px] font-mono leading-tight">
<span className="text-yellow-900 dark:text-yellow-200">const</span>{" "}
<span className="text-blue-900 dark:text-white">env</span>{" "}
<span className="text-yellow-900 dark:text-yellow-200">=</span>{" "}
<span className="text-blue-800 dark:text-blue-200 italic">
arkenv
</span>
<span className="text-yellow-900 dark:text-yellow-100">(</span>
<span className="text-yellow-900 dark:text-yellow-200">{"{"}</span>
<br />
&nbsp;&nbsp;
<span className="text-blue-950 dark:text-white">PORT:</span>{" "}
<span className="text-yellow-900 dark:text-yellow-200">"</span>
<span className="text-blue-900 dark:text-blue-300">number</span>
<span className="text-yellow-900 dark:text-yellow-200">"</span>
<br />
<span className="text-yellow-900 dark:text-yellow-200">{"}"}</span>
<span className="text-yellow-900 dark:text-yellow-100">)</span>
</div>
</div>

<div
className="absolute -bottom-10 -left-12 transform-gpu transition-all duration-300 group-hover:-translate-x-4 group-hover:-translate-y-2 opacity-90 group-hover:opacity-100"
style={{ transform: "translateZ(40px) rotate(4deg)" }}
>
{/* The 'Code' line */}
<div className="bg-white/20 dark:bg-black/40 border border-white/20 dark:border-white/10 rounded-md px-3 py-1.5 backdrop-blur-xl shadow-xl font-mono text-[11px]">
<span className="text-blue-950 dark:text-white">env</span>
<span className="text-yellow-900 dark:text-yellow-200">.</span>
<span className="text-yellow-900 dark:text-yellow-100">PORT</span>
</div>

{/* The Tooltip popover */}
<div
className="absolute bottom-full left-4 mb-2 border rounded-sm p-2 shadow-2xl transition-all duration-500 transform-gpu group-hover:scale-110 group-hover:-translate-y-1 bg-white dark:bg-[#0b1120] border-black/10 dark:border-white/10"
style={{
transform: "translateZ(30px)",
}}
>
<div className="flex flex-col gap-0.5 whitespace-nowrap">
<div className="text-[10px] font-mono leading-none">
<span className={syntaxColors.primary}>
(<span className={syntaxColors.secondary}>property</span>)
</span>{" "}
<span className={syntaxColors.primary}>PORT</span>
<span className={syntaxColors.punctuation}>:</span>{" "}
<span className={syntaxColors.secondary}>number</span>
</div>
</div>
{/* Small arrow */}
<div className="absolute top-full left-4 w-2 h-2 rotate-45 -translate-y-1 border-r border-b bg-white dark:bg-[#0b1120] border-black/10 dark:border-white/10" />
</div>
</div>
</div>

{/* Ground Reflection / Shadow */}
<div
className="absolute bottom-10 left-1/2 -translate-x-1/2 w-48 h-12 bg-black/20 dark:bg-black/60 blur-3xl opacity-50 rounded-full"
style={{ transform: "rotateX(90deg) translateZ(-150px)" }}
/>
</div>
);
}
Loading
Loading