@actioneer/ads 1.0.7 → 1.0.9
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/DESIGN.md +119 -91
- package/README.md +19 -1
- package/components/ai-elements/chart.js +20 -20
- package/components/ai-elements/inline-citation.js +50 -50
- package/components/ai-elements/message.js +1 -1
- package/components/ai-elements/tool.js +5 -5
- package/components/alert.d.ts +3 -2
- package/components/alert.js +25 -25
- package/components/answer.js +1 -1
- package/components/assistant-ui/action-bar.js +1 -1
- package/components/assistant-ui/attachment.js +68 -49
- package/components/assistant-ui/composer-add-context.js +1 -1
- package/components/assistant-ui/composer-harness.js +5 -4
- package/components/assistant-ui/composer-trigger-popover.js +1 -1
- package/components/assistant-ui/composer.js +13 -13
- package/components/assistant-ui/message-timing.js +6 -6
- package/components/assistant-ui/selection-toolbar.js +5 -5
- package/components/assistant-ui/sources.js +15 -15
- package/components/assistant-ui/tooltip-icon-button.js +18 -14
- package/components/audio-waveform.d.ts +21 -8
- package/components/audio-waveform.js +371 -94
- package/components/autocomplete.js +9 -9
- package/components/breadcrumbs.js +36 -42
- package/components/button.d.ts +16 -1
- package/components/button.js +86 -73
- package/components/card.js +1 -1
- package/components/chart.d.ts +31 -4
- package/components/chart.js +900 -666
- package/components/chip.d.ts +2 -1
- package/components/chip.js +56 -51
- package/components/command-palette.js +12 -12
- package/components/connector-card.d.ts +1 -2
- package/components/connector-card.js +17 -17
- package/components/date-range-picker.js +1 -2
- package/components/drawer.js +9 -10
- package/components/dropdown.js +1 -1
- package/components/empty-state.d.ts +2 -0
- package/components/empty-state.js +17 -15
- package/components/field.js +9 -10
- package/components/file-dropzone.d.ts +6 -3
- package/components/file-dropzone.js +72 -60
- package/components/filters.d.ts +37 -0
- package/components/filters.js +129 -0
- package/components/index.d.ts +1 -0
- package/components/index.js +447 -444
- package/components/infinite-canvas.js +9 -9
- package/components/modal.d.ts +2 -1
- package/components/modal.js +102 -91
- package/components/page-body.js +8 -8
- package/components/popover.d.ts +6 -1
- package/components/popover.js +75 -65
- package/components/progress-circle.d.ts +1 -1
- package/components/progress-circle.js +57 -48
- package/components/segmented.d.ts +1 -0
- package/components/segmented.js +34 -36
- package/components/select.js +2 -2
- package/components/selection-action-bar.js +32 -31
- package/components/setting-row.js +10 -10
- package/components/sidebar.d.ts +15 -0
- package/components/sidebar.js +186 -149
- package/components/slider.js +5 -5
- package/components/stepper.d.ts +1 -1
- package/components/stepper.js +1 -1
- package/components/switch.js +10 -10
- package/components/table.d.ts +10 -2
- package/components/table.js +380 -366
- package/components/tabs.d.ts +6 -1
- package/components/tabs.js +32 -29
- package/components/timeline.js +3 -3
- package/components/toast.js +53 -56
- package/components/ui/button.js +4 -4
- package/components/ui/dialog.js +1 -1
- package/components/viz-charts.js +263 -221
- package/demo/components/add-to-artifact.js +3 -2
- package/examples/README.md +31 -0
- package/examples/agents-screen.tsx +477 -0
- package/examples/campaign-analysis-screen.tsx +138 -0
- package/examples/campaigns-screen.tsx +439 -0
- package/examples/settings-screen.tsx +90 -0
- package/examples/workspace-header.tsx +71 -0
- package/lib/icons.d.ts +8 -0
- package/lib/icons.js +171 -118
- package/llms.txt +93 -29
- package/manifest.json +1660 -113
- package/package.json +1 -1
- package/styles.css +55 -68
- package/theme.css +50 -59
package/lib/icons.js
CHANGED
|
@@ -1,123 +1,176 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import * as
|
|
4
|
-
import { Code as
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
import { jsxs as p, Fragment as d, jsx as a } from "react/jsx-runtime";
|
|
3
|
+
import * as r from "react";
|
|
4
|
+
import { Code as $, Check as k, Copy as S, FileText as f, UploadSimple as P, X as T, EyeSlash as w, Eye as L, MagnifyingGlass as A, Minus as m, Plus as x, CaretDown as B, FunnelSimple as I, Info as y, WarningCircle as U, Warning as F, CheckCircle as M, CaretRight as D, CaretUp as O, ArrowsDownUp as b, ChatCircle as R, ArrowUpRight as v, Clock as H, Database as E, ArrowSquareOut as G, Table as W, CaretLeft as z, CornersOut as V, Magnet as N, Tray as j, ArrowLeft as X, DotsThree as Q, User as q, XCircle as _, CircleDashed as J, ArrowsClockwise as K, Paperclip as Y, Quotes as Z, At as ee, Lightning as oe, Sparkle as te, File as ne, DownloadSimple as se, Image as C, BracketsCurly as ae, MusicNotes as re, VideoCamera as ce, ImageBroken as ie, Pulse as le, Archive as he, ArrowDown as Ce, ArrowRight as ge, ArrowUp as ue, Scroll as pe, Bell as de, Stack as $e, BookOpen as ke, Brain as Se, CalendarBlank as fe, Phone as Pe, ListChecks as Te, Cube as we, DotsNine as Le, Folder as Ae, FolderOpen as me, Gauge as xe, GitBranch as Be, Hash as Ie, ClockCounterClockwise as ye, House as Ue, SquaresFour as Fe, Leaf as Me, Lightbulb as De, Link as Oe, CircleNotch as be, SignOut as Re, Envelope as ve, Microphone as He, MicrophoneSlash as Ee, DotsThreeVertical as Ge, Palette as We, SidebarSimple as ze, Pause as Ve, PencilSimple as Ne, PhoneIncoming as je, PhoneSlash as Xe, ChartPie as Qe, Play as qe, Plug as _e, Presentation as Je, Rocket as Ke, Gear as Ye, Shapes as Ze, ShareNetwork as eo, Star as oo, Stop as to, ArrowsLeftRight as no, Target as so, Binoculars as ao, TextB as ro, TextT as co, TextItalic as io, TextStrikethrough as lo, TextUnderline as ho, ToggleRight as Co, Trash as go, Users as uo, Wrench as po } from "@phosphor-icons/react";
|
|
5
|
+
const $o = r.createContext(!1), ko = /* @__PURE__ */ new Set(["Info"]), So = new Set(
|
|
6
|
+
[
|
|
7
|
+
"FunnelSimple",
|
|
8
|
+
"X",
|
|
9
|
+
"TextT",
|
|
10
|
+
"TextItalic",
|
|
11
|
+
"TextStrikethrough",
|
|
12
|
+
"TextUnderline",
|
|
13
|
+
"Code",
|
|
14
|
+
"Minus",
|
|
15
|
+
"DotsNine",
|
|
16
|
+
"Link",
|
|
17
|
+
"Plus",
|
|
18
|
+
"Check",
|
|
19
|
+
"Pulse",
|
|
20
|
+
"ListChecks",
|
|
21
|
+
"BracketsCurly"
|
|
22
|
+
].map((o) => `${o}Icon`)
|
|
23
|
+
);
|
|
24
|
+
function e(o, c) {
|
|
25
|
+
const i = r.forwardRef(function({ strokeWidth: l, weight: g, className: t, ...n }, h) {
|
|
26
|
+
const u = r.useContext($o), s = g ?? (l != null && l >= 2 ? "bold" : "regular");
|
|
27
|
+
return u && ko.has(c) && s !== "fill" ? /* @__PURE__ */ p(d, { children: [
|
|
28
|
+
/* @__PURE__ */ a(
|
|
29
|
+
o,
|
|
30
|
+
{
|
|
31
|
+
ref: h,
|
|
32
|
+
size: "1em",
|
|
33
|
+
weight: s,
|
|
34
|
+
className: [t, "ads-icon-rest"].filter(Boolean).join(" "),
|
|
35
|
+
...n
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
/* @__PURE__ */ a(
|
|
39
|
+
o,
|
|
40
|
+
{
|
|
41
|
+
size: "1em",
|
|
42
|
+
weight: So.has(o.displayName ?? "") ? "bold" : "fill",
|
|
43
|
+
"aria-hidden": !0,
|
|
44
|
+
className: [t, "ads-icon-hover"].filter(Boolean).join(" "),
|
|
45
|
+
...n
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
] }) : /* @__PURE__ */ a(
|
|
49
|
+
o,
|
|
50
|
+
{
|
|
51
|
+
ref: h,
|
|
52
|
+
size: "1em",
|
|
53
|
+
weight: s,
|
|
54
|
+
className: t,
|
|
55
|
+
...n
|
|
56
|
+
}
|
|
57
|
+
);
|
|
9
58
|
});
|
|
10
|
-
return
|
|
59
|
+
return i.displayName = c, i;
|
|
11
60
|
}
|
|
12
|
-
const
|
|
61
|
+
const wo = e(Ce, "ArrowDown"), Lo = e(X, "ArrowLeft"), Ao = e(ge, "ArrowRight"), mo = e(ue, "ArrowUp"), xo = e(v, "ArrowUpRight"), Bo = e(B, "ChevronDown"), Io = e(z, "ChevronLeft"), yo = e(D, "ChevronRight"), Uo = e(O, "ChevronUp"), Fo = e(b, "SortIcon"), Mo = e(no, "SwapHorizontal"), Do = e(G, "ExternalLink"), Oo = e(ze, "PanelLeft"), bo = e(ee, "At"), Ro = e(Pe, "Call"), vo = e(je, "PhoneIncoming"), Ho = e(T, "Close"), Eo = e(_, "CloseCircle"), Go = e(S, "Copy"), Wo = e(se, "Download"), zo = e(Re, "LogOut"), Vo = e(He, "Mic"), No = e(Ee, "MicOff"), jo = e(Xe, "PhoneOff"), Xo = e(Ne, "Pencil"), Qo = e(Z, "Quote"), qo = e(L, "Eye"), _o = e(w, "EyeOff"), Jo = e(Ie, "Hash"), Ko = e(C, "ImageUpload"), Yo = e(P, "Upload"), Zo = e(co, "TextFont"), et = e(ro, "TextBold"), ot = e(io, "TextItalicStyle"), tt = e(lo, "TextStrike"), nt = e(
|
|
62
|
+
ho,
|
|
63
|
+
"TextUnderlineStyle"
|
|
64
|
+
), st = e(Co, "ToggleOn"), at = e(fe, "Calendar"), rt = e(H, "Clock"), ct = e($, "Code"), it = e(to, "Stop"), lt = e(N, "Magnet"), ht = e(V, "Maximize"), Ct = e(m, "Minus"), gt = e(Q, "MoreHorizontal"), ut = e(Ge, "MoreVertical"), pt = e(Le, "DragHandle"), dt = e(Oe, "Link"), $t = e(x, "Plus"), kt = e(K, "Refresh"), St = e(pe, "AuditTrail"), ft = e(A, "Search"), Pt = e(eo, "Share"), Tt = e(go, "Trash"), wt = e(k, "Check"), Lt = e(be, "Loader"), At = e(M, "CheckCircle"), mt = e(y, "Info"), xt = e(F, "Warning"), Bt = e(de, "Bell"), It = e(U, "WarningCircle"), yt = e(le, "Activity"), Ut = e(R, "AgentChat"), Ft = e(oe, "Bolt"), Mt = e(ke, "BookOpen"), Dt = e(Se, "Brain"), Ot = e(Te, "CheckList"), bt = e(we, "Component"), Rt = e(E, "Database"), vt = e(W, "Table"), Ht = e(I, "Filter"), Et = e(he, "Archive"), Gt = e(ne, "File"), Wt = e(f, "FileText"), zt = e(Ae, "Folder"), Vt = e(C, "Image"), Nt = e(ie, "ImageOff"), jt = e(re, "Music"), Xt = e(ce, "Video"), Qt = e(ae, "Braces"), qt = e(me, "FolderOpen"), _t = e(xe, "Gauge"), Jt = e(Be, "GitBranch"), Kt = e(ye, "HistoryClock"), Yt = e(Ue, "Home"), Zt = e($e, "Blocks"), en = e(j, "Inbox"), on = e(De, "Lightbulb"), tn = e(Me, "Leaf"), nn = e(Fe, "LayoutGrid"), sn = e(ve, "Mail"), an = e(We, "Palette"), rn = e(Qe, "PieChart"), cn = e(_e, "Plug"), ln = e(Ke, "Rocket"), hn = e(Ye, "Settings"), Cn = e(Ze, "Shapes"), gn = e(te, "Sparkles"), un = e(oo, "Star"), pn = e(ao, "Telescope"), dn = e(so, "Target"), $n = e(q, "User"), kn = e(uo, "Users"), Sn = e(qe, "Play"), fn = e(Je, "Presentation"), Pn = e(Ve, "Pause"), Tn = e(Y, "Paperclip"), wn = e(J, "CircleDashed"), Ln = e(po, "Wrench");
|
|
13
65
|
export {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
dt as
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
66
|
+
yt as Activity,
|
|
67
|
+
Ut as AgentChat,
|
|
68
|
+
Et as Archive,
|
|
69
|
+
wo as ArrowDown,
|
|
70
|
+
Lo as ArrowLeft,
|
|
71
|
+
Ao as ArrowRight,
|
|
72
|
+
mo as ArrowUp,
|
|
73
|
+
xo as ArrowUpRight,
|
|
74
|
+
bo as At,
|
|
75
|
+
St as AuditTrail,
|
|
76
|
+
Bt as Bell,
|
|
77
|
+
Zt as Blocks,
|
|
78
|
+
Ft as Bolt,
|
|
79
|
+
Mt as BookOpen,
|
|
80
|
+
Qt as Braces,
|
|
81
|
+
Dt as Brain,
|
|
82
|
+
at as Calendar,
|
|
83
|
+
Ro as Call,
|
|
84
|
+
wt as Check,
|
|
85
|
+
At as CheckCircle,
|
|
86
|
+
Ot as CheckList,
|
|
87
|
+
Bo as ChevronDown,
|
|
88
|
+
Io as ChevronLeft,
|
|
89
|
+
yo as ChevronRight,
|
|
90
|
+
Uo as ChevronUp,
|
|
91
|
+
wn as CircleDashed,
|
|
92
|
+
rt as Clock,
|
|
93
|
+
Ho as Close,
|
|
94
|
+
Eo as CloseCircle,
|
|
95
|
+
ct as Code,
|
|
96
|
+
bt as Component,
|
|
97
|
+
Go as Copy,
|
|
98
|
+
Rt as Database,
|
|
99
|
+
Wo as Download,
|
|
100
|
+
pt as DragHandle,
|
|
101
|
+
Do as ExternalLink,
|
|
102
|
+
qo as Eye,
|
|
103
|
+
_o as EyeOff,
|
|
104
|
+
Gt as File,
|
|
105
|
+
Wt as FileText,
|
|
106
|
+
Ht as Filter,
|
|
107
|
+
zt as Folder,
|
|
108
|
+
qt as FolderOpen,
|
|
109
|
+
_t as Gauge,
|
|
110
|
+
Jt as GitBranch,
|
|
111
|
+
Jo as Hash,
|
|
112
|
+
Kt as HistoryClock,
|
|
113
|
+
Yt as Home,
|
|
114
|
+
$o as IconHoverFillContext,
|
|
115
|
+
Vt as Image,
|
|
116
|
+
Nt as ImageOff,
|
|
117
|
+
Ko as ImageUpload,
|
|
118
|
+
en as Inbox,
|
|
119
|
+
mt as Info,
|
|
120
|
+
nn as LayoutGrid,
|
|
121
|
+
tn as Leaf,
|
|
122
|
+
on as Lightbulb,
|
|
123
|
+
dt as Link,
|
|
124
|
+
Lt as Loader,
|
|
125
|
+
zo as LogOut,
|
|
126
|
+
lt as Magnet,
|
|
127
|
+
sn as Mail,
|
|
128
|
+
ht as Maximize,
|
|
129
|
+
Vo as Mic,
|
|
130
|
+
No as MicOff,
|
|
131
|
+
Ct as Minus,
|
|
132
|
+
gt as MoreHorizontal,
|
|
133
|
+
ut as MoreVertical,
|
|
134
|
+
jt as Music,
|
|
135
|
+
an as Palette,
|
|
136
|
+
Oo as PanelLeft,
|
|
137
|
+
Tn as Paperclip,
|
|
138
|
+
Pn as Pause,
|
|
139
|
+
Xo as Pencil,
|
|
140
|
+
vo as PhoneIncoming,
|
|
141
|
+
jo as PhoneOff,
|
|
142
|
+
rn as PieChart,
|
|
143
|
+
Sn as Play,
|
|
144
|
+
cn as Plug,
|
|
145
|
+
$t as Plus,
|
|
146
|
+
fn as Presentation,
|
|
147
|
+
Qo as Quote,
|
|
148
|
+
kt as Refresh,
|
|
149
|
+
ln as Rocket,
|
|
150
|
+
ft as Search,
|
|
151
|
+
hn as Settings,
|
|
152
|
+
Cn as Shapes,
|
|
153
|
+
Pt as Share,
|
|
154
|
+
Fo as SortIcon,
|
|
155
|
+
gn as Sparkles,
|
|
156
|
+
un as Star,
|
|
157
|
+
it as Stop,
|
|
158
|
+
Mo as SwapHorizontal,
|
|
159
|
+
vt as Table,
|
|
160
|
+
dn as Target,
|
|
161
|
+
pn as Telescope,
|
|
162
|
+
et as TextBold,
|
|
163
|
+
Zo as TextFont,
|
|
164
|
+
ot as TextItalicStyle,
|
|
165
|
+
tt as TextStrike,
|
|
166
|
+
nt as TextUnderlineStyle,
|
|
167
|
+
st as ToggleOn,
|
|
168
|
+
Tt as Trash,
|
|
169
|
+
Yo as Upload,
|
|
170
|
+
$n as User,
|
|
171
|
+
kn as Users,
|
|
172
|
+
Xt as Video,
|
|
173
|
+
xt as Warning,
|
|
174
|
+
It as WarningCircle,
|
|
175
|
+
Ln as Wrench
|
|
123
176
|
};
|
package/llms.txt
CHANGED
|
@@ -70,8 +70,8 @@ Reference semantic roles, never raw color/dimension literals (ads-lint rejects l
|
|
|
70
70
|
- `menu-stroke` — The neutral stroke ladder: every 1px UI border stays within WG3 to WG5.
|
|
71
71
|
- `toast-stroke` — The neutral stroke ladder: every 1px UI border stays within WG3 to WG5.
|
|
72
72
|
- `tree-stroke` — The neutral stroke ladder: every 1px UI border stays within WG3 to WG5.
|
|
73
|
-
- `ring` — Focus ring and scrim, both translucent
|
|
74
|
-
- `overlay` — Focus ring and scrim, both translucent
|
|
73
|
+
- `ring` — Focus ring and scrim, both translucent neutral ink.
|
|
74
|
+
- `overlay` — Focus ring and scrim, both translucent neutral ink.
|
|
75
75
|
|
|
76
76
|
## Design principles
|
|
77
77
|
|
|
@@ -89,17 +89,16 @@ Delineate SURFACES (cards, panels, sidebars, page regions) with color contrast,
|
|
|
89
89
|
- Don't: Alternate persistent neutral fills inside one panel (for example white Panel → grey item → white child); flatten the item or promote the recess to the container.
|
|
90
90
|
- Don't: Give a filled control no stroke on the tinted canvas — it disappears; it needs a crisp edge.
|
|
91
91
|
|
|
92
|
-
### 2.
|
|
92
|
+
### 2. Five shadows, floating layers only [judgment]
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
ADS has five shadow tokens: shadow-0 (flat, the default), shadow-float, shadow-overlay, and the two table scroll-hint smudges. Only a layer that floats above the page may carry float or overlay; everything in the page is flat.
|
|
95
95
|
|
|
96
|
-
- Do: Keep
|
|
97
|
-
- Do:
|
|
98
|
-
- Do:
|
|
99
|
-
- Don't:
|
|
100
|
-
- Don't: Use raw shadow values or
|
|
101
|
-
- Don't:
|
|
102
|
-
- Don't: Use shadow-500 or shadow-600 as a routine default.
|
|
96
|
+
- Do: Keep cards, panels, chips, buttons, tabs, fields, thumbs, and other in-page surfaces at shadow-0; separate them with fill, border, or spacing.
|
|
97
|
+
- Do: Use shadow-float for floating layers that sit over content: toasts, toolbars, the chat composer dock, and any menu or popover that needs lift beyond its border.
|
|
98
|
+
- Do: Use shadow-overlay for modals, dialogs, and overlay drawers, so a dialog always reads above a menu.
|
|
99
|
+
- Don't: Put a shadow on an in-page surface for decoration or to signal that it is clickable.
|
|
100
|
+
- Don't: Use raw shadow values, inset glows, or the removed numbered levels and elevation hook.
|
|
101
|
+
- Don't: Invent a third floating level; stack order comes from float vs overlay.
|
|
103
102
|
|
|
104
103
|
### 3. Motion follows the interaction [lint: unbounded-transition, sluggish-easing, zero-scale-entrance, undersized-zoom-entrance, raw-spring-config]
|
|
105
104
|
|
|
@@ -161,7 +160,7 @@ A screen carries ONLY what the user needs to move forward: one title, the inputs
|
|
|
161
160
|
- Do: Prefer more, smaller steps over dense ones; ask one thing at a time.
|
|
162
161
|
- Do: Derive instead of asking whenever possible (a name from a work email, the company from its domain).
|
|
163
162
|
- Do: Prefer clear text-only buttons; add an icon only when it communicates essential meaning the label cannot carry alone, or for a compact conventional icon-only control.
|
|
164
|
-
- Do:
|
|
163
|
+
- Do: Open a multi-step create task launched from a collection (New campaign) as a Modal over that list: title-only header, one scrolling form (for New campaign: Campaign name, Caller numbers, Audience), and Cancel + Create together in the footer — the user never loses their place. Add a Stepper only when the task truly has separate steps. Form modals use a fixed height (Modal height="fixed", 640px) so the frame never resizes: the header and footer stay put and ModalBody scrolls. Standalone onboarding flows render full-screen with a single content container holding the inputs and its own Back/Continue.
|
|
165
164
|
- Don't: Add section eyebrows above a title that already names the screen, or helper text that restates the obvious / duplicates a disabled button's meaning.
|
|
166
165
|
- Don't: Add any header description unless the user explicitly requested supporting copy for that page, section, panel, modal, dialog, drawer, or popover.
|
|
167
166
|
- Don't: Decorate a labeled button with a redundant leading or trailing icon.
|
|
@@ -177,24 +176,78 @@ ADS targets landscape tablet (1024) → laptop (1440) → wide display (1920+);
|
|
|
177
176
|
- Don't: Use sm:/md: viewport variants inside src/components, or hardcode a pane width there.
|
|
178
177
|
- Don't: Cap a grid at a hard column count so it stops growing on wide displays.
|
|
179
178
|
|
|
180
|
-
### 10. Back navigation is leading [judgment]
|
|
179
|
+
### 10. Back navigation is leading; drill-downs use the breadcrumb [judgment]
|
|
181
180
|
|
|
182
|
-
A
|
|
181
|
+
A record or drill-down page (a campaign inside Voice campaigns, a connector inside Data Integrations) is titled by its Breadcrumbs trail — parent / record at 16px — with no back arrow and no repeated H1; the page's one primary action sits at the right end of the same row. A standalone page-level Back control, when one is needed outside a hierarchy, sits immediately before the title and never on the right.
|
|
183
182
|
|
|
184
|
-
- Do:
|
|
185
|
-
- Do:
|
|
183
|
+
- Do: Title a drill-down with Breadcrumbs (16px trail: muted parent links, Medium current item) and put its primary action (e.g. Pause campaign) right-aligned on the same row.
|
|
184
|
+
- Do: Use PageHeader with onBack only for a standalone page that has no parent hierarchy to show.
|
|
185
|
+
- Do: Reserve the trailing header area for forward or page-level actions such as Add, Save, Pause, or Share.
|
|
186
|
+
- Don't: Stack a back arrow and a large H1 above a page whose parent is already known — the breadcrumb says both.
|
|
186
187
|
- Don't: Place Back on the right side of a page header.
|
|
187
188
|
- Don't: Render a redundant visible Back label when the standard left arrow and accessible label are sufficient.
|
|
188
189
|
|
|
189
190
|
### 11. Tabs lead; scoped search trails [judgment]
|
|
190
191
|
|
|
191
|
-
When tabs and a search field control the same content, they share one responsive control row: the tab
|
|
192
|
+
When tabs and a search field control the same content, they share one responsive control row: the tab list leads with its triggers left-aligned at their natural width over a baseline that fades from WG3 to transparent, and search sits at the trailing edge. On collection screens the trailing controls are icon triggers — SearchDisclosure (expands into the field) then Filters — and tab labels are 14px with a quieter count after each label.
|
|
192
193
|
|
|
193
|
-
- Do: Keep
|
|
194
|
+
- Do: Keep tab triggers left-aligned at their natural width, then place the scoped search opposite them in the same toolbar.
|
|
195
|
+
- Do: On collection screens use SearchDisclosure followed by Filters as 32px icon triggers at the trailing edge; keep the page header for the title and one primary action only.
|
|
196
|
+
- Do: Give each status tab its count (All 42 · Active 14 · Paused 4); the count renders Regular in tertiary grey, teal on the active tab.
|
|
194
197
|
- Do: On constrained containers, stack tabs first and search second while preserving their relationship.
|
|
195
198
|
- Don't: Stretch the tab track to fill the space between its labels and the search field.
|
|
196
199
|
- Don't: Put a scoped search field on a separate row above its tabs when both controls fit side by side.
|
|
197
200
|
- Don't: Place search before tabs in the reading or keyboard order.
|
|
201
|
+
- Don't: Put a Search button or a full-width search field in the page header of a collection screen.
|
|
202
|
+
|
|
203
|
+
### 12. Collection screens fill the panel [judgment]
|
|
204
|
+
|
|
205
|
+
A collection screen (campaigns, call logs, leads) is one white panel: BodyPageHeader (title + one primary action), the tab/search/filter row, then a Table whose rows fill the panel's height with Pagination pinned to its bottom edge. Rows open details in a shell-level side panel; the list stays visible.
|
|
206
|
+
|
|
207
|
+
- Do: Size the page so the rows fill the panel to its 24px bottom inset and Pagination sits at the bottom; let only the rows scroll.
|
|
208
|
+
- Do: Show row checkboxes only on hover/focus (and while checked or mixed); keep the header select-all checkbox always visible.
|
|
209
|
+
- Do: When a row's details are open, mark it with TableRow isActive (the soft-teal fade) — no radio and no selection column for that purpose.
|
|
210
|
+
- Do: Put status in a Chip using business language (see status-language) and keep cell values at text-m.
|
|
211
|
+
- Do: Show the customer's workspace logo in the Sidebar brand slot (SidebarWorkspace) when the product runs inside a customer workspace.
|
|
212
|
+
- Don't: Leave an empty band under a short table, or float Pagination mid-panel.
|
|
213
|
+
- Don't: Use single-selection radios to mean 'this row is open'.
|
|
214
|
+
- Don't: Show a checkbox on every resting row of a multi-select table.
|
|
215
|
+
- Don't: Open record details in a modal over the list you are scanning.
|
|
216
|
+
|
|
217
|
+
### 13. Record detail panels are grouped by question [judgment]
|
|
218
|
+
|
|
219
|
+
A selection-driven detail panel reads top-down as: kicker (the KIND of record), title, then the record's status Chip and its one-line context directly under the title; then titled sections 32px apart — Performance (stat cards + chart card) and Details (label–value rows with inset dividers); then footer actions (secondary outline + one solid primary).
|
|
220
|
+
|
|
221
|
+
- Do: Put the status Chip and its context ("Finished Oct 21") in the header, 4px under the title, so status never floats on its own.
|
|
222
|
+
- Do: Group numbers in small outlined stat cards (WG3 edge, radius-l, 12px padding, 8px apart) and the trend in its own chart card.
|
|
223
|
+
- Do: List attributes (owner, started, calling windows) as label–value rows: label secondary left, value primary right, inset WG3 dividers.
|
|
224
|
+
- Do: Separate sections with 32px and keep items inside a section ≤16px apart; give each section a 14px Medium title.
|
|
225
|
+
- Don't: Mix attributes (owner) into the metric grid.
|
|
226
|
+
- Don't: Leave a lone chip or line of metadata between the title and the first section.
|
|
227
|
+
- Don't: Repeat the same fact (finish date) in the header and in Details.
|
|
228
|
+
|
|
229
|
+
### 14. Stats and charts sit in their own containers, values visible [judgment]
|
|
230
|
+
|
|
231
|
+
On analytics/record pages every stat and every chart is its own outlined container (1px WG3 border, radius-l, 20px padding, white, flat) on the white panel, 16px apart. Values are printed on the chart by default — never hover-only — and the legend sits at the right end of the chart's title row.
|
|
232
|
+
|
|
233
|
+
- Do: Stat card: label (14px secondary) → number (32px) with its scope ("of 4,800 calls") 4px apart, then a Progress bar 12px below that fills the card width.
|
|
234
|
+
- Do: Chart card: title (16px Medium) + scope subtitle (12px secondary) on the left, the legend right-aligned on the same row, ~40px from the title block to the plot.
|
|
235
|
+
- Do: Bar charts print each bar's value; stacked bars print each segment that fits plus the stack total. Line charts print every point's value in the series colour (secondary grey for light amber/grey series).
|
|
236
|
+
- Do: Size charts so the cards end on the panel's 24px bottom inset.
|
|
237
|
+
- Don't: Separate stats with vertical hairlines while their bars run into the next stat — proximity breaks.
|
|
238
|
+
- Don't: Hide numbers behind a hover tooltip.
|
|
239
|
+
- Don't: Give a legend its own row under the subtitle when it fits beside the title.
|
|
240
|
+
- Don't: Put the same spacing between a label and its value as between two separate cards.
|
|
241
|
+
|
|
242
|
+
### 15. Status speaks the business, with one tone per meaning [judgment]
|
|
243
|
+
|
|
244
|
+
Status labels name the business state, not the machine's activity, and tabs use the same words. Campaign statuses: Active and Scheduled (info blue), Paused (warning amber), Completed (success green), Draft (default grey), Failed (danger red). Teal is reserved for actions and selection, not for a status.
|
|
245
|
+
|
|
246
|
+
- Do: Say Active, not Dialing; name the tab Active too (All · Draft · Active · Paused · Completed).
|
|
247
|
+
- Do: Use Chip tones consistently for the same status everywhere (table cell, detail header, filters).
|
|
248
|
+
- Do: Use the plain Chip appearance (square dot + 14px text) where a column of filled chips would shout louder than the record names.
|
|
249
|
+
- Don't: Colour a status with the primary teal — it competes with the primary action and the selected-row fade.
|
|
250
|
+
- Don't: Use different words for the same state in the tab, the chip and the filter.
|
|
198
251
|
|
|
199
252
|
## UI grammar
|
|
200
253
|
|
|
@@ -204,8 +257,10 @@ Before composing a screen, match its intent to one production below, preserve th
|
|
|
204
257
|
- `browse-with-detail` — Browse with selection-driven detail: A primary browse Panel and an inline Drawer mounted as shell-level siblings. (intents: browse, records, list detail, inspector, audit log; Storybook: ADS/Components/Navigation/Sidebar)
|
|
205
258
|
- `data-table` — Structured data table: Semantic table anatomy with matching header and body rows. (intents: table, records, comparison, sorting, selection; Storybook: ADS/Components/Data display/Table)
|
|
206
259
|
- `tabbed-results` — Tabbed results with scoped search: Tabs lead and a scoped search trails in one responsive control row. (intents: tabs, filter, search, results, segmented views; Storybook: ADS/Components/Data display/Tabs)
|
|
260
|
+
- `collection-screen` — Collection screen with record detail: BodyPageHeader (title + one primary action), a control row with counted Tabs leading and SearchDisclosure + Filters trailing, a Table whose rows fill the panel with Pagination at its bottom edge, a shell-level Drawer for the open record, and a fixed-height Modal for the create task. (intents: campaigns, call logs, leads, records list, collection, list page, new campaign; Storybook: ADS/Components/Table)
|
|
261
|
+
- `record-analytics` — Record analytics page: A drill-down page titled by its Breadcrumbs (parent / record) with the primary action on the same row, record Tabs, then outlined stat cards and outlined chart cards whose legends sit in their title row and whose values are printed. (intents: analysis, analytics tab, record page, campaign analysis, metrics, dashboard tab; Storybook: ADS/Components/Chart)
|
|
207
262
|
- `modal-task` — Blocking modal task: A focused interruption with one title, body, and decisive footer. (intents: modal, confirmation, short form, blocking task, destructive action; Storybook: ADS/Components/Overlays/Modal)
|
|
208
|
-
- `settings-card` — Settings card: A compact settings surface with grouped SettingRows and one save action. (intents: settings, preferences, configuration, toggles; Storybook: ADS/
|
|
263
|
+
- `settings-card` — Settings card: A compact settings surface with grouped SettingRows and one save action. (intents: settings, preferences, configuration, toggles; Storybook: ADS/Components/Under review/SettingList / SettingRow)
|
|
209
264
|
- `research-trace` — Inspectable research trace: ResearchActivity owns the run summary and contains the canonical ChainOfThought tree. (intents: agent trace, research, tool activity, sources, long-running task; Storybook: ADS/Components/AI Elements/Research Activity)
|
|
210
265
|
- `typed-answer` — Typed research answer: A request/answer turn where structured output flows through AnswerRenderer. (intents: answer, research result, citations, follow-up, assistant response; Storybook: ADS/Components/AI Elements/Message)
|
|
211
266
|
- `workflow-canvas` — Workflow canvas: InfiniteCanvas owns pan, zoom, grid, edges, controls, and responsive canvas chrome. (intents: workflow, node graph, canvas, diagram, flow builder; Storybook: ADS/Components/Data display/InfiniteCanvas)
|
|
@@ -254,7 +309,7 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
254
309
|
- [Field] — Wrap any form control (Input, Select, NumberField, Textarea, etc.) with a label plus optional description or error footer. [docs](https://ads.actioneer.dev/#/field)
|
|
255
310
|
- [FieldDescription] — component [docs](https://ads.actioneer.dev/#/field)
|
|
256
311
|
- [FieldError] — component [docs](https://ads.actioneer.dev/#/field)
|
|
257
|
-
- [FileDropzone] — component (variants: isDragging: true|false; isDisabled: true|false) [docs](https://ads.actioneer.dev/#/review/file-dropzone)
|
|
312
|
+
- [FileDropzone] — component (variants: hasFiles: true|false; isDragging: true|false; isDisabled: true|false) [docs](https://ads.actioneer.dev/#/review/file-dropzone)
|
|
258
313
|
- [Heading] — Use Heading for semantic h1–h4 titles above a page, section, or card, sized by document level via `level` (never a `size` prop). [docs](https://ads.actioneer.dev/#/typography)
|
|
259
314
|
- [Kbd] — Use to display a keyboard shortcut or key name, inline in text or trailing a label in a shortcut list. [docs](https://ads.actioneer.dev/#/kbd)
|
|
260
315
|
- [Label] — component [docs](https://ads.actioneer.dev/#/field)
|
|
@@ -269,8 +324,10 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
269
324
|
- [Stepper] — component (variants: status: complete|current|upcoming|error; size: sm|md) [docs](https://ads.actioneer.dev/#/review/stepper)
|
|
270
325
|
- [Text] — Use Text for any body copy, caption, or inline run of prose instead of a raw p/span tag. [docs](https://ads.actioneer.dev/#/typography)
|
|
271
326
|
- [Tooltip] — Use to label a single hover/focus-triggered element (icon-only buttons, avatars, truncated text) with a short informational hint — not for actions or content that needs to stay open. [docs](https://ads.actioneer.dev/#/tooltip)
|
|
327
|
+
- [AudioWaveformLook] — TypeScript type
|
|
272
328
|
- [AudioWaveformProps] — TypeScript type
|
|
273
329
|
- [ButtonProps] — TypeScript type
|
|
330
|
+
- [ButtonSize] — TypeScript type
|
|
274
331
|
- [CodeBlockProps] — TypeScript type
|
|
275
332
|
- [DividerProps] — TypeScript type
|
|
276
333
|
- [FieldProps] — TypeScript type
|
|
@@ -306,6 +363,7 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
306
363
|
- [Checkbox] — Use for a standalone boolean toggle or a multi-select list item — including a tri-state "select all" via `indeterminate`. [docs](https://ads.actioneer.dev/#/checkbox)
|
|
307
364
|
- [CheckboxGroup] — component [docs](https://ads.actioneer.dev/#/checkbox)
|
|
308
365
|
- [DateRangePicker] — component [docs](https://ads.actioneer.dev/#/date-range-picker)
|
|
366
|
+
- [Filters] — component [docs](https://ads.actioneer.dev/#/filters)
|
|
309
367
|
- [Input] — Use for any single-line text value, wrapped in `Field` for label/description/error and `startContent`/`endContent` for icons or inline actions. [docs](https://ads.actioneer.dev/#/input)
|
|
310
368
|
- [InputField] — component [docs](https://ads.actioneer.dev/#/input-field)
|
|
311
369
|
- [NumberField] — Use for a bounded numeric quantity (e.g. seats, width, count) that benefits from stepper buttons and min/max clamping, not free-form numeric text entry. [docs](https://ads.actioneer.dev/#/number-field)
|
|
@@ -324,6 +382,9 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
324
382
|
- [DateRangePickerProps] — TypeScript type
|
|
325
383
|
- [DateRangeValue] — TypeScript type
|
|
326
384
|
- [DropdownOptionsProps] — TypeScript type
|
|
385
|
+
- [FilterGroup] — TypeScript type
|
|
386
|
+
- [FilterOption] — TypeScript type
|
|
387
|
+
- [FiltersProps] — TypeScript type
|
|
327
388
|
- [InputFieldProps] — TypeScript type
|
|
328
389
|
- [InputProps] — TypeScript type
|
|
329
390
|
- [NumberFieldProps] — TypeScript type
|
|
@@ -354,15 +415,15 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
354
415
|
- [DropdownSeparator] — component [docs](https://ads.actioneer.dev/#/dropdown)
|
|
355
416
|
- [DropdownTrigger] — component [docs](https://ads.actioneer.dev/#/dropdown)
|
|
356
417
|
- [InlineDrawer] — component (variants: side: right|left|bottom; size: sm|md|lg|xl) [docs](https://ads.actioneer.dev/#/drawer)
|
|
357
|
-
- [Modal] — Use for a blocking, focused task or confirmation that must interrupt the page until resolved (portaled, focus-trapped, Escape/backdrop dismissible). (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
358
|
-
- [ModalBody] — component (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
359
|
-
- [ModalClose] — component (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
360
|
-
- [ModalDescription] — component (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
418
|
+
- [Modal] — Use for a blocking, focused task or confirmation that must interrupt the page until resolved (portaled, focus-trapped, Escape/backdrop dismissible). (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
419
|
+
- [ModalBody] — component (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
420
|
+
- [ModalClose] — component (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
421
|
+
- [ModalDescription] — component (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
361
422
|
- [ModalDrawer] — component (variants: side: right|left|bottom; size: sm|md|lg|xl) [docs](https://ads.actioneer.dev/#/drawer)
|
|
362
|
-
- [ModalFooter] — component (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
363
|
-
- [ModalHeader] — component (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
364
|
-
- [ModalSection] — component (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
365
|
-
- [ModalTitle] — component (variants: size: sm|md|lg|xl|full; position: center|top) [docs](https://ads.actioneer.dev/#/modal)
|
|
423
|
+
- [ModalFooter] — component (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
424
|
+
- [ModalHeader] — component (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
425
|
+
- [ModalSection] — component (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
426
|
+
- [ModalTitle] — component (variants: size: sm|md|lg|xl|full; position: center|top; height: content|fixed) [docs](https://ads.actioneer.dev/#/modal)
|
|
366
427
|
- [Popover] — Use Popover for a portaled, dismissible panel anchored to a trigger — quick settings, a profile card, or a short inline form — that closes on outside click or Escape. [docs](https://ads.actioneer.dev/#/popover)
|
|
367
428
|
- [PopoverContent] — component [docs](https://ads.actioneer.dev/#/popover)
|
|
368
429
|
- [PopoverTrigger] — component [docs](https://ads.actioneer.dev/#/popover)
|
|
@@ -418,7 +479,7 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
418
479
|
- [CarouselItem] — component [docs](https://ads.actioneer.dev/#/carousel)
|
|
419
480
|
- [CarouselNext] — component [docs](https://ads.actioneer.dev/#/carousel)
|
|
420
481
|
- [CarouselPrevious] — component [docs](https://ads.actioneer.dev/#/carousel)
|
|
421
|
-
- [Chip] — A compact pill for statuses, tags, or metadata, with an optional leading icon/avatar or a dismiss control. (variants: variant: solid|outline; color: default|primary|success|warning|danger|info) [docs](https://ads.actioneer.dev/#/chip)
|
|
482
|
+
- [Chip] — A compact pill for statuses, tags, or metadata, with an optional leading icon/avatar or a dismiss control. (variants: variant: solid|outline|plain; color: default|primary|success|warning|danger|info) [docs](https://ads.actioneer.dev/#/chip)
|
|
422
483
|
- [ClarificationAnswer] — component (variants: tone: default|primary|success|warning|danger|info) [docs](https://ads.actioneer.dev/#/ai/answer)
|
|
423
484
|
- [ComboChart] — component [docs](https://ads.actioneer.dev/#/ai/chart)
|
|
424
485
|
- [ComparisonAnswer] — component (variants: tone: default|primary|success|warning|danger|info) [docs](https://ads.actioneer.dev/#/ai/answer)
|
|
@@ -510,6 +571,7 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
510
571
|
- [ChartAxisDomain] — TypeScript type
|
|
511
572
|
- [ChartColor] — TypeScript type
|
|
512
573
|
- [ChartDatum] — TypeScript type
|
|
574
|
+
- [ChartLegendPlacement] — TypeScript type
|
|
513
575
|
- [ChartTickFormatter] — TypeScript type
|
|
514
576
|
- [ChartTooltipContext] — TypeScript type
|
|
515
577
|
- [ChartTooltipItem] — TypeScript type
|
|
@@ -698,6 +760,7 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
698
760
|
- [SidebarNav] — component [docs](https://ads.actioneer.dev/#/sidebar)
|
|
699
761
|
- [SidebarSection] — component [docs](https://ads.actioneer.dev/#/sidebar)
|
|
700
762
|
- [SidebarTrigger] — component [docs](https://ads.actioneer.dev/#/sidebar)
|
|
763
|
+
- [SidebarWorkspace] — component [docs](https://ads.actioneer.dev/#/sidebar)
|
|
701
764
|
- [BodyPageHeaderProps] — TypeScript type
|
|
702
765
|
- [BreadcrumbItemProps] — TypeScript type
|
|
703
766
|
- [BreadcrumbsProps] — TypeScript type
|
|
@@ -712,6 +775,7 @@ Before using any component below, preserve its built-in motion and apply the mot
|
|
|
712
775
|
- [SidebarItemProps] — TypeScript type
|
|
713
776
|
- [SidebarProps] — TypeScript type
|
|
714
777
|
- [SidebarSectionProps] — TypeScript type
|
|
778
|
+
- [SidebarWorkspaceProps] — TypeScript type
|
|
715
779
|
- [useSidebar] — React hook
|
|
716
780
|
|
|
717
781
|
### Layout
|