Uh oh!
There was an error while loading. Please reload this page.
Ship the renderer-independent Components 4 foundation - #177
Conversation
Preserve practical migration aliases and Cratis-owned paginator/filter contracts for deeply customized consumers. Validate the packed artifact across package managers, remove stale Prime Storybook modes, and align the migration documentation with the shipped renderer-independent foundation.
Close the independently identified accessibility, pass-through, SSR hydration, multi-select, documentation, Storybook, packaging, and guidance gaps before exposing the major release for human review.
Apply the repository formatters after the accessibility and migration review changes, and remove the last stale PrimeReact architecture reference from the authoritative corpus.
…ation # Conflicts: # Source/.storybook/main.ts # Source/package.json
Connect tooltip behavior to real focusable controls, associate Arc field titles and errors with every command control, make DataPage selection truly typed and controlled, complete pass-through forwarding, and align dialog callbacks and documentation with runtime behavior.
Remove the remaining Prime-specific application recipes, expose DataPage paginator customization, display filtered multi-select values, make breadcrumbs natively keyboard accessible, and align the merged marker specs with stable Cratis parts.
Remove late-merged Prime icon and legacy-token dependencies, make Canvas overlays SSR-safe, block busy dialog dismissal, localize and expose stable filter parts, document Canvas and public part contracts, and verify current Arc 22.1 compatibility.
Exercise the owned dialog and stepper markup directly, update Storybook and toolbar examples to Cratis contracts, preserve selection without a data key by object reference, and broaden DatePicker part attributes without leaking implementation types.
Make the date trigger discoverable by default, align Chips behavior and accessibility, document removed renderer subpaths, expose stable Toolbar parts, clarify React-only renderer independence, and preserve controlled DataPage typing without internal any.
Forward localized search labels, expose integrated Canvas labels and glass surfaces with a safe default, and honor arbitrary Dropdown tab order values with regression coverage.
Remove residual renderer icon and token assumptions, fix PivotViewer token overrides and Chips duplicate/max semantics, ship the bundled font license, complete public part exports, and expand migration guidance for removed APIs plus Ada and Studio.
Add stable Toolbar composition seams, make hidden tools inert, preserve controlled table selection through loaded-page transforms, enforce busy dialog scopes, make PivotViewer SSR-safe and color-reactive, and complete the Arc, Ada, Studio, and public API guidance.
Align the baseline with familiar Lara-era visuals while improving contrast, isolate prefixed no-Preflight styles, add Storybook accessibility and visual matrices, complete consumer migration guidance, harden overlays/SSR/selection/source maps/licensing, and expose product-owned Canvas and Toolbar seams.
Use accessible action pairs for selected controls, complete reduced-motion coverage, make visual stories deterministic and responsive, and add familiar Dropdown hover/pressed states.
Publish the Tailwind MIT notice, enforce it in archive verification, honor reduced motion in standalone event timelines, and keep reduced-motion Toolbar panels unclipped.
Make explicit light schemes override ambient dark without blocking an explicitly dark subtree, add selector regression coverage, and map Ada's scheme-aware elevation tokens.
@woksin@einari — this comment records why this major takes this direction, why now, what was proven, and what we are deliberately not claiming yet. Why this is not merely a renderer swapComponents 3 placed Cratis application behavior behind PrimeReact runtime, provider configuration, public types, pass-through slots, theme variables, DOM assumptions, and licensing. PrimeUI's published terms explicitly say that an internal wrapper/design system does not remove developer-seat requirements, and SDK/framework-style redistribution is OEM territory requiring separate clarification. That meant the commercial renderer was not actually an implementation detail. It was an invisible condition of using Arc-bound dialogs, fields, tables, pages, and notifications. The technical cost matched the licensing cost:
We shipped Components 3 stabilization first (#169, #171, #172 → v3.5.0) so correctness and accessibility were not held hostage by this major migration. The long-lived boundaryComponents 4 now owns:
React Aria remains internal for focus, overlays, collections, keyboard behavior, and internationalized dates. It is Apache-2.0 and style-free, but its types/classes/DOM are not the consumer contract. Native HTML is used when simpler. Arc and Why no TanStack or compatibility package nowTanStack Table is a good headless engine, but current Components tables do not yet need enough grouping/pinning/faceting complexity to justify another abstraction. #109 should extract query/table state into Arc React only after a second renderer or real consumer proves the contract. A Prime compatibility package is not published without written licensing/OEM clarity. Components 3 is the compatibility line while consumers migrate. Baseline appearance and stylingThe default UI is intentionally familiar to Components 2/3 users rather than looking like an unrelated redesign:
We intentionally differ where exact Lara reproduction would retain weaker contrast or semantics. Actions/statuses, focus rings, control boundaries, disabled state, forced colors, and reduced motion are stronger. The stylesheet contract is now real rather than aspirational:
Products can override unlayered CSS without specificity wars. Mixed Prime products receive explicit Cratis z-index controls while configuring Prime independently. Consumer evidenceCustom-token design systemA representative custom-token design system maps its canonical tokens directly to Its locale-aware Prime InputNumber remains an honest bounded Prime island until #175 supplies proven parity. We do not claim this archetype is fully migrated. Deeply customized canvas/compositor hostRepresentative Dialog, CommandDialog, Stepper, Toolbar, and stable-part usage compiles. Stable parts, state attributes, and product-owned compositor markers preserve deep customization without making product vocabulary part of the Components contract. Broad direct Prime and local canvas usage make this a staged migration, with existing obligations retained while those surfaces remain. Components 2/PrimeReact 10 applicationThis archetype can move directly to Components 4 while retaining PrimeReact 10 as a bounded direct-use island. It does not need an intermediate PrimeReact 11 migration. Components 3/PrimeReact 11 multi-entry application with an advanced table adapterThis archetype can start baseline-first with Components light/dark while retaining its separate PrimeReact 11 provider and application-owned advanced table adapter. Components does not force canvas-specific Toolbar composition onto ordinary page actions or claim that its default table implements advanced server state. VerificationThe exact candidate has:
What remains deliberately open
A future Vue/Svelte frontend should use Arc transport/generated-client contracts and framework-native state/components. We should extract cross-framework contracts only after another implementation proves them, not pre-abstract React details today. Requested review focus
Please treat renderer leakage, inaccessible behavior, undocumented migration edits, misleading compatibility, or a custom-design-system dead end as blockers. This PR should remain unmerged until you are both comfortable with the major and the RC pilot plan. |
Resolve links from each source page, validate extensionless routes and anchors, and report site-root/network exclusions instead of silently scanning zero links.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Replace vulnerable regex sanitization with deterministic Markdown destination and heading parsing, including adversarial self-tests.
woksin
commented
Aug 24, 2026
Final review update: all latest checks on |
Keep public consumer guidance evidence-based through generic archetypes, remove private product provenance and local paths, and retain only legitimate framework/tooling references.
Summary
Components 3 stabilization shipped first in #169, with the independent pre-major additions in #171 and release recovery in #172. That work is published as
@cratis/components@3.5.0, so consumers can take correctness and accessibility fixes without silently receiving a rendering-foundation migration.This focused Components 4 change replaces the mandatory PrimeReact/PrimeUI foundation with Cratis-owned React markup, public types, behavior, semantic tokens, stable parts, and state attributes. React Aria remains an internal implementation dependency for difficult accessible interactions; semantic native HTML is used where it is simpler and stronger.
The maintained baseline remains deliberately familiar to Components 2/3 users: Lara-adjacent blue actions, neutral light/dark surfaces, 6px radii, comparable control density, and familiar overlays. It differs intentionally where stronger focus, control-boundary, status, disabled-state, or text contrast improves accessibility.
A product design system maps its canonical values directly to
--cratis-*and styles documenteddata-cratis-part/ typedptsurfaces. Components no longer places a Prime preset, provider, variable bridge, DOM contract, runtime, or license between the product and its UI.Applications that still import Prime directly must retain their installed-version Prime provider, styling, dependencies, and licensing obligations around those remaining surfaces. Components 4 does not make direct Prime usage license-free. No Prime compatibility package is published without written licensing/OEM clarification.
This PR is intentionally opened for maintainer and RC review and must remain unmerged until @woksin and @einari approve the public API, baseline appearance, migration guidance, accessibility behavior, and downstream pilot plan.
Migration guide: https://cratis.io/components/migration/
Added
--cratis-*tokens for actions, controls, status pairs, elevation, focus, disabled state, and overlay stacking (CratisComponentsConfig is Partial<PrimeReactProps>, so every consumer's root wiring is typed by a commercial third-party package #163, Replace the mandatory PrimeReact foundation with Cratis-owned React Aria components #170)data-cratis-part/ state contracts, including complete Toolbar composition/measurement seams and product-owned Canvas capture attributes (Replace the mandatory PrimeReact foundation with Cratis-owned React Aria components #170)Changed
@cratis/componentsindependent of mandatory PrimeReact, PrimeIcons, PrimeUI runtime/peers/provider/types/theme/licensing (Components has no UI-kit-free entry point: the Arc binding surface only ships inside the PrimeReact package #162, CratisComponentsConfig is Partial<PrimeReactProps>, so every consumer's root wiring is typed by a commercial third-party package #163, Replace the mandatory PrimeReact foundation with Cratis-owned React Aria components #170)@cratis/arc.react; Components owns visual policytokens: semantic seam with conservative light defaultsstyles: prefixed internal utilities plus layered structure, with no Preflight/reset or token duplicationtheme: optional dark/light/forced-colors/subtree behaviorRemoved
@cratis/components/styled@cratis/components/compatibility@cratis/components/primereact-v10-palettestyledMode,StyledModeOptions,CratisPreset,primeReactStyles, Prime layer/dark-selector constants, and Prime pass-through compatibility/sentinel exportsVerification
Fresh evidence for the exact final candidate (
509cdcf; semantic approval at7a62e23):rxjspackage-extension workaround1d769e97283d4f57ce70aa2a9ce85952d9e96c182d3d045026b2cfe8e0d71fe2Public type validation:
skipLibCheck: true).skipLibCheck: false.Consumer status
Follow-up plan
Closes#162
Closes#163
Closes#170