@adia-ai/web-components 0.5.3 → 0.5.5
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/accordion/accordion-item.a2ui.json +50 -0
- package/components/accordion/accordion-item.yaml +27 -0
- package/components/action-list/action-item.a2ui.json +63 -0
- package/components/action-list/action-item.yaml +37 -0
- package/components/avatar/avatar-group.a2ui.json +50 -0
- package/components/avatar/avatar-group.yaml +26 -0
- package/components/avatar/avatar.a2ui.json +4 -1
- package/components/avatar/avatar.yaml +7 -0
- package/components/button/class.js +39 -0
- package/components/calendar-picker/class.js +1 -0
- package/components/chart/chart.a2ui.json +4 -2
- package/components/chat-thread/chat-input.a2ui.json +158 -0
- package/components/chat-thread/chat-input.yaml +251 -0
- package/components/check/class.js +1 -0
- package/components/feed/feed-item.a2ui.json +86 -0
- package/components/list/list-item.a2ui.json +53 -0
- package/components/list/list-item.yaml +29 -0
- package/components/radio/class.js +1 -0
- package/components/select/class.js +15 -0
- package/components/select/select.a2ui.json +5 -0
- package/components/select/select.css +10 -0
- package/components/select/select.yaml +5 -0
- package/components/slider/class.js +58 -0
- package/components/slider/slider.a2ui.json +10 -0
- package/components/slider/slider.css +13 -0
- package/components/slider/slider.yaml +10 -0
- package/components/switch/class.js +19 -4
- package/components/switch/switch.css +10 -0
- package/components/tabs/tab.a2ui.json +58 -0
- package/components/tabs/tab.yaml +33 -0
- package/components/textarea/class.js +1 -0
- package/components/timeline/timeline-item.a2ui.json +76 -0
- package/components/timeline/timeline-item.yaml +47 -0
- package/components/tree/class.js +91 -0
- package/components/tree/tree-item.a2ui.json +65 -0
- package/components/tree/tree-item.yaml +41 -0
- package/components/tree/tree.a2ui.json +15 -0
- package/components/tree/tree.css +18 -0
- package/components/tree/tree.yaml +10 -0
- package/components/upload/class.js +1 -0
- package/core/icons.d.ts +148 -0
- package/core/template.js +21 -3
- package/package.json +2 -2
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://adiaui.dev/a2ui/v0_9/components/AccordionItem.json",
|
|
4
|
+
"title": "AccordionItem",
|
|
5
|
+
"description": "Child of <accordion-ui>. One collapsible section with header + body. Use inside <accordion-ui> only.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "common_types.json#/$defs/ComponentCommon"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "common_types.json#/$defs/CatalogComponentCommon"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"component": {
|
|
17
|
+
"const": "AccordionItem"
|
|
18
|
+
},
|
|
19
|
+
"open": {
|
|
20
|
+
"description": "Whether the section is expanded.",
|
|
21
|
+
"type": "boolean",
|
|
22
|
+
"default": false
|
|
23
|
+
},
|
|
24
|
+
"text": {
|
|
25
|
+
"description": "Header text — the clickable label that toggles the section.",
|
|
26
|
+
"type": "string"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"required": [
|
|
30
|
+
"component"
|
|
31
|
+
],
|
|
32
|
+
"unevaluatedProperties": false,
|
|
33
|
+
"x-adiaui": {
|
|
34
|
+
"anti_patterns": [],
|
|
35
|
+
"category": "layout",
|
|
36
|
+
"composes": [],
|
|
37
|
+
"events": {},
|
|
38
|
+
"examples": [],
|
|
39
|
+
"keywords": [],
|
|
40
|
+
"name": "UIAccordionItem",
|
|
41
|
+
"related": [],
|
|
42
|
+
"slots": {},
|
|
43
|
+
"states": [],
|
|
44
|
+
"synonyms": {},
|
|
45
|
+
"tag": "accordion-item-ui",
|
|
46
|
+
"tokens": {},
|
|
47
|
+
"traits": [],
|
|
48
|
+
"version": 1
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Edit this file; run `npm run build:components` to regenerate a2ui.json.
|
|
2
|
+
#
|
|
3
|
+
# §176 (v0.5.5): authored to close the §175 baseline-orphan class. The
|
|
4
|
+
# component already existed as a sibling class in the parent's class.js
|
|
5
|
+
# + was registered alongside the parent (e.g. UIList + UIListItem both
|
|
6
|
+
# from list/class.js). The catalog just lacked its own entry. With the
|
|
7
|
+
# §172 sibling-yaml scanner, this file gets picked up next to the parent
|
|
8
|
+
# yaml.
|
|
9
|
+
|
|
10
|
+
# Child component of <accordion-ui>. Surface only inside that parent.
|
|
11
|
+
$schema: ../../../../scripts/schemas/component.yaml.schema.json
|
|
12
|
+
name: UIAccordionItem
|
|
13
|
+
tag: accordion-item-ui
|
|
14
|
+
component: AccordionItem
|
|
15
|
+
category: layout
|
|
16
|
+
version: 1
|
|
17
|
+
description: |-
|
|
18
|
+
Child of <accordion-ui>. One collapsible section with header + body. Use inside <accordion-ui> only.
|
|
19
|
+
|
|
20
|
+
props:
|
|
21
|
+
text:
|
|
22
|
+
description: Header text — the clickable label that toggles the section.
|
|
23
|
+
type: string
|
|
24
|
+
open:
|
|
25
|
+
description: Whether the section is expanded.
|
|
26
|
+
type: boolean
|
|
27
|
+
default: false
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://adiaui.dev/a2ui/v0_9/components/ActionItem.json",
|
|
4
|
+
"title": "ActionItem",
|
|
5
|
+
"description": "Child of <action-list-ui>. One actionable row — icon + label, forwards activation to the parent action-list.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "common_types.json#/$defs/ComponentCommon"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "common_types.json#/$defs/CatalogComponentCommon"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"component": {
|
|
17
|
+
"const": "ActionItem"
|
|
18
|
+
},
|
|
19
|
+
"disabled": {
|
|
20
|
+
"description": "Disables click + keyboard activation; aria-disabled is set.",
|
|
21
|
+
"type": "boolean",
|
|
22
|
+
"default": false
|
|
23
|
+
},
|
|
24
|
+
"icon": {
|
|
25
|
+
"description": "Leading icon name (Phosphor).",
|
|
26
|
+
"type": "string"
|
|
27
|
+
},
|
|
28
|
+
"text": {
|
|
29
|
+
"description": "Action label.",
|
|
30
|
+
"type": "string"
|
|
31
|
+
},
|
|
32
|
+
"value": {
|
|
33
|
+
"description": "Identifier passed to the action-list change/activate handlers.",
|
|
34
|
+
"type": "string"
|
|
35
|
+
},
|
|
36
|
+
"variant": {
|
|
37
|
+
"description": "Visual variant (default | accent | danger).",
|
|
38
|
+
"type": "string",
|
|
39
|
+
"default": "default"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"required": [
|
|
43
|
+
"component"
|
|
44
|
+
],
|
|
45
|
+
"unevaluatedProperties": false,
|
|
46
|
+
"x-adiaui": {
|
|
47
|
+
"anti_patterns": [],
|
|
48
|
+
"category": "navigation",
|
|
49
|
+
"composes": [],
|
|
50
|
+
"events": {},
|
|
51
|
+
"examples": [],
|
|
52
|
+
"keywords": [],
|
|
53
|
+
"name": "UIActionItem",
|
|
54
|
+
"related": [],
|
|
55
|
+
"slots": {},
|
|
56
|
+
"states": [],
|
|
57
|
+
"synonyms": {},
|
|
58
|
+
"tag": "action-item-ui",
|
|
59
|
+
"tokens": {},
|
|
60
|
+
"traits": [],
|
|
61
|
+
"version": 1
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Edit this file; run `npm run build:components` to regenerate a2ui.json.
|
|
2
|
+
#
|
|
3
|
+
# §176 (v0.5.5): authored to close the §175 baseline-orphan class. The
|
|
4
|
+
# component already existed as a sibling class in the parent's class.js
|
|
5
|
+
# + was registered alongside the parent (e.g. UIList + UIListItem both
|
|
6
|
+
# from list/class.js). The catalog just lacked its own entry. With the
|
|
7
|
+
# §172 sibling-yaml scanner, this file gets picked up next to the parent
|
|
8
|
+
# yaml.
|
|
9
|
+
|
|
10
|
+
# Child component of <action-list-ui>. Surface only inside that parent.
|
|
11
|
+
$schema: ../../../../scripts/schemas/component.yaml.schema.json
|
|
12
|
+
name: UIActionItem
|
|
13
|
+
tag: action-item-ui
|
|
14
|
+
component: ActionItem
|
|
15
|
+
category: navigation
|
|
16
|
+
version: 1
|
|
17
|
+
description: |-
|
|
18
|
+
Child of <action-list-ui>. One actionable row — icon + label, forwards activation to the parent action-list.
|
|
19
|
+
|
|
20
|
+
props:
|
|
21
|
+
icon:
|
|
22
|
+
description: Leading icon name (Phosphor).
|
|
23
|
+
type: string
|
|
24
|
+
text:
|
|
25
|
+
description: Action label.
|
|
26
|
+
type: string
|
|
27
|
+
value:
|
|
28
|
+
description: Identifier passed to the action-list change/activate handlers.
|
|
29
|
+
type: string
|
|
30
|
+
variant:
|
|
31
|
+
description: Visual variant (default | accent | danger).
|
|
32
|
+
type: string
|
|
33
|
+
default: 'default'
|
|
34
|
+
disabled:
|
|
35
|
+
description: Disables click + keyboard activation; aria-disabled is set.
|
|
36
|
+
type: boolean
|
|
37
|
+
default: false
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://adiaui.dev/a2ui/v0_9/components/AvatarGroup.json",
|
|
4
|
+
"title": "AvatarGroup",
|
|
5
|
+
"description": "Cluster of overlapping <avatar-ui> children. Stacks the first `max` avatars with a negative inline-start margin; if more children are present, renders a +N overflow indicator.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "common_types.json#/$defs/ComponentCommon"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "common_types.json#/$defs/CatalogComponentCommon"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"component": {
|
|
17
|
+
"const": "AvatarGroup"
|
|
18
|
+
},
|
|
19
|
+
"max": {
|
|
20
|
+
"description": "Maximum avatars to show before the +N overflow indicator.",
|
|
21
|
+
"type": "number",
|
|
22
|
+
"default": 5
|
|
23
|
+
},
|
|
24
|
+
"size": {
|
|
25
|
+
"description": "Forwards to each child <avatar-ui> (xs|sm|md|lg|xl). Empty uses the per-avatar size.",
|
|
26
|
+
"type": "string"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"required": [
|
|
30
|
+
"component"
|
|
31
|
+
],
|
|
32
|
+
"unevaluatedProperties": false,
|
|
33
|
+
"x-adiaui": {
|
|
34
|
+
"anti_patterns": [],
|
|
35
|
+
"category": "feedback",
|
|
36
|
+
"composes": [],
|
|
37
|
+
"events": {},
|
|
38
|
+
"examples": [],
|
|
39
|
+
"keywords": [],
|
|
40
|
+
"name": "UIAvatarGroup",
|
|
41
|
+
"related": [],
|
|
42
|
+
"slots": {},
|
|
43
|
+
"states": [],
|
|
44
|
+
"synonyms": {},
|
|
45
|
+
"tag": "avatar-group-ui",
|
|
46
|
+
"tokens": {},
|
|
47
|
+
"traits": [],
|
|
48
|
+
"version": 1
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Edit this file; run `npm run build:components` to regenerate a2ui.json.
|
|
2
|
+
#
|
|
3
|
+
# §176 (v0.5.5): authored to close the §175 baseline-orphan class. The
|
|
4
|
+
# component already existed as a sibling class in the parent's class.js
|
|
5
|
+
# + was registered alongside the parent (e.g. UIList + UIListItem both
|
|
6
|
+
# from list/class.js). The catalog just lacked its own entry. With the
|
|
7
|
+
# §172 sibling-yaml scanner, this file gets picked up next to the parent
|
|
8
|
+
# yaml.
|
|
9
|
+
|
|
10
|
+
$schema: ../../../../scripts/schemas/component.yaml.schema.json
|
|
11
|
+
name: UIAvatarGroup
|
|
12
|
+
tag: avatar-group-ui
|
|
13
|
+
component: AvatarGroup
|
|
14
|
+
category: feedback
|
|
15
|
+
version: 1
|
|
16
|
+
description: |-
|
|
17
|
+
Cluster of overlapping <avatar-ui> children. Stacks the first `max` avatars with a negative inline-start margin; if more children are present, renders a +N overflow indicator.
|
|
18
|
+
|
|
19
|
+
props:
|
|
20
|
+
max:
|
|
21
|
+
description: Maximum avatars to show before the +N overflow indicator.
|
|
22
|
+
type: number
|
|
23
|
+
default: 5
|
|
24
|
+
size:
|
|
25
|
+
description: Forwards to each child <avatar-ui> (xs|sm|md|lg|xl). Empty uses the per-avatar size.
|
|
26
|
+
type: string
|
|
@@ -24,7 +24,10 @@
|
|
|
24
24
|
"name": {
|
|
25
25
|
"description": "Deprecated alias for `text` (logs a one-shot console warning; will be removed in a future release). New code should use `text=` instead.",
|
|
26
26
|
"type": "string",
|
|
27
|
-
"default": ""
|
|
27
|
+
"default": "",
|
|
28
|
+
"deprecated": true,
|
|
29
|
+
"deprecated_reason": "Use `text` instead. Will be removed in v0.6.0.",
|
|
30
|
+
"deprecated_since": "0.4.x"
|
|
28
31
|
},
|
|
29
32
|
"shape": {
|
|
30
33
|
"description": "Avatar shape",
|
|
@@ -19,6 +19,13 @@ props:
|
|
|
19
19
|
name:
|
|
20
20
|
description: "Deprecated alias for `text` (logs a one-shot console warning; will be removed in a future release). New code should use `text=` instead."
|
|
21
21
|
type: string
|
|
22
|
+
# §179 (v0.5.5): principled deprecation metadata. The build pipeline
|
|
23
|
+
# propagates this into the sidecar + catalog; the LLM prompt builder
|
|
24
|
+
# surfaces "(deprecated, do not use)" based on this field rather than
|
|
25
|
+
# substring-matching the description.
|
|
26
|
+
deprecated: true
|
|
27
|
+
deprecated_since: "0.4.x"
|
|
28
|
+
deprecated_reason: "Use `text` instead. Will be removed in v0.6.0."
|
|
22
29
|
default: ""
|
|
23
30
|
icon:
|
|
24
31
|
description: Phosphor icon name shown instead of initials when `src`/`text` are empty.
|
|
@@ -52,8 +52,47 @@ export class UIButton extends UIElement {
|
|
|
52
52
|
this.prepend(iconEl);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
+
|
|
56
|
+
// §184 (v0.5.5, FEEDBACK-08 §8): icon-only a11y warning + title→aria-label
|
|
57
|
+
// auto-derive. Two complementary mechanisms (consumer chooses):
|
|
58
|
+
// (a) When [title="Undo"] is set on an icon-only button without an
|
|
59
|
+
// explicit aria-label, mirror title → aria-label. Matches the
|
|
60
|
+
// common icon-only-button-with-tooltip pattern (zero authoring
|
|
61
|
+
// cost — already had to write the tooltip text).
|
|
62
|
+
// (b) When the button is icon-only AND has no aria-label AND no
|
|
63
|
+
// aria-labelledby AND no title, console.warn ONCE per element
|
|
64
|
+
// so the bug class is diagnosable in dev without firing every
|
|
65
|
+
// render tick. The warning is suppressed via a one-shot
|
|
66
|
+
// WeakSet so subsequent re-renders stay quiet.
|
|
67
|
+
if (this.icon && !this.text) {
|
|
68
|
+
const ariaLabel = this.getAttribute('aria-label');
|
|
69
|
+
const ariaLabelledBy = this.getAttribute('aria-labelledby');
|
|
70
|
+
const titleAttr = this.getAttribute('title');
|
|
71
|
+
if (!ariaLabel && !ariaLabelledBy && titleAttr) {
|
|
72
|
+
this.setAttribute('aria-label', titleAttr);
|
|
73
|
+
} else if (!ariaLabel && !ariaLabelledBy && !titleAttr) {
|
|
74
|
+
if (!UIButton.#a11yWarned.has(this)) {
|
|
75
|
+
UIButton.#a11yWarned.add(this);
|
|
76
|
+
// eslint-disable-next-line no-console
|
|
77
|
+
console.warn(
|
|
78
|
+
`[button-ui] Icon-only button is missing an accessible name.\n` +
|
|
79
|
+
` Element: <button-ui icon="${this.icon}">\n` +
|
|
80
|
+
` Add one of:\n` +
|
|
81
|
+
` aria-label="Undo" ← explicit accessible name\n` +
|
|
82
|
+
` title="Undo" ← auto-mirrored to aria-label + tooltip\n` +
|
|
83
|
+
` aria-labelledby="..." ← reference an existing label element\n` +
|
|
84
|
+
` Without an accessible name screen readers announce nothing meaningful.`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
55
89
|
}
|
|
56
90
|
|
|
91
|
+
// §184: WeakSet of elements we've already warned about. Prevents
|
|
92
|
+
// repeat warnings across re-renders. GC-friendly — when the element
|
|
93
|
+
// is gone the entry is collected.
|
|
94
|
+
static #a11yWarned = new WeakSet();
|
|
95
|
+
|
|
57
96
|
#onClick = (e) => {
|
|
58
97
|
if (this.disabled) { e.stopPropagation(); return; }
|
|
59
98
|
if (this.type === 'submit') {
|
|
@@ -53,6 +53,7 @@ function sameDay(a, b) {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export class UICalendarPicker extends UIFormElement {
|
|
56
|
+
static labelDeprecated = false; // §170 (v0.5.4): label is first-class per calendar-picker.yaml
|
|
56
57
|
// §154 (v0.5.3): Phosphor icons this primitive auto-stamps (without
|
|
57
58
|
// consumer markup). Aggregated by installIconLoadersForRegistered()
|
|
58
59
|
// across all defined elements. Audited by check-required-icons.mjs
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"square",
|
|
48
48
|
"tall"
|
|
49
49
|
],
|
|
50
|
-
"default": "std"
|
|
50
|
+
"default": "std",
|
|
51
|
+
"deprecated": true
|
|
51
52
|
},
|
|
52
53
|
"color": {
|
|
53
54
|
"description": "Color scheme",
|
|
@@ -78,7 +79,8 @@
|
|
|
78
79
|
"heading": {
|
|
79
80
|
"description": "DEPRECATED (OD-CHART-02). Place chart titles in an enclosing card-ui's `<header><span slot=\"heading\">...</span></header>` instead. Still honored for back-compat; emits a one-shot console.warn per instance when set. Used as the chart's `aria-label` when no explicit label is provided.",
|
|
80
81
|
"type": "string",
|
|
81
|
-
"default": ""
|
|
82
|
+
"default": "",
|
|
83
|
+
"deprecated": true
|
|
82
84
|
},
|
|
83
85
|
"hideAverage": {
|
|
84
86
|
"description": "When true, suppress the overlaid average line",
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://adiaui.dev/a2ui/v0_9/components/ChatInput.json",
|
|
4
|
+
"title": "ChatInput",
|
|
5
|
+
"description": "Composable chat input bar — a self-contained chat-message composer\nthat stamps its OWN inner structure (textarea + model picker + send\nbutton) when authored as a bare `<chat-input-ui>` tag.\n\nIMPORTANT (closes the 2026-05-14 redundant-send-button class): the\ncomponent stamps a built-in send button (paper-plane-right icon,\nprimary variant). DO NOT add a separate Button sibling for \"send\" —\nthe user gets two send buttons. The submit event fires on Enter or\nsend-button click; `detail` is `{ text, model }`.\n\nInner stamped structure (default):\n <chat-input-ui>\n <textarea-ui placeholder=\"Type a message...\" rows=\"1\"></textarea-ui>\n <div slot=\"toolbar\">\n <select-ui slot=\"model\" placeholder=\"Model\">...</select-ui>\n <button-ui icon=\"paper-plane-right\" variant=\"primary\" slot=\"send\"></button-ui>\n </div>\n </chat-input-ui>\n\nLayout:\n ┌──────────────────────────────────┐\n │ textarea (grows vertically) │\n ├──────────────────────────────────┤\n │ [model ▾] [⏎ send] │ ← toolbar (model picker + built-in send)\n └──────────────────────────────────┘\n\nComposite wrapper, not a form field itself. The inner textarea-ui\nis form-associated via UIFormElement and submits through the parent\nform. `chat-input-ui`'s `disabled` / `placeholder` props propagate\nto the inner textarea.\n\nFor module-tier composer surfaces (slot vocabulary for file attach,\nautocomplete, trailing/leading controls), wrap inside\n`<chat-composer>` — see ChatComposer for the module-tier shape.\n",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "common_types.json#/$defs/ComponentCommon"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "common_types.json#/$defs/CatalogComponentCommon"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"component": {
|
|
17
|
+
"const": "ChatInput"
|
|
18
|
+
},
|
|
19
|
+
"disabled": {
|
|
20
|
+
"description": "Disable the entire input. Textarea becomes contenteditable=false;\nsend button disabled.\n",
|
|
21
|
+
"type": "boolean",
|
|
22
|
+
"default": false
|
|
23
|
+
},
|
|
24
|
+
"loading": {
|
|
25
|
+
"description": "In-flight / streaming state. Send button disabled, submit events\nsuppressed, but textarea stays editable so the user can draft a\nfollow-up while the model is still responding.\n",
|
|
26
|
+
"type": "boolean",
|
|
27
|
+
"default": false
|
|
28
|
+
},
|
|
29
|
+
"model": {
|
|
30
|
+
"description": "Currently selected model value (reflected, two-way with inner\n`<select-ui slot=\"model\">`). Empty when no model picker is shown.\n",
|
|
31
|
+
"type": "string",
|
|
32
|
+
"default": ""
|
|
33
|
+
},
|
|
34
|
+
"models": {
|
|
35
|
+
"description": "JSON array of model options for the inner model picker —\n[{value, label}] or [{label, options: [...]}] groups. Empty array\nhides the model picker.\n",
|
|
36
|
+
"type": "array",
|
|
37
|
+
"default": []
|
|
38
|
+
},
|
|
39
|
+
"placeholder": {
|
|
40
|
+
"description": "Textarea placeholder. Defaults to \"Type a message...\".",
|
|
41
|
+
"type": "string",
|
|
42
|
+
"default": "Type a message..."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"required": [
|
|
46
|
+
"component"
|
|
47
|
+
],
|
|
48
|
+
"unevaluatedProperties": false,
|
|
49
|
+
"x-adiaui": {
|
|
50
|
+
"anti_patterns": [
|
|
51
|
+
{
|
|
52
|
+
"description": "Adding a separate Button(primary) sibling next to ChatInput for \"send\". The component stamps its own send button (paper-plane-right icon). Two send buttons render side-by-side, confusing users."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"description": "Stamping a Select next to ChatInput for model picker. The component has a built-in model picker driven by the `models` prop. Set `models=[{value, label}, ...]` instead of stamping a separate Select."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"description": "Wrapping ChatInput inside <field-ui label=\"...\"> for label association. ChatInput is a composite container, not a form field. For a labeled composer surface, use <chat-composer> + slot label markup."
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"category": "agent",
|
|
62
|
+
"composes": [],
|
|
63
|
+
"events": {
|
|
64
|
+
"submit": {
|
|
65
|
+
"description": "Fires when the user presses Enter (without Shift) in the textarea OR clicks the built-in send button. The composer suppresses submission while `[loading]` is set.",
|
|
66
|
+
"detail": {
|
|
67
|
+
"model": {
|
|
68
|
+
"description": "Currently selected model value (empty if no model picker).",
|
|
69
|
+
"type": "string"
|
|
70
|
+
},
|
|
71
|
+
"text": {
|
|
72
|
+
"description": "Submitted message text from the inner textarea.",
|
|
73
|
+
"type": "string"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"examples": [
|
|
79
|
+
{
|
|
80
|
+
"description": "Minimal chat input — placeholder, no model picker. Sits inside a chat shell footer.",
|
|
81
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"ChatInput\", \"placeholder\": \"Ask me anything...\"}\n]",
|
|
82
|
+
"name": "basic-chat-input"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"description": "Chat input with model selection. The `models` prop drives the built-in model picker — DO NOT add a separate Select sibling.",
|
|
86
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"ChatInput\",\n \"placeholder\": \"Type a message...\",\n \"model\": \"claude-opus-4-7\",\n \"models\": [\n {\"value\": \"claude-opus-4-7\", \"label\": \"Claude Opus 4.7\"},\n {\"value\": \"claude-haiku-4-5\", \"label\": \"Claude Haiku 4.5\"},\n {\"value\": \"claude-sonnet-4-5\", \"label\": \"Claude Sonnet 4.5\"}\n ]\n }\n]",
|
|
87
|
+
"name": "chat-input-with-models"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"description": "Streaming response state. `[loading]` reflects on the host; send button disables; textarea stays editable so the user can draft a follow-up while the LLM is responding.",
|
|
91
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"ChatInput\",\n \"placeholder\": \"Drafting follow-up while streaming...\",\n \"loading\": true\n }\n]",
|
|
92
|
+
"name": "chat-input-loading-state"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"description": "Full chat shell — header + thread + ChatInput in the footer. Note: ChatInput is the sole footer child; no separate send button.",
|
|
96
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"ChatShell\", \"children\": [\"header\", \"thread\", \"input\"]},\n {\"id\": \"header\", \"component\": \"ChatHeader\", \"title\": \"Chat\"},\n {\"id\": \"thread\", \"component\": \"ChatThread\"},\n {\"id\": \"input\", \"component\": \"ChatInput\", \"placeholder\": \"Send a message...\"}\n]",
|
|
97
|
+
"name": "chat-shell-with-chat-input"
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"keywords": [
|
|
101
|
+
"chat-input",
|
|
102
|
+
"chat",
|
|
103
|
+
"message-input",
|
|
104
|
+
"composer",
|
|
105
|
+
"send-message",
|
|
106
|
+
"conversation",
|
|
107
|
+
"prompt",
|
|
108
|
+
"submit"
|
|
109
|
+
],
|
|
110
|
+
"name": "UIChatInput",
|
|
111
|
+
"related": [
|
|
112
|
+
"ChatShell",
|
|
113
|
+
"ChatThread",
|
|
114
|
+
"ChatComposer",
|
|
115
|
+
"ChatHeader",
|
|
116
|
+
"TextArea",
|
|
117
|
+
"Input"
|
|
118
|
+
],
|
|
119
|
+
"slots": {
|
|
120
|
+
"model": {
|
|
121
|
+
"description": "Override slot for the model picker. Most authors should NOT override this — set the `models` prop instead."
|
|
122
|
+
},
|
|
123
|
+
"send": {
|
|
124
|
+
"description": "Override slot for the send button only. The default stamped send button has `[icon=\"paper-plane-right\"] [variant=\"primary\"]`. Most authors should NOT override this — the built-in send button IS the send control. Adding a separate Button sibling for \"send\" duplicates this functionality."
|
|
125
|
+
},
|
|
126
|
+
"toolbar": {
|
|
127
|
+
"description": "Override slot for the entire toolbar row (model picker + send button). Most authors should NOT override this — the built-in toolbar handles model selection + send. Use this only when custom toolbar layout is required."
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"states": [
|
|
131
|
+
{
|
|
132
|
+
"description": "Default, accepting input. Send button enabled when textarea has content.",
|
|
133
|
+
"name": "idle"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"description": "Input fully disabled (typically during initial form setup).",
|
|
137
|
+
"attribute": "disabled",
|
|
138
|
+
"name": "disabled"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"description": "LLM is responding. Send button disabled + submit events suppressed, but textarea stays editable for follow-up drafts.",
|
|
142
|
+
"attribute": "loading",
|
|
143
|
+
"name": "loading"
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
"synonyms": {
|
|
147
|
+
"message-input": [
|
|
148
|
+
"conversation-input",
|
|
149
|
+
"prompt-input",
|
|
150
|
+
"send-bar"
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
"tag": "chat-input-ui",
|
|
154
|
+
"tokens": {},
|
|
155
|
+
"traits": [],
|
|
156
|
+
"version": 1
|
|
157
|
+
}
|
|
158
|
+
}
|