feat: port Jinja2 CSS foundation — light mode, Atkinson Hyperlegible, mobile responsive #35
No reviewers
Labels
No labels
domain:backend
domain:devops
domain:frontend
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
forgejo_admin/pal-e-docs-app!35
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "34-port-jinja2-css-foundation-into-pal-e-ap"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
reference-jinja2-base.htmlinto the SvelteKit appCloses #34
Changes
src/app.html: Added Atkinson Hyperlegible Google Fonts import, anti-flash inline stylesrc/app.css: Complete rewrite with 40+ CSS custom properties, light-mode body, mobile breakpointsrc/lib/colors.ts: Note-type colors tuned for light backgrounds (darker, more saturated)src/lib/columns.ts: Column colors tuned for light backgroundssrc/routes/+layout.svelte: Dark nav bar, light body, 48rem max-width, CSS variable colorssrc/routes/+page.svelte: Light-mode home with card grid, tags, sectionssrc/routes/notes/+page.svelte: Light-mode notes list with search, filterssrc/lib/components/NoteLayout.svelte: Light-mode note detail, TOC sidebar, child notessrc/lib/components/QuickJot.svelte: Light-mode modal, toast, form inputs via CSS varssrc/lib/components/blocks/*.svelte: All 7 block components updated for light modesrc/routes/boards/[slug]/+page.svelte: Light-mode kanban with functional drag-dropsrc/routes/dashboard/+page.svelte: Light-mode DORA dashboardsrc/routes/projects/**,repos/**,search/**,tags/**,signin/**,signout/**: All light modeTest Plan
npm run check— 0 errors, 2 pre-existing warningsnpm run lint— 0 errorsnpm run build— succeedsnpx playwright test— 32 pass, 16 fail (pre-existing auth-gated failures against live deploy, unrelated to CSS)Review Checklist
Related
plan-pal-e-docs— Phase F11Self-Review: Pass
Verification results:
npm run check: 0 errors (2 pre-existing warnings)npm run lint: 0 errorsnpm run build: succeeds#0a0a14,#0e0e18,#1a1a2e,#141420,#e94560) remain in any.sveltefileapp.html--color-bg: #fafafaand--color-link: #0366d6confirmed inapp.cssmax-width: 48remconfirmed in layoutapp.css28 files changed, 2054 additions, 641 deletions. PR is mergeable. Ready for visual QA.
PR #35 Review
Title: feat: port Jinja2 CSS foundation -- light mode, Atkinson Hyperlegible, mobile responsive
Branch:
34-port-jinja2-css-foundation-into-pal-e-ap(from issue #34)Scope: CSS-only overhaul -- 28+ files touched, 50+ CSS custom properties in
app.cssDOMAIN REVIEW
Tech stack: SvelteKit 5 / TypeScript / Tailwind v4 / CSS custom properties
CSS Architecture -- Strong
The
src/app.cssfile establishes a clean single source of truth with 50+ CSS custom properties organized into logical groups (body, links, nav, cards, tags, borders, code, tables, accents, danger, success, info, badges, autolinks, boards, modals, inputs, pills, toast). The Jinja2 design spec is correctly ported:--color-bg: #fafafa-- correct--color-text: #1a1a1a-- correct--color-link: #0366d6-- correctmax-width: 48remon main element -- correctapp.html-- correct@media (max-width: 600px)applied consistently across all pages -- correctFlash Prevention: Inline
style="background: #fafafa; color: #1a1a1a"on body inapp.htmlprevents FOUC -- intentional and correct.Tailwind v4 Integration:
@tailwindcss/viteplugin invite.config.tswith@import 'tailwindcss'inapp.css-- correct setup. Utility classes (flex, grid, gap, rounded, etc.) coexist cleanly with scoped component styles using CSS variables.Hardcoded Hex Audit:
The grep identified remaining hex values in
.sveltefiles. Categorized:#ffffor white text on colored buttons (8 instances acrossQuickJot.svelte,signin/+page.svelte,boards/[slug]/+page.svelte,notes/[slug]/edit/+page.svelte,search/+page.svelte) -- these are.btn-primary,.btn-danger,.login-submit,.mode-btn-activeclasses usingcolor: #fff. White-on-accent is always white regardless of theme, so this is defensible. However, a--color-btn-text: #fffvariable would be cleaner for future dark mode.#666fallback inCOLUMN_COLORS[col] ?? '#666'(7 inline style expressions inboards/[slug],dashboard,projects/[slug]) -- these are fallbacks for the centralizedcolumns.tsmap. Acceptable sincecolumns.tsis the source of truth.#fffin dynamic inline filter pill styles (2 instances inboards/[slug]/+page.sveltelines 696, 721) -- active state togglingcolor: {isActive ? '#fff' : color}. Same argument as #1.colors.tsandcolumns.ts-- hex values here are correct; these ARE the centralized constant files for programmatic type/column colors.Actual issue:
#666hardcoded in+layout.svelte:174--.nav-search-input::placeholder { color: #666; }should bevar(--color-text-muted)orvar(--color-nav-muted).Mobile Responsiveness: All grid layouts (
card-grid) collapse togrid-template-columns: 1frat 600px. Nav wraps correctly withflex-wrap. Board columns usescroll-snap-type: x mandatoryfor horizontal scrolling. No horizontal overflow issues detected.Board Functionality Preserved: Full board implementation intact -- drag-and-drop (desktop + touch), column collapse, type filtering, hide-done toggle, URL-synced filter state, optimistic updates, create/delete modals with focus traps, tap-to-move fallback.
Auth UI Preserved: Sign in/out pages intact. FAB renders only when authenticated. Edit button on note detail renders only when authenticated. Board item create/delete buttons gated by
isAuthenticated. QuickJot modal gated by auth.Imports and References: All imports verified clean --
$lib/colors,$lib/columns,$lib/api,$lib/sanitize,$lib/slugCache, all block components. No missing or broken references.Accessibility:
role="dialog",aria-modal="true",aria-label)role="img"andaria-label="Private note"aria-label="Create new note"BLOCKERS
None. This is a CSS-only overhaul with no new functionality requiring test coverage. No user input changes. No security path changes. No credentials in code. Auth logic is preserved, not modified.
NITS
Hardcoded
#666in layout placeholder --src/routes/+layout.svelte:174has.nav-search-input::placeholder { color: #666; }. Should bevar(--color-text-muted)to match the token system.DRY: duplicated CSS class definitions --
.btn-primaryis defined in 4 files,.form-inputin 3 files,.modal-cardin 2 files,.error-messagein 3 files,.btn-cancelin 3 files. These are identical styles copy-pasted across components. Should be extracted toapp.cssas global utility classes or a shared CSS module. Not blocking because SvelteKit scoped styles make this a conscious tradeoff, but it increases maintenance burden.#fffbutton text could use a variable -- Adding--color-btn-text: #ffftoapp.csswould make future dark mode adoption trivial and remove the 8 remaining hardcoded#fffvalues in component styles.COLUMN_COLORSfallback -- The?? '#666'fallback in inline styles (7 instances) could referencevar(--color-text-muted)instead, though this is in JS template expressions where CSS vars are less ergonomic.SOP COMPLIANCE
34-port-jinja2-css-foundation-into-pal-e-apmatches issue #34)feat: port Jinja2 CSS foundation...)PROCESS OBSERVATIONS
.btn-primarypattern is technical debt that will compound as more forms are added. Recommend a follow-up issue to extract shared form/button styles toapp.css.:rootoverride orprefers-color-schememedia query would flip the entire app. The 8 remaining#fffhardcodes are the only gap.VERDICT: APPROVED
Clean CSS-only overhaul. Jinja2 design spec correctly ported (colors, font, max-width, mobile breakpoint). All board, auth, and navigation functionality preserved. 50+ CSS custom properties provide a strong token system. Minor nits around one hardcoded placeholder color and duplicated CSS classes -- recommend follow-up issue for DRY extraction.