From hl-design-systems
- **Minimum size:** 44x44px for all interactive elements.
npx claudepluginhub horizenlabs/hl-claude-marketplace --plugin hl-design-systemsdesign-systems/horizen-design-system/references/# Horizen Mobile UX — Full Reference ## Touch Targets - **Minimum size:** 44x44px for all interactive elements. - **Minimum spacing:** 8px between adjacent touch targets. - **Icon-only buttons:** Ensure 44x44px hit area even if icon is smaller (use padding). - **Links in text:** Increase line-height to 1.6+ to prevent accidental taps on adjacent lines. - **Close buttons:** 44x44px minimum, positioned with at least 8px from edges. ## Mobile Typography Scale | Style | Desktop | Tablet | Mobile | |---|---|---|---| | Main Title (Display XL) | 127px | 72px | 48px | | Display LG | 96px | 60px...
| Style | Desktop | Tablet | Mobile |
|---|---|---|---|
| Main Title (Display XL) | 127px | 72px | 48px |
| Display LG | 96px | 60px | 40px |
| Display MD | 72px | 48px | 34px |
| H1 | 60px | 40px | 32px |
| H2 | 48px | 34px | 28px |
| H3 | 40px | 30px | 24px |
| H4 | 34px | 28px | 22px |
| Body LG | 20px | 18px | 18px |
| Body MD | 16px | 16px | 16px |
| Body SM | 14px | 14px | 14px |
All headings remain Funnel Display 700. Line heights increase slightly on mobile for readability.
Trigger: Hamburger icon (24px, 3 bars), 44x44px touch target, top-right of nav.
Fullscreen Overlay:
.mobile-nav {
position: fixed;
inset: 0;
background: var(--hz-black);
z-index: var(--hz-z-modal);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
animation: fadeIn var(--hz-transition-normal);
}
body { overflow: hidden } when overlay is open.--hz-grey-dark color.width: 100%).14px 24px (slightly taller for easier tapping).position: fixed; bottom: 0; padding: 16px; background: white; border-top: 1px solid --hz-line-grey.var(--hz-space-4) (16px) instead of 24px desktop.border-radius: 12px 12px 0 0.overflow-x: auto; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch.inputmode attributes:
inputmode="email" for email fieldsinputmode="tel" for phoneinputmode="numeric" for numbersinputmode="decimal" for amountsautocapitalize="off" for emails, addresses, usernames.--hz-error..bottom-sheet {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: var(--hz-white);
border-radius: 16px 16px 0 0;
max-height: 85vh;
overflow-y: auto;
padding: var(--hz-space-6) var(--hz-space-4);
z-index: var(--hz-z-modal);
animation: slideUp var(--hz-transition-normal);
}
width: 40px; height: 4px; border-radius: 2px; background: --hz-line-grey; margin: 0 auto 16px.rgba(3, 14, 36, 0.6)).transform: translateY(100%) to translateY(0), 300ms ease.padding-bottom: env(safe-area-inset-bottom).Option A — Horizontal Scroll:
.table-wrapper {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
border-radius: var(--hz-radius-md);
border: 1px solid var(--hz-line-grey);
}
Add horizontal scroll indicator (fade edges or scroll hint).
Option B — Card Collapse: Each row becomes a card on mobile with label-value pairs stacked:
.table-card {
padding: var(--hz-space-4);
border: 1px solid var(--hz-line-grey);
border-radius: var(--hz-radius-md);
margin-bottom: var(--hz-space-3);
}
.table-card-row {
display: flex;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid var(--hz-grey);
}
| Token | Desktop | Tablet | Mobile |
|---|---|---|---|
| Section vertical | 64px | 48px | 32px |
| Section horizontal | 40px | 24px | 16px |
| Card padding | 24px | 24px | 16px |
| Card gap | 24px | 16px | 12px |
| Component gap | 16px | 12px | 8px |
| Grid gap | 24px | 16px | 16px |
scroll-snap-type: x mandatory; scroll-snap-align: start on children.transform: translateX().--hz-yellow color, 40px threshold.touch-action: pan-x pan-y on containers), enabled on images.<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
:root {
--hz-safe-top: env(safe-area-inset-top);
--hz-safe-bottom: env(safe-area-inset-bottom);
--hz-safe-left: env(safe-area-inset-left);
--hz-safe-right: env(safe-area-inset-right);
}
.nav { padding-top: var(--hz-safe-top); }
.bottom-bar { padding-bottom: var(--hz-safe-bottom); }
viewport-fit=cover to extend into safe areas where appropriate.loading="lazy" on all below-fold images.prefers-reduced-motion: reduce — replace slide/scale animations with simple opacity fades.will-change: transform only during active animations, remove after.font-display: swap for both Funnel Display and Proxima Nova.passive: true on scroll/touch listeners.aspect-ratio to prevent layout shifts..bottom-nav {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 56px;
background: var(--hz-white);
border-top: 1px solid var(--hz-line-grey);
display: flex;
justify-content: space-around;
align-items: center;
padding-bottom: env(safe-area-inset-bottom);
z-index: var(--hz-z-nav);
}
--hz-yellow, inactive in --hz-grey-dark.padding-bottom: env(safe-area-inset-bottom).var(--hz-z-nav) (200)..toast {
position: fixed;
bottom: 80px; /* above bottom nav */
left: 16px;
right: 16px;
background: var(--hz-black);
color: var(--hz-white);
padding: 14px 16px;
border-radius: var(--hz-radius-md);
display: flex;
align-items: center;
justify-content: space-between;
z-index: var(--hz-z-toast);
animation: slideUp var(--hz-transition-normal);
}
.skeleton {
background: var(--hz-grey);
border-radius: var(--hz-radius-md);
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% { background-position: -200% 0; }
100% { background-position: 200% 0; }
}
.skeleton {
background: linear-gradient(
90deg,
var(--hz-grey) 25%,
#e8e8e8 50%,
var(--hz-grey) 75%
);
background-size: 200% 100%;
}
border-radius: 4px for text lines, 50% for avatars, 12px for cards.--hz-yellow colored, 32px, spin animation.min-width matches content)..search-overlay {
position: fixed;
inset: 0;
background: var(--hz-white);
z-index: var(--hz-z-modal);
padding: var(--hz-safe-top) 16px 16px;
}
--hz-grey background, 8px radius.--hz-blue.enterkeyhint="search" on input.@media (orientation: landscape) and (max-height: 500px) {
.section { padding: var(--hz-space-4) var(--hz-space-6); }
.hero { min-height: auto; }
.modal { max-height: 95vh; }
.bottom-sheet { max-height: 90vh; }
}
min-height: auto instead of 100vh in landscape.screen-orientation: portrait..header {
position: sticky;
top: 0;
z-index: var(--hz-z-sticky);
transition: all var(--hz-transition-fast);
}
.header-collapsed {
height: 48px;
box-shadow: var(--hz-shadow-sm);
}
.header-expanded {
height: 72px;
}
--hz-black (no transparency) to prevent content bleed.aria-live="polite" for toasts, loading states, dynamic content.prefers-reduced-motion: reduce:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
outline: 2px solid var(--hz-yellow); outline-offset: 2px on :focus-visible.<nav>, <main>, <header>, <footer>, <aside> for screen reader navigation..fab {
position: fixed;
bottom: 24px;
right: 24px;
width: 56px;
height: 56px;
border-radius: 50%;
background: var(--hz-yellow);
color: var(--hz-black);
display: flex;
align-items: center;
justify-content: center;
box-shadow: var(--hz-shadow-lg);
border: none;
cursor: pointer;
z-index: var(--hz-z-nav);
transition: all var(--hz-transition-fast);
}
.fab:hover {
background: var(--hz-yellow-hover);
box-shadow: var(--hz-shadow-xl);
transform: scale(1.05);
}
.fab:active {
transform: scale(0.95);
background: var(--hz-yellow-active);
}
--hz-black color.bottom: 80px (56px nav + 24px gap)..bubble-user {
background: var(--hz-yellow-muted);
color: var(--hz-black);
border-radius: 16px 16px 4px 16px;
margin-left: auto; /* right-aligned */
max-width: 80%;
padding: 12px 16px;
}
.bubble-agent {
background: var(--hz-grey);
color: var(--hz-black);
border-radius: 16px 16px 16px 4px;
margin-right: auto; /* left-aligned */
max-width: 80%;
padding: 12px 16px;
}
--hz-yellow-muted background, rounded with bottom-right flat corner.--hz-grey background, rounded with bottom-left flat corner.--hz-grey-dark, below bubble, aligned to bubble side.--hz-grey-dark color, inside agent bubble shape.
.thinking-dot {
width: 8px; height: 8px;
border-radius: 50%;
background: var(--hz-grey-dark);
animation: bounce 1.4s infinite;
}
--hz-success) dot, bottom-right of agent avatar.--hz-line-grey) dot, same position.--hz-grey-dark, with animated dots.| character at end of text, animation: blink 1s step-end infinite..code-block {
background: var(--hz-black);
color: var(--hz-white);
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 14px;
line-height: 1.5;
padding: 16px;
border-radius: var(--hz-radius-md);
overflow-x: auto;
margin: 8px 0;
}
.code-block-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 16px;
background: var(--hz-black-light);
border-radius: 8px 8px 0 0;
font-size: 12px;
color: var(--hz-grey-dark);
}
-webkit-overflow-scrolling: touch..chat-container {
display: flex;
flex-direction: column;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: 16px;
gap: 4px;
}
--hz-yellow bg.--hz-grey-dark, with horizontal lines: --- March 18, 2026 ---..prompt-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 12px 16px;
padding-bottom: calc(12px + env(safe-area-inset-bottom));
background: var(--hz-white);
border-top: 1px solid var(--hz-line-grey);
display: flex;
align-items: flex-end;
gap: 8px;
z-index: var(--hz-z-nav);
}
.prompt-textarea {
flex: 1;
min-height: 40px;
max-height: 120px;
padding: 10px 16px;
border: 1px solid var(--hz-line-grey);
border-radius: 12px;
font-family: 'Proxima Nova', sans-serif;
font-size: 16px;
resize: none;
overflow-y: auto;
}
.prompt-send {
width: 40px;
height: 40px;
border-radius: 50%;
background: var(--hz-yellow);
color: var(--hz-black);
border: none;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
env(safe-area-inset-bottom)..action-card {
background: var(--hz-white);
border: 1px solid var(--hz-line-grey);
border-radius: var(--hz-radius-md);
padding: 12px 16px;
display: flex;
align-items: center;
gap: 12px;
margin: 8px 0;
}
--hz-black.--hz-grey-dark.background: --hz-grey, cursor pointer for detail expansion.--hz-grey-dark default.--hz-blue on hover.inputmode="text" on prompt textarea (not search, to avoid auto-suggestions).href links to open installed wallet apps directly (e.g., metamask://, cbwallet://)..wallet-option {
display: flex;
align-items: center;
gap: 12px;
padding: 16px;
border-bottom: 1px solid var(--hz-line-grey);
}
.wallet-icon { width: 40px; height: 40px; border-radius: 10px; }
.wallet-name { font-size: 16px; font-weight: 600; }
0x12...5678 (first 4, last 4 characters).Staking Cards:
--hz-yellow, 700 weight).Governance / Voting: