You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(spec-parity): the Tier-2 spec values render instead of validating into nothing (#2942)
Every row below is the #2897 shape — validates at authoring time, renders
nothing (or a dead control), no test fails and no warning fires:
- UserFilters `element: 'toggle'`: `default: return null` deleted the ENTIRE
filter bar for stored toggle configs. The existing-but-unreachable
ToggleFilters branch is wired; authoring stays untypeable (ADR-0053) while
stored metadata keeps rendering (spec ADR-0047 §3.4a).
- UserFilters `date-range` / `text`: dead "No options" popovers become a
from/to date pair (emits >=/<= bounds) and a contains search input.
- useAnimation: preset/easing maps re-keyed to the spec's underscore
vocabulary (+ rotate/flip via usePageTransition's classes); hyphen dialect
and `scale-fade` stay accepted for stored configs. The
`EASING_MAP[easing] || easing` fallthrough no longer emits invalid CSS.
- NotificationContext: displayType materialized (spec default toast, legacy
`modal` presents as alert) and the unions now match NotificationTypeSchema
/ NotificationPositionSchema instead of claiming to.
- useNavigationOverlay: the spec `size` buckets resolve to viewport-clamped
widths off app-shell too (explicit `width` still wins; `auto` stays
host-derived).
- Both ThemeProviders: `mode: 'auto'` follows the OS instead of adding a
dead `auto` class that locked the light theme; `system` kept as the
pre-spec spelling.
- AdvancedChart: the single-value families (gauge/solid-gauge/metric/kpi/
bullet) render the measure as a number, table/pivot name their owning
component, unknown types are named — never the bar SHELL with null series
marks that was indistinguishable from an empty dataset (reachable via
ChartRenderer's `schema.chartType ?? spec.chartType` bypass).
- Timeline: the spec `scale` key is read at last (legacy `timeScale` kept);
hour/quarter/year generate real gantt header buckets instead of a blank
axis.
- Toaster: position (all six spec values) and `limit` reach sonner instead
of being discarded by a bare `<SonnerToaster />`.
- useSpecGesture: the DECLARED `config.type` drives recognition —
pan/drag/rotate/double_tap no longer collapse to tap; useGesture gains
real double-tap (two taps, not one) and two-touch pinch/rotate deltas.
- ReportViewer: `aggregation: 'distinct'` computes a distinct count instead
of a blank summary cell.
- FieldEditWidget: inline resolution goes through the form's alias table, so
`json` gets the code editor, `tree` the lookup picker, and composite/
record/repeater/video/audio/autonumber resolve to their documented
exclusions; ObjectGrid's editability gate consults the same contract, so
a `composite` cell is read-only instead of a value-corrupting text box.
- FilterBuilder: $startsWith/$endsWith/$null/$exists become authorable
(startsWith/endsWith/isNull/isNotNull/exists/notExists) and round-trip
through condToMongo/kvToCondition — every FieldOperatorsSchema token is
now reachable from the UI.
The export-menu row (PDF silently downloading nothing) was fixed
concurrently by #2999, which this branch rebases onto and defers to.
Each fix lands with a spec-parity guard per the #2897 template; `fields`,
`mobile`, `plugin-charts` and `providers` gain the `@objectstack/spec`
devDependency that makes those guards possible (no second zod peer variant
materialized — verified in the lockfile).
Refs #2942, #2901
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0 commit comments