Skip to content

Preserve CSS easing values in Motion previews - #8199

Merged
steve8708 merged 36 commits into
mainfrom
fix/design-css-easing-preview-20261025
Oct 25, 2026
Merged

steve8708 merged 36 commits into
mainfrom
fix/design-css-easing-preview-20261025

Conversation

@steve8708

Copy link
Copy Markdown
Contributor

What changed

  • Add compact easing previews for CSS step and linear curves.
  • Preserve explicit spring and easing values when generated CSS matches the compiled authoring value.
  • Improve Motion inspector editing and source writeback checks, with coverage for native styles, recipes, and React CSS writeback.
  • Add a Design changelog entry.

Verification

  • Focused codec and native style editor tests: 130 passed.
  • pnpm guards: 93 checks passed.
  • Design pnpm typecheck: passed.
  • Formatting and staged diff checks passed.
  • Four targeted browser cases passed individually. The long dock save/restore flow passed in its latest isolated run; earlier linked and isolated attempts showed an intermittent response/state mismatch, with no confirmed root cause.

Behavioral coverage does not include screenshot review.

@github-actions

Copy link
Copy Markdown
Contributor

Here's a visual recap of what changed:

Visual recap

Open the full interactive recap

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

* workspace-credential-lookup: error treated as absent -> typed retryable 503

* workspace-credential-error-propagation: 503 stopped at the resolver -> alternate key is tried and HTTP status is preserved
builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

…261025' into fix/design-css-easing-preview-20261025

# Conflicts:
#	templates/design/actions/apply-motion-edit.localhost.spec.ts
#	templates/design/actions/apply-motion-edit.ts
#	templates/design/shared/motion-code.spec.ts
builder-io-integration[bot]

This comment was marked as outdated.

* fix: keep Clips recording pages scrollable in short windows

* fix: keep short-window scroll scoped to recordings
* test: cover submission receipts and execution fences

* test: verify direct busy chat admission

* test: name direct and UI queue coverage

* test: allow chat queue verification to finish

* test: capture background run diagnostics

* test: retain stale run evidence

* fix(core): keep claimed workers alive during setup

* test(core): include stale deadline in run-store mocks

* test(core): align background finalization assertion

* test(core): complete run-store stale-time mocks

* fix(core): keep background setup heartbeat live until handoff

* test(core): assert setup heartbeat beyond stale window

* fix(core): bound background setup heartbeat

* fix(core): bound background setup finalization

* fix(core): keep claimed setup failures observable

* fix(core): preserve process-run failure response

* fix(core): finalize pre-start worker errors
builder-io-integration[bot]

This comment was marked as outdated.

…261025' into fix/design-css-easing-preview-20261025

