feat(react-headless-components-preview): add headless Calendar - #36630
Open
Dmytro Kirpa (dmytrokirpa) wants to merge 1 commit into
Open
feat(react-headless-components-preview): add headless Calendar#36630Dmytro Kirpa (dmytrokirpa) wants to merge 1 commit into
Dmytro Kirpa (dmytrokirpa) wants to merge 1 commit into
Conversation
This was referenced Aug 25, 2026
|
Pull request demo site: URL |
Dmytro Kirpa (dmytrokirpa)
force-pushed
the
headless-calendar
branch
from
August 25, 2026 20:08
8c9219a to
9e62460
Compare
Dmytro Kirpa (dmytrokirpa)
force-pushed
the
headless-calendar
branch
from
August 29, 2026 08:52
9e62460 to
84ffa9e
Compare
Dmytro Kirpa (dmytrokirpa)
marked this pull request as ready for review
August 29, 2026 08:55
Copilot started reviewing on behalf of
Dmytro Kirpa (dmytrokirpa)
August 29, 2026 08:57
View session
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a headless Calendar entry point backed by react-calendar-preview base hooks, including composable subcomponents, tests, stories, package exports, and release metadata.
Changes:
- Adds unstyled Calendar day, month, year, row, and cell components.
- Uses
focusgroupfor keyboard navigation and exposes state through data attributes. - Adds documentation, bundle tracking, package dependency/export metadata, and tests.
Reviewed changes
Copilot reviewed 74 out of 75 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
change/@fluentui-react-headless-components-preview-aad797e2-6437-4de8-ba5b-ba9ca350c60b.json |
Adds the release change entry. |
packages/react-components/react-headless-components-preview/library/bundle-size/AllComponents.fixture.js |
Includes Calendar in bundle tracking. |
packages/react-components/react-headless-components-preview/library/etc/calendar.api.md |
Records the generated Calendar API. |
packages/react-components/react-headless-components-preview/library/package.json |
Adds the dependency and subpath export. |
packages/react-components/react-headless-components-preview/library/src/calendar.ts |
Defines the public Calendar entry point. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/Calendar.test.tsx |
Tests root Calendar behavior. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/Calendar.tsx |
Implements the headless Calendar component. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/Calendar.types.ts |
Defines headless Calendar contracts. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDay/CalendarDay.test.tsx |
Tests the day picker. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDay/CalendarDay.tsx |
Implements CalendarDay. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDay/CalendarDay.types.ts |
Re-exports day-picker types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDay/index.ts |
Exports CalendarDay APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDay/renderCalendarDay.ts |
Re-exports day rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDay/useCalendarDay.tsx |
Builds day-picker state and navigation. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridCell/CalendarDayGridCell.tsx |
Implements day cells. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridCell/CalendarDayGridCell.types.ts |
Re-exports day-cell types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridCell/index.ts |
Exports day-cell APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridCell/renderCalendarDayGridCell.ts |
Re-exports day-cell rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridCell/useCalendarDayGridCell.ts |
Re-exports day-cell state logic. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderCell/CalendarDayGridHeaderCell.tsx |
Implements weekday header cells. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderCell/CalendarDayGridHeaderCell.types.ts |
Defines header-cell types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderCell/index.ts |
Exports header-cell APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderCell/renderCalendarDayGridHeaderCell.ts |
Re-exports header-cell rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderCell/useCalendarDayGridHeaderCell.ts |
Re-exports the header-cell base hook. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderRow/CalendarDayGridHeaderRow.tsx |
Implements the weekday header row. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderRow/CalendarDayGridHeaderRow.types.ts |
Defines header-row types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderRow/index.ts |
Exports header-row APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderRow/renderCalendarDayGridHeaderRow.ts |
Re-exports header-row rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridHeaderRow/useCalendarDayGridHeaderRow.tsx |
Builds weekday header rows. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridRow/CalendarDayGridRow.tsx |
Implements day-grid rows. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridRow/CalendarDayGridRow.types.ts |
Defines day-row types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridRow/index.ts |
Exports day-row APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridRow/renderCalendarDayGridRow.ts |
Re-exports day-row rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarDayGridRow/useCalendarDayGridRow.tsx |
Builds day-grid rows. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonth/CalendarMonth.test.tsx |
Tests the month picker. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonth/CalendarMonth.tsx |
Implements CalendarMonth. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonth/CalendarMonth.types.ts |
Defines headless month-picker contracts. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonth/index.ts |
Exports CalendarMonth APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonth/renderCalendarMonth.ts |
Re-exports month rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonth/useCalendarMonth.tsx |
Builds month-picker state. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridCell/CalendarMonthGridCell.tsx |
Implements month cells. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridCell/CalendarMonthGridCell.types.ts |
Re-exports month-cell types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridCell/index.ts |
Exports month-cell APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridCell/renderCalendarMonthGridCell.ts |
Re-exports month-cell rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridCell/useCalendarMonthGridCell.ts |
Re-exports month-cell state logic. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridRow/CalendarMonthGridRow.tsx |
Implements month-grid rows. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridRow/CalendarMonthGridRow.types.ts |
Defines month-row types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridRow/index.ts |
Exports month-row APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridRow/renderCalendarMonthGridRow.ts |
Re-exports month-row rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarMonthGridRow/useCalendarMonthGridRow.ts |
Builds month-grid rows. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYear/CalendarYear.test.tsx |
Tests the year picker. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYear/CalendarYear.tsx |
Implements CalendarYear. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYear/CalendarYear.types.ts |
Defines headless year-picker contracts. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYear/index.ts |
Exports CalendarYear APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYear/renderCalendarYear.ts |
Re-exports year rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYear/useCalendarYear.tsx |
Builds year-picker state. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridCell/CalendarYearGridCell.tsx |
Implements year cells. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridCell/CalendarYearGridCell.types.ts |
Re-exports year-cell types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridCell/index.ts |
Exports year-cell APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridCell/renderCalendarYearGridCell.ts |
Re-exports year-cell rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridCell/useCalendarYearGridCell.ts |
Re-exports year-cell state logic. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridRow/CalendarYearGridRow.tsx |
Implements year-grid rows. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridRow/CalendarYearGridRow.types.ts |
Defines year-row types. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridRow/index.ts |
Exports year-row APIs. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridRow/renderCalendarYearGridRow.ts |
Re-exports year-row rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/CalendarYearGridRow/useCalendarYearGridRow.ts |
Builds year-grid rows. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/index.ts |
Aggregates internal Calendar exports. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/renderCalendar.ts |
Re-exports Calendar rendering. |
packages/react-components/react-headless-components-preview/library/src/components/Calendar/useCalendar.ts |
Composes headless picker slots. |
packages/react-components/react-headless-components-preview/stories/src/Calendar/CalendarDefault.stories.tsx |
Demonstrates styled headless usage. |
packages/react-components/react-headless-components-preview/stories/src/Calendar/CalendarDescription.md |
Documents behavior and state attributes. |
packages/react-components/react-headless-components-preview/stories/src/Calendar/calendar.module.css |
Styles the Calendar example. |
packages/react-components/react-headless-components-preview/stories/src/Calendar/index.stories.tsx |
Registers Calendar Storybook documentation. |
packages/react-components/react-headless-components-preview/stories/src/shared/browserSupportNotice.ts |
Flags Calendar’s focusgroup dependency. |
yarn.lock |
Locks the new workspace dependency. |
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| // `rowflow` matches the styled layer's `grid-linear` Tabster axis: moving past the end of a week | ||
| // continues into the next one. | ||
| // eslint-disable-next-line react-hooks/immutability | ||
| state.grid.focusgroup = 'grid manual rowflow'; |
Comment on lines
+15
to
+18
| const state = useCalendarMonthGridRowBase_unstable(props, ref); | ||
|
|
||
| // eslint-disable-next-line react-hooks/immutability | ||
| state.root.children ??= state.cells.map(month => |
Comment on lines
+15
to
+18
| const state = useCalendarYearGridRowBase_unstable(props, ref); | ||
|
|
||
| // eslint-disable-next-line react-hooks/immutability | ||
| state.root.children ??= state.cells.map(cell => React.createElement(CalendarYearGridCell, { key: cell.year, cell })); |
| CalendarMonth, | ||
| CalendarMonthGridCell, | ||
| CalendarMonthGridRow, | ||
| CalendarDayGridHeaderRow, |
Comment on lines
+1
to
+5
| export type { | ||
| CalendarDayGridRowProps, | ||
| CalendarDayGridRowSlots, | ||
| CalendarDayGridRowState, | ||
| } from '@fluentui/react-calendar-preview'; |
Comment on lines
+1
to
+5
| export type { | ||
| CalendarDayGridHeaderRowProps, | ||
| CalendarDayGridHeaderRowSlots, | ||
| CalendarDayGridHeaderRowState, | ||
| CalendarWeekDayLabel, |
Comment on lines
+1
to
+5
| export type { | ||
| CalendarMonthGridRowProps, | ||
| CalendarMonthGridRowSlots, | ||
| CalendarMonthGridRowState, | ||
| } from '@fluentui/react-calendar-preview'; |
Comment on lines
+1
to
+5
| export type { | ||
| CalendarYearGridRowProps, | ||
| CalendarYearGridRowSlots, | ||
| CalendarYearGridRowState, | ||
| } from '@fluentui/react-calendar-preview'; |
Comment on lines
+19
to
+23
| it('drives roving focus with focusgroup rather than Tabster', () => { | ||
| const { container } = render(<Calendar value={new Date(2020, 8, 18)} />); | ||
|
|
||
| const dayGrid = container.querySelector('table[role="grid"]')!; | ||
| expect(dayGrid.getAttribute('focusgroup')).toBe('grid manual rowflow'); |
Comment on lines
+1
to
+5
| export type { | ||
| CalendarDayGridHeaderCellProps, | ||
| CalendarDayGridHeaderCellSlots, | ||
| CalendarDayGridHeaderCellState, | ||
| } from '@fluentui/react-calendar-preview'; |
Dmytro Kirpa (dmytrokirpa)
force-pushed
the
headless-calendar
branch
from
August 29, 2026 14:26
84ffa9e to
743535e
Compare
Dmytro Kirpa (dmytrokirpa)
force-pushed
the
headless-calendar
branch
from
August 29, 2026 14:51
743535e to
2e2f5e6
Compare
Dmytro Kirpa (dmytrokirpa)
force-pushed
the
headless-calendar
branch
from
August 29, 2026 15:28
2e2f5e6 to
4df2423
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
This is PR 3 of 3 in a stack that splits up #36618 ("feat: add non-compat and headless versions for Calendar") into smaller, independently reviewable pieces:
@fluentui/react-calendar-previewpackageCalendarcomponent family inreact-calendar-previewCalendartoreact-headless-components-previewStack order:
master→calendar-preview-scaffold→calendar-preview-impl→headless-calendar. This PR is based on #36629 and only contains the diff on top of it (the headless module).What's in this PR
A new
calendarentry point (@fluentui/react-headless-components-preview/calendar) that re-exports the*Base_unstable/context-value hooks and types from@fluentui/react-calendar-preview(added in #36629), following the existing headless-components pattern used by other components in this package:library/src/calendar.tspublic entry point +library/src/components/Calendar/**re-exportslibrary/package.json— new@fluentui/react-calendar-previewdependency and./calendarexport map entryPrevious Behavior
N/A — new headless entry point, and
react-calendar-preview(added in #36629) had no headless consumer yet.New Behavior
Consumers can import unstyled Calendar base hooks from
@fluentui/react-headless-components-preview/calendarto build a fully custom-styled calendar, matching the pattern of the other headless components in this package.Related Issue(s)
Split from #36618.