@ramtt/ui

Component library

Zero dependencies. Satoshi for everything. Every border at 0.5px. Sentence case labels. Tabular nums for data.

134Components
6Categories
0Dependencies
<12 KBBundle
MIT / Apache-2.0Satoshi only0.5px bordersOKLCH colorSentence caseTabular nums

Inputs & forms

Form controls, text inputs, selectors, and interactive input patterns.

Buttons3 components
Button

Variants

Sizes

Icon sizes

As child wrapper (asChild) — renders anchor styled as button

Rounded · Loading · Disabled

ButtonGroup

Connected

Primary + secondary

Split button (primary + dropdown)

Input + button

Nested groups (pagination + prev/next)

Vertical orientation

Button + popover trigger

Icon group · small

OAuthButton
No preview available.
Text inputs6 components
Input

Demo · with label · unit

Disabled

File input

With button

With helper text

Enter your email address.

InputGroup

Input group

Prefix · suffix · icon · combined

With prefix

https://

With icon prefix

With suffix

kg

Combined prefix + suffix

$
USD

With button action

With label (block-start addon)

@

With dropdown trigger

With spinner (loading state)

Saving…

Textarea variant (multi-line group)

script.js
Line 1, Col 1

With tooltip on addon button

Custom content (non-Input control)

0/120
InputOTP

6-digit numeric (3-3 separator)

value: ""

4-char alphanumeric · no separator

Controlled (echoes value below)

Enter your one-time password.

Fully controlled via value / onChange.

Invalid · Disabled

SearchInput
No preview available.
Textarea

Textarea

Label · count · max-length

47/500

Placeholder only

Disabled

With submit button (form composition)

ChatInput
Selection8 components
Select

Selects

NativeSelect

Default

With optgroup · multiple groups

Department picker · many groups

Invalid · Disabled

Combobox

Demo · grouped

Nutrition product

Popover-style (status picker)

Status: not set

Responsive · stacks on narrow surfaces

Filter by status

Inside a dropdown-menu row (label picker)

featureCreate a new project

Checkbox

Visible channels

Requires crank sensor

Disabled

With descriptive text (two-line label)

Radio
Primary sport
Includes swim, bike, run
Switch
Automatically sync sessions from connected devices
Enable push for training alerts and reminders
Enable power duration curve and performance modeling

Standalone (no label)

Toggle

Variants

With text label alongside icon

Sizes

ToggleGroup

Channel selector (default variant)

Time period (sm size)

Zone mode (sm, pill variant)

Tab navigation (underline variant)

Single-select (type="single" behaviour — align)

Outline look (pill variant on sand surface)

Disabled (non-interactive via aria-disabled)

Spacing · relaxed gaps between items

Filter pills (multi-select, pill variant)

Range & numeric4 components
Slider
280W
5s
1s5s15s30s1m

Plain slider (no label)

RangeSlider
Power range200350W
Zone range3070%
0%Z2Z3Z4Z5
NumberStepper
45g
0g
200g
280W
RatingInput
Leg feel
Normal
Effort
Session quality
Tap to rate
Mood (compact)
Date & time4 components
DatePicker

Demo · single date

Session date

With presets (quick offsets)

Selected:

Date range (from → to)

Training block

Range: 5/11/20265/18/2026

TimePicker
:
:
Calendar

Single date selection

May 2026
Mo
Tu
We
Th
Fr
Sa
Su

Range selection

May 2026
Mo
Tu
We
Th
Fr
Sa
Su

Non-Gregorian note · Hijri / Persian / Islamic calendars

RAMTT's Calendar renders Gregorian dates by default. For Hijri (Islamic), Persian (Jalali) or other locale calendars, wrap the Calendar in a locale provider or pass pre-converted Date values.

See docs for a hijri / jalali adapter example.

TrainingCalendar
Mon
Tue
Wed
Thu
Fri
Sat
Sun
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
TSS942
Hours15:30
Sessions8
CHO compliance69%
Plan adherence75%
Pickers & uploads4 components
ColorPicker
L57%
IconPicker
Tag

Display tags

CyclingIntervalsBuild phaseRecoveryRemovable

Tag input with suggestions

CyclingIntervals
FileUpload

File upload

Upload activity fileDrag a .fit, .gpx, or .tcx file hereor click to browse
Form wrappers5 components
Field

Vertical · description · required

We'll never share your email.

Invalid · with error

Horizontal · switch

Weekly summaries and incident alerts.

Required to continue.

Radio group · horizontal items

Subscription plan

Yearly and lifetime plans offer significant savings.

Select inside field

Select your department or area of work.

Slider inside field

Set your monthly budget ($450).

450$

Responsive layout · stacks on narrow, side-by-side on wide

Profile

Fill in your profile information.

Provide your full name for identification.

Keep it under 100 characters.

Group (2 columns) + FieldSet

Rider profile
FormField

Demo · label · required · description

Your functional threshold power

Textarea field

Tell other athletes about yourself. 280 char max.

28/280

Password field

At least 8 characters with one number.

Checkbox field · single

You must accept to continue.

Switch field

Weekly summaries and incident alerts.

On — receiving summaries

Radiogroup field

Yearly saves 15%. (Radiogroup variant.)

$9.99/month
$99.99/year
$299.99

Array field · dynamic tag list

Array of strings — add or remove items.

Complex · composite form with multiple fields

Adapter note

RAMTT's FormField is headless wrt. form library — it renders label, description, required marker, and error slot only. Drop it into react-hook-form, tanstack form, or next server actions by wiring error from your resolver and passing {...register("name")} to the inner control. The same patterns above cover rhf, tanstack, and next variants.

FormLayout

Profile

Basic information about you.

We'll never share your email.

Must be between 40-150 kg

Preferences

Label

Label variants

Primary sport
StepFlow
Sleep
Body
Mind
Fuel
Review
Mood
Good
Stress
Low
Step 3 of 5

Display & data

Cards, metrics, tables, badges, indicators, and data display components.

Cards8 components
Card
Design Workspace
Updated 12 days ago
ramtt-charts
Updated 1 day ago
RAMTT
Evidensbaseret sportsernæring.
Coaching
Planlægning af træning til mine atleter.

Card with form (create project)

Create project

Deploy your new project in one click.

MetricCard
Duration
1:28:40
Avg Power
238W
Max 904W
Avg HR
155BPM
Max 189 BPM
TSS
187
IF 0.92
Energy
1,842kJ
Form
-8 → -14
-6 loaded
Energy Zone
192gZ6
Volume
573.43K
P/E Ratio
102.13
Market Cap
$3.49T
Dividend Yield
0.44%
SettingsCard
Integrations
Connect and sync Strava and wearables.
Thresholds & Zones
FTP, LTHR, and training zone configuration.
Data Integrity
Review data quality and fix anomalies.
Athlete Profile
Personal details and preferences. No navigation.
ChartCard

Training load

CTL / ATL / TSB over time

Chart placeholder
CTL (Fitness)ATL (Fatigue)TSB (Form)

Power curve

Best efforts across all sessions

412 W+8%

Peak 5min

Chart placeholder

Bar chart · axis-only demo

X-axis labels, no grid, no tooltip

JanFebMarAprMayJun

Bar chart · with grid lines

Horizontal grid lines, no axis labels

Bar chart · tooltip demo

Hover bars for tooltip values

Jan: 186 desktopFeb: 305 desktopMar: 237 desktopApr: 73 desktopMay: 209 desktopJun: 214 desktop

Native <title> tooltips on hover.

ComparisonCard

FTP progression

Current
3 months ago
FTP
285 W
267 W
+18 W
W/kg
3.96
3.71
+0.25
CP
278 W
261 W
+17 W
Reserve
22.4 kJ
18.1 kJ
+4.3 kJ

Course progression

Alpe d'Huez

12. apr 2026
3. feb 2026
15. nov 2025
Time
48:12
51:34
53:08
Avg power
312 W
289 W
275 W
CHO/h
92 g
68 g
45 g
Fuel score
87
62
41
InviteCard

Invite team member

Enter an email address to send an invitation.

Invite multiple members

Enter comma-separated email addresses.

PromoCard
New

Race predictor

ML-based race time estimation from your last 12 weeks of training.

Invite your coach

Share your dashboard and get real-time feedback on every session.