# Conflicts:
#	templates/design/e2e/motion-browser.spec.ts
#	templates/design/e2e/motion-controls.browser.spec.ts
… Content filters (#8035)

* Add text and relative date filter operators to Content collections

Text filters add does not contain, starts with and ends with. Date filters add on or before, on or after, relative days (today, tomorrow, yesterday) and an is within operator for relative ranges, resolved against the caller's today each time a view is read. A date without a time now covers its whole day in both the shared evaluator and the Files navigation SQL. Operator and chip labels move into the database message catalogs for every locale.

* Give the new Content filter test queries a filter mode

* Count rolling date ranges from today, compare filter times as timestamps, and keep a range's start when leaving between

- past/next 7 and 30 days now span 7 and 30 calendar days, today included.
- Files navigation SQL compares a moment as timestamptz, so offset bounds and
  the database's default timestamps agree with the shared evaluator, and
  handles equals / does not equal on a moment instead of skipping them.
- Saving a view rejects a date filter value no comparison can read; empty and
  unfinished range ends still save mid-edit.
- Switching from between to a one-date operator keeps the range's start.

* Check date filter values on personal View overrides too

The shared and personal View saves now use one check,
contentDatabaseDateFilterValueError, so an unknown is_within token or an
unreadable date is rejected on either path.

* Read filter and row times without an offset in the caller's time zone

Date properties store times as wall-clock values ("2026-10-22T18:00"), and a
filter value can be written the same way. new Date() read both in the host's
zone, so the server (UTC on hosted servers) and the browser could disagree on
the same saved filter. contentDatabaseFilterInstant reads them in the request's
x-user-timezone on the server and in the browser's own zone on the client; a
written offset still decides the moment. Bounds are normalized to UTC ISO
strings, and an impossible day such as 2026-02-30T10:00 no longer rolls over
into March.

* Read only ISO date filter times, compare day rows by day, and tie cursors to the zone

- contentDatabaseFilterInstant reads only an ISO date and time (optional
  seconds, fraction and offset); strings like 10/22/2026, 2026-10 or 5 no
  longer become moments through the runtime's Date parser.
- A wall-clock time a daylight-saving change skips moves forward by the
  change, and a repeated one is the first of the two, as JavaScript dates do.
- A row without a time compared with a timed value is compared by day: the
  day the moment falls on in the caller's zone.
- A between orders a day and a time by when each starts and ends, not by text.
- A Files navigation cursor under a filter with a time records the caller's
  time zone, so it can't be reused from another zone.

* Check new date filters on every View save, trim navigation text like the evaluator, and cache zone formatters

The legacy Files save and the full replace now reject an unreadable date too,
checking only filters a save adds or changes so an older view still saves.

* Read row times to the millisecond in Files navigation, keep a relative day's date when switching to between, and read fewer zone offsets per row

* Skip a between filter with a blank end until it's filled in, in both readers and the filter count

* Compare each View's date filters with that View's saved ones, letting a new view copy any

* Give each end of a date range the single date's picker, editing a timed end as text

A range's ends were plain date inputs, which show a relative day or a timed value blank and drop it on edit. Each end now has the Exact date / Today / Tomorrow / Yesterday picker, and a timed end is edited as text. Switching a relative day to between keeps it as the start again. Creating a view through the agent setup path compares its filters with every saved view's, as a full save does.

* Hold a typed time in its field until it reads as a date

A timed date filter value is edited as text, and each keystroke reached the filter, so pausing partway through a time autosaved an unreadable value and showed a failed-save toast. The field now passes text on only once it reads as a date, marks an unfinished one invalid, and drops it on blur.

* Close the operator menu once a filter operator is picked

Both operator menus, in the filter chip editor and the advanced filter row, kept themselves open after a pick, covering the value field that comes next until Escape or a click elsewhere. They now close like the editor's property and relative-day pickers, and the filter editor stays open. The menus that add filters or groups, or move filters, still stay open for repeated use.

* Pick a date filter's text or date field from its current value

A date filter's field chose once, when it first appeared, whether to edit its value as text (a value with a time) or with a date input. Filter rules are keyed by property and position, so removing an earlier rule on the same property handed its field to the next one, and a timed value could land in a date input that hid its time and dropped it on edit. The field now follows the value it shows, and stays text while it's being edited, so taking the time out still doesn't switch it mid-edit.

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

* Give date filters Notion's operators and relative range picker

The date operator menu drops "Is not", matching Notion's nine date
operators. A rule that already uses it keeps it in the menu with its
label, and the evaluator, API and agent actions still accept it.

"Is within" now picks Past, This or Next, a count from 1 to 999 for Past
and Next, and day, week, month or year, instead of seven fixed ranges.
Tokens are past_<n>_<unit>, next_<n>_<unit> and this_<unit>. Either form
of the unit reads, and saves write the singular for 1. Ranges are whole
days that count today, month and year steps take a shorter month's last
day, and weeks start on Sunday. last_week and next_week are gone. A rule
switched to "is within" starts at the past 7 days.

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

* End a next-months range on a shorter month's last day

The next month from 31 January ended on 27 February: 31 January plus a
month lands on 28 February, and the range then stopped the day before.
When a next month or year range lands on a shortened month end, it now
runs through that day, so 29, 30 and 31 January all run through 28
February while 28 January still ends on the 27th. Past ranges already
started on the 1st after a short month, so they don't change.

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

* Word relative date units in each locale's plural forms and drop a date draft on a menu choice

The relative date picker's unit labels were a singular and a plural per
locale, which can't say Arabic's forms for 2, for 3 to 10 and for 11 up.
They're now plural keys with every CLDR category, picked with
Intl.PluralRules for the page's locale.

Choosing a relative day or Exact date from the value menu now clears an
unsaved typed date, as leaving the field does, so Exact date shows the
saved date rather than the half-typed one.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
builder-io-integration[bot]

This comment was marked as outdated.

… flags, lint and escape-hatch guards (#8206)

* Ratchet framework strictness: typed action contracts, strict compiler flags, lint and escape-hatch guards

- defineAction infers its return type from outputSchema and requires run to
  return what the schema accepts; outputErrorStrategy defaults to "strict";
  "fallback" is deprecated; defineActionErrors declares a closed error-code set.
- tsconfig.base.json turns on noUncheckedIndexedAccess,
  exactOptionalPropertyTypes, noImplicitOverride and noFallthroughCasesInSwitch;
  projects with a backlog opt out explicitly. The core CLI and templates/plan
  are now type-checked under strict.
- oxlint 1.89.0 / oxlint-tsgolint 7.0.2005.
- New guards: action-output-schema, compiler-strictness, strict-lint,
  no-new-escape-hatches.

* Fix CI and review feedback on the strictness ratchet

- Changeset for the other publishable packages the flag flip touched.
- Carry the toolkit-provider narrowing to every template copy (ui-primitives
  sync), repin the QR spec's blob id, and state "warn" in the MCP specs and
  chat specs that relied on the old default or an explicit undefined key.
- Infer results from outputSchema for parameter-based actions too, and type
  "warn"/"fallback" results as output-or-input instead of output only.
- compiler-strictness: map src/cli files to tsconfig.cli.json, and compare
  each changed tsconfig structurally against the merge-base so a removed
  `true` or a multiline `false` is caught.
- action-output-schema: fail closed on spreads, non-literal options,
  namespaced calls, and `outputSchema: undefined`.

* Close remaining gaps in the strictness ratchet guards

- compiler-strictness: also watch every flag strict implies (so
  strictNullChecks: false under strict fails), and judge a changed extends
  by the effective config at HEAD.
- action-output-schema: recognize aliased defineAction imports, resolve
  identifier and shorthand outputSchema values within the file, and read
  outputErrorStrategy through consts, rejecting values it cannot read.
- ActionOutputResult includes undefined for "fallback", which returns
  outputFallback as given.

* fix: close action output schema guard gaps

* fix: recognize derived Zod output schemas

* fix: recognize long Zod schema chains
* Update iOS quick-action routing for Expo 58

* Upgrade mobile app to Expo SDK 58

* Adopt Expo Router navigation shell

* Update MCP guard for Router mail route

* Fix formatting for widget asset manifests

* Harden mobile session bootstrap and storage

* Bound native session token mutation waits

* Preserve session token ordering after timeout

* Fix queued session token mutation deadlines
builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

Copy link
Copy Markdown
Contributor Author

Addressed the latest review’s remaining points in 241e2dfbee9ef: the Motion editor now handles a missing active screen, and the React source helper accepts a targetless clear when a valid managed Motion style already exists. Verification: focused Design source/action suites passed (242 tests), Design typecheck passed, and the browser regression that deletes the final screen with Motion open passed.

This was sent from a bot

builder-io-integration[bot]

This comment was marked as outdated.

* feat(core): add typed decisions API

* feat(core): default decisions to Jev

* feat(core): gate unverified Jev scores

* docs: format Decisions documentation

* fix: harden Decisions provider handling

* fix: close Decisions review edge cases

* fix: preserve Decisions credential failures and fallback deadlines

* fix(core): honor decision cancellation during credential lookup

* fix(core): bound decision credential resolution

* fix(core): bound Decisions input payloads

* fix(core): bound decision status lookups

* fix(core): validate decision evaluation metrics

* test(core): allow remaining Jev timeout budget

* fix(core): check Jev readiness in parallel

* fix(core): bound calibration error bins

* fix(core): satisfy Decisions guard checks

* fix(core): remove redundant credential-cache guards

* docs: clarify Decisions provider-order scope
builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

builder-io-integration[bot]

This comment was marked as outdated.

@builder-io-integration builder-io-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Builder reviewed your changes — looks good ✅

Review Details

Incremental review of PR #8199 at head 03892656. This update only adjusts the native Motion browser test: it adds a helper to clear persisted canvas state and reload the current screen, increases the timeout, and uses the helper in the persistence flow. Two independent review passes found no clear issues; the reloaded page remains on the same screen and readiness checks are retained. Risk: Low; no product behavior changes.

🧪 Browser testing: Skipped — PR delta only modifies E2E test code, with no user-facing runtime impact.

@steve8708
steve8708 merged commit 4d6c9a5 into main Oct 25, 2026
232 of 234 checks passed
@steve8708
steve8708 deleted the fix/design-css-easing-preview-20261025 branch October 25, 2026 21:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants