Back to Super Productivity

Styling Guide

docs/styling-guide.md

18.4.48.7 KB
Original Source

Styling Guide

Rules

  • All visual styling must use CSS variables from src/styles/_css-variables.scss — never hardcode colors, spacing, shadows, transitions, or z-index.
  • Positioning/layout is fine as plain CSS — flexbox, grid, display, position, dimensions.
  • Check src/app/ui/ first before creating new styled elements — 40+ reusable components exist.
  • Component SCSS should be minimal — shared styles belong in src/styles/components/ or as a mixin.
  • Material overlay components (menus, dialogs, tooltips) render outside component scope — style them in src/styles/components/ and add a comment in the component pointing there.

Anti-Patterns

AvoidDo Instead
Hardcoded colors (#fff, red)CSS variables (--text-color, --card-bg, --color-danger)
Hardcoded spacing (16px, 1rem)Spacing variables (--s2, --s, --s-half)
Hardcoded shadowsElevation variables (--whiteframe-shadow-*dp, --md-sys-level*)
Hardcoded transitions/durationsTransition variables (--transition-standard, --transition-duration-*)
Custom z-index valuesZ-index variables (--z-main-header, --z-backdrop, etc.)
New styled elements without checkingCheck src/app/ui/ for existing reusable components first

Key Files

FilePurpose
src/styles/_css-variables.scssAll CSS custom properties (design tokens)
src/styles/themes.scssMaterial theme setup + utility classes
src/styles/page.scssGlobal page/body styles
src/styles/util.scssUtility classes
src/styles/components/Global component styles (Material overrides, shared patterns)
src/styles/mixins/Reusable SCSS mixins
src/app/ui/40+ reusable Angular UI components

Spacing Variables (8px Grid)

VariableValueVariableValue
--s-quarter2px--s432px
--s-half4px--s540px
--s8px--s648px
--s216px--s756px
--s324px--s864px
scss
// ✅ Good
padding: var(--s2) var(--s3);
gap: var(--s-half);

// ❌ Bad
padding: 16px 24px;
gap: 4px;

Color Variables

Use caseVariables
Text--text-color, --text-color-muted, --text-color-most-intense
Backgrounds--bg, --card-bg, --task-c-bg, --sub-task-c-bg
Semantic--color-success (#4caf50), --color-warning (#ff9800), --color-danger (#f44336)
Material palette--palette-primary-500, --palette-accent-500, --palette-warn-500 (100–900)
Overlays--c-dark-10 through --c-dark-90, --c-light-05 through --c-light-90
Alpha coefficients--border-alpha (0.12), --overlay-alpha (0.1), --muted-alpha (0.6), --separator-alpha (0.3)

Theme-Specific Values

Light theme sets: --bg: #f8f8f7, --card-bg: #ffffff, --text-color: rgb(44, 44, 44) Dark theme sets: --bg: #131314, --card-bg: var(--dark3), --text-color: rgb(230, 230, 230)

Dark elevation colors: --dark0 (rgb(0,0,0)) through --dark24 (rgb(56,56,56))

Theme-Specific Overrides in Components

scss
@include darkTheme() {
  /* dark-only styles */
}
@include lightTheme() {
  /* light-only styles */
}

Mixins are in src/styles/mixins/_theming.scss.

Shadows & Elevation

  • --whiteframe-shadow-1dp through --whiteframe-shadow-24dp — classic Material shadows
  • --md-sys-level1 through --md-sys-level5 — Material Design 3 style

Transitions & Animations

TypeVariables
Shorthands--transition-fast, --transition-standard, --transition-enter, --transition-leave
Durations--transition-duration-xs (90ms), -s (150ms), -m (225ms), -l (375ms)
Additional--transition-duration-enter (225ms), --transition-duration-leave (195ms), --page-transition-duration (225ms)
Timing--ani-standard-timing, --ani-enter-timing, --ani-leave-timing, --ani-sharp-timing

When migrating hardcoded durations, pick the nearest bucket — up to ~15% drift is acceptable for UI transitions.

Focus Ring

Keyboard-accessibility tokens for custom interactive elements. Material components keep their own focus treatment; use these for non-Material buttons, cards, and custom controls.

VariableValue
--focus-ring-width2px
--focus-ring-offset2px
--focus-ring-colorvar(--palette-primary-500)

Quickest adoption — add the .focus-ring utility class from util.scss, which applies an outline on :focus-visible only (so it doesn't fire on mouse clicks).

scss
// opt-in per-element
.my-button:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
}

Z-Index Layers

VariableValuePurpose
--z-check-done11Task done checkbox
--z-main-header12Main header
--z-task-title-focus32Focused task title
--z-mobile-bottom-nav50Mobile bottom navigation
--z-side-nav60Side navigation
--z-backdrop222Backdrop overlay
--z-add-task-bar999Add task bar
--z-search-bar999Search bar
--z-tour1001Tour overlay

Layout Variables

VariableValueNotes
--component-max-width800px900–1000px on iPad
--side-nav-width200px
--side-nav-width-l400px
--bar-height-large56px
--bar-height48px
--bar-height-small40px

Responsive Breakpoints

Available as CSS vars (--layout-xxxs through --layout-xl) and as SCSS mixins in src/styles/mixins/_media-queries.scss:

BreakpointValue
xxxs398px
xxs450px
xs600px
s800px
m1000px
l1200px
xl2000px

Utility Classes

Defined in src/styles/util.scss and src/styles/themes.scss:

  • Layout: .center-wrapper, .mw (max-width container)
  • Responsive: .hide-xs, .hide-xxs, .hide-gt-sm
  • Input: .show-only-on-touch-primary, .show-only-on-mouse-primary
  • Theme: .show-dark-only, .show-light-only
  • Color: .bg-primary, .bgc-accent, .color-primary, .bg-success, .bg-warning, .bg-danger
  • Effects: .milk-glass (backdrop blur)

Global Component Styles

Located in src/styles/components/, these are needed for elements that render outside component scope:

  • _overwrite-material.scss — Material component customizations
  • _customizer-menu.scss, backdrop.scss, bottom-panel.scss
  • markdown.scss, mentions.scss, table.scss
  • fab-wrapper.scss, wrap-buttons.scss, multi-btn-wrapper.scss
  • planner-shared.scss, formly-rows.scss, scrollbars.scss