Skip to main content

Documentation Index

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

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

PillTag is the skill badge component used on the Skills page. It encodes proficiency visually through size: a level-1 beginner tag is small and understated, while a level-5 expert tag is large and bold. This means a quick scan of the skill grid immediately communicates relative expertise without needing a separate legend or star rating. An optional note prop surfaces a tooltip on hover, giving each tag a single line of extra context.

Props

name
string
required
The skill label displayed inside the pill. Rendered as plain text.
level
1 | 2 | 3 | 4 | 5
required
Proficiency level from 1 (beginner) to 5 (expert). Controls the Tailwind sizing classes applied to the pill — see the Level Scale table for exact values.
note
string
Optional tooltip text displayed above the tag on hover. Rendered inside a Framer Motion AnimatePresence transition. If omitted, no tooltip is shown.
color
string
default:"cyan"
Border and glow color for the pill. Accepts "magenta", "lime", or "cyan". Resolves to border-y2k-{color} on the pill border and border-y2k-{color} on the tooltip border.

Level Scale

The level prop maps directly to a set of Tailwind size classes. There are no intermediate values — only integers 1–5 are valid.
levelTailwind size classesTypical meaning
1text-xs px-2 py-0.5Beginner — aware of the tool
2text-sm px-3 py-1Learning — building familiarity
3text-base px-4 py-1.5Competent — can work independently
4text-lg px-5 py-2Proficient — comfortable with advanced patterns
5text-xl px-6 py-2.5 font-boldExpert — deep knowledge, go-to skill

Tooltip

When note is provided, PillTag tracks a hovered boolean via useState on onMouseEnter / onMouseLeave. The tooltip mounts and unmounts inside a Framer Motion <AnimatePresence> block, which means it animates in and out cleanly even if the user moves away quickly. The tooltip animates through three stages:
Stageopacityy offsetscale
Enter (initial)0100.9
Visible (animate)101
Exit (exit)050.9
The tooltip element is positioned absolutely above the pill (bottom: 100%, centered with -translate-x-1/2) and uses a bg-y2k-violet background (#14001f) with the same colored border as the pill. Text is rendered in font-marginalia (Caveat cursive) with text-y2k-lavender color.
The tooltip container has w-max max-w-[200px], so short notes appear compact while longer notes wrap at 200px. Keep notes brief — one punchy phrase is ideal.

Usage Example

import { PillTag } from '../components/y2k/PillTag';

// Render a level-5 TypeScript skill tag
<PillTag name="TypeScript" level={5} note="5 years of strict typing" color="cyan" />

In Context

The Skills page iterates over portfolioData’s skill categories object, rendering a PillTag for every entry. Each category maps to its own colored group:
import { PillTag } from '../components/y2k/PillTag';
// The skill categories object is the named export `a` from portfolioData.js.
// Import it under a readable alias:
import { a as skillCategories } from '../data/portfolioData';

// skillCategories shape (from portfolioData.js):
// {
//   Languages:  [{ name, level, note }, ...],
//   Frontend:   [{ name, level, note }, ...],
//   ...
// }

export function SkillsGrid() {
  return (
    <div className="space-y-8">
      {Object.entries(skillCategories).map(([category, skills]) => (
        <div key={category}>
          <h3 className="font-display text-y2k-magenta tracking-widest uppercase mb-3">
            {category}
          </h3>
          <div className="flex flex-wrap">
            {skills.map((skill) => (
              <PillTag
                key={skill.name}
                name={skill.name}
                level={skill.level}
                note={skill.note}
                color="cyan"
              />
            ))}
          </div>
        </div>
      ))}
    </div>
  );
}
The color prop can be varied per category to give each group a distinct neon hue.

Build docs developers (and LLMs) love