docs(corpus): add docs/comparison.md — honest framework-level positioning
Where UIX sits relative to the two families (headless behavior: Radix/Ark/bits/
React Aria; styled systems: Mantine/Chakra/Radix Themes/shadcn), grounded in
UIX's own documented design choices rather than claims about competitors'
internals:
- morfo as a single declarative contract (compile-time drift),
- a perception layer (sema) neither family has,
- two-moment motion, theme-as-retint, validated token scope, graceful
degradation,
- and the honest trade-offs (more to learn, smaller ecosystem, sema only pays
off if used).
The one competitor-specific claim (Chakra collapses presence onto one axis) is
sourced in eidos-motion.md. Per-component prop-parity comparisons stay in each
component README, by doctrine. Wired into docs/README.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
---
|
|
|
|
|
title: How UIX Compares
|
|
|
|
|
type: notes
|
|
|
|
|
audience: human + agent
|
|
|
|
|
status: current
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
# How UIX Compares
|
|
|
|
|
|
|
|
|
|
An honest read of where UIX sits relative to the field. This is **framework-level
|
|
|
|
|
positioning** grounded in UIX's own documented design choices — not a feature
|
|
|
|
|
matrix of competitors' internals. The **per-component** prop-parity comparisons
|
|
|
|
|
(against ark-ui, bits-ui, radix-ui, react-aria) live in each component's
|
|
|
|
|
`README.md`, by project doctrine; this doc is the layer above them.
|
|
|
|
|
|
|
|
|
|
## Two families exist
|
|
|
|
|
|
|
|
|
|
Component libraries cluster into two families, and they force a trade:
|
|
|
|
|
|
|
|
|
|
- **Headless behavior** (Radix Primitives, Ark UI, bits-ui, React Aria) — solve
|
|
|
|
|
behavior + accessibility, leave visuals to you. Excellent separation, but they
|
|
|
|
|
stop at behavior: there is no model of *what an interaction means* or how it
|
|
|
|
|
should *feel*.
|
|
|
|
|
- **Styled systems** (Mantine, Chakra, Radix Themes, shadcn) — ship opinionated
|
|
|
|
|
visuals and theming, but couple behavior and appearance and let a theme
|
|
|
|
|
redefine almost anything.
|
|
|
|
|
|
|
|
|
|
UIX keeps the headless family's strict separation and adds the two things neither
|
|
|
|
|
family has: a **declarative contract** above behavior, and a **perception layer**
|
|
|
|
|
below visuals.
|
|
|
|
|
|
|
|
|
|
## What UIX adds
|
|
|
|
|
|
|
|
|
|
### 1. A single declarative contract (`morfo`)
|
|
|
|
|
|
|
|
|
|
A component's public DOM surface — parts, `data-*`, ARIA, keyboard, events — is
|
|
|
|
|
declared once in a typed object and consumed by every layer. Rename a part and
|
|
|
|
|
the consuming layers break at **compile time**. In the headless libraries that
|
|
|
|
|
structural information is spread across the provider, the ARIA derivations, the
|
|
|
|
|
CSS and the docs, and drifts silently. → [`architecture/morfo`](./architecture/morfo.md)
|
docs(corpus): add docs/comparison.md — honest framework-level positioning
Where UIX sits relative to the two families (headless behavior: Radix/Ark/bits/
React Aria; styled systems: Mantine/Chakra/Radix Themes/shadcn), grounded in
UIX's own documented design choices rather than claims about competitors'
internals:
- morfo as a single declarative contract (compile-time drift),
- a perception layer (sema) neither family has,
- two-moment motion, theme-as-retint, validated token scope, graceful
degradation,
- and the honest trade-offs (more to learn, smaller ecosystem, sema only pays
off if used).
The one competitor-specific claim (Chakra collapses presence onto one axis) is
sourced in eidos-motion.md. Per-component prop-parity comparisons stay in each
component README, by doctrine. Wired into docs/README.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
|
|
|
|
### 2. A perception layer (`sema`)
|
|
|
|
|
|
|
|
|
|
UIX models the **meaning and feel** of an interaction: 8 perceptual families,
|
|
|
|
|
intents (the evaluative load), verbs, and a cascade that projects the signal as
|
|
|
|
|
sound, haptic and a `data-event-*` stamp. No mainstream component library has a
|
|
|
|
|
perceptual layer — they animate, but they do not have a vocabulary for *what
|
|
|
|
|
occurred*. The vocabulary is grounded in the book *Diseñando lo que ocurre*. →
|
docs(book): F7.2 (4/6) — sema chapter translated to docs/architecture/sema.md
src/uix/sema/README.md (749 L, Spanish) translated to English: the emit
contract (sequential strict), the 1-2-3-4-5a-5b resolution cascade, the
data-event-* tokens, the typed semaSelector builder, per-component packs,
the sound repository, SoundChannel details, SEMA_FAMILY_POLICY (two axes)
and SEMA_VERBS + naming shapes. Thin stub at the old path; corpus links
swept (CANON, comparison, glossary, docs map, building-a-component,
overview, morfo chapter, active_architecture). docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
[`CANON.md`](./CANON.md), [`architecture/sema`](./architecture/sema.md)
|
docs(corpus): add docs/comparison.md — honest framework-level positioning
Where UIX sits relative to the two families (headless behavior: Radix/Ark/bits/
React Aria; styled systems: Mantine/Chakra/Radix Themes/shadcn), grounded in
UIX's own documented design choices rather than claims about competitors'
internals:
- morfo as a single declarative contract (compile-time drift),
- a perception layer (sema) neither family has,
- two-moment motion, theme-as-retint, validated token scope, graceful
degradation,
- and the honest trade-offs (more to learn, smaller ecosystem, sema only pays
off if used).
The one competitor-specific claim (Chakra collapses presence onto one axis) is
sourced in eidos-motion.md. Per-component prop-parity comparisons stay in each
component README, by doctrine. Wired into docs/README.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
|
|
|
|
### 3. Two-moment motion
|
|
|
|
|
|
|
|
|
|
UIX animates **two** moments and integrates them with the perceptual signature:
|
|
|
|
|
`--event` (the flourish during a signal's hold) and `--state` (the transition to
|
|
|
|
|
a persistent condition). The other systems collapse presence animation onto a
|
docs(book): F7.3 (8/9) — eidos-motion translated to docs/theming/motion.md
src/uix/eidos/eidos-motion.md (698 L, Spanish) translated to English, same
s1-s19 numbering: the two-moment thesis, the closed cascade model
(D.11-D.13), motion across the 4 layers, the two-surface registry, types,
the EngineMotion API + cleanup policy, the 5 drivers, the DOM contract
(data-animation-style), Presence integration, reduced motion, primitives/
keyframes, built-in content, per-component defaults, code map, s15 (the
events.css -> signatures migration — cited from events.css), Chakra
comparison, naming, phases F1-F7, deferred. Stub with the full s-map at
the old path; corpus links swept (comparison, eidos chapter, changelog,
motion-guide). docs:check 0 errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
single axis (e.g. Chakra: only `data-state` + `Presence`). → [`eidos-motion.md`](./theming/motion.md)
|
docs(corpus): add docs/comparison.md — honest framework-level positioning
Where UIX sits relative to the two families (headless behavior: Radix/Ark/bits/
React Aria; styled systems: Mantine/Chakra/Radix Themes/shadcn), grounded in
UIX's own documented design choices rather than claims about competitors'
internals:
- morfo as a single declarative contract (compile-time drift),
- a perception layer (sema) neither family has,
- two-moment motion, theme-as-retint, validated token scope, graceful
degradation,
- and the honest trade-offs (more to learn, smaller ecosystem, sema only pays
off if used).
The one competitor-specific claim (Chakra collapses presence onto one axis) is
sourced in eidos-motion.md. Per-component prop-parity comparisons stay in each
component README, by doctrine. Wired into docs/README.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
|
|
|
|
### 4. Theme = retint the perceptually-fixed
|
|
|
|
|
|
|
|
|
|
Variants (`solid`/`outline`/…) and the 9 color roles are **canon of the system**,
|
|
|
|
|
not of the theme. A theme changes *which hex* is `affirm`; it cannot invent a
|
|
|
|
|
variant or redefine what `outline` means. This is the opposite of styled systems
|
|
|
|
|
where a theme can redefine almost anything — UIX trades that freedom for
|
docs(book): F7.3 (9/9) — THEMING reference translated; theming/ + canon/ batch COMPLETE
src/uix/eidos/THEMING.md (1499 L, Spanish) translated to English as
docs/theming/reference.md, same s1-s38 numbering: the mental model,
s1.bis (theming lives in eidos — the 2-of-3 derivation and the canonical
split), the CSS layers, the 7 token layers, the 9 roles, the size canon
(universal 1:1 + label step-down + container cap + the icon scale), the
naming conventions, the s7/s8/s9/s13/s15/s17/s18 stubs repointed into the
book (canon/tsc, theming/guide, theming/notes, theming/changelog,
theming/motion), runtime overrides + builders, bundle/purge, validation
tooling, s14 motion (the pickup lift), s16 anti-patterns, s19 variants
canon, and the s20-s38 standing-decision stubs. One internal
reconciliation applied: the s35 stub cited the control/compact/dense size
archetypes that s5 declares superseded by the universal 1:1 — aligned.
One stale v1 DEMO_AUTHORING s12.8 citation in s5 replaced by the v2 s6
parity rule. Stub at the old path carries the full s1-s38 map (the most
sN-cited doc in the repo: code comments, CLAUDE.md, RFCs). Corpus links
swept (CANON, docs map, comparison, glossary, eidos chapter, canon/tsc,
theming/guide + notes). docs:check 0 errors (260 docs).
F7.3 complete: docs/canon/ (tsc, recipe-contract) + docs/theming/
(reference, guide, notes, channels, motion, motion-guide, changelog).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
portability and a stable perceptual meaning across themes. → [`THEMING.md`](./theming/reference.md) §19
|
docs(corpus): add docs/comparison.md — honest framework-level positioning
Where UIX sits relative to the two families (headless behavior: Radix/Ark/bits/
React Aria; styled systems: Mantine/Chakra/Radix Themes/shadcn), grounded in
UIX's own documented design choices rather than claims about competitors'
internals:
- morfo as a single declarative contract (compile-time drift),
- a perception layer (sema) neither family has,
- two-moment motion, theme-as-retint, validated token scope, graceful
degradation,
- and the honest trade-offs (more to learn, smaller ecosystem, sema only pays
off if used).
The one competitor-specific claim (Chakra collapses presence onto one axis) is
sourced in eidos-motion.md. Per-component prop-parity comparisons stay in each
component README, by doctrine. Wired into docs/README.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
|
|
|
|
### 5. Validated token scope (TSC)
|
|
|
|
|
|
|
|
|
|
Where each token may be emitted is part of the source contract and validated at
|
|
|
|
|
generation, instead of ad-hoc CSS variables sprinkled across selectors. →
|
|
|
|
|
[`canon/tsc.md`](./canon/tsc.md)
|
docs(corpus): add docs/comparison.md — honest framework-level positioning
Where UIX sits relative to the two families (headless behavior: Radix/Ark/bits/
React Aria; styled systems: Mantine/Chakra/Radix Themes/shadcn), grounded in
UIX's own documented design choices rather than claims about competitors'
internals:
- morfo as a single declarative contract (compile-time drift),
- a perception layer (sema) neither family has,
- two-moment motion, theme-as-retint, validated token scope, graceful
degradation,
- and the honest trade-offs (more to learn, smaller ecosystem, sema only pays
off if used).
The one competitor-specific claim (Chakra collapses presence onto one axis) is
sourced in eidos-motion.md. Per-component prop-parity comparisons stay in each
component README, by doctrine. Wired into docs/README.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
|
|
|
|
|
|
|
|
### 6. Graceful degradation
|
|
|
|
|
|
|
|
|
|
Components are headless-functional without a DOM, and sema is ornamental — sound
|
|
|
|
|
/ haptic / audio-disabled / SSR environments work without special-casing. →
|
|
|
|
|
[`testing-and-tooling.md`](./testing-and-tooling.md) (SSR posture)
|
|
|
|
|
|
|
|
|
|
## The honest trade-offs
|
|
|
|
|
|
|
|
|
|
- **More to learn.** Four layers + a perceptual vocabulary is more concepts than
|
|
|
|
|
"import a styled component." The [glossary](./glossary.md) and
|
|
|
|
|
[getting-started](./getting-started.md) exist because of this.
|
|
|
|
|
- **Smaller ecosystem.** Radix/Mantine have years of community components and
|
|
|
|
|
battle-testing; UIX is one codebase.
|
|
|
|
|
- **The perception layer only pays off if you use it.** A team that just wants
|
|
|
|
|
styled, accessible widgets gets the headless behavior — but the sema layer's
|
|
|
|
|
value (coherent sound/haptic/motion meaning) is realized only when an app
|
|
|
|
|
wires it.
|
|
|
|
|
|
|
|
|
|
## Where the per-component detail lives
|
|
|
|
|
|
|
|
|
|
Each component's `README.md` carries a `## Comparison` table against ark-ui,
|
|
|
|
|
bits-ui, radix-ui (and react-aria where relevant), with every gap marked and a
|
|
|
|
|
disposition (implement / defer / drop). That is the contract-level honesty;
|
|
|
|
|
this doc is the architecture-level one.
|