Release v4.0.0
Summary
Components 4 replaces the PrimeReact-backed Components 3 foundation with Cratis-owned React APIs, semantic markup, typed parts, state attributes, and design tokens while preserving the established component catalog.
React Aria supplies selected interaction primitives internally; it is not part of the public prop, DOM, styling, provider, or type contract. Native semantic HTML and Components-owned implementations remain the default where they are simpler.
This is a major release. Applications should follow the Components 3 to 4 migration guide.
Added
- Add Components-owned typed parts, stable
data-cratis-partvalues, canonical state attributes, provider messages, strict public declarations, and standalone Common controls. (#173) - Add semantic Button
variant,tone, andshapeprops and value-firstChangeHandler<T>callbacks. - Add the stable nine-slot
stable-presentation/v1renderer profile for Button, IconButton, TextInput, TextArea, Checkbox, Radio, Switch, ProgressBar, and Surface. - Add
@cratis/components.mui,@cratis/components.primereact, and@cratis/components.primereact10as optional presentation adapters. (#191, #192) - Add
@cratis/components.conformance, a development-only verification harness for renderer adapter authors covering behavior, parts, state, SSR, and accessibility. Ordinary applications do not install it. - Add
@cratis/components.migrator, an optional development CLI for upgrading Components 3 source imports, Button appearance props, and value-first callbacks. It uses syntax-aware codemods internally and is not an application runtime dependency. - Add a Components ESLint configuration that prevents deprecated root imports and protects renderer-independent boundaries.
- Add a generated Components 3/4 compatibility manifest used by migration tooling and release validation.
- Add the explicit
@cratis/components/Chatsubpath with sidebar, topic, conversation, message-body, action, mention, emoji, and observable-query surfaces. - Add Canvas region auto-membership, optional Arc messenger notifications, Canvas controls, and Canvas minimap support.
- Add
ItemAddedToRegion,ItemRemovedFromRegion,NoteTextChanged, andChatMessageAddedmessaging contracts. - Add renderer coexistence, primitive adaptation, custom composition, licensing, migration, capability-profile, Chat, and Canvas messaging documentation.
Changed
- Make the package root setup-only; import components from explicit
@cratis/components/*subpaths. (#162) - Replace PrimeReact provider/theme/pass-through contracts with Components-owned configuration, tokens, typed parts, and semantic state. (#163, #170)
- Keep React Aria as an internal dependency behind Components-owned public contracts.
- Move
pixi.jsto an optional peer used only by Canvas and PivotViewer. - Rebuild ChatSidebar without PrimeReact dependencies or public PrimeReact contracts.
- Move the generic Pixi-free Chat Kit to
@cratis/components/Chatwhile retaining Canvas ChatBubble compatibility exports. - Define loaded-page table search, filtering, and sorting separately from server-side complete-result behavior.
- Use one shared repository release version for Core, ESLint, Migrator, Conformance, MUI, PrimeReact 11, and PrimeReact 10 packages.
- Keep renderer ABI major
1separate from the repository package version. - Preserve zero-configuration built-in rendering while allowing one optional presentation adapter through
CratisComponentsProvider. - Keep dialogs, dropdowns, date pickers, tooltips, paginator behavior, focus management, overlays, and complex Components composites owned by Core.
- Commit a reproducible dependency lockfile and use immutable installation throughout CI. (#130)
Fixed
- Keep built-in AutoCommandForm field providers available after aggressive production tree shaking.
- Handle malformed and non-JSON-representable SchemaEditor input without crashing, and recover when valid input returns.
- Keep nested SchemaEditor required-property state consistent across rename, deletion, and type changes.
- Restrict SchemaEditor names and DataTable/Pivot property paths to explicit own data instead of inherited or reserved prototype keys.
- Keep id-less Canvas items available to minimap and fit-to-content without leaking generated React IDs into region membership messages.
- Preserve Canvas registry metadata transitions and provider-fed asynchronous Chat mention candidates.
- Give Chat topic lists semantic list/button markup and readable light/dark token contrast.
- Make DatePicker Today respect date and date-time bounds and preserve provider-owned accessible labels.
- Prevent DataTable date filters from mutating caller-owned dates and preserve loaded-page row indices after filtering and sorting.
- Make query-backed DataTable containers scroll correctly and keep sticky headers attached to the actual scrolling ancestor. (#195, #196)
- Let Dialog titles wrap instead of overflowing. (#198)
- Keep FilterPanel clear actions outside disclosure buttons and clamp portaled panels within the viewport. (#199, #200)
- Prevent PivotViewer filter, grouping, search, worker-correlation, stale-result, and selection-identity regressions.
- Localize Toolbar's default accessible name through
CratisComponentsProvider. (#174) - Document the deprecated
clientFilteringprop as a no-op; complete-result behavior belongs to explicit server query arguments. (#159) - Render string-valued Tag icons as consumer-owned CSS classes instead of literal text. (#220)
- Preserve packed TSDoc and
@deprecatedguidance without shipping declaration-only prose in runtime JavaScript. - Reject inherited and reserved renderer metadata keys consistently across Core, Conformance, and adapter discovery.
Removed
- Remove PrimeReact, PrimeIcons, PrimeUI, and Prime theme dependencies and peers from
@cratis/components. - Remove renderer-specific
styled,compatibility, andprimereact-v10-paletteexports. - Remove root component-family namespace exports in favor of explicit subpaths.
- Remove accidental implementation exports that were not intended public contracts.
- Remove unused renderer-specific prop-extension declarations that no component implemented.