Q4 planning notes
Edited 12 minutes ago by Rachel.
{
"schemaVersion": 2,
"generatedAt": "2026-05-17T00:00:00Z",
"title": "Design System: bland",
"extensions": {
"colorMeta": {
"accent-500": {
"role": "primary",
"displayName": "Warm Amethyst",
"canonical": "#9d6ee8",
"hue": "263°",
"saturation": "~73%",
"lightness": "~67%",
"tonalRamp": [
"#4d2a7c",
"#5e3497",
"#7241b8",
"#8854d4",
"#9d6ee8",
"#b48ef5",
"#ccb4fb",
"#e2d7fe",
"#f1ecfe",
"#faf7ff"
]
},
"canvas": {
"role": "neutral",
"displayName": "Lifted Warm Canvas",
"canonical": "#221f21",
"tonalRamp": ["#0c090b", "#1b181a", "#221f21", "#2a2729", "#423f42", "#555259", "#747178", "#a3a1a8"]
},
"zinc-900": {
"role": "neutral",
"displayName": "Warm Chrome",
"canonical": "#1b181a",
"note": "Sidebar, header, recessed containers. Darker than canvas — chrome frames the layout."
},
"zinc-800": {
"role": "neutral",
"displayName": "Warm Elevated",
"canonical": "#2a2729",
"note": "Menus, dialogs, dropdowns, popovers, inputs. Lighter than canvas — floating feel."
},
"zinc-700": {
"role": "neutral",
"displayName": "Warm Overlay Hover",
"canonical": "#423f42",
"note": "Hover states inside overlays, borders, scrollbar thumb, overlay-surface for floating toolbars."
},
"zinc-500": {
"role": "neutral",
"displayName": "Warm Muted",
"canonical": "#747178",
"note": "Placeholder text, blockquote refs. Passes WCAG AA on canvas (~5.5:1)."
},
"zinc-300": {
"role": "neutral",
"displayName": "Editor Body",
"canonical": "#d6d4d7",
"note": "Default editor body text color."
},
"zinc-100": {
"role": "neutral",
"displayName": "Primary Body",
"canonical": "#f5f4f4",
"note": "Primary body text, heading color in editor."
},
"callout-info": {
"role": "tertiary",
"displayName": "Slate Info",
"canonical": "oklch(0.82 0.06 265)",
"hex": "#b6c8e6",
"note": "Low-chroma cool slate for :::info callouts. Tuned for astigmatism comfort."
},
"callout-tip": {
"role": "tertiary",
"displayName": "Pale Amethyst Tip",
"canonical": "oklch(0.89 0.05 295)",
"hex": "#d8c8eb",
"note": "Low-chroma amethyst-adjacent for :::tip callouts."
},
"callout-warning": {
"role": "tertiary",
"displayName": "Muted Warm Gold",
"canonical": "oklch(0.82 0.07 62)",
"hex": "#e2c598",
"note": "Muted gold for :::warning callouts. Deliberately not a fire alarm."
}
},
"typographyMeta": {
"display": {
"displayName": "Display (Bricolage)",
"purpose": "Editor H1 / page title only. Reserved for hero sizes — overuse dilutes its character."
},
"headline": {
"displayName": "Headline (Outfit 600)",
"purpose": "Editor H2. Tighter tracking for visual weight at 1.5rem."
},
"title": {
"displayName": "Title (Outfit 600)",
"purpose": "Editor H3, card titles."
},
"body": {
"displayName": "Body (Outfit 450)",
"purpose": "Editor prose. The 450 weight and 1.7 line-height are non-negotiable — primary halation defense for astigmatic readers."
},
"label": {
"displayName": "Label (Outfit 500, wide tracking)",
"purpose": "Overlines, meta labels, caption text. Often uppercase."
},
"mono": {
"displayName": "Mono (JetBrains Mono)",
"purpose": "Code only — inline or block. Never extend to nav, headings, or body."
}
},
"shadows": [
{
"name": "overlay-sm",
"value": "0 1px 2px 0 rgb(0 0 0 / 0.20)",
"purpose": "Subtle drop under floating toolbars, dropdowns, drag handles. Tailwind shadow-sm class."
},
{
"name": "dialog-2xl",
"value": "0 25px 50px -12px rgb(0 0 0 / 0.50)",
"purpose": "Reserved for modals/dialogs only. Tailwind shadow-2xl class."
}
],
"motion": [
{
"name": "default-transition",
"value": "75ms",
"purpose": "Default transition-duration override. Scope to specific properties — never transition-all."
},
{
"name": "ease-snappy",
"value": "cubic-bezier(0.16, 1, 0.3, 1)",
"purpose": "Out-quart curve for scale-fade entrances. Strong initial motion, soft landing."
},
{
"name": "fade-in",
"value": "fade-in 0.4s ease-out both",
"purpose": "Main content areas on page load. Opacity 0 → 1."
},
{
"name": "slide-up",
"value": "slide-up 0.35s ease-out both",
"purpose": "Page wrappers, modal/dialog entrances, toast entrance. Opacity 0 + translateY(12px) → visible."
},
{
"name": "scale-fade",
"value": "scale-fade 0.3s cubic-bezier(0.16, 1, 0.3, 1) both",
"purpose": "Cards, popovers, dropdown menus. Opacity 0 + scale(0.96) → visible — scale implies origin."
},
{
"name": "shimmer",
"value": "shimmer 1.5s ease-in-out infinite",
"purpose": "Loading skeleton placeholder."
},
{
"name": "caret-blink",
"value": "caret-blink 1.1s steps(2, start) infinite",
"purpose": "Editor caret. Slower than OS default for calmer rhythm."
},
{
"name": "stagger-step",
"value": "60ms",
"purpose": "Staggered reveal delay per sibling. Cap at 8 items (480ms total)."
}
],
"breakpoints": [
{ "name": "sm", "value": "640px" },
{ "name": "md", "value": "768px" },
{ "name": "lg", "value": "1024px" },
{ "name": "xl", "value": "1280px" }
]
},
"components": [
{
"name": "Primary Button",
"kind": "button",
"refersTo": "button-primary",
"description": "Solid accent CTA. Never gradient.",
"html": "",
"css": ".ds-btn-primary { background: #8854d4; color: #fff; font-family: 'Outfit Variable', ui-sans-serif, system-ui, sans-serif; font-weight: 500; font-size: 0.875rem; padding: 0.5rem 1rem; border: none; border-radius: 0.5rem; cursor: pointer; transition: background-color 75ms, transform 75ms; } .ds-btn-primary:hover { background: #9d6ee8; } .ds-btn-primary:active { transform: scale(0.98); } .ds-btn-primary:focus-visible { outline: 2px solid rgba(157, 110, 232, 0.5); outline-offset: 2px; }"
},
{
"name": "Secondary Button",
"kind": "button",
"refersTo": "button-secondary",
"description": "Subtle elevated surface, neutral border. Never accent.",
"html": "",
"css": ".ds-btn-secondary { background: rgba(42, 39, 41, 0.6); color: #d6d4d7; font-family: 'Outfit Variable', ui-sans-serif, system-ui, sans-serif; font-weight: 500; font-size: 0.875rem; padding: 0.5rem 1rem; border: 1px solid rgba(66, 63, 66, 0.6); border-radius: 0.5rem; cursor: pointer; transition: background-color 75ms, transform 75ms; } .ds-btn-secondary:hover { background: rgba(66, 63, 66, 0.6); color: #f5f4f4; } .ds-btn-secondary:active { transform: scale(0.98); }"
},
{
"name": "Ghost Button",
"kind": "button",
"refersTo": "button-ghost",
"description": "No border, no rest background. Used for editor toolbar utility actions.",
"html": "",
"css": ".ds-btn-ghost { background: transparent; color: #a3a1a8; padding: 0.375rem 0.75rem; border: none; border-radius: 0.5rem; cursor: pointer; transition: background-color 75ms, color 75ms, transform 75ms; display: inline-flex; align-items: center; justify-content: center; } .ds-btn-ghost:hover { background: rgba(42, 39, 41, 0.7); color: #f5f4f4; } .ds-btn-ghost:active { transform: scale(0.97); }"
},
{
"name": "Card (default)",
"kind": "card",
"refersTo": "card-default",
"description": "Surface for actual content (pages, attachments). Not for marketing copy.",
"html": " Edited 12 minutes ago by Rachel.Q4 planning notes
bland is a dark notes editor for developers who live in dark IDEs all day. The canvas is #221f21 — lifted, never near-black. Halation is the reason.
Comfort over contrast. The interface should be comfortable for hours, not minutes.