openvoiceui 1.0.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/.env.example +104 -0
- package/Dockerfile +30 -0
- package/LICENSE +21 -0
- package/README.md +638 -0
- package/SETUP.md +360 -0
- package/app.py +232 -0
- package/auto-approve-devices.js +111 -0
- package/cli/index.js +372 -0
- package/config/__init__.py +4 -0
- package/config/default.yaml +43 -0
- package/config/flags.yaml +67 -0
- package/config/loader.py +203 -0
- package/config/providers.yaml +71 -0
- package/config/speech_normalization.yaml +182 -0
- package/config/theme.json +4 -0
- package/data/greetings.json +25 -0
- package/default-pages/ai-image-creator.html +915 -0
- package/default-pages/bulk-image-uploader.html +492 -0
- package/default-pages/desktop.html +2865 -0
- package/default-pages/file-explorer.html +854 -0
- package/default-pages/interactive-map.html +655 -0
- package/default-pages/style-guide.html +1005 -0
- package/default-pages/website-setup.html +1623 -0
- package/deploy/openclaw/Dockerfile +46 -0
- package/deploy/openvoiceui.service +30 -0
- package/deploy/setup-nginx.sh +50 -0
- package/deploy/setup-sudo.sh +306 -0
- package/deploy/skill-runner/Dockerfile +19 -0
- package/deploy/skill-runner/requirements.txt +14 -0
- package/deploy/skill-runner/server.py +269 -0
- package/deploy/supertonic/Dockerfile +22 -0
- package/deploy/supertonic/server.py +79 -0
- package/docker-compose.pinokio.yml +11 -0
- package/docker-compose.yml +59 -0
- package/greetings.json +25 -0
- package/index.html +65 -0
- package/inject-device-identity.js +142 -0
- package/package.json +82 -0
- package/profiles/default.json +114 -0
- package/profiles/manager.py +354 -0
- package/profiles/schema.json +337 -0
- package/prompts/voice-system-prompt.md +149 -0
- package/providers/__init__.py +39 -0
- package/providers/base.py +63 -0
- package/providers/llm/__init__.py +12 -0
- package/providers/llm/base.py +71 -0
- package/providers/llm/clawdbot_provider.py +112 -0
- package/providers/llm/zai_provider.py +115 -0
- package/providers/registry.py +320 -0
- package/providers/stt/__init__.py +12 -0
- package/providers/stt/base.py +58 -0
- package/providers/stt/webspeech_provider.py +49 -0
- package/providers/stt/whisper_provider.py +100 -0
- package/providers/tts/__init__.py +20 -0
- package/providers/tts/base.py +91 -0
- package/providers/tts/groq_provider.py +74 -0
- package/providers/tts/supertonic_provider.py +72 -0
- package/requirements.txt +38 -0
- package/routes/__init__.py +10 -0
- package/routes/admin.py +515 -0
- package/routes/canvas.py +1315 -0
- package/routes/chat.py +51 -0
- package/routes/conversation.py +2158 -0
- package/routes/elevenlabs_hybrid.py +306 -0
- package/routes/greetings.py +98 -0
- package/routes/icons.py +279 -0
- package/routes/image_gen.py +364 -0
- package/routes/instructions.py +190 -0
- package/routes/music.py +838 -0
- package/routes/onboarding.py +43 -0
- package/routes/pi.py +62 -0
- package/routes/profiles.py +215 -0
- package/routes/report_issue.py +68 -0
- package/routes/static_files.py +533 -0
- package/routes/suno.py +664 -0
- package/routes/theme.py +81 -0
- package/routes/transcripts.py +199 -0
- package/routes/vision.py +348 -0
- package/routes/workspace.py +288 -0
- package/server.py +1510 -0
- package/services/__init__.py +1 -0
- package/services/auth.py +143 -0
- package/services/canvas_versioning.py +239 -0
- package/services/db_pool.py +107 -0
- package/services/gateway.py +16 -0
- package/services/gateway_manager.py +333 -0
- package/services/gateways/__init__.py +12 -0
- package/services/gateways/base.py +110 -0
- package/services/gateways/compat.py +264 -0
- package/services/gateways/openclaw.py +1134 -0
- package/services/health.py +100 -0
- package/services/memory_client.py +455 -0
- package/services/paths.py +26 -0
- package/services/speech_normalizer.py +285 -0
- package/services/tts.py +270 -0
- package/setup-config.js +262 -0
- package/sounds/air_horn.mp3 +0 -0
- package/sounds/bruh.mp3 +0 -0
- package/sounds/crowd_cheer.mp3 +0 -0
- package/sounds/gunshot.mp3 +0 -0
- package/sounds/impact.mp3 +0 -0
- package/sounds/lets_go.mp3 +0 -0
- package/sounds/record_stop.mp3 +0 -0
- package/sounds/rewind.mp3 +0 -0
- package/sounds/sad_trombone.mp3 +0 -0
- package/sounds/scratch_long.mp3 +0 -0
- package/sounds/yeah.mp3 +0 -0
- package/src/adapters/ClawdBotAdapter.js +264 -0
- package/src/adapters/_template.js +133 -0
- package/src/adapters/elevenlabs-classic.js +841 -0
- package/src/adapters/elevenlabs-hybrid.js +812 -0
- package/src/adapters/hume-evi.js +676 -0
- package/src/admin.html +1339 -0
- package/src/app.js +8802 -0
- package/src/core/Config.js +173 -0
- package/src/core/EmotionEngine.js +307 -0
- package/src/core/EventBridge.js +180 -0
- package/src/core/EventBus.js +117 -0
- package/src/core/VoiceSession.js +607 -0
- package/src/face/BaseFace.js +259 -0
- package/src/face/EyeFace.js +208 -0
- package/src/face/HaloSmokeFace.js +509 -0
- package/src/face/manifest.json +27 -0
- package/src/face/previews/eyes.svg +16 -0
- package/src/face/previews/orb.svg +29 -0
- package/src/features/MusicPlayer.js +620 -0
- package/src/features/Soundboard.js +128 -0
- package/src/providers/DeepgramSTT.js +472 -0
- package/src/providers/DeepgramStreamingSTT.js +766 -0
- package/src/providers/GroqSTT.js +559 -0
- package/src/providers/TTSPlayer.js +323 -0
- package/src/providers/WebSpeechSTT.js +479 -0
- package/src/providers/tts/BaseTTSProvider.js +81 -0
- package/src/providers/tts/HumeProvider.js +77 -0
- package/src/providers/tts/SupertonicProvider.js +174 -0
- package/src/providers/tts/index.js +140 -0
- package/src/shell/adapter-registry.js +154 -0
- package/src/shell/caller-bridge.js +35 -0
- package/src/shell/camera-bridge.js +28 -0
- package/src/shell/canvas-bridge.js +32 -0
- package/src/shell/commercial-bridge.js +44 -0
- package/src/shell/face-bridge.js +44 -0
- package/src/shell/music-bridge.js +60 -0
- package/src/shell/orchestrator.js +233 -0
- package/src/shell/profile-discovery.js +303 -0
- package/src/shell/sounds-bridge.js +28 -0
- package/src/shell/transcript-bridge.js +61 -0
- package/src/shell/waveform-bridge.js +33 -0
- package/src/styles/base.css +2862 -0
- package/src/styles/face.css +417 -0
- package/src/styles/pi-overrides.css +89 -0
- package/src/styles/theme-dark.css +67 -0
- package/src/test-tts.html +175 -0
- package/src/ui/AppShell.js +544 -0
- package/src/ui/ProfileSwitcher.js +228 -0
- package/src/ui/SessionControl.js +240 -0
- package/src/ui/face/FacePicker.js +195 -0
- package/src/ui/face/FaceRenderer.js +309 -0
- package/src/ui/settings/PlaylistEditor.js +366 -0
- package/src/ui/settings/SettingsPanel.css +684 -0
- package/src/ui/settings/SettingsPanel.js +419 -0
- package/src/ui/settings/TTSVoicePreview.js +210 -0
- package/src/ui/themes/ThemeManager.js +213 -0
- package/src/ui/visualizers/BaseVisualizer.js +29 -0
- package/src/ui/visualizers/PartyFXVisualizer.css +291 -0
- package/src/ui/visualizers/PartyFXVisualizer.js +637 -0
- package/static/emulators/jsdos/js-dos.css +1 -0
- package/static/emulators/jsdos/js-dos.js +22 -0
- package/static/favicon.svg +55 -0
- package/static/icons/apple-touch-icon.png +0 -0
- package/static/icons/favicon-32.png +0 -0
- package/static/icons/icon-192.png +0 -0
- package/static/icons/icon-512.png +0 -0
- package/static/install.html +449 -0
- package/static/manifest.json +26 -0
- package/static/sw.js +21 -0
- package/tts_providers/__init__.py +136 -0
- package/tts_providers/base_provider.py +319 -0
- package/tts_providers/groq_provider.py +155 -0
- package/tts_providers/hume_provider.py +226 -0
- package/tts_providers/providers_config.json +119 -0
- package/tts_providers/qwen3_provider.py +371 -0
- package/tts_providers/resemble_provider.py +315 -0
- package/tts_providers/supertonic_provider.py +557 -0
- package/tts_providers/supertonic_tts.py +399 -0
|
@@ -0,0 +1,1005 @@
|
|
|
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.0">
|
|
6
|
+
<title>JamBot Style Guide v0.2</title>
|
|
7
|
+
<style>
|
|
8
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
/* ── Surface Scale (visible layers, NOT all black) ────── */
|
|
12
|
+
--bg: #13141a; /* base background */
|
|
13
|
+
--surface: #1a1b23; /* card level 1 */
|
|
14
|
+
--surface-2: #21222c; /* card level 2 / nested */
|
|
15
|
+
--surface-hover:#282936; /* hover state */
|
|
16
|
+
--surface-3: #2e3040; /* elevated / modals */
|
|
17
|
+
|
|
18
|
+
/* ── Border Scale ─────────────────────────────────────── */
|
|
19
|
+
--border: #2a2b37; /* default borders */
|
|
20
|
+
--border-light: #353648; /* hover / emphasis borders */
|
|
21
|
+
--border-heavy: #42445a; /* strong dividers */
|
|
22
|
+
|
|
23
|
+
/* ── Brand: Blue (no purple) ──────────────────────────── */
|
|
24
|
+
--brand: #3b82f6;
|
|
25
|
+
--brand-light: #60a5fa;
|
|
26
|
+
--brand-dim: rgba(59,130,246,0.12);
|
|
27
|
+
--brand-glow: rgba(59,130,246,0.15);
|
|
28
|
+
--brand-glow-s: rgba(59,130,246,0.25);
|
|
29
|
+
--brand-border: rgba(59,130,246,0.25);
|
|
30
|
+
|
|
31
|
+
/* ── Semantic ─────────────────────────────────────────── */
|
|
32
|
+
--success: #34d399;
|
|
33
|
+
--success-dim: rgba(52,211,153,0.1);
|
|
34
|
+
--success-border:rgba(52,211,153,0.2);
|
|
35
|
+
--warning: #fbbf24;
|
|
36
|
+
--warning-dim: rgba(251,191,36,0.1);
|
|
37
|
+
--warning-border:rgba(251,191,36,0.2);
|
|
38
|
+
--danger: #f87171;
|
|
39
|
+
--danger-dim: rgba(248,113,113,0.1);
|
|
40
|
+
--danger-border: rgba(248,113,113,0.2);
|
|
41
|
+
--info: #60a5fa;
|
|
42
|
+
--info-dim: rgba(96,165,250,0.1);
|
|
43
|
+
--cyan: #22d3ee;
|
|
44
|
+
--cyan-dim: rgba(34,211,238,0.1);
|
|
45
|
+
|
|
46
|
+
/* ── Text ─────────────────────────────────────────────── */
|
|
47
|
+
--text: #e8eaf0;
|
|
48
|
+
--text-secondary:#9498ab;
|
|
49
|
+
--text-muted: #5f6380;
|
|
50
|
+
|
|
51
|
+
--radius: 14px;
|
|
52
|
+
--radius-sm: 10px;
|
|
53
|
+
--radius-xs: 6px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
57
|
+
|
|
58
|
+
body {
|
|
59
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
|
|
60
|
+
background: var(--bg);
|
|
61
|
+
color: var(--text);
|
|
62
|
+
padding: 20px 16px;
|
|
63
|
+
line-height: 1.5;
|
|
64
|
+
-webkit-font-smoothing: antialiased;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.style-label {
|
|
68
|
+
font-size: 10px;
|
|
69
|
+
font-weight: 700;
|
|
70
|
+
text-transform: uppercase;
|
|
71
|
+
letter-spacing: 2px;
|
|
72
|
+
color: var(--brand);
|
|
73
|
+
padding: 28px 0 6px;
|
|
74
|
+
}
|
|
75
|
+
.style-label:first-of-type { padding-top: 0; }
|
|
76
|
+
|
|
77
|
+
.style-desc {
|
|
78
|
+
font-size: 12px;
|
|
79
|
+
color: var(--text-muted);
|
|
80
|
+
margin-bottom: 14px;
|
|
81
|
+
line-height: 1.5;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.section-title {
|
|
85
|
+
font-size: 11px;
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
text-transform: uppercase;
|
|
88
|
+
letter-spacing: 1.5px;
|
|
89
|
+
color: var(--text-muted);
|
|
90
|
+
padding: 18px 0 10px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.divider {
|
|
94
|
+
height: 1px;
|
|
95
|
+
background: linear-gradient(90deg, transparent, var(--border-light), transparent);
|
|
96
|
+
margin: 24px 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* ── Typography ──────────────────────────────────────────── */
|
|
100
|
+
.type-demo h1 {
|
|
101
|
+
font-size: 26px;
|
|
102
|
+
font-weight: 800;
|
|
103
|
+
letter-spacing: -0.8px;
|
|
104
|
+
color: var(--text);
|
|
105
|
+
margin-bottom: 4px;
|
|
106
|
+
}
|
|
107
|
+
.type-demo h2 {
|
|
108
|
+
font-size: 18px;
|
|
109
|
+
font-weight: 700;
|
|
110
|
+
letter-spacing: -0.3px;
|
|
111
|
+
margin-bottom: 4px;
|
|
112
|
+
}
|
|
113
|
+
.type-demo h3 {
|
|
114
|
+
font-size: 13px;
|
|
115
|
+
font-weight: 600;
|
|
116
|
+
color: var(--text-secondary);
|
|
117
|
+
margin-bottom: 4px;
|
|
118
|
+
}
|
|
119
|
+
.type-demo p {
|
|
120
|
+
font-size: 13px;
|
|
121
|
+
color: var(--text-secondary);
|
|
122
|
+
line-height: 1.6;
|
|
123
|
+
}
|
|
124
|
+
.type-demo .caption {
|
|
125
|
+
font-size: 11px;
|
|
126
|
+
color: var(--text-muted);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* ── Color Palette ───────────────────────────────────────── */
|
|
130
|
+
.palette {
|
|
131
|
+
display: grid;
|
|
132
|
+
grid-template-columns: repeat(auto-fill, minmax(58px, 1fr));
|
|
133
|
+
gap: 6px;
|
|
134
|
+
}
|
|
135
|
+
.swatch {
|
|
136
|
+
aspect-ratio: 1;
|
|
137
|
+
border-radius: var(--radius-xs);
|
|
138
|
+
display: flex;
|
|
139
|
+
align-items: flex-end;
|
|
140
|
+
justify-content: center;
|
|
141
|
+
padding: 4px 2px;
|
|
142
|
+
font-size: 7px;
|
|
143
|
+
font-weight: 600;
|
|
144
|
+
color: rgba(255,255,255,0.6);
|
|
145
|
+
border: 1px solid rgba(255,255,255,0.04);
|
|
146
|
+
}
|
|
147
|
+
.swatch.dark-text { color: rgba(0,0,0,0.5); }
|
|
148
|
+
|
|
149
|
+
/* ── Card Styles ─────────────────────────────────────────── */
|
|
150
|
+
.card-row { display: flex; flex-direction: column; gap: 10px; }
|
|
151
|
+
|
|
152
|
+
.card-flat {
|
|
153
|
+
background: var(--surface);
|
|
154
|
+
border: 1px solid var(--border);
|
|
155
|
+
border-radius: var(--radius);
|
|
156
|
+
padding: 16px;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.card-glow {
|
|
160
|
+
background: var(--surface);
|
|
161
|
+
border-radius: var(--radius);
|
|
162
|
+
padding: 16px;
|
|
163
|
+
border: 1px solid var(--brand-border);
|
|
164
|
+
box-shadow: 0 0 20px var(--brand-glow), inset 0 1px 0 rgba(255,255,255,0.03);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.card-glass {
|
|
168
|
+
background: rgba(26,27,35,0.8);
|
|
169
|
+
backdrop-filter: blur(20px);
|
|
170
|
+
-webkit-backdrop-filter: blur(20px);
|
|
171
|
+
border: 1px solid rgba(255,255,255,0.06);
|
|
172
|
+
border-radius: var(--radius);
|
|
173
|
+
padding: 16px;
|
|
174
|
+
box-shadow: 0 4px 24px rgba(0,0,0,0.2);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.card-accent {
|
|
178
|
+
background: var(--surface);
|
|
179
|
+
border: 1px solid var(--border);
|
|
180
|
+
border-left: 3px solid var(--brand);
|
|
181
|
+
border-radius: var(--radius);
|
|
182
|
+
padding: 16px;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.card-gradient {
|
|
186
|
+
background: linear-gradient(145deg, var(--surface) 0%, var(--surface-2) 100%);
|
|
187
|
+
border: 1px solid var(--border);
|
|
188
|
+
border-radius: var(--radius);
|
|
189
|
+
padding: 16px;
|
|
190
|
+
position: relative;
|
|
191
|
+
overflow: hidden;
|
|
192
|
+
}
|
|
193
|
+
.card-gradient::before {
|
|
194
|
+
content: '';
|
|
195
|
+
position: absolute;
|
|
196
|
+
top: 0;
|
|
197
|
+
left: 0;
|
|
198
|
+
right: 0;
|
|
199
|
+
height: 1px;
|
|
200
|
+
background: linear-gradient(90deg, transparent, rgba(59,130,246,0.35), transparent);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.card-layered {
|
|
204
|
+
background: var(--surface);
|
|
205
|
+
border: 1px solid var(--border);
|
|
206
|
+
border-radius: var(--radius);
|
|
207
|
+
padding: 16px;
|
|
208
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.15), 0 0 0 1px rgba(255,255,255,0.02) inset;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.card-title {
|
|
212
|
+
font-size: 14px;
|
|
213
|
+
font-weight: 600;
|
|
214
|
+
margin-bottom: 4px;
|
|
215
|
+
}
|
|
216
|
+
.card-text {
|
|
217
|
+
font-size: 12px;
|
|
218
|
+
color: var(--text-secondary);
|
|
219
|
+
line-height: 1.5;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* ── KPI ─────────────────────────────────────────────────── */
|
|
223
|
+
.kpi-row {
|
|
224
|
+
display: grid;
|
|
225
|
+
grid-template-columns: 1fr 1fr;
|
|
226
|
+
gap: 10px;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.kpi {
|
|
230
|
+
background: var(--surface);
|
|
231
|
+
border: 1px solid var(--border);
|
|
232
|
+
border-radius: var(--radius);
|
|
233
|
+
padding: 14px 16px;
|
|
234
|
+
}
|
|
235
|
+
.kpi .kpi-label {
|
|
236
|
+
font-size: 10px;
|
|
237
|
+
font-weight: 600;
|
|
238
|
+
text-transform: uppercase;
|
|
239
|
+
letter-spacing: 0.8px;
|
|
240
|
+
color: var(--text-muted);
|
|
241
|
+
}
|
|
242
|
+
.kpi .kpi-val {
|
|
243
|
+
font-size: 28px;
|
|
244
|
+
font-weight: 800;
|
|
245
|
+
letter-spacing: -1px;
|
|
246
|
+
line-height: 1.2;
|
|
247
|
+
}
|
|
248
|
+
.kpi .kpi-sub {
|
|
249
|
+
font-size: 10px;
|
|
250
|
+
color: var(--text-muted);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.kpi-bar {
|
|
254
|
+
border-left: 3px solid var(--brand);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.kpi-glow {
|
|
258
|
+
border-color: var(--brand-border);
|
|
259
|
+
box-shadow: 0 0 12px var(--brand-glow);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* ── Buttons ─────────────────────────────────────────────── */
|
|
263
|
+
.btn-row {
|
|
264
|
+
display: flex;
|
|
265
|
+
flex-wrap: wrap;
|
|
266
|
+
gap: 10px;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.btn {
|
|
270
|
+
border: none;
|
|
271
|
+
border-radius: var(--radius-sm);
|
|
272
|
+
padding: 12px 20px;
|
|
273
|
+
font-size: 13px;
|
|
274
|
+
font-weight: 600;
|
|
275
|
+
font-family: inherit;
|
|
276
|
+
cursor: pointer;
|
|
277
|
+
transition: all 0.2s ease;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.btn-primary {
|
|
281
|
+
background: var(--brand);
|
|
282
|
+
color: white;
|
|
283
|
+
box-shadow: 0 4px 12px rgba(59,130,246,0.25);
|
|
284
|
+
}
|
|
285
|
+
.btn-primary:hover {
|
|
286
|
+
box-shadow: 0 6px 20px rgba(59,130,246,0.35);
|
|
287
|
+
transform: translateY(-1px);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.btn-secondary {
|
|
291
|
+
background: transparent;
|
|
292
|
+
border: 1px solid var(--border-light);
|
|
293
|
+
color: var(--text-secondary);
|
|
294
|
+
}
|
|
295
|
+
.btn-secondary:hover {
|
|
296
|
+
border-color: var(--brand-border);
|
|
297
|
+
color: var(--text);
|
|
298
|
+
background: var(--brand-dim);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.btn-soft {
|
|
302
|
+
background: var(--brand-dim);
|
|
303
|
+
border: 1px solid var(--brand-border);
|
|
304
|
+
color: var(--brand-light);
|
|
305
|
+
}
|
|
306
|
+
.btn-soft:hover {
|
|
307
|
+
background: var(--brand-glow-s);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.btn-action {
|
|
311
|
+
background: var(--surface);
|
|
312
|
+
border: 1px solid var(--border);
|
|
313
|
+
border-radius: var(--radius-sm);
|
|
314
|
+
padding: 14px;
|
|
315
|
+
color: var(--text);
|
|
316
|
+
text-align: left;
|
|
317
|
+
width: 100%;
|
|
318
|
+
font-family: inherit;
|
|
319
|
+
cursor: pointer;
|
|
320
|
+
transition: all 0.15s ease;
|
|
321
|
+
}
|
|
322
|
+
.btn-action:hover {
|
|
323
|
+
background: var(--surface-hover);
|
|
324
|
+
border-color: var(--border-light);
|
|
325
|
+
}
|
|
326
|
+
.btn-action .btn-label {
|
|
327
|
+
display: block;
|
|
328
|
+
font-size: 13px;
|
|
329
|
+
font-weight: 600;
|
|
330
|
+
margin-bottom: 2px;
|
|
331
|
+
}
|
|
332
|
+
.btn-action .btn-desc {
|
|
333
|
+
font-size: 11px;
|
|
334
|
+
color: var(--text-muted);
|
|
335
|
+
font-weight: 400;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.btn-action.primary-action {
|
|
339
|
+
border-color: var(--brand-border);
|
|
340
|
+
background: var(--brand-dim);
|
|
341
|
+
}
|
|
342
|
+
.btn-action.primary-action:hover {
|
|
343
|
+
box-shadow: 0 0 12px var(--brand-glow);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/* ── Status ──────────────────────────────────────────────── */
|
|
347
|
+
.status-row {
|
|
348
|
+
display: flex;
|
|
349
|
+
flex-direction: column;
|
|
350
|
+
gap: 8px;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.status-item {
|
|
354
|
+
display: flex;
|
|
355
|
+
align-items: center;
|
|
356
|
+
gap: 10px;
|
|
357
|
+
background: var(--surface);
|
|
358
|
+
border: 1px solid var(--border);
|
|
359
|
+
border-radius: var(--radius-sm);
|
|
360
|
+
padding: 12px 14px;
|
|
361
|
+
cursor: pointer;
|
|
362
|
+
transition: all 0.15s ease;
|
|
363
|
+
}
|
|
364
|
+
.status-item:hover {
|
|
365
|
+
background: var(--surface-hover);
|
|
366
|
+
border-color: var(--border-light);
|
|
367
|
+
}
|
|
368
|
+
.status-dot {
|
|
369
|
+
width: 8px;
|
|
370
|
+
height: 8px;
|
|
371
|
+
border-radius: 50%;
|
|
372
|
+
flex-shrink: 0;
|
|
373
|
+
}
|
|
374
|
+
.status-dot.running { background: var(--success); box-shadow: 0 0 6px rgba(52,211,153,0.5); }
|
|
375
|
+
.status-dot.blocked { background: var(--warning); box-shadow: 0 0 6px rgba(251,191,36,0.4); }
|
|
376
|
+
.status-dot.setup { background: var(--text-muted); }
|
|
377
|
+
.status-dot.error { background: var(--danger); box-shadow: 0 0 6px rgba(248,113,113,0.4); }
|
|
378
|
+
.status-name {
|
|
379
|
+
font-size: 13px;
|
|
380
|
+
font-weight: 600;
|
|
381
|
+
flex: 1;
|
|
382
|
+
}
|
|
383
|
+
.status-sub {
|
|
384
|
+
font-size: 11px;
|
|
385
|
+
color: var(--text-muted);
|
|
386
|
+
}
|
|
387
|
+
.status-badge {
|
|
388
|
+
font-size: 10px;
|
|
389
|
+
font-weight: 600;
|
|
390
|
+
text-transform: uppercase;
|
|
391
|
+
letter-spacing: 0.5px;
|
|
392
|
+
padding: 3px 8px;
|
|
393
|
+
border-radius: 20px;
|
|
394
|
+
}
|
|
395
|
+
.status-badge.running { background: var(--success-dim); color: var(--success); }
|
|
396
|
+
.status-badge.blocked { background: var(--warning-dim); color: var(--warning); }
|
|
397
|
+
.status-badge.setup { background: rgba(95,99,128,0.15); color: var(--text-muted); }
|
|
398
|
+
|
|
399
|
+
/* ── Progress Bar ────────────────────────────────────────── */
|
|
400
|
+
.progress-wrap {
|
|
401
|
+
background: var(--surface);
|
|
402
|
+
border: 1px solid var(--border);
|
|
403
|
+
border-radius: var(--radius);
|
|
404
|
+
padding: 16px;
|
|
405
|
+
}
|
|
406
|
+
.progress-header {
|
|
407
|
+
display: flex;
|
|
408
|
+
justify-content: space-between;
|
|
409
|
+
margin-bottom: 10px;
|
|
410
|
+
}
|
|
411
|
+
.progress-title { font-size: 13px; font-weight: 600; }
|
|
412
|
+
.progress-pct { font-size: 13px; font-weight: 700; color: var(--brand); }
|
|
413
|
+
.progress-track {
|
|
414
|
+
height: 6px;
|
|
415
|
+
background: var(--surface-2);
|
|
416
|
+
border-radius: 3px;
|
|
417
|
+
overflow: hidden;
|
|
418
|
+
}
|
|
419
|
+
.progress-fill {
|
|
420
|
+
height: 100%;
|
|
421
|
+
border-radius: 3px;
|
|
422
|
+
background: var(--brand);
|
|
423
|
+
transition: width 0.5s ease;
|
|
424
|
+
}
|
|
425
|
+
.progress-sub {
|
|
426
|
+
display: flex;
|
|
427
|
+
justify-content: space-between;
|
|
428
|
+
margin-top: 6px;
|
|
429
|
+
font-size: 10px;
|
|
430
|
+
color: var(--text-muted);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* ── Timeline ────────────────────────────────────────────── */
|
|
434
|
+
.timeline {
|
|
435
|
+
position: relative;
|
|
436
|
+
padding-left: 24px;
|
|
437
|
+
}
|
|
438
|
+
.timeline::before {
|
|
439
|
+
content: '';
|
|
440
|
+
position: absolute;
|
|
441
|
+
left: 7px;
|
|
442
|
+
top: 4px;
|
|
443
|
+
bottom: 4px;
|
|
444
|
+
width: 2px;
|
|
445
|
+
background: linear-gradient(180deg, var(--brand), var(--brand-light), var(--border));
|
|
446
|
+
}
|
|
447
|
+
.tl-item { position: relative; padding-bottom: 18px; }
|
|
448
|
+
.tl-item:last-child { padding-bottom: 0; }
|
|
449
|
+
.tl-dot {
|
|
450
|
+
position: absolute;
|
|
451
|
+
left: -20px;
|
|
452
|
+
top: 3px;
|
|
453
|
+
width: 12px;
|
|
454
|
+
height: 12px;
|
|
455
|
+
border-radius: 50%;
|
|
456
|
+
border: 2px solid var(--brand);
|
|
457
|
+
background: var(--bg);
|
|
458
|
+
}
|
|
459
|
+
.tl-dot.done { background: var(--brand); }
|
|
460
|
+
.tl-dot.active { background: var(--brand); box-shadow: 0 0 8px var(--brand-glow-s); }
|
|
461
|
+
.tl-label { font-size: 12px; font-weight: 600; }
|
|
462
|
+
.tl-desc { font-size: 11px; color: var(--text-muted); margin-top: 2px; }
|
|
463
|
+
|
|
464
|
+
/* ── Chips ───────────────────────────────────────────────── */
|
|
465
|
+
.chip-row { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
466
|
+
.chip {
|
|
467
|
+
font-size: 11px;
|
|
468
|
+
font-weight: 500;
|
|
469
|
+
padding: 4px 10px;
|
|
470
|
+
border-radius: 20px;
|
|
471
|
+
border: 1px solid var(--border);
|
|
472
|
+
color: var(--text-secondary);
|
|
473
|
+
background: var(--surface);
|
|
474
|
+
cursor: pointer;
|
|
475
|
+
transition: all 0.15s ease;
|
|
476
|
+
}
|
|
477
|
+
.chip:hover { border-color: var(--border-light); color: var(--text); }
|
|
478
|
+
.chip.active { background: var(--brand-dim); border-color: var(--brand-border); color: var(--brand-light); }
|
|
479
|
+
.chip .chip-dot {
|
|
480
|
+
display: inline-block;
|
|
481
|
+
width: 6px;
|
|
482
|
+
height: 6px;
|
|
483
|
+
border-radius: 50%;
|
|
484
|
+
margin-right: 5px;
|
|
485
|
+
vertical-align: middle;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/* ── Avatar ──────────────────────────────────────────────── */
|
|
489
|
+
.avatar-row { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
|
|
490
|
+
.avatar {
|
|
491
|
+
width: 44px;
|
|
492
|
+
height: 44px;
|
|
493
|
+
border-radius: 12px;
|
|
494
|
+
display: flex;
|
|
495
|
+
align-items: center;
|
|
496
|
+
justify-content: center;
|
|
497
|
+
font-size: 15px;
|
|
498
|
+
font-weight: 700;
|
|
499
|
+
flex-shrink: 0;
|
|
500
|
+
}
|
|
501
|
+
.avatar.brand { background: var(--brand-dim); border: 1px solid var(--brand-border); color: var(--brand-light); }
|
|
502
|
+
.avatar.success { background: var(--success-dim); border: 1px solid var(--success-border); color: var(--success); }
|
|
503
|
+
.avatar.warning { background: var(--warning-dim); border: 1px solid var(--warning-border); color: var(--warning); }
|
|
504
|
+
.avatar.danger { background: var(--danger-dim); border: 1px solid var(--danger-border); color: var(--danger); }
|
|
505
|
+
.avatar.cyan { background: var(--cyan-dim); border: 1px solid rgba(34,211,238,0.2); color: var(--cyan); }
|
|
506
|
+
|
|
507
|
+
/* ── Queue Item ──────────────────────────────────────────── */
|
|
508
|
+
.queue-item {
|
|
509
|
+
background: var(--surface);
|
|
510
|
+
border: 1px solid var(--border);
|
|
511
|
+
border-radius: var(--radius);
|
|
512
|
+
padding: 16px;
|
|
513
|
+
display: flex;
|
|
514
|
+
gap: 12px;
|
|
515
|
+
align-items: flex-start;
|
|
516
|
+
cursor: pointer;
|
|
517
|
+
transition: all 0.15s ease;
|
|
518
|
+
}
|
|
519
|
+
.queue-item:hover { border-color: var(--border-light); background: var(--surface-hover); }
|
|
520
|
+
.queue-body { flex: 1; }
|
|
521
|
+
.queue-title { font-size: 13px; font-weight: 600; margin-bottom: 3px; }
|
|
522
|
+
.queue-text { font-size: 12px; color: var(--text-secondary); line-height: 1.5; margin-bottom: 6px; }
|
|
523
|
+
.queue-unlock {
|
|
524
|
+
font-size: 10px;
|
|
525
|
+
color: var(--success);
|
|
526
|
+
display: flex;
|
|
527
|
+
align-items: center;
|
|
528
|
+
gap: 4px;
|
|
529
|
+
}
|
|
530
|
+
.queue-unlock::before {
|
|
531
|
+
content: '';
|
|
532
|
+
width: 4px;
|
|
533
|
+
height: 4px;
|
|
534
|
+
background: var(--success);
|
|
535
|
+
border-radius: 50%;
|
|
536
|
+
}
|
|
537
|
+
.queue-action {
|
|
538
|
+
background: var(--brand-dim);
|
|
539
|
+
border: 1px solid var(--brand-border);
|
|
540
|
+
color: var(--brand-light);
|
|
541
|
+
font-size: 11px;
|
|
542
|
+
font-weight: 600;
|
|
543
|
+
padding: 6px 12px;
|
|
544
|
+
border-radius: var(--radius-xs);
|
|
545
|
+
cursor: pointer;
|
|
546
|
+
font-family: inherit;
|
|
547
|
+
white-space: nowrap;
|
|
548
|
+
align-self: center;
|
|
549
|
+
transition: all 0.15s ease;
|
|
550
|
+
}
|
|
551
|
+
.queue-action:hover { background: var(--brand-glow-s); }
|
|
552
|
+
|
|
553
|
+
/* ── Agent Card (office hub style) ───────────────────────── */
|
|
554
|
+
.agent-grid {
|
|
555
|
+
display: grid;
|
|
556
|
+
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
|
|
557
|
+
gap: 10px;
|
|
558
|
+
}
|
|
559
|
+
.agent-card {
|
|
560
|
+
background: var(--surface);
|
|
561
|
+
border: 1px solid var(--border);
|
|
562
|
+
border-radius: var(--radius);
|
|
563
|
+
padding: 14px;
|
|
564
|
+
cursor: pointer;
|
|
565
|
+
transition: all 0.2s ease;
|
|
566
|
+
position: relative;
|
|
567
|
+
}
|
|
568
|
+
.agent-card:hover { background: var(--surface-hover); border-color: var(--border-light); transform: translateY(-1px); }
|
|
569
|
+
.agent-icon {
|
|
570
|
+
width: 36px;
|
|
571
|
+
height: 36px;
|
|
572
|
+
border-radius: 10px;
|
|
573
|
+
display: flex;
|
|
574
|
+
align-items: center;
|
|
575
|
+
justify-content: center;
|
|
576
|
+
font-size: 14px;
|
|
577
|
+
font-weight: 700;
|
|
578
|
+
margin-bottom: 10px;
|
|
579
|
+
}
|
|
580
|
+
.agent-card h3 { font-size: 13px; font-weight: 600; margin-bottom: 2px; }
|
|
581
|
+
.agent-card .role { font-size: 11px; color: var(--text-muted); line-height: 1.3; }
|
|
582
|
+
.agent-card .status-pip {
|
|
583
|
+
position: absolute;
|
|
584
|
+
top: 10px;
|
|
585
|
+
right: 10px;
|
|
586
|
+
width: 6px;
|
|
587
|
+
height: 6px;
|
|
588
|
+
border-radius: 50%;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/* Department icon colors */
|
|
592
|
+
.dept-ops .agent-icon { background: var(--success-dim); color: var(--success); }
|
|
593
|
+
.dept-revenue .agent-icon { background: var(--warning-dim); color: var(--warning); }
|
|
594
|
+
.dept-marketing .agent-icon { background: var(--brand-dim); color: var(--brand-light); }
|
|
595
|
+
.dept-tech .agent-icon { background: var(--cyan-dim); color: var(--cyan); }
|
|
596
|
+
.dept-finance .agent-icon { background: var(--warning-dim); color: var(--warning); }
|
|
597
|
+
.dept-strategy .agent-icon { background: var(--info-dim); color: var(--info); }
|
|
598
|
+
|
|
599
|
+
/* ── Notification Badge ──────────────────────────────────── */
|
|
600
|
+
.notif-badge {
|
|
601
|
+
display: inline-flex;
|
|
602
|
+
align-items: center;
|
|
603
|
+
justify-content: center;
|
|
604
|
+
min-width: 20px;
|
|
605
|
+
height: 20px;
|
|
606
|
+
border-radius: 10px;
|
|
607
|
+
background: var(--danger);
|
|
608
|
+
color: white;
|
|
609
|
+
font-size: 10px;
|
|
610
|
+
font-weight: 700;
|
|
611
|
+
padding: 0 6px;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/* ── Action Grid ─────────────────────────────────────────── */
|
|
615
|
+
.action-grid {
|
|
616
|
+
display: grid;
|
|
617
|
+
grid-template-columns: 1fr 1fr;
|
|
618
|
+
gap: 8px;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
.footer-note {
|
|
622
|
+
text-align: center;
|
|
623
|
+
padding: 30px 0 10px;
|
|
624
|
+
font-size: 11px;
|
|
625
|
+
color: var(--text-muted);
|
|
626
|
+
}
|
|
627
|
+
</style>
|
|
628
|
+
</head>
|
|
629
|
+
<body>
|
|
630
|
+
|
|
631
|
+
<div class="type-demo">
|
|
632
|
+
<h1>JamBot Design System</h1>
|
|
633
|
+
<h3>v0.2 — Lighter surfaces, blue brand, no purple</h3>
|
|
634
|
+
</div>
|
|
635
|
+
|
|
636
|
+
<div class="divider"></div>
|
|
637
|
+
|
|
638
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
639
|
+
<!-- SURFACES -->
|
|
640
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
641
|
+
<div class="style-label">Surface Scale</div>
|
|
642
|
+
<div class="style-desc">Each level is visibly distinct. Background → Surface → Surface 2 → Hover → Surface 3. Cards pop off the background.</div>
|
|
643
|
+
<div class="palette">
|
|
644
|
+
<div class="swatch" style="background:#13141a">BG</div>
|
|
645
|
+
<div class="swatch" style="background:#1a1b23">Surface</div>
|
|
646
|
+
<div class="swatch" style="background:#21222c">Surf 2</div>
|
|
647
|
+
<div class="swatch" style="background:#282936">Hover</div>
|
|
648
|
+
<div class="swatch" style="background:#2e3040">Surf 3</div>
|
|
649
|
+
</div>
|
|
650
|
+
|
|
651
|
+
<div class="section-title">Borders</div>
|
|
652
|
+
<div class="palette">
|
|
653
|
+
<div class="swatch" style="background:#2a2b37">Default</div>
|
|
654
|
+
<div class="swatch" style="background:#353648">Light</div>
|
|
655
|
+
<div class="swatch" style="background:#42445a">Heavy</div>
|
|
656
|
+
</div>
|
|
657
|
+
|
|
658
|
+
<div class="section-title">Text</div>
|
|
659
|
+
<div class="palette">
|
|
660
|
+
<div class="swatch dark-text" style="background:#e8eaf0">Primary</div>
|
|
661
|
+
<div class="swatch" style="background:#9498ab">Secondary</div>
|
|
662
|
+
<div class="swatch" style="background:#5f6380">Muted</div>
|
|
663
|
+
</div>
|
|
664
|
+
|
|
665
|
+
<div class="section-title">Brand + Semantic</div>
|
|
666
|
+
<div class="palette">
|
|
667
|
+
<div class="swatch" style="background:#3b82f6">Blue</div>
|
|
668
|
+
<div class="swatch" style="background:#60a5fa">Blue Lt</div>
|
|
669
|
+
<div class="swatch" style="background:#34d399">Success</div>
|
|
670
|
+
<div class="swatch" style="background:#fbbf24">Warning</div>
|
|
671
|
+
<div class="swatch" style="background:#f87171">Danger</div>
|
|
672
|
+
<div class="swatch" style="background:#22d3ee">Cyan</div>
|
|
673
|
+
</div>
|
|
674
|
+
|
|
675
|
+
<div class="divider"></div>
|
|
676
|
+
|
|
677
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
678
|
+
<!-- TYPOGRAPHY -->
|
|
679
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
680
|
+
<div class="style-label">Typography</div>
|
|
681
|
+
<div class="type-demo">
|
|
682
|
+
<h1>AI Office Dashboard</h1>
|
|
683
|
+
<h2>Department Status</h2>
|
|
684
|
+
<h3>Section Label · Uppercase Tracking</h3>
|
|
685
|
+
<p>Body text for descriptions and conversational content. Readable, warm, not clinical.</p>
|
|
686
|
+
<div class="caption">Caption · timestamps · metadata · 11px</div>
|
|
687
|
+
</div>
|
|
688
|
+
|
|
689
|
+
<div class="divider"></div>
|
|
690
|
+
|
|
691
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
692
|
+
<!-- CARDS -->
|
|
693
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
694
|
+
<div class="style-label">Card Styles</div>
|
|
695
|
+
<div class="style-desc">Six options on the new surface scale. All are now clearly visible against the background.</div>
|
|
696
|
+
|
|
697
|
+
<div class="section-title">A — Flat</div>
|
|
698
|
+
<div class="card-row">
|
|
699
|
+
<div class="card-flat">
|
|
700
|
+
<div class="card-title">Standard Card</div>
|
|
701
|
+
<div class="card-text">Clean baseline. Surface + border. This is the default for most content.</div>
|
|
702
|
+
</div>
|
|
703
|
+
</div>
|
|
704
|
+
|
|
705
|
+
<div class="section-title">B — Blue Glow</div>
|
|
706
|
+
<div class="card-row">
|
|
707
|
+
<div class="card-glow">
|
|
708
|
+
<div class="card-title">Glow Card</div>
|
|
709
|
+
<div class="card-text">Blue glow on border. Use for highlighted / active / selected items. Premium feel without being flashy.</div>
|
|
710
|
+
</div>
|
|
711
|
+
</div>
|
|
712
|
+
|
|
713
|
+
<div class="section-title">C — Glass</div>
|
|
714
|
+
<div class="card-row">
|
|
715
|
+
<div class="card-glass">
|
|
716
|
+
<div class="card-title">Glass Card</div>
|
|
717
|
+
<div class="card-text">Frosted glass with blur. Layered feeling. Good for overlays and hero sections.</div>
|
|
718
|
+
</div>
|
|
719
|
+
</div>
|
|
720
|
+
|
|
721
|
+
<div class="section-title">D — Left Accent</div>
|
|
722
|
+
<div class="card-row">
|
|
723
|
+
<div class="card-accent">
|
|
724
|
+
<div class="card-title">Accent Card</div>
|
|
725
|
+
<div class="card-text">Colored left border for hierarchy and categorization. Pairs well with status indicators.</div>
|
|
726
|
+
</div>
|
|
727
|
+
</div>
|
|
728
|
+
|
|
729
|
+
<div class="section-title">E — Gradient + Top Line</div>
|
|
730
|
+
<div class="card-row">
|
|
731
|
+
<div class="card-gradient">
|
|
732
|
+
<div class="card-title">Gradient Card</div>
|
|
733
|
+
<div class="card-text">Subtle diagonal gradient with luminous top edge. Feels elevated without being loud.</div>
|
|
734
|
+
</div>
|
|
735
|
+
</div>
|
|
736
|
+
|
|
737
|
+
<div class="section-title">F — Layered Shadow</div>
|
|
738
|
+
<div class="card-row">
|
|
739
|
+
<div class="card-layered">
|
|
740
|
+
<div class="card-title">Layered Card</div>
|
|
741
|
+
<div class="card-text">Subtle drop shadow + inner highlight. Feels physical, lifted off the surface. Good depth cue.</div>
|
|
742
|
+
</div>
|
|
743
|
+
</div>
|
|
744
|
+
|
|
745
|
+
<div class="divider"></div>
|
|
746
|
+
|
|
747
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
748
|
+
<!-- KPIs -->
|
|
749
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
750
|
+
<div class="style-label">KPI Cards</div>
|
|
751
|
+
|
|
752
|
+
<div class="section-title">Standard</div>
|
|
753
|
+
<div class="kpi-row">
|
|
754
|
+
<div class="kpi">
|
|
755
|
+
<div class="kpi-label">Running</div>
|
|
756
|
+
<div class="kpi-val" style="color:var(--success)">14</div>
|
|
757
|
+
<div class="kpi-sub">departments active</div>
|
|
758
|
+
</div>
|
|
759
|
+
<div class="kpi">
|
|
760
|
+
<div class="kpi-label">Close Rate</div>
|
|
761
|
+
<div class="kpi-val" style="color:var(--warning)">68%</div>
|
|
762
|
+
<div class="kpi-sub">last 30 days</div>
|
|
763
|
+
</div>
|
|
764
|
+
</div>
|
|
765
|
+
|
|
766
|
+
<div class="section-title">Left Bar</div>
|
|
767
|
+
<div class="kpi-row">
|
|
768
|
+
<div class="kpi kpi-bar" style="border-left-color:var(--success)">
|
|
769
|
+
<div class="kpi-label">Revenue</div>
|
|
770
|
+
<div class="kpi-val" style="color:var(--success)">$47K</div>
|
|
771
|
+
</div>
|
|
772
|
+
<div class="kpi kpi-bar" style="border-left-color:var(--danger)">
|
|
773
|
+
<div class="kpi-label">Overdue</div>
|
|
774
|
+
<div class="kpi-val" style="color:var(--danger)">3</div>
|
|
775
|
+
</div>
|
|
776
|
+
</div>
|
|
777
|
+
|
|
778
|
+
<div class="section-title">Blue Glow</div>
|
|
779
|
+
<div class="kpi-row">
|
|
780
|
+
<div class="kpi kpi-glow">
|
|
781
|
+
<div class="kpi-label">Pipeline</div>
|
|
782
|
+
<div class="kpi-val" style="color:var(--brand-light)">$128K</div>
|
|
783
|
+
</div>
|
|
784
|
+
<div class="kpi kpi-glow">
|
|
785
|
+
<div class="kpi-label">Reviews</div>
|
|
786
|
+
<div class="kpi-val" style="color:var(--brand-light)">4.8</div>
|
|
787
|
+
</div>
|
|
788
|
+
</div>
|
|
789
|
+
|
|
790
|
+
<div class="divider"></div>
|
|
791
|
+
|
|
792
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
793
|
+
<!-- BUTTONS -->
|
|
794
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
795
|
+
<div class="style-label">Buttons</div>
|
|
796
|
+
<div class="btn-row">
|
|
797
|
+
<button class="btn btn-primary">Get Started</button>
|
|
798
|
+
<button class="btn btn-soft">View Details</button>
|
|
799
|
+
<button class="btn btn-secondary">Cancel</button>
|
|
800
|
+
</div>
|
|
801
|
+
<div style="height:10px"></div>
|
|
802
|
+
<div class="action-grid">
|
|
803
|
+
<button class="btn-action primary-action">
|
|
804
|
+
<span class="btn-label">Follow Up Hot</span>
|
|
805
|
+
<span class="btn-desc">Draft messages for 3 estimates</span>
|
|
806
|
+
</button>
|
|
807
|
+
<button class="btn-action">
|
|
808
|
+
<span class="btn-label">Full Pipeline</span>
|
|
809
|
+
<span class="btn-desc">All estimates by status</span>
|
|
810
|
+
</button>
|
|
811
|
+
</div>
|
|
812
|
+
|
|
813
|
+
<div class="divider"></div>
|
|
814
|
+
|
|
815
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
816
|
+
<!-- AVATARS -->
|
|
817
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
818
|
+
<div class="style-label">Agent Avatars</div>
|
|
819
|
+
<div class="style-desc">Blue for brand/default, semantic colors for departments. All use dim bg + border, no solid fills.</div>
|
|
820
|
+
<div class="avatar-row">
|
|
821
|
+
<div class="avatar brand">SM</div>
|
|
822
|
+
<div class="avatar success">DS</div>
|
|
823
|
+
<div class="avatar warning">BK</div>
|
|
824
|
+
<div class="avatar danger">SF</div>
|
|
825
|
+
<div class="avatar cyan">CB</div>
|
|
826
|
+
</div>
|
|
827
|
+
|
|
828
|
+
<div class="divider"></div>
|
|
829
|
+
|
|
830
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
831
|
+
<!-- AGENT CARDS -->
|
|
832
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
833
|
+
<div class="style-label">Agent Cards (Office Hub)</div>
|
|
834
|
+
<div class="agent-grid">
|
|
835
|
+
<div class="agent-card dept-ops">
|
|
836
|
+
<div class="status-pip" style="background:var(--success)"></div>
|
|
837
|
+
<div class="agent-icon">DS</div>
|
|
838
|
+
<h3>Dispatcher</h3>
|
|
839
|
+
<div class="role">Scheduling, dispatch, field ops</div>
|
|
840
|
+
</div>
|
|
841
|
+
<div class="agent-card dept-revenue">
|
|
842
|
+
<div class="status-pip" style="background:var(--warning)"></div>
|
|
843
|
+
<div class="agent-icon">SM</div>
|
|
844
|
+
<h3>Sales Manager</h3>
|
|
845
|
+
<div class="role">Estimates, pricing, proposals</div>
|
|
846
|
+
</div>
|
|
847
|
+
<div class="agent-card dept-marketing">
|
|
848
|
+
<div class="status-pip" style="background:var(--success)"></div>
|
|
849
|
+
<div class="agent-icon">MS</div>
|
|
850
|
+
<h3>Marketing</h3>
|
|
851
|
+
<div class="role">SEO, ads, campaigns</div>
|
|
852
|
+
</div>
|
|
853
|
+
<div class="agent-card dept-tech">
|
|
854
|
+
<div class="status-pip" style="background:var(--text-muted)"></div>
|
|
855
|
+
<div class="agent-icon">CB</div>
|
|
856
|
+
<h3>Canvas Builder</h3>
|
|
857
|
+
<div class="role">Pages, dashboards</div>
|
|
858
|
+
</div>
|
|
859
|
+
</div>
|
|
860
|
+
|
|
861
|
+
<div class="divider"></div>
|
|
862
|
+
|
|
863
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
864
|
+
<!-- STATUS -->
|
|
865
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
866
|
+
<div class="style-label">Department Status List</div>
|
|
867
|
+
<div class="status-row">
|
|
868
|
+
<div class="status-item">
|
|
869
|
+
<div class="status-dot running"></div>
|
|
870
|
+
<div style="flex:1">
|
|
871
|
+
<div class="status-name">Competitor Intel</div>
|
|
872
|
+
<div class="status-sub">Monitoring 3 competitors weekly</div>
|
|
873
|
+
</div>
|
|
874
|
+
<div class="status-badge running">Running</div>
|
|
875
|
+
</div>
|
|
876
|
+
<div class="status-item">
|
|
877
|
+
<div class="status-dot blocked"></div>
|
|
878
|
+
<div style="flex:1">
|
|
879
|
+
<div class="status-name">Sales Manager</div>
|
|
880
|
+
<div class="status-sub">Need your recent estimates</div>
|
|
881
|
+
</div>
|
|
882
|
+
<div class="status-badge blocked">Needs Input</div>
|
|
883
|
+
</div>
|
|
884
|
+
<div class="status-item">
|
|
885
|
+
<div class="status-dot setup"></div>
|
|
886
|
+
<div style="flex:1">
|
|
887
|
+
<div class="status-name">Dispatcher</div>
|
|
888
|
+
<div class="status-sub">Need crew info and hours</div>
|
|
889
|
+
</div>
|
|
890
|
+
<div class="status-badge setup">Setup</div>
|
|
891
|
+
</div>
|
|
892
|
+
</div>
|
|
893
|
+
|
|
894
|
+
<div class="divider"></div>
|
|
895
|
+
|
|
896
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
897
|
+
<!-- PROGRESS -->
|
|
898
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
899
|
+
<div class="style-label">Progress</div>
|
|
900
|
+
<div class="progress-wrap">
|
|
901
|
+
<div class="progress-header">
|
|
902
|
+
<div class="progress-title">Office Setup</div>
|
|
903
|
+
<div class="progress-pct">65%</div>
|
|
904
|
+
</div>
|
|
905
|
+
<div class="progress-track">
|
|
906
|
+
<div class="progress-fill" style="width:65%"></div>
|
|
907
|
+
</div>
|
|
908
|
+
<div class="progress-sub">
|
|
909
|
+
<span>13 of 20 departments online</span>
|
|
910
|
+
<span>7 need input</span>
|
|
911
|
+
</div>
|
|
912
|
+
</div>
|
|
913
|
+
|
|
914
|
+
<div class="divider"></div>
|
|
915
|
+
|
|
916
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
917
|
+
<!-- TIMELINE -->
|
|
918
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
919
|
+
<div class="style-label">Timeline</div>
|
|
920
|
+
<div class="timeline">
|
|
921
|
+
<div class="tl-item">
|
|
922
|
+
<div class="tl-dot done"></div>
|
|
923
|
+
<div class="tl-label">Onboarding Complete</div>
|
|
924
|
+
<div class="tl-desc">Business info collected, team briefed</div>
|
|
925
|
+
</div>
|
|
926
|
+
<div class="tl-item">
|
|
927
|
+
<div class="tl-dot done"></div>
|
|
928
|
+
<div class="tl-label">SEO Audit Running</div>
|
|
929
|
+
<div class="tl-desc">12 keywords tracked, 4 opportunities found</div>
|
|
930
|
+
</div>
|
|
931
|
+
<div class="tl-item">
|
|
932
|
+
<div class="tl-dot active"></div>
|
|
933
|
+
<div class="tl-label">Competitor Scan</div>
|
|
934
|
+
<div class="tl-desc">Analyzing 3 competitors now...</div>
|
|
935
|
+
</div>
|
|
936
|
+
<div class="tl-item">
|
|
937
|
+
<div class="tl-dot"></div>
|
|
938
|
+
<div class="tl-label">First Morning Briefing</div>
|
|
939
|
+
<div class="tl-desc">Tomorrow at 8am</div>
|
|
940
|
+
</div>
|
|
941
|
+
</div>
|
|
942
|
+
|
|
943
|
+
<div class="divider"></div>
|
|
944
|
+
|
|
945
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
946
|
+
<!-- QUEUE -->
|
|
947
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
948
|
+
<div class="style-label">Queue / Needs From You</div>
|
|
949
|
+
<div class="card-row">
|
|
950
|
+
<div class="queue-item" onclick="speak('Let me tell you about my recent estimates')">
|
|
951
|
+
<div class="avatar warning" style="width:36px;height:36px;font-size:12px;border-radius:10px">SM</div>
|
|
952
|
+
<div class="queue-body">
|
|
953
|
+
<div class="queue-title">Sales Manager needs your estimates</div>
|
|
954
|
+
<div class="queue-text">Tell me about your last few estimates — what they were for, amounts, and if they closed.</div>
|
|
955
|
+
<div class="queue-unlock">Unlocks pipeline tracking + follow-up automation</div>
|
|
956
|
+
</div>
|
|
957
|
+
<button class="queue-action">Answer</button>
|
|
958
|
+
</div>
|
|
959
|
+
<div class="queue-item" onclick="speak('Let me tell you about our licenses')">
|
|
960
|
+
<div class="avatar danger" style="width:36px;height:36px;font-size:12px;border-radius:10px">SF</div>
|
|
961
|
+
<div class="queue-body">
|
|
962
|
+
<div class="queue-title">Compliance needs your license info</div>
|
|
963
|
+
<div class="queue-text">What licenses and certs does your team hold? I'll track renewal dates.</div>
|
|
964
|
+
<div class="queue-unlock">Unlocks expiration alerts + renewal reminders</div>
|
|
965
|
+
</div>
|
|
966
|
+
<button class="queue-action">Answer</button>
|
|
967
|
+
</div>
|
|
968
|
+
</div>
|
|
969
|
+
|
|
970
|
+
<div class="divider"></div>
|
|
971
|
+
|
|
972
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
973
|
+
<!-- CHIPS + BADGES -->
|
|
974
|
+
<!-- ═══════════════════════════════════════════════════════ -->
|
|
975
|
+
<div class="style-label">Chips & Badges</div>
|
|
976
|
+
<div class="chip-row">
|
|
977
|
+
<span class="chip active"><span class="chip-dot" style="background:var(--brand)"></span>All</span>
|
|
978
|
+
<span class="chip"><span class="chip-dot" style="background:var(--success)"></span>Running</span>
|
|
979
|
+
<span class="chip"><span class="chip-dot" style="background:var(--warning)"></span>Blocked</span>
|
|
980
|
+
<span class="chip"><span class="chip-dot" style="background:var(--text-muted)"></span>Setup</span>
|
|
981
|
+
</div>
|
|
982
|
+
<div style="height:10px"></div>
|
|
983
|
+
<div style="display:flex;align-items:center;gap:10px">
|
|
984
|
+
<span style="font-size:13px">Needs From You</span>
|
|
985
|
+
<span class="notif-badge">4</span>
|
|
986
|
+
<span style="flex:1"></span>
|
|
987
|
+
<span style="font-size:13px">New Reviews</span>
|
|
988
|
+
<span class="notif-badge" style="background:var(--success)">2</span>
|
|
989
|
+
</div>
|
|
990
|
+
|
|
991
|
+
<div class="footer-note">
|
|
992
|
+
JamBot Canvas Design System v0.2<br>
|
|
993
|
+
Blue brand · Visible surfaces · No purple
|
|
994
|
+
</div>
|
|
995
|
+
|
|
996
|
+
<script>
|
|
997
|
+
function nav(page) {
|
|
998
|
+
window.parent.postMessage({type:'canvas-action', action:'navigate', page: page}, '*');
|
|
999
|
+
}
|
|
1000
|
+
function speak(text) {
|
|
1001
|
+
window.parent.postMessage({type:'canvas-action', action:'speak', text: text}, '*');
|
|
1002
|
+
}
|
|
1003
|
+
</script>
|
|
1004
|
+
</body>
|
|
1005
|
+
</html>
|