Zetta v0.10

Components · Data display

Calendar

A month grid for picking a date — 32px day nodes on the popover surface. The selected day takes a brand fill, today wears a hairline-strong ring, and days outside the current month dim back. Pair it with an input to form a date picker.

Preview

A month across the three themes; the 14th is selected, the 21st is today, two days disabled.

Light
June 2026
S M T W T F S
Dark
June 2026
S M T W T F S
Accessibility
June 2026
S M T W T F S

Spec

Values and token references straight from the Zetta spec.

calendar-container
backgroundColor
{colors.popover}
textColor
{colors.popover-foreground}
borderColor
{colors.hairline}
borderWidth
1px
borderRadius
{rounded.base}
shadow
{shadows.md}
padding
{spacing.page}
display
grid
gap
{spacing.sm}
headerHeight
32px
dayNodeSize
32px
dayNodeRadius
{rounded.base}
dayNodeFontFamily
Geist
dayNodeFontSize
14px
calendar-header
height
32px
display
flex
alignItems
center
justifyContent
space-between
calendar-day
textColor
{colors.ink}
fontWeight
400
display
flex
alignItems
center
justifyContent
center
cursor
pointer
calendar-day-hover
backgroundColor
{colors.surface-muted}
borderRadius
{rounded.base}
calendar-day-focus
outline
2px solid {colors.border-focus}
outlineOffset
2px
borderRadius
{rounded.base}
calendar-day-selected
backgroundColor
{colors.brand}
textColor
{colors.brand-text}
fontWeight
600
borderRadius
{rounded.base}
calendar-day-today
borderColor
{colors.border-strong}
borderWidth
1px
borderRadius
{rounded.base}
calendar-day-disabled
textColor
{colors.disabled-text}
cursor
not-allowed
calendar-day-outside
textColor
{colors.disabled-text}
opacity
0.4
cursor
default
calendar-weekday-label
textColor
{colors.muted}
fontFamily
Geist
fontSize
12px
fontWeight
500
textAlign
center

Build with the skill

No package to install — hand this to your AI to generate the calendar in your stack.

Prompt for your AI
Implement the Zetta "Calendar" component in this project's stack using the zetta-design-md skill.

- Apply the `calendar` spec from the skill (variants: day, day-selected, day-today, day-disabled, day-outside).
- Use this project's own component conventions and framework idioms.
- Reference the Zetta design tokens (CSS variables) for every color, radius, and shadow — never hardcode values.
- Implement all states (hover, focus, active, disabled, and invalid where applicable) with a visible 2px focus ring.
- Honor the Zetta guardrails (brand never shifts hue, shadows for overlays only, etc.) and verify in Light, Dark, and Accessibility.

Anatomy & rules

  • Popover container with shadow-md; 32px square day nodes at base radius. Selected = brand fill + brand-text at weight 600; today = hairline-strong border; outside-month = disabled colour at 0.4 opacity.
  • Weekday labels are muted 12px. Keep one clear "today" and at most one selected day per single-date picker.

Accessibility

  • Expose the month as a grid; let arrow keys move day-to-day and Page Up/Down change month. Mark the selected day with aria-selected and disabled days with disabled. Don't rely on the brand fill alone — keep the bold weight too.

Known gaps

  • Range selection, multi-month views, time pickers, and locale/week-start configuration are not specified — the spec defines the single-month day grid.