Skip to content

Commit 521f201

Browse files
committed
feat: rename magic link sign-in to "Sign in with e-mail"
1 parent 96729e0 commit 521f201

10 files changed

Lines changed: 587 additions & 5 deletions

File tree

.impeccable/design.json

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
{
2+
"schemaVersion": 2,
3+
"generatedAt": "2026-07-06T08:45:00Z",
4+
"title": "Design System: codebar Auth",
5+
"extensions": {
6+
"colorMeta": {
7+
"primary-btn": { "role": "primary", "displayName": "Trust Blue", "canonical": "#1a6cb3", "tonalRamp": ["#0a2e4f", "#0f4775", "#145994", "#1a6cb3", "#3a8ad0", "#6aa9e0", "#9fc8ef", "#d4e6f8"] },
8+
"brand-blue": { "role": "secondary", "displayName": "Brand Blue", "canonical": "#4bafff", "tonalRamp": ["#1a4a7a", "#2e6ea8", "#3a8ad0", "#4bafff", "#72bfff", "#9acfff", "#c2dfff", "#e6f3ff"] },
9+
"brand-green": { "role": "secondary", "displayName": "Brand Green", "canonical": "#19f3be", "tonalRamp": ["#0a5c47", "#0d8a6e", "#10b892", "#19f3be", "#4df5cd", "#80f8dc", "#b3faea", "#e6fdf7"] },
10+
"brand-magenta": { "role": "tertiary", "displayName": "Brand Magenta", "canonical": "#ff036a", "tonalRamp": ["#8a0036", "#b80048", "#e0005a", "#ff036a", "#ff3d89", "#ff70a7", "#ffa3c5", "#ffd6e5"] }
11+
},
12+
"typographyMeta": {
13+
"body": { "displayName": "Body", "purpose": "All body text, paragraphs, form content" }
14+
},
15+
"shadows": [],
16+
"motion": [
17+
{ "name": "btn-hover", "value": "background-color 0.15s ease-in-out", "purpose": "Button hover/focus state transitions" }
18+
],
19+
"breakpoints": [
20+
{ "name": "sm", "value": "576px" },
21+
{ "name": "md", "value": "768px" },
22+
{ "name": "lg", "value": "992px" }
23+
]
24+
},
25+
"components": [
26+
{
27+
"name": "Primary Button",
28+
"kind": "button",
29+
"refersTo": "button-primary",
30+
"description": "Primary call-to-action. Sign in, submit, confirm.",
31+
"html": "<button class=\"ds-btn-primary\">Sign In</button>",
32+
"css": ".ds-btn-primary { background: #1a6cb3; color: #fff; border: none; padding: 6px 12px; border-radius: 6px; font-family: 'Open Sans', system-ui, sans-serif; font-weight: 600; font-size: 1rem; transition: background-color 0.15s ease-in-out; } .ds-btn-primary:hover { background: #145994; } .ds-btn-primary:active { background: #0f4775; }"
33+
},
34+
{
35+
"name": "Outline Button",
36+
"kind": "button",
37+
"refersTo": "button-outline",
38+
"description": "Secondary action. Back, cancel, navigation.",
39+
"html": "<button class=\"ds-btn-outline\">← Back</button>",
40+
"css": ".ds-btn-outline { background: transparent; color: #6c757d; border: 1px solid #6c757d; padding: 4px 8px; border-radius: 6px; font-family: 'Open Sans', system-ui, sans-serif; font-weight: 400; font-size: 0.875rem; transition: background-color 0.15s ease-in-out; } .ds-btn-outline:hover { background: #f8f9fa; color: #5a6268; }"
41+
},
42+
{
43+
"name": "Navbar",
44+
"kind": "nav",
45+
"refersTo": "nav",
46+
"description": "Top navigation bar with logo.",
47+
"html": "<nav class=\"ds-nav\"><a class=\"ds-nav-brand\" href=\"/\"><img src=\"codebar-logo.svg\" alt=\"codebar logo\" height=\"30\" /><span>auth</span></a></nav>",
48+
"css": ".ds-nav { background: #1a6cb3; padding: 8px 16px; display: flex; align-items: center; } .ds-nav-brand { display: flex; align-items: center; gap: 8px; color: #fff; text-decoration: none; font-weight: 700; font-family: 'Open Sans', system-ui, sans-serif; } .ds-nav-brand img { filter: brightness(0) invert(1); }"
49+
},
50+
{
51+
"name": "Alert — Error",
52+
"kind": "custom",
53+
"refersTo": "alert-error",
54+
"description": "Error or destructive message.",
55+
"html": "<div class=\"ds-alert-error\"><strong>Error:</strong> Something went wrong.</div>",
56+
"css": ".ds-alert-error { background: #ffccdd; color: #8a0036; border: 1px solid #ff99bb; border-radius: 8px; padding: 12px 16px; font-family: 'Open Sans', system-ui, sans-serif; font-size: 0.875rem; margin-bottom: 16px; }"
57+
},
58+
{
59+
"name": "Alert — Success",
60+
"kind": "custom",
61+
"refersTo": "alert-success",
62+
"description": "Success confirmation message.",
63+
"html": "<div class=\"ds-alert-success\">✅ Magic link sent!</div>",
64+
"css": ".ds-alert-success { background: #d1f9ee; color: #0a5c47; border: 1px solid #a3f3dd; border-radius: 8px; padding: 12px 16px; font-family: 'Open Sans', system-ui, sans-serif; font-size: 0.875rem; margin-bottom: 16px; }"
65+
},
66+
{
67+
"name": "Form Input",
68+
"kind": "input",
69+
"refersTo": "input-text",
70+
"description": "Text input field with label.",
71+
"html": "<label class=\"ds-label\">Email address</label><input class=\"ds-input\" type=\"email\" placeholder=\"you@example.com\" />",
72+
"css": ".ds-label { display: block; font-family: 'Open Sans', system-ui, sans-serif; font-weight: 400; font-size: 0.875rem; color: #212529; margin-bottom: 4px; } .ds-input { display: block; width: 100%; padding: 6px 12px; font-family: 'Open Sans', system-ui, sans-serif; font-size: 1rem; font-weight: 300; color: #212529; background: #fff; border: 1px solid #dee2e6; border-radius: 8px; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; box-sizing: border-box; } .ds-input:focus { border-color: #86b7fe; outline: 0; box-shadow: 0 0 0 0.25rem rgba(13,110,253,.25); }"
73+
},
74+
{
75+
"name": "Card with Accent Header",
76+
"kind": "card",
77+
"refersTo": "card-accent",
78+
"description": "Data surface with magenta header accent.",
79+
"html": "<div class=\"ds-card\"><div class=\"ds-card-header\"><h3>User Information</h3></div><div class=\"ds-card-body\"><dl><dt>Name</dt><dd>Alex</dd><dt>Email</dt><dd>alex@example.com</dd></dl></div></div>",
80+
"css": ".ds-card { background: #fff; border: 1px solid rgba(0,0,0,0.125); border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); } .ds-card-header { padding: 12px 16px; border-bottom: 3px solid #ff036a; } .ds-card-header h3 { margin: 0; font-family: 'Open Sans', system-ui, sans-serif; font-weight: 600; font-size: 1.25rem; } .ds-card-body { padding: 16px; font-family: 'Open Sans', system-ui, sans-serif; font-weight: 300; }"
81+
},
82+
{
83+
"name": "Admin Table",
84+
"kind": "custom",
85+
"refersTo": "table-admin",
86+
"description": "Admin user list with inline role selector.",
87+
"html": "<table class=\"ds-table\"><thead><tr><th>Name</th><th>Email</th><th>Role</th></tr></thead><tbody><tr><td>Alex</td><td>alex@example.com</td><td><select class=\"ds-select\"><option>User</option><option>Admin</option></select></td></tr></tbody></table>",
88+
"css": ".ds-table { width: 100%; border-collapse: collapse; font-family: 'Open Sans', system-ui, sans-serif; font-size: 0.875rem; } .ds-table th { background: #f8f9fa; padding: 8px 12px; text-align: left; font-weight: 600; border-bottom: 2px solid #dee2e6; } .ds-table td { padding: 8px 12px; border-bottom: 1px solid #dee2e6; } .ds-table tbody tr:hover { background: #f8f9fa; } .ds-select { padding: 4px 8px; font-size: 0.875rem; border: 1px solid #dee2e6; border-radius: 6px; background: #fff; }"
89+
}
90+
],
91+
"narrative": {
92+
"northStar": "The Welcome Desk",
93+
"overview": "The auth app is a warm, unceremonious gateway — like a friendly reception desk at a community event. Users arrive to sign in, check their profile, or get a quick admin task done, then move on to what matters (the workshop). Every element should feel intentional but never demanding.",
94+
"keyCharacteristics": [
95+
"Warm but efficient: a smile and a clear direction, not small talk",
96+
"Flat and grounded: no floating cards, no shadows — Bootstrap\u2019s default flatness with subtle layering via tinted backgrounds",
97+
"Friendly and tactile: buttons feel pressable, labels are plain language, space breathes without being sparse",
98+
"Distinctively codebar: the unusual brand palette (blue, green, magenta) is used deliberately, never as decoration"
99+
],
100+
"rules": [
101+
{ "name": "The Rarity Rule", "body": "Each brand accent appears on at most one surface per page. Blue header, green success message, or magenta card accent \u2014 never two at once. Their infrequency is the point.", "section": "colors" },
102+
{ "name": "The Flat-By-Default Rule", "body": "Surfaces sit flush. No box-shadows on cards, no floating elements, no drag-and-drop affordances.", "section": "elevation" }
103+
],
104+
"dos": [
105+
"Do use the darker Trust Blue (#1a6cb3) for any interactive surface (buttons, nav) \u2014 it passes WCAG AA with white text",
106+
"Do reserve the brand accent colours (blue #4bafff, green #19f3be, magenta #ff036a) for tinted backgrounds and decorative borders only",
107+
"Do keep pages flat \u2014 no card shadows, no floating elements, no drag-and-drop",
108+
"Do use plain-language labels on forms (\u201cEmail address\u201d, not \u201cE-mail\u201d)",
109+
"Do use the magenta card-header accent to distinguish data surfaces from content surfaces"
110+
],
111+
"donts": [
112+
"Don\u2019t use brand accent colours as text or button backgrounds on white \u2014 they fail contrast",
113+
"Don\u2019t add corporate SaaS patterns (dark sidebars, metric dashboards, status badges)",
114+
"Don\u2019t use AI-slop patterns: gradient text, glassmorphism, hero-metric templates, generic card grids",
115+
"Don\u2019t nest cards \u2014 one level of card depth is the limit",
116+
"Don\u2019t use border-left greater than 1px as a coloured accent stripe on cards or alerts",
117+
"Don\u2019t use em dashes in UX copy",
118+
"Don\u2019t render the data-bs-theme as light \u2014 use auto to respect OS preference"
119+
]
120+
}
121+
}

DESIGN.md

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
---
2+
name: codebar Auth
3+
description: Authentication gateway for codebar workshops
4+
colors:
5+
primary-btn: "#1a6cb3"
6+
brand-blue: "#4bafff"
7+
brand-green: "#19f3be"
8+
brand-magenta: "#ff036a"
9+
neutral-bg: "#ffffff"
10+
neutral-text: "#212529"
11+
typography:
12+
body:
13+
fontFamily: "Open Sans, system-ui, -apple-system, sans-serif"
14+
fontSize: "1rem"
15+
fontWeight: 300
16+
rounded:
17+
sm: "6px"
18+
md: "8px"
19+
lg: "12px"
20+
spacing:
21+
xs: "4px"
22+
sm: "8px"
23+
md: "16px"
24+
lg: "24px"
25+
components:
26+
button-primary:
27+
backgroundColor: "{colors.primary-btn}"
28+
textColor: "#fff"
29+
rounded: "{rounded.sm}"
30+
padding: "6px 12px"
31+
button-primary-hover:
32+
backgroundColor: "#145994"
33+
button-primary-active:
34+
backgroundColor: "#0f4775"
35+
nav:
36+
backgroundColor: "{colors.primary-btn}"
37+
textColor: "#fff"
38+
card-accent:
39+
borderBottom: "3px solid {colors.brand-magenta}"
40+
---
41+
42+
# Design System: codebar Auth
43+
44+
## 1. Overview
45+
46+
**Creative North Star: "The Welcome Desk"**
47+
48+
The auth app is a warm, unceremonious gateway — like a friendly reception desk at a community event. Users arrive to sign in, check their profile, or get a quick admin task done, then move on to what matters (the workshop). Every element should feel intentional but never demanding.
49+
50+
**Key Characteristics:**
51+
52+
- Warm but efficient: a smile and a clear direction, not small talk
53+
- Flat and grounded: no floating cards, no shadows — Bootstrap's default flatness with subtle layering via tinted backgrounds
54+
- Friendly and tactile: buttons feel pressable, labels are plain language, space breathes without being sparse
55+
- Distinctively codebar: the unusual brand palette (blue, green, magenta) is used deliberately, never as decoration
56+
57+
## 2. Colors
58+
59+
A three-accent palette anchored by a trustworthy blue. The brand colours appear in tinted backgrounds (alerts) and as accent borders; the darker blue carries interaction surfaces (nav, primary buttons).
60+
61+
### Primary
62+
63+
- **Trust Blue** (`#1a6cb3`): Navigation bar background, primary buttons. The workhorse blue that users interact with.
64+
- **Brand Blue** (`#4bafff`): Accent only — decorative borders, secondary highlights. Never used for text or interactive surfaces (fails contrast).
65+
66+
### Secondary
67+
68+
- **Brand Green** (`#19f3be`): Success alerts, secondary accent. Used as tinted backgrounds only; too light for text or buttons on white.
69+
70+
### Tertiary
71+
72+
- **Brand Magenta** (`#ff036a`): Error/destructive alerts, card header accent stripe (`card-header-cb`). The exclamation point of the palette — used sparingly for emphasis.
73+
74+
### Neutral
75+
76+
- **Clean White** (`#ffffff`): Page background, card surfaces, alert backgrounds.
77+
- **Dark Slate** (`#212529`): Body text — Bootstrap's default dark, strong contrast.
78+
79+
### Named Rules
80+
81+
**The Rarity Rule.** Each brand accent appears on at most one surface per page. Blue header, green success message, or magenta card accent — never two at once. Their infrequency is the point.
82+
83+
## 3. Typography
84+
85+
**Body Font:** Open Sans (light 300, regular 400, semibold 600, bold 700) with system-ui fallback stack.
86+
87+
**Character:** Friendly without being casual. Open Sans at 300 weight gives a light, airy feel at body sizes while staying readable. Weight contrast (300 body, 600/700 headings) creates clear hierarchy without extra spacing.
88+
89+
### Hierarchy
90+
91+
- **Headline** (700, `1.75rem` / `28px`): Page titles (h1). Warm and grounded.
92+
- **Title** (600, `1.25rem` / `20px`): Card headers, section titles (h2-h3).
93+
- **Body** (300, `1rem` / `16px`): Paragraphs, labels, form text. 65–75ch max line length.
94+
- **Label** (400, `0.875rem` / `14px`): Form labels, small print, table headers.
95+
96+
## 4. Elevation
97+
98+
Flat by default. Depth is conveyed through tonal layering (tinted alert backgrounds, card header borders) rather than shadows. Bootstrap's default card shadow is acceptable for admin tables but should not be added elsewhere.
99+
100+
**The Flat-By-Default Rule.** Surfaces sit flush. No box-shadows on cards, no floating elements, no drag-and-drop affordances. The sole exception is Bootstrap's default `.card` shadow, which is mild enough to pass.
101+
102+
## 5. Components
103+
104+
### Buttons
105+
106+
- **Shape:** Gently rounded, 6px radius (Bootstrap `btn` default)
107+
- **Primary (Trust Blue):** `#1a6cb3` background, white text, 6px 12px padding. Hover darkens to `#145994`, active to `#0f4775`.
108+
- **Secondary/Outline:** Bootstrap `btn-outline-secondary` — grey border, inherits text colour. Used for navigation links and secondary actions.
109+
- **Danger:** Bootstrap `btn-outline-danger` — used only for logout. Red signals finality.
110+
- **Brand variants (`.btn-cb-green`, `.btn-cb-magenta`):** Available but reserved for admin contexts. Not used in main user flows.
111+
112+
### Cards
113+
114+
- **Corner Style:** 8px radius (Bootstrap `card` default)
115+
- **Background:** White (`#fff`)
116+
- **Shadow Strategy:** Bootstrap's default mild card shadow only. No additional elevation.
117+
- **Accent variant:** Add `card-header-cb` for a 3px magenta (`#ff036a`) bottom border on the header — used on profile and admin pages to distinguish data surfaces.
118+
119+
### Alerts
120+
121+
- **Shape:** Bootstrap `alert` defaults with tinted brand backgrounds
122+
- **Brand Blue alert:** Blue tint (`#d9edff`), dark navy text (`#1a4a7a`) — informational messages
123+
- **Brand Green alert:** Green tint (`#d1f9ee`), dark forest text (`#0a5c47`) — success messages
124+
- **Brand Magenta alert:** Magenta tint (`#ffccdd`), dark wine text (`#8a0036`) — error/destructive messages
125+
126+
### Inputs and Forms
127+
128+
- **Style:** Bootstrap `form-control` defaults — light grey border, white fill, 8px radius
129+
- **Focus:** Bootstrap default blue ring (`box-shadow: 0 0 0 0.25rem rgba(13,110,253,.25)`)
130+
- **Labels:** Bootstrap `form-label` — 400 weight, 14px, clear and descriptive
131+
- **Error handling:** Inline validation via Bootstrap's `is-invalid` class with magenta-tinted feedback
132+
133+
### Navigation
134+
135+
- **Style:** Fixed-top `navbar` with Trust Blue (`#1a6cb3`) background, white text, `navbar-dark` class
136+
- **Logo:** codebar SVG logo (white via `brightness(0) invert(1)`) with "auth" wordmark
137+
- **Mobile:** Bootstrap `navbar-expand-sm` — collapses to hamburger below 576px
138+
139+
### Tables (Admin)
140+
141+
- **Style:** Bootstrap `table table-hover` with `table-light` head
142+
- **Role selector:** Bootstrap `form-select form-select-sm` inline within rows
143+
- **Responsive:** Wrapped in `table-responsive` for horizontal scroll on narrow viewports
144+
145+
## 6. Do's and Don'ts
146+
147+
### Do:
148+
149+
- **Do** use the darker Trust Blue (`#1a6cb3`) for any interactive surface (buttons, nav) — it passes WCAG AA with white text
150+
- **Do** reserve the brand accent colours (blue `#4bafff`, green `#19f3be`, magenta `#ff036a`) for tinted backgrounds and decorative borders only
151+
- **Do** keep pages flat — no card shadows, no floating elements, no drag-and-drop
152+
- **Do** use plain-language labels on forms ("Email address", not "E-mail")
153+
- **Do** use the magenta card-header accent to distinguish data surfaces from content surfaces
154+
155+
### Don't:
156+
157+
- **Don't** use brand accent colours as text or button backgrounds on white — they fail contrast
158+
- **Don't** add corporate SaaS patterns (dark sidebars, metric dashboards, status badges)
159+
- **Don't** use AI-slop patterns: gradient text, glassmorphism, hero-metric templates, generic card grids
160+
- **Don't** nest cards — one level of card depth is the limit
161+
- **Don't** use `border-left` greater than 1px as a coloured accent stripe on cards or alerts
162+
- **Don't** use em dashes in UX copy
163+
- **Don't** render the `data-bs-theme` as `light` — use `auto` to respect OS preference

PRODUCT.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Product
2+
3+
## Register
4+
5+
product
6+
7+
## Users
8+
9+
Students and coaches of codebar workshops. They're here to sign in, manage their profile, or — for organisers — administer user roles. The auth app is a step on the way to something else (a workshop, their dashboard), not the destination.
10+
11+
## Product Purpose
12+
13+
Authentication gateway for codebar. Handles sign-in via GitHub OAuth and magic links, shows profile info, and provides basic admin user management. Success means users get signed in quickly without friction and move on to what they came for.
14+
15+
## Brand Personality
16+
17+
Warm and inclusive. Friendly without being twee, clear without being clinical. codebar is a charity that runs free programming workshops for underrepresented groups — the auth app should reflect that same welcoming spirit. No corporate jargon, no stock photos, no AI-generated genericism.
18+
19+
## Anti-references
20+
21+
- Corporate SaaS dashboards (dark sidebars, metric overload, grey-on-grey)
22+
- AI slop (gradient text, glassmorphism, hero-metric templates, generic card grids)
23+
- Overly serious "enterprise" anything
24+
- Any design where you can tell an AI made it without a human in the loop
25+
26+
## Design Principles
27+
28+
- **Inclusive by default** — accessible language, clear labels, generous touch targets. The auth page is often someone's first interaction with codebar's systems.
29+
- **Warmth without fluff** — friendly colours and tone, but no decoration for its own sake. This is a utility, not a marketing page.
30+
- **Direct and unceremonious** — get users signed in and out of the way. Every unnecessary element is friction.
31+
- **Distinctive not derivative** — codebar's brand colours (blue, green, magenta) are unusual for an auth app. Lean into them rather than defaulting to safe blues.
32+
33+
## Accessibility & Inclusion
34+
35+
WCAG AA minimum. Good contrast, keyboard navigable, screen-reader friendly forms. Consider users who may be new to tech — avoid jargon, use plain language in labels and error messages.

0 commit comments

Comments
 (0)