@adia-ai/web-components 0.2.2 → 0.2.4
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/components/agent-trace/agent-trace.css +24 -3
- package/components/button/button.js +3 -0
- package/components/demo-toggle/demo-toggle.a2ui.json +144 -0
- package/components/demo-toggle/demo-toggle.css +120 -0
- package/components/demo-toggle/demo-toggle.js +144 -0
- package/components/demo-toggle/demo-toggle.test.js +102 -0
- package/components/demo-toggle/demo-toggle.yaml +144 -0
- package/components/index.js +1 -0
- package/components/input/input.js +11 -0
- package/components/list/list.css +66 -3
- package/components/nav-group/nav-group.a2ui.json +1 -1
- package/components/nav-group/nav-group.css +5 -5
- package/components/nav-group/nav-group.yaml +1 -1
- package/components/nav-item/nav-item.a2ui.json +1 -1
- package/components/nav-item/nav-item.css +3 -4
- package/components/nav-item/nav-item.yaml +1 -1
- package/components/textarea/textarea.js +10 -0
- package/core/icons.js +13 -1
- package/package.json +1 -1
- package/styles/components.css +1 -0
- package/styles/typography.css +1 -1
- package/traits/_catalog.json +258 -5
- package/traits/active-state.test.js +1 -1
- package/traits/anchor-positioning.js +205 -52
- package/traits/anchor-positioning.test.js +77 -4
- package/traits/announcer-stage.js +157 -0
- package/traits/announcer.js +145 -0
- package/traits/announcer.test.js +268 -0
- package/traits/arrow-grid-nav.js +234 -0
- package/traits/arrow-grid-nav.test.js +375 -0
- package/traits/attention-pulse.js +1 -1
- package/traits/attention-pulse.test.js +1 -1
- package/traits/confetti-burst.js +90 -60
- package/traits/confetti-burst.test.js +16 -8
- package/traits/confetti-stage.js +143 -0
- package/traits/confetti.js +44 -47
- package/traits/confetti.test.js +24 -5
- package/traits/count-up.js +31 -6
- package/traits/count-up.test.js +1 -1
- package/traits/declarative.test.js +1 -1
- package/traits/dirty-state.test.js +1 -1
- package/traits/drag-ghost.js +55 -3
- package/traits/drag-ghost.test.js +1 -1
- package/traits/draggable-list-item.js +279 -0
- package/traits/draggable-list-item.test.js +51 -0
- package/traits/draggable.js +14 -4
- package/traits/draggable.test.js +1 -1
- package/traits/drop-target.js +223 -0
- package/traits/drop-target.test.js +241 -0
- package/traits/droppable-collection.js +89 -0
- package/traits/droppable-collection.test.js +99 -0
- package/traits/droppable.js +125 -0
- package/traits/droppable.test.js +54 -0
- package/traits/error-shake.js +157 -0
- package/traits/error-shake.test.js +114 -0
- package/traits/fade-presence.test.js +1 -1
- package/traits/focus-restore.js +135 -0
- package/traits/focus-restore.test.js +202 -0
- package/traits/focus-trap.test.js +1 -1
- package/traits/focusable.test.js +1 -1
- package/traits/glow-focus.js +1 -1
- package/traits/glow-focus.test.js +1 -1
- package/traits/gradient-shift.js +1 -1
- package/traits/gradient-shift.test.js +1 -1
- package/traits/haptic-feedback.test.js +1 -1
- package/traits/hotkey.test.js +1 -1
- package/traits/hoverable.test.js +1 -1
- package/traits/index.js +15 -0
- package/traits/inertia-drag.js +9 -0
- package/traits/inertia-drag.test.js +1 -1
- package/traits/input-mask.js +328 -0
- package/traits/input-mask.test.js +151 -0
- package/traits/intersection-observer.test.js +1 -1
- package/traits/keyboard-nav.test.js +1 -1
- package/traits/keyboard-reorderable.js +254 -0
- package/traits/keyboard-reorderable.test.js +45 -0
- package/traits/layout-animation.js +229 -0
- package/traits/layout-animation.test.js +114 -0
- package/traits/long-press.js +212 -0
- package/traits/long-press.test.js +244 -0
- package/traits/magnetic-hover.js +1 -1
- package/traits/magnetic-hover.test.js +1 -1
- package/traits/noise-texture.js +7 -3
- package/traits/noise-texture.test.js +1 -1
- package/traits/parallax.js +1 -1
- package/traits/parallax.test.js +1 -1
- package/traits/portal.test.js +1 -1
- package/traits/pressable.test.js +1 -1
- package/traits/resettable.js +29 -3
- package/traits/resettable.test.js +34 -1
- package/traits/resizable.test.js +1 -1
- package/traits/resize-observer.test.js +1 -1
- package/traits/ripple.js +1 -1
- package/traits/ripple.test.js +1 -1
- package/traits/roving-tabindex.test.js +1 -1
- package/traits/scale-press.test.js +1 -1
- package/traits/scroll-lock.test.js +1 -1
- package/traits/scroll-progress.js +201 -0
- package/traits/scroll-progress.test.js +182 -0
- package/traits/shimmer-loading.js +1 -1
- package/traits/shimmer-loading.test.js +1 -1
- package/traits/{_smoke.test.js → smoke.test.js} +1 -1
- package/traits/snap-to-grid.test.js +1 -1
- package/traits/sound-feedback.test.js +1 -1
- package/traits/spring-animate.js +8 -3
- package/traits/spring-animate.test.js +1 -1
- package/traits/success-checkmark.js +222 -0
- package/traits/success-checkmark.test.js +120 -0
- package/traits/tilt-hover.js +1 -1
- package/traits/tilt-hover.test.js +1 -1
- package/traits/tossable.js +9 -0
- package/traits/tossable.test.js +1 -1
- package/traits/traits-host.test.js +1 -1
- package/traits/typeahead.test.js +1 -1
- package/traits/typewriter.js +1 -1
- package/traits/typewriter.test.js +1 -1
- package/traits/validation.test.js +1 -1
- package/traits/view-transition.js +140 -0
- package/traits/view-transition.test.js +268 -0
- /package/traits/{_motion.js → motion.js} +0 -0
- /package/traits/{_test-helpers.js → test-helpers.js} +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Edit this file; run `node scripts/build/components.mjs` to regenerate a2ui.json.
|
|
2
|
+
$schema: ../../../../scripts/schemas/component.yaml.schema.json
|
|
3
|
+
name: UIDemoToggle
|
|
4
|
+
tag: demo-toggle-ui
|
|
5
|
+
component: DemoToggle
|
|
6
|
+
category: container
|
|
7
|
+
version: 1
|
|
8
|
+
description: >-
|
|
9
|
+
Side-by-side comparison primitive — header bar with a switch + two child
|
|
10
|
+
slots ("on" / "off"); toggling the switch swaps which slot is visible.
|
|
11
|
+
Used on trait detail pages to show "with trait" vs "without trait" on
|
|
12
|
+
the same chrome. data-mode="overlay" stacks the slots on the same
|
|
13
|
+
coordinates so layout never shifts.
|
|
14
|
+
props:
|
|
15
|
+
labelOn:
|
|
16
|
+
description: Header label rendered when state is "on".
|
|
17
|
+
type: string
|
|
18
|
+
default: "On"
|
|
19
|
+
attribute: label-on
|
|
20
|
+
reflect: true
|
|
21
|
+
labelOff:
|
|
22
|
+
description: Header label rendered when state is "off".
|
|
23
|
+
type: string
|
|
24
|
+
default: "Off"
|
|
25
|
+
attribute: label-off
|
|
26
|
+
reflect: true
|
|
27
|
+
initial:
|
|
28
|
+
description: Initial state when [state] is not set on connect ("on" | "off").
|
|
29
|
+
type: string
|
|
30
|
+
default: "off"
|
|
31
|
+
enum:
|
|
32
|
+
- "on"
|
|
33
|
+
- "off"
|
|
34
|
+
reflect: true
|
|
35
|
+
state:
|
|
36
|
+
description: Current toggle state ("on" | "off"). Reflected as data-state on the host.
|
|
37
|
+
type: string
|
|
38
|
+
default: ""
|
|
39
|
+
enum:
|
|
40
|
+
- ""
|
|
41
|
+
- "on"
|
|
42
|
+
- "off"
|
|
43
|
+
reflect: true
|
|
44
|
+
events:
|
|
45
|
+
change:
|
|
46
|
+
description: Fired when the toggle flips. detail contains { state }.
|
|
47
|
+
slots:
|
|
48
|
+
bar:
|
|
49
|
+
description: Internal header bar (auto-stamped). Hosts the embedded switch + label.
|
|
50
|
+
"on":
|
|
51
|
+
description: Surface rendered when state is "on" (the "with trait" variant).
|
|
52
|
+
"off":
|
|
53
|
+
description: Surface rendered when state is "off" (the "without trait" variant).
|
|
54
|
+
states:
|
|
55
|
+
- name: idle
|
|
56
|
+
description: Default, ready for interaction.
|
|
57
|
+
- name: on
|
|
58
|
+
description: On slot is active; bar leans accent.
|
|
59
|
+
attribute: data-state
|
|
60
|
+
- name: off
|
|
61
|
+
description: Off slot is active; bar is neutral.
|
|
62
|
+
attribute: data-state
|
|
63
|
+
traits: []
|
|
64
|
+
tokens:
|
|
65
|
+
--demo-toggle-radius:
|
|
66
|
+
description: Outer border-radius
|
|
67
|
+
--demo-toggle-bg:
|
|
68
|
+
description: Stage background
|
|
69
|
+
--demo-toggle-border:
|
|
70
|
+
description: Border color
|
|
71
|
+
--demo-toggle-bar-bg:
|
|
72
|
+
description: Header bar background (accent when state=on)
|
|
73
|
+
--demo-toggle-bar-fg:
|
|
74
|
+
description: Header bar foreground
|
|
75
|
+
--demo-toggle-stage-padding:
|
|
76
|
+
description: Inner padding around each slot
|
|
77
|
+
a2ui:
|
|
78
|
+
rules: []
|
|
79
|
+
anti_patterns: []
|
|
80
|
+
examples:
|
|
81
|
+
- name: with-without-trait
|
|
82
|
+
description: Compare a trait-bearing surface against the bare control on the same chrome.
|
|
83
|
+
a2ui: >-
|
|
84
|
+
[
|
|
85
|
+
{
|
|
86
|
+
"id": "root",
|
|
87
|
+
"component": "DemoToggle",
|
|
88
|
+
"labelOn": "With shimmer-loading",
|
|
89
|
+
"labelOff": "Without shimmer-loading",
|
|
90
|
+
"initial": "off",
|
|
91
|
+
"children": ["off", "on"]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "off",
|
|
95
|
+
"component": "Card",
|
|
96
|
+
"slot": "off",
|
|
97
|
+
"children": ["off-section"]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "off-section",
|
|
101
|
+
"component": "Section",
|
|
102
|
+
"children": ["off-text"]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "off-text",
|
|
106
|
+
"component": "Text",
|
|
107
|
+
"textContent": "Bare surface — no trait attached."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "on",
|
|
111
|
+
"component": "Card",
|
|
112
|
+
"slot": "on",
|
|
113
|
+
"children": ["on-section"]
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "on-section",
|
|
117
|
+
"component": "Section",
|
|
118
|
+
"children": ["on-text"]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "on-text",
|
|
122
|
+
"component": "Text",
|
|
123
|
+
"textContent": "Same surface, with trait attached."
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
keywords:
|
|
127
|
+
- demo
|
|
128
|
+
- toggle
|
|
129
|
+
- compare
|
|
130
|
+
- comparison
|
|
131
|
+
- trait
|
|
132
|
+
- before-after
|
|
133
|
+
- a-b
|
|
134
|
+
- switch
|
|
135
|
+
synonyms:
|
|
136
|
+
compare:
|
|
137
|
+
- demo-toggle
|
|
138
|
+
- segmented
|
|
139
|
+
switch:
|
|
140
|
+
- demo-toggle
|
|
141
|
+
- toggle-group
|
|
142
|
+
related:
|
|
143
|
+
- Switch
|
|
144
|
+
- Card
|
package/components/index.js
CHANGED
|
@@ -85,6 +85,7 @@ export { UIEmbed } from './embed/embed.js';
|
|
|
85
85
|
export { UIBlock } from './block/block.js';
|
|
86
86
|
export { UIText } from './text/text.js';
|
|
87
87
|
export { UIToggleGroup, UIToggleOption } from './toggle-group/toggle-group.js';
|
|
88
|
+
export { UIDemoToggle } from './demo-toggle/demo-toggle.js';
|
|
88
89
|
export { UIRichText } from './richtext/richtext.js';
|
|
89
90
|
export { UIStream } from './stream/stream.js';
|
|
90
91
|
export { UICanvas } from './canvas/canvas.js';
|
|
@@ -120,10 +120,14 @@ class UIInput extends UIFormElement {
|
|
|
120
120
|
render() {
|
|
121
121
|
if (!this.#textEl) return;
|
|
122
122
|
|
|
123
|
+
const text = this.value || '';
|
|
124
|
+
|
|
123
125
|
if (this.#isNativeInput) {
|
|
124
126
|
this.#textEl.placeholder = this.placeholder;
|
|
125
127
|
this.#textEl.disabled = this.disabled;
|
|
126
128
|
this.#textEl.readOnly = this.readonly;
|
|
129
|
+
// Sync programmatic value writes (form.reset(), trait assignments).
|
|
130
|
+
if (this.#textEl.value !== text) this.#textEl.value = text;
|
|
127
131
|
} else {
|
|
128
132
|
this.#textEl.setAttribute('data-placeholder', this.placeholder);
|
|
129
133
|
if (this.disabled || this.readonly) {
|
|
@@ -131,6 +135,13 @@ class UIInput extends UIFormElement {
|
|
|
131
135
|
} else {
|
|
132
136
|
this.#textEl.contentEditable = 'plaintext-only';
|
|
133
137
|
}
|
|
138
|
+
// Sync programmatic value writes into the contenteditable surface.
|
|
139
|
+
// Skip when already in sync to avoid clobbering an in-flight edit's
|
|
140
|
+
// caret position.
|
|
141
|
+
if (this.#textEl.textContent !== text) {
|
|
142
|
+
this.#textEl.textContent = text;
|
|
143
|
+
this.#textEl.toggleAttribute('data-empty', !text);
|
|
144
|
+
}
|
|
134
145
|
}
|
|
135
146
|
|
|
136
147
|
if (this.#labelEl) this.#labelEl.textContent = this.label || '';
|
package/components/list/list.css
CHANGED
|
@@ -92,20 +92,83 @@
|
|
|
92
92
|
@scope (list-item-ui) {
|
|
93
93
|
:where(:scope) {
|
|
94
94
|
/* ── Layout ── */
|
|
95
|
-
--list-item-inset:
|
|
95
|
+
--list-item-inset: var(--a-inset);
|
|
96
|
+
--list-item-gap-column: var(--a-space-3);
|
|
97
|
+
--list-item-gap-row: var(--a-space-1);
|
|
96
98
|
|
|
97
99
|
/* ── Colors ── */
|
|
98
100
|
--list-item-text-color: var(--a-fg);
|
|
101
|
+
--list-item-desc-color: var(--a-fg-muted);
|
|
102
|
+
--list-item-icon-color: var(--a-fg-muted);
|
|
99
103
|
|
|
100
104
|
/* ── Typography ── */
|
|
101
|
-
--list-item-font-size:
|
|
105
|
+
--list-item-font-size: var(--a-ui-size);
|
|
106
|
+
--list-item-desc-font-size: var(--a-ui-sm);
|
|
102
107
|
}
|
|
103
108
|
|
|
109
|
+
/* Anatomy:
|
|
110
|
+
col 1 = icon (auto width; collapses to 0 when no icon)
|
|
111
|
+
col 2 = content stack (text on row 1, description on row 2)
|
|
112
|
+
The icon spans both rows + centers vertically with the stack.
|
|
113
|
+
`[slot="content"]` (used when consumer provides custom rendering)
|
|
114
|
+
spans all columns. */
|
|
104
115
|
:scope {
|
|
105
116
|
box-sizing: border-box;
|
|
106
|
-
display:
|
|
117
|
+
display: grid;
|
|
118
|
+
grid-template-columns: auto 1fr;
|
|
119
|
+
column-gap: var(--list-item-gap-column);
|
|
120
|
+
row-gap: var(--list-item-gap-row);
|
|
107
121
|
font-size: var(--list-item-font-size);
|
|
108
122
|
color: var(--list-item-text-color);
|
|
109
123
|
line-height: 1.4;
|
|
124
|
+
/* Defensive floor: empty list-item-ui (no text/icon/children) collapses
|
|
125
|
+
to 0 height and disappears. Keep a visible row instead. */
|
|
126
|
+
min-height: var(--a-space-6);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
:scope > [slot="icon"] {
|
|
130
|
+
grid-column: 1;
|
|
131
|
+
grid-row: 1 / -1;
|
|
132
|
+
align-self: center;
|
|
133
|
+
color: var(--list-item-icon-color);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
:scope > [slot="text"] {
|
|
137
|
+
grid-column: 2;
|
|
138
|
+
grid-row: 1;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
:scope > [slot="description"] {
|
|
142
|
+
grid-column: 2;
|
|
143
|
+
grid-row: 2;
|
|
144
|
+
color: var(--list-item-desc-color);
|
|
145
|
+
font-size: var(--list-item-desc-font-size);
|
|
146
|
+
line-height: 1.3;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Custom-content escape hatch — consumer authored a [slot="content"]
|
|
150
|
+
child, the auto-stamp early-returned, and the consumer owns the
|
|
151
|
+
full body. Span all columns so the consumer's layout isn't boxed
|
|
152
|
+
into the content column. */
|
|
153
|
+
:scope > [slot="content"] {
|
|
154
|
+
grid-column: 1 / -1;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* ── Active state ──
|
|
158
|
+
`[data-active]` is the consumer-driven "current item" hook used by
|
|
159
|
+
keyboard-nav-style demos and any host that owns its own active-index
|
|
160
|
+
model (separate from list-ui[selectable] / aria-selected). Reuses
|
|
161
|
+
the accent-muted/accent-strong pair so the two mechanisms paint
|
|
162
|
+
consistently. No border-radius on the row itself — dividers (when
|
|
163
|
+
present) span full-width and rounded corners would clash. */
|
|
164
|
+
:scope[data-active] {
|
|
165
|
+
background: var(--a-accent-muted);
|
|
166
|
+
color: var(--a-accent-strong);
|
|
167
|
+
box-shadow: inset 2px 0 0 var(--a-accent-strong);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
:scope[data-active] > [slot="icon"],
|
|
171
|
+
:scope[data-active] > [slot="description"] {
|
|
172
|
+
color: var(--a-accent-strong);
|
|
110
173
|
}
|
|
111
174
|
}
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"default": ""
|
|
43
43
|
},
|
|
44
44
|
"variant": {
|
|
45
|
-
"description": "Visual treatment. Default ('') renders as a primary-rail group (icon row, caret, collapsible). 'section' renders the header as a static kicker label with always-visible children
|
|
45
|
+
"description": "Visual treatment. Default ('') renders as a primary-rail group (icon row, caret, collapsible). 'section' renders the header as a static kicker label with always-visible children. When the parent <nav-ui> carries variant=\"section\", this group inherits it via CSS cascade unless an explicit variant is set on the group.",
|
|
46
46
|
"type": "string",
|
|
47
47
|
"enum": [
|
|
48
48
|
"",
|
|
@@ -264,11 +264,11 @@ nav-group-ui [slot="popover"] [role="option"][aria-selected="true"]::before {
|
|
|
264
264
|
}
|
|
265
265
|
|
|
266
266
|
/* ── Section variant — groups render as kicker labels ──
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
267
|
+
Primary variant defaults to collapsible:true (caret-toggleable).
|
|
268
|
+
Section variant flips to collapsible:false-shape — header is a
|
|
269
|
+
static kicker label, children always visible — so subnav rails
|
|
270
|
+
show their full structure without requiring an explicit [open]
|
|
271
|
+
toggle.
|
|
272
272
|
|
|
273
273
|
Two ways to enable: either
|
|
274
274
|
(a) `<nav-group-ui variant="section">` directly, or
|
|
@@ -39,7 +39,7 @@ props:
|
|
|
39
39
|
type: string
|
|
40
40
|
default: ''
|
|
41
41
|
enum: ['', section]
|
|
42
|
-
description: "Visual treatment. Default ('') renders as a primary-rail group (icon row, caret, collapsible). 'section' renders the header as a static kicker label with always-visible children
|
|
42
|
+
description: "Visual treatment. Default ('') renders as a primary-rail group (icon row, caret, collapsible). 'section' renders the header as a static kicker label with always-visible children. When the parent <nav-ui> carries variant=\"section\", this group inherits it via CSS cascade unless an explicit variant is set on the group."
|
|
43
43
|
|
|
44
44
|
events:
|
|
45
45
|
group-toggle:
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"default": ""
|
|
48
48
|
},
|
|
49
49
|
"variant": {
|
|
50
|
-
"description": "Visual treatment. Default ('') renders as a primary-rail item (reserved icon space, in-icon selected accent). 'section' renders flat — no icon space when absent, left-edge accent bar for selected
|
|
50
|
+
"description": "Visual treatment. Default ('') renders as a primary-rail item (reserved icon space, in-icon selected accent). 'section' renders flat — no icon space when absent, left-edge accent bar for selected. When the parent <nav-ui> carries variant=\"section\", this item inherits it via CSS cascade unless an explicit variant is set.",
|
|
51
51
|
"type": "string",
|
|
52
52
|
"enum": [
|
|
53
53
|
"",
|
|
@@ -162,10 +162,9 @@ nav-item-ui[selected] [slot="icon"]:empty::before {
|
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
/* ── Section variant — items render flat (no icon space, no indent) ──
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
row with a hidden icon slot.
|
|
165
|
+
Section-variant rails read as plain links rather than primary-style
|
|
166
|
+
rows: no reserved icon space when absent, left-edge accent bar for
|
|
167
|
+
the selected state instead of an in-icon accent.
|
|
169
168
|
|
|
170
169
|
Two ways to enable: either
|
|
171
170
|
(a) `<nav-item-ui variant="section">` directly, or
|
|
@@ -43,7 +43,7 @@ props:
|
|
|
43
43
|
type: string
|
|
44
44
|
default: ''
|
|
45
45
|
enum: ['', section]
|
|
46
|
-
description: "Visual treatment. Default ('') renders as a primary-rail item (reserved icon space, in-icon selected accent). 'section' renders flat — no icon space when absent, left-edge accent bar for selected
|
|
46
|
+
description: "Visual treatment. Default ('') renders as a primary-rail item (reserved icon space, in-icon selected accent). 'section' renders flat — no icon space when absent, left-edge accent bar for selected. When the parent <nav-ui> carries variant=\"section\", this item inherits it via CSS cascade unless an explicit variant is set."
|
|
47
47
|
|
|
48
48
|
events:
|
|
49
49
|
nav-select:
|
|
@@ -55,6 +55,16 @@ class UITextarea extends UIFormElement {
|
|
|
55
55
|
this.#textEl.contentEditable = 'plaintext-only';
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// Sync programmatic `value` assignments (form.reset(), trait writes,
|
|
59
|
+
// controlled-input patterns) into the contenteditable surface. Skip
|
|
60
|
+
// when the surface already matches to avoid clobbering an in-flight
|
|
61
|
+
// edit's caret.
|
|
62
|
+
const text = this.value || '';
|
|
63
|
+
if (this.#textEl.textContent !== text) {
|
|
64
|
+
this.#textEl.textContent = text;
|
|
65
|
+
this.#textEl.toggleAttribute('data-empty', !text);
|
|
66
|
+
}
|
|
67
|
+
|
|
58
68
|
const label = this.querySelector('[slot="label"]');
|
|
59
69
|
if (label && this.label) label.setAttribute('label', this.label);
|
|
60
70
|
|
package/core/icons.js
CHANGED
|
@@ -212,7 +212,18 @@ const ICON_ALIASES = {
|
|
|
212
212
|
'phone': 'phone', 'location': 'map-pin', 'calendar': 'calendar-blank',
|
|
213
213
|
'time': 'clock', 'user': 'user', 'users': 'users-three',
|
|
214
214
|
'menu': 'list', 'more': 'dots-three', 'dots-vertical': 'dots-three-vertical', 'filter': 'funnel',
|
|
215
|
-
'inbox': 'tray',
|
|
215
|
+
'inbox': 'tray',
|
|
216
|
+
'text-bold': 'text-b', 'bold': 'text-b', 'italic': 'text-italic', 'underline': 'text-underline',
|
|
217
|
+
'reset': 'arrow-counter-clockwise', 'undo': 'arrow-counter-clockwise', 'redo': 'arrow-clockwise',
|
|
218
|
+
'success-checkmark': 'seal-check', 'circuit': 'circuitry',
|
|
219
|
+
'contrast': 'circle-half', 'theme': 'circle-half', 'dark-mode': 'moon', 'light-mode': 'sun',
|
|
220
|
+
'alert-triangle': 'warning', 'alert-octagon': 'warning-octagon', 'alert-diamond': 'warning-diamond',
|
|
221
|
+
'number': 'hash', 'numbered-list': 'list-numbers', 'numeric': 'hash',
|
|
222
|
+
// Phosphor uses suffix-circle for these, but consumers reach for the
|
|
223
|
+
// prefix form ("circle-warning") just as often. Resolve both shapes.
|
|
224
|
+
'circle-warning': 'warning-circle', 'circle-x': 'x-circle',
|
|
225
|
+
'circle-check': 'check-circle', 'circle-info': 'info',
|
|
226
|
+
'circle-question': 'question', 'circle-plus': 'plus-circle', 'circle-minus': 'minus-circle',
|
|
216
227
|
'sort': 'sort-ascending', 'refresh': 'arrow-clockwise', 'download': 'download-simple',
|
|
217
228
|
'upload': 'upload-simple', 'share': 'share-network', 'copy': 'copy-simple',
|
|
218
229
|
'link': 'link-simple', 'external-link': 'arrow-square-out',
|
|
@@ -224,6 +235,7 @@ const ICON_ALIASES = {
|
|
|
224
235
|
'attachment': 'paperclip', 'attach': 'paperclip',
|
|
225
236
|
'expand': 'arrows-out', 'collapse': 'arrows-in',
|
|
226
237
|
'fullscreen': 'arrows-out', 'exit-fullscreen': 'arrows-in',
|
|
238
|
+
'fade': 'gradient', 'fade-presence': 'gradient',
|
|
227
239
|
'notification': 'bell', 'notifications': 'bell',
|
|
228
240
|
'bookmark': 'bookmark-simple', 'favorite': 'heart', 'like': 'heart',
|
|
229
241
|
'comment': 'chat-circle', 'chat': 'chat-circle',
|
package/package.json
CHANGED
package/styles/components.css
CHANGED
|
@@ -83,6 +83,7 @@
|
|
|
83
83
|
@import "../components/block/block.css";
|
|
84
84
|
@import "../components/text/text.css";
|
|
85
85
|
@import "../components/toggle-group/toggle-group.css";
|
|
86
|
+
@import "../components/demo-toggle/demo-toggle.css";
|
|
86
87
|
@import "../components/richtext/richtext.css";
|
|
87
88
|
@import "../components/stream/stream.css";
|
|
88
89
|
@import "../components/canvas/canvas.css";
|
package/styles/typography.css
CHANGED
|
@@ -256,7 +256,7 @@
|
|
|
256
256
|
|
|
257
257
|
/* section — h2/h3, major division within content */
|
|
258
258
|
--a-section-family: var(--a-font-family-heading);
|
|
259
|
-
--a-section-weight: var(--a-weight-
|
|
259
|
+
--a-section-weight: var(--a-weight-normal);
|
|
260
260
|
--a-section-sm: 16px;
|
|
261
261
|
--a-section-md: 17px;
|
|
262
262
|
--a-section-lg: 19px;
|