@conversionpros/aiva 1.0.0 → 2.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.
Files changed (150) hide show
  1. package/bin/aiva.js +26 -14
  2. package/lib/bluebubbles.js +145 -0
  3. package/lib/config-gen.js +253 -0
  4. package/lib/config.js +1 -1
  5. package/lib/constants.js +72 -0
  6. package/lib/launch-agent.js +112 -0
  7. package/lib/prerequisites.js +236 -0
  8. package/lib/process.js +59 -145
  9. package/lib/setup.js +224 -194
  10. package/lib/validate.js +194 -0
  11. package/package.json +7 -32
  12. package/auto-deploy.js +0 -190
  13. package/cli-sync.js +0 -126
  14. package/d2a-prompt-template.txt +0 -106
  15. package/diagnostics-api.js +0 -304
  16. package/docs/ara-dedup-fix-scope.md +0 -112
  17. package/docs/ara-fix-round2-scope.md +0 -61
  18. package/docs/ara-greeting-fix-scope.md +0 -70
  19. package/docs/calendar-date-fix-scope.md +0 -28
  20. package/docs/getting-started.md +0 -115
  21. package/docs/network-architecture-rollout-scope.md +0 -43
  22. package/docs/scope-google-oauth-integration.md +0 -351
  23. package/docs/settings-page-scope.md +0 -50
  24. package/docs/xai-imagine-scope.md +0 -116
  25. package/docs/xai-voice-integration-scope.md +0 -115
  26. package/docs/xai-voice-tools-scope.md +0 -165
  27. package/email-router.js +0 -512
  28. package/follow-up-handler.js +0 -606
  29. package/gateway-monitor.js +0 -158
  30. package/google-email.js +0 -379
  31. package/google-oauth.js +0 -310
  32. package/grok-imagine.js +0 -97
  33. package/health-reporter.js +0 -287
  34. package/invisible-prefix-base.txt +0 -206
  35. package/invisible-prefix-owner.txt +0 -26
  36. package/invisible-prefix-slim.txt +0 -10
  37. package/invisible-prefix.txt +0 -43
  38. package/knowledge-base.js +0 -472
  39. package/lib/cli.js +0 -19
  40. package/lib/server.js +0 -42
  41. package/meta-capi.js +0 -206
  42. package/meta-leads.js +0 -411
  43. package/notion-oauth.js +0 -323
  44. package/public/agent-config.html +0 -241
  45. package/public/aiva-avatar-anime.png +0 -0
  46. package/public/css/docs.css.bak +0 -688
  47. package/public/css/onboarding.css +0 -543
  48. package/public/diagrams/claude-subscription-pool.html +0 -329
  49. package/public/diagrams/claude-subscription-pool.png +0 -0
  50. package/public/docs-icon.png +0 -0
  51. package/public/escalation.html +0 -237
  52. package/public/group-config.html +0 -300
  53. package/public/icon-192.png +0 -0
  54. package/public/icon-512.png +0 -0
  55. package/public/icons/agents.svg +0 -1
  56. package/public/icons/attach.svg +0 -1
  57. package/public/icons/characters.svg +0 -1
  58. package/public/icons/chat.svg +0 -1
  59. package/public/icons/docs.svg +0 -1
  60. package/public/icons/heartbeat.svg +0 -1
  61. package/public/icons/messages.svg +0 -1
  62. package/public/icons/mic.svg +0 -1
  63. package/public/icons/notes.svg +0 -1
  64. package/public/icons/settings.svg +0 -1
  65. package/public/icons/tasks.svg +0 -1
  66. package/public/images/onboarding/p0-communication-layer.png +0 -0
  67. package/public/images/onboarding/p0-infinite-surface.png +0 -0
  68. package/public/images/onboarding/p0-learning-model.png +0 -0
  69. package/public/images/onboarding/p0-meet-aiva.png +0 -0
  70. package/public/images/onboarding/p4-contact-intelligence.png +0 -0
  71. package/public/images/onboarding/p4-context-compounds.png +0 -0
  72. package/public/images/onboarding/p4-message-router.png +0 -0
  73. package/public/images/onboarding/p4-per-contact-rules.png +0 -0
  74. package/public/images/onboarding/p4-send-messages.png +0 -0
  75. package/public/images/onboarding/p6-be-precise.png +0 -0
  76. package/public/images/onboarding/p6-review-escalations.png +0 -0
  77. package/public/images/onboarding/p6-voice-input.png +0 -0
  78. package/public/images/onboarding/p7-completion.png +0 -0
  79. package/public/index.html +0 -11594
  80. package/public/js/onboarding.js +0 -699
  81. package/public/manifest.json +0 -24
  82. package/public/messages-v2.html +0 -2824
  83. package/public/permission-approve.html.bak +0 -107
  84. package/public/permissions.html +0 -150
  85. package/public/styles/design-system.css +0 -68
  86. package/router-db.js +0 -604
  87. package/router-utils.js +0 -28
  88. package/router-v2/adapters/imessage.js +0 -191
  89. package/router-v2/adapters/quo.js +0 -82
  90. package/router-v2/adapters/whatsapp.js +0 -192
  91. package/router-v2/contact-manager.js +0 -234
  92. package/router-v2/conversation-engine.js +0 -498
  93. package/router-v2/data/knowledge-base.json +0 -176
  94. package/router-v2/data/router-v2.db +0 -0
  95. package/router-v2/data/router-v2.db-shm +0 -0
  96. package/router-v2/data/router-v2.db-wal +0 -0
  97. package/router-v2/data/router.db +0 -0
  98. package/router-v2/db.js +0 -457
  99. package/router-v2/escalation-bridge.js +0 -540
  100. package/router-v2/follow-up-engine.js +0 -347
  101. package/router-v2/index.js +0 -441
  102. package/router-v2/ingestion.js +0 -213
  103. package/router-v2/knowledge-base.js +0 -231
  104. package/router-v2/lead-qualifier.js +0 -152
  105. package/router-v2/learning-loop.js +0 -202
  106. package/router-v2/outbound-sender.js +0 -160
  107. package/router-v2/package.json +0 -13
  108. package/router-v2/permission-gate.js +0 -86
  109. package/router-v2/playbook.js +0 -177
  110. package/router-v2/prompts/base.js +0 -52
  111. package/router-v2/prompts/first-contact.js +0 -38
  112. package/router-v2/prompts/lead-qualification.js +0 -37
  113. package/router-v2/prompts/scheduling.js +0 -72
  114. package/router-v2/prompts/style-overrides.js +0 -22
  115. package/router-v2/scheduler.js +0 -301
  116. package/router-v2/scripts/migrate-v1-to-v2.js +0 -215
  117. package/router-v2/scripts/seed-faq.js +0 -67
  118. package/router-v2/seed-knowledge-base.js +0 -39
  119. package/router-v2/utils/ai.js +0 -129
  120. package/router-v2/utils/phone.js +0 -52
  121. package/router-v2/utils/response-validator.js +0 -98
  122. package/router-v2/utils/sanitize.js +0 -222
  123. package/router.js +0 -5005
  124. package/routes/google-calendar.js +0 -186
  125. package/scripts/deploy.sh +0 -62
  126. package/scripts/macos-calendar.sh +0 -232
  127. package/scripts/onboard-device.sh +0 -466
  128. package/server.js +0 -5131
  129. package/start.sh +0 -24
  130. package/templates/AGENTS.md +0 -548
  131. package/templates/IDENTITY.md +0 -15
  132. package/templates/docs-agents.html +0 -132
  133. package/templates/docs-app.html +0 -130
  134. package/templates/docs-home.html +0 -83
  135. package/templates/docs-imessage.html +0 -121
  136. package/templates/docs-tasks.html +0 -123
  137. package/templates/docs-tips.html +0 -175
  138. package/templates/getting-started.html +0 -809
  139. package/templates/invisible-prefix-base.txt +0 -171
  140. package/templates/invisible-prefix-owner.txt +0 -282
  141. package/templates/invisible-prefix.txt +0 -338
  142. package/templates/manifest.json +0 -61
  143. package/templates/memory-org/clients.md +0 -7
  144. package/templates/memory-org/credentials.md +0 -9
  145. package/templates/memory-org/devices.md +0 -7
  146. package/templates/updates.html +0 -464
  147. package/tts-proxy.js +0 -96
  148. package/voice-call-local.js +0 -731
  149. package/voice-call.js +0 -732
  150. package/wa-listener.js +0 -354
@@ -1,543 +0,0 @@
1
- /* AIVA Onboarding Tutorial */
2
-
3
- .onboarding-overlay {
4
- position: fixed;
5
- inset: 0;
6
- z-index: 999990 !important;
7
- background: rgba(5, 5, 20, 0.93);
8
- display: flex;
9
- flex-direction: column;
10
- align-items: center;
11
- justify-content: center;
12
- opacity: 0;
13
- transition: opacity 0.4s ease;
14
- overflow: hidden;
15
- }
16
- .onboarding-overlay.visible { opacity: 1; }
17
- .onboarding-overlay.hidden { display: none; }
18
-
19
- /* Progress Bar */
20
- .onboarding-progress {
21
- position: fixed;
22
- top: 0;
23
- left: 0;
24
- right: 0;
25
- z-index: 999995 !important;
26
- padding: 12px 20px 8px;
27
- background: rgba(15, 15, 35, 0.95);
28
- backdrop-filter: blur(12px);
29
- }
30
- .onboarding-progress-label {
31
- display: flex;
32
- justify-content: space-between;
33
- align-items: center;
34
- margin-bottom: 6px;
35
- }
36
- .onboarding-progress-phase {
37
- font-size: 0.7rem;
38
- font-weight: 600;
39
- text-transform: uppercase;
40
- letter-spacing: 0.08em;
41
- color: #94a3b8;
42
- }
43
- .onboarding-progress-step {
44
- font-size: 0.7rem;
45
- color: #64748b;
46
- }
47
- .onboarding-progress-bar {
48
- height: 3px;
49
- background: rgba(255,255,255,0.08);
50
- border-radius: 2px;
51
- overflow: hidden;
52
- }
53
- .onboarding-progress-fill {
54
- height: 100%;
55
- background: linear-gradient(135deg, #6c63ff, #ec4899);
56
- border-radius: 2px;
57
- transition: width 0.5s ease;
58
- width: 0%;
59
- max-width: 100%;
60
- }
61
-
62
- /* Skip button (replay mode only) */
63
- .onboarding-skip {
64
- position: fixed;
65
- top: 12px;
66
- right: 16px;
67
- z-index: 999996 !important;
68
- background: rgba(255,255,255,0.08);
69
- border: 1px solid rgba(255,255,255,0.12);
70
- color: #94a3b8;
71
- padding: 6px 16px;
72
- border-radius: 20px;
73
- font-size: 0.8rem;
74
- cursor: pointer;
75
- transition: all 0.2s;
76
- }
77
- .onboarding-skip:hover {
78
- background: rgba(255,255,255,0.15);
79
- color: #f1f5f9;
80
- }
81
-
82
- /* Educational Screen (full-screen card) */
83
- .onboarding-screen {
84
- position: absolute;
85
- inset: 0;
86
- display: flex;
87
- flex-direction: column;
88
- align-items: center;
89
- justify-content: center;
90
- padding: 80px 24px 160px;
91
- overflow-y: auto;
92
- -webkit-overflow-scrolling: touch;
93
- opacity: 0;
94
- transform: translateX(40px);
95
- transition: opacity 0.4s ease, transform 0.4s ease;
96
- pointer-events: none;
97
- }
98
- .onboarding-screen.active {
99
- opacity: 1;
100
- transform: translateX(0);
101
- pointer-events: auto;
102
- }
103
- .onboarding-screen.exit-left {
104
- opacity: 0;
105
- transform: translateX(-40px);
106
- }
107
-
108
- .onboarding-icon {
109
- width: 100px;
110
- height: 100px;
111
- border-radius: 28px;
112
- display: flex;
113
- align-items: center;
114
- justify-content: center;
115
- font-size: 3rem;
116
- margin-bottom: 32px;
117
- flex-shrink: 0;
118
- color: rgba(255,255,255,0.9);
119
- }
120
- .onboarding-icon svg {
121
- filter: drop-shadow(0 0 8px currentColor);
122
- }
123
- .onboarding-icon.purple svg { color: #818cf8; filter: drop-shadow(0 0 12px rgba(129,140,248,0.5)); }
124
- .onboarding-icon.pink svg { color: #f472b6; filter: drop-shadow(0 0 12px rgba(244,114,182,0.5)); }
125
- .onboarding-icon.blue svg { color: #60a5fa; filter: drop-shadow(0 0 12px rgba(96,165,250,0.5)); }
126
- .onboarding-icon.green svg { color: #34d399; filter: drop-shadow(0 0 12px rgba(52,211,153,0.5)); }
127
-
128
- /* SVG icon in feature cards */
129
- .ob-svg-icon { color: #94a3b8; }
130
- .onboarding-feature-icon .ob-svg-icon { color: #818cf8; }
131
-
132
- /* SVG checkmark animation */
133
- @keyframes svgDraw {
134
- to { stroke-dashoffset: 0; }
135
- }
136
- .onboarding-complete-check svg { color: white; }
137
-
138
- /* Pull-quote on completion */
139
- .onboarding-pullquote {
140
- font-size: 0.95rem;
141
- font-style: italic;
142
- color: #94a3b8;
143
- text-align: center;
144
- max-width: 360px;
145
- margin-top: 24px;
146
- padding: 16px 20px;
147
- border-left: 2px solid rgba(99,102,241,0.4);
148
- line-height: 1.5;
149
- }
150
-
151
- /* Interactive guide step indicator */
152
- .onboarding-guide-step-indicator {
153
- display: flex;
154
- align-items: center;
155
- gap: 0;
156
- margin-bottom: 28px;
157
- }
158
- .guide-dot {
159
- width: 10px;
160
- height: 10px;
161
- border-radius: 50%;
162
- background: rgba(255,255,255,0.12);
163
- border: 1.5px solid rgba(255,255,255,0.2);
164
- transition: all 0.3s ease;
165
- flex-shrink: 0;
166
- }
167
- .guide-dot.active {
168
- background: #6c63ff;
169
- border-color: #6c63ff;
170
- box-shadow: 0 0 12px rgba(108,99,255,0.5);
171
- transform: scale(1.2);
172
- }
173
- .guide-dot.completed {
174
- background: #10b981;
175
- border-color: #10b981;
176
- }
177
- .guide-dot-line {
178
- width: 24px;
179
- height: 1.5px;
180
- background: rgba(255,255,255,0.1);
181
- flex-shrink: 0;
182
- }
183
- .onboarding-icon.purple { background: rgba(99,102,241,0.15); }
184
- .onboarding-icon.pink { background: rgba(236,72,153,0.15); }
185
- .onboarding-icon.green { background: rgba(16,185,129,0.15); }
186
- .onboarding-icon.amber { background: rgba(245,158,11,0.15); }
187
- .onboarding-icon.blue { background: rgba(59,130,246,0.15); }
188
-
189
- .onboarding-title {
190
- font-size: 1.75rem;
191
- font-weight: 700;
192
- text-align: center;
193
- margin-bottom: 12px;
194
- color: #f1f5f9;
195
- line-height: 1.2;
196
- }
197
-
198
- .onboarding-subtitle {
199
- font-size: 1rem;
200
- color: #94a3b8;
201
- text-align: center;
202
- max-width: 380px;
203
- line-height: 1.6;
204
- margin-bottom: 8px;
205
- }
206
-
207
- .onboarding-detail {
208
- font-size: 0.85rem;
209
- color: #64748b;
210
- text-align: center;
211
- max-width: 360px;
212
- line-height: 1.5;
213
- margin-top: 16px;
214
- }
215
-
216
- .onboarding-features {
217
- display: flex;
218
- flex-direction: column;
219
- gap: 12px;
220
- margin-top: 24px;
221
- width: 100%;
222
- max-width: 380px;
223
- }
224
-
225
- .onboarding-feature {
226
- display: flex;
227
- align-items: flex-start;
228
- gap: 12px;
229
- background: rgba(255,255,255,0.06);
230
- border: 1px solid rgba(255,255,255,0.10);
231
- border-radius: 12px;
232
- padding: 14px 16px;
233
- backdrop-filter: blur(4px);
234
- }
235
- .onboarding-feature-icon {
236
- font-size: 1.25rem;
237
- flex-shrink: 0;
238
- width: 28px;
239
- text-align: center;
240
- }
241
- .onboarding-feature-text {
242
- font-size: 0.875rem;
243
- color: #cbd5e1;
244
- line-height: 1.4;
245
- }
246
- .onboarding-feature-text strong {
247
- color: #f1f5f9;
248
- }
249
-
250
- /* Navigation Buttons */
251
- .onboarding-nav {
252
- position: fixed;
253
- bottom: 0;
254
- left: 0;
255
- right: 0;
256
- z-index: 999995 !important;
257
- display: flex;
258
- gap: 12px;
259
- padding: 20px 24px;
260
- padding-bottom: max(20px, env(safe-area-inset-bottom));
261
- background: linear-gradient(to top, rgba(5,5,20,0.98) 60%, transparent);
262
- }
263
- .onboarding-btn {
264
- flex: 1;
265
- padding: 16px;
266
- border-radius: 14px;
267
- border: none;
268
- font-weight: 600;
269
- font-size: 1rem;
270
- cursor: pointer;
271
- transition: all 0.2s;
272
- }
273
- .onboarding-btn-back {
274
- background: rgba(255,255,255,0.06);
275
- color: #94a3b8;
276
- border: 1px solid rgba(255,255,255,0.1);
277
- max-width: 120px;
278
- }
279
- .onboarding-btn-back:hover { background: rgba(255,255,255,0.1); color: #f1f5f9; }
280
- .onboarding-btn-next {
281
- background: linear-gradient(135deg, #6c63ff, #ec4899);
282
- color: white;
283
- box-shadow: 0 4px 20px rgba(99,102,241,0.3);
284
- }
285
- .onboarding-btn-next:hover {
286
- transform: translateY(-1px);
287
- box-shadow: 0 6px 24px rgba(99,102,241,0.4);
288
- }
289
-
290
- /* Tooltip Mode */
291
- .onboarding-tooltip-backdrop {
292
- position: fixed;
293
- inset: 0;
294
- z-index: 999990 !important;
295
- background: rgba(5,5,20,0.92);
296
- pointer-events: auto;
297
- }
298
-
299
- .onboarding-highlight {
300
- position: fixed;
301
- z-index: 999992 !important;
302
- box-shadow: 0 0 0 4px rgba(99,102,241,0.5);
303
- border-radius: 12px;
304
- transition: all 0.4s ease;
305
- pointer-events: none;
306
- animation: onboardingPulse 2s ease-in-out infinite;
307
- }
308
- @keyframes onboardingPulse {
309
- 0%, 100% { box-shadow: 0 0 0 4px rgba(99,102,241,0.5); }
310
- 50% { box-shadow: 0 0 0 4px rgba(99,102,241,0.5), 0 0 20px 4px rgba(99,102,241,0.3); }
311
- }
312
-
313
- /* Force highlighted elements to be visible */
314
- .onboarding-highlighted,
315
- .onboarding-highlighted * {
316
- color: #fff !important;
317
- opacity: 1 !important;
318
- visibility: visible !important;
319
- }
320
- .onboarding-highlighted {
321
- position: relative;
322
- z-index: 999992 !important;
323
- }
324
-
325
- .onboarding-tooltip {
326
- position: fixed;
327
- z-index: 999995 !important;
328
- background: #1e1e3a;
329
- border: 1px solid rgba(99,102,241,0.3);
330
- border-radius: 16px;
331
- padding: 24px 20px 20px;
332
- max-width: 320px;
333
- width: calc(100vw - 48px);
334
- box-shadow: 0 8px 32px rgba(0,0,0,0.5);
335
- animation: tooltipIn 0.3s ease;
336
- }
337
- @keyframes tooltipIn {
338
- from { opacity: 0; transform: translateY(8px); }
339
- to { opacity: 1; transform: translateY(0); }
340
- }
341
- .onboarding-tooltip-title {
342
- font-size: 1rem;
343
- font-weight: 600;
344
- color: #f1f5f9;
345
- margin-bottom: 6px;
346
- }
347
- .onboarding-tooltip-text {
348
- font-size: 0.85rem;
349
- color: #94a3b8;
350
- line-height: 1.5;
351
- }
352
- .onboarding-tooltip-nav {
353
- display: flex;
354
- gap: 8px;
355
- margin-top: 16px;
356
- }
357
- .onboarding-tooltip-nav .onboarding-btn {
358
- padding: 10px 16px;
359
- font-size: 0.85rem;
360
- }
361
-
362
- /* Completion Screen */
363
- .onboarding-complete-check {
364
- width: 100px;
365
- height: 100px;
366
- border-radius: 50%;
367
- background: linear-gradient(135deg, #10b981, #059669);
368
- display: flex;
369
- align-items: center;
370
- justify-content: center;
371
- font-size: 3rem;
372
- margin-bottom: 28px;
373
- box-shadow: 0 8px 32px rgba(16,185,129,0.3);
374
- }
375
-
376
- .onboarding-summary {
377
- display: flex;
378
- flex-wrap: wrap;
379
- gap: 10px;
380
- justify-content: center;
381
- margin-top: 20px;
382
- max-width: 380px;
383
- }
384
- .onboarding-summary-item {
385
- display: flex;
386
- align-items: center;
387
- gap: 6px;
388
- background: rgba(255,255,255,0.04);
389
- border: 1px solid rgba(255,255,255,0.08);
390
- border-radius: 20px;
391
- padding: 6px 14px;
392
- font-size: 0.8rem;
393
- color: #cbd5e1;
394
- }
395
-
396
- /* Ensure overlay covers sidebar on desktop */
397
- .onboarding-overlay,
398
- .onboarding-tooltip-backdrop {
399
- left: 0 !important;
400
- width: 100vw !important;
401
- }
402
-
403
- /* Hide progress bar gradient bleed in tooltip mode */
404
- .onboarding-overlay[style*="transparent"] .onboarding-progress-fill {
405
- box-shadow: none;
406
- }
407
- .onboarding-overlay[style*="transparent"] .onboarding-progress {
408
- border-right: none;
409
- box-shadow: none;
410
- }
411
-
412
- /* Mobile-friendly tooltip sizing (JS handles all positioning) */
413
- .onboarding-tooltip {
414
- max-height: 50vh;
415
- overflow-y: auto;
416
- -webkit-overflow-scrolling: touch;
417
- box-sizing: border-box;
418
- }
419
-
420
- @media (max-width: 768px) {
421
- .onboarding-tooltip-nav .onboarding-btn {
422
- min-height: 44px;
423
- font-size: 0.9rem;
424
- -webkit-tap-highlight-color: transparent;
425
- }
426
- }
427
-
428
- /* Responsive */
429
- @media (max-width: 400px) {
430
- .onboarding-title { font-size: 1.4rem; }
431
- .onboarding-icon { width: 80px; height: 80px; font-size: 2.5rem; border-radius: 22px; }
432
- .onboarding-screen { padding: 70px 20px 150px; }
433
- }
434
-
435
- /* ═══ Animated SVG Illustrations ═══ */
436
-
437
- .onboarding-anim-container {
438
- width: 140px;
439
- height: 120px;
440
- margin-bottom: 16px;
441
- display: flex;
442
- align-items: center;
443
- justify-content: center;
444
- flex-shrink: 0;
445
- overflow: hidden;
446
- position: relative;
447
- }
448
- .onboarding-anim-container svg {
449
- width: 100%;
450
- height: 100%;
451
- max-width: 140px;
452
- max-height: 120px;
453
- }
454
-
455
- /* Neural network / constellation */
456
- @keyframes obNodePulse {
457
- 0%, 100% { r: 3; opacity: 0.7; }
458
- 50% { r: 4.5; opacity: 1; }
459
- }
460
- @keyframes obNodePulse2 {
461
- 0%, 100% { r: 2.5; opacity: 0.5; }
462
- 50% { r: 4; opacity: 0.9; }
463
- }
464
- @keyframes obLineDraw {
465
- 0% { stroke-dashoffset: 100; }
466
- 100% { stroke-dashoffset: 0; }
467
- }
468
- @keyframes obLineFlow {
469
- 0% { stroke-dashoffset: 20; }
470
- 100% { stroke-dashoffset: 0; }
471
- }
472
- @keyframes obGlowPulse {
473
- 0%, 100% { opacity: 0.15; }
474
- 50% { opacity: 0.4; }
475
- }
476
- @keyframes obFloat {
477
- 0%, 100% { transform: translateY(0); }
478
- 50% { transform: translateY(-6px); }
479
- }
480
-
481
- /* Message path particles */
482
- @keyframes obParticleFlow {
483
- 0% { offset-distance: 0%; opacity: 0; }
484
- 10% { opacity: 1; }
485
- 90% { opacity: 1; }
486
- 100% { offset-distance: 100%; opacity: 0; }
487
- }
488
- @keyframes obParticleFlow2 {
489
- 0% { offset-distance: 0%; opacity: 0; }
490
- 15% { opacity: 0.8; }
491
- 85% { opacity: 0.8; }
492
- 100% { offset-distance: 100%; opacity: 0; }
493
- }
494
-
495
- /* Pipeline flow */
496
- @keyframes obPipeMove {
497
- 0% { transform: translateX(-30px); opacity: 0; }
498
- 20% { opacity: 1; }
499
- 80% { opacity: 1; }
500
- 100% { transform: translateX(30px); opacity: 0; }
501
- }
502
- @keyframes obPipeMove2 {
503
- 0% { transform: translateX(-20px); opacity: 0; }
504
- 25% { opacity: 0.8; }
505
- 75% { opacity: 0.8; }
506
- 100% { transform: translateX(20px); opacity: 0; }
507
- }
508
-
509
- /* Power-up rings */
510
- @keyframes obRingExpand {
511
- 0% { r: 8; opacity: 0.6; stroke-width: 2; }
512
- 100% { r: 50; opacity: 0; stroke-width: 0.5; }
513
- }
514
- @keyframes obRingExpand2 {
515
- 0% { r: 6; opacity: 0.5; stroke-width: 1.5; }
516
- 100% { r: 45; opacity: 0; stroke-width: 0.3; }
517
- }
518
- @keyframes obEnergyPulse {
519
- 0%, 100% { opacity: 0.4; transform: scale(1); }
520
- 50% { opacity: 1; transform: scale(1.15); }
521
- }
522
-
523
- /* Completion checkmark draw */
524
- @keyframes obCheckDraw {
525
- 0% { stroke-dashoffset: 200; }
526
- 100% { stroke-dashoffset: 0; }
527
- }
528
- @keyframes obRingsDraw {
529
- 0% { stroke-dashoffset: 220; opacity: 0.8; }
530
- 100% { stroke-dashoffset: 0; opacity: 0.3; }
531
- }
532
- @keyframes obConfetti {
533
- 0% { transform: translateY(0) rotate(0deg); opacity: 1; }
534
- 100% { transform: translateY(-40px) rotate(180deg); opacity: 0; }
535
- }
536
- @keyframes obConfettiDown {
537
- 0% { transform: translateY(0) rotate(0deg); opacity: 1; }
538
- 100% { transform: translateY(30px) rotate(-120deg); opacity: 0; }
539
- }
540
-
541
- /* Shared glow filter pulse */
542
- .ob-anim-glow { animation: obGlowPulse 3s ease-in-out infinite; }
543
- .ob-anim-float { animation: obFloat 4s ease-in-out infinite; }