ava-engine 0.3.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.
- package/README.md +20 -2
- package/lib/admin.mjs +284 -0
- package/lib/analytics.mjs +73 -0
- package/lib/calls.mjs +97 -0
- package/lib/cli/config.mjs +1 -0
- package/lib/cli/main.mjs +43 -3
- package/lib/cli/setup-server.mjs +3 -2
- package/lib/cli/setup.mjs +1 -1
- package/lib/draft.mjs +53 -0
- package/lib/guard.mjs +73 -28
- package/lib/library.mjs +76 -0
- package/lib/links.mjs +148 -0
- package/lib/mock.mjs +14 -4
- package/lib/models.mjs +10 -4
- package/lib/openrouter.mjs +4 -1
- package/lib/ours.mjs +3 -1
- package/lib/platforms.mjs +70 -8
- package/lib/playbooks.mjs +11 -2
- package/lib/safe-fetch.mjs +79 -0
- package/lib/settings.mjs +187 -0
- package/lib/spend.mjs +4 -1
- package/lib/state.mjs +35 -5
- package/lib/stt.mjs +4 -1
- package/lib/team.mjs +191 -0
- package/lib/tts.mjs +18 -11
- package/lib/webhooks.mjs +51 -7
- package/package.json +3 -3
- package/public/app.js +84 -3
- package/public/dashboard.css +430 -0
- package/public/dashboard.html +76 -0
- package/public/dashboard.js +1096 -0
- package/public/embed.js +60 -0
- package/public/index.html +17 -10
- package/public/login.css +30 -0
- package/public/login.html +37 -0
- package/public/login.js +27 -0
- package/public/setup.css +138 -57
- package/public/setup.html +40 -19
- package/public/setup.js +15 -7
- package/public/style.css +17 -0
- package/server.mjs +142 -39
|
@@ -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>
|