Skip to content

feat(apollo-wind): drilldown calendar, independent range months, DateTimePicker timezone - #1245

Open
andreea-ene wants to merge 11 commits into
mainfrom
feat/calendar-picker-updates
Open

andreea-ene wants to merge 11 commits into
mainfrom
feat/calendar-picker-updates

Conversation

@andreea-ene

@andreea-ene andreea-ene commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

Replaces #1215, which was opened from a fork so the required checks couldn't run.

Brings the date picker work from the Flow prototype into apollo-wind. Calendar gets a drill-down caption for jumping to a month or year, fixed day states in the Future themes, and a week start taken from the locale. DatePicker and DateRangePicker get popover control, a display format, and a range picker whose two months page independently. DateTimePicker swaps the native time input for hour and minute selects and gains an optional timezone select.

What changed

Calendar

  • Drill-down caption: new captionLayout="drilldown". Clicking the month shows a 3×4 grid of months, and clicking the year shows 12 years per page. Picking a year goes to its months, and picking a month goes to its days. The popover keeps its width in every view.
    • Focus moves into each new grid, and arrow keys move between cells.
    • Months and years outside startMonth / endMonth are disabled.
  • Week start: taken from the browser locale through Intl.Locale#getWeekInfo. That's Monday for en-GB and Sunday for en-US. An explicit weekStartsOn or a date-fns locale overrides it. Where the API is missing (Firefox), it stays on Sunday.
  • Compact size: size="sm" gives 36px day cells instead of 44px. It's opt-in.
  • Day states:
    • Today is an outline instead of a fill, matching the MUI picker. It no longer looks like hover or the middle of a range.
    • Days from neighbouring months are dimmer.
    • In the Future themes, day numbers used the muted text colour, and the selected day's text could lose to it. The day button now chooses its variant from its state.
    • The focus ring only shows for keyboard focus. It used to appear on every clicked day.
  • Range styling:
    • The band runs unbroken from the centre of the start day to the centre of the end day, and the ends are circles like a single selection.
    • A range with only a start date looks like a single selection.
    • Half-bands that would lead off a row edge or into a hidden day are dropped.
    • A divider separates side-by-side months.

DatePicker

  • Uses the drill-down caption and opens on the selected month. calendarProps={{ captionLayout: 'label' }} restores the old caption.
  • Closes when a date is picked.
  • Opening moves focus to the selected day, or to today. Before, focus landed on the previous-month chevron.
  • New popoverProps (align, side, offsets, className, container), aligned to the trigger's start by default. It used to be centred.
  • New displayFormat (date-fns), with PPP as the default.

DateRangePicker

  • Two calendars, each with its own chevrons and drill-down caption. They share one selection, and the right month always stays after the left.
  • Opens with the start month on the left and the end month on the right.
  • Days from neighbouring months are hidden, because they repeated the other month's days and range band.
  • New popoverProps and displayFormat (default LLL dd, y).

DateTimePicker

  • Time selects: hour and minute Selects replace the native time input, whose popup can't be styled. AM/PM appears with use12Hour. New minuteStep (default 5), and a value that isn't on the step stays selectable.
  • Commit as you go: a day keeps the chosen time, and a time chosen first applies once a day is picked. The popover stays open after a day click. It also uses the drill-down caption and focuses the selected day on open.
  • Timezone: showTimeZone adds a searchable select of every IANA zone the runtime knows, grouped by region with the viewer's zone first. The date and time are read in that zone and committed as that instant, so 14:00 in Europe/Bucharest is 11:00Z in summer. Changing the zone keeps the time on screen and moves the instant.
  • The trigger names the offset (for example GMT+3) whenever a zone is given through showTimeZone, timeZone or defaultTimeZone.
  • New timeZone, defaultTimeZone, onTimeZoneChange, calendarProps, popoverProps and displayFormat.
  • Adds the @date-fns/tz dependency.

