name: project-xy-design-guide description: Apply consistent design patterns for the Shorin-Ryu Seibukan Karate-Union ASP.NET Razor Pages website using Tailwind CSS. Use when creating new pages, components, forms, cards, buttons, hero sections, or any UI elements. Ensures brand consistency with Japanese martial arts aesthetics, proper color usage (primary #282824, secondary #BC002D), typography (Open Sans body, Noto Sans JP headings), and responsive design patterns. license: Proprietary compatibility: Requires ASP.NET Core 10, Tailwind CSS 3.4, Remix Icon library metadata: author: Project XY Development Team version: "1.0" category: web-design project: shorin-ryu-website
Project XY Design Guide Skill
This skill helps you create consistent, brand-aligned UI components for the Shorin-Ryu Seibukan Karate-Union Deutschland e.V. website using established design patterns, color schemes, and component structures.
When to Use This Skill
Use this skill when:
- Creating new Razor pages or partials
- Adding UI components (buttons, cards, forms, navigation)
- Styling content sections or hero banners
- Implementing responsive layouts
- Adding animations or transitions
- Ensuring brand consistency across the website
- The user mentions design, styling, UI, components, or layout work
Core Design Principles
1. Brand Colors
Primary Colors:
- Primary:
#282824(Dark Charcoal) - Use for headers, primary buttons, navigation, footer - Secondary:
#BC002D(Crimson Red) - Use for CTAs, highlights, active states, links
Application in Tailwind:
<button class="bg-primary text-white hover:bg-opacity-90">Primary Button</button>
<button class="bg-secondary text-white hover:bg-opacity-90">Secondary Button</button>
<a href="#" class="text-secondary hover:underline">Link Text</a>
Background Colors:
- Main background:
#EEECE6(Warm Off-White) -bg-[#EEECE6] - Card background:
#FFFFFF(White) -bg-white - Accent beige:
#DDD6CC- Use for tags:bg-[#DDD6CC]
2. Typography
Font Families:
/* Body text */
font-family: 'Open Sans', sans-serif;
/* All headings */
font-family: 'Noto Sans JP', sans-serif;
letter-spacing: 2px;
Heading Hierarchy:
<!-- H1 - Hero titles only -->
<h1 class="text-5xl font-light mb-6 leading-tight">
Main Title <span class="text-secondary font-medium">Highlight</span>
</h1>
<!-- H2 - Section headers -->
<h2 class="text-3xl font-medium mb-6">Section Title</h2>
<!-- H3 - Subsection headers -->
<h3 class="text-xl font-medium mb-4">Subsection Title</h3>
<!-- H4 - Card titles -->
<h4 class="text-md font-medium mb-2">Card Title</h4>
3. Border Radius - CRITICAL
Always use !rounded-button for all buttons:
<!-- CORRECT -->
<button class="bg-primary px-6 py-3 !rounded-button">Button</button>
<!-- INCORRECT - Will look wrong -->
<button class="bg-primary px-6 py-3 rounded-lg">Button</button>
Other border radius values:
- Cards:
rounded-lg(12px) - Pills/Tags:
rounded-full - Inputs:
rounded-lg
4. Spacing System
Use consistent Tailwind spacing:
- Micro:
gap-2,p-2,m-2(8px) - Small:
gap-4,p-4,m-4(16px) - Medium:
gap-6,p-6,m-6(24px) - Large:
gap-8,p-8,m-8(32px) - XL:
gap-12,p-12,m-12(48px)
Component Patterns
Buttons
Primary Button:
<button class="bg-primary text-white px-6 py-3 !rounded-button hover:bg-opacity-90 transition whitespace-nowrap">
Button Text
</button>
Secondary Button:
<button class="bg-secondary text-white px-6 py-3 !rounded-button hover:bg-opacity-90 transition whitespace-nowrap">
Call to Action
</button>
Outlined Button:
<button class="border-2 border-primary px-6 py-3 !rounded-button hover:bg-primary hover:text-white transition whitespace-nowrap">
Outlined Action
</button>
Button with Icon (using Remix Icon):
<button class="bg-primary text-white px-4 py-2 !rounded-button hover:bg-opacity-90 transition flex items-center gap-2">
<i class="ri-send-plane-line"></i>
<span>Send</span>
</button>
Cards
News/Blog Card Pattern:
<div class="news-card bg-white rounded-lg overflow-hidden shadow-md">
<a href="/news/@Model.Slug">
<img src="/assets/@Model.Image" alt="@Model.Title" class="w-full h-48 object-cover object-top" />
</a>
<div class="p-6">
<div class="flex justify-between items-center mb-3">
<span class="text-xs text-gray-500">@Model.CreatedAtFormatted</span>
<span class="text-xs bg-[#DDD6CC] px-2 py-1 rounded-full">Tag</span>
</div>
<h3 class="text-md mb-3 font-medium">
<a href="/news/@Model.Slug">@Model.Title</a>
</h3>
<p class="text-gray-600 mb-4">@Model.Description</p>
<a href="/news/@Model.Slug" class="text-primary font-medium flex items-center">
Weitere Informationen
<i class="ri-arrow-right-line ml-1"></i>
</a>
</div>
</div>
Card CSS (automatically applied via site.css):
.news-card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.news-card:hover {
transform: translateY(-5px);
box-shadow: 0 12px 20px rgba(0, 0, 0, 0.1);
}
Forms
Form Structure:
<form method="post" class="space-y-6">
@Html.AntiForgeryToken()
<!-- Text Input -->
<div class="form-field">
<label for="name" class="block text-sm font-medium text-gray-700 mb-2">
Name *
</label>
<input type="text" id="name" name="Name" required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent transition text-sm" />
<div class="error-message">
Please enter your name.
</div>
</div>
<!-- Radio Button Group -->
<div class="form-field">
<label class="block text-sm font-medium text-gray-700 mb-3">Choose Option *</label>
<div class="flex space-x-6">
<label class="flex items-center cursor-pointer">
<input type="radio" name="option" value="1" class="custom-radio" required />
<span class="ml-3">Option 1</span>
</label>
<label class="flex items-center cursor-pointer">
<input type="radio" name="option" value="2" class="custom-radio" required />
<span class="ml-3">Option 2</span>
</label>
</div>
</div>
<!-- Checkbox Group -->
<div class="form-field">
<label class="block text-sm font-medium text-gray-700 mb-3">Interests</label>
<div class="space-y-3">
<label class="flex items-center cursor-pointer">
<input type="checkbox" name="interests" value="karate" class="custom-checkbox" />
<span class="ml-3">Karate</span>
</label>
<label class="flex items-center cursor-pointer">
<input type="checkbox" name="interests" value="kobudo" class="custom-checkbox" />
<span class="ml-3">Kobudo</span>
</label>
</div>
</div>
<!-- Textarea -->
<div class="form-field">
<label for="message" class="block text-sm font-medium text-gray-700 mb-2">
Message *
</label>
<textarea id="message" name="Message" rows="6" required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent transition resize-vertical text-sm"
placeholder="Enter your message..."></textarea>
<div class="error-message">
Please enter your message.
</div>
</div>
<!-- Submit Button -->
<div class="pt-4">
<button type="submit"
class="w-full bg-primary text-white px-6 py-3 !rounded-button hover:bg-opacity-90 transition duration-200 font-medium whitespace-nowrap">
<span class="flex items-center justify-center">
<i class="ri-send-plane-line mr-2"></i>
Submit Form
</span>
</button>
</div>
</form>
Hero Sections
Standard Hero with Gradient Overlay:
<section class="hero-section h-[600px] flex items-center relative"
style="background-image: url('/assets/hero-image-id');">
<div class="container mx-auto px-4">
<div class="hero-content max-w-2xl">
<h1 class="text-5xl font-light mb-6 leading-tight">
Main Title <span class="text-secondary font-medium">Highlighted</span>
</h1>
<p class="text-lg mb-8 max-w-xl">
Hero description that explains the page purpose.
</p>
<div class="flex space-x-4">
<a href="/link1" class="bg-primary text-white px-6 py-3 !rounded-button hover:bg-opacity-90 transition whitespace-nowrap">
Primary Action
</a>
<a href="/link2" class="border-2 border-primary px-6 py-3 !rounded-button hover:bg-primary hover:text-white transition whitespace-nowrap">
Secondary Action
</a>
</div>
</div>
</div>
</section>
Dark Hero Variant (for shop pages):
<section class="hero-section dark h-[400px] flex items-center relative"
style="background-image: url('/assets/dark-hero.jpg');">
<!-- Same content structure -->
</section>
Responsive Grid Layouts
4-Column Grid (standard for card displays):
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Card items -->
</div>
3-Column Grid:
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<!-- Items -->
</div>
2-Column Grid:
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<!-- Items -->
</div>
Responsive Design Patterns
Breakpoints (Tailwind):
sm:640pxmd:768px (tablet)lg:1024px (desktop)xl:1280px2xl:1536px
Common Patterns:
<!-- Hide on mobile, show on desktop -->
<div class="hidden lg:block">Desktop content</div>
<!-- Show on mobile, hide on desktop -->
<div class="block lg:hidden">Mobile content</div>
<!-- Responsive text sizing -->
<h1 class="text-3xl md:text-4xl lg:text-5xl">Responsive Heading</h1>
<!-- Vertical on mobile, horizontal on desktop -->
<div class="flex flex-col md:flex-row gap-4">
<!-- Items -->
</div>
Animations & Transitions
Standard Transition:
<div class="transition">Element</div>
Custom Duration:
<div class="transition duration-300">Slower transition</div>
Hover Effects:
<!-- Lift card -->
<div class="transform hover:-translate-y-1 transition">Card</div>
<!-- Scale -->
<div class="transform hover:scale-105 transition">Element</div>
<!-- Opacity -->
<button class="hover:bg-opacity-90 transition">Button</button>
Icons (Remix Icon)
Common Icons:
- Navigation:
ri-arrow-right-line,ri-arrow-left-line,ri-arrow-down-s-line - Actions:
ri-send-plane-line,ri-add-line,ri-close-line - Social:
ri-facebook-fill,ri-instagram-line,ri-youtube-line - Contact:
ri-mail-line,ri-phone-line,ri-map-pin-line - UI:
ri-menu-line,ri-search-line,ri-shopping-cart-line
Usage:
<i class="ri-arrow-right-line"></i>
Special Components
Japanese Pattern Separator
<div class="japanese-pattern w-full"></div>
Use in footer or section dividers for traditional aesthetic.
Tags/Pills
<span class="text-xs bg-[#DDD6CC] px-2 py-1 rounded-full">Tag Text</span>
Back to Top Button
<button class="back-to-top">
<i class="ri-arrow-up-line"></i>
</button>
Shows automatically when user scrolls down (JavaScript-controlled).
Step-by-Step Instructions
Creating a New Page with Components
Start with Layout Structure:
@page @model YourPageModel @{ ViewData["Title"] = "Page Title"; ViewData["Description"] = "SEO description"; }Add Hero Section:
- Use standard hero template
- Replace background image URL
- Update title with
text-secondaryspan for highlights - Add 2-3 CTA buttons in
flex space-x-4container
Add Content Sections:
- Wrap in
container mx-auto px-4for consistent margins - Use
py-12orpy-16for vertical section spacing - Add section title with
text-3xl font-medium mb-6
- Wrap in
Add Grid of Cards:
- Choose appropriate grid columns (4 for news/products, 3 for general)
- Use
gap-8for card spacing - Include proper card partial or inline card HTML
Add Forms (if needed):
- Use
space-y-6on form element - Include
@Html.AntiForgeryToken() - Use
form-fieldwrapper for each field - Add proper labels and error messages
- Submit button at bottom with icon
- Use
Customizing an Existing Component
- Locate the partial in
Pages/Partials/orPages/Shared/Partials/ - Copy the structure - never modify core patterns
- Adjust content while maintaining:
- Color scheme (primary/secondary)
- Spacing (gap-4, gap-6, gap-8)
- Border radius (!rounded-button for buttons)
- Transition classes
- Test responsive behavior at mobile, tablet, and desktop breakpoints
Adding Interactive Elements
- Buttons: Always use
!rounded-buttonand appropriate bg color - Hover states: Include
hover:variants andtransition - Icons: Use Remix Icon classes, typically in
flex items-centercontainers - Forms: Use custom-radio and custom-checkbox classes
- Cards: Include hover transform effects via CSS classes
Common Mistakes to Avoid
❌ Don't Do This
<!-- Missing !rounded-button -->
<button class="bg-primary px-6 py-3 rounded-lg">Wrong</button>
<!-- Using wrong colors -->
<button class="bg-red-500">Wrong Color</button>
<!-- Missing transition -->
<div class="hover:bg-primary">No Transition</div>
<!-- Wrong font on heading -->
<h2 style="font-family: Arial">Wrong Font</h2>
<!-- Inconsistent spacing -->
<div class="gap-5">Inconsistent Gap</div>
✅ Do This
<!-- Correct button styling -->
<button class="bg-primary text-white px-6 py-3 !rounded-button hover:bg-opacity-90 transition whitespace-nowrap">
Correct
</button>
<!-- Using brand colors -->
<button class="bg-secondary text-white px-6 py-3 !rounded-button hover:bg-opacity-90 transition">
Correct Color
</button>
<!-- Including transitions -->
<div class="hover:bg-primary transition">With Transition</div>
<!-- Using Tailwind classes -->
<h2 class="text-3xl font-medium">Correct Font</h2>
<!-- Standard spacing -->
<div class="gap-6">Standard Gap</div>
Edge Cases and Special Considerations
Mobile Navigation (< 1024px)
- Desktop nav uses
hidden lg:flex - Mobile menu uses
lg:hidden - Breakpoint is exactly 1023px
Image Optimization
- Always use Directus resize parameters:
/assets/IMAGE_ID?width=400&height=400 - Card images:
h-48(192px height) - Object-fit:
object-coverfor images,object-topfor product/news images
German Localization
- Button text typically in German: "In den Warenkorb", "Weitere Informationen"
- Form labels in German with asterisk for required: "Name *"
- Date format: DD.MM.YYYY
Z-Index Layers
- Header:
z-50 - Sidebar overlays:
z-40(overlay),z-50(content) - Modals:
z-50 - Dropdown menus:
z-100 - Fixed badges:
z-40
Reference Files
For detailed specifications and additional examples, refer to:
- Complete Design Guide:
docs/DesignGuide.md - Layout Template:
web/shorin-ryu/Pages/Shared/_Layout.cshtml - Hero Examples:
web/shorin-ryu/Pages/Partials/HomeTeaserPartial.cshtml - Card Components:
web/shorin-ryu/Pages/Shared/Partials/NewsCardPartial.cshtml - Form Patterns:
web/shorin-ryu/Pages/Kontakt/Partials/ContactForm.cshtml - Global Styles:
web/shorin-ryu/wwwroot/css/site.css
Examples
See the examples/ directory for complete component examples:
button-examples.html- All button variantscard-examples.html- Different card typesform-examples.html- Complete form with all field typeshero-examples.html- Hero section variantslayout-examples.html- Page layout patterns
Validation Checklist
Before completing a UI task, verify:
- All buttons use
!rounded-button - Colors use primary (#282824) or secondary (#BC002D)
- Headings use Noto Sans JP font (automatic via Tailwind classes)
- Spacing uses standard scale (2, 4, 6, 8, 12)
- Hover states include
transitionclass - Responsive classes included (
md:,lg:breakpoints) - Icons are from Remix Icon library
- Forms include proper validation markup
- Cards include hover animations
- Images use proper Directus resize parameters
Getting Help
If uncertain about a design pattern:
- Search for similar components in existing partials
- Refer to the complete design guide in
docs/DesignGuide.md - Check site.css for existing CSS classes
- Follow the validation checklist above
Summary
This skill ensures all UI components follow the Project XY brand guidelines with:
- Consistent colors (primary #282824, secondary #BC002D)
- Proper typography (Open Sans body, Noto Sans JP headings)
- Standard spacing (4, 6, 8 scale)
- Correct button styling (!rounded-button mandatory)
- Responsive patterns (mobile-first design)
- Smooth animations (transitions on interactions)
- Brand aesthetics (Japanese martial arts theme)
Always prioritize consistency over creativity. Use existing patterns and components before creating new ones.