Petals
Semantic composition patterns for Renge. Pre-made combinations of tokens for typography, spacing, cards, forms, navigation, overlays, and more — bridging the token system and component implementations without prescribing markup.
Renge tokens are orthogonal — each scale (spacing, color, typography) stands alone. This is powerful for fine-grained control, but consumers often compose the same combinations repeatedly. Petals codify those combinations as named, typed, documented objects.
They work in any framework. Pure CSS custom property references — no runtime, no opinion on markup.
Usage
pnpm add @renge-ui/petals # or npm install @renge-ui/petals
import { petals } from '@renge-ui/petals';
// Typography
const heading = petals.typography.displayLarge.tokens;
// → { fontSize: 'var(--renge-font-size-4xl)', lineHeight: 'var(--renge-line-height-4xl)' }
// Semantic alert
const alert = petals.alerts.success.tokens;
// → { padding, borderRadius, border: '1px solid var(--renge-color-success)', ... }
// Form controls
const checkbox = petals.forms.checkbox.tokens;
// → { width, height, borderRadius, border, transition }
// Overlay patterns
const dropdown = petals.overlay.dropdownMenu.tokens;
// → { padding, borderRadius, boxShadow, border, zIndex: 'var(--renge-zindex-dropdown)' }
// Combine multiple petals
const cardHeading = {
...petals.typography.headingMedium.tokens,
...petals.cards.surfaceComfortable.tokens,
color: 'var(--renge-color-fg)',
};Petals can be spread directly onto React, Vue, or Svelte style props, passed to a CSS-in-JS system, or mapped to CSS variables in a stylesheet.
// React
<div style={petals.alerts.danger.tokens}>Error message</div>
// Vue
<div :style="petals.forms.textarea.tokens">...</div>
// Vanilla CSS object
const sheet = Object.entries(petals.navigation.navItem.tokens)
.map(([prop, val]) => `${prop}: ${val};`)
.join(' ');Why Petals?
"Every lotus blooms one petal at a time. These are Renge's. Pre-composed token combinations that sit between the math and the markup."
Petals are not components. The distinction matters:
- Compose tokens into semantic patterns
- Stay framework-agnostic
- Enable consistent token combinations
- Document common design decisions
- Export pure CSS custom property references
- Include component logic or event handlers
- Prescribe HTML structure
- Create new colors or spacing values
- Require a specific framework or bundler
- Compile to CSS at build time
Typography
8 petalsFont size and line-height pairs derived from the PHI scale. Apply these to any text-bearing element to lock into the mathematical rhythm.
Display Large
displayLargeHero headline — 4xl size with generous line-height
{
"fontSize": "var(--renge-font-size-4xl)",
"lineHeight": "var(--renge-line-height-4xl)"
}Display Medium
displayMediumPage title — 3xl size with proportional line-height
{
"fontSize": "var(--renge-font-size-3xl)",
"lineHeight": "var(--renge-line-height-3xl)"
}Heading Large
headingLargeSection heading — 2xl with breathing room
{
"fontSize": "var(--renge-font-size-2xl)",
"lineHeight": "var(--renge-line-height-2xl)"
}Heading Medium
headingMediumSubsection — xl with natural rhythm
{
"fontSize": "var(--renge-font-size-xl)",
"lineHeight": "var(--renge-line-height-xl)"
}Body Large
bodyLargeComfortable reading text — lg size for emphasis
{
"fontSize": "var(--renge-font-size-lg)",
"lineHeight": "var(--renge-line-height-lg)"
}Body Regular
bodyRegularDefault body text — base size for prose
{
"fontSize": "var(--renge-font-size-base)",
"lineHeight": "var(--renge-line-height-base)"
}Body Small
bodySmSecondary text — sm size for captions
{
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)"
}Label XS
labelXsUI label — xs size for forms and metadata
{
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Spacing
4 petalsPadding and gap combinations following the Fibonacci sequence. One petal sets both dimensions consistently.
Generous
generousMaximum breathing room — space-5
{
"padding": "var(--renge-space-5)",
"gap": "var(--renge-space-4)"
}Comfortable
comfortableNatural spacing — space-4 with gap-3
{
"padding": "var(--renge-space-4)",
"gap": "var(--renge-space-3)"
}Compact
compactTight spacing — space-3 with gap-2
{
"padding": "var(--renge-space-3)",
"gap": "var(--renge-space-2)"
}Condensed
condensedMinimal spacing — space-2 with gap-1
{
"padding": "var(--renge-space-2)",
"gap": "var(--renge-space-1)"
}Cards
4 petalsSurface styling with padding, radius, and shadow elevation. Four levels from generous to minimal.
Surface Generous
surfaceGenerousFull-featured card — max padding, radius, and shadow
{
"padding": "var(--renge-space-5)",
"borderRadius": "var(--renge-radius-5)",
"boxShadow": "var(--renge-shadow-layer-2)"
}Surface Comfortable
surfaceComfortableStandard card — balanced padding and elevation
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-4)",
"boxShadow": "var(--renge-shadow-layer-1)"
}Surface Compact
surfaceCompactTight card — reduced padding, softer corners
{
"padding": "var(--renge-space-3)",
"borderRadius": "var(--renge-radius-3)",
"boxShadow": "var(--renge-shadow-layer-1)"
}Surface Minimal
surfaceMinimalSubtle container — minimal padding, no shadow
{
"padding": "var(--renge-space-2)",
"borderRadius": "var(--renge-radius-2)",
"boxShadow": "none"
}Interactive
7 petalsButton sizing and focus indicator. Padding, radius, and transition timing in one application.
Button Large
buttonLargePrimary action button — generous padding, prominent radius
{
"padding": "var(--renge-space-3) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"transition": "all var(--renge-duration-2) var(--renge-easing-ease-out)"
}Button Medium
buttonMediumStandard button — balanced padding and radius
{
"padding": "var(--renge-space-2) var(--renge-space-3)",
"borderRadius": "var(--renge-radius-2)",
"transition": "all var(--renge-duration-2) var(--renge-easing-ease-out)"
}Button Small
buttonSmallCompact button — minimal padding, subtle corners
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-1)",
"transition": "all var(--renge-duration-1) var(--renge-easing-ease-out)"
}Focus State
focusKeyboard focus ring — 3px accent glow via color-mix, WCAG-compliant
{
"outline": "none",
"boxShadow": "var(--renge-shadow-focus)",
"transition": "box-shadow var(--renge-duration-2) var(--renge-easing-ease-out)"
}Hover Surface
hoverSurfaceSubtle background shift on pointer entry — bg-subtle with ease-out
{
"background": "var(--renge-color-bg-subtle)",
"transition": "background var(--renge-duration-1) var(--renge-easing-ease-out)"
}Active Surface
activeSurfacePressed/active state background — bg-muted, slightly deeper than hover
{
"background": "var(--renge-color-bg-muted)",
"transition": "background var(--renge-duration-1) var(--renge-easing-ease-out)"
}Interactive Base
interactiveBaseFull set of interaction state transitions — background, box-shadow, and transform with Renge easing
{
"transition": "background var(--renge-duration-1) var(--renge-easing-ease-out), box-shadow var(--renge-duration-2) var(--renge-easing-ease-out), transform var(--renge-duration-1) var(--renge-easing-spring)"
}Compositions
7 petalsHigher-level patterns combining multiple token types — text fields, badges, and chips.
Text Field
textFieldInput field styling — padding, radius, border, transition
{
"padding": "var(--renge-space-2) var(--renge-space-3)",
"borderRadius": "var(--renge-radius-2)",
"border": "1px solid var(--renge-color-border)",
"transition": "all var(--renge-duration-2) var(--renge-easing-ease-out)"
}Badge
badgeCompact label — tight padding with condensed spacing
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Chip
chipDismissible tag — small padding with focus support
{
"padding": "var(--renge-space-1) var(--renge-space-3)",
"borderRadius": "var(--renge-radius-full)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)"
}Hero Layout
heroSectionLarge-viewport landing section — generous vertical padding with centered content max-width
{
"paddingTop": "var(--renge-space-8)",
"paddingBottom": "var(--renge-space-8)",
"paddingLeft": "var(--renge-space-5)",
"paddingRight": "var(--renge-space-5)",
"maxWidth": "var(--renge-container-lg)"
}Stat Grid
statGrid2–4 metric grid — gap derived from Fibonacci with comfortable card padding
{
"display": "grid",
"gap": "var(--renge-space-5)",
"padding": "var(--renge-space-4)"
}Form Section
formSectionVertical-rhythm form layout — label group → inputs → submit with PHI-spaced gap
{
"display": "flex",
"flexDirection": "column",
"gap": "var(--renge-space-5)",
"padding": "var(--renge-space-5)"
}Data Row
dataRowLabel + value pair for detail views — horizontal layout with tight vertical padding
{
"display": "flex",
"justifyContent": "space-between",
"alignItems": "baseline",
"gap": "var(--renge-space-4)",
"paddingTop": "var(--renge-space-3)",
"paddingBottom": "var(--renge-space-3)",
"borderBottom": "1px solid var(--renge-color-border-subtle)"
}Alerts
5 petalsSemantic feedback containers. Five variants (success, warning, danger, info, neutral) each carrying border color, background, and padding.
Alert — Success
successPositive feedback container — success border with subtle fill
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"border": "1px solid var(--renge-color-success)",
"backgroundColor": "var(--renge-color-success-subtle)",
"color": "var(--renge-color-fg)"
}Alert — Warning
warningCaution container — warning border with subtle fill
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"border": "1px solid var(--renge-color-warning)",
"backgroundColor": "var(--renge-color-warning-subtle)",
"color": "var(--renge-color-fg)"
}Alert — Danger
dangerError container — danger border with subtle fill
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"border": "1px solid var(--renge-color-danger)",
"backgroundColor": "var(--renge-color-danger-subtle)",
"color": "var(--renge-color-fg)"
}Alert — Info
infoInformational container — info border with subtle fill
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"border": "1px solid var(--renge-color-info)",
"backgroundColor": "var(--renge-color-info-subtle)",
"color": "var(--renge-color-fg)"
}Alert — Neutral
neutralDefault notification container — subtle border and background
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"border": "1px solid var(--renge-color-border)",
"backgroundColor": "var(--renge-color-bg-subtle)",
"color": "var(--renge-color-fg)"
}Navigation
12 petalsNavbars, menus, tabs, breadcrumbs, pagination, bottom nav, and step indicators — all the scaffolding for wayfinding.
Navbar Root
navbarRootTop navigation bar — horizontal padding and bottom border
{
"padding": "var(--renge-space-3) var(--renge-space-5)",
"borderBottom": "1px solid var(--renge-color-border-subtle)",
"backgroundColor": "var(--renge-color-bg)"
}Nav Item
navItemNavigation link — compact padding with transition
Nav Item — Active
navItemActiveActive navigation state — accent background and color
Menu Item
menuItemVertical menu entry — comfortable padding with hover transition
{
"padding": "var(--renge-space-2) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-2)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)",
"color": "var(--renge-color-fg)",
"transition": "background-color var(--renge-duration-1) var(--renge-easing-ease-out)"
}Menu Item — Active
menuItemActiveSelected menu entry — accent background and color
{
"backgroundColor": "var(--renge-color-accent-subtle)",
"color": "var(--renge-color-accent)"
}Tab Item
tabItemTab trigger — bottom border indicator with transition
{
"padding": "var(--renge-space-2) var(--renge-space-4)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)",
"borderBottom": "2px solid transparent",
"transition": "all var(--renge-duration-1) var(--renge-easing-ease-out)"
}Tab Item — Active
tabItemActiveActive tab — accent underline and color
{
"borderBottomColor": "var(--renge-color-accent)",
"color": "var(--renge-color-accent)"
}Breadcrumb Item
breadcrumbItemPath segment — condensed typography in subdued color
{
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-subtle)"
}Pagination Item
paginationItemPage number button — square minimum touch target with transition
{
"padding": "var(--renge-space-2)",
"minWidth": "var(--renge-min-w-4)",
"borderRadius": "var(--renge-radius-2)",
"fontSize": "var(--renge-font-size-sm)",
"transition": "all var(--renge-duration-1) var(--renge-easing-ease-out)"
}Pagination Item — Active
paginationItemActiveCurrent page — accent background with inverse text
{
"backgroundColor": "var(--renge-color-accent)",
"color": "var(--renge-color-fg-inverse)"
}Bottom Nav Item
bottomNavItemMobile bottom tab — generous touch target, subdued color
{
"padding": "var(--renge-space-3) var(--renge-space-4)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-subtle)",
"transition": "color var(--renge-duration-1) var(--renge-easing-ease-out)"
}Steps Item
stepsItemStep indicator label — condensed type beside progress node
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-subtle)",
"gap": "var(--renge-space-2)"
}Overlay
9 petalsFloating elements above the document flow. Modals, drawers, dropdowns, tooltips, and popovers with z-index tokens baked in.
Modal Backdrop
modalBackdropDimming overlay behind modals — inverse surface color
{
"backgroundColor": "var(--renge-color-bg-inverse)",
"zIndex": "var(--renge-zindex-modal)"
}Modal Container
modalContainerDialog surface — elevated card with generous padding
{
"padding": "var(--renge-space-6)",
"borderRadius": "var(--renge-radius-4)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-3)",
"zIndex": "var(--renge-zindex-modal)"
}Modal Header
modalHeaderDialog title area — bottom border separating from body
{
"padding": "var(--renge-space-4) var(--renge-space-6)",
"borderBottom": "1px solid var(--renge-color-border-subtle)",
"fontSize": "var(--renge-font-size-lg)",
"lineHeight": "var(--renge-line-height-lg)"
}Modal Footer
modalFooterDialog action area — top border separating from body
{
"padding": "var(--renge-space-4) var(--renge-space-6)",
"borderTop": "1px solid var(--renge-color-border-subtle)",
"gap": "var(--renge-space-3)"
}Drawer Panel
drawerPanelSlide-in panel — full-height surface with heavy elevation
{
"padding": "var(--renge-space-5)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-3)",
"zIndex": "var(--renge-zindex-modal)"
}Dropdown Menu
dropdownMenuFloating menu container — card surface with tight inner padding
{
"padding": "var(--renge-space-1)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-2)",
"border": "1px solid var(--renge-color-border-subtle)",
"zIndex": "var(--renge-zindex-dropdown)"
}Dropdown Item
dropdownItemMenu list entry — compact padding with hover transition
{
"padding": "var(--renge-space-2) var(--renge-space-3)",
"borderRadius": "var(--renge-radius-2)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)",
"transition": "background-color var(--renge-duration-1) var(--renge-easing-ease-out)"
}Tooltip
tooltipSmall informational bubble — inverse surface, condensed type
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-1)",
"backgroundColor": "var(--renge-color-bg-inverse)",
"color": "var(--renge-color-fg-inverse)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"boxShadow": "var(--renge-shadow-layer-1)",
"zIndex": "var(--renge-zindex-toast)"
}Popover
popoverRich floating content — card surface with comfortable padding
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-2)",
"border": "1px solid var(--renge-color-border-subtle)",
"zIndex": "var(--renge-zindex-dropdown)"
}Forms
16 petalsEvery form control beyond text input — checkboxes, radios, toggles, range sliders, selects, textareas, file inputs, and star ratings.
Checkbox
checkboxSquare form control — compact sizing with subtly rounded corners
{
"width": "var(--renge-h-4)",
"height": "var(--renge-h-4)",
"borderRadius": "var(--renge-radius-1)",
"border": "1.5px solid var(--renge-color-border)",
"transition": "all var(--renge-duration-1) var(--renge-easing-ease-out)"
}Checkbox — Checked
checkboxCheckedActive checkbox state — accent fill and border
{
"backgroundColor": "var(--renge-color-accent)",
"borderColor": "var(--renge-color-accent)"
}Radio Button
radioCircular form control — compact sizing with full radius
{
"width": "var(--renge-h-4)",
"height": "var(--renge-h-4)",
"borderRadius": "var(--renge-radius-full)",
"border": "1.5px solid var(--renge-color-border)",
"transition": "all var(--renge-duration-1) var(--renge-easing-ease-out)"
}Radio Button — Checked
radioCheckedActive radio state — accent outer ring with inset dot
{
"borderColor": "var(--renge-color-accent)",
"boxShadow": "inset 0 0 0 3px var(--renge-color-accent)"
}Toggle Track
toggleSwitch track — pill wider than tall, PHI-proportioned
{
"width": "var(--renge-h-8)",
"height": "var(--renge-h-4)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)",
"transition": "background-color var(--renge-duration-2) var(--renge-easing-ease-out)"
}Toggle Track — Active
toggleActiveOn state for the switch track — accent fill
{
"backgroundColor": "var(--renge-color-accent)"
}Toggle Thumb
toggleThumbSwitch handle — circle that slides within the track
{
"width": "var(--renge-h-3)",
"height": "var(--renge-h-3)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-1)",
"transition": "transform var(--renge-duration-2) var(--renge-easing-ease-out)"
}Range Track
rangeTrackSlider rail — thin pill on muted background
{
"height": "var(--renge-h-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)"
}Range Fill
rangeFillFilled portion of slider track — accent color
{
"height": "var(--renge-h-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-accent)"
}Range Thumb
rangeThumbSlider handle — elevated circle with focus shadow support
{
"width": "var(--renge-h-5)",
"height": "var(--renge-h-5)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-accent)",
"boxShadow": "var(--renge-shadow-layer-1)",
"transition": "box-shadow var(--renge-duration-1) var(--renge-easing-ease-out)"
}Select
selectDropdown select — textField base with explicit background
{
"padding": "var(--renge-space-2) var(--renge-space-3)",
"borderRadius": "var(--renge-radius-2)",
"border": "1px solid var(--renge-color-border)",
"backgroundColor": "var(--renge-color-bg)",
"fontSize": "var(--renge-font-size-base)",
"transition": "all var(--renge-duration-2) var(--renge-easing-ease-out)"
}Textarea
textareaMulti-line text area — textField base with minimum height
{
"padding": "var(--renge-space-2) var(--renge-space-3)",
"borderRadius": "var(--renge-radius-2)",
"border": "1px solid var(--renge-color-border)",
"minHeight": "var(--renge-h-8)",
"fontSize": "var(--renge-font-size-base)",
"lineHeight": "var(--renge-line-height-base)",
"transition": "all var(--renge-duration-2) var(--renge-easing-ease-out)"
}File Input
fileInputFile upload target — dashed border drop zone
{
"padding": "var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"border": "1.5px dashed var(--renge-color-border)",
"backgroundColor": "var(--renge-color-bg-subtle)",
"fontSize": "var(--renge-font-size-sm)",
"transition": "all var(--renge-duration-2) var(--renge-easing-ease-out)"
}File Input — Drag Active
fileInputActiveFile drop zone while dragging — accent border and background
{
"border": "1.5px dashed var(--renge-color-accent)",
"backgroundColor": "var(--renge-color-accent-subtle)"
}Rating
ratingFilled star rating item — warning color
{
"color": "var(--renge-color-warning)",
"fontSize": "var(--renge-font-size-xl)",
"lineHeight": "var(--renge-line-height-xl)",
"transition": "color var(--renge-duration-1) var(--renge-easing-ease-out)"
}Rating — Empty
ratingEmptyUnfilled star — muted color
{
"color": "var(--renge-color-bg-muted)",
"fontSize": "var(--renge-font-size-xl)",
"lineHeight": "var(--renge-line-height-xl)"
}Feedback
10 petalsLoading states, progress bars, skeleton loaders, and toast notifications. UI state rather than content.
Skeleton
skeletonBlock loading placeholder — muted background for shapes
{
"backgroundColor": "var(--renge-color-bg-muted)",
"borderRadius": "var(--renge-radius-2)"
}Skeleton Text
skeletonTextInline text placeholder — pill shape matching body line-height
{
"backgroundColor": "var(--renge-color-bg-muted)",
"borderRadius": "var(--renge-radius-full)",
"height": "var(--renge-h-3)"
}Skeleton Avatar
skeletonAvatarCircular avatar placeholder
{
"width": "var(--renge-h-8)",
"height": "var(--renge-h-8)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)"
}Progress Track
progressTrackProgress bar rail — thin muted pill
{
"height": "var(--renge-h-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)"
}Progress Fill
progressFillProgress bar fill — accent color with smooth transition
{
"height": "var(--renge-h-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-accent)",
"transition": "width var(--renge-duration-3) var(--renge-easing-ease-out)"
}Progress Fill — Success
progressSuccessCompleted progress — success color fill
{
"height": "var(--renge-h-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-success)",
"transition": "width var(--renge-duration-3) var(--renge-easing-ease-out)"
}Toast
toastNotification message — elevated surface, compact padding
{
"padding": "var(--renge-space-3) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-2)",
"border": "1px solid var(--renge-color-border-subtle)",
"fontSize": "var(--renge-font-size-sm)",
"zIndex": "var(--renge-zindex-toast)"
}Toast — Success
toastSuccessPositive notification — left success accent border
{
"padding": "var(--renge-space-3) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-2)",
"borderLeft": "4px solid var(--renge-color-success)",
"fontSize": "var(--renge-font-size-sm)",
"zIndex": "var(--renge-zindex-toast)"
}Toast — Warning
toastWarningCaution notification — left warning accent border
{
"padding": "var(--renge-space-3) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-2)",
"borderLeft": "4px solid var(--renge-color-warning)",
"fontSize": "var(--renge-font-size-sm)",
"zIndex": "var(--renge-zindex-toast)"
}Toast — Danger
toastDangerError notification — left danger accent border
{
"padding": "var(--renge-space-3) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-bg)",
"boxShadow": "var(--renge-shadow-layer-2)",
"borderLeft": "4px solid var(--renge-color-danger)",
"fontSize": "var(--renge-font-size-sm)",
"zIndex": "var(--renge-zindex-toast)"
}Data Display
19 petalsTables, stats, avatars, chat bubbles, timelines, and accordions. The visual rhythm of structured information.
Table
tableRootTable container — full width with body-size typography
{
"width": "var(--renge-w-full)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)"
}Table Header Cell
tableHeaderColumn heading — condensed type, bottom border, muted color
{
"padding": "var(--renge-space-2) var(--renge-space-3)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-subtle)",
"borderBottom": "1px solid var(--renge-color-border)"
}Table Cell
tableCellData cell — comfortable padding with subtle row separator
{
"padding": "var(--renge-space-3)",
"borderBottom": "1px solid var(--renge-color-border-subtle)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)"
}Table Row — Stripe
tableRowStripeAlternating row background for scan-ability
{
"backgroundColor": "var(--renge-color-bg-subtle)"
}Table Row — Hover
tableRowHoverInteractive row highlight on pointer entry
{
"backgroundColor": "var(--renge-color-bg-subtle)",
"transition": "background-color var(--renge-duration-1) var(--renge-easing-ease-out)"
}Stat
statRootMetric container — comfortable padding, column layout gap
{
"padding": "var(--renge-space-4)",
"gap": "var(--renge-space-2)"
}Stat Value
statValuePrimary metric — large, prominent number
{
"fontSize": "var(--renge-font-size-3xl)",
"lineHeight": "var(--renge-line-height-3xl)",
"color": "var(--renge-color-fg)"
}Stat Label
statLabelMetric name — condensed, subdued
{
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-subtle)"
}Stat Description
statDescSecondary context beneath the metric — muted
{
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-muted)"
}Avatar — Small
avatarSmCompact user avatar — small circle
{
"width": "var(--renge-h-6)",
"height": "var(--renge-h-6)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)",
"fontSize": "var(--renge-font-size-xs)"
}Avatar — Medium
avatarMdStandard user avatar — comfortable circle
{
"width": "var(--renge-h-8)",
"height": "var(--renge-h-8)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)",
"fontSize": "var(--renge-font-size-sm)"
}Avatar — Large
avatarLgProfile-size avatar — generous circle
{
"width": "var(--renge-h-10)",
"height": "var(--renge-h-10)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)",
"fontSize": "var(--renge-font-size-lg)"
}Chat Bubble
chatBubbleIncoming message — subtle background, readable padding
{
"padding": "var(--renge-space-2) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-bg-subtle)",
"color": "var(--renge-color-fg)",
"fontSize": "var(--renge-font-size-base)",
"lineHeight": "var(--renge-line-height-base)"
}Chat Bubble — Own
chatBubbleOwnOutgoing message — accent background with inverse text
{
"padding": "var(--renge-space-2) var(--renge-space-4)",
"borderRadius": "var(--renge-radius-3)",
"backgroundColor": "var(--renge-color-accent)",
"color": "var(--renge-color-fg-inverse)",
"fontSize": "var(--renge-font-size-base)",
"lineHeight": "var(--renge-line-height-base)"
}Timeline Connector
timelineConnectorVertical rule connecting timeline nodes
{
"width": "1px",
"backgroundColor": "var(--renge-color-border)"
}Timeline Dot
timelineDotNode indicator — compact filled circle on connector
{
"width": "var(--renge-h-3)",
"height": "var(--renge-h-3)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-accent)",
"border": "2px solid var(--renge-color-bg)"
}Timeline Label
timelineLabelTime or title beside a node — condensed, muted
{
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-subtle)"
}Accordion Trigger
accordionTriggerExpandable section header — standard interactive padding
{
"padding": "var(--renge-space-3) var(--renge-space-4)",
"fontSize": "var(--renge-font-size-base)",
"lineHeight": "var(--renge-line-height-base)",
"borderBottom": "1px solid var(--renge-color-border-subtle)",
"transition": "background-color var(--renge-duration-1) var(--renge-easing-ease-out)"
}Accordion Content
accordionContentExpandable section body — comfortable padding, subtle background
{
"padding": "var(--renge-space-4)",
"backgroundColor": "var(--renge-color-bg-subtle)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)"
}Layout
14 petalsPage-level structure — heroes, footers, dividers, indicators, join groups, sections, and container widths.
Hero
heroRootFull-width banner section — generous vertical padding
{
"padding": "var(--renge-space-8) var(--renge-space-5)"
}Hero Content
heroContentHero inner container — constrained max-width
{
"maxWidth": "var(--renge-container-lg)"
}Footer
footerRootPage footer — inverse surface with generous padding
{
"padding": "var(--renge-space-7) var(--renge-space-5)",
"backgroundColor": "var(--renge-color-bg-inverse)",
"color": "var(--renge-color-fg-inverse)"
}Footer Section
footerSectionFooter link group — compact vertical gap
{
"gap": "var(--renge-space-3)",
"fontSize": "var(--renge-font-size-sm)",
"lineHeight": "var(--renge-line-height-sm)"
}Divider
dividerHorizontal separator — 1px rule with vertical margin
{
"height": "1px",
"backgroundColor": "var(--renge-color-border-subtle)",
"margin": "var(--renge-space-3) 0"
}Divider — Vertical
dividerVerticalVertical separator — 1px rule for inline separation
{
"width": "1px",
"backgroundColor": "var(--renge-color-border-subtle)",
"margin": "0 var(--renge-space-3)"
}Indicator
indicatorStatus badge overlay — small accent circle
{
"width": "var(--renge-h-2)",
"height": "var(--renge-h-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-accent)",
"border": "2px solid var(--renge-color-bg)"
}Indicator — Danger
indicatorDangerError or unread dot indicator — danger color
{
"width": "var(--renge-h-2)",
"height": "var(--renge-h-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-danger)",
"border": "2px solid var(--renge-color-bg)"
}Join Group
joinGroupConnected element group — zero gap, shared outer border-radius
{
"gap": "var(--renge-space-0)",
"border": "1px solid var(--renge-color-border)",
"borderRadius": "var(--renge-radius-2)"
}Section
sectionRootContent section — vertical padding for page rhythm
{
"padding": "var(--renge-space-6) var(--renge-space-5)"
}Section Header
sectionHeaderSection heading block — bottom margin before content
{
"marginBottom": "var(--renge-space-5)",
"gap": "var(--renge-space-2)"
}Container — Small
containerSmNarrow constrained layout — small max-width
{
"maxWidth": "var(--renge-container-sm)"
}Container — Medium
containerMdStandard constrained layout — medium max-width
{
"maxWidth": "var(--renge-container-md)"
}Container — Large
containerLgWide constrained layout — large max-width
{
"maxWidth": "var(--renge-container-lg)"
}Decoration
14 petalsBadge variants (7), keyboard keys, countdown displays, diff views, and clip masks.
Badge — Solid
badgeSolidFilled badge — accent background with inverse text
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-accent)",
"color": "var(--renge-color-fg-inverse)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Badge — Outline
badgeOutlineBordered badge — accent ring with transparent fill
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"border": "1px solid var(--renge-color-accent)",
"color": "var(--renge-color-accent)",
"backgroundColor": "transparent",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Badge — Subtle
badgeSubtleSoft badge — accent subtle background with accent text
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-accent-subtle)",
"color": "var(--renge-color-accent)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Badge — Success
badgeSuccessPositive status badge — success colors
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-success-subtle)",
"color": "var(--renge-color-success)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Badge — Warning
badgeWarningCaution status badge — warning colors
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-warning-subtle)",
"color": "var(--renge-color-warning)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Badge — Danger
badgeDangerError status badge — danger colors
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-danger-subtle)",
"color": "var(--renge-color-danger)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Badge — Neutral
badgeNeutralDefault label — muted background, subtle text
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-full)",
"backgroundColor": "var(--renge-color-bg-muted)",
"color": "var(--renge-color-fg-subtle)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Kbd
kbdKeyboard key — inset shadow, condensed label
{
"padding": "var(--renge-space-1) var(--renge-space-2)",
"borderRadius": "var(--renge-radius-1)",
"backgroundColor": "var(--renge-color-bg-subtle)",
"border": "1px solid var(--renge-color-border)",
"boxShadow": "var(--renge-shadow-inset)",
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)"
}Countdown Value
countdownValueTicking numeric display — large tabular figures
{
"fontSize": "var(--renge-font-size-3xl)",
"lineHeight": "var(--renge-line-height-3xl)",
"color": "var(--renge-color-fg)"
}Countdown Label
countdownLabelUnit label beneath countdown value — condensed, muted
{
"fontSize": "var(--renge-font-size-xs)",
"lineHeight": "var(--renge-line-height-xs)",
"color": "var(--renge-color-fg-subtle)"
}Diff — Added
diffAddedAdded line in a diff view — success subtle background
{
"backgroundColor": "var(--renge-color-success-subtle)",
"color": "var(--renge-color-success)",
"padding": "0 var(--renge-space-2)"
}Diff — Removed
diffRemovedRemoved line in a diff view — danger subtle background
{
"backgroundColor": "var(--renge-color-danger-subtle)",
"color": "var(--renge-color-danger)",
"padding": "0 var(--renge-space-2)"
}Mask — Circle
maskCircleCircular clip mask — full radius, overflow hidden
{
"borderRadius": "var(--renge-radius-full)",
"overflow": "hidden"
}Mask — Squircle
maskSquircleRounded-square clip mask — large radius, overflow hidden
{
"borderRadius": "var(--renge-radius-4)",
"overflow": "hidden"
}