Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
41 changes: 41 additions & 0 deletions .agents/skills/frontend-design/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
name: frontend-design
description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.
---

This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.

The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.

## Design Thinking

Before coding, understand the context and commit to a BOLD aesthetic direction:
- **Purpose**: What problem does this interface solve? Who uses it?
- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction.
- **Constraints**: Technical requirements (framework, performance, accessibility).
- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember?

**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity.

Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
- Production-grade and functional
- Visually striking and memorable
- Cohesive with a clear aesthetic point-of-view
- Meticulously refined in every detail

## Frontend Aesthetics Guidelines

Focus on:
- **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
- **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
- **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
- **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density.
- **Backgrounds & Visual Details**: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays.

NEVER use generic AI-generated aesthetics like overused font families (Inter, Roboto, Arial, system fonts), cliched color schemes (particularly purple gradients on white backgrounds), predictable layouts and component patterns, and cookie-cutter design that lacks context-specific character.

Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, for example) across generations.

**IMPORTANT**: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well.

Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision.
52 changes: 51 additions & 1 deletion static/input.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,64 @@
font-family: "IBM Plex Sans Variable", sans-serif;
}

/* Smooth transitions on interactive elements */
a, button, input, select, textarea {
transition: color 0.15s ease, background-color 0.15s ease,
border-color 0.15s ease, box-shadow 0.15s ease,
opacity 0.15s ease, transform 0.15s ease;
}

/* Better focus-visible states for keyboard navigation */
:focus-visible {
outline: 2px solid theme('colors.teal.400');
outline-offset: 2px;
border-radius: 4px;
}

/* Selection color matching brand */
::selection {
background-color: theme('colors.teal.100');
color: theme('colors.teal.900');
}

#banner {
background-image:
linear-gradient(rgba(0 0 0 / 75%), rgba(0 0 0 / 75%)),
linear-gradient(rgba(0 0 0 / 70%), rgba(0 0 0 / 70%)),
url(/assets/banner.jpg);
background-size: cover;
background-position: center;
}

/* Newsletter section card styling */
.newsletter-section h2 {
@apply text-xl font-bold;
}

/* Clean up Mailchimp embed */
#mc_embed_shell {
@apply !p-0;
}

#mc_embed_shell .button {
@apply !bg-teal-600 hover:!bg-teal-700 !rounded-lg !h-auto !py-2.5 !px-6 !text-sm !font-semibold !border-0 !m-0;
}

#mc_embed_shell input[type="email"] {
@apply !rounded-lg !border-gray-300 !py-2.5 !px-3 !text-sm !w-full;
}

#mc_embed_shell label {
@apply !font-medium !text-sm !text-gray-700;
}

#mc_embed_shell #mc_embed_signup {
@apply !bg-transparent;
}

#mc_embed_shell .mc-field-group {
@apply !pb-0;
}

#text-404 {
@apply bg-gradient-to-br from-teal-400 to-emerald-300 bg-clip-text text-transparent;
font-size: 12rem;
Expand Down
14 changes: 7 additions & 7 deletions templates/about.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@ <h2>Our Team</h2>

{% set current_term = page.extra.about.terms | first %}

<div class="grid grid-flow-col gap-4 not-prose">
<div class="grid grid-cols-1 md:grid-flow-col md:auto-cols-fr gap-6 not-prose">
{% for column in current_term.columns %}
<div class="flex flex-col gap-4 items-start">
<div class="bg-white rounded-xl border border-gray-200 p-5 md:p-6 shadow-sm flex flex-col gap-5">
{% for role in column %}
<div>
<div class="w-full {% if not loop.first %}pt-5 border-t border-gray-100{% endif %}">
{% if role.heading %}
<h3 class="font-semibold text-xl">{{ role.title }}</h3>
<h3 class="font-bold text-lg mb-2">{{ role.title }}</h3>
{% else %}
<h4 class="font-semibold">{{ role.title }}</h4>
<h4 class="font-semibold text-xs text-gray-400 uppercase tracking-widest mb-2">{{ role.title }}</h4>
{% endif %}
{% if role.members %}
<ul class="not-prose">
<ul class="not-prose space-y-0.5">
{% for member in role.members %}
<li>{{ member }}</li>
<li class="text-gray-700">{{ member }}</li>
{% endfor %}
</ul>
{% endif %}
Expand Down
93 changes: 68 additions & 25 deletions templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,6 @@
<meta property="og:site_name" content="Berkeley Math Tournament" />

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.min.css">
<link rel="preconnect" href="https://rsms.me/">
<link rel="stylesheet" href="https://rsms.me/inter/inter.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.8/dist/katex.min.css">
<link rel="stylesheet" href="/style.css?{{ get_random(end=1000000) }}">