WidgetCard
Durability index
CP decay per hour of riding
Chart content goes here
Capacity chart
CP/W' progression
Capacity chart for 30d
Peak freshness
Collapsed content — click title to toggle
Zone distribution
ACWR trend
Acute:chronic workload ratio
Drag handle visible on the left
Data & tables5 components
DataRow

Market Data

Close
$110.25
Open
$110.28
High
$111.34
Low
$109.91
Volume
3,603,495

Session Readout

Power
167W-92Z2
Heart Rate
142bpm+8
Cadence
88rpm
Speed
34.2km/h
Elevation
482m
DataTable

Historical Prices

DateOpenCloseHighLowVolume
2024-01-15182.16185.92186.74181.9162.3M
2024-01-14181.27182.68183.52180.1747.1M
2024-01-13183.89181.18184.26180.9355.8M
2024-01-12184.5183.63185.15182.7341.2M
2024-01-11186.09184.4186.74183.6253.6M
DescriptionList

Athlete profile

Full name
Malte Therkildsen
Email
malte@ramt.dev
FTP
285 W
Weight
73 kg
Primary sport
Cycling
Member since
March 2026

Thresholds

Current performance markers

FTP
285 W
LTHR
172 bpm
Weight
73 kg
Max HR
195 bpm
Stat

Stat — format types

267W1:28:4095.2%42.4k

Stat — with delta

285W+12267W−18155BPM0

Stat — with label

Avg power267WAvg HR155BPM

Stat — sizes

267W267W267W

Stat — precision

268W3.96W/kg
Typography

Headings

The training treemap

Week in review

Zone distribution

Peaks by duration

Body scale

Lead text introduces a section with slightly muted emphasis.

Paragraphs use SIZE_TEXT.md (13px) with relaxed leading for readable prose in docs surfaces.

Large — 18px strong, used for callouts.
Small — 11px medium, for footnotes and metadata.

Muted — 13px n600, for helper copy.

Quote · code · list

Borders at 0.5px, weights at 550 for hierarchy, Satoshi for everything.

Use RADIUS.md for button/input radii — never raw rounded-[5px].

  • Accent-first interactive surfaces
  • Neutral sand for metadata and toggles
  • Destructive reserved for delete/error
  1. Read RULES.md
  2. Import from tokens.ts
  3. Run pnpm run audit

Table

Zone% FTPMinutes
Z1< 5518
Z256–7542
Z376–9024
Z491–10512
Progress & ranges4 components
ProgressBar

Default (43%)

Fuel progress (positive, with label)

Quality Index (warning)

Critical (negative)

SegmentedBar

Zone distribution (6 zones)

Z1 12%Z2 25%Z3 30%Z4 20%Z5 10%

Macro breakdown with legend

CHO 55%Protein 25%Fat 20%

With showLabels (percentages above)

Completed 40%In progress 35%Overdue 25%

Compact (height=4) for inline use

Pass 70%Warn 20%Fail 10%
Gauge

Ring (full circle)

42
Injury risk
86%
Glycogen
73
Readiness
62%
Fuel cov.

Bar (horizontal)

Injury risk
42
Glycogen
86%
Readiness
73
Fuel coverage
62%
ZoneBar
No preview available.
Badges & indicators6 components
Badge

Variants

Filled · accentSecondaryOutlineGhostLink badgeDestructive

Semantic colors

PositiveWarningInfoNegativeNutritionTrainingBody

Outline · muted palettes

+7.55%-0.07%Effort 7Z2Z3Z6
ColorDot

ColorDot — semantic colors, all sizes

ColorDot — with labels

CompliantMissedPartial

ColorDot — hollow ring

ConnectedSyncingDisconnected

ColorDot — vertical bar

ConnectedSyncingDisconnected

ColorDot — pulse (live status)

ConnectedSyncingDisconnected
StatusIndicator

StatusIndicator — all states

GoodWarningCriticalNeutralUnknown

StatusIndicator — md with value

Fuel readiness
Good to go
GI status
Mild discomfort
Hydration
Below target

StatusIndicator — lg — dot

Race readiness
All systems nominal
Recovery
Moderate fatigue detected
Overtraining risk
Rest recommended

StatusIndicator — lg — edge-left

Race readiness
All systems nominal
Recovery
Moderate fatigue detected
Overtraining risk
Rest recommended

StatusIndicator — lg — edge-top

Race readiness
All systems nominal
Recovery
Moderate fatigue detected
Overtraining risk
Rest recommended
NotificationBadge
S
3
M
99+
N
I
TrendBadge
4w+11.6%13w-3.4%12m+24.2%YTD-0.9%1y+0.0%
CategoryIcon

Small (16px) — for lists, search results

Session
Plan
Analysis
Nutrition
Coaching

Medium (20px) — for cards, headers

Session
Plan
Analysis
Nutrition
Coaching

Color strip

Media & placeholders6 components
Avatar
M
MT
RN
M
RN
C
Skeleton

MetricCard skeleton

DataTable skeleton

Shape variations

SkeletonCard

Spinner

Basic (default size, accent color)

Custom color · composed from Spinner

Sizes

Button · Badge contexts

Indexing

InputGroup suffix · Item leading

Syncing Strava activities…

Empty · loading state

Loading your data

EmptyState

No sessions yet

Upload a FIT file to see your first session analysis.

Empty

Variants (dashed · outline · bare)

No activities yet

Upload a FIT file or connect Garmin to start tracking.

Outline variant

Solid 0.5px sand border — for calmer contexts.

Bare Empty

No border, no media — inline hint inside a larger surface.

With avatar (single)

MT

User offline

This user is currently offline. Leave a message and they'll see it next time.

With avatar group

AA
BB
CC

No team members

Invite your team to collaborate on this project.

Subtle background gradient

No notifications

You're all caught up. New notifications will appear here.

With input-group (search fallback)

404 — not found

The page you're looking for doesn't exist. Try searching for what you need.

/

Need help? Contact support

HexSwatch
--bg
Canvas#FAF9F5Page background
--n200
Hover#F2F0EAHover states
Secondary#6B6760
#131211
Small atoms2 components
Kbd

Single keys

⌘K⌘SEscapeTab

Group (chord)

ShiftP

Inside button · inside tooltip

Separator

Separator variants

Horizontal (default)

Horizontal (subtle)

With label

Vertical (between inline elements)

PowerHeart rateCadence
Headers2 components
SectionHeader

Forms

Layout

Navigation

Showcase (docs tier)3 components
ShowcaseHero
Ramtt · Hue register

20 hues.7 stops each.One register.

Every color in the product is drawn from this page. Base hues pinned at OKLCH L=0.67.

Total colors147
Active hues14
Base lightnessL 0.67
CanvasSand
ShowcaseSection
01

Hue register

All 20 hues × 7 stops. 160 colors.

02

Zone mapping

How hues map to training zones.

ShowcaseStat
Sessions1,284
Load (TSS)92
CHO/h78 g
HRV62 ms
Grids & timelines4 components
ActivityHeatmap
NovDecJanFebMarAprMay
Mon
Wed
Fri
StatsGrid
Weekly TSS
680pts
CTL
92
ATL
114
Form
-22TSB
Leaderboard

Weekly compliance

1
MT
Malte Therkildsen
96%
2
JE
Jonas Eriksen
88%
3
RH
Ruth Hansen
84%
4
LN
Lars Nielsen
72%
5
NB
Niko Berg
68%

Zone distribution

Z2 Endurance
45min
Z3 Tempo
32min
Z4 Threshold
18min
Z5 VO2max
8min
Z1 Recovery
5min
TimelineStrip

TimelineStrip — race nutrition (300 min)

Gel 1
Gel 2
Gel 3
Caffeine
Gel 4
Gel 5
StartFinish

TimelineStrip — race week with zones

Normal
Loading
Race
D-7Race

Feedback & overlay

Modals, drawers, tooltips, toasts, dropdowns, and floating UI.

Modals & panels6 components
Drawer
Note: On narrow viewports, our Drawer is the mobile-equivalent of a Dialog — a responsive drawer/dialog pattern.

Session filters

30min

Quick actions

Sheet

Sheet (alias for Drawer)

Filters

Sheet is shadcn's name for our Drawer — same overlay, same focus trap, same close button. Re-exported under this alias so shadcn migrations don't have to rewrite call-sites.

Side (right · bottom · left)

Edit profile — side:

This sheet enters from the side of the viewport.

FloatingPanel
FloatingToolbar
AnimatedPanel

Animated content

Smoothly collapses and expands. Children unmount on close by default to avoid keeping heavy content (like charts) in the DOM.

Menus & popovers5 components
ContextMenu

Context menu

Right-click the card below

MIT with spikes

12. april 2026 · 1:28:40

Popover
HoverCard

Hover card

Hover over the name to see a preview

@malte
Tooltip

Hover over each icon to see tooltip positions

Info text with tooltip

Your FTP is used to calculate power zones
Toasts & alerts2 components
Toast

Toast types — one button per variant type.

Alert

Destructive severity (error variant)

Dot (default)

Edge-left

Edge-top

Meta1 component
ComingSoon

RAMTT

Coming soon

Training analytics for endurance athletes.

Layout & composition

Page layouts, grids, lists, and compound component patterns.

Page layouts3 components
AuthLayout
RAMTT

Sign in to RAMTT

Welcome back

or continue with
Don't have an account? Sign up
OnboardingLayout
Step 1 / 4Welcome

Welcome

Let's set up your profile

Welcome to RAMTT. This wizard will guide you through initial setup so you can start tracking your training right away.

WelcomeHero

Good morning, Malte

Ready to ride? 3 sessions this week.

Lists & groups6 components
ActionPanel

Changes will take effect immediately.

This will permanently delete your account and all associated data. This action cannot be undone.

Auto-sync sessions

Automatically import new sessions from Strava

Item

Default · icon media · actions

Create a new workoutStructured intervals, FTP-based power zones
New
MT
Malte TherkildsenAdmin · last seen 2h ago

As link (interactive anchor)

Visit our documentation — linkLearn how to get started with our components.
External link — opens new tabOpens in a new tab with security attributes.

With image media (music list)

Midnight City LightsNeon Dreams
3:45
Coffee Shop ConversationsThe Morning Brew
4:05
Digital RainCyber Symphony
3:30

With dropdown trigger (actions menu)

S
shadcnshadcn@vercel.com
M
maxleitermaxleiter@vercel.com
E
evilrabbitevilrabbit@vercel.com

Variants

Outline item0.5px sand border — selection cards
Muted itemSubtle sand fill — grouped contexts
Compact (size=sm)Denser rows
GridList
Tempo ride — Mallorca
Z3

1:28:40 · 238W avg · 142bpm

2 days ago

Recovery spin
Z1

0:45:12 · 142W avg · 118bpm

3 days ago

Threshold intervals
Z4

1:12:00 · 272W avg · 165bpm

5 days ago

Long endurance
Z2

3:15:00 · 198W avg · 135bpm

1 week ago

VO2max repeats
Z5

0:58:30 · 310W avg · 178bpm

1 week ago

Sweet spot blocks
Z3

1:30:00 · 256W avg · 155bpm

2 weeks ago

MediaObject
Power zones updatedBased on your latest FTP test
Coach NielsenLeft a comment on your session5 min ago
Malte Therkildsenmalte@ramt.dev · Athlete
Session synced successfully
Feed
Session completed2 hours ago

Tempo ride — 1:28:40, 238W avg

Signal triggered5 hours ago

Injury risk increased to 72

Coach NielsenYesterday

Great session! Consider adding more Z2 work next week to build aerobic base.

FTP updated2 days ago

280W → 285W based on 20-min test

Account created1 week ago
MemberList

Athletes

MT
Malte Therkildsenmalte@ramt.dev
Active
RE
Ruth Eriksenruth@example.com
Active
JH
Jonas Hansenjonas@example.com
Active
?
lars@example.com
Invited
Containers & utilities7 components
ScrollArea

Scroll area

Vertical (300px, custom scrollbar on hover)

Interval 1
260W
Interval 2
297W
Interval 3
334W
Interval 4
291W
Interval 5
328W
Interval 6
285W
Interval 7
322W
Interval 8
279W
Interval 9
316W
Interval 10
273W
Interval 11
310W
Interval 12
267W
Interval 13
304W
Interval 14
261W
Interval 15
298W
Interval 16
335W
Interval 17
292W
Interval 18
329W
Interval 19
286W
Interval 20
323W

Horizontal scroll

MIT

Session type

Tempo

Session type

Recovery

Session type

VO2max

Session type

Endurance

Session type

Sweet Spot

Session type

Race Pace

Session type

Threshold

Session type

Resizable

