The weekday label above each column of the calendar grid. One component, no versions — it only ever displays text.
Sits in the top row of the day grid, one per column. It replaced the old pattern of instance-swapping a day cell into the weekday row, which meant the header inherited states and selection behaviour it could never use.
Container → #text anatomy and same 32×32 footprint as Date Picker - Cell, which is what keeps the columns aligned.Row of the calendar's Day mode.| State | iOS | Android | Figma Property | Notes |
|---|---|---|---|---|
| Static | N/A | N/A | Text | No states. The weekday strip is not interactive. |
| #text | N/A | N/A | String | Su · M · T · W · Th · F · Sa. Mixed lengths are deliberate, to save width on small screens. |
- The invisible white fill is gone. The component frame carried a
#FFFFFFfill switched off. Nothing drew it — theContainerbeneath paints the real surface — but it read as a second surface to anyone inspecting the layers, and it was the same leftover found on Date Picker - Cell. Cleared in Figma during this run and confirmed on the node. C1 · Layer Structure & Naming - The weekday row has its own component. It used to be a
Date Picker - Iteminstance with its number swapped for a weekday, which meant the header carried selection, today and disabled states it could never use. This component has none of them. C1 · Layer Structure & Naming - The name no longer implies versions it doesn't have. It was called
Picker Header/Default. Figma reads the slash as nesting, so the assets panel showed a variant group around a component that has no variants. It is now a plain name. C2 · Variant & Property Naming - The wrapper matches the rest of the family. The inner frame was
container, lowercase — a third spelling alongside the cell'sContainerand the trigger'sLabel Container. All three now readContainer. C1 · Layer Structure & Naming
- Note that the abbreviations are locale-dependent. v1.1: Applied — a Usage Guideline pairs "take the labels from the platform's calendar symbols" with "don't hardcode Su–Sa; not every locale starts the week on Sunday", and Accessibility now names the API on each platform:
Calendar.current.veryShortWeekdaySymbolsandDayOfWeek.getDisplayName(TextStyle.NARROW, locale). Docs - Hide the weekday strip from screen readers. v1.1: Applied — Accessibility carries it for both platforms:
.accessibilityHidden(true)on the row andModifier.clearAndSetSemantics {}, paired with a row confirming each day cell still announces its own weekday. The strip is hidden without the information being lost. A11y - Rename the component to
Date Picker - Headerin Figma. v1.1: Applied — node6788:109823now readsDate Picker - Header, so all five family members group together in the assets panel. The recommendation described it as stillPicker Header; that stopped being true during this run. Rename
Two roles and no states — the weekday label is never pressed, selected or disabled. Both tokens match the rest of the family: the same pair carries Date Picker - Cell's default day.
| Role | Token | Value |
|---|---|---|
| Container surface | bg/color-bg-primary-inverse | #FFFFFF |
| #text | text/color-text | #0A2757 |
iOS — Swift Package Manager
.package(url: "https://github.com/AY-Org/eb-ds-ios", from: "1.0.0")
Android — Gradle (Kotlin DSL)
implementation("com.eastblue.ds:date-picker:1.0.0")
Import
import EastBlueDS import com.eastblue.ds.datepicker.*
Planned API — the native library does not exist yet. The artifact is the Date Picker family, not this component: Cell, Header, Header Trigger, Calendar and the picker itself all ship in <code>com.eastblue.ds:date-picker</code> and import <code>com.eastblue.ds.datepicker.*</code>. On both platforms the weekday strip is normally supplied by the calendar view rather than assembled by hand.
One property. Everything else about this component is fixed — a 32 × 32 slot that carries a weekday abbreviation.
| Figma Property | SwiftUI | Compose |
|---|---|---|
| Label (text) | label: String | label: String |
EBDatePickerHeader(label: "Su")
EBDatePickerHeader(label = "Su")
| Requirement | iOS | Android |
|---|---|---|
| Label | .accessibilityLabel("Sunday") — the abbreviation spelled out | contentDescription = "Sunday" |
| Role / trait | No trait — it is static text, never a control | Modifier.semantics { } — no role, it is not clickable |
| Dynamic type | Supported, scales to AX5 — the 32pt slot is fixed, so very large sizes truncate before the grid reflows | sp units; the 32dp column is fixed for the same reason |
| Labels come from the locale | Calendar.current.veryShortWeekdaySymbols | DayOfWeek.getDisplayName(TextStyle.NARROW, locale) |
| The strip is decorative | .accessibilityHidden(true) on the row | Modifier.clearAndSetSemantics {} on the row |
| Weekday still reaches the user | Each day cell's label includes the weekday | Same, via the cell's contentDescription |
Do
Take the labels from the platform's calendar symbols so they follow the user's locale and first-day-of-week.
Don't
Don't hardcode Su–Sa; not every locale starts the week on Sunday.
Do
Keep the 32×32 footprint so the header aligns with the day columns.
Don't
Don't let the header set its own width — the grid columns will drift.
| ID | Criterion | Status | Notes |
|---|---|---|---|
| C1 | Layer Structure & Naming | Ready | Container → #text, matching the rest of the family. |
| C2 | Variant & Property Naming | Ready | No versions and one property, named Label after what it carries. The component is now Date Picker - Header, so it groups with the rest of the family in the assets panel. |
| C3 | Token Coverage | Ready | One text colour and one surface, both standard tokens. |
| C4 | Native Mappability | Ready | A text label in a row — trivially mappable on both platforms. |
| C5 | Interaction State Coverage | Not Applicable | Not interactive. |
| C6 | Asset & Icon Quality | Ready | No assets. |
One component, no versions. The seven columns differ only by their text.
| Component | Size | Node |
|---|---|---|
| Date Picker - Header | 32 × 32 | 6788:109823 |
Picker Header at the August assessment and is now Date Picker - Header, so Cell, Header, Header Trigger, Calendar and the picker sort together. This is what makes the release a minor rather than a patch.#FFFFFF fill switched off, over a Container that paints the real surface. Nothing drew it, but it read as a second surface when inspecting the layers — the same leftover cleared from Cell.#text; Figma names the property Label. Property Mapping, the spec card and the demo panel now use the property name, and the internal control key moved from day to label to match.Su through Sa, which documented a picklist that does not exist and hid that the label is free text. It is now a text input, as the guide requires for a text property.Primary/Bold/Body — no such style in the database. The layer resolves to Primary/Label/Small. Two rows went with it: the font spec, and a "Weight vs cell" row comparing this component to the day cell, which was neither a style name nor accurate any more.text/color-text-heading and bg/color-bg-main; the bindings are text/color-text and bg/color-bg-primary-inverse — the same pair the rest of the family uses. The hex values were right, which is what let the wrong token paths survive.Dimensions, Corner radius and an Alignment whose value was "matches Date Picker - Cell" — a cross-reference rather than a value. Now Height · Width · Radius · Padding H · Padding V · Alignment, with the asymmetric 10px top / 8px bottom recorded as read: the brand's fonts sit high in their box, so that split is intentional..eb-preview-dpwk declared no font and inherited the documentation font, BarkAda, while the component is Proxima Soft. It also painted no background, though the Container is white, and had no line-height against Figma's 14px.gcash/east-blue-ios and com.gcash.eastblue:components:1.0.0, with no Import line. Under the family rule the artifact is com.eastblue.ds:date-picker, imported as com.eastblue.ds.datepicker.*.HStack and Row looping over the locale's weekday symbols — how to assemble a header row. One call now, EBDatePickerHeader(label:), built from the same definition as the spec card and the live preview, and renamed from EBPickerHeader to the family form.Label property.getSnippet was added so the DEV code block is live rather than frozen.Date Picker - Item instance carrying states a header can never use.Picker Header/Default read as a variant group in the assets panel around a component with no variants.container to Container, matching the cell and the header trigger.