Expand Down Expand Up @@ -72,26 +70,33 @@
</head>

<body>
<div id="mobile-menu" class="md:hidden hidden fixed inset-x-0 top-0 bg-white z-50 border-b shadow-lg">
<a href="#main-content" class="sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-[100] focus:bg-white focus:px-4 focus:py-2 focus:rounded focus:shadow-lg focus:text-teal-600 focus:font-semibold">
Skip to main content
</a>

<div id="mobile-menu" class="md:hidden hidden fixed inset-x-0 top-0 bg-white/95 backdrop-blur-md z-50 border-b border-gray-200 shadow-lg">
<div class="flex justify-between items-center p-4">
<img src="/assets/logo.svg" alt="BMT Logo" width="44" class="-mt-1">
<button class="p-2" onclick="toggleMobileMenu()">
<i class="bi bi-x-lg text-2xl"></i>
</button>
</div>
<nav class="flex flex-col gap-2 p-4 pt-0">
<nav class="flex flex-col gap-2 p-4 pt-0" aria-label="Mobile navigation">
{{ macros::mobile_nav_link(path="@/_index.md", label="Home") }}
{{ macros::mobile_nav_link(path="@/news/_index.md", label="News") }}
{{ macros::mobile_nav_link(path="@/blog/_index.md", label="Blog") }}
{{ macros::mobile_nav_link(path="@/about.md", label="About") }}
{{ macros::mobile_nav_link(path="@/resources/index.md", label="Resources") }}
{{ macros::mobile_nav_link(path="@/events/bmmt-2026.md", label="BmMT 2026") }}
{{ macros::mobile_nav_link(path="@/events/bmmt-2026-online.md", label="BmMT 2026 Online") }}
<a href="https://contestdojo.com/" class="py-2.5 px-4 rounded-lg bg-teal-600 text-white font-semibold text-center mt-2 hover:bg-teal-700">
Register &rarr;
</a>
</nav>
</div>

<div class="max-w-4xl min-h-screen p-4 md:p-8 mx-auto flex flex-col gap-8">
<button id="mobile-menu-btn" class="md:hidden fixed top-4 right-4 border py-2 px-3 rounded-xl bg-white z-50" onclick="toggleMobileMenu()">
<button id="mobile-menu-btn" class="md:hidden fixed top-4 right-4 border border-gray-200 py-2 px-3 rounded-xl bg-white/90 backdrop-blur-sm z-50 shadow-sm hover:shadow" onclick="toggleMobileMenu()">
<i class="bi bi-list text-xl"></i>
</button>

Expand All @@ -100,50 +105,88 @@
<a class="mx-auto" href="/"><img src="/assets/logo.svg" alt="BMT Logo" width="80"></a>
<p class="text-2xl font-bold">Berkeley Math Tournament</p>

<nav class="hidden md:flex md:flex-row md:mx-auto gap-4 items-stretch">
<nav class="hidden md:flex md:flex-row md:mx-auto gap-4 items-stretch" aria-label="Main navigation">
{{ macros::nav_link(path="@/_index.md", label="Home") }}
{{ macros::nav_link(path="@/news/_index.md", label="News") }}
{{ macros::nav_link(path="@/blog/_index.md", label="Blog") }}
{{ macros::nav_link(path="@/about.md", label="About") }}
{{ macros::nav_link(path="@/resources/index.md", label="Resources") }}
{{ macros::nav_link(path="@/events/bmmt-2026.md", label="BmMT 2026") }}
{{ macros::nav_link(path="@/events/bmmt-2026-online.md", label="BmMT 2026 Online") }}
<p class="first:hidden text-gray-300">⁄</p>
<a href="https://contestdojo.com/" class="text-teal-600 font-semibold hover:text-teal-700 flex items-center">
Register &rarr;
</a>
</nav>
</header>
{% endblock %}

<hr>

<div id="content-wrapper" class="flex-1 flex flex-col gap-8 relative">
<div id="main-content" class="flex-1 flex flex-col gap-8 relative">
{% block content %}{% endblock %}
</div>

<hr>

{% block footer %}
<div class="flex flex-col items-center justify-between md:items-start text-center md:flex-row gap-4 mb-12">
<div class="flex flex-col gap-6 items-center md:items-start">
<img class="-ml-1 grayscale brightness-0" src="/assets/logo.svg" alt="BMT Logo" width="50">

<div class="flex gap-4 text-xl">
<a href="https://www.instagram.com/berkeley_mt/"><i class="bi bi-instagram"></i></a>
<a href="https://www.tiktok.com/@berkeley_mt"><i class="bi bi-tiktok"></i></a>
<a href="mailto:team@berkeley.mt"><i class="bi bi-envelope-fill"></i></a>
<footer class="flex flex-col gap-8 mb-12">
<div class="grid grid-cols-2 md:grid-cols-4 gap-8 text-sm">
<div class="flex flex-col gap-2.5">
<h3 class="font-semibold text-gray-900 text-xs uppercase tracking-wider">Tournaments</h3>
<a href="/events/bmmt-2026/" class="text-gray-500 hover:text-gray-800 transition-colors">BmMT 2026</a>
<a href="/events/bmmt-2026-online/" class="text-gray-500 hover:text-gray-800 transition-colors">BmMT 2026 Online</a>
<a href="/resources/" class="text-gray-500 hover:text-gray-800 transition-colors">Past Archives</a>
</div>
<div class="flex flex-col gap-2.5">
<h3 class="font-semibold text-gray-900 text-xs uppercase tracking-wider">Resources</h3>
<a href="/resources/" class="text-gray-500 hover:text-gray-800 transition-colors">Worksheets & Archives</a>
<a href="/blog/" class="text-gray-500 hover:text-gray-800 transition-colors">Blog</a>
<a href="/news/" class="text-gray-500 hover:text-gray-800 transition-colors">News</a>
</div>
<div class="flex flex-col gap-2.5">
<h3 class="font-semibold text-gray-900 text-xs uppercase tracking-wider">Organization</h3>
<a href="/about/" class="text-gray-500 hover:text-gray-800 transition-colors">About Us</a>
<a href="mailto:team@berkeley.mt" class="text-gray-500 hover:text-gray-800 transition-colors">Contact Us</a>
<a href="https://contestdojo.com/" class="text-gray-500 hover:text-gray-800 transition-colors">Register</a>
</div>
<div class="flex flex-col gap-2.5">
<h3 class="font-semibold text-gray-900 text-xs uppercase tracking-wider">Connect</h3>
<a href="https://www.instagram.com/berkeley_mt/" class="text-gray-500 hover:text-gray-800 transition-colors flex items-center gap-2">
<i class="bi bi-instagram"></i> Instagram
</a>
<a href="https://www.tiktok.com/@berkeley_mt" class="text-gray-500 hover:text-gray-800 transition-colors flex items-center gap-2">
<i class="bi bi-tiktok"></i> TikTok
</a>
<a href="mailto:team@berkeley.mt" class="text-gray-500 hover:text-gray-800 transition-colors flex items-center gap-2">
<i class="bi bi-envelope-fill"></i> team@berkeley.mt
</a>
</div>
</div>

<div class="flex flex-col gap-4 items-center md:items-end md:text-right max-w-xs">
<a href="https://ocf.berkeley.edu">
<img src="https://ocf.berkeley.edu/hosting-logos/ocf-hosted-penguin-dark.svg" width="80"
alt="Hosted by the OCF" />
</a>
<hr>

<p class="text-xs">
We are a student group acting independently of the University of California. We take full responsibility for
our organization and this web site.
</p>
<div class="flex flex-col items-center justify-between md:items-start text-center md:flex-row gap-4">
<div class="flex items-center gap-4">
<img class="grayscale brightness-0" src="/assets/logo.svg" alt="BMT Logo" width="36">
<p class="text-xs text-gray-500">
&copy; {{ now() | date(format="%Y") }} Berkeley Math Tournament
</p>
</div>

<div class="flex flex-col gap-2 items-center md:items-end md:text-right">
<a href="https://ocf.berkeley.edu">
<img src="https://ocf.berkeley.edu/hosting-logos/ocf-hosted-penguin-dark.svg" width="80"
alt="Hosted by the OCF" />
</a>

<p class="text-xs text-gray-500">
We are a student group acting independently of the University of California. We take full responsibility for
our organization and this web site.
</p>
</div>
</div>
</div>
</footer>
{% endblock %}
</div>

Expand Down
Loading
Loading