Behaviour and API changes for consumers

  • DateRangePicker's calendarProps.month, defaultMonth and onMonthChange are deprecated but still work. They now apply to the left (start) month, with the right month kept after it, and onMonthChange only reports changes to the left month.
  • DatePicker now closes on select and aligns its popover to the start instead of the centre.
  • Calendars start the week on the locale's first day, so non-US users see Monday first unless weekStartsOn is passed.
  • DateTimePicker no longer uses a native <input type="time">, and it stays open after a day is picked.
  • A custom components.Root or components.Footer keeps the earlier behaviour, so it stays inside DayPicker's context: DatePicker and DateTimePicker fall back to the label caption, and DateRangePicker falls back to the single two-month DayPicker (one set of chevrons, months paging together, month/onMonthChange meaning the first month). The independent range months and the drill-down need a picker without those two overrides. On a Calendar given captionLayout="drilldown" explicitly, those two components render outside DayPicker's context, because the month and year views have no DayPicker around them. The drill-down draws its own caption and arrows, so the caption and navigation components (Nav, PreviousMonthButton, NextMonthButton, MonthCaption, CaptionLabel, the dropdowns) don't apply there. Chevron and the nav, button_previous and button_next classNames and styles still style its arrows. Other component overrides are unaffected. DateTimePicker's new calendarProps leaves out timeZone; the picker's own timeZone sets the zone.

Screenshots

Before After
DatePicker, Future Light Date picker with muted day numbers and dark text on the selected day Date picker with month and year caption buttons and full-strength day numbers
DatePicker, Future Dark Dark date picker before Dark date picker after
Range Range picker with one pair of chevrons, gaps in the range band and repeated outside days Range picker with independent months, a divider and a continuous band
Range, start picked only Single-day range drawn as a square with a grey ring Single-day range drawn as a circle
Drill-down: months Drill-down: years Compact (size="sm")
Month grid Year grid Compact date picker under a field

Checks

  • tsc --noEmit: clean.
  • biome lint and biome format: no new warnings in the changed files.
  • vitest run (apollo-wind): all calendar and picker tests pass, including new ones for the drill-down views, week start, focus on open, independent range months, popoverProps, the DateTimePicker time selects and timezone conversion (including daylight saving changes and years 0 to 99). form-plugins.test.tsx fails locally on Node 25, whose built-in localStorage hides jsdom's. It fails the same way on main and is unrelated.
  • Storybook checks in Future Light and Future Dark: keyboard focus, drill-down navigation, and range edge cases.

New stories:

  • Calendar: DrillDown, DrillDownBounded, Compact, MondayFirst.
  • Date Picker: Bounded, CustomFormat, CompactInPanel.
  • Date Time Picker: MinuteStep, WithTimeZone, Compact.

Dependency security fixes

Most of the dependency security batch this PR carried has since landed on main in 3d64da6 ("chore(workspace): resolve pnpm audit advisories"). That covers next 16.3.8, sharp 0.35.5, hono 4.13.9, postcss-selector-parser >=7.1.6, the seroval 1.6.7, proxy-addr 2.0.8, source-map-js 1.2.2, @modelcontextprotocol/sdk 1.31.0 and handlebars 4.7.10 refreshes, their quarantine exemptions, and the braces and katex auditConfig.ignoreGhsas entries. After rebasing onto it, this PR keeps main's versions and notes and only adds one change:

  • @hono/node-server is pinned to the vetted 2.0.10. The ^2.0.10 override had drifted to 2.0.11, a perf/test-only release that was never vetted.

The earlier katex ^0.18.2 bump in apollo-react and its katex@<0.18.2 override are dropped. Main chose to stay on katex 0.16 and ignore the low-severity GHSA-238p-pmpm-9mq7, because 0.18 renames KaTeX's CSS classes. katex 0.18.7 and commander@15 are therefore no longer installed. pnpm audit and pnpm audit --prod pass, reporting only the two ignored advisories. Each entry's vetting notes are in pnpm-workspace.yaml.

🤖 Generated with Claude Code

Copilot AI balanced review requested due to automatic review settings September 30, 2026 13:02
@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Apollo Coded App preview deployments are ready.

Project Status Preview Updated (PT)
apollo-design Ready Preview · Logs Oct 15, 2026, 09:04:04 AM
apollo-docs Ready Preview · Logs Oct 15, 2026, 09:04:04 AM
apollo-landing Ready Preview · Logs Oct 15, 2026, 09:04:04 AM
apollo-vertex Ready Preview · Logs Oct 15, 2026, 09:04:04 AM

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Dependency License Review

  • ✅ 1957 package(s) scanned
  • ✅ No license issues found
  • ⚠️ 2 package(s) excluded (see details below)
License distribution
License Packages
MIT 1721
ISC 91
Apache-2.0 57
BSD-3-Clause 28
BSD-2-Clause 23
BlueOak-1.0.0 8
MPL-2.0 4
CC0-1.0 4
MIT-0 3
MIT OR Apache-2.0 2
(MIT OR Apache-2.0) 2
Unlicense 2
LGPL-3.0-or-later 1
Python-2.0 1
CC-BY-4.0 1
(MPL-2.0 OR Apache-2.0) 1
Unknown 1
Artistic-2.0 1
(WTFPL OR MIT) 1
(BSD-2-Clause OR MIT OR Apache-2.0) 1
CC-BY-3.0 1
0BSD 1
(MIT OR CC0-1.0) 1
MIT AND ISC 1
Excluded packages
Package Version License Reason
@img/sharp-libvips-linux-x64 1.3.4 LGPL-3.0-or-later LGPL pre-built binary, not linked
khroma 2.1.0 Unknown MIT per GitHub repo, missing license field in package.json

This comment was marked as outdated.

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

📊 Coverage + size by package

Per-package coverage and bundle size on this PR. New-line coverage = of the source lines this PR adds or changes, the % hit by tests.

Package Coverage New-line coverage Packed (gzip) Unpacked vs main
@uipath/apollo-core 75.0% — 42.02 MB 50.17 MB ±0
@uipath/apollo-react 51.7% — 8.01 MB 31.60 MB +489 B
@uipath/apollo-ui-icons — — 2.86 MB 6.97 MB ±0
@uipath/apollo-vertex 85.0% — 335.7 KB 1.88 MB ±0
@uipath/apollo-wind 80.0% 97.4% (517/531) 818.2 KB 4.71 MB +30.7 KB
@uipath/ap-chat 85.8% — 40.37 MB 45.58 MB ±0

"Coverage" is each package's own coverage.include scope (e.g. apollo-core instruments only scripts/). "Packed"/"Unpacked" come from npm pack --dry-run and only cover built packages — "—" means not measured this run (package not affected / not built). "vs main" is the packed (gzipped) delta against the last successful main build (the package-sizes artifact from the Release workflow); "—" there means no main baseline was available this run. The baseline is main's latest build, not this PR's exact merge-base, so it includes any drift since the branch diverged. Packages with no vitest config are omitted.

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Storybook visual diff

⚠️ Visual changes detected: 23 changed, 20 added (of 226 compared, 183 unchanged). View report

Baseline is the deployed main Storybook, so changes merged to main after this branch was last updated can also appear here. Logs

Updated (PT): Oct 20, 2026, 02:55:51 AM

Copilot AI balanced review requested due to automatic review settings October 1, 2026 12:32
@andreea-ene
andreea-ene force-pushed the feat/calendar-picker-updates branch 2 times, most recently from 5cbd281 to 03a3ad2 Compare October 1, 2026 12:32

This comment was marked as outdated.

@andreea-ene
andreea-ene marked this pull request as draft October 5, 2026 09:05
Copilot AI balanced review requested due to automatic review settings October 5, 2026 09:09

This comment was marked as outdated.

@andreea-ene
andreea-ene marked this pull request as ready for review October 5, 2026 09:42
Copilot AI balanced review requested due to automatic review settings October 5, 2026 09:45
@andreea-ene
andreea-ene force-pushed the feat/calendar-picker-updates branch from 483fa17 to c1c5439 Compare October 5, 2026 09:45

This comment was marked as outdated.

Copilot AI balanced review requested due to automatic review settings October 5, 2026 10:03

This comment was marked as outdated.

@andreea-ene
andreea-ene force-pushed the feat/calendar-picker-updates branch from e5b5685 to 46a19db Compare October 5, 2026 10:15
@uipathepixa-dogfood

Copy link
Copy Markdown

Epixa-Dogfood Review

Review unavailable: required_pr_review_evidence_unavailable

Not reviewed: packages/apollo-wind/package.json, packages/apollo-wind/src/components/ui/calendar.stories.tsx, packages/apollo-wind/src/components/ui/calendar.test.tsx +18 more

Not read: 1 generated or lockfile change.

What this PR does

The pull request author describes the intended change as follows: feat(apollo-wind): drilldown calendar, independent range months, DateTimePicker timezone

This review did not reuse a local review of this change. Set up Epixa local review.

Full review: 5b23e5a 0 findings

Copilot AI 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.

🟡 Changes recommended

Selected-month precedence, localized drill-down labels, and unrelated lockfile drift need correction.

4 open findings
3 resolved since last review
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/calendar.tsx Outdated
Comment thread packages/apollo-wind/src/components/ui/date-picker.tsx Outdated
Comment thread packages/apollo-wind/src/components/ui/datetime-picker.tsx Outdated
Comment thread pnpm-lock.yaml Outdated

Copilot AI 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.

🟡 Changes recommended

Timezone reselection can alter ambiguous DST instants, and batched options are not reliably reachable through keyboard navigation.

2 open findings
4 resolved since last review
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/timezone-select.tsx
Comment thread packages/apollo-wind/src/components/ui/timezone-select.tsx

Copilot AI 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.

🟡 Changes recommended

DateTimePicker discards its resolved timezone when rendering Calendar, causing timezone-sensitive calendar state to use the viewer’s zone.

1 open finding
2 resolved since last review
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/datetime-picker.tsx

Copilot AI 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.

🔵 Needs a closer look

Intertwined public APIs, timezone conversion, DST, SSR, focus, and accessibility behavior warrant final human validation despite extensive tests.

0 open findings

1 resolved since last review
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Copilot AI 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.

🟡 Changes recommended

The timezone selector retains an unmounted active row across reopening, causing incorrect PageDown keyboard navigation.

1 open finding
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/timezone-select.tsx

Copilot AI 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.

🔵 Needs a closer look

The broad calendar, accessibility, DST, historical-timezone, and public API changes warrant final human validation despite comprehensive tests.

0 open findings

1 resolved since last review
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Copilot AI 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.

🟡 Changes recommended

Context-dependent component overrides and historical timezone-midnight conversion still contain runtime correctness issues.

3 open findings
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/calendar.tsx Outdated
Comment thread packages/apollo-wind/src/components/ui/date-picker.tsx
Comment thread packages/apollo-wind/src/components/ui/datetime-picker.tsx Outdated

Copilot AI 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.

🟡 Changes recommended

Historical second-based timezone offsets can make drill-down navigation resolve to the wrong month.

1 open finding
3 resolved since last review
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/calendar.tsx Outdated

Copilot AI 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.

🟡 Changes recommended

The documented custom-chevron behavior does not match the picker fallback logic.

2 open findings
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/calendar.tsx Outdated

Copilot AI 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.

🟡 Changes recommended

Removing calendarProps.timeZone breaks existing typed consumers without a major-version contract.

3 open findings
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/datetime-picker.tsx
…TimePicker timezone

Calendar
- Add captionLayout="drilldown": the month and year zoom the grid out
  to a 3x4 month grid or a paged 12-year grid, bounded by startMonth and
  endMonth, with arrow-key navigation and focus following the view.
- Default the week start to the browser locale's first day.
- Add size="sm" for 36px day cells.
- Mark today with an outline instead of a fill, dim neighbouring-month
  days, and pick the day button variant from its state so future-theme
  text colours no longer compete with the selected fill.
- Show the day focus ring for keyboard focus only.
- Run the range band unbroken from the start day's centre to the end
  day's, and render a one-day range as a single selection.
- Divide multiple months with a rule.
- Drop a range end's half-band after a week number cell.
- Mirror the range-end half-bands, the drilldown chrome and its arrow
  keys in right-to-left calendars, and keep the hidden DayPicker
  caption hidden when classNames.month_caption is customised.
