Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .agents/skills/create-changeset/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
10 changes: 10 additions & 0 deletions .changeset/amber-owls-listen.md
Original file line number Diff line number Diff line change
@@ -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).
2 changes: 1 addition & 1 deletion docs-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -1667,7 +1667,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": "814325f4ea06ffae"
}
}
32 changes: 32 additions & 0 deletions docs/migrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) |
Expand All @@ -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`.
Expand Down
9 changes: 7 additions & 2 deletions packages/core/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading