Skip to content

spec(AST-111): date components use the calendar the application chooses - #9605

Open
nynexman4464 wants to merge 12 commits into
mainfrom
nynexman4464/spec/calendar-systems
Open

nynexman4464 wants to merge 12 commits into
mainfrom
nynexman4464/spec/calendar-systems

Conversation

@nynexman4464

@nynexman4464 nynexman4464 commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Exact decision needed

Whether Astryx date components support calendar systems other than Gregorian, and if so the observable contract. That covers how the calendar is selected, what values are, where calendar structure comes from, typed entry, presentations, shared formatters, the Temporal boundary, the Chinese and Korean caveat, and the browser-support exception.

Existing authority searched

Decision

  • Values stay Gregorian ISO everywhere (FR3). The calendar changes only what people see, type, and navigate.
  • The application chooses the calendar. The order is the component's calendar prop, then the provider's calendar prop, then an explicit -u-ca- in the locale, then gregory. A bare fa-IR stays Gregorian (FR2), and Gregorian stays the default.
  • Supported calendars: the 16 that ECMA-402 and Temporal require (FR1). Structure comes from the calendar: 13-month years, leap months, and eras (FR4).
  • Temporal does all calendar arithmetic. Gregorian-aligned calendars (gregory, iso8601, buddhist, roc, japanese) need no Temporal. The others use native Temporal or a polyfill the application loads on the server and in the browser. Without it, those calendars fall back to Gregorian with a development warning (FR5).
  • Calendar (FR6–FR8):
    • It shows calendar months and keeps the fixed six-row default, even for the 5-day Ethiopic month.
    • It uses locale digits in day cells.
    • Year steps keep the month.
    • Week numbers stay ISO 8601.
  • Typed entry (FR9–FR14):
    • One parser reads text written the way Intl writes it for the locale and calendar.
    • Years are read literally in the calendar, and the era is shown.
    • A plain Adar in a leap year is Adar II.
    • Dates that don't exist are rejected, not adjusted.
    • onChange fires once per complete date.
    • There is no default year range.
  • Presentations (FR15–FR17):
    • With a calendar other than Gregorian, every native presentation uses the Astryx picker: the popover on desktop, the bottom sheet on touch. That includes an explicit presentation="native", which also warns (DEC-7, an amendment to AST-043 FR2).
    • The bottom sheet's month calendar and wheels follow the calendar.
    • Touch wheels follow the calendar.
    • DateRangeInput renders in the calendar, without typed entry.
  • Shared formatters follow the provider's calendar (FR18). formatSharedDate and the charts shortDate/monthYear gain an optional calendar argument.
  • Chinese and Korean follow the runtime's Temporal, with a documented caveat (FR19). That includes the mixed-runtime hydration case, which the AST-013 exception names.
  • Gregorian compatibility (AST-017):
    • The Shift+Page year step gives keys with no documented behavior the APG year step: nonbreaking (FR3, FR5).
    • onChange timing and the AR3 messages are FR5 nonbreaking changes.
    • Out-of-range typed text stays in the field with its error instead of reverting on blur; the value doesn't change: nonbreaking (FR5).
    • A two-digit year follows the locale's field order (1/5/26 in en-GB is 1 May, not 5 January): a fix (FR5). In month-first locales it reads within FR10's window, so in 2026 1/5/46 to 1/5/49 commit 1946 to 1949 instead of the runtime Date reading 2046 to 2049. component:DateInput FR6 records that Date fallback as a gap, so this restores FR6: nonbreaking (FR5).
    • parseDateInput is unchanged. The Gregorian field still commits any text it reads, except a one-digit year, including text the new forms read as a date the locale's order doesn't have (13/5/2026 in en-US commits 13 May 2026).
    • A one-digit year is not a date: 1/5/2 no longer commits the runtime Date reading of 2002, which also restores DateInput FR6: nonbreaking (FR5).
  • Safari: every component that resolves a calendar (Calendar, the DateInput family, Timestamp, PowerSearch) records an AST-013 FR12 exception, since iOS Safari lacks Temporal. Server rendering needs Temporal on the server too.

Rejected alternatives

  • Following the locale's default calendar: it silently changes every screen in fa, th, ar-SA, and similar locales.
  • Values tagged with their calendar: every consumer would then need calendar-aware code.
  • Calendar arithmetic owned by Astryx: an Intl-only engine was prototyped and matched Temporal, but correctness and maintenance belong with the platform.
  • A bundled polyfill: every Gregorian application would pay for it.
  • Segmented day, month, and year fields: they replace DateInput's free-text interaction.
  • Forcing one polyfill everywhere for Chinese and Korean consistency: drop-in polyfills read the host's Intl data, which makes native environments less consistent.
  • A default year range: it would reject dates that applications accept today.

Claim scope and non-goals

The record governs only FR1–FR19 and AR1–AR3. Out of scope:

  • inferring a calendar from a bare locale;
  • calendar-tagged values;
  • a public adapter API;
  • calendars outside FR1;
  • Japanese eras before Meiji;
  • traditional numerals as input;
  • typed range entry;
  • non-ISO week numbering.

Evidence and implementation relationship

  • Research and prototype results: RFC [RFC][Draft] Explore explicit alternative calendar-system support #5498, which covers prior art across web libraries and native platforms, browser support, the Chinese and Korean engine comparison, and the typed-entry design. The demand evidence is [RFC] Jalali (Persian) calendar support for DateInput/Calendar #9051.
  • Prototype (local, not part of this PR):
    • Calendar wired to Temporal for all 16 calendars.
    • Month structure from 1900 through 2100 matches @internationalized/date and native Temporal in Chromium and Firefox. The exceptions are the Chinese and Korean engine differences that FR19 documents.
    • Real-browser checks pass with native Temporal, and with Temporal removed and a polyfill loaded. The fallback checks pass with Temporal removed and no polyfill.
    • A sketch parser had zero failures in round trips of every day from 1900 through 2100, across 23 locale/calendar pairs and four named formats.
  • Implementation follows in separate PRs once this record is approved.

Writing rubric results

  • R1 narration: one "today" in DEC-4 removed. No other narration found.
  • R2 research in the record: none. Surveys and measurements live in RFC [RFC][Draft] Explore explicit alternative calendar-system support #5498. DEC-1 and DEC-4 keep a one-sentence conclusion each.
  • R3 evidence naming a change: none. Verification cells name tests and states.
  • R4 rejected alternatives over one line or outside a decision: six, each one line inside its decision.
  • R5 pull request or issue references remaining: none.
  • R6 ruled open questions still listing options: none. Open questions: none.

Screenshots

From the implementation PRs:

Calendar, Persian (fa-IR) Hebrew leap year Typed Persian entry
Persian Hebrew Typed Persian

Scope

  • This PR contains specification records only.
  • It records observable behavior and preserves equivalent internal implementations.
  • Any named internal mechanism is intentionally public, names its dependent caller/system, and explains why an equivalent implementation would not satisfy the contract. (Temporal and the polyfill entry are named because applications load them.)
  • Verification states the evidence layer and failure signal without prescribing CI job/workflow topology.
  • It records one intentional durable decision, not a rescue for a separable tagalong.
  • The canonical knowledge owner, affected current claims, and overlapping open work are named; any ownership collision is resolved or called out for human decision.
  • Adjacent API, visual, accessibility, composition, and implementation facts remain outside scope unless this exact decision depends on them.
  • Public text and artifacts contain no internal Meta context.

Validation

  • pnpm check:knowledge: passes
  • Prettier: passes
  • git diff --check: clean

@vercel

vercel Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
astryx Ready Ready Preview Nov 3, 2026 10:07pm UTC

Request Review

@astracat-bot

astracat-bot Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

AI review status for this pull request.

Review status Updated
❓ Needs maintainer input (for maintainers only) Nov 3, 2026, 10:18 PM UTC

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Nov 2, 2026

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This draft spec needs an engineering owner's decision before it can be approved. spec:AST-111 adds requirements that no current record states, and it replaces architecture:internationalization INV10's Gregorian-only grids, navigation, parsing and formatters. An engineering owner records that decision by commenting /approve-spec c3b60c918a83af4e23d4b1daaa003b6f9e236e1c on this pull request, approving or amending FR1–FR19, AR1–AR3 and DEC-1–DEC-6, including the Gregorian changes to Shift+PageUp/PageDown, onChange timing and parseDateInput; the author may do so as an engineering owner. Whatever that decision is, the record also needs these fixes:

  • FR15 gives explicit presentation="native" the Astryx surface, which contradicts spec:AST-043 FR2, so keep native native or list AST-043 as amended.
  • FR5 promises the same markup when both sides have Temporal, but with FR19's polyfill advice a native server and a polyfilled browser can lay out chinese and dangi months differently, so spec:AST-013 FR9 is not preserved.
  • The Gregorian behaviour changes (FR7, FR12, AR3 and parseDateInput) need a spec:AST-017 compatibility class in Current-state impact, and DEC-1 should not say existing callers are unaffected.
  • FR18 should name each date helper that gains a calendar option.

[Automated review]

- **FR15 — Other calendars use the Astryx picker.** `<input type="date">` is
Gregorian by specification. With a calendar other than `gregory` or `iso8601`,
`presentation="adaptive-native"` resolves to `adaptive-bottom-sheet`, and
`presentation="native"`, or the deprecated `nativePicker="always"`, uses the

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sends explicit presentation="native" to the Astryx surface. spec:AST-043 FR2 says explicit native "MUST always show the native surface, with no eligibility fallbacks", and AST-043 is not in Current-state impact. Keep native native and limit the fallback to adaptive-native and legacy nativePicker="always", or list AST-043 FR1–FR2 as amended.

Comment on lines +148 to +149
The component resolves its calendar before its first render, so a server and
a browser that both have `Temporal`, or both lack it, render the same markup.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FR19 advises loading a polyfill only where Temporal is missing, so a Node.js 26 server (native) and iOS Safari (polyfill) both have Temporal. FR19 also says those two can start nine Chinese and four Korean months a day apart, so the hydrating render can differ from the server markup, which spec:AST-013 FR9 forbids. The exception below lists FR9 as preserved. Name this mixed-runtime case and what the component does in it.

**Decider:** `nynexman4464`, 2026-11-02

The calendar changes presentation and input only, so application data, forms,
servers, and existing callers are unaffected. Date libraries and platforms that

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"existing callers are unaffected" doesn't hold for Gregorian callers: FR7 changes Shift+PageUp/PageDown, FR12 changes when onChange fires, AR3 changes rejection messages, and parseDateInput loses its Date fallback. Please list these in Current-state impact with their spec:AST-017 class, and narrow this sentence to stored values.

Comment on lines +239 to +240
`system_*` formats do not change. Pure date helpers keep a Gregorian default
and an explicit calendar option; Astryx call sites pass the resolved calendar.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Which pure date helpers gain the calendar option? The public candidates are plainDateFormat, formatSharedDate, and the charts formatters shortDate and monthYear. Naming them in the Public contract gives the implementation's API changes a record to match.

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This draft spec needs an engineering owner's decision before it can be approved: spec:AST-111 adds calendar-system requirements that no current record states and replaces architecture:internationalization INV10's Gregorian-only grids, navigation, parsing and formatters. An engineering owner records that decision by commenting /approve-spec ef172d33b9aa5266bad9447b0a371d38ba0fe9e2 on this pull request, approving or amending FR1–FR19, AR1–AR3 and DEC-1–DEC-6, including the Gregorian changes to Shift+PageUp/PageDown, onChange timing and typed parsing; the author may do so as an engineering owner. Whatever that decision is, three record fixes remain:

  • The spec:AST-013 FR12 exception lists FR9 as preserved, but a server and browser that differ on Temporal (a Node.js server older than 26 with Chrome 144 and no polyfill, say) hydrate different markup for every Temporal calendar, so name that case or keep the server's resolution through hydration.
  • FR7's year step cites spec:AST-017 FR53, but component:Calendar AR1 adopts the APG Grid pattern with PageUp/PageDown by a month, so classify it under FR3/FR5 or amend AR1 first.
  • The Gregorian change list says no caller changes, yet 1/5/26 in a day-first locale commits 1 May 2026 instead of today's 5 January 2026, so list the two-digit-year order change with its class.

[Automated review]

once in development, on the server and in the browser, naming the polyfill.
The component resolves its calendar before its first render, so a server and
a browser that both have `Temporal`, or both lack it, render the same markup,
except in FR19's mixed-runtime case.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A server and browser where only one side has Temporal also render different markup: a Node.js server older than 26 renders Gregorian, and Chrome 144 renders the selected calendar in the hydrating render, for every Temporal calendar. spec:AST-013 FR9 forbids that, and the exception below lists FR9 as preserved outside the Chinese and Korean case. Name the one-sided case, or keep the server's resolution through hydration and switch after it.

control cannot express, and an explicit `presentation="native"` stays native.
- Gregorian behavior that changes, with its `spec:AST-017` class:
- FR7's Shift+PageUp and Shift+PageDown year step conforms the grid to the APG
date picker pattern: an accessibility behavior fix (FR53).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spec:AST-017 FR53 covers the required parts of an APG pattern the component adopts under spec:AST-020 FR15. component:Calendar AR1 adopts the APG Grid pattern with "PageUp and PageDown by a month"; the date picker is an APG dialog example. Shift+Page is undocumented today, so this is nonbreaking under FR3/FR5, or AR1 can adopt the year step first.

rejects (FR5).
- `parseDateInput` in `@astryxdesign/core/utils` does not change, and the
Gregorian text field still commits any text it reads (FR9), so no caller
changes.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FR9's fallback covers only text that matches none of its forms. 1/5/26 matches the numeric form, so in en-GB it commits 1 May 2026, where parseDateInput falls through to new Date and commits 5 January 2026 today. Please list this two-digit-year order change here with its class, and say whether FR11 or FR9's fallback wins for numeric text invalid in the locale's order, such as 13/5/2026 in en-US.

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This draft spec needs an engineering owner's decision before it can be approved: spec:AST-111 adds calendar-system requirements that no current record states, replaces architecture:internationalization INV10's Gregorian-only grids, navigation, parsing and formatters, and amends spec:AST-043 FR2 so that a non-Gregorian calendar overrides an explicit presentation="native". An engineering owner records that decision by commenting /approve-spec e915e2f75f6cd9b482db6c1c57a45ce71281fd8b on this pull request, approving or amending FR1–FR19, AR1–AR3 and DEC-1–DEC-7, including the Gregorian changes to Shift+PageUp/PageDown, onChange timing, typed parsing and out-of-range text; the author may do so as an engineering owner. Whatever that decision is, three record fixes remain:

  • The spec:AST-013 FR12 exception lists FR9 as preserved, but a server and browser where only one side has Temporal (for example a Node.js server older than 26 with no polyfill, serving Chrome 144) hydrate different markup for every Temporal calendar, so name that case or keep the server's resolution through hydration.
  • FR7's year step is classed as a spec:AST-017 FR53 fix, but component:Calendar AR1 adopts the APG Grid pattern with PageUp/PageDown by a month and no year step (only component:DateInput AR8 names it), so have Calendar AR1 adopt it first or class the Calendar half under FR3.
  • The Gregorian change list says no caller changes, yet 1/5/26 in a day-first locale commits 1 May 2026 instead of today's 5 January 2026, so list the two-digit-year order change with its class and say which rule wins for numeric text that is invalid in the locale's order.

Two smaller points: the AST-043 amendment line should also cover the new adaptive-native and nativePicker fallback and DateTimeInput's time segment, and FR19 and Platform support should name the Temporal capability instead of hand-written browser versions.

[Automated review]

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This draft spec needs an engineering owner's decision before it can be approved: spec:AST-111 adds calendar-system requirements that no current record states, replaces architecture:internationalization INV10's Gregorian-only grids, navigation, parsing and formatters, and amends spec:AST-043 FR1–FR3 so that a non-Gregorian calendar overrides an explicit presentation="native". An engineering owner records that decision by commenting /approve-spec db790f8f9a89f837161006577ec81c108ad04983 on this pull request, approving or amending FR1–FR19, AR1–AR3 and DEC-1–DEC-7, including the Gregorian changes to Shift+PageUp/PageDown, onChange timing, short typed years and out-of-range text; the author may do so as an engineering owner. Whatever that decision is, three fixes remain:

  • FR5's Gregorian fallback applies to any component that resolves a Temporal calendar, which FR18 makes Timestamp and PowerSearch do, but only Calendar, DateInput, DateRangeInput and DateTimeInput get the spec:AST-013 FR12 exception, so add those two to it or limit FR5's fallback to the four input components and say that FR18's formats need no Temporal.
  • The Gregorian change list names only the day-first two-digit-year change, yet in month-first locales 1/5/46 would commit 1946 instead of today's 2046 and 1/5/2 (today 2002) has no rule, so list the window change and say how a one-digit year reads.
  • The description's Gregorian compatibility list still calls the Shift+Page year step an FR53 accessibility fix and leaves out the out-of-range-text and two-digit-year changes, while the record classes the step under AST-017 FR3/FR5 and lists both, so update the description to match the record.

Three smaller points are optional: the FR7 class line says Calendar AR1 names the year step when only DateInput AR8 does today, the FR11 line cites AST-017 FR5 for a change to DateTimeInput's documented revert, and FR15 leaves DateTimeInput's time segment under an explicit native open.

[Automated review]

and work in every supported environment. The other calendars use the
runtime's `Temporal`, native or loaded by the application as a polyfill.
Astryx bundles no polyfill. Where `Temporal` is missing, a component that
resolves one of those calendars renders and accepts Gregorian dates and warns

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FR18 has Timestamp, PowerSearch and the chart formatters resolve the provider calendar, so this fallback reaches them too. Timestamp is SSR-capable with no spec:AST-013 FR12 exception, and its FR3 requires hydration without a mismatch, but the exception below covers only Calendar, DateInput, DateRangeInput and DateTimeInput. Either add Timestamp and PowerSearch to the exception, or limit this fallback to the four input components and say FR18's formats render every FR1 calendar through Intl without Temporal.

does not change in either case: a nonbreaking interaction change (FR5).
- `parseDateInput` in `@astryxdesign/core/utils` does not change, and the
Gregorian text field still commits any text it reads (FR9).
- A two-digit year follows the locale's field order: `1/5/26` in `en-GB`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This names only the day-first case. In month-first locales the latest stable release hands short years to native Date (pivot 1950–2049), so 1/5/46 in en-US commits 2046 today and 1946 under FR10's window, and 1/5/2 commits 2002 today with no rule here (FR10 and DEC-4 read years literally; FR12 names Enter-or-blur commits only for two-digit years). Please list the window change with its class and say whether a one-digit year is read literally or rejected.

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This draft spec needs an engineering owner's decision before it can be approved: spec:AST-111 adds calendar-system requirements that no current record states, replaces architecture:internationalization INV10's Gregorian-only grids, navigation, parsing and formatters, and amends spec:AST-043 FR1–FR3 so that a non-Gregorian calendar overrides an explicit presentation="native". An engineering owner records that decision by commenting /approve-spec d77c1792a2a6121b93ecac6233caa69c44d71fcb on this pull request, approving or amending FR1–FR19, AR1–AR3 and DEC-1–DEC-7, including the Gregorian changes to Shift+PageUp/PageDown, onChange timing, short typed years and out-of-range text; the author may do so as an engineering owner. Whatever that decision is, three fixes remain:

  • FR9 and Current-state impact promise that the Gregorian field still commits all text parseDateInput reads, and the FR9–FR14 Verification row fails if it stops, yet the new one-digit rule refuses 1/5/2, which parseDateInput reads as 5 January 2002, so carve the one-digit year out of those three places and the description, or drop the rule.
  • Platform support now gives Timestamp and PowerSearch the spec:AST-013 FR12 exception, but Current-state impact still records it for only Calendar, DateInput, DateRangeInput and DateTimeInput, so add component:Timestamp and component:PowerSearch to that line.
  • The year-step line credits component:Calendar AR1 with naming the Shift+Page year step, which only component:DateInput AR8 does, and the short-year lines say no record documents the Date reading although component:DateInput FR6 records it as an implementation gap, so correct both citations.

