From 96b23ddaf833274d027bf86c9b33d4b2d2f847ae Mon Sep 17 00:00:00 2001 From: interacsean Date: Tue, 29 Sep 2026 14:51:38 +1000 Subject: [PATCH] =?UTF-8?q?docs(changelog):=20amend=201.15.0=20notes=20for?= =?UTF-8?q?=20the=20@base-ui/react=201.6.0=20=E2=86=92=201.8.0=20bump?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 1.15.0 entry for 6e4f783 said only that Base UI moved to 1.8.0. It did not give the from-version or name the two upstream behaviour changes that break consumer tests: closed `Select` no longer renders its options, and the dialog scroll lock can move a button under a Playwright coordinate click. - Amend the 1.15.0 CHANGELOG bullet with both changes and the test-side fix - Add a 1.15.0 entry to docs/migrations.md (and resync docs-manifest.json) - Add a patch changeset so the next npm CHANGELOG carries a pointer - Require from→to versions and behaviour changes for UI-foundation bumps in the create-changeset skill Refs https://github.com/tailor-inc/platform-planning/issues/1945 Co-Authored-By: Claude Opus 5.5 --- .agents/skills/create-changeset/SKILL.md | 1 + .changeset/amber-owls-listen.md | 10 ++++++++ docs-manifest.json | 2 +- docs/migrations.md | 32 ++++++++++++++++++++++++ packages/core/CHANGELOG.md | 9 +++++-- 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 .changeset/amber-owls-listen.md diff --git a/.agents/skills/create-changeset/SKILL.md b/.agents/skills/create-changeset/SKILL.md index 2f622842a..1ebffb200 100644 --- a/.agents/skills/create-changeset/SKILL.md +++ b/.agents/skills/create-changeset/SKILL.md @@ -68,6 +68,7 @@ The file format is: - Write 2-3 lines describing the change from an end-user perspective - For API-level changes, include minimal code examples showing how to use the new API - For breaking changes, provide before/after migration examples +- For a UI-foundation dependency bump (`@base-ui/react` and similar), state the from→to versions and list each behaviour or test-visible change. Find them by reviewing the snapshot diffs in the PR: an updated snapshot is a render change that consumer tests can hit too. "Picks up upstream fixes" is not enough on its own. - Include usage examples for new components, hooks, or utilities #### Example — Minor (new feature): diff --git a/.changeset/amber-owls-listen.md b/.changeset/amber-owls-listen.md new file mode 100644 index 000000000..166304af9 --- /dev/null +++ b/.changeset/amber-owls-listen.md @@ -0,0 +1,10 @@ +--- +"@tailor-platform/app-shell": patch +--- + +The 1.15.0 release notes were amended. Its `@base-ui/react` update from 1.6.0 to 1.8.0 changed two behaviours that can break consumer tests: + +- `Select` no longer renders its options into the DOM until it is opened. Open it before asserting option text. +- Opening a `Dialog` or `AlertDialog` applies a scroll lock that can move a button under a Playwright click. Press dialog buttons with `locator.press("Enter")` instead of `click()`. + +See the [1.15.0 migration entry](https://github.com/tailor-platform/app-shell/blob/main/docs/migrations.md#1150-base-ui-180-breaks-closed-select-and-dialog-click-tests). diff --git a/docs-manifest.json b/docs-manifest.json index f62141fe7..cb203f2f9 100644 --- a/docs-manifest.json +++ b/docs-manifest.json @@ -1649,7 +1649,7 @@ "packages/core/skills/app-shell-patterns/references/patterns/interaction-toast.md": "f68bdab855730f48", "packages/core/skills/app-shell-patterns/references/patterns/list-dense-scan.md": "8062ea0df9403fbb", "packages/core/skills/app-shell-patterns/references/pages/document-detail.md": "c3fb2588a0699c26", - "packages/core/skills/app-shell-patterns/references/migrations.md": "799fd5010635b2c2", + "packages/core/skills/app-shell-patterns/references/migrations.md": "15845e186f68fe7e", "packages/core/skills/app-shell-patterns/SKILL.md": "165761adda4fbfc0" } } diff --git a/docs/migrations.md b/docs/migrations.md index 97432e822..9d05f2a6e 100644 --- a/docs/migrations.md +++ b/docs/migrations.md @@ -13,6 +13,7 @@ Each entry states which versions are affected, what breaks, how to detect it, an | Version | Change | | ------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| 1.15.0 | [Base UI 1.8.0 breaks closed-`Select` and dialog-click tests](#1150-base-ui-180-breaks-closed-select-and-dialog-click-tests) | | 1.12.0 | [`DateField` / `DatePicker` field chrome moved to `Field.Root`](#1120-datefield--datepicker-field-chrome-moved-to-fieldroot) | | 1.11.0 | [React 19.2.7 and React Router v8 required](#1110-react-1927-and-react-router-v8-are-now-required) | | 1.11.0 | [Non-modal `Sheet` renders no backdrop](#1110-non-modal-sheet-no-longer-renders-a-backdrop) | @@ -23,6 +24,37 @@ Each entry states which versions are affected, what breaks, how to detect it, an | 1.0.2 | [`Toaster` no longer accepts `richColors`](#102-toaster-no-longer-accepts-richcolors) | | before 1.0 | [Pre-1.0 breaking changes](#before-10) | +## 1.15.0: Base UI 1.8.0 breaks closed-`Select` and dialog-click tests + +**Applies to:** apps with unit tests that assert `Select` options without opening the `Select`, and apps with Playwright tests that click buttons inside a `Dialog` or `AlertDialog`. + +1.15.0 updates the bundled `@base-ui/react` from 1.6.0 to 1.8.0 (1.12.0 to 1.14.0 used 1.6.0). The AppShell API is unchanged and the app behaves the same for the people using it. Two upstream behaviour changes do break tests that relied on the old behaviour, so an app that changes nothing can still go red in CI after upgrading. The fix is in the tests, not the app. + +### `Select` options are not in the DOM until it opens + +A closed `Select` used to render its options into the DOM. It no longer does, so a test that asserts option text with `getByText` on a closed `Select` fails with "Unable to find an element". + +Open the `Select` first, then wait for the option: + +```tsx +await userEvent.click(screen.getByRole("combobox", { name: "Auto Renewal Period" })); +expect(await screen.findByText("1 Month")).toBeInTheDocument(); +``` + +### Dialog scroll lock can move a button under a Playwright click + +Opening a `Dialog` or `AlertDialog` applies a scroll lock that shifts the layout slightly. Playwright can judge a button stable and then click where it used to be, so the click lands on the backdrop and closes the dialog. The test then times out waiting for the dialog, and the Playwright call log shows the click being retried after "element was detached from the DOM". + +Press the button instead of clicking it. `press` does not use coordinates, so the layout shift cannot affect it: + +```ts +const confirm = page.getByRole("alertdialog").getByRole("button", { name: "Delete" }); +await expect(confirm).toBeVisible(); +await confirm.press("Enter"); +``` + +Do not reach for `click({ force: true })`. It only skips Playwright's stability check, and the click can still miss. + ## 1.12.0: `DateField` / `DatePicker` field chrome moved to `Field.Root` **Applies to:** apps passing `label`, `description`, `errorMessage`, or `hideTimeZone` to `DateField` or `DatePicker`. diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index f3d881584..a2b5ae1ca 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -154,9 +154,14 @@ - **`ActionPanel`'s `actions` was documented as `{ label, onSelect, variant?, disabled?, hidden? }`.** The real row requires `key`, `label` and `icon`, the handler is `onClick`, and there is no `hidden` — the documented example could not compile. The row type isn't exported separately, so an actions array annotates as `ActionPanelProps["actions"]`. Also recorded: `DescriptionCard`'s `type: "date"` parses a date-only `"YYYY-MM-DD"` string with `new Date(...)`, i.e. as UTC midnight, so it renders the previous day in negative-offset timezones. Date-only fields should be pre-formatted through `render`; real timestamps keep `type: "date"`. -- 6e4f783: Update the bundled Base UI dependency to 1.8.0. +- 6e4f783: Update the bundled `@base-ui/react` from 1.6.0 to 1.8.0. The AppShell public API is unchanged, but two upstream behaviour changes can break consumer tests: - This picks up upstream accessibility and behavior fixes across popup-backed controls while keeping the AppShell public API unchanged. + - `Select` no longer renders its options into the DOM until it is opened. Tests that assert option text on a closed `Select` must open it first, then query the option (for example with `findByText`). + - Opening a `Dialog` or `AlertDialog` applies a scroll lock that can shift layout while Playwright is clicking, so a coordinate click can land on the backdrop and close the dialog. Press dialog buttons with `locator.press("Enter")` instead of `click()`. `click({ force: true })` only skips Playwright's stability check and is not recommended. + + See the [1.15.0 migration entry](https://github.com/tailor-platform/app-shell/blob/main/docs/migrations.md#1150-base-ui-180-breaks-closed-select-and-dialog-click-tests) for examples. + + _This entry was amended after release to name the from-version and the two behaviour changes. The original text gave only the new version and named no behaviour change._ - 821bb49: Prefer literal route metadata when resolving `SidebarItem` labels and icons, even when a dynamic sibling route was registered first. ## 1.14.0