@adia-ai/adia-ui-forge 0.8.46 → 0.8.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +38 -0
- package/CHANGELOG.md +15 -0
- package/codex.interface.json +12 -0
- package/package.json +5 -3
- package/skills/a2ui-maintenance/SKILL.md +1 -0
- package/skills/a2ui-maintenance/agents/openai.yaml +3 -0
- package/skills/a2ui-maintenance/references/data-model-reactivity.md +96 -0
- package/skills/demo-audit/SKILL.md +2 -0
- package/skills/demo-audit/agents/openai.yaml +3 -0
- package/skills/gen-ui-review/agents/openai.yaml +3 -0
- package/skills/llm-client-maintenance/agents/openai.yaml +3 -0
- package/skills/package-release/SKILL.md +2 -0
- package/skills/package-release/agents/openai.yaml +3 -0
- package/skills/package-release/scripts/gate-roster.mjs +6 -0
- package/skills/primitive-authoring/SKILL.md +2 -0
- package/skills/primitive-authoring/agents/openai.yaml +3 -0
- package/skills/primitive-authoring/references/INDEX.md +2 -0
- package/skills/primitive-authoring/references/for-attribute-event-contract.md +62 -0
- package/skills/primitive-authoring/references/form-control-sizing.md +59 -0
- package/skills/site-deployment/agents/openai.yaml +3 -0
- package/skills/site-docs-authoring/SKILL.md +2 -0
- package/skills/site-docs-authoring/agents/openai.yaml +3 -0
- package/skills/ssr-compatibility/agents/openai.yaml +3 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adia-ui-kit-forge",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.48",
|
|
4
4
|
"description": "Maintain the adia-ui (@adia-ai) framework itself \u2014 author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-ui-kit-factory (the consumer/app-author plugin).",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Kim",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "adia-ui-kit-forge",
|
|
3
|
+
"version": "0.8.48",
|
|
4
|
+
"description": "Maintain the adia-ui (@adia-ai) framework itself — author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-ui-kit-factory (the consumer/app-author plugin).",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Kim",
|
|
7
|
+
"email": "kim.granlund@adia.ai",
|
|
8
|
+
"url": "https://github.com/adiahealth/gen-ui-kit"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/adiahealth/gen-ui-kit",
|
|
11
|
+
"repository": "git+https://github.com/adiahealth/gen-ui-kit.git",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"adia-ui",
|
|
15
|
+
"a2ui",
|
|
16
|
+
"gen-ui",
|
|
17
|
+
"web-components",
|
|
18
|
+
"framework-authoring",
|
|
19
|
+
"release-engineering",
|
|
20
|
+
"maintainer"
|
|
21
|
+
],
|
|
22
|
+
"skills": "./skills/",
|
|
23
|
+
"interface": {
|
|
24
|
+
"displayName": "Adia UI Forge",
|
|
25
|
+
"shortDescription": "Maintain the adia-ui (@adia-ai) framework: primitives, A2UI pipeline, releases",
|
|
26
|
+
"longDescription": "Adia UI Forge is the maintainer toolkit for the adia-ui (@adia-ai) light-DOM web-component framework — author primitives and shells, run and tune the A2UI generative-UI pipeline and its corpus, review gen-UI quality, sweep app-shell QA, cut lockstep releases, and deploy the docs site. The maintainer counterpart to Adia UI Factory (the consumer/app-author toolkit).",
|
|
27
|
+
"category": "Engineering",
|
|
28
|
+
"capabilities": [
|
|
29
|
+
"Read",
|
|
30
|
+
"Write"
|
|
31
|
+
],
|
|
32
|
+
"defaultPrompt": [
|
|
33
|
+
"Audit adia-ui primitives for token drift",
|
|
34
|
+
"Run the A2UI generation pipeline and score the gallery output"
|
|
35
|
+
],
|
|
36
|
+
"brandColor": "#1B4D8C"
|
|
37
|
+
}
|
|
38
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog — adia-ui-kit-forge
|
|
2
2
|
|
|
3
|
+
## [0.8.48] — 2026-08-23
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- OpenAI Codex plugin manifest (gh#1888) — `.codex-plugin/plugin.json` +
|
|
7
|
+
a per-skill `skills/<name>/agents/openai.yaml`, derived from
|
|
8
|
+
`.claude-plugin/plugin.json` via `npm run build:codex-manifests`
|
|
9
|
+
(`check:codex-manifests-fresh` gates freshness). Additive: the Claude Code
|
|
10
|
+
plugin surface is unchanged.
|
|
11
|
+
|
|
12
|
+
## [0.8.47] — 2026-08-22
|
|
13
|
+
|
|
14
|
+
### Maintenance
|
|
15
|
+
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the lockstep version coherence enforced by `scripts/release/check-lockstep.mjs`. Substantive v0.8.47 work shipped in table-toolbar size/chrome fixes, anchor popover reuse guard, token-layer light-dark cleanup (gh#1852), side-by-side docs demos. See `packages/web-components/CHANGELOG.md#0847--2026-08-22` for details.
|
|
16
|
+
- **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
|
|
17
|
+
|
|
3
18
|
## [0.8.46] — 2026-08-22
|
|
4
19
|
|
|
5
20
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"displayName": "Adia UI Forge",
|
|
3
|
+
"shortDescription": "Maintain the adia-ui (@adia-ai) framework: primitives, A2UI pipeline, releases",
|
|
4
|
+
"longDescription": "Adia UI Forge is the maintainer toolkit for the adia-ui (@adia-ai) light-DOM web-component framework — author primitives and shells, run and tune the A2UI generative-UI pipeline and its corpus, review gen-UI quality, sweep app-shell QA, cut lockstep releases, and deploy the docs site. The maintainer counterpart to Adia UI Factory (the consumer/app-author toolkit).",
|
|
5
|
+
"category": "Engineering",
|
|
6
|
+
"capabilities": ["Read", "Write"],
|
|
7
|
+
"defaultPrompt": [
|
|
8
|
+
"Audit adia-ui primitives for token drift",
|
|
9
|
+
"Run the A2UI generation pipeline and score the gallery output"
|
|
10
|
+
],
|
|
11
|
+
"brandColor": "#1B4D8C"
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adia-ai/adia-ui-forge",
|
|
3
|
-
"version": "0.8.
|
|
4
|
-
"description": "Maintain the adia-ui (@adia-ai) framework itself
|
|
3
|
+
"version": "0.8.48",
|
|
4
|
+
"description": "Maintain the adia-ui (@adia-ai) framework itself — author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adia-ui",
|
|
7
7
|
"a2ui",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
23
|
".claude-plugin",
|
|
24
|
+
".codex-plugin",
|
|
24
25
|
"skills",
|
|
25
26
|
"agents",
|
|
26
27
|
"commands",
|
|
@@ -28,7 +29,8 @@
|
|
|
28
29
|
"scripts",
|
|
29
30
|
"hooks",
|
|
30
31
|
"README.md",
|
|
31
|
-
"CHANGELOG.md"
|
|
32
|
+
"CHANGELOG.md",
|
|
33
|
+
"codex.interface.json"
|
|
32
34
|
],
|
|
33
35
|
"publishConfig": {
|
|
34
36
|
"access": "public",
|
|
@@ -47,6 +47,7 @@ Unmatched work defaults to pipeline-overview and re-classifies from there.
|
|
|
47
47
|
| Tune the anti-pattern catalogue | [anti-patterns](references/anti-patterns.md) |
|
|
48
48
|
| A contract can't express a content shape — decide how to extend it | [format-extension-decisions](references/format-extension-decisions.md) |
|
|
49
49
|
| Surface regeneration, pending/stale rendering, the `doc`-setter bracket | [surface-lifecycle](references/surface-lifecycle.md) (ADR-0061) |
|
|
50
|
+
| Data-model internals — `Cell`/`Derived`, RFC-6901 pointers, `path-pointer.js` call-site migration, watch semantics | [data-model-reactivity](references/data-model-reactivity.md) (ADR-0078) |
|
|
50
51
|
|
|
51
52
|
## Contracts that gate every change
|
|
52
53
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# v1 data-model reactivity — Cell/Derived, RFC-6901 pointers, value-identity cutoff
|
|
2
|
+
|
|
3
|
+
Source of truth: [ADR-0078](../../../../../../docs/ops/adr/adr-0078-a2ui-runtime-adopts-v1-data-model.md)
|
|
4
|
+
(ratified 2026-08-20, gh#1762; phased plan tracked in gh#1784). Read the ADR
|
|
5
|
+
before touching `packages/gen-ui/a2ui`'s data-model internals, `path-pointer.js`
|
|
6
|
+
call sites, or `surface.js`/`renderer.js` watch semantics — this file is the
|
|
7
|
+
routing pointer + the shape of the adopted contract, not a restatement of the
|
|
8
|
+
ruling, and NOT a claim that any phase has shipped (check gh#1784's own state
|
|
9
|
+
before citing this as already-live behavior).
|
|
10
|
+
|
|
11
|
+
## What's decided (direction, not yet fully built)
|
|
12
|
+
|
|
13
|
+
The in-repo A2UI runtime (`packages/gen-ui/a2ui`, the 0.9 dialect) **adopts**
|
|
14
|
+
the vendored `packages/genui` v1.0 data model internally — `Cell`/`Derived`
|
|
15
|
+
reactive primitives, RFC-6901 pointer semantics (`resolvePointer`/
|
|
16
|
+
`setPointer`/`deletePointer` with structural sharing), and the
|
|
17
|
+
one-memoized-`Derived`-per-pointer read contract — as its own per-surface
|
|
18
|
+
data model. This is an internal implementation swap, not a consumer
|
|
19
|
+
migration or a wire-grammar change: the dialect's eight message kinds, the
|
|
20
|
+
`{path}` binding-prop shape, `updateDataModel`, `HandlerContext.updateModel/
|
|
21
|
+
setModel`, `registerController/Handler/Resolver`, and the `<a2ui-root>`
|
|
22
|
+
element API are all unchanged (ADR-0078 Decision item 2 — falsified if any
|
|
23
|
+
consumer needs a code change, or if `dialect-schema.source.mjs` diffs).
|
|
24
|
+
Phased across future cuts, plan/LLD to follow — nothing rides in the cut
|
|
25
|
+
this ADR itself was ratified for (item 6).
|
|
26
|
+
|
|
27
|
+
## The mechanism, once adopted
|
|
28
|
+
|
|
29
|
+
- **Write path:** every write notifies the root `Cell`; every cached
|
|
30
|
+
`Derived` recomputes on any write, but a `Derived` notifies its own
|
|
31
|
+
subscribers only when the recomputed value differs by `Object.is`
|
|
32
|
+
(`renderer/dist/data-model.d.ts`, R-R10). The perf win is suppressed
|
|
33
|
+
*notification*, not suppressed *evaluation* — structural-sharing writes
|
|
34
|
+
keep untouched subtrees identity-stable, which is what makes the
|
|
35
|
+
`Object.is` cutoff effective.
|
|
36
|
+
- **The falsifiable perf contract (ADR-0078 item 3):** a single-path write
|
|
37
|
+
causes `#applyProps` (or its successor) to execute ONLY for bindings whose
|
|
38
|
+
resolved value at their pointer actually changed. Re-application count is
|
|
39
|
+
the gate, not evaluation count.
|
|
40
|
+
- **Pointer grammar:** RFC-6901 throughout — `~0`/`~1` escaping honored, no
|
|
41
|
+
empty-segment forgiveness, uniform missing-path → `undefined`. One
|
|
42
|
+
asymmetry survives by design: `resolvePointer`'s READ path treats only
|
|
43
|
+
`""` as whole-document (`"/"` resolves the empty-string key, strict RFC
|
|
44
|
+
6901), while `setPointer`/`deletePointer`'s WRITE/DELETE path treats
|
|
45
|
+
`undefined`, `""`, and `"/"` all as whole-document.
|
|
46
|
+
- **Watch semantics:** a subscriber at a pointer fires when the resolved
|
|
47
|
+
value AT that pointer changes — any writer, any write at/above/beneath the
|
|
48
|
+
pointer that alters it; a sibling write never fires it (host-bridge R-H1,
|
|
49
|
+
same identity-cutoff rule as R-R10). This supersedes `surface.js`'s
|
|
50
|
+
prefix-descend rule and `renderer.js`'s re-apply-all-bindings behavior.
|
|
51
|
+
|
|
52
|
+
## What's converging, and what it changes
|
|
53
|
+
|
|
54
|
+
`path-pointer.js` (gh#1763) currently preserves three divergent legacy
|
|
55
|
+
walkers (`getByPath`/`setByPath`, `getPath`/`setPath`, `getModelValue`) on
|
|
56
|
+
purpose, as a staging step — each call site migrates to the vendored
|
|
57
|
+
semantics above and retires when its last call site migrates. Every
|
|
58
|
+
migration phase must name its own behavior deltas rather than changing
|
|
59
|
+
silently (ADR-0078 item 4 is falsified by an unnamed semantics change) —
|
|
60
|
+
known deltas already called out: `/a//b/` stops resolving forgivingly,
|
|
61
|
+
`/name/length` on a string stops leaking the primitive's own property,
|
|
62
|
+
and a2ui's own read/write asymmetry (today: `getByPath`/`getPath` treat
|
|
63
|
+
absent-path/`""`/`"/"` alike, but `setByPath`/`setPath` no-op on root
|
|
64
|
+
instead of replacing it) converges on the read/write split named above.
|
|
65
|
+
|
|
66
|
+
## What stays fixed (don't "fix" these under this ADR)
|
|
67
|
+
|
|
68
|
+
- The surface-lifecycle contract (ADR-0061 —
|
|
69
|
+
[surface-lifecycle](surface-lifecycle.md)): the state machine, the
|
|
70
|
+
`beginSurfaceUpdate → applyTo → commitSurfaceUpdate/abortSurfaceUpdate`
|
|
71
|
+
host bracket, `data-a2ui-lifecycle` reflection, bubbling surface events —
|
|
72
|
+
all orthogonal to data-model storage/invalidation and must stay
|
|
73
|
+
byte-identical across adoption phases.
|
|
74
|
+
- The dialect/wire surface (ADR-0059's frame) and ADR-0072's wire-format
|
|
75
|
+
flip — both explicitly untouched by this internal swap.
|
|
76
|
+
- `record.js`'s bidirectional-overlap store — app-layer, outside this
|
|
77
|
+
package, rides a separate review track (R2), not this ADR.
|
|
78
|
+
|
|
79
|
+
## Consumption mechanism — open, LLD decides
|
|
80
|
+
|
|
81
|
+
`@adia-ai/a2ui` is a zero-runtime-deps package (ADR-0048 posture);
|
|
82
|
+
`packages/genui` is a vendored, never-edited-in-place artifact (ADR-0059).
|
|
83
|
+
Whether the adopted primitives land via a build-time vendor-copy (with a
|
|
84
|
+
provenance stamp) or a workspace-internal import is NOT decided by
|
|
85
|
+
ADR-0078 — whichever the LLD picks must either preserve the zero-deps
|
|
86
|
+
posture or explicitly re-rule it. Check the LLD (once authored, per gh#1784)
|
|
87
|
+
before assuming either mechanism.
|
|
88
|
+
|
|
89
|
+
## Eval-floor risk
|
|
90
|
+
|
|
91
|
+
No eval floor movement is *expected* (floors measure retrieval/composition,
|
|
92
|
+
not runtime rendering — floor sources are authoritative in
|
|
93
|
+
[eval-diagnostics](eval-diagnostics.md)), but rendered-check verify targets
|
|
94
|
+
and any eval path that renders through the runtime need per-phase
|
|
95
|
+
verification once a phase actually ships. This reference flags the risk;
|
|
96
|
+
each landed phase clears or reports it, not this file.
|
|
@@ -13,6 +13,8 @@ user-invocable: true
|
|
|
13
13
|
|
|
14
14
|
# demo-audit
|
|
15
15
|
|
|
16
|
+
> **Claude-only seat.** This skill dispatches a Claude Code subagent (the Agent tool) — under Codex, run the equivalent work inline instead (gh#1888).
|
|
17
|
+
|
|
16
18
|
Finds the bugs the type-checker misses across the monorepo's rendered surfaces.
|
|
17
19
|
Detection is script-driven; the skill owns mode routing, triage judgment, the
|
|
18
20
|
auto-fix boundary, and verification. Commands run from the monorepo root,
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Demo Audit"
|
|
3
|
+
short_description: "Seven-mode QA sweep of the monorepo's demo/app surfaces: visual probe, app-shell QA, attr-quote typos, native-primitive leak, admin-shell composition, card anatomy, plus an aggregated token/contrast/lifecycle drift battery (`npm run dogfood:status`)."
|
|
@@ -17,6 +17,8 @@ user-invocable: true
|
|
|
17
17
|
|
|
18
18
|
# package-release
|
|
19
19
|
|
|
20
|
+
> **Claude-only seat.** This skill dispatches a Claude Code subagent (the Agent tool) — under Codex, run the equivalent work inline instead (gh#1888).
|
|
21
|
+
|
|
20
22
|
Release engineering for an @adia-ai-style lockstep monorepo: the
|
|
21
23
|
`@adia-ai/*` packages on the roster (`scripts/package-paths.mjs`, the single source — 10 lockstep as of gh#1282's shim retirement) version and
|
|
22
24
|
publish together (class A). Class B (independent versioning, one member —
|
|
@@ -131,6 +131,12 @@ export const GATE_ROSTER = [
|
|
|
131
131
|
// inserted: gate numbers are identities in shipped release notes (see
|
|
132
132
|
// gate 29's note).
|
|
133
133
|
{ n: 30, cmd: 'npm run check:catalog-tiers', what: 'tier-index.json vs committed catalog (L0–L4, composability law)' },
|
|
134
|
+
// gh#1888: the Codex-plugin manifest tree (.codex-plugin/plugin.json +
|
|
135
|
+
// per-skill agents/openai.yaml, both plugins) is derived from
|
|
136
|
+
// .claude-plugin/plugin.json — a stale copy is a real Codex-install
|
|
137
|
+
// hazard the same way a stale dist bundle is a real Claude-install
|
|
138
|
+
// hazard. Appended, not inserted — same numbering discipline as gate 30.
|
|
139
|
+
{ n: 31, cmd: 'npm run check:codex-manifests-fresh', what: 'Codex plugin.json + openai.yaml vs .claude-plugin/plugin.json SoT' },
|
|
134
140
|
];
|
|
135
141
|
|
|
136
142
|
// -- CLI ------------------------------------------------------------------
|
|
@@ -41,6 +41,8 @@ wins any tie with this skill. Monorepo source read while authoring (yaml, CSS,
|
|
|
41
41
|
| Convention question ("is this idiomatic?") | [code-style.md](references/code-style.md) — cite the rule, don't expand it inline |
|
|
42
42
|
| Trait detail page (`site/pages/traits/<name>/`) | [trait-pages.md](references/trait-pages.md) — the ADR-0019 required-section template (traits are this skill's charter; site-docs-authoring does not own `traits/`) |
|
|
43
43
|
| SVG-rendered primitive (`chart-ui`, `qr-code-ui`, `icon-ui`, or a new one) — viewBox/scaling, stroke-width, text-anchor, card-bleed clipping, hit-testing | [svg-authoring.md](references/svg-authoring.md) — NOT `chart-legend-ui`/`swatch-ui`, which are HTML/CSS despite the chart-family name (file's own §0) |
|
|
44
|
+
| Form-control host sizing (fill vs. hug, a 20ch-class legibility floor, `[inline]`'s sizing axis) | [form-control-sizing.md](references/form-control-sizing.md) — ADR-0077 |
|
|
45
|
+
| A `for=`-bound pair (`table-toolbar-ui`, `chart-legend-ui`, `tooltip-ui[follows=pointer]`, `context-menu-ui`) — id-ref resolution, the bubbling-event interaction contract | [for-attribute-event-contract.md](references/for-attribute-event-contract.md) — ADR-0079 |
|
|
44
46
|
|
|
45
47
|
Full retrieval map — one line per reference file, grouped by axis:
|
|
46
48
|
[references/INDEX.md](references/INDEX.md). Depth references (api-contract,
|
|
@@ -19,6 +19,8 @@ file, including the depth references those entries cross-link.
|
|
|
19
19
|
- [css-patterns.md](css-patterns.md) — how do I structure a component stylesheet: two-block `@scope`, variants vs modes, token layering?
|
|
20
20
|
- [lifecycle-patterns.md](lifecycle-patterns.md) — how do I keep `connected()`/`disconnected()` symmetric for listeners, timers, observers, and popovers?
|
|
21
21
|
- [svg-authoring.md](svg-authoring.md) — viewBox/coordinate scaling, stroke-width, text-anchor/dominant-baseline, card-bleed clipping, currentColor vs `var()` inside SVG markup, hit-testing — for `chart-ui`/`qr-code-ui`/`icon-ui`/any new `<svg>`-emitting primitive.
|
|
22
|
+
- [form-control-sizing.md](form-control-sizing.md) — does a form-control host fill its container or hug its content, and where does the legibility floor live (ADR-0077)?
|
|
23
|
+
- [for-attribute-event-contract.md](for-attribute-event-contract.md) — what does `for=` resolve to, and how does a `for=`-bound pair talk to each other (ADR-0079)?
|
|
22
24
|
|
|
23
25
|
## Shells & modules
|
|
24
26
|
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# `for=` id-ref + bubbling-event interaction contract
|
|
2
|
+
|
|
3
|
+
Source of truth: [ADR-0079](../../../../../../docs/ops/adr/adr-0079-for-attribute-id-ref-and-events-only-interaction-contract.md)
|
|
4
|
+
(ratified 2026-08-20, executed by gh#1780). Read the ADR before adding a new
|
|
5
|
+
`for=`-bound pair or touching `table-toolbar-ui`/`chart-legend-ui`/
|
|
6
|
+
`tooltip-ui`/`context-menu-ui` — this file is the routing pointer + the
|
|
7
|
+
fix-now checklist, not a restatement of the ruling.
|
|
8
|
+
|
|
9
|
+
## The one-line rule
|
|
10
|
+
|
|
11
|
+
`for=` means id-ref, everywhere in AdiaUI — no component may give it a
|
|
12
|
+
different resolution contract (`context-menu-ui`'s prior CSS-selector
|
|
13
|
+
reading was the violation this ADR ends). The interaction contract over any
|
|
14
|
+
`for=` binding is bubbling `CustomEvent`s in **both** directions — never a
|
|
15
|
+
direct property write or method call across the binding.
|
|
16
|
+
`chart-legend-ui`↔`chart-ui` is the ratified model: the bound element
|
|
17
|
+
dispatches a bubbling event, the target listens on `document` filtered by
|
|
18
|
+
`[for]` matching its own id.
|
|
19
|
+
|
|
20
|
+
## Fix-now checklist for a `for=`-bound primitive
|
|
21
|
+
|
|
22
|
+
- `for=` resolves via `getElementById` (id-ref) — never
|
|
23
|
+
`querySelectorAll`/a CSS-selector reading. A component needing
|
|
24
|
+
selector-flavored targeting names a DIFFERENT attribute (see
|
|
25
|
+
`context-menu-ui`'s `target-selector` below) — it never overloads `for`.
|
|
26
|
+
- Every write the bound pair needs to make on each other is a bubbling
|
|
27
|
+
`CustomEvent`, dispatched at the resolved target (or document-delegated,
|
|
28
|
+
whichever the existing read direction already established) — never a
|
|
29
|
+
direct property write (`target.prop = …`) or method call
|
|
30
|
+
(`target.method()`) across the binding.
|
|
31
|
+
- `chart-legend-ui`, `chart-ui`, and `tooltip-ui[follows=pointer]` are
|
|
32
|
+
already verified compliant — don't touch them to "align" with a new
|
|
33
|
+
pattern; the ADR names them explicitly out of scope for its own sweep.
|
|
34
|
+
- `table-toolbar-ui`→`table-ui`'s inbound command surface is
|
|
35
|
+
`toolbar-search` / `toolbar-filter-set` / `toolbar-filter-clear` /
|
|
36
|
+
`toolbar-columns-set` / `toolbar-paginate` — dispatched by the toolbar at
|
|
37
|
+
its resolved `#target`, applied by `table-ui` via the same public-API call
|
|
38
|
+
the direct write used to make. This is additive to `table-ui`'s contract:
|
|
39
|
+
any consumer may dispatch these events, not only `table-toolbar-ui`. The
|
|
40
|
+
existing toolbar→consumer notification events (`search`, `filter-change`,
|
|
41
|
+
`sort-change`, `columns-change`, `page-size-change`) are unchanged and
|
|
42
|
+
never reused as the inbound command channel (naming collision, rejected
|
|
43
|
+
alternative in the ADR).
|
|
44
|
+
- A component whose `for=` was CSS-selector-flavored (`context-menu-ui`'s
|
|
45
|
+
prior shape) renames the selector-flavored attribute to `target-selector`;
|
|
46
|
+
`for` survives only as a **deprecated back-compat alias** — still resolved
|
|
47
|
+
as a selector (never dual-purposed into id-ref sniffing — rejected in the
|
|
48
|
+
ADR as ambiguous), honored only when `target-selector` is unset, with a
|
|
49
|
+
one-shot `console.warn` pointing at the replacement. Document the alias as
|
|
50
|
+
deprecated in the yaml SoT, the class doc comment, and the examples.
|
|
51
|
+
|
|
52
|
+
## What NOT to do
|
|
53
|
+
|
|
54
|
+
- Don't invent a document-level delegated-listener shape for a pair that
|
|
55
|
+
already resolves a concrete target reference for its read direction — a
|
|
56
|
+
targeted dispatch at the resolved element is simpler and still satisfies
|
|
57
|
+
"events, not direct writes" (rejected alternative in the ADR, re:
|
|
58
|
+
`table-toolbar-ui`).
|
|
59
|
+
- Don't dual-purpose one attribute name for two resolution contracts
|
|
60
|
+
(id-ref sometimes, selector sometimes) — this is the exact same-name/
|
|
61
|
+
different-contract collision ADR-0053's no-shadowing doctrine forbids for
|
|
62
|
+
global attributes, and the defect this ADR exists to end.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Form-control sizing posture — fill by default, `[inline]` hugs
|
|
2
|
+
|
|
3
|
+
Source of truth: [ADR-0077](../../../../../../docs/ops/adr/adr-0077-form-control-sizing-posture.md)
|
|
4
|
+
(ratified 2026-08-19; amends [ADR-0037](../../../../../../docs/ops/adr/adr-0037-inline-display-mode-convention.md)
|
|
5
|
+
partial — `[inline]` semantics widen to own the sizing axis, the display-default
|
|
6
|
+
convention itself is unchanged). Companion SPEC:
|
|
7
|
+
`docs/ops/spec/spec-form-control-sizing-posture.md`. Read the ADR before
|
|
8
|
+
touching a form-control host's width/min-width rules — this file is the
|
|
9
|
+
routing pointer + the fix-now checklist, not a restatement of the ruling.
|
|
10
|
+
|
|
11
|
+
## The one-line rule
|
|
12
|
+
|
|
13
|
+
A form-control host, absent `[inline]`, is block-level (ADR-0037, unchanged)
|
|
14
|
+
**and fills its container's available inline space** — in block flow via
|
|
15
|
+
`width: auto` (already true), in flex/grid parents via `width: 100%` on the
|
|
16
|
+
host (the mechanism `field-ui`/`otp-input-ui` already shipped). `[inline]`
|
|
17
|
+
flips BOTH axes at once: inline-level display **and** shrink-wrap/hug sizing.
|
|
18
|
+
No separate `hug` attribute exists or should be minted — one token, one
|
|
19
|
+
posture flip.
|
|
20
|
+
|
|
21
|
+
## Where legibility floors live
|
|
22
|
+
|
|
23
|
+
A `--*-min-width: 20ch`-class floor (the gh#781/gh#1633 pattern on
|
|
24
|
+
`input-ui`/`select-ui`/`combobox-ui`) belongs on `:scope[inline]` only, never
|
|
25
|
+
on the plain `:scope`. In the fill state the container owns the width, all
|
|
26
|
+
the way down — no exception, no re-added floor. Two floor classes are
|
|
27
|
+
explicitly NOT sizing-posture floors and stay in both states: inner
|
|
28
|
+
`min-width: 0` flex unclampers (the ellipsis-reset machinery) and
|
|
29
|
+
`min-width: var(--*-height)` squareness floors (`button-ui`'s keep-square
|
|
30
|
+
rule). Inner *segment* floors (`time-picker-ui`'s 2ch/2.5ch segments,
|
|
31
|
+
`tags-input-ui`'s 8em `[data-inline-input]`) are inner mechanics, not host
|
|
32
|
+
posture, and also stay in both states.
|
|
33
|
+
|
|
34
|
+
## Fix-now checklist for a form-control primitive
|
|
35
|
+
|
|
36
|
+
- Plain `:scope` (no `[inline]`): block-level, `width: auto` in block flow,
|
|
37
|
+
`width: 100%` in flex/grid parents. No `min-width` legibility floor here.
|
|
38
|
+
- `:scope[inline]`: inline-level display, shrink-wrap sizing, and — only if
|
|
39
|
+
the component is a floor-carrier (input/select/combobox-class) — the
|
|
40
|
+
`--*-min-width: 20ch`-class floor moves here.
|
|
41
|
+
- A component that wants to own its line but still hug has no attribute for
|
|
42
|
+
that state (ADR-0077 Decision item 6, accepted consequence) — tell the
|
|
43
|
+
consumer to use explicit sizing (`width: fit-content` or an explicit
|
|
44
|
+
width), don't invent a third posture token.
|
|
45
|
+
- `field-ui`/`fields-ui`'s `[inline]` carve-out (single-row layout meaning,
|
|
46
|
+
ADR-0037 §5) is retained and stays behaviorally convergent with this
|
|
47
|
+
decision — don't "fix" it to match the family's token meaning.
|
|
48
|
+
- The trip-wire gate is `scripts/release/check-display-default-convention.mjs`
|
|
49
|
+
— it fails a 20ch-class host floor on the plain `:scope` and fails a
|
|
50
|
+
missing fill mechanism in the default state, for roster components. One
|
|
51
|
+
gate, no second check to satisfy.
|
|
52
|
+
|
|
53
|
+
## Roster and rollout
|
|
54
|
+
|
|
55
|
+
The exact component roster and the breaking-wave/golden-regeneration rollout
|
|
56
|
+
(one coordinated wave, MIGRATION GUIDE entry same cycle, deliberately
|
|
57
|
+
regenerated `evals/visual/` goldens — never additive-first, never shimmed)
|
|
58
|
+
are the companion PLAN's job (`docs/ops/plan/plan-form-control-sizing.md`),
|
|
59
|
+
not this reference — cite the ADR/PLAN rather than re-deriving scope here.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Site Deployment"
|
|
3
|
+
short_description: "Deploys and operates the AdiaUI site + services on exe.dev VMs — pushing a `site-v*` tag through the hardened rsync --delete deploy to ui-kit.exe.xyz (dry-run delete summary reviewed before the real deploy job runs), diagnosis (\"Port 8000 unbound\", a 502, a stale/404ing build behind npm after the last lockstep cut), rolling back a broken deploy, VM provisioning, secret rotation."
|
|
@@ -16,6 +16,8 @@ user-invocable: true
|
|
|
16
16
|
|
|
17
17
|
# site-docs-authoring
|
|
18
18
|
|
|
19
|
+
> **Claude-only seat.** This skill dispatches a Claude Code subagent (the Agent tool) — under Codex, run the equivalent work inline instead (gh#1888).
|
|
20
|
+
|
|
19
21
|
Every page under `site/pages/{architecture,getting-started,guides,patterns,
|
|
20
22
|
reference}/` shares one skeleton: `<header><h1>` + a deck `<p>`, then numbered
|
|
21
23
|
`<section data-section data-property="...">` blocks, each opening
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Ssr Compatibility"
|
|
3
|
+
short_description: "Answers why an AdiaUI component crashes, drops content, renders wrong, or mutates a byte-identical subtree under SSR (linkedom/Astro) — the known failure shapes, what's fixed vs open, how to prove a fix under the linkedom shim gate."
|