@adia-ai/adia-ui-forge 0.8.62 → 0.8.64
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 +2 -2
- package/.codex-plugin/plugin.json +3 -3
- package/CHANGELOG.md +317 -275
- package/README.md +54 -18
- package/__init__.py +8 -8
- package/agents/a2ui-maintenance-agent.corpus.json +7 -7
- package/agents/a2ui-maintenance-agent.md +6 -6
- package/agents/a2ui-planner-agent.md +11 -11
- package/agents/demo-audit-agent.corpus.json +4 -4
- package/agents/demo-audit-agent.md +8 -9
- package/agents/framework-checker.md +10 -11
- package/agents/framework-planner-agent.md +9 -10
- package/agents/gen-ui-review-agent.corpus.json +4 -4
- package/agents/gen-ui-review-agent.md +8 -8
- package/agents/package-release-agent.corpus.json +4 -4
- package/agents/package-release-agent.md +9 -10
- package/agents/primitive-authoring-agent.corpus.json +1 -1
- package/agents/primitive-authoring-agent.md +5 -5
- package/agents/routing-corpus.json +46 -46
- package/codex.interface.json +1 -1
- package/commands/gen-ui-review.md +1 -1
- package/commands/package-release.md +2 -2
- package/package.json +1 -1
- package/plugin.yaml +2 -2
- package/prompts/gen-ui-review.md +1 -1
- package/prompts/package-release.md +2 -2
- package/references/contracts/a2ui-mcp-surface.md +7 -7
- package/references/contracts/migration-guide-format.md +6 -7
- package/references/shared/content-trust.md +3 -5
- package/skills/a2ui-maintenance/SKILL.md +13 -16
- package/skills/a2ui-maintenance/evals/evals.json +2 -2
- package/skills/a2ui-maintenance/evals/routing-corpus.json +1 -1
- package/skills/a2ui-maintenance/references/anti-patterns.md +10 -10
- package/skills/a2ui-maintenance/references/chunk-authoring.md +11 -12
- package/skills/a2ui-maintenance/references/corpus-discipline.md +13 -14
- package/skills/a2ui-maintenance/references/data-model-reactivity.md +22 -25
- package/skills/a2ui-maintenance/references/eval-diagnostics.md +21 -21
- package/skills/a2ui-maintenance/references/format-extension-decisions.md +12 -13
- package/skills/a2ui-maintenance/references/leverage-rules.md +6 -6
- package/skills/a2ui-maintenance/references/mcp-pipeline-ops.md +9 -10
- package/skills/a2ui-maintenance/references/mcp-tool-reference.md +11 -12
- package/skills/a2ui-maintenance/references/pipeline-overview.md +33 -38
- package/skills/a2ui-maintenance/references/semantic-fail-lifting.md +13 -14
- package/skills/a2ui-maintenance/references/strategy-engines.md +14 -16
- package/skills/a2ui-maintenance/references/surface-lifecycle.md +10 -11
- package/skills/a2ui-maintenance/references/zettel-calibration.md +14 -16
- package/skills/component-md-authoring/SKILL.md +22 -22
- package/skills/component-md-authoring/agents/openai.yaml +1 -1
- package/skills/cross-harness-authoring-standards/SKILL.md +19 -21
- package/skills/cross-harness-authoring-standards/agents/openai.yaml +1 -1
- package/skills/cross-harness-compatibility-standards/SKILL.md +35 -34
- package/skills/cross-harness-compatibility-standards/agents/openai.yaml +1 -1
- package/skills/demo-audit/SKILL.md +38 -38
- package/skills/demo-audit/evals/routing-corpus.json +1 -1
- package/skills/demo-audit/references/admin-shell-anatomy.md +21 -25
- package/skills/demo-audit/references/app-shell-pitfalls.md +11 -13
- package/skills/demo-audit/references/auto-fix-allowlist.md +3 -3
- package/skills/demo-audit/references/card-anatomy-sweep.md +10 -11
- package/skills/demo-audit/references/chat-shell-anatomy.md +25 -26
- package/skills/demo-audit/references/editor-shell-anatomy.md +25 -28
- package/skills/demo-audit/references/html-attr-sweep.md +12 -13
- package/skills/demo-audit/references/mode7-status-battery.md +4 -4
- package/skills/demo-audit/references/native-leak-annotations.md +8 -8
- package/skills/demo-audit/references/output-contract-worked-example.md +8 -8
- package/skills/demo-audit/references/probe-discipline-and-escalation.md +2 -2
- package/skills/demo-audit/references/visual-probe-triage.md +21 -23
- package/skills/gen-ui-review/SKILL.md +28 -28
- package/skills/gen-ui-review/agents/openai.yaml +1 -1
- package/skills/gen-ui-review/evals/evals.json +1 -1
- package/skills/gen-ui-review/evals/routing-corpus.json +1 -1
- package/skills/gen-ui-review/references/corpus-html-patterns.md +28 -29
- package/skills/gen-ui-review/references/exit-gate-mechanics.md +5 -5
- package/skills/gen-ui-review/references/lookup-maintenance.md +2 -2
- package/skills/gen-ui-review/references/loop-protocol.md +25 -25
- package/skills/gen-ui-review/references/rubric-cosmetic.md +10 -10
- package/skills/gen-ui-review/references/rubric-decompose.md +15 -16
- package/skills/gen-ui-review/references/rubric-score.md +23 -24
- package/skills/gen-ui-review/references/scorecard-worked-examples.md +12 -12
- package/skills/gen-ui-review/references/scores.schema.json +2 -2
- package/skills/llm-client-maintenance/SKILL.md +12 -12
- package/skills/llm-client-maintenance/evals/routing-corpus.json +1 -1
- package/skills/llm-client-maintenance/references/adapter-contract.md +27 -27
- package/skills/llm-client-maintenance/references/add-a-provider.md +25 -25
- package/skills/llm-client-maintenance/references/bridge-facade.md +31 -31
- package/skills/llm-client-maintenance/references/browser-proxy-boundary.md +17 -17
- package/skills/llm-client-maintenance/references/model-registry.md +14 -14
- package/skills/llm-client-maintenance/references/streaming-sse.md +21 -21
- package/skills/package-release/SKILL.md +21 -23
- package/skills/package-release/evals/evals.json +2 -2
- package/skills/package-release/evals/routing-corpus.json +2 -2
- package/skills/package-release/references/authorization-model.md +6 -8
- package/skills/package-release/references/changelog-discipline.md +25 -27
- package/skills/package-release/references/cut-procedure.md +129 -136
- package/skills/package-release/references/gates-catalog.md +42 -43
- package/skills/package-release/references/independent-package-release.md +14 -15
- package/skills/package-release/references/invariants-detail.md +9 -9
- package/skills/package-release/references/mechanization.md +11 -12
- package/skills/package-release/references/migration-guide-authoring.md +20 -20
- package/skills/package-release/references/notes-authoring.md +20 -20
- package/skills/package-release/references/recovery-paths.md +28 -28
- package/skills/primitive-authoring/SKILL.md +19 -19
- package/skills/primitive-authoring/agents/openai.yaml +1 -1
- package/skills/primitive-authoring/evals/evals.json +2 -2
- package/skills/primitive-authoring/evals/routing-corpus.json +2 -2
- package/skills/primitive-authoring/references/INDEX.md +22 -22
- package/skills/primitive-authoring/references/anti-patterns.md +76 -77
- package/skills/primitive-authoring/references/api-contract.md +63 -65
- package/skills/primitive-authoring/references/authoring-cycle.md +47 -50
- package/skills/primitive-authoring/references/canonical-pattern-index.md +118 -118
- package/skills/primitive-authoring/references/code-style.md +50 -52
- package/skills/primitive-authoring/references/common-gotchas.md +23 -23
- package/skills/primitive-authoring/references/composite-demo-protocol.md +42 -45
- package/skills/primitive-authoring/references/css-patterns.md +97 -97
- package/skills/primitive-authoring/references/for-attribute-event-contract.md +12 -12
- package/skills/primitive-authoring/references/form-control-sizing.md +16 -18
- package/skills/primitive-authoring/references/lifecycle-patterns.md +42 -42
- package/skills/primitive-authoring/references/llm-bridge.md +21 -21
- package/skills/primitive-authoring/references/module-promotion.md +51 -51
- package/skills/primitive-authoring/references/primitive-audit.md +16 -16
- package/skills/primitive-authoring/references/shell-patterns.md +81 -81
- package/skills/primitive-authoring/references/svg-authoring.md +62 -66
- package/skills/primitive-authoring/references/token-contract.md +45 -49
- package/skills/primitive-authoring/references/trait-pages.md +8 -8
- package/skills/primitive-authoring/references/worked-example.md +39 -39
- package/skills/primitive-authoring/references/yaml-contract.md +139 -143
- package/skills/site-deployment/SKILL.md +25 -26
- package/skills/site-deployment/agents/openai.yaml +1 -1
- package/skills/site-deployment/evals/routing-corpus.json +1 -1
- package/skills/site-deployment/references/deploy-playbooks.md +51 -53
- package/skills/site-docs-authoring/SKILL.md +14 -14
- package/skills/site-docs-authoring/agents/openai.yaml +1 -1
- package/skills/site-docs-authoring/evals/evals.json +1 -1
- package/skills/site-docs-authoring/evals/routing-corpus.json +1 -1
- package/skills/site-docs-authoring/intent.md +18 -18
- package/skills/ssr-compatibility/SKILL.md +24 -25
- package/skills/ssr-compatibility/agents/openai.yaml +1 -1
- package/skills/ssr-compatibility/evals/evals.json +1 -1
- package/skills/ssr-compatibility/evals/routing-corpus.json +1 -1
- package/skills/ssr-compatibility/references/consumer-workarounds.md +22 -23
- package/skills/ssr-compatibility/references/failure-shapes.md +84 -91
- package/skills/ssr-compatibility/references/guard-patterns.md +54 -58
- package/skills/ssr-compatibility/references/status-ledger.md +17 -17
- package/skills/ssr-compatibility/references/test-without-linkedom.md +26 -27
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# Trait Detail Pages
|
|
1
|
+
# Trait Detail Pages, the required template
|
|
2
2
|
|
|
3
3
|
Every trait detail page under `site/pages/traits/<name>/` follows one binding section template. The 41-page Phase B sweep proved what a loose contract produces: bimodal quality (portfolio-grade pages next to abstract-box demos) and zero pages teaching restraint. Navigate-by-template is the contract. Source: ADR-0019.
|
|
4
4
|
|
|
5
|
-
Trait pages are this skill's charter (traits live in `packages/web-components/traits/`); `site-docs-authoring` owns `site/pages/{architecture,getting-started,guides,patterns,reference}
|
|
5
|
+
Trait pages are this skill's charter (traits live in `packages/web-components/traits/`); `site-docs-authoring` owns `site/pages/{architecture,getting-started,guides,patterns,reference}`, not `traits/`.
|
|
6
6
|
|
|
7
7
|
## Required sections, in order
|
|
8
8
|
|
|
9
9
|
| # | Section (`data-property=`) | Required? | Purpose |
|
|
10
10
|
|---|---|---|---|
|
|
11
11
|
| 1 | `<header>` | always | `<h1>` trait name + `<tag-ui>trait</tag-ui>` + category tag matching `_catalog.json` SoT |
|
|
12
|
-
| 2 | `hero` | always | "In context" demo with real product chrome
|
|
12
|
+
| 2 | `hero` | always | "In context" demo with real product chrome, no abstract boxes |
|
|
13
13
|
| 3 | `minimal` | always | Single-tag declarative usage; `<h2>` reads "Bare minimum" |
|
|
14
14
|
| 4 | `declarative` | always | `<X traits="trait-name">` code-ui block |
|
|
15
15
|
| 5 | `config` | conditional | Only when the trait declares `config` attrs in `defineTrait()`; live sliders + readouts |
|
|
@@ -26,13 +26,13 @@ Trait-specific extras (`state`, `lifecycle`, scenario `usage` recipes) slot betw
|
|
|
26
26
|
|
|
27
27
|
- `data-property` values are lowercase hyphen-separated tokens; canonical set as in the table. **`minimal`, not `bare`.**
|
|
28
28
|
- `data-artifact-label` values are lowercase descriptive prose ("settle log") OR code-shaped strings describing the demo axis (`speed=120 (slow, dramatic)`). HTML-entity escapes inside attribute values are correct.
|
|
29
|
-
- Header category tag MUST match the trait's `category` in `packages/web-components/traits/_catalog.json
|
|
30
|
-
- Imports in code-ui blocks use the full package name `@adia-ai/web-components/traits
|
|
29
|
+
- Header category tag MUST match the trait's `category` in `packages/web-components/traits/_catalog.json`, catalog SoT, never page-author judgment.
|
|
30
|
+
- Imports in code-ui blocks use the full package name `@adia-ai/web-components/traits`, never internal aliases like `@traits/index.js`.
|
|
31
31
|
- Inline-style tokens use canonical names: `--a-border` (dashed borders), `--a-radius-md` / `--a-radius-lg`, `--a-accent` / `--a-accent-fg`.
|
|
32
32
|
|
|
33
33
|
## The two teeth
|
|
34
34
|
|
|
35
|
-
- **`when-not-to-use` is the highest-impact section.** A page shipping without it defaults to "this trait is good, please use it"
|
|
36
|
-
- **Composes must SHOW.** Listing trait names with prose-only descriptions does not satisfy the contract
|
|
35
|
+
- **`when-not-to-use` is the highest-impact section.** A page shipping without it defaults to "this trait is good, please use it", wrong for every trait once overuse, density, or a11y tradeoffs enter. The restraint mandate is the pedagogy differentiator (Motion / GSAP / React Spring all whiff on it). Fewer than 2 bullets requires an articulated why.
|
|
36
|
+
- **Composes must SHOW.** Listing trait names with prose-only descriptions does not satisfy the contract, at least one composition runs as a working demo.
|
|
37
37
|
|
|
38
|
-
No mechanical gate enforces this template yet (ADR-0019's verify-trait-pages.mjs was deferred and does not exist)
|
|
38
|
+
No mechanical gate enforces this template yet (ADR-0019's verify-trait-pages.mjs was deferred and does not exist): the 11-section contract is enforced at PR review. Source: ADR-0019.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Two annotated examples: a light presentation component (`<badge-ui>`) and a form-associated component (`<counter-ui>`). Copy the structure; adapt the content.
|
|
4
4
|
|
|
5
|
-
## Example 1
|
|
5
|
+
## Example 1, Light presentation component: `<badge-ui>`
|
|
6
6
|
|
|
7
7
|
A small inline container for status labels. Supports cosmetic variants (primary/success/danger) and an optional remove button that fires a `remove` event.
|
|
8
8
|
|
|
@@ -10,24 +10,24 @@ A small inline container for status labels. Supports cosmetic variants (primary/
|
|
|
10
10
|
|
|
11
11
|
The REAL anatomy every shipped primitive carries (this example's code blocks
|
|
12
12
|
below show only the two hand-authored core files, but "copy the structure"
|
|
13
|
-
means all of these
|
|
13
|
+
means all of these: the yaml SoT and its regenerated artifacts are not
|
|
14
14
|
optional):
|
|
15
15
|
|
|
16
16
|
```text
|
|
17
17
|
packages/web-components/components/badge/
|
|
18
|
-
badge.yaml # SoT
|
|
18
|
+
badge.yaml # SoT, props/slots/events contract (yaml-contract.md); edit FIRST
|
|
19
19
|
badge.class.js # the class, non-registering export (test isolation / subclassing)
|
|
20
20
|
badge.js # side-effect registration wrapper: import class + defineIfFree()
|
|
21
21
|
badge.css # @scope'd styles
|
|
22
22
|
badge.html # standalone demo page
|
|
23
23
|
badge.examples.html # docs-site examples
|
|
24
24
|
badge.examples.md # examples prose
|
|
25
|
-
badge.a2ui.json # GENERATED from the yaml (npm run build:components)
|
|
25
|
+
badge.a2ui.json # GENERATED from the yaml (npm run build:components), never hand-edit
|
|
26
26
|
badge.d.ts # GENERATED types
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
The code below collapses the class + registration into one `badge.js` for
|
|
30
|
-
reading compactness only
|
|
30
|
+
reading compactness only, a real component splits them
|
|
31
31
|
(`badge.class.js` exports, `badge.js` registers).
|
|
32
32
|
|
|
33
33
|
### `badge.js`
|
|
@@ -36,14 +36,14 @@ reading compactness only — a real component splits them
|
|
|
36
36
|
import { UIElement } from '../../core/element.js';
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
* <badge-ui
|
|
39
|
+
* <badge-ui>, Compact inline status label.
|
|
40
40
|
*
|
|
41
41
|
* Props:
|
|
42
|
-
* variant
|
|
43
|
-
* removable
|
|
42
|
+
* variant, 'neutral' | 'primary' | 'success' | 'danger' (default 'neutral')
|
|
43
|
+
* removable, show an inline × button that fires 'remove' on click
|
|
44
44
|
*
|
|
45
45
|
* Events:
|
|
46
|
-
* remove
|
|
46
|
+
* remove, user clicked the × button (bubbles)
|
|
47
47
|
*/
|
|
48
48
|
class UIBadge extends UIElement {
|
|
49
49
|
static properties = {
|
|
@@ -87,13 +87,13 @@ export { UIBadge };
|
|
|
87
87
|
|
|
88
88
|
**Annotations:**
|
|
89
89
|
|
|
90
|
-
- **Class name `UIBadge`, tag `badge-ui
|
|
91
|
-
- **`variant` default `'neutral'
|
|
92
|
-
- **`removable: default false
|
|
93
|
-
- **`#removeBtn` private field
|
|
94
|
-
- **`#onRemove` stable arrow
|
|
95
|
-
- **Symmetric connected/disconnected
|
|
96
|
-
- **Idempotent `connected()
|
|
90
|
+
- **Class name `UIBadge`, tag `badge-ui`**, three-way naming.
|
|
91
|
+
- **`variant` default `'neutral'`**, string enum, default is the absent- attribute state. No special behavior to "opt into."
|
|
92
|
+
- **`removable: default false`**, Boolean false (rule 1). Reflects so CSS can match `:scope[removable]`.
|
|
93
|
+
- **`#removeBtn` private field**, cached DOM ref, nulled on teardown.
|
|
94
|
+
- **`#onRemove` stable arrow**, reference equality works for `removeEventListener`.
|
|
95
|
+
- **Symmetric connected/disconnected**, single listener, single removal.
|
|
96
|
+
- **Idempotent `connected()`**, checks `querySelector('[data-badge-remove]')` before injecting, so an author who pre-slots their own button isn't overridden.
|
|
97
97
|
|
|
98
98
|
### `badge.css`
|
|
99
99
|
|
|
@@ -111,7 +111,7 @@ export { UIBadge };
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
:scope {
|
|
114
|
-
/* ── Base styles
|
|
114
|
+
/* ── Base styles, consume component tokens only ── */
|
|
115
115
|
display: inline-flex;
|
|
116
116
|
align-items: center;
|
|
117
117
|
gap: var(--badge-gap);
|
|
@@ -125,7 +125,7 @@ export { UIBadge };
|
|
|
125
125
|
white-space: nowrap;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
/* ── Variants
|
|
128
|
+
/* ── Variants, token-only overrides ── */
|
|
129
129
|
:scope[variant="primary"] {
|
|
130
130
|
--badge-bg: var(--a-primary-bg);
|
|
131
131
|
--badge-fg: var(--a-primary-fg);
|
|
@@ -166,17 +166,17 @@ export { UIBadge };
|
|
|
166
166
|
**Annotations:**
|
|
167
167
|
|
|
168
168
|
- **Two blocks:** `:where(:scope)` for tokens, `:scope` for base. Variants and state third.
|
|
169
|
-
- **Variants override tokens only.** No `display`, `padding`, etc. in the variant bodies
|
|
169
|
+
- **Variants override tokens only.** No `display`, `padding`, etc. in the variant bodies, they just reassign the component's token values.
|
|
170
170
|
- **Zero raw colors.** Every color is a token.
|
|
171
|
-
- **Zero raw px
|
|
171
|
+
- **Zero raw px**, spacing via `--a-space-*`, radius via `--a-radius-*`. The only numeric literal is `1px` for the border (allowed carve-out).
|
|
172
172
|
- **Stem `--badge-*`** matches the scope tag `badge-ui`.
|
|
173
|
-
- **`color-mix()` on `currentColor`** is the idiomatic hover tint
|
|
173
|
+
- **`color-mix()` on `currentColor`** is the idiomatic hover tint, stays theme-aware without introducing a new token.
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
177
|
-
## Example 2
|
|
177
|
+
## Example 2, Form-associated component: `<counter-ui>`
|
|
178
178
|
|
|
179
|
-
A numeric input that shows value + increment/decrement buttons. Form- participating
|
|
179
|
+
A numeric input that shows value + increment/decrement buttons. Form- participating, submits a string value with the host form.
|
|
180
180
|
|
|
181
181
|
### `counter.js`
|
|
182
182
|
|
|
@@ -184,13 +184,13 @@ A numeric input that shows value + increment/decrement buttons. Form- participat
|
|
|
184
184
|
import { UIFormElement } from '../../core/form.js';
|
|
185
185
|
|
|
186
186
|
/**
|
|
187
|
-
* <counter-ui
|
|
187
|
+
* <counter-ui>, Integer counter with +/− controls. Form-associated.
|
|
188
188
|
*
|
|
189
189
|
* Props:
|
|
190
|
-
* value
|
|
191
|
-
* min
|
|
192
|
-
* max
|
|
193
|
-
* step
|
|
190
|
+
* value, number, default 0 (syncs to form value as string)
|
|
191
|
+
* min, number, default null (no lower bound)
|
|
192
|
+
* max, number, default null (no upper bound)
|
|
193
|
+
* step, number, default 1
|
|
194
194
|
*/
|
|
195
195
|
class UICounter extends UIFormElement {
|
|
196
196
|
static properties = {
|
|
@@ -221,7 +221,7 @@ class UICounter extends UIFormElement {
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
connected() {
|
|
224
|
-
super.connected(); // registers ElementInternals
|
|
224
|
+
super.connected(); // registers ElementInternals, do not omit
|
|
225
225
|
|
|
226
226
|
if (!this.querySelector('[data-counter-dec]')) {
|
|
227
227
|
this.innerHTML = `
|
|
@@ -259,12 +259,12 @@ export { UICounter };
|
|
|
259
259
|
|
|
260
260
|
**Annotations:**
|
|
261
261
|
|
|
262
|
-
- **`UIFormElement` superclass
|
|
263
|
-
- **`super.connected()` / `super.disconnected()
|
|
264
|
-
- **`min`/`max` default `null
|
|
265
|
-
- **`#commit()` is the one-place-value-changes
|
|
266
|
-
- **`syncValue(String(next))
|
|
267
|
-
- **Two stable handlers
|
|
262
|
+
- **`UIFormElement` superclass**, inherits `name`, `disabled`, `required` etc. via the spread.
|
|
263
|
+
- **`super.connected()` / `super.disconnected()`**, both present. Without them, form association silently fails.
|
|
264
|
+
- **`min`/`max` default `null`**, no magic sentinels. `null` = "no constraint."
|
|
265
|
+
- **`#commit()` is the one-place-value-changes**, clamps, short-circuits on no-op, fires `change`, calls `syncValue`, triggers `render()`.
|
|
266
|
+
- **`syncValue(String(next))`**, inherited from `UIFormElement`, updates the form-submitted string representation.
|
|
267
|
+
- **Two stable handlers**, `#onDecrement`, `#onIncrement`. Both paired in `disconnected()`.
|
|
268
268
|
- **`render()` updates internal DOM** only when a reflected prop (`value`) changes and CSS selectors can't express the update (text content). CSS handles the disabled state via `:scope[disabled]`.
|
|
269
269
|
|
|
270
270
|
### `counter.css`
|
|
@@ -315,7 +315,7 @@ export { UICounter };
|
|
|
315
315
|
font-variant-numeric: tabular-nums;
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
-
/* Disabled state
|
|
318
|
+
/* Disabled state, inherited from UIFormElement */
|
|
319
319
|
:scope[disabled] {
|
|
320
320
|
--counter-fg: var(--a-fg-muted);
|
|
321
321
|
--counter-border: 1px solid var(--a-border-subtle);
|
|
@@ -327,14 +327,14 @@ export { UICounter };
|
|
|
327
327
|
|
|
328
328
|
**Annotations:**
|
|
329
329
|
|
|
330
|
-
- **No variants** in this example
|
|
330
|
+
- **No variants** in this example: the component is functional, not cosmetic. All state communicated via tokens and the `[disabled]` selector.
|
|
331
331
|
- **`:scope > [data-*]`** for slotted-like children without `::slotted()`.
|
|
332
|
-
- **`pointer-events: none` + `opacity` in the disabled body
|
|
332
|
+
- **`pointer-events: none` + `opacity` in the disabled body**: this is allowed because `pointer-events` is an interaction property, not a layout property. Same for `cursor`.
|
|
333
333
|
- **`min-width: 3ch`** is a non-layout metric (character-based), not a px literal; no carve-out needed.
|
|
334
334
|
|
|
335
335
|
---
|
|
336
336
|
|
|
337
|
-
## Checklist
|
|
337
|
+
## Checklist, did this component pass?
|
|
338
338
|
|
|
339
339
|
Run the 30-second self-check from [authoring-cycle.md](authoring-cycle.md) Step 4 against each example:
|
|
340
340
|
|