algorithmic-color-pale…
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
Sticky headers, bottom toolbars, floating action buttons and pinned table headers. Use when deciding what stays on screen while the user scrolls.
Claude Code
$ npx -y skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements --agent claude-code
Codex
$ npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a codex -y
Cursor
$ npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a cursor -y
Gemini CLI
$ npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a gemini-cli -y
GitHub Copilot
$ npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a github-copilot -y
OpenCode
$ npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a opencode -y
Windsurf
$ npx skills add dembrandt/dembrandt-skills --skill sticky-and-fixed-elements -a windsurf -y
name: sticky-and-fixed-elements
description: Sticky headers, bottom toolbars, floating action buttons and pinned table headers. Use when deciding what stays on screen while the user scrolls.
metadata:
priority: 6
pathPatterns:
- "**/*.css"
- "**/*.scss"
- "components/**"
- "src/components/**"
- "**/*.tsx"
- "**/*.jsx"
- "design-system/**"
promptSignals:
phrases:
- "sticky"
- "fixed"
- "position: fixed"
- "position: sticky"
- "toolbar"
- "bottom bar"
- "floating"
- "persistent header"
retrieval:
aliases:
- sticky header
- fixed toolbar
- bottom navigation
- floating action button
- sticky table header
- persistent UI
intents:
- keep header visible on scroll
- design a bottom toolbar
- add a floating action button
- make table headers sticky
- decide between sticky and fixed
examples:
- should the header be sticky or fixed
- design a bottom toolbar for mobile
- keep this toolbar visible while scrolling| Property | Behaviour | Use for | |---|---|---| | `position: fixed` | Removed from document flow. Always stays at the same viewport position regardless of scroll or parent. | Global navigation header, bottom toolbar, floating action button | | `position: sticky` | Stays in document flow until it hits its scroll threshold, then locks in place. Returns to flow when parent scrolls past. | Table column headers, section headings in a long list, in-page toolbars within a scroll container |
**Prefer `sticky` over `fixed`** when the element belongs to a specific section or scroll context. Fixed elements sit above everything and affect the entire viewport — use them only for truly global UI.
The global navigation header is the most common fixed element. It should:
.site-header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: var(--header-height);
background: var(--color-surface);
box-shadow: var(--shadow-sm);
z-index: var(--z-header);
}Compensate for the fixed header with matching top padding on the page body:
body { padding-top: var(--header-height); }On mobile, the bottom of the screen is the most reachable area with one thumb. A persistent bottom toolbar is the natural home for:
Bottom toolbars should:
On desktop, bottom toolbars are uncommon. Status bars, editor toolbars, and command palettes are the desktop equivalent — these are typically `position: fixed` at the bottom or `position: sticky` within their scroll container.
For data tables inside a scroll container, sticky column headers prevent the user from losing track of what each column means.
thead th {
position: sticky;
top: 0;
background: var(--color-surface);
z-index: 1;
}If the table also has a sticky first column (for row identifiers), the top-left cell needs both `top: 0` and `left: 0`, and a higher `z-index` to sit above both the header row and the sticky column.
Sticky and fixed elements create stacking context. Define z-index as named tokens, not arbitrary numbers:
--z-base: 0; --z-dropdown: 100; --z-sticky: 200; --z-header: 300; --z-modal: 400; --z-toast: 500;
Every fixed or sticky element must declare its z-index explicitly using a token. Avoid ad-hoc values like `z-index: 9999` — they signal an unmanaged stacking context and will eventually conflict.
Each fixed layer removes space from the content area and adds visual complexity. A page should rarely need more than:
A fixed header + fixed bottom toolbar + floating button + sticky sidebar + sticky table header all simultaneously is too many layers. Consolidate where possible.
Enterprise UX secrets, now built into your AI agent. Your agent writes the component in seconds. It does not know the modal should be a drawer, or that the grey it picked fails contrast. These skills carry that judgment: what to do, and what breaks otherwise.
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
Top bar, sidebar rail, app launcher, tenant and environment cue, status bar. Use when designing the persistent shell, a…
Product visuals must show the real product with real data. Use when building landing pages, hero sections, screenshots or demo…
Shape language across type, radius and icons carries brand personality. Use when starting a design system, picking icons or…
Rest, hover, active, focus, disabled and loading states, derived from the base colour. Use when designing buttons, links, inputs…
Rebuild a live web page 1:1 from measurement into Figma, Penpot or code, then verify it. Use when reproducing a page or checking…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.