Three smaller points are optional: FR18 says chart date formatters follow the provider's calendar although shortDate and monthYear are pure helpers with a Gregorian default, the FR11 line classes the out-of-range-text change under spec:AST-017 FR5 despite DateTimeInput's documented revert, and FR15 leaves DateTimeInput's time segment under an explicit native open.

[Automated review]

the Gregorian calendar, text that matches none of these forms, or that names a
date the locale's numeric order does not have, still commits on Enter or blur
when `parseDateInput` reads it: `13/5/2026` in `en-US` commits 13 May 2026.
Otherwise FR11 applies. A one-digit year is not a date.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

parseDateInput, which the record keeps unchanged, reads 1/5/2 in en-US as 5 January 2002, so the fallback two lines up commits it while this sentence refuses it; Current-state impact ("still commits any text it reads") and the FR9–FR14 Verification failure ("Gregorian text that parseDateInput reads stops committing") say the same as the fallback. Carve the one-digit year out of all three, for example "still commits any text it reads, except a one-digit year", or drop this rule.

- `component:Calendar`, `component:DateInput`, `component:DateRangeInput`, and
`component:DateTimeInput` add the `calendar` prop, project FR4–FR17 and
AR1–AR3, and record the `spec:AST-013` FR12 exception.
- `component:Timestamp` and the PowerSearch, Schedule, and chart formatters

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform support now has Timestamp and PowerSearch record the spec:AST-013 FR12 exception, but this line only has them follow FR18, and no PowerSearch record is named. Add component:Timestamp and component:PowerSearch to the line that records the exception.

- Gregorian behavior that changes, with its `spec:AST-017` class:
- FR7's Shift+PageUp and Shift+PageDown year step gives keys with no
documented behavior the APG date picker's year step, which
`component:Calendar` AR1 names as an exception: nonbreaking (FR3, FR5).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

component:Calendar AR1 binds only "PageUp and PageDown by a month" and names no Shift+Page exception; component:DateInput AR8 names the year step, for the touch scroller. Cite DateInput AR8, or say Calendar AR1 documents no Shift binding; the nonbreaking class still holds.

- In month-first locales a two-digit year reads within FR10's window, where
the latest stable release uses the runtime's `Date` parsing: in 2026,
`1/5/46` to `1/5/49` in `en-US` commit 1946 to 1949 instead of 2046 to 2049.
No record documents the `Date` reading: nonbreaking (FR3).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

component:DateInput FR6 on main records this reading as an implementation gap: "In a month-first locale, numeric text outside the locale-ordered forms (such as 1/5/25) still falls back to the browser's month-first reading". Cite that gap and class this line and the one-digit line as a spec:AST-017 FR5 restoration of FR6, which stays nonbreaking.

…p and PowerSearch in Current-state impact; cite DateInput FR6

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This draft spec needs an engineering owner's decision before it can be approved: spec:AST-111 adds calendar-system requirements that no current record states, replaces architecture:internationalization INV10's Gregorian-only grids, navigation, parsing and formatters, and amends spec:AST-043 FR1–FR3 so that a non-Gregorian calendar overrides an explicit presentation="native". An engineering owner records that decision by commenting /approve-spec 7cade50e286384cfa091d7befbf568049b6b5e77 on this pull request, approving or amending FR1–FR19, AR1–AR3 and DEC-1–DEC-7, including the Gregorian changes to onChange timing, short typed years and out-of-range text; the author may do so as an engineering owner. Whatever that decision is, two fixes remain:

  • FR15 and DEC-7 send an explicit presentation="native" to the popover or the bottom sheet, which architecture:public-component-api INV16 rules out ("a caller's explicit choice always wins over that default"), so add INV16 to Current-state impact with the calendar exception, or resolve an explicit native to one surface on every pointer.
  • The Current-state impact line for Shift+PageUp and Shift+PageDown calls them keys with no documented behavior, but component:Calendar AR1 on main now binds them to a year step and the Shift+Page bug is closed, so say that Calendar already steps a Gregorian year and that FR7 extends the step to calendar years and leap months, and update the description to match.

Four smaller points are optional: state FR7's day clamp for the year step as Calendar AR1 does, name component:DateTimeInput's revert row in the FR11 line, align the FR18 Verification row with chart helpers that follow only their calendar argument, and say whether DateTimeInput's time segment stays native under adaptive-native.

[Automated review]

Comment on lines +229 to +233
other than `gregory` or `iso8601`, every presentation that shows the native
control uses the Astryx surface instead: the popover on a fine pointer and the
bottom sheet on a coarse pointer. This covers `adaptive-native`, the default,
the deprecated `nativePicker` values, and an explicit `presentation="native"`,
which also warns in development.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sends an explicit presentation="native" to the popover or the bottom sheet by pointer type. architecture:public-component-api INV16 says a component's touch behavior is its default "and a caller's explicit choice always wins over that default", and Current-state impact amends only spec:AST-043 FR1–FR3. Add INV16 to Current-state impact with this calendar exception, or resolve an explicit native to one Astryx surface on every pointer.

Comment on lines +330 to +332
- FR7's Shift+PageUp and Shift+PageDown year step gives keys with no
documented behavior the APG date picker's year step, which
`component:Calendar` AR1 names as an exception: nonbreaking (FR3, FR5).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

component:Calendar AR1 on main now binds "Shift+PageUp and Shift+PageDown by a year (a named exception, as in the APG date picker dialog; a day the target month lacks clamps to its last day)", and component:DateInput AR8 states the step for the touch scroller, so these keys are documented. Say that Calendar already steps a Gregorian year and that FR7 extends the step to calendar years and leap months; FR7 could also state the same day clamp.

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This draft spec needs an engineering owner's decision before it can be approved: spec:AST-111 adds calendar-system requirements that no current record states, replaces architecture:internationalization INV10's Gregorian-only grids, navigation, parsing and formatters, and amends spec:AST-043 FR1–FR3. An engineering owner records that decision by commenting /approve-spec 9400c9ee89261a01710b5181f8b1b0fcb9724353 on this pull request, approving or amending FR1–FR19, AR1–AR3 and DEC-1–DEC-7; the author may do so as an engineering owner.

These need changes whatever the decision:

  • The new Current-state impact line classes the explicit -u-ca- switch as nonbreaking, but an app that renders locale="th-TH-u-ca-buddhist" today sees Gregorian dates and must add calendar="gregory" to keep them, which is breaking under spec:AST-017 FR1, so class it breaking with calendar="gregory" as the restoring prop or keep a released -u-ca- locale Gregorian until the application sets calendar.
  • FR15 and DEC-7 override an explicit presentation="native", which architecture:public-component-api INV16 says always wins, yet Current-state impact amends only spec:AST-043, so add INV16 there with the calendar exception.
  • The Shift+Page line says FR7 gives "keys with no documented behavior" a year step, but component:Calendar AR1 on main already binds Shift+PageUp and Shift+PageDown to a year, so say FR7 extends that step to calendar years and leap months and update the description to match.

[Automated review]

Comment on lines +329 to +333
- A provider locale with an explicit `-u-ca-` keyword, which the latest stable
release shows in Gregorian, shows that calendar in `Calendar`, the date
inputs, and FR18's formats. The keyword is the application's explicit request
for the calendar (DEC-2): nonbreaking (FR5), and `calendar="gregory"` keeps
Gregorian.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An app that renders locale="th-TH-u-ca-buddhist" today gets Gregorian Timestamps and types Gregorian years (component:Timestamp FR2: "with Gregorian years"). Under FR2 and FR10 it shows Buddhist 2569 and commits a typed 2026 as Gregorian 1483, and keeping the released output takes calendar="gregory". spec:AST-017 FR1 calls that breaking ("must change source or configuration to keep its … data, semantic output … working"), and FR6 says few affected callers does not change the class. Class it breaking with calendar="gregory" as the restoring prop (spec:AST-017 FR3), or keep a released -u-ca- locale Gregorian until the application sets calendar.

This branch was successfully deployed

1 active deployment
Preview — 9400c9ee Deployed Nov 3, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Meta Open Source bot.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant