Skip to content

feat(DateRangeInput): show the range in the calendar - #9653

Open
nynexman4464 wants to merge 5 commits into
nynexman4464/feat/calendar-bottom-sheetfrom
nynexman4464/feat/calendar-presentations
Open

nynexman4464 wants to merge 5 commits into
nynexman4464/feat/calendar-bottom-sheetfrom
nynexman4464/feat/calendar-presentations

Conversation

@nynexman4464

@nynexman4464 nynexman4464 commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Base is #9794's branch. This diff holds only this PR's commits. #9837 stacks on this branch.

This implements spec:AST-111 (draft, #9605) FR17 for DateRangeInput, with FR3 and FR5. The native-fallback (FR15) and bottom-sheet (FR16) parts that this PR used to carry are now the two PRs below it.

User need

Under a non-Gregorian provider, DateRangeInput is the last date component that still shows Gregorian text: a Persian booking form shows "Oct 30 – Nov 2" in its trigger while every other date reads in Persian. People can't read or pick a range in the application's calendar.

Problem and solution fit

  • FR17: DateRangeInput takes calendar, defaulting to the provider's calendar, else gregory. A -u-ca- keyword in the provider locale does not select the calendar. Its trigger text and popover Calendar use it; the trigger shows the year when either end falls outside the current calendar year. It has no typed entry.
  • Values, min, max, presets and span bounds stay Gregorian ISO (FR3). Without Temporal, calendars that need it fall back to Gregorian and warn once in development (FR5).
  • Supporting changes: tests, a story, the doc, the records and the API report. feat(Calendar): show the months of the selected calendar system #9622's Calendar test now expects DateRangeInput's popover in the calendar instead of Gregorian.

Current specification

Public delta and caller burden

  • New: DateRangeInput calendar?: CalendarSystem, defaulting to the provider's calendar, else 'gregory' (API report row added).
  • No change for gregory/iso8601.
<InternationalizationProvider locale="fa-IR" calendar="persian">
  <DateRangeInput label="Stay" value={range} onChange={setRange} /> {/* "۸ آبان – ۱۱ آبان" */}
</InternationalizationProvider>

Caller decisions: none. calendar is optional.

Design and alternatives

  • DateRangeInput reuses the calendar-system formatting and the Calendar calendar prop; it adds no new model.

Evidence

  • DateRangeInput tests: Persian trigger text, the provider's calendar, a range across Nowruz, the popover calendar with Gregorian ISO onChange, Buddhist years, Gregorian text by default, and the no-Temporal fallback.
  • Real browsers against Storybook, desktop and mobile viewports: Chromium 149 and Firefox 151 with native Temporal, with the polyfill, and with no Temporal; WebKit (Safari 26.5) with the polyfill and with no Temporal.

Screenshots

Chromium 149 with native Temporal.

State Screenshot
Desktop, DateRangeInput trigger in Persian Desktop, DateRangeInput trigger in Persian
Desktop, DateRangeInput popover in Persian Desktop, DateRangeInput popover in Persian
Phone, DateRangeInput trigger in Persian Phone, DateRangeInput trigger in Persian

Scope

  • One capability is added.
  • Unrelated fixes, cleanup, and policy changes were removed or split.
  • Consumer docs, focused tests, and migration evidence ship with the feature.
  • Public text and artifacts contain no internal Meta context.

Testing

  • pnpm exec vitest run --maxWorkers=2 packages/core/src/Calendar/Calendar.calendarSystems.test.tsx packages/core/src/DateRangeInput/DateRangeInput.calendar.test.tsx packages/core/src/docPropLiterals.test.ts: 3 files, 49 tests passed.
  • pnpm exec tsc --noEmit -p packages/core: passes.
  • pnpm check:knowledge, pnpm check:changesets: pass.
  • pnpm review:pre --base nynexman4464/feat/calendar-bottom-sheet: 474 authored lines, no findings.
  • Playwright against Storybook story core-daterangeinput--calendar-systems.

Writing rubric results

component:DateRangeInput

  • R1 narration: Intent, the compatibility line, the calendar concept, FR6, the Calendar state row, and the AST-013 FR12 exception are present tense.
  • R2 research: none.
  • R3 evidence: FR3's basis cited a pull request; it now reads "consumer demand for preset theming".
  • R4 rejected alternatives: none.
  • R5 change references: that one, replaced.
  • R6 open questions: OQ1 is unanswered and unchanged.

component:Calendar

  • R1 narration: the relationship bullet now states that all three inputs pass their calendar.
  • R2 research: none.
  • R3 evidence: unchanged. The existing (#2715) is part of a quoted test title.
  • R4 rejected alternatives: none.
  • R5 change references: only that quoted test title.
  • R6 open questions: unchanged.

component:InternationalizationProvider

  • R1 narration: FR10 lists DateRangeInput among the components that follow the calendar.
  • R2 research: none.
  • R3 evidence: none changed.
  • R4 rejected alternatives: none.
  • R5 change references: none.
  • R6 open questions: none.

@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 4, 2026 7:56pm UTC

Request Review

@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 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 4, 2026, 8:16 PM UTC

@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.

Approval waits on an engineering owner's spec decision, and three changes are needed whatever that decision is.

The behavior rests on spec:AST-111 FR15–FR17 and DEC-7, which are only in #9605. Overriding an explicit presentation="native" in non-Gregorian calendars contradicts current spec:AST-043 FR1–FR3 and architecture:public-component-api INV16, so an engineering owner needs to approve that direction, the new DateRangeInput calendar prop, and the locale-digit day numbers in Gregorian bottom sheets. An engineering owner records the decision by commenting /approve-spec <full head SHA> on this pull request; the author may do so if they are an engineering owner.

Blocking findings:

  • The PR changes 2,479 authored lines; please split it along its existing commits (the native-surface override, the bottom sheet in calendar months, and the DateRangeInput calendar prop) so each PR stays under 2,000 lines.
  • spec:AST-043 FR1 and FR3 and component:DateTimeInput FR3 still map native and always to the native surface; add the calendar exception to them as well as to AST-043 FR2.
  • In the Japanese calendar, the bottom sheet's year wheel labels 2019 as 令和元 while January–April 2019 are 平成31; label an era-change year with both eras, or from the month on screen.

[Automated review]

always show the native surface, with no eligibility fallbacks — a state the
native control cannot express (seconds, non-default step/increment, preset
time options, no usable native control) is the caller's explicit choice.
The one exception is the calendar: with a calendar other than `gregory` or

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 exception lands only in FR2. FR1's table (line 62) still maps native to Native on both pointers, and FR3 (line 111) still says "always maps to the native surface on every pointer". component:DateTimeInput FR3 also still says presentation "MUST follow spec:AST-043 FR1–FR4". Under a non-Gregorian calendar the code sends all three to the popover or sheet, so please state the calendar exception in FR1 and FR3, and in DateTimeInput FR3, too.

return String(year);
}
const months = calendarMonthsInCalendarYear(calendar, year);
const middle = calendarMonthOfYear(

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

For Japanese, the wheel's years are Gregorian years labelled from their middle month, so 2019 reads 令和元. The panes and title for January–April 2019 read 平成31年1月–平成31年4月, and 1912 has the same split. Could an era-change year carry both era years (平成31・令和元), or take the selected year's label from the month the sheet shows? A 2019 case in "labels Japanese years with their era" would pin it.

@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.

Approval waits on an engineering owner's spec decision, and two changes are needed whatever that decision is.

This PR intentionally changes established spec. Overriding an explicit presentation="native" in non-Gregorian calendars contradicts current spec:AST-043 FR1–FR3 and architecture:public-component-api INV16, and the calendar bottom sheet, the locale-digit day numbers in Gregorian sheets and the new DateRangeInput calendar prop rest on spec:AST-111 FR15–FR17, which are only in #9605. An engineering owner needs to approve that direction, which updates those existing claims, by commenting /approve-spec <full head SHA> on this pull request; the author may do so if they are an engineering owner.

Blocking findings:

  • The PR changes 2,551 authored lines; please split it into the native-surface override, the calendar bottom sheet, and the DateRangeInput calendar prop so each PR stays under 2,000 lines.
  • Proposed spec:AST-043 FR1–FR3 still map native, adaptive-native and always to the native surface, and component:DateTimeInput FR3 still points at them; state the calendar exception in those clauses too, not only for an explicit native in FR2.

The Japanese era label in era-change years now names both eras, as asked.

[Automated review]

| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| FR1 | DateTimeInput MUST reflect one controlled date-time value across its visible segments and active picker, and MUST NOT reveal a competing selected date after the parent accepts a clear. | Public docs, controlled component seam, current source, focused tests |
| FR2 | Every committed date or time change MUST emit one valid combined ISO date-time value; clearing MUST emit `undefined`; changing time while no date is committed MUST emit nothing. | Public types, docs, current source, focused tests |
| FR3 | `presentation`, deprecated `nativePicker`, precedence, pointer adaptation, forced surfaces, and per-segment native fallbacks MUST follow `spec:AST-043` FR1–FR4. The touch date sheet's month heading and month-pane names follow `component:DateInput` FR6. | `spec:AST-043` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

FR3 still says presentation "MUST follow spec:AST-043 FR1–FR4", and AST-043 FR1–FR3 still map native, adaptive-native and always to the native surface. FR11 below sends all of them to the popover or the bottom sheet outside gregory and iso8601. Could FR3 name the FR11 exception (and AST-043 FR1–FR3 carry it too), so the records agree with the code?

return <TouchDateField {...rest} isDisabled={isDisabled} />;
return (
<TouchDateField
// Its month indexes belong to the 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.

Non-blocking (comment style): "Its" has no clear subject here. Suggested: // Month indexes depend on the calendar. A new calendar remounts the sheet.

return <TouchDateTimeField {...sheetProps} />;
}
case 'sheet':
// Its month indexes belong to the 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.

Non-blocking (comment style): same wording as in DateInput. Suggested: // Month indexes depend on the calendar. A new calendar remounts the sheet.

@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.

Approval waits on an engineering owner's spec decision, and two changes are needed whatever that decision is.

This PR intentionally changes established spec: overriding an explicit presentation="native" in non-Gregorian calendars contradicts current spec:AST-043 FR1–FR3 and architecture:public-component-api INV16, and the calendar bottom sheet (including its era-label rule), the time segment leaving the native control, and the new DateRangeInput calendar prop rest on spec:AST-111 FR15–FR17, which is still a draft in #9605. An engineering owner needs to approve that direction, which updates those existing claims, by commenting /approve-spec <full head SHA> on this pull request; the author may do so if they are an engineering owner.

Blocking findings:

  • The PR changes 2,865 authored lines; please split it into the native-surface override, the calendar bottom sheet, and the DateRangeInput calendar prop so each PR stays under 2,000 lines.
  • The proposed component:DateRangeInput FR5 reuses the id that main already gives the preset reflow requirement, so after a rebase the record would hold two FR5 rows; please give the calendar requirement the next free id in the record, its verification row and the component:Calendar relationship line.

The AST-043 FR1, FR3 and DateTimeInput FR3 wording now carries the calendar exception, as asked earlier.

[Automated review]

| FR2 | When presets are present, each preset remains an independent button in one labeled group; the applied preset reflects current state and a preset whose endpoint violates `min`, `max`, or `dateConstraints`, or whose range violates `minRangeSpan` or `maxRangeSpan`, reflects disabled state. | Current source, accessibility comments, and focused tests | Verified current behavior |
| FR3 | The preset group and each preset button expose stable theme targets; selected and disabled are states of the preset-button target rather than separate targets. | `architecture:component-theming-surface`; consumer demand for preset theming | Approved additive contract |
| FR4 | Adding theme targets MUST NOT change the Popover, Calendar, button, focus, or selection semantics those elements already own. | Composition boundary and compatibility goal | Approved additive contract |
| FR5 | The trigger text and the popover Calendar show the resolved calendar (`spec:AST-111` FR2, FR17): the trigger writes each end of the range in the calendar, with the year when either end falls outside the current calendar year, and the Calendar lays out calendar months. The field has no typed entry. `value`, `onChange`, `min`, `max`, presets, and span bounds stay Gregorian ISO dates (`spec:AST-111` FR3). | `spec:AST-111` FR3, FR17; current source and calendar tests | Verified current behavior |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

main already uses FR5 in this record for the preset reflow requirement ("the preset group stacks above the calendar"), added after this stack branched. After a rebase this table would hold two FR5 rows; could the calendar requirement take the next free id, with its verification row and the component:Calendar relationship line updated to match?

);
const monthYearLabel = plainDateFormatStandaloneMonthYear(
{year, month, day: 1},
// The day the picker keeps: the selected date's day of its month. The month

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Non-blocking (comment style): the first sentence restates calendarDayOfMonth(calendar, selectedDate) and the second runs 29 words. Suggested: // In a month that spans an era change, the heading takes its era from this day, as the year wheel does. The same comment is in TouchDateTimeField.tsx.

return result;
}, [monthModel, calendar, locale, minMonthIndex, maxMonthIndex]);

// A year that spans an era change names the era of the date the wheels

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Non-blocking (comment style): this sentence runs 30 words. Suggested: // A year that spans an era change takes the era of the shown date, as on iOS. Its row text changes as the month turns.

@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-typed-entry branch from 90a16cd to 79e1235 Compare November 3, 2026 18:23
@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-presentations branch from 64eb7d5 to a4b6045 Compare November 3, 2026 18:23
@nynexman4464 nynexman4464 changed the title feat(DateInput, DateTimeInput, DateRangeInput): pickers in calendar systems feat(DateRangeInput): show the range in the calendar Nov 3, 2026
@nynexman4464
nynexman4464 changed the base branch from nynexman4464/feat/calendar-typed-entry to nynexman4464/feat/calendar-bottom-sheet November 3, 2026 18:24

@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.

Approval waits on an engineering owner's spec decision, and two fixes are needed whatever that decision is.

DateRangeInput's new calendar prop, and its trigger text and popover following the application's calendar, rest on spec:AST-111 FR17, which is still a draft in #9605. The change also departs from current architecture:internationalization INV10, which keeps date-component grids Gregorian. An engineering owner needs to approve that direction, including the proposed component:DateRangeInput FR5, its calendar concept row and its spec:AST-013 FR12 exception, by commenting /approve-spec <full head SHA> on this pull request; the author may do so as an engineering owner.

Blocking findings:

  • The proposed component:DateRangeInput FR5 reuses the id main already gives the preset reflow requirement, so please give the calendar requirement the next free id and update its verification row, its relationship line and the citation in component:Calendar.
  • The calendar prop's JSDoc in InternationalizationProvider.tsx (lines 111–113) still says DateRangeInput shows Gregorian dates, so please list DateRangeInput there and in the InternationalizationContextValue comment, as the doc module and the record now do.

[Automated review]

required: false,
description:
"Calendar system that `Calendar`, `DateInput`, and `DateTimeInput` in the subtree show, such as 'persian', 'hebrew', or 'buddhist'. `DateRangeInput` shows Gregorian dates. When omitted, a `-u-ca-` keyword in `locale` selects the calendar, else Gregorian; a locale's default calendar never applies. A component's own `calendar` prop takes precedence. Values stay Gregorian ISO dates. Calendars other than gregory, iso8601, buddhist, roc, and japanese need `Temporal`; where the runtime lacks it, load a polyfill such as `temporal-polyfill/full/global` on the server and in the browser, or those calendars show Gregorian dates and warn in development.",
"Calendar system that `Calendar`, `DateInput`, `DateRangeInput`, and `DateTimeInput` in the subtree show, such as 'persian', 'hebrew', or 'buddhist'. When omitted, a `-u-ca-` keyword in `locale` selects the calendar, else Gregorian; a locale's default calendar never applies. A component's own `calendar` prop takes precedence. Values stay Gregorian ISO dates. Calendars other than gregory, iso8601, buddhist, roc, and japanese need `Temporal`; where the runtime lacks it, load a polyfill such as `temporal-polyfill/full/global` on the server and in the browser, or those calendars show Gregorian dates and warn 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 description now lists DateRangeInput, but the prop's JSDoc in InternationalizationProvider.tsx (lines 111–113) still says "DateRangeInput shows Gregorian dates", and the InternationalizationContextValue.calendar comment in InternationalizationContext.ts (lines 34–35) leaves it out. Could both say the same as this line, so the hover documentation matches what ships?

@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-bottom-sheet branch from 6afec54 to 264269c Compare November 3, 2026 19:43
@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-presentations branch from a5536ba to 35aa2c3 Compare November 3, 2026 19:43

@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.

Approval waits on an engineering owner's spec decision, and two fixes are needed whatever that decision is.

DateRangeInput's new calendar prop, and its trigger text and popover following the application's calendar, rest on spec:AST-111 FR17, which is still a draft in #9605, and depart from current architecture:internationalization INV10, which keeps date grids Gregorian. An engineering owner needs to approve that governing spec for this addition, including the proposed component:DateRangeInput FR5, its calendar concept row and its spec:AST-013 FR12 exception, by commenting /approve-spec <full head SHA> on this pull request; the author may do so as an engineering owner.

Blocking findings:

  • The proposed component:DateRangeInput FR5 reuses the id main already gives the preset reflow requirement, so please give the calendar requirement the next free id and update its verification row, its relationship line and the citation in component:Calendar.
  • The calendar prop's JSDoc in InternationalizationProvider.tsx (lines 111–113) still says DateRangeInput shows Gregorian dates, so please list DateRangeInput there and in the InternationalizationContextValue comment, as the doc module and the record now do.

[Automated review]

@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-bottom-sheet branch from 264269c to 6361f62 Compare November 3, 2026 20:51
@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-presentations branch from 35aa2c3 to ce263ee Compare November 3, 2026 20:51

@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.

Approval waits on an engineering owner's spec decision, and two fixes are needed whatever that decision is.

DateRangeInput's new calendar prop, and its trigger text and popover following the application's calendar, rest on spec:AST-111 FR17, which is still a draft in #9605, and depart from current architecture:internationalization INV10, which keeps date grids Gregorian. An engineering owner needs to approve that governing spec for this addition, including the proposed component:DateRangeInput FR5, its calendar concept row and its spec:AST-013 FR12 exception, by commenting /approve-spec <full head SHA> on this pull request; the author may do so as an engineering owner.

Blocking findings:

  • The proposed component:DateRangeInput FR5 reuses the id main already gives the preset reflow requirement, so please give the calendar requirement the next free id and update its verification row, its relationship line and the citation in component:Calendar.
  • The calendar prop's JSDoc in InternationalizationProvider.tsx (lines 111–113) still says DateRangeInput shows Gregorian dates, so please list DateRangeInput there and in the InternationalizationContextValue comment, as the doc module and the record now do.

[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.

Approval waits on an engineering owner's spec decision; no other changes are needed.

DateRangeInput's new calendar prop, its calendar-system trigger text and popover, and the -u-ca- locale keyword now reaching the range text rest on spec:AST-111 FR17 and DEC-2, which are still a draft in #9605, and depart from the current architecture:internationalization INV10, which keeps date grids Gregorian and stops a locale from selecting another calendar. The decision has to settle:

  • whether DateRangeInput follows the application's calendar through calendar?: CalendarSystem, defaulting to the provider's calendar, else 'gregory';
  • whether a -u-ca- keyword changing released Gregorian range text is nonbreaking, as the proposed record states, or needs a spec:AST-017 compatibility class;
  • the proposed component:DateRangeInput FR6, its calendar concept row and Temporal exception, and the matching component:InternationalizationProvider and component:Calendar record lines.

An engineering owner records the decision by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner.

[Automated review]

@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-bottom-sheet branch from 9662010 to 6b4a555 Compare November 4, 2026 00:19
@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-presentations branch from cb8dd2f to 3cef6a3 Compare November 4, 2026 00:19

@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.

Approval waits on an engineering owner's spec decision; no other changes are needed.

DateRangeInput's new calendar prop, its calendar-system trigger text and popover, and the -u-ca- locale keyword now reaching the range text rest on spec:AST-111 FR17 and DEC-2, which are still a draft in #9605, and they depart from current architecture:internationalization INV10, which keeps date grids Gregorian and stops a locale from selecting another calendar for date components. What an engineering owner needs to approve or reject:

  • the public calendar?: CalendarSystem prop on DateRangeInput, defaulting to the InternationalizationProvider calendar, else 'gregory';
  • the trigger text, its accessible name and the popover Calendar shown in that calendar, with the year when either end leaves the current calendar year;
  • a provider locale with an explicit -u-ca- keyword, such as th-TH-u-ca-buddhist, changing range text that the latest release shows in Gregorian, recorded as nonbreaking;
  • the proposed record text: component:DateRangeInput FR6, its calendar concept row and spec:AST-013 FR12 exception, component:InternationalizationProvider FR10 and the component:Calendar relationship line.

An engineering owner records the decision by commenting /approve-spec <full head SHA> on this pull request, and the author may do so if they are an engineering owner. Two optional follow-ups: FR6 could name the trigger's accessible name with a test that asserts it, and a th-TH-u-ca-buddhist test would pin the locale-keyword behavior once it is decided.

[Automated review]

| FR3 | The preset group and each preset button expose stable theme targets; selected and disabled are states of the preset-button target rather than separate targets. | `architecture:component-theming-surface`; consumer demand for preset theming | Approved additive contract |
| FR4 | Adding theme targets MUST NOT change the Popover, Calendar, button, focus, or selection semantics those elements already own. | Composition boundary and compatibility goal | Approved additive contract |
| FR5 | When the preset group and a one-month calendar do not fit side by side in the layer, the preset group stacks above the calendar, and every month grid and the month navigation stay inside the layer (`spec:AST-020` FR1, WCAG 2.2 SC 1.4.10). Visual order matches DOM order. When they fit, the presets stay beside the calendar. When the content is taller than the layer's viewport cap, it scrolls inside the layer. | `spec:AST-020` FR1; 390 px, 390 × 664 px and 440 px reflow checks | Verified current behavior |
| FR6 | The trigger text and the popover Calendar show the resolved calendar (`spec:AST-111` FR2, FR17): the trigger writes each end of the range in the calendar, with the year when either end falls outside the current calendar year, and the Calendar lays out calendar months. The field has no typed entry. `value`, `onChange`, `min`, `max`, presets, and span bounds stay Gregorian ISO dates (`spec:AST-111` FR3). | `spec:AST-111` FR3, FR17; current source and calendar tests | Verified current behavior |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Non-blocking: the trigger's accessible name is built from the label and this text (DateRangeInput.tsx:744-746), so screen-reader users hear Stay: Aban 8 – Aban 11. Could FR6 say "the trigger text and its accessible name", with one test that asserts the name?

@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-bottom-sheet branch from 6b4a555 to 93bca81 Compare November 4, 2026 18:42
@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-presentations branch from 3cef6a3 to a26bf47 Compare November 4, 2026 18:42
DateRangeInput takes a calendar prop and otherwise follows the provider's calendar. Its trigger text and popover calendar use the calendar; values stay Gregorian ISO dates.
…d the -u-ca- request

The provider's calendar prop docs and record list DateRangeInput. The DateRangeInput record and changeset state that an explicit -u-ca- locale is the application's request, and the record's intent paragraph is rewrapped.
…regorian dates

The DateRangeInput record and the changeset say that a provider locale
with a -u-ca- keyword keeps Gregorian dates; set calendar to choose one.

@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.

Approval waits on an engineering owner's spec decision; no other changes are needed.

DateRangeInput's new calendar prop, its calendar-system trigger text and popover, and the -u-ca- locale keyword now reaching the range text rest on spec:AST-111 FR17 and DEC-2, which are still a draft in #9605, and they depart from current architecture:internationalization INV10, which keeps date grids Gregorian and stops a locale from selecting another calendar for date components; an engineering owner needs to approve or reject:

  • the public calendar?: CalendarSystem prop on DateRangeInput, defaulting to the InternationalizationProvider calendar, else 'gregory';
  • the trigger text, its accessible name and the popover Calendar shown in that calendar, with the year when either end leaves the current calendar year;
  • a provider locale with an explicit -u-ca- keyword, such as th-TH-u-ca-buddhist, changing range text that the latest release shows in Gregorian, recorded as nonbreaking;
  • the proposed record text: component:DateRangeInput FR6, its calendar concept row and spec:AST-013 FR12 exception, component:InternationalizationProvider FR10 and its Calendar row, and the component:Calendar relationship line.

An engineering owner records the decision by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. Optional: FR6 could name the trigger's accessible name with a test that asserts it, and a DateRangeInput test under a -u-ca- provider locale would pin the one case that changes released text.

[Automated review]

@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-bottom-sheet branch from 93bca81 to cdc5efc Compare November 4, 2026 19:47
@nynexman4464
nynexman4464 force-pushed the nynexman4464/feat/calendar-presentations branch from a26bf47 to 37c9150 Compare November 4, 2026 19:47

@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.

Approval waits on an engineering owner's spec decision; no other changes are needed.

DateRangeInput's new calendar prop, its trigger text in the application's calendar and its popover grid in that calendar rest only on spec:AST-111 FR17, a draft in #9605, and the grid departs from current architecture:internationalization INV10, which keeps date grids Gregorian; an engineering owner needs to approve or reject:

  • the public calendar?: CalendarSystem prop on DateRangeInput, defaulting to the InternationalizationProvider calendar, else 'gregory';
  • the trigger text, its accessible name and the popover Calendar shown in that calendar, with the year when either end leaves the current calendar year;
  • the proposed record text: component:DateRangeInput FR6, its calendar concept row, Calendar state row and spec:AST-013 FR12 exception, component:InternationalizationProvider FR10 and its Calendar row, and the component:Calendar relationship line.

An engineering owner records the decision by commenting /approve-spec <full head SHA> on this pull request, and the author may do so as an engineering owner. Optional: FR6 could name the trigger's accessible name, with a test that asserts it.

[Automated review]

This branch was successfully deployed

1 active deployment
Preview — 37c9150a Deployed Nov 4, 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