@conversionpros/aiva 1.0.1 → 2.0.1

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 (149) 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/constants.js +72 -0
  5. package/lib/launch-agent.js +112 -0
  6. package/lib/prerequisites.js +236 -0
  7. package/lib/process.js +59 -145
  8. package/lib/setup.js +224 -194
  9. package/lib/validate.js +194 -0
  10. package/package.json +9 -34
  11. package/auto-deploy.js +0 -190
  12. package/cli-sync.js +0 -126
  13. package/d2a-prompt-template.txt +0 -106
  14. package/diagnostics-api.js +0 -304
  15. package/docs/ara-dedup-fix-scope.md +0 -112
  16. package/docs/ara-fix-round2-scope.md +0 -61
  17. package/docs/ara-greeting-fix-scope.md +0 -70
  18. package/docs/calendar-date-fix-scope.md +0 -28
  19. package/docs/getting-started.md +0 -115
  20. package/docs/network-architecture-rollout-scope.md +0 -43
  21. package/docs/scope-google-oauth-integration.md +0 -351
  22. package/docs/settings-page-scope.md +0 -50
  23. package/docs/xai-imagine-scope.md +0 -116
  24. package/docs/xai-voice-integration-scope.md +0 -115
  25. package/docs/xai-voice-tools-scope.md +0 -165
  26. package/email-router.js +0 -512
  27. package/follow-up-handler.js +0 -606
  28. package/gateway-monitor.js +0 -158
  29. package/google-email.js +0 -379
  30. package/google-oauth.js +0 -310
  31. package/grok-imagine.js +0 -97
  32. package/health-reporter.js +0 -287
  33. package/invisible-prefix-base.txt +0 -206
  34. package/invisible-prefix-owner.txt +0 -26
  35. package/invisible-prefix-slim.txt +0 -10
  36. package/invisible-prefix.txt +0 -43
  37. package/knowledge-base.js +0 -472
  38. package/lib/cli.js +0 -19
  39. package/lib/server.js +0 -42
  40. package/meta-capi.js +0 -206
  41. package/meta-leads.js +0 -411
  42. package/notion-oauth.js +0 -323
  43. package/public/agent-config.html +0 -241
  44. package/public/aiva-avatar-anime.png +0 -0
  45. package/public/css/docs.css.bak +0 -688
  46. package/public/css/onboarding.css +0 -543
  47. package/public/diagrams/claude-subscription-pool.html +0 -329
  48. package/public/diagrams/claude-subscription-pool.png +0 -0
  49. package/public/docs-icon.png +0 -0
  50. package/public/escalation.html +0 -237
  51. package/public/group-config.html +0 -300
  52. package/public/icon-192.png +0 -0
  53. package/public/icon-512.png +0 -0
  54. package/public/icons/agents.svg +0 -1
  55. package/public/icons/attach.svg +0 -1
  56. package/public/icons/characters.svg +0 -1
  57. package/public/icons/chat.svg +0 -1
  58. package/public/icons/docs.svg +0 -1
  59. package/public/icons/heartbeat.svg +0 -1
  60. package/public/icons/messages.svg +0 -1
  61. package/public/icons/mic.svg +0 -1
  62. package/public/icons/notes.svg +0 -1
  63. package/public/icons/settings.svg +0 -1
  64. package/public/icons/tasks.svg +0 -1
  65. package/public/images/onboarding/p0-communication-layer.png +0 -0
  66. package/public/images/onboarding/p0-infinite-surface.png +0 -0
  67. package/public/images/onboarding/p0-learning-model.png +0 -0
  68. package/public/images/onboarding/p0-meet-aiva.png +0 -0
  69. package/public/images/onboarding/p4-contact-intelligence.png +0 -0
  70. package/public/images/onboarding/p4-context-compounds.png +0 -0
  71. package/public/images/onboarding/p4-message-router.png +0 -0
  72. package/public/images/onboarding/p4-per-contact-rules.png +0 -0
  73. package/public/images/onboarding/p4-send-messages.png +0 -0
  74. package/public/images/onboarding/p6-be-precise.png +0 -0
  75. package/public/images/onboarding/p6-review-escalations.png +0 -0
  76. package/public/images/onboarding/p6-voice-input.png +0 -0
  77. package/public/images/onboarding/p7-completion.png +0 -0
  78. package/public/index.html +0 -11594
  79. package/public/js/onboarding.js +0 -699
  80. package/public/manifest.json +0 -24
  81. package/public/messages-v2.html +0 -2824
  82. package/public/permission-approve.html.bak +0 -107
  83. package/public/permissions.html +0 -150
  84. package/public/styles/design-system.css +0 -68
  85. package/router-db.js +0 -604
  86. package/router-utils.js +0 -28
  87. package/router-v2/adapters/imessage.js +0 -191
  88. package/router-v2/adapters/quo.js +0 -82
  89. package/router-v2/adapters/whatsapp.js +0 -192
  90. package/router-v2/contact-manager.js +0 -234
  91. package/router-v2/conversation-engine.js +0 -498
  92. package/router-v2/data/knowledge-base.json +0 -176
  93. package/router-v2/data/router-v2.db +0 -0
  94. package/router-v2/data/router-v2.db-shm +0 -0
  95. package/router-v2/data/router-v2.db-wal +0 -0
  96. package/router-v2/data/router.db +0 -0
  97. package/router-v2/db.js +0 -457
  98. package/router-v2/escalation-bridge.js +0 -540
  99. package/router-v2/follow-up-engine.js +0 -347
  100. package/router-v2/index.js +0 -441
  101. package/router-v2/ingestion.js +0 -213
  102. package/router-v2/knowledge-base.js +0 -231
  103. package/router-v2/lead-qualifier.js +0 -152
  104. package/router-v2/learning-loop.js +0 -202
  105. package/router-v2/outbound-sender.js +0 -160
  106. package/router-v2/package.json +0 -13
  107. package/router-v2/permission-gate.js +0 -86
  108. package/router-v2/playbook.js +0 -177
  109. package/router-v2/prompts/base.js +0 -52
  110. package/router-v2/prompts/first-contact.js +0 -38
  111. package/router-v2/prompts/lead-qualification.js +0 -37
  112. package/router-v2/prompts/scheduling.js +0 -72
  113. package/router-v2/prompts/style-overrides.js +0 -22
  114. package/router-v2/scheduler.js +0 -301
  115. package/router-v2/scripts/migrate-v1-to-v2.js +0 -215
  116. package/router-v2/scripts/seed-faq.js +0 -67
  117. package/router-v2/seed-knowledge-base.js +0 -39
  118. package/router-v2/utils/ai.js +0 -129
  119. package/router-v2/utils/phone.js +0 -52
  120. package/router-v2/utils/response-validator.js +0 -98
  121. package/router-v2/utils/sanitize.js +0 -222
  122. package/router.js +0 -5005
  123. package/routes/google-calendar.js +0 -186
  124. package/scripts/deploy.sh +0 -62
  125. package/scripts/macos-calendar.sh +0 -232
  126. package/scripts/onboard-device.sh +0 -466
  127. package/server.js +0 -5131
  128. package/start.sh +0 -24
  129. package/templates/AGENTS.md +0 -548
  130. package/templates/IDENTITY.md +0 -15
  131. package/templates/docs-agents.html +0 -132
  132. package/templates/docs-app.html +0 -130
  133. package/templates/docs-home.html +0 -83
  134. package/templates/docs-imessage.html +0 -121
  135. package/templates/docs-tasks.html +0 -123
  136. package/templates/docs-tips.html +0 -175
  137. package/templates/getting-started.html +0 -809
  138. package/templates/invisible-prefix-base.txt +0 -171
  139. package/templates/invisible-prefix-owner.txt +0 -282
  140. package/templates/invisible-prefix.txt +0 -338
  141. package/templates/manifest.json +0 -61
  142. package/templates/memory-org/clients.md +0 -7
  143. package/templates/memory-org/credentials.md +0 -9
  144. package/templates/memory-org/devices.md +0 -7
  145. package/templates/updates.html +0 -464
  146. package/tts-proxy.js +0 -96
  147. package/voice-call-local.js +0 -731
  148. package/voice-call.js +0 -732
  149. 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; }