- Open the drilldown inside startMonth/endMonth when defaultMonth
  falls outside them, and move it back inside when the bounds change.
- Name the drilldown controls through `labels`: DayPicker's
  labelPrevious, labelNext, labelMonthDropdown and labelYearDropdown,
  plus new labelPreviousYears, labelNextYears, labelMonthsGrid and
  labelYearsGrid. English defaults are unchanged.
- Keep `footer` (and a custom components.Footer), the root attributes
  (id, title, lang, role, aria-label, aria-labelledby) and the grid
  width (week number column included) in the month and year views.
- Honour hideNavigation in the drilldown caption, and mark the current
  month or year cell with aria-current, taking DayPicker's today prop.
- Apply the style prop to the drilldown root in every view, keep the
  year page in step with a controlled month, and name month cells with
  the locale's month-and-year format. Root entries of classNames and
  styles, and a custom components.Root, also go on the drilldown root,
  with classNames.root overriding the built-in root classes.
- Name the drilldown caption and cells through formatMonthDropdown and
  formatYearDropdown, and keep the grid arrow keys from scrolling the
  page at its edges.
- Keep years 0 to 99 as given when building local and UTC dates, in the
  drilldown, the date-time picker and the timezone conversions.
- Make disableNavigation turn off the drilldown arrows and the month
  and year selectors, and apply styles.footer to the drilldown footer.
- Report drilldown arrow navigation through onPrevClick and onNextClick,
  and draw the arrows with a custom components.Chevron.
- Write drilldown years in the numbering system given by numerals.
- Style the drilldown arrows with the nav, button_previous and
  button_next classNames and styles, and keep data-slot="calendar" on
  the persistent root only.
- Read and build drilldown dates in DayPicker's timeZone when one is
  given, so it opens on and marks the zone's month. Document that a
  custom components.Root or Footer renders outside DayPicker's context
  in the drilldown and the range pair.

DatePicker
- Use the drilldown caption, open on the selected month, and close on
  select. Focus the selected day (or today) on open.
- Add popoverProps (aligned to start by default) and displayFormat.

DateRangePicker
- Render two independently navigable months that share the selection,
  keeping the right month after the left. Open on the start and end
  months, and hide neighbouring-month days.
- Add popoverProps and displayFormat.
- Deprecate calendarProps.month and onMonthChange: month now controls
  the left (start) month, with the right month kept after it, and
  onMonthChange reports left-month changes only. Deprecate
  calendarProps.defaultMonth too: it opens the left month (uncontrolled),
  with a controlled month taking precedence.
- Render root-level calendarProps (footer, id, title, role, aria-label,
  aria-labelledby, className, style, classNames.root, styles.root,
  components.Root, dir, lang) once for the pair instead of on both
  calendars, so the shared footer follows them too.
- Keep a controlled month inside startMonth/endMonth, leaving room for
  the right month before endMonth.
- Refit the months, and switch between one calendar and two, when the
  bounds change while open.
- Lay the pair out in calendarProps.dir, with a logical divider.

DateTimePicker time selects
- Replace the native time input, whose popup is the platform's own and
  cannot be styled, with hour and minute Selects, plus AM/PM with
  use12Hour. Add minuteStep (default 5, also used for a non-finite
  step); a value off the step stays selectable. The selects are grouped under a Time legend.
- Commit as you go: a day keeps the chosen time, a time chosen first is
  applied once a day is picked, and the popover stays open after a day
  click. Clear and Done are compact.
- Use the drilldown caption, open on the selected month, and focus the
  selected day on open. Follow value changes from the parent.
- Add popoverProps (aligned to start) and displayFormat.
- Name the date, date range and date-time popovers so the dialog has an
  accessible name.

DateTimePicker timezone
- showTimeZone adds a searchable select of every IANA zone the runtime
  knows, grouped by region with the viewer's zone first. Search matches
  city, id (either spelling of renamed zones), region and offset.
- The date and time are read in the zone and committed as that instant,
  so 14:00 in Europe/Bucharest is 11:00Z in summer; the trigger names
  the offset. Changing the zone keeps the wall clock and moves the
  instant. Conversions resolve times near a DST change.
