Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/apursley2012/sys-witch/llms.txt

Use this file to discover all available pages before exploring further.

Sigils are the visual language of Sys.Witch V2. Every navigation node, personality trait, and decorative accent in the theme is expressed as a named SVG path drawn from a central registry. The Sigil component looks up a path by key, wraps it in a correctly-sized <svg> element, and applies a neon stroke color together with a matching drop-shadow glow filter. PortalRing builds on top of Sigil to produce the iconic animated home screen: three concentric rings orbiting at different speeds around a central home sigil, with the six navigation sigils arranged in a clock-face pattern around the outer edge.

The Sigil Registry

All SVG path data lives in data/sigils.js and is exported as a plain object keyed by sigil name. The Sigil component imports this object and resolves the id prop against it, falling back to rune-1 when a key is not found.
// data/sigils.js (abbreviated)
const sigils = {
  home:            "M12 2 L22 12 L12 22 L2 12 Z M12 6 L18 12 L12 18 L6 12 Z M12 10 L14 12 L12 14 L10 12 Z",
  about:           "M12 2 A10 10 0 1 0 12 22 A10 10 0 1 0 12 2 M12 6 A6 6 0 1 0 12 18 ...",
  projects:        "M4 4 L20 4 L20 20 L4 20 Z M8 8 L16 8 L16 16 L8 16 Z ...",
  skills:          "M12 2 L22 8 L22 16 L12 22 L2 16 L2 8 Z M12 6 L18 10 ...",
  writing:         "M6 4 L18 4 L18 20 L6 20 Z M10 8 L14 8 M10 12 L14 12 ...",
  "case-studies":  "M4 12 L12 4 L20 12 L12 20 Z M8 12 A4 4 0 1 0 16 12 ...",
  contact:         "M2 6 L22 6 L22 18 L2 18 Z M2 6 L12 14 L22 6 M12 14 L12 18",
  "trait-detail":  "M12 4 A8 8 0 1 0 12 20 A8 8 0 1 0 12 4 M12 10 A2 2 0 1 0 12 14 ...",
  "trait-creative":"M12 2 L15 9 L22 12 L15 15 L12 22 L9 15 L2 12 L9 9 Z",
  "trait-sarcastic":"M4 20 L20 4 M4 4 L20 20 M8 12 A4 4 0 1 0 16 12 ...",
  "trait-practical":"M6 6 L18 6 L18 18 L6 18 Z M10 10 L14 10 L14 14 L10 14 Z ...",
  "trait-pattern": "M4 12 A8 8 0 1 0 20 12 A8 8 0 1 0 4 12 M8 12 A4 4 0 1 0 16 12 ...",
  "rune-1": "M8 4 L16 4 L12 12 L16 20 L8 20 L12 12 Z",
  "rune-2": "M12 4 L20 12 L12 20 L4 12 Z M12 8 L16 12 L12 16 L8 12 Z",
  "rune-3": "M6 6 L18 18 M18 6 L6 18 M12 4 L12 20",
  "rune-4": "M12 4 A8 8 0 1 0 12 20 A8 8 0 1 0 12 4 M12 4 L12 20 M4 12 L20 12",
  "rune-5": "M4 8 L20 8 M4 16 L20 16 M8 4 L8 20 M16 4 L16 20",
  "rune-6": "M12 2 L22 12 L12 22 L2 12 Z M12 8 L16 12 L12 16 L8 12 Z",
  "rune-7": "M12 4 L18 20 L6 20 Z M12 10 L15 17 L9 17 Z",
};
Every path is drawn on a 24 × 24 viewBox. Stroke weight, color, and the drop-shadow filter are applied by the Sigil component at render time — the registry stores pure geometry only.

Sigil Component

Sigil renders a single inline <svg> whose path is resolved from the registry. When the animate prop is true, the component swaps the static <path> for a Framer Motion motion.path that draws itself in over two seconds using a pathLength animation from 0 to 1.

Props

PropTypeDefaultDescription
idstringRegistry key to look up. Falls back to rune-1 if the key is not found.
color"purple" | "cyan" | "magenta" | "lime" | "deep-purple""purple"Neon color applied to the SVG stroke and the drop-shadow filter.
sizenumber24Both width and height of the rendered <svg> in pixels.
animatebooleanfalseWhen true, the path draws itself in with a 2-second Framer Motion animation.
classNamestring""Additional Tailwind classes merged onto the <svg> element.

Color and Glow Mapping

The color prop maps to two internal lookup tables. The first resolves the CSS variable used as the SVG stroke; the second selects a Tailwind drop-shadow utility class applied to the <svg> wrapper:
Color tokenCSS variableDrop-shadow class
purplevar(--neon-purple)#b026ffdrop-shadow-glow-purple
cyanvar(--neon-cyan)#00f3ffdrop-shadow-glow-cyan
magentavar(--neon-magenta)#ff00ffdrop-shadow-glow-magenta
limevar(--neon-lime)#39ff14drop-shadow-glow-lime
deep-purplevar(--neon-deep-purple)#4a00e0drop-shadow-glow-purple
Each drop-shadow-glow-* utility applies filter: drop-shadow(0 0 8px rgba(..., 0.8)), producing the signature neon bloom around every icon.

Usage

import { Sigil } from "@/components/sigils/Sigil";

// Static sigil at default purple
<Sigil id="home" size={32} />

// Animated cyan sigil, draw-on entrance
<Sigil id="about" color="cyan" size={48} animate />

// Decorative rune with extra class
<Sigil id="rune-4" color="lime" size={16} className="opacity-60" />
If you pass an id that does not exist in the registry, Sigil silently falls back to the rune-1 path rather than throwing. This makes it safe to use with dynamic data.

PortalRing Component

PortalRing is the animated centerpiece of the home screen. It composes three Framer Motion motion.div elements styled as rounded-full rings, each rotating continuously at a different speed and direction using an infinite repeat transition:
  • Outer ringborder-neon-purple/20, border-dashed, rotates 360° every 40 seconds
  • Middle ringborder-neon-cyan/10, rotates −360° (counter-clockwise) every 30 seconds
  • Inner ringborder-neon-magenta/5, border-dotted, rotates 360° every 20 seconds
At the geometric center sits a home sigil (size={48}, animate, color="purple") and the SYS.WITCH wordmark rendered in the font-display (Tektur) typeface with text-glow-purple. Six navigation nodes orbit the rings at 60° intervals on a radius of 160 px. Each node is a Framer Motion motion.button that holds a Sigil inside a circular bg-surface-elevated badge. The badge gains border-neon-{color} and shadow-glow-{color} on hover, and a text label fades in below the icon via opacity-0 → group-hover:opacity-100 (positioned with absolute top-14). On mobile the entire orbital layout is hidden (hidden md:block on its wrapper); the mobile fallback div carries md:hidden pointer-events-none and renders no navigation children.

Usage

PortalRing accepts no props — it is a fully self-contained hero component intended to be dropped directly onto the home page:
import { PortalRing } from "@/components/sigils/PortalRing";

export default function HomePage() {
  return (
    <main className="flex min-h-screen items-center justify-center">
      <PortalRing />
    </main>
  );
}
To adjust the orbital radius, change the o constant inside PortalRing.js (currently 160). Increase the value to push the navigation nodes further from center, and update the container’s w-[300px] md:w-[500px] sizing to match.

All Available Sigil Keys

Navigation Sigils

Used in PortalRing for the desktop orbital navigation. Each maps directly to a site route.
KeyShape description
homeNested concentric diamonds — three squares rotated 45°
aboutConcentric circles bisected by a crosshair
projectsNested squares with intersecting grid lines
skillsHexagon with inner hexagon and crossing diagonals
writingRectangle with three ruled lines and a chevron apex at the top
case-studiesDiamond with a circle at center and axis tick marks
contactEnvelope outline with a descending center fold

Trait Sigils

Rendered on the personality / traits section of the About page.
KeyShape description
trait-detailCircle with inner dot and four axis spokes
trait-creativeEight-pointed star (cardinal + diagonal)
trait-sarcasticTwo crossing diagonals with a circle at intersection
trait-practicalSquare with inner square and four axis spokes
trait-patternConcentric circles with full crosshair

Decorative Runes

Abstract geometry used in RuneDivider and as ambient decoration.
KeyShape description
rune-1Hourglass / bowtie — two triangles sharing a center point
rune-2Diamond with inner concentric diamond
rune-3Asterisk — two diagonals and a vertical line
rune-4Circle bisected by a full crosshair
rune-5Hash / grid — two horizontals and two verticals
rune-6Rotated square with inner diamond
rune-7Triangle with inner concentric triangle

Build docs developers (and LLMs) love