Files
mal/.impeccable/design.json

105 lines
6.2 KiB
JSON

{
"schemaVersion": 2,
"generatedAt": "2026-05-05T00:00:00Z",
"title": "Design System: MAL",
"extensions": {
"colorMeta": {
"background": { "role": "neutral", "displayName": "Void Black", "canonical": "#080808" },
"background-sidebar": { "role": "neutral", "displayName": "Deep Charcoal", "canonical": "#0f0f0f" },
"background-header": { "role": "neutral", "displayName": "Elevated Black", "canonical": "#141414" },
"background-surface": { "role": "neutral", "displayName": "Surface Gray", "canonical": "#202020" },
"background-button": { "role": "neutral", "displayName": "Button Dark", "canonical": "#1a1a1a" },
"background-button-hover": { "role": "neutral", "displayName": "Button Hover", "canonical": "#252525" },
"foreground-muted": { "role": "neutral", "displayName": "Muted Gray", "canonical": "#6a6b70" },
"foreground": { "role": "neutral", "displayName": "Off White", "canonical": "#f8f9fa" },
"accent": { "role": "primary", "displayName": "Soft Violet", "canonical": "#9f7aea" },
"danger": { "role": "accent", "displayName": "Red Alert", "canonical": "#dc2626" }
},
"typographyMeta": {
"body": { "displayName": "Body", "purpose": "Standard text, descriptions" },
"title": { "displayName": "Title", "purpose": "Page headings" },
"label": { "displayName": "Label", "purpose": "Navigation, buttons, form labels" }
},
"shadows": [],
"motion": [
{ "name": "ease-default", "value": "cubic-bezier(0.4, 0, 0.2, 1)", "purpose": "Default transition easing" }
],
"breakpoints": []
},
"components": [
{
"name": "Primary Button",
"kind": "button",
"refersTo": "button-primary",
"description": "Main action button with purple background",
"html": "<button class=\"ds-btn-primary\">Action</button>",
"css": ".ds-btn-primary { background: #9f7aea; color: #080808; padding: 8px 16px; border: none; font-weight: 500; transition: background 0.2s; } .ds-btn-primary:hover { background: #b79ef5; }"
},
{
"name": "Secondary Button",
"kind": "button",
"refersTo": "button-secondary",
"description": "Secondary action with dark background",
"html": "<button class=\"ds-btn-secondary\">Action</button>",
"css": ".ds-btn-secondary { background: rgba(255,255,255,0.05); color: #f8f9fa; padding: 8px 16px; border: none; transition: background 0.2s; } .ds-btn-secondary:hover { background: rgba(255,255,255,0.1); }"
},
{
"name": "Anime Card",
"kind": "card",
"refersTo": "card-anime",
"description": "Anime poster card with hover reveal",
"html": "<div class=\"ds-card\"><img src=\"\" alt=\"Anime\"><div class=\"ds-card-overlay\"><span>Title</span></div></div>",
"css": ".ds-card { position: relative; aspect-ratio: 2/3; background: rgba(255,255,255,0.05); overflow: hidden; } .ds-card img { width: 100%; height: 100%; object-fit: cover; } .ds-card-overlay { position: absolute; inset: 0; background: rgba(0,0,0,0.8); opacity: 0; padding: 12px; transition: opacity 0.3s; display: flex; flex-direction: column; } .ds-card:hover .ds-card-overlay { opacity: 1; }"
},
{
"name": "Navigation Item",
"kind": "nav",
"refersTo": "nav-item",
"description": "Sidebar navigation link with active indicator",
"html": "<a class=\"ds-nav-item\" href=\"/\">Home</a>",
"css": ".ds-nav-item { display: flex; align-items: center; padding: 12px 28px; color: #6a6b70; text-decoration: none; transition: color 0.2s, background 0.2s; position: relative; } .ds-nav-item:hover { background: rgba(255,255,255,0.05); } .ds-nav-item.active { color: #9f7aea; } .ds-nav-item.active::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); height: 32px; width: 2px; background: #9f7aea; }"
},
{
"name": "Dropdown Menu",
"kind": "custom",
"refersTo": "dropdown",
"description": "Custom dropdown with dark background",
"html": "<div class=\"ds-dropdown\"><button>Menu</button><div class=\"ds-dropdown-content\"><button>Option</button></div></div>",
"css": ".ds-dropdown { position: relative; } .ds-dropdown-content { position: absolute; top: 100%; right: 0; background: #1a1a1a; box-shadow: 0 8px 24px rgba(0,0,0,0.4); padding: 4px 0; display: none; min-width: 160px; } .ds-dropdown-content button { display: block; width: 100%; padding: 10px 20px; text-align: left; background: none; border: none; color: #f8f9fa; } .ds-dropdown-content button:hover { background: rgba(255,255,255,0.1); }"
}
],
"narrative": {
"northStar": "The Personal Theater",
"overview": "A dark, intimate interface for watching anime. Built for long viewing sessions in low-light environments. The aesthetic rejects the loud, gamified look of mainstream anime trackers. No flashy animations, no glassmorphism, no gradient text.",
"keyCharacteristics": [
"Dark by default; light mode secondary",
"Minimal chrome; content first",
"Purple accent ≤10% of any screen",
"No rounded corners",
"DM Sans system fonts"
],
"rules": [
{ "name": "The One Accent Rule", "body": "Purple appears on ≤10% of any given screen. Its rarity is the point.", "section": "colors" },
{ "name": "The Weight Contrast Rule", "body": "Headings use font-semibold (600), body uses font-normal (400). Avoid flat weight hierarchies.", "section": "typography" },
{ "name": "The Flat-By-Default Rule", "body": "Surfaces are flat at rest. No shadows. Depth conveyed through tonal layering.", "section": "elevation" }
],
"dos": [
"Do use accent purple for primary actions and active states only",
"Do keep interfaces dark by default",
"Do use weight contrast for hierarchy",
"Do reveal detail on hover",
"Do include back buttons on detail pages"
],
"donts": [
"Don't use rounded corners anywhere",
"Don't use color to differentiate toast types",
"Don't use gradient text",
"Don't use glassmorphism",
"Don't use hero metric layouts",
"Don't use identical card grids with no variation",
"Don't use modals as first thought",
"Don't use side-stripe borders",
"Don't use green accent—violet is the one and only"
]
}
}