ava-engine 0.2.0 → 0.4.0

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.
@@ -0,0 +1,430 @@
1
+ /* ── Ava · Dashboard ──
2
+ Same language as the app and landing page: a near-monochrome canvas, light
3
+ Inter Tight display type, mono labels, soft white cards and indigo as the one
4
+ accent. The live-agent "orb" marks status, as it does on the call. */
5
+
6
+ @font-face { font-family: "Inter Tight"; src: url(/fonts/inter-tight-var.woff2) format("woff2"); font-weight: 300 700; font-display: swap; }
7
+ @font-face { font-family: "Inter"; src: url(/fonts/inter-var.woff2) format("woff2"); font-weight: 400 700; font-display: swap; }
8
+ @font-face { font-family: "IBM Plex Mono"; src: url(/fonts/plex-mono-400.woff2) format("woff2"); font-weight: 400; font-display: swap; }
9
+ @font-face { font-family: "IBM Plex Mono"; src: url(/fonts/plex-mono-500.woff2) format("woff2"); font-weight: 500 600; font-display: swap; }
10
+
11
+ :root {
12
+ --canvas: #F5F5F7; --card: #FFFFFF; --soft: #F7F7F9; --hover: #F1F1F4;
13
+ --line: #E9E9ED; --edge: #DCDCE3;
14
+ --ink: #0A0A0C; --ink2: #4E4F5A; --meta: #686975;
15
+ --accent: #4F46E5; --accent-ink: #3730A3; --tint: rgba(79,70,229,.08); --tintline: rgba(79,70,229,.28);
16
+ --ok: #15803D; --ok-tint: #ECFDF3; --warn: #8A5300; --warn-tint: #FFF6E5; --warn-line: #F2D49A;
17
+ --err: #B42318; --err-tint: #FEF3F2; --err-line: #F9C9C4;
18
+ --brand-a: #6366F1; --brand-c: #3730A3;
19
+ --orb: radial-gradient(circle at 34% 30%, #E4E5FF, var(--brand-a) 48%, var(--brand-c) 100%);
20
+ --shadow-sm: 0 1px 2px rgba(10,10,12,.04), 0 1px 3px rgba(10,10,12,.05);
21
+ --shadow-md: 0 1px 2px rgba(10,10,12,.04), 0 12px 32px -12px rgba(10,10,12,.16);
22
+ --shadow-lg: 0 1px 2px rgba(10,10,12,.04), 0 24px 60px -24px rgba(10,10,12,.30), 0 40px 80px -40px rgba(79,70,229,.25);
23
+ --ease: cubic-bezier(.16,1,.3,1);
24
+ --sans: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
25
+ --disp: "Inter Tight", var(--sans);
26
+ --mono: "IBM Plex Mono", ui-monospace, monospace;
27
+ --r: 18px;
28
+ }
29
+ * { box-sizing: border-box; }
30
+ [hidden] { display: none !important; }
31
+ html, body { margin: 0; background: var(--canvas); color: var(--ink); font: 15px/1.5 var(--sans); -webkit-font-smoothing: antialiased; }
32
+ a { color: var(--accent); }
33
+ button, input, select, textarea { font: inherit; color: inherit; }
34
+ svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; flex: none; }
35
+ .mono { font-family: var(--mono); }
36
+ code { font: 12.5px var(--mono); background: var(--soft); border: 1px solid var(--line); padding: 1px 6px; border-radius: 6px; }
37
+ .sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
38
+ .meta { color: var(--meta); }
39
+ .skip { position: absolute; left: -999px; top: 8px; background: var(--ink); color: #fff; padding: 8px 14px; border-radius: 99px; z-index: 50; }
40
+ .skip:focus { left: 8px; }
41
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
42
+
43
+ /* ── shell ── */
44
+ .shell { display: grid; grid-template-columns: 252px 1fr; min-height: 100vh; min-height: 100dvh; }
45
+ .side { position: sticky; top: 0; height: 100vh; height: 100dvh; display: flex; flex-direction: column; gap: 28px; padding: 26px 18px 20px; background: var(--card); border-right: 1px solid var(--line); }
46
+ .brand { display: flex; align-items: center; gap: 10px; padding: 0 8px; }
47
+ .brand .wm { width: 46px; height: 20px; stroke-width: 0; color: var(--ink); }
48
+ .brand .wm path { stroke: currentColor; }
49
+ .brand-name { font: 500 15px var(--disp); letter-spacing: -.01em; color: var(--ink2); }
50
+ .ver { margin-left: auto; font-size: 11px; color: var(--meta); background: var(--soft); border: 1px solid var(--line); border-radius: 99px; padding: 1px 7px; }
51
+ .nav { display: flex; flex-direction: column; gap: 2px; }
52
+ .nav a { display: flex; align-items: center; gap: 11px; padding: 9px 10px; border-radius: 11px; color: var(--ink2); text-decoration: none; font-weight: 500; transition: background .15s, color .15s; }
53
+ .nav a:hover { background: var(--hover); color: var(--ink); }
54
+ .nav a[aria-current="page"] { background: var(--tint); color: var(--accent-ink); }
55
+ .nav a[aria-current="page"] svg { color: var(--accent); }
56
+ .nav-badge { margin-left: auto; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 99px; background: var(--accent); color: #fff; font: 600 11px/20px var(--mono); text-align: center; }
57
+ .side-foot { margin-top: auto; display: flex; flex-direction: column; gap: 10px; }
58
+ .status-card { display: flex; gap: 11px; align-items: center; padding: 12px; border-radius: 14px; background: var(--soft); border: 1px solid var(--line); }
59
+ .status-dot { width: 28px; height: 28px; border-radius: 50%; background: var(--orb); box-shadow: 0 0 0 4px var(--tint); flex: none; }
60
+ .status-dot.demo { background: radial-gradient(circle at 34% 30%, #FFF3D6, #E9A23B 55%, #A86A12 100%); box-shadow: 0 0 0 4px var(--warn-tint); }
61
+ .status-text { display: flex; flex-direction: column; min-width: 0; }
62
+ .status-text b { font: 600 14px var(--disp); }
63
+ .status-text span { font-size: 11.5px; color: var(--meta); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
64
+ .side-link { font-size: 13.5px; color: var(--meta); text-align: center; text-decoration: none; padding: 4px; }
65
+ .side-link:hover { color: var(--ink); }
66
+
67
+ .main { padding: 40px clamp(20px, 4vw, 56px) 72px; min-width: 0; outline: none; }
68
+ #page { max-width: 1160px; margin: 0 auto; animation: rise .45s var(--ease); }
69
+ @keyframes rise { from { opacity: 0; transform: translateY(6px); } }
70
+
71
+ /* ── page header ── */
72
+ .ph { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; flex-wrap: wrap; margin-bottom: 28px; }
73
+ .eyebrow { margin: 0 0 6px; font: 500 11.5px var(--mono); letter-spacing: .14em; text-transform: uppercase; color: var(--accent); }
74
+ h1 { margin: 0; font: 300 clamp(30px, 3.4vw, 40px)/1.08 var(--disp); letter-spacing: -.03em; }
75
+ .ph p.sub { margin: 8px 0 0; color: var(--ink2); max-width: 620px; }
76
+ h2 { margin: 0; font: 500 18px/1.25 var(--disp); letter-spacing: -.01em; }
77
+ h3 { margin: 0; font: 600 15px var(--disp); }
78
+ .row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
79
+ .row.end { justify-content: flex-end; }
80
+ .grow { flex: 1; }
81
+
82
+ /* ── buttons ── */
83
+ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; height: 40px; padding: 0 18px; border-radius: 99px; border: 1px solid transparent; font: 600 14px var(--disp); text-decoration: none; cursor: pointer; white-space: nowrap; transition: background .15s, border-color .15s, transform .15s var(--ease); }
84
+ .btn:active { transform: scale(.98); }
85
+ .btn svg { width: 16px; height: 16px; }
86
+ .btn.ink { background: var(--ink); color: #fff; }
87
+ .btn.ink:hover { background: #24242C; }
88
+ .btn.accent { background: var(--accent); color: #fff; }
89
+ .btn.accent:hover { background: var(--accent-ink); }
90
+ .btn.ghost { background: var(--card); color: var(--ink); border-color: var(--edge); }
91
+ .btn.ghost:hover { border-color: #C6C6D0; background: var(--soft); }
92
+ .btn.danger { background: var(--err); color: #fff; }
93
+ .btn.sm { height: 32px; padding: 0 13px; font-size: 13px; }
94
+ .btn.block { width: 100%; }
95
+ .btn:disabled { opacity: .5; cursor: not-allowed; }
96
+ .icon-btn { width: 34px; height: 34px; display: inline-grid; place-items: center; border-radius: 10px; border: 1px solid transparent; background: transparent; cursor: pointer; color: var(--ink2); }
97
+ .icon-btn:hover { background: var(--hover); color: var(--ink); }
98
+ .icon-btn.danger:hover { background: var(--err-tint); color: var(--err); }
99
+ .icon-btn svg { width: 16px; height: 16px; }
100
+
101
+ /* ── cards ── */
102
+ .card { background: var(--card); border: 1px solid var(--line); border-radius: var(--r); box-shadow: var(--shadow-sm); }
103
+ .card-pad { padding: 22px 24px; }
104
+ .card-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 18px 22px; border-bottom: 1px solid var(--line); }
105
+ .card-head .meta { font-size: 13px; color: var(--meta); }
106
+ .grid { display: grid; gap: 16px; }
107
+ .g2 { grid-template-columns: 1.35fr 1fr; }
108
+ .g4 { grid-template-columns: repeat(4, 1fr); }
109
+ .gcards { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); }
110
+ .stack { display: flex; flex-direction: column; gap: 16px; }
111
+
112
+ /* hero: the agent's state, like the call's connect screen */
113
+ .hero { position: relative; overflow: hidden; display: grid; grid-template-columns: auto 1fr auto; gap: 26px; align-items: center; padding: 30px 32px; border-radius: 22px; color: #fff; background: #0B0B12; box-shadow: var(--shadow-lg); }
114
+ .hero::before { content: ""; position: absolute; inset: -40% -10% auto auto; width: 520px; height: 520px; background: radial-gradient(closest-side, rgba(99,102,241,.45), transparent 70%); pointer-events: none; }
115
+ .hero.demo::before { background: radial-gradient(closest-side, rgba(233,162,59,.30), transparent 70%); }
116
+ .hero > * { position: relative; }
117
+ .orb { width: 76px; height: 76px; border-radius: 50%; background: var(--orb); box-shadow: 0 0 60px rgba(124,108,246,.55); animation: breathe 3.2s ease-in-out infinite; }
118
+ .hero.demo .orb { background: radial-gradient(circle at 34% 30%, #FFF3D6, #E9A23B 55%, #A86A12 100%); box-shadow: 0 0 60px rgba(233,162,59,.4); }
119
+ @keyframes breathe { 50% { transform: scale(1.05); } }
120
+ .hero .eyebrow { color: #A5A0FF; }
121
+ .hero.demo .eyebrow { color: #F2C779; }
122
+ .hero h2 { font: 300 30px/1.1 var(--disp); letter-spacing: -.02em; }
123
+ .hero p { margin: 8px 0 0; color: #C3C3D1; max-width: 560px; }
124
+ .hero p code { background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.14); color: #fff; }
125
+ .hero .btn.ghost { background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.16); color: #fff; }
126
+ .hero .btn.ghost:hover { background: rgba(255,255,255,.14); }
127
+ .hero .btn.light { background: #fff; color: var(--ink); }
128
+
129
+ /* stat tiles */
130
+ .stat { padding: 20px 22px; }
131
+ .stat .label { font: 500 11px var(--mono); letter-spacing: .12em; text-transform: uppercase; color: var(--meta); }
132
+ .stat .value { margin-top: 10px; font: 300 38px/1 var(--disp); letter-spacing: -.03em; }
133
+ .stat .value small { font-size: 16px; color: var(--meta); letter-spacing: 0; }
134
+ .stat .foot { margin-top: 10px; font-size: 13px; color: var(--meta); min-height: 20px; }
135
+ .meter { height: 6px; margin-top: 12px; border-radius: 99px; background: var(--soft); overflow: hidden; }
136
+ .meter i { display: block; height: 100%; border-radius: 99px; background: var(--accent); transition: width .5s var(--ease); }
137
+ .meter.hot i { background: var(--err); }
138
+
139
+ /* checklist */
140
+ .check { list-style: none; margin: 0; padding: 6px 0; }
141
+ .check li { display: flex; gap: 14px; align-items: flex-start; padding: 12px 22px; }
142
+ .check .tick { width: 22px; height: 22px; flex: none; border-radius: 50%; display: grid; place-items: center; border: 1.5px solid var(--edge); margin-top: 1px; }
143
+ .check .done .tick { background: var(--ok); border-color: var(--ok); color: #fff; }
144
+ .check .tick svg { width: 13px; height: 13px; stroke-width: 2.4; }
145
+ .check .done .ctext b { color: var(--meta); text-decoration: line-through; text-decoration-color: var(--edge); font-weight: 500; }
146
+ .check .ctext { display: flex; flex-direction: column; gap: 2px; }
147
+ .check .ctext b { font-weight: 600; font-size: 14.5px; }
148
+ .check .ctext span { font-size: 13px; color: var(--meta); }
149
+ .progress-ring { font: 500 12px var(--mono); color: var(--meta); }
150
+
151
+ /* tables */
152
+ .table-wrap { overflow-x: auto; }
153
+ table { width: 100%; border-collapse: collapse; font-size: 14px; }
154
+ th { text-align: left; font: 500 11px var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--meta); padding: 12px 22px; border-bottom: 1px solid var(--line); white-space: nowrap; }
155
+ td { padding: 13px 22px; border-bottom: 1px solid var(--line); vertical-align: middle; white-space: nowrap; }
156
+ tr:last-child td { border-bottom: 0; }
157
+ tbody tr:hover td { background: var(--soft); }
158
+ td.num, th.num { text-align: right; font-family: var(--mono); font-size: 13px; }
159
+ .who { display: flex; align-items: center; gap: 10px; }
160
+ .who b { font-weight: 600; }
161
+ .who span { color: var(--meta); font-size: 13px; }
162
+ .dot { width: 9px; height: 9px; border-radius: 50%; flex: none; background: var(--accent); }
163
+
164
+ /* chips and badges */
165
+ .chip { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 10px; border-radius: 99px; background: var(--soft); border: 1px solid var(--line); font-size: 12.5px; font-weight: 500; color: var(--ink2); white-space: nowrap; }
166
+ .badge { display: inline-flex; align-items: center; gap: 6px; height: 22px; padding: 0 9px; border-radius: 99px; font: 500 11.5px var(--mono); white-space: nowrap; }
167
+ .badge::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
168
+ .badge.ok { color: var(--ok); background: var(--ok-tint); }
169
+ .badge.warn { color: var(--warn); background: var(--warn-tint); }
170
+ .badge.err { color: var(--err); background: var(--err-tint); }
171
+ .badge.mute { color: var(--meta); background: var(--soft); }
172
+ .badge.live { color: var(--accent-ink); background: var(--tint); }
173
+ .badge.live::before { animation: blink 1.4s ease-in-out infinite; }
174
+ @keyframes blink { 50% { opacity: .25; } }
175
+ .steps-bar { display: inline-flex; gap: 3px; vertical-align: middle; }
176
+ .steps-bar i { width: 14px; height: 5px; border-radius: 99px; background: var(--line); }
177
+ .steps-bar i.on { background: var(--ok); }
178
+
179
+ /* banners */
180
+ .banner { display: flex; gap: 12px; align-items: flex-start; padding: 14px 18px; border-radius: 14px; margin-bottom: 18px; font-size: 14px; border: 1px solid; }
181
+ .banner svg { margin-top: 1px; }
182
+ .banner.info { background: var(--tint); border-color: var(--tintline); color: var(--accent-ink); }
183
+ .banner.warn { background: var(--warn-tint); border-color: var(--warn-line); color: var(--warn); }
184
+ .banner.err { background: var(--err-tint); border-color: var(--err-line); color: var(--err); }
185
+ .banner b { font-weight: 600; }
186
+
187
+ /* empty states */
188
+ .empty { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 10px; padding: 46px 24px; color: var(--meta); }
189
+ .empty .glyph { width: 52px; height: 52px; border-radius: 16px; display: grid; place-items: center; background: var(--soft); border: 1px solid var(--line); color: var(--ink2); }
190
+ .empty .glyph svg { width: 22px; height: 22px; }
191
+ .empty h3 { color: var(--ink); font-size: 16px; }
192
+ .empty p { margin: 0; max-width: 380px; font-size: 14px; }
193
+
194
+ /* tabs */
195
+ .tabs { display: inline-flex; gap: 4px; padding: 4px; border-radius: 99px; background: var(--card); border: 1px solid var(--line); margin-bottom: 16px; }
196
+ .tabs button { height: 34px; padding: 0 16px; border: 0; border-radius: 99px; background: transparent; cursor: pointer; font-weight: 500; color: var(--ink2); }
197
+ .tabs button[aria-selected="true"] { background: var(--ink); color: #fff; }
198
+
199
+ /* link cards */
200
+ .lcard { display: flex; flex-direction: column; }
201
+ .lcard-top { display: flex; gap: 12px; align-items: flex-start; padding: 20px 22px 14px; }
202
+ .lcard-top .who { flex: 1; min-width: 0; }
203
+ .lcard-title { display: flex; flex-direction: column; min-width: 0; }
204
+ .lcard-title b { font: 600 16px var(--disp); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
205
+ .lcard-meta { display: flex; gap: 6px; flex-wrap: wrap; padding: 0 22px 14px; }
206
+ .urlbox { display: flex; align-items: center; gap: 4px; margin: 0 22px 16px; padding: 4px 4px 4px 12px; border-radius: 12px; background: var(--soft); border: 1px solid var(--line); }
207
+ .urlbox span { flex: 1; min-width: 0; font: 12.5px var(--mono); color: var(--ink2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
208
+ .lcard-foot { display: flex; align-items: center; gap: 4px; margin-top: auto; padding: 10px 14px 10px 22px; border-top: 1px solid var(--line); font-size: 13px; color: var(--meta); }
209
+ .lcard-foot .grow { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
210
+ .lcard.off { opacity: .72; }
211
+
212
+ /* playbook cards */
213
+ .pcard { position: relative; display: flex; flex-direction: column; overflow: hidden; }
214
+ .pcard::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 4px; background: var(--pc, var(--accent)); }
215
+ .pcard-body { padding: 22px 22px 16px; display: flex; flex-direction: column; gap: 8px; flex: 1; }
216
+ .pcard-body .cat { font: 500 11px var(--mono); letter-spacing: .1em; text-transform: uppercase; color: var(--meta); }
217
+ .pcard-body b { font: 500 20px var(--disp); letter-spacing: -.01em; }
218
+ .pcard-body p { margin: 0; font-size: 13.5px; color: var(--ink2); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
219
+ .journey { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
220
+ .journey span { font-size: 12px; color: var(--ink2); background: var(--soft); border: 1px solid var(--line); border-radius: 7px; padding: 1px 7px; }
221
+ .pcard-foot { display: flex; align-items: center; gap: 6px; padding: 10px 14px 10px 22px; border-top: 1px solid var(--line); font-size: 13px; color: var(--meta); }
222
+
223
+ /* forms */
224
+ .field { display: flex; flex-direction: column; gap: 7px; }
225
+ .field > label, .field > .label { font-weight: 600; font-size: 14px; }
226
+ .field .hint { margin: 0; color: var(--meta); font-size: 13px; }
227
+ .opt { font-weight: 400; color: var(--meta); }
228
+ input[type=text], input[type=url], input[type=number], input[type=date], select, textarea { width: 100%; min-height: 42px; padding: 9px 13px; border: 1px solid var(--edge); border-radius: 11px; background: #fff; font-size: 14.5px; transition: border-color .15s, box-shadow .15s; }
229
+ textarea { resize: vertical; min-height: 76px; line-height: 1.45; }
230
+ input:focus-visible, select:focus-visible, textarea:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 4px var(--tint); }
231
+ input.mono-in { font-family: var(--mono); font-size: 13.5px; }
232
+ .color-in { display: flex; gap: 8px; align-items: center; }
233
+ .color-in input[type=color] { width: 42px; height: 42px; padding: 3px; border: 1px solid var(--edge); border-radius: 11px; background: #fff; cursor: pointer; }
234
+ .fgrid { display: grid; gap: 16px; grid-template-columns: 1fr 1fr; }
235
+ .fgrid .wide { grid-column: 1 / -1; }
236
+ .choice { display: grid; gap: 10px; grid-template-columns: 1fr 1fr; }
237
+ .choice label { position: relative; display: flex; gap: 12px; padding: 14px 16px; border: 1px solid var(--edge); border-radius: 14px; cursor: pointer; background: #fff; transition: border-color .15s, box-shadow .15s; }
238
+ .choice label:has(input:checked) { border-color: var(--accent); box-shadow: 0 0 0 4px var(--tint); }
239
+ .choice label:has(input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }
240
+ .choice input { accent-color: var(--accent); margin: 3px 0 0; }
241
+ .choice b { display: block; font-weight: 600; font-size: 14px; }
242
+ .choice span { display: block; font-size: 13px; color: var(--meta); }
243
+ .toggle { display: flex; gap: 12px; align-items: flex-start; padding: 12px 0; border-top: 1px solid var(--line); cursor: pointer; }
244
+ .toggle:first-child { border-top: 0; }
245
+ .toggle input { appearance: none; width: 38px; height: 22px; flex: none; border-radius: 99px; background: var(--edge); position: relative; cursor: pointer; transition: background .2s; margin: 1px 0 0; }
246
+ .toggle input::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: #fff; box-shadow: var(--shadow-sm); transition: transform .2s var(--ease); }
247
+ .toggle input:checked { background: var(--accent); }
248
+ .toggle input:checked::after { transform: translateX(16px); }
249
+ .toggle b { display: block; font-weight: 600; font-size: 14px; }
250
+ .toggle span { display: block; font-size: 13px; color: var(--meta); }
251
+ .errors { margin: 0; padding: 12px 16px 12px 34px; border-radius: 12px; background: var(--err-tint); border: 1px solid var(--err-line); color: var(--err); font-size: 13.5px; }
252
+ .errors:empty { display: none; }
253
+ .section-title { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin: 6px 0 2px; }
254
+ .section-title h3 { font: 500 16px var(--disp); }
255
+ .section-title span { font-size: 13px; color: var(--meta); }
256
+
257
+ /* row editors (journey, knowledge) */
258
+ .rows { display: flex; flex-direction: column; gap: 8px; }
259
+ .erow { display: grid; grid-template-columns: 28px 1fr 1.6fr 34px; gap: 8px; align-items: start; padding: 8px; border-radius: 14px; background: var(--soft); border: 1px solid var(--line); }
260
+ .erow.kb { grid-template-columns: 1fr 2fr 34px; }
261
+ .erow .n { height: 42px; display: grid; place-items: center; font: 500 12px var(--mono); color: var(--meta); }
262
+ .erow textarea { min-height: 42px; }
263
+ .add-row { align-self: flex-start; }
264
+
265
+ /* playbook editor layout */
266
+ .editor { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 20px; align-items: start; }
267
+ .editor .side-panel { position: sticky; top: 24px; display: flex; flex-direction: column; gap: 14px; }
268
+ .preview-card { overflow: hidden; }
269
+ .preview-card .pv-top { padding: 18px 20px; color: #fff; background: #0B0B12; position: relative; overflow: hidden; }
270
+ .preview-card .pv-top::after { content: ""; position: absolute; right: -60px; top: -60px; width: 200px; height: 200px; border-radius: 50%; background: radial-gradient(closest-side, var(--pc, #6366F1), transparent 70%); opacity: .6; }
271
+ .preview-card .pv-top b { font: 300 22px var(--disp); display: block; position: relative; }
272
+ .preview-card .pv-top span { font-size: 13px; color: #C3C3D1; position: relative; }
273
+ .pv-steps { list-style: none; margin: 0; padding: 14px 20px; display: flex; flex-direction: column; gap: 8px; counter-reset: s; }
274
+ .pv-steps li { counter-increment: s; display: flex; gap: 10px; align-items: center; font-size: 13.5px; }
275
+ .pv-steps li::before { content: counter(s); width: 22px; height: 22px; flex: none; border-radius: 50%; display: grid; place-items: center; font: 500 11px var(--mono); border: 1.5px solid var(--edge); color: var(--meta); }
276
+ .pv-steps li:first-child::before { border-color: var(--pc, var(--accent)); color: var(--pc, var(--accent)); }
277
+ details.json summary { cursor: pointer; padding: 14px 20px; font-weight: 600; font-size: 14px; }
278
+ details.json pre { margin: 0; padding: 0 20px 18px; max-height: 340px; overflow: auto; font: 12px/1.5 var(--mono); color: var(--ink2); white-space: pre-wrap; word-break: break-word; }
279
+ .validity { display: flex; gap: 10px; align-items: center; padding: 14px 18px; font-size: 14px; }
280
+ .validity.ok { color: var(--ok); }
281
+ .validity.bad { color: var(--err); }
282
+
283
+ /* settings */
284
+ .dl { display: grid; grid-template-columns: minmax(150px, 220px) 1fr; margin: 0; }
285
+ .dl dt, .dl dd { padding: 13px 22px; border-bottom: 1px solid var(--line); margin: 0; }
286
+ .dl dt { color: var(--meta); font-size: 14px; }
287
+ .dl dd { font-weight: 500; word-break: break-word; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
288
+ .dl dd .env { font: 11.5px var(--mono); color: var(--meta); margin-left: auto; }
289
+ .dl > :nth-last-child(-n+2) { border-bottom: 0; }
290
+
291
+ /* drawer */
292
+ .scrim { position: fixed; inset: 0; background: rgba(10,10,12,.32); backdrop-filter: blur(2px); z-index: 20; animation: fade .2s; }
293
+ @keyframes fade { from { opacity: 0; } }
294
+ .drawer { position: fixed; top: 0; right: 0; bottom: 0; width: min(560px, 100vw); background: var(--canvas); z-index: 21; display: flex; flex-direction: column; box-shadow: -30px 0 80px -30px rgba(10,10,12,.35); animation: slide .35s var(--ease); }
295
+ @keyframes slide { from { transform: translateX(40px); opacity: 0; } }
296
+ .drawer-head { display: flex; justify-content: space-between; align-items: flex-start; padding: 24px 26px 18px; background: var(--card); border-bottom: 1px solid var(--line); }
297
+ .drawer-head h2 { font: 300 26px var(--disp); letter-spacing: -.02em; }
298
+ .drawer-body { flex: 1; overflow-y: auto; padding: 22px 26px 26px; display: flex; flex-direction: column; gap: 18px; }
299
+ .drawer-foot { position: sticky; bottom: -26px; margin: auto -26px -26px; padding: 16px 26px; background: var(--card); border-top: 1px solid var(--line); display: flex; gap: 10px; justify-content: flex-end; }
300
+
301
+ dialog.confirm { border: 0; border-radius: 20px; padding: 26px; width: min(440px, calc(100vw - 32px)); box-shadow: var(--shadow-lg); }
302
+ dialog.confirm::backdrop { background: rgba(10,10,12,.32); }
303
+ dialog.confirm h2 { font: 400 22px var(--disp); }
304
+ dialog.confirm p { color: var(--ink2); margin: 10px 0 22px; }
305
+
306
+ .toast { position: fixed; left: 50%; bottom: 26px; transform: translateX(-50%); background: var(--ink); color: #fff; padding: 11px 18px; border-radius: 99px; font-weight: 500; font-size: 14px; box-shadow: var(--shadow-lg); z-index: 40; animation: rise .3s var(--ease); }
307
+ .toast.err { background: var(--err); }
308
+
309
+ .skeleton { height: 140px; border-radius: var(--r); background: linear-gradient(90deg, var(--card), var(--soft), var(--card)); background-size: 200% 100%; animation: shimmer 1.2s infinite; }
310
+ @keyframes shimmer { to { background-position: -200% 0; } }
311
+
312
+ @media (max-width: 1100px) { .g4 { grid-template-columns: repeat(2, 1fr); } .editor { grid-template-columns: 1fr; } .editor .side-panel { position: static; } }
313
+ @media (max-width: 860px) {
314
+ .shell { grid-template-columns: minmax(0, 1fr); }
315
+ .side { min-width: 0; position: sticky; z-index: 10; height: auto; flex-direction: row; align-items: center; gap: 10px; padding: 10px 14px; border-right: 0; border-bottom: 1px solid var(--line); }
316
+ .brand-name, .ver, .side-foot .status-card, .side-link { display: none; }
317
+ .nav { flex-direction: row; overflow-x: auto; flex: 1; min-width: 0; scrollbar-width: none; }
318
+ .nav a { padding: 8px 10px; white-space: nowrap; }
319
+ .nav a span { display: none; }
320
+ .nav a[aria-current="page"] span { display: inline; }
321
+ .side-foot { margin: 0; }
322
+ .side-foot .btn { height: 34px; padding: 0 12px; font-size: 13px; }
323
+ .g2, .fgrid, .choice { grid-template-columns: 1fr; }
324
+ .hero { grid-template-columns: 1fr; padding: 24px; }
325
+ .orb { width: 56px; height: 56px; }
326
+ .main { padding: 24px 16px 56px; }
327
+ .erow { grid-template-columns: 1fr 34px; }
328
+ .erow .n { display: none; }
329
+ .erow > :nth-child(2), .erow > :nth-child(3) { grid-column: 1; }
330
+ .erow > :last-child { grid-column: 2; grid-row: 1; }
331
+ .dl { grid-template-columns: 1fr; }
332
+ .dl dt { border-bottom: 0; padding-bottom: 0; }
333
+ }
334
+ @media (max-width: 520px) { .g4 { grid-template-columns: 1fr; } }
335
+ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important; } }
336
+
337
+ /* settings editor */
338
+ .srow { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: 20px; align-items: start; padding: 16px 22px; border-bottom: 1px solid var(--line); transition: background .2s; }
339
+ .srow:last-child { border-bottom: 0; }
340
+ .srow.dirty { background: var(--tint); }
341
+ .slabel label { font-weight: 600; font-size: 14.5px; }
342
+ .slabel .hint { margin-top: 2px; }
343
+ .env { font: 11.5px var(--mono); color: var(--meta); }
344
+ .sctl { display: flex; flex-direction: column; gap: 8px; }
345
+ .secret-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; min-height: 42px; }
346
+ .secret-state { display: flex; align-items: center; gap: 8px; }
347
+ .savebar { position: sticky; bottom: 16px; z-index: 5; margin-top: 18px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 12px 14px 12px 20px; border-radius: 16px; background: var(--ink); color: #fff; box-shadow: var(--shadow-lg); animation: rise .3s var(--ease); }
348
+ .savebar > span { flex: 1; }
349
+ .savebar .btn.ghost { background: transparent; color: #fff; border-color: rgba(255,255,255,.25); }
350
+ .savebar .errors { flex-basis: 100%; order: 5; }
351
+ @media (max-width: 860px) { .srow { grid-template-columns: 1fr; gap: 10px; } }
352
+
353
+ /* calls: filters, clickable rows, detail */
354
+ .filters { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
355
+ .filters input[type=search] { flex: 1; min-width: 220px; min-height: 40px; padding: 8px 14px; border: 1px solid var(--edge); border-radius: 99px; background: #fff; font-size: 14px; }
356
+ .filters input[type=search]:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 4px var(--tint); }
357
+ .filters select { width: auto; min-height: 40px; border-radius: 99px; padding: 6px 14px; font-size: 14px; }
358
+ tr.clickable { cursor: pointer; }
359
+ tr.clickable:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
360
+ .convo { list-style: none; margin: 0; padding: 16px 22px 20px; display: flex; flex-direction: column; gap: 14px; max-height: 640px; overflow-y: auto; }
361
+ .convo li { display: flex; flex-direction: column; gap: 3px; max-width: 88%; }
362
+ .convo li p { margin: 0; padding: 10px 14px; border-radius: 14px; background: var(--soft); border: 1px solid var(--line); font-size: 14.5px; }
363
+ .convo li.user { align-self: flex-end; align-items: flex-end; }
364
+ .convo li.user p { background: var(--ink); color: #fff; border-color: var(--ink); }
365
+ .convo li.specialist p { background: var(--ok-tint); border-color: #BDE7CC; }
366
+ .convo li.system { align-self: center; max-width: 100%; }
367
+ .convo li.system p { background: transparent; border: 0; color: var(--meta); font-size: 13px; padding: 0; text-align: center; }
368
+ .who-l { display: flex; gap: 8px; align-items: baseline; font: 600 12px var(--sans); color: var(--ink2); }
369
+ .who-l .mono { font-weight: 400; font-size: 11px; color: var(--meta); }
370
+ .hl { margin: 12px 0 0; padding-left: 18px; color: var(--ink2); font-size: 14px; }
371
+ .jsteps { list-style: none; margin: 0; padding: 12px 22px 16px; display: flex; flex-direction: column; gap: 10px; }
372
+ .jsteps li { display: flex; gap: 12px; align-items: center; font-size: 14.5px; color: var(--meta); }
373
+ .jsteps li.done { color: var(--ink); }
374
+ .jsteps .tick { width: 22px; height: 22px; flex: none; border-radius: 50%; display: grid; place-items: center; border: 1.5px solid var(--edge); }
375
+ .jsteps li.done .tick { background: var(--ok); border-color: var(--ok); color: #fff; }
376
+ .jsteps .tick svg { width: 13px; height: 13px; stroke-width: 2.4; }
377
+
378
+ /* who's signed in */
379
+ .me { display: flex; align-items: center; gap: 8px; padding: 8px 6px 8px 10px; border-radius: 14px; border: 1px solid var(--line); }
380
+ .avatar { width: 30px; height: 30px; flex: none; border-radius: 50%; display: grid; place-items: center; background: var(--tint); color: var(--accent-ink); font: 600 12px var(--disp); }
381
+ .me-text { display: flex; flex-direction: column; min-width: 0; flex: 1; }
382
+ .me-text b { font-size: 13.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
383
+ .me-text span { font-size: 11px; color: var(--meta); }
384
+ .me .icon-btn { width: 30px; height: 30px; }
385
+ .nav-badge.warn { background: #C2410C; }
386
+ /* inbox */
387
+ .waiting { display: flex; align-items: center; gap: 16px; padding: 18px 22px; border-bottom: 1px solid var(--line); }
388
+ .waiting:last-child { border-bottom: 0; }
389
+ .waiting .pulse { width: 12px; height: 12px; flex: none; border-radius: 50%; background: #C2410C; box-shadow: 0 0 0 0 rgba(194,65,12,.5); animation: pulse 1.6s infinite; }
390
+ .waiting.taken .pulse { background: var(--ok); animation: none; }
391
+ @keyframes pulse { 70% { box-shadow: 0 0 0 10px rgba(194,65,12,0); } 100% { box-shadow: 0 0 0 0 rgba(194,65,12,0); } }
392
+ .waiting-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
393
+ .waiting-main b { font: 600 16px var(--disp); }
394
+ .waiting-main span { font-size: 13.5px; color: var(--ink2); }
395
+ .waiting-main q { color: var(--ink); font-style: italic; }
396
+ .secret-once { display: flex; gap: 8px; align-items: center; padding: 12px 14px; border-radius: 12px; background: var(--ok-tint); border: 1px solid #BDE7CC; font-size: 14px; }
397
+ .secret-once code { font-size: 14px; background: #fff; }
398
+
399
+ /* analytics */
400
+ .g5 { grid-template-columns: repeat(5, 1fr); }
401
+ .g5 .stat .value { font-size: 32px; }
402
+ .colchart { position: relative; padding: 20px 22px 34px 52px; }
403
+ .cc-plot { position: relative; height: 200px; }
404
+ .cc-grid { position: absolute; left: 0; right: 0; border-top: 1px solid var(--line); }
405
+ .cc-grid span { position: absolute; right: calc(100% + 10px); top: -9px; font: 11.5px var(--mono); color: var(--meta); }
406
+ .cc-cols { position: absolute; inset: 0; display: flex; align-items: flex-end; gap: 2px; }
407
+ .cc-col { position: relative; flex: 1; height: 100%; display: flex; align-items: flex-end; justify-content: center; outline: none; border-radius: 6px; }
408
+ .cc-col:hover, .cc-col:focus-visible { background: var(--tint); }
409
+ .cc-col:focus-visible { box-shadow: 0 0 0 2px var(--accent); }
410
+ .cc-col i { display: block; width: 100%; max-width: 24px; min-height: 0; background: var(--accent); border-radius: 4px 4px 0 0; }
411
+ .cc-x { position: absolute; top: calc(100% + 8px); left: 50%; transform: translateX(-50%); font: 11px var(--mono); color: var(--meta); white-space: nowrap; }
412
+ .cc-tip { position: absolute; top: 4px; z-index: 3; display: flex; flex-direction: column; gap: 2px; padding: 9px 12px; border-radius: 10px; background: var(--ink); color: #fff; font-size: 12.5px; box-shadow: var(--shadow-md); pointer-events: none; white-space: nowrap; }
413
+ .cc-tip b { font-weight: 600; }
414
+ .funnel { list-style: none; margin: 0; padding: 14px 22px 20px; display: flex; flex-direction: column; gap: 14px; }
415
+ .funnel li { display: grid; grid-template-columns: minmax(140px, 260px) 1fr 52px; gap: 14px; align-items: center; }
416
+ .fn-step { display: flex; gap: 10px; align-items: center; font-size: 14.5px; }
417
+ .fn-step .mono { font-size: 12px; color: var(--meta); }
418
+ .fn-bar { height: 14px; border-radius: 4px; background: var(--soft); overflow: hidden; }
419
+ .fn-bar i { display: block; height: 100%; background: var(--accent); border-radius: 0 4px 4px 0; }
420
+ .fn-val { text-align: right; font-size: 13px; }
421
+ .fn-note { grid-column: 1 / -1; display: flex; gap: 8px; align-items: center; padding: 8px 12px; border-radius: 10px; background: var(--warn-tint); border: 1px solid var(--warn-line); color: var(--warn); font-size: 13.5px; }
422
+ .funnel li.stuck .fn-step { font-weight: 600; }
423
+ @media (max-width: 1100px) { .g5 { grid-template-columns: repeat(3, 1fr); } }
424
+ @media (max-width: 860px) { .g5 { grid-template-columns: repeat(2, 1fr); } .funnel li { grid-template-columns: 1fr 46px; } .fn-bar { grid-column: 1 / -1; grid-row: 2; } .colchart { padding-left: 40px; } }
425
+
426
+ /* embed preview */
427
+ .embed-preview { display: flex; justify-content: flex-end; padding: 26px 20px; border-radius: 14px; background: repeating-linear-gradient(45deg, var(--soft), var(--soft) 10px, #fff 10px, #fff 20px); border: 1px solid var(--line); }
428
+ .embed-btn { --c: #4F46E5; display: inline-flex; align-items: center; gap: 10px; height: 48px; padding: 0 20px 0 8px; border-radius: 99px; background: #0B0B12; color: #fff; font: 600 15px var(--disp); box-shadow: 0 10px 30px -10px rgba(0,0,0,.45); }
429
+ .embed-btn i { width: 32px; height: 32px; border-radius: 50%; background: radial-gradient(circle at 34% 30%, #fff 0%, var(--c) 55%, #0B0B12 140%); box-shadow: 0 0 18px var(--c); }
430
+ pre.code { margin: 0; padding: 12px 14px; border-radius: 12px; background: var(--ink); color: #E4E5FF; font: 12.5px/1.5 var(--mono); white-space: pre-wrap; word-break: break-all; }
@@ -0,0 +1,76 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
7
+ <title>Ava · Dashboard</title>
8
+ <link rel="preload" href="/fonts/inter-tight-var.woff2" as="font" type="font/woff2" crossorigin>
9
+ <link rel="preload" href="/fonts/inter-var.woff2" as="font" type="font/woff2" crossorigin>
10
+ <link rel="stylesheet" href="/dashboard.css">
11
+ </head>
12
+ <body>
13
+ <a class="skip" href="#main">Skip to content</a>
14
+
15
+ <div class="shell">
16
+ <aside class="side" aria-label="Dashboard">
17
+ <div class="brand">
18
+ <svg class="wm" viewBox="0 0 66 27.8" role="img" aria-label="Ava"><path transform="translate(1.9 1.9)" d="M0 24L9.5 0L19 24M21.6 0L31.1 24L40.6 0M43.2 24L52.7 0L62.2 24" fill="none" stroke="currentColor" stroke-width="3.8" stroke-linecap="round" stroke-linejoin="round"/></svg>
19
+ <span class="brand-name">Engine</span>
20
+ <span class="ver mono" id="ver"></span>
21
+ </div>
22
+
23
+ <nav class="nav" id="nav">
24
+ <a href="#overview" data-page="overview"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="7" height="9" rx="1.6"/><rect x="14" y="3" width="7" height="5" rx="1.6"/><rect x="14" y="12" width="7" height="9" rx="1.6"/><rect x="3" y="16" width="7" height="5" rx="1.6"/></svg><span>Overview</span></a>
25
+ <a href="#inbox" data-page="inbox"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 13.5 5.6 5.4A2 2 0 0 1 7.5 4h9a2 2 0 0 1 1.9 1.4L21 13.5V18a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4.5Z"/><path d="M3 13.5h5l1.5 2.5h5L16 13.5h5"/></svg><span>Inbox</span><b class="nav-badge warn" id="navWaiting" hidden></b></a>
26
+ <a href="#calls" data-page="calls"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 14v-2a8 8 0 0 1 16 0v2"/><rect x="2.5" y="14" width="4.5" height="6.5" rx="1.6"/><rect x="17" y="14" width="4.5" height="6.5" rx="1.6"/></svg><span>Calls</span><b class="nav-badge" id="navLive" hidden></b></a>
27
+ <a href="#analytics" data-page="analytics"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 20V10M10 20V4M16 20v-7M22 20H2"/></svg><span>Analytics</span></a>
28
+ <a href="#links" data-page="links" data-role="editor"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1"/><path d="M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"/></svg><span>Share links</span></a>
29
+ <a href="#playbooks" data-page="playbooks" data-role="editor"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 5.5A2.5 2.5 0 0 1 6.5 3H20v15H6.5A2.5 2.5 0 0 0 4 20.5z"/><path d="M4 20.5A2.5 2.5 0 0 1 6.5 18H20v3H6.5A2.5 2.5 0 0 1 4 20.5Z"/><path d="M9 8h7M9 11.5h5"/></svg><span>Playbooks</span></a>
30
+ <a href="#team" data-page="team" data-role="owner"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="9" cy="8" r="3.5"/><path d="M2.5 20a6.5 6.5 0 0 1 13 0M16 4.6a3.5 3.5 0 0 1 0 6.8M18.5 14.2A6.5 6.5 0 0 1 21.5 20"/></svg><span>Team</span></a>
31
+ <a href="#settings" data-page="settings" data-role="owner"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 6h9M17 6h3M4 12h3M11 12h9M4 18h11M19 18h1"/><circle cx="15" cy="6" r="2"/><circle cx="9" cy="12" r="2"/><circle cx="17" cy="18" r="2"/></svg><span>Settings</span></a>
32
+ </nav>
33
+
34
+ <div class="side-foot">
35
+ <div class="status-card" id="statusCard">
36
+ <span class="status-dot" id="statusDot"></span>
37
+ <div class="status-text"><b id="statusTitle">Connecting…</b><span id="statusSub" class="mono"></span></div>
38
+ </div>
39
+ <div class="me" id="me" hidden>
40
+ <span class="avatar" id="meAvatar" aria-hidden="true"></span>
41
+ <span class="me-text"><b id="meName"></b><span id="meRole" class="mono"></span></span>
42
+ <button type="button" class="icon-btn" data-action="account" aria-label="Your account" title="Your account"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z"/></svg></button>
43
+ <button type="button" class="icon-btn" data-action="signout" aria-label="Sign out" title="Sign out"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 4h3a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-3M10 17l-5-5 5-5M5 12h11"/></svg></button>
44
+ </div>
45
+ <a class="btn ink block" href="/app" target="_blank" rel="noopener"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5.5 11.5a6.5 6.5 0 0 0 13 0M12 18v3"/></svg>Test a call</a>
46
+ <a class="side-link" href="https://github.com/Mr-vero/ava-engine#readme" target="_blank" rel="noopener">Docs</a>
47
+ </div>
48
+ </aside>
49
+
50
+ <main id="main" class="main" tabindex="-1">
51
+ <div id="page"></div>
52
+ </main>
53
+ </div>
54
+
55
+ <!-- Drawer for editing a share link -->
56
+ <div class="scrim" id="scrim" hidden></div>
57
+ <aside class="drawer" id="drawer" role="dialog" aria-modal="true" aria-labelledby="drawerTitle" hidden>
58
+ <header class="drawer-head">
59
+ <div><p class="eyebrow">Share link</p><h2 id="drawerTitle">New share link</h2></div>
60
+ <button type="button" class="icon-btn" id="drawerClose" aria-label="Close"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m7 7 10 10M17 7 7 17"/></svg></button>
61
+ </header>
62
+ <form class="drawer-body" id="linkForm" novalidate></form>
63
+ </aside>
64
+
65
+ <dialog id="confirm" class="confirm" aria-labelledby="confirmTitle">
66
+ <form method="dialog">
67
+ <h2 id="confirmTitle">Are you sure?</h2>
68
+ <p id="confirmText"></p>
69
+ <div class="row end"><button value="cancel" class="btn ghost">Cancel</button><button value="ok" class="btn danger" id="confirmOk">Delete</button></div>
70
+ </form>
71
+ </dialog>
72
+
73
+ <div class="toast" id="toast" role="status" aria-live="polite" hidden></div>
74
+ <script src="/dashboard.js"></script>
75
+ </body>
76
+ </html>