Resizable panels

Horizontal · drag the handle to resize (30/70 split)

Sidebar

Drag handle to resize

Main content

Fills remaining space

Vertical · header/content split

Header (vertical)

Content

SplitPane
No preview available.
VirtualList
Session 1260 W · 130 bpm
Session 2297 W · 153 bpm
Session 3334 W · 176 bpm
Session 4291 W · 139 bpm
Session 5328 W · 162 bpm
Session 6285 W · 185 bpm
Session 7322 W · 148 bpm
Session 8279 W · 171 bpm
Session 9316 W · 134 bpm
Session 10273 W · 157 bpm
Session 11310 W · 180 bpm
Session 12267 W · 143 bpm
Session 13304 W · 166 bpm
Session 14261 W · 189 bpm
Session 15298 W · 152 bpm
Session 16335 W · 175 bpm
Session 17292 W · 138 bpm
Session 18329 W · 161 bpm
Session 19286 W · 184 bpm
AspectRatio

16 : 9

16:9

1 : 1

1:1

4 : 5

4:5
Direction

LTR

RTL

App surfaces6 components
ActiveTask
Active sessions
MessageActions

Great session today. Felt strong on the climbs — tempo pace held steady throughout.

TodoList

Pre-ride checklist

Check tire pressure
Fill bottles (2x750ml)
Prepare gels (4x SiS)
Charge head unit
Set FTP on device

Weekly goals

1/3 done
Complete 3 interval sessions
Log nutrition for every ride
Hit 600 TSS weekly target
HelpSection

Frequently asked questions

Training

FTP is estimated from your best 20-minute power effort, multiplied by 0.95. You can also set it manually in Settings.

Training zones divide your effort into intensity levels based on FTP or heart rate thresholds. RAMTT uses a 7-zone model for power and a 5-zone model for heart rate.

Nutrition

The CHO zone system categorizes your carbohydrate intake targets based on exercise intensity and duration, helping you fuel optimally for each session type.

Open any session, tap the nutrition tab, and enter grams of carbohydrate consumed. You can also scan product barcodes for automatic entry.

Integrations

Go to Settings, then Integrations, then Strava, and click Connect. You will be redirected to authorize RAMTT to read your activities.

Can't find an answer? Contact support
NotificationPreferences

Training

Session completedGet notified when a session is synced and analyzed
Weekly summaryReceive a weekly training load and progress report
FTP updatesGet notified when your FTP is recalculated

Signals & Alerts

Injury risk warningAlert when injury risk score exceeds threshold
Overtraining detectionAlert when training load indicators suggest overtraining
Coach messagesReceive push notifications for coach feedbackRequires Pro plan
FieldMapping

Map your data

StravaRAMTT
average_watts
avg_power
average_heartrate
avg_hr
max_watts
peak_power
suffer_score
!
normalized_power
!
Widgets & dashboards2 components
WidgetPicker

Add widget

Capacity chart
CP/W' progression over time with confidence bands
Peak curves
Mean maximal power curves across selected periods
Zone distribution
Time in each training zone as segmented bar
Durability index
CP decay per hour of riding
ACWR trend
Acute:chronic workload ratio over 28 days
CHO compliance
Weekly carbohydrate target adherence
Hydration tracker
Daily fluid intake vs. target
Macro breakdown
CHO / protein / fat proportions
Sleep quality
Sleep duration and quality ratings over time
Body composition
Weight, body fat, and lean mass trends
Fatigue & freshness
ATL / CTL / TSB fitness model
Race readiness
Multi-dimensional readiness assessment
Daily state
Mood, stress, soreness, fatigue composite
GI tracker
Gastrointestinal comfort during sessions
Training load
Weekly TSS and hours with rolling average
Power profile
Radar chart of athlete strengths
Caffeine timing
Pre-session caffeine doses and timing
Session compliance
Planned vs. executed workouts
Recovery score
Composite recovery metric from sleep + HRV + subjective
Supplement log
Daily supplement intake tracking
DashboardGrid

DashboardGrid — drag handles to rearrange

Capacity chart
12×4 at (0,0)
Peak curves
6×3 at (0,4)
Zone distribution
6×3 at (6,4)

Dark surfaces

Components designed for dark backgrounds — footers, dark sections, link groups.