- timeZone, defaultTimeZone and onTimeZoneChange let the parent track
  the zone. A controlled timeZone without onTimeZoneChange locks the
  timezone select.
- Name the offset whenever a zone is given, defaultTimeZone included.
- Leave timeZone out of calendarProps: the picker's own timeZone sets
  the zone the calendar's date is read in.
- Read the viewer's zone as the client renders rather than seeding state
  with it, so a server-rendered picker doesn't keep the server's zone.
- Read offsets for years before the common era through the formatted
  era, so conversions stay correct there too.
- The timezone trigger keeps Radix's aria-haspopup="dialog", since the
  popover is a dialog holding a search combobox and its list.
- The timezone list mounts its rows in batches as it scrolls, and
  formats offsets only for mounted rows or an offset search.
- popoverProps.container also holds the time selects' menus and the
  timezone list.

- Convert wall clocks with each zone's exact offset, seconds included
  (Paris was GMT+0:09:21 in 1900), and round only the offset label.
- Document that a custom components.Root or Footer keeps the earlier
  single two-month DayPicker in DateRangePicker.

Rebased onto main after 3d64da6 ("chore(workspace): resolve pnpm audit
advisories"), which landed the dependency security batch this commit used
to carry. Takes main's versions and vetting notes for it: next 16.3.8,
sharp 0.35.5, hono 4.13.9 (was 4.13.7 here), postcss-selector-parser
>=7.1.6, seroval 1.6.7, proxy-addr 2.0.8, source-map-js 1.2.2,
@modelcontextprotocol/sdk 1.31.0, handlebars 4.7.10, and the braces and
katex audit ignores. Drops the katex ^0.18.2 bump in apollo-react and its
katex@<0.18.2 override (katex stays on 0.16.27/0.16.45, as main chose),
so katex 0.18.7 and commander@15 are no longer installed.

Pins @hono/node-server to the vetted 2.0.10. The ^2.0.10 override had
drifted to 2.0.11, an unvetted perf/test-only release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

🟡 Changes recommended

The timezone adapter leaves week-number callback dates in the browser-local frame.

3 open findings
1 resolved since last review
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/datetime-picker.tsx

Copilot AI 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.

🔵 Needs a closer look

Timezone and navigation compatibility changes need human verification, and the initial-month timezone issue remains unresolved.

4 open findings
Files not reviewed (1)
  • pnpm-lock.yaml: Generated file

🧠 Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/datetime-picker.tsx Outdated
Resolves conflicts with 3b0ddee (read ISO date strings in date
fields): DatePicker and DateTimePicker keep the zoned formatting from
this branch and take main's guard that treats a non-Date or Invalid
Date value as no value. DateTimePicker already keeps sub-minute time
on a day change through zonedSubMinuteMs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

🟡 Changes recommended

Empty timezone-aware date-time pickers can open on the browser’s month rather than the configured timezone’s month.

5 open issues
1 file not reviewed
  • pnpm-lock.yaml: Generated file

Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/calendar.tsx Outdated
andreea-ene and others added 4 commits October 19, 2026 19:46
TZDate's wall-clock setters read an offset with seconds to the minute, so
a zoned drilldown in Paris in 1900 built June 1 on May 31 and opened, and
stepped, onto the wrong month. Build the instant with zonedWallClockToDate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Without a defaultMonth the drilldown opened on the browser's month and
ignored `today`, so a DateTimePicker in a zone already in the next month
(Kiritimati at 12:00Z on 30 June) opened on June.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With no value and no calendarProps.defaultMonth, fall back to the zone's
today, so the calendar doesn't open on the browser's month near midnight.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

Comment thread packages/apollo-wind/src/components/ui/calendar.tsx Outdated
Comment thread packages/apollo-wind/src/components/ui/date-picker.tsx Outdated

Copilot AI 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.

🟡 Changes recommended

Unresolved compatibility regressions and timezone-dependent date errors affect picker behavior.

5 open issues
1 previously missed issue

In code that hasn't changed since last review

Medium severity reverseMonths is ignored by independent calendar pair

packages/​apollo-wind/​src/​components/​ui/​date-picker.tsx:364

calendarProps.reverseMonths is still accepted, but the independent pair always renders the start month first. Forwarding the flag to two one-month calendars cannot reverse their order, so existing consumers lose the requested layout. Preserve the two-month DayPicker fallback when reverseMonths is enabled, or implement reversed rendering and divider placement at the pair level.

1 resolved since last review
1 file not reviewed
  • pnpm-lock.yaml: Generated file

Review effort: Balanced

Comment thread packages/apollo-wind/src/components/ui/calendar.tsx Outdated
Comment on lines +290 to +292
const calendarDate = wallClock
? localDate(wallClock.year, wallClock.month, wallClock.day)
: undefined;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

The bug is real, but the suggested fix doesn't cure it, so I'm leaving this open for @andreea-ene. I tried a UTC-backed frame (TZDate UTC dates, calendar timeZone="UTC"): the rest of the DateTimePicker suite still passed, but on a Pacific/Apia host react-day-picker 9.14 itself still renders December 2011 as …29, 31, 31 even with timeZone="UTC", because its grid generation still uses the host's local dates. A bare <DayPicker timeZone="UTC" /> does the same. A real fix would need a custom dateLib for DayPicker or an upstream fix. That seems too much for a day that only full date-line jumps skip (Apia on 30 Dec 2011, a few Pacific zones in the 1990s), and only when the host sits in one of those zones.

andreea-ene and others added 2 commits October 20, 2026 12:23
The month and year grids found the focused cell through
document.activeElement, which is the shadow host when the picker is
portalled into a ShadowRoot, so the arrow keys were swallowed. Use the
key's target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With no selection and no month override, the independent range months
opened on the browser's month and ignored a given today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

🔵 Needs a closer look

An already-open drill-down chooser can still change months after navigation is disabled.

3 open issues
2 resolved since last review
1 file not reviewed
  • pnpm-lock.yaml: Generated file

Review effort: Balanced

andreea-ene and others added 2 commits October 20, 2026 12:35
…side it

A calendarProps.footer holding a component that calls useDayPicker worked
in DatePicker and DateRangePicker on main, but the drill-down and the range
pair render the footer outside DayPicker and opening threw. Treat a footer
with a component like a Footer override and keep the DayPicker layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

🔵 Needs a closer look

The broad timezone, focus, and calendar-navigation changes need final human runtime validation.

1 open issue
2 resolved since last review
1 file not reviewed
  • pnpm-lock.yaml: Generated file

Review effort: Balanced

Copilot AI 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.

🔵 Needs a closer look

The navigation and timezone rewrite needs human validation, including resolution of the confirmed repeated-hour editing defect.

1 open issue
1 previously missed issue

In code that hasn't changed since last review

Medium severity Preserve DST occurrence when editing minutes in repeated hours

packages/​apollo-wind/​src/​components/​ui/​datetime-picker.tsx:330

Editing minutes can silently switch occurrences of a repeated daylight-saving hour. With timeZone="America/New_York" and value 2024-11-03T06:30Z (01:30 GMT-5), choosing minute 35 commits 05:35Z (01:35 GMT-4), moving the value backwards by 55 minutes. The conversion rebuilds the instant without considering the selected value's offset. Pass that offset or instant as a hint and preserve it when it still matches the requested wall clock, falling back to the normal conversion otherwise. Add a regression test for editing the later occurrence.

1 file not reviewed
  • pnpm-lock.yaml: Generated file

Review effort: Balanced

This branch had an error being deployed

1 failed and 3 active deployments
preview/apollo-docs — d32d31f2 Deployed Oct 20, 2026 by github-actions[bot]
preview/apollo-vertex — d32d31f2 Deployed Oct 20, 2026 by github-actions[bot]
preview/apollo-design — d32d31f2 Deployed Oct 20, 2026 by github-actions[bot]
preview/apollo-landing — d32d31f2 Deployed Oct 20, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pkg:apollo-wind size:XXL 1,000+ changed lines.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants