@ipv9/tokentracker-cli 0.39.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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +464 -0
  3. package/README.ko.md +464 -0
  4. package/README.md +476 -0
  5. package/README.zh-CN.md +469 -0
  6. package/bin/tracker.js +52 -0
  7. package/dashboard/dist/app-icon.png +0 -0
  8. package/dashboard/dist/apple-touch-icon.png +0 -0
  9. package/dashboard/dist/assets/ActivityHeatmap-BxBGHY1z.js +42 -0
  10. package/dashboard/dist/assets/Card-GROxUc_6.js +1 -0
  11. package/dashboard/dist/assets/DashboardPage-BZ5VFoBk.js +19 -0
  12. package/dashboard/dist/assets/DevicePage-CQts7ivB.js +1 -0
  13. package/dashboard/dist/assets/DialogTitle-DqFsk26U.js +1 -0
  14. package/dashboard/dist/assets/FadeIn-HBBXW_3q.js +1 -0
  15. package/dashboard/dist/assets/HeaderGithubStar-COD2HfaF.js +1 -0
  16. package/dashboard/dist/assets/IpCheckPage-Cn0l8-BQ.js +15 -0
  17. package/dashboard/dist/assets/LandingPage-CmV1BMU4.js +4356 -0
  18. package/dashboard/dist/assets/LeaderboardAvatar-CiIpWZwb.js +1 -0
  19. package/dashboard/dist/assets/LeaderboardPage-BU0mlR3g.js +6 -0
  20. package/dashboard/dist/assets/LeaderboardProfileModal-C49_3Xm9.js +72 -0
  21. package/dashboard/dist/assets/LeaderboardProfilePage-Bh1n0BAM.js +1 -0
  22. package/dashboard/dist/assets/LimitsPage-fZAmwLWT.js +2 -0
  23. package/dashboard/dist/assets/LocalOnlyNotice-D3rQdA-P.js +1 -0
  24. package/dashboard/dist/assets/LoginPage-enO4XP-c.js +1 -0
  25. package/dashboard/dist/assets/PopoverPopup-pitJEpN1.js +1 -0
  26. package/dashboard/dist/assets/Select-tT9x4ntD.js +1 -0
  27. package/dashboard/dist/assets/SelectItemText-C7F7eIm0.js +1 -0
  28. package/dashboard/dist/assets/SettingsPage-pDasZNU2.js +1 -0
  29. package/dashboard/dist/assets/SkillsPage-DEu7FY-2.js +1 -0
  30. package/dashboard/dist/assets/WidgetsPage-DGcO7rbp.js +1 -0
  31. package/dashboard/dist/assets/WrappedPage-D_1ID213.js +1 -0
  32. package/dashboard/dist/assets/agent-logos-DXQVg1xy.js +1 -0
  33. package/dashboard/dist/assets/arrow-up-right-DNLo92Ba.js +1 -0
  34. package/dashboard/dist/assets/download-DbBBBpJF.js +1 -0
  35. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
  36. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
  37. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
  38. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
  39. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DH5Q319x.woff +0 -0
  40. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-VCNRadI3.woff2 +0 -0
  41. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-BKC3PZkM.woff +0 -0
  42. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DdrQ8KBw.woff2 +0 -0
  43. package/dashboard/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  44. package/dashboard/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  45. package/dashboard/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
  46. package/dashboard/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
  47. package/dashboard/dist/assets/geist-mono-latin-700-normal-D6izGJRP.woff2 +0 -0
  48. package/dashboard/dist/assets/geist-mono-latin-700-normal-QGw08Lff.woff +0 -0
  49. package/dashboard/dist/assets/geist-mono-latin-900-normal-CmoKXrdK.woff +0 -0
  50. package/dashboard/dist/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2 +0 -0
  51. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
  52. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
  53. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
  54. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
  55. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BX9f1BHp.woff +0 -0
  56. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-YOllDaLV.woff2 +0 -0
  57. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-Br6WNUGb.woff +0 -0
  58. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-CrmBTzU2.woff2 +0 -0
  59. package/dashboard/dist/assets/index-BeoRn2gJ.js +2 -0
  60. package/dashboard/dist/assets/info-Bh5qTz6k.js +1 -0
  61. package/dashboard/dist/assets/main-BIY3Nj6I.js +969 -0
  62. package/dashboard/dist/assets/main-G_F9Iu_x.css +1 -0
  63. package/dashboard/dist/assets/use-limits-display-prefs-B4iJ-bBc.js +1 -0
  64. package/dashboard/dist/assets/use-native-settings-DHjPFDv8.js +1 -0
  65. package/dashboard/dist/assets/use-usage-limits-odqe9OY7.js +1 -0
  66. package/dashboard/dist/assets/useCurrency-BsSZiZMP.js +1 -0
  67. package/dashboard/dist/assets/useOpenInteractionType-BQhgq4rv.js +12 -0
  68. package/dashboard/dist/brand-logos/antigravity.svg +1 -0
  69. package/dashboard/dist/brand-logos/claude-code.svg +1 -0
  70. package/dashboard/dist/brand-logos/codebuddy.svg +1 -0
  71. package/dashboard/dist/brand-logos/codex.svg +15 -0
  72. package/dashboard/dist/brand-logos/copilot.svg +1 -0
  73. package/dashboard/dist/brand-logos/cursor.svg +1 -0
  74. package/dashboard/dist/brand-logos/gemini.svg +1 -0
  75. package/dashboard/dist/brand-logos/grok.svg +1 -0
  76. package/dashboard/dist/brand-logos/hermes.svg +1 -0
  77. package/dashboard/dist/brand-logos/kilo.svg +4 -0
  78. package/dashboard/dist/brand-logos/kimi.svg +1 -0
  79. package/dashboard/dist/brand-logos/kiro.svg +1 -0
  80. package/dashboard/dist/brand-logos/openclaw.svg +22 -0
  81. package/dashboard/dist/brand-logos/opencode.svg +3 -0
  82. package/dashboard/dist/clawd/happy.svg +161 -0
  83. package/dashboard/dist/clawd/idle/collapse.svg +101 -0
  84. package/dashboard/dist/clawd/idle/doze.svg +72 -0
  85. package/dashboard/dist/clawd/idle/follow.svg +64 -0
  86. package/dashboard/dist/clawd/idle/living.svg +196 -0
  87. package/dashboard/dist/clawd/idle/look.svg +115 -0
  88. package/dashboard/dist/clawd/idle/yawn.svg +158 -0
  89. package/dashboard/dist/clawd/mini/alert.svg +129 -0
  90. package/dashboard/dist/clawd/mini/crabwalk.svg +76 -0
  91. package/dashboard/dist/clawd/mini/enter-sleep.svg +65 -0
  92. package/dashboard/dist/clawd/mini/enter.svg +115 -0
  93. package/dashboard/dist/clawd/mini/happy.svg +124 -0
  94. package/dashboard/dist/clawd/mini/idle-tight.svg +15 -0
  95. package/dashboard/dist/clawd/mini/idle.svg +83 -0
  96. package/dashboard/dist/clawd/mini/peek.svg +82 -0
  97. package/dashboard/dist/clawd/mini/sleep.svg +112 -0
  98. package/dashboard/dist/clawd/react/double.svg +108 -0
  99. package/dashboard/dist/clawd/react/drag.svg +102 -0
  100. package/dashboard/dist/clawd/react/left.svg +102 -0
  101. package/dashboard/dist/clawd/react/right.svg +102 -0
  102. package/dashboard/dist/clawd/sleep/collapse-sleep.svg +247 -0
  103. package/dashboard/dist/clawd/sleep/sleeping.svg +118 -0
  104. package/dashboard/dist/clawd/sleep/wake.svg +277 -0
  105. package/dashboard/dist/clawd/static-base.svg +21 -0
  106. package/dashboard/dist/clawd/status/disconnected.svg +136 -0
  107. package/dashboard/dist/clawd/status/error.svg +94 -0
  108. package/dashboard/dist/clawd/status/notification.svg +134 -0
  109. package/dashboard/dist/clawd/working/building.svg +231 -0
  110. package/dashboard/dist/clawd/working/carrying.svg +107 -0
  111. package/dashboard/dist/clawd/working/conducting.svg +118 -0
  112. package/dashboard/dist/clawd/working/confused.svg +113 -0
  113. package/dashboard/dist/clawd/working/debugger.svg +91 -0
  114. package/dashboard/dist/clawd/working/juggling.svg +82 -0
  115. package/dashboard/dist/clawd/working/overheated.svg +75 -0
  116. package/dashboard/dist/clawd/working/pushing.svg +125 -0
  117. package/dashboard/dist/clawd/working/sweeping.svg +79 -0
  118. package/dashboard/dist/clawd/working/thinking.svg +119 -0
  119. package/dashboard/dist/clawd/working/typing.svg +153 -0
  120. package/dashboard/dist/clawd/working/ultrathink.svg +166 -0
  121. package/dashboard/dist/clawd/working/wizard.svg +98 -0
  122. package/dashboard/dist/dashboard-dark.png +0 -0
  123. package/dashboard/dist/favicon-16.png +0 -0
  124. package/dashboard/dist/favicon-32.png +0 -0
  125. package/dashboard/dist/favicon.ico +0 -0
  126. package/dashboard/dist/feed.xml +34 -0
  127. package/dashboard/dist/icon-192.png +0 -0
  128. package/dashboard/dist/icon-512.png +0 -0
  129. package/dashboard/dist/index.html +355 -0
  130. package/dashboard/dist/llms.txt +53 -0
  131. package/dashboard/dist/neon_bg.png +0 -0
  132. package/dashboard/dist/robots.txt +7 -0
  133. package/dashboard/dist/share.html +140 -0
  134. package/dashboard/dist/sitemap.xml +27 -0
  135. package/dashboard/dist/widgets-overview.png +0 -0
  136. package/package.json +78 -0
  137. package/scripts/install-local-service.sh +140 -0
  138. package/scripts/uninstall-local-service.sh +21 -0
  139. package/src/cli.js +95 -0
  140. package/src/commands/device-login.js +161 -0
  141. package/src/commands/diagnostics.js +38 -0
  142. package/src/commands/doctor.js +96 -0
  143. package/src/commands/init.js +1195 -0
  144. package/src/commands/serve.js +351 -0
  145. package/src/commands/status.js +609 -0
  146. package/src/commands/sync.js +2285 -0
  147. package/src/commands/uninstall.js +189 -0
  148. package/src/commands/wrapped.js +150 -0
  149. package/src/lib/antigravity-paths.js +48 -0
  150. package/src/lib/browser-auth.js +281 -0
  151. package/src/lib/categorizer-utils.js +232 -0
  152. package/src/lib/claude-categorizer.js +1319 -0
  153. package/src/lib/claude-config.js +204 -0
  154. package/src/lib/cli-ui.js +179 -0
  155. package/src/lib/codex-config.js +350 -0
  156. package/src/lib/codex-context-breakdown.js +400 -0
  157. package/src/lib/codex-rollout-parser.js +623 -0
  158. package/src/lib/codex-token-refresh.js +112 -0
  159. package/src/lib/cursor-config.js +425 -0
  160. package/src/lib/debug-flags.js +7 -0
  161. package/src/lib/diagnostics.js +272 -0
  162. package/src/lib/doctor.js +338 -0
  163. package/src/lib/fs.js +91 -0
  164. package/src/lib/gemini-config.js +288 -0
  165. package/src/lib/grok-hook.js +351 -0
  166. package/src/lib/init-flow.js +42 -0
  167. package/src/lib/local-api.js +1861 -0
  168. package/src/lib/openclaw-hook.js +420 -0
  169. package/src/lib/openclaw-session-plugin.js +520 -0
  170. package/src/lib/opencode-config.js +99 -0
  171. package/src/lib/passive-mode.js +185 -0
  172. package/src/lib/pricing/curated-overrides.json +79 -0
  173. package/src/lib/pricing/index.js +143 -0
  174. package/src/lib/pricing/litellm-fetcher.js +172 -0
  175. package/src/lib/pricing/matcher.js +255 -0
  176. package/src/lib/pricing/seed-snapshot.json +1 -0
  177. package/src/lib/progress.js +76 -0
  178. package/src/lib/project-usage-purge.js +106 -0
  179. package/src/lib/prompt.js +24 -0
  180. package/src/lib/proxy-env.js +131 -0
  181. package/src/lib/rollout.js +8442 -0
  182. package/src/lib/runtime-config.js +122 -0
  183. package/src/lib/skill-usage.js +267 -0
  184. package/src/lib/skills-manager.js +1127 -0
  185. package/src/lib/source-metadata.js +48 -0
  186. package/src/lib/sqlite-reader.js +136 -0
  187. package/src/lib/static-server.js +59 -0
  188. package/src/lib/subscriptions.js +453 -0
  189. package/src/lib/tracker-paths.js +16 -0
  190. package/src/lib/upload-throttle.js +148 -0
  191. package/src/lib/usage-limits.js +1806 -0
  192. package/src/lib/wrapped-aggregator.js +225 -0
@@ -0,0 +1,118 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* Slow, rhythmic deep breathing animation */
5
+ .breathe {
6
+ transform-origin: 7.5px 15px; /* Pivot at the floor to expand upwards */
7
+ animation: breathe-squash 4.5s infinite ease-in-out;
8
+ }
9
+
10
+ /* Shadow expands slightly as the body inflates */
11
+ .shadow-breathe {
12
+ transform-origin: 7.5px 15.5px;
13
+ animation: shadow-pulse 4.5s infinite ease-in-out;
14
+ }
15
+
16
+ /* Zzz Particle Base Styles */
17
+ .z-particle {
18
+ opacity: 0;
19
+ }
20
+ .z1 { animation: float-1 6s infinite ease-in-out; animation-delay: 0s; }
21
+ .z2 { animation: float-2 6s infinite ease-in-out; animation-delay: 2s; }
22
+ .z3 { animation: float-3 6s infinite ease-in-out; animation-delay: 4s; }
23
+
24
+ /* Breathing Keyframes (Slow inhale, hold, exhale, pause) */
25
+ @keyframes breathe-squash {
26
+ 0%, 80%, 100% { transform: scale(1, 1); }
27
+ 30%, 40% { transform: scale(1.02, 1.25); } /* Chest expands/inflates */
28
+ }
29
+
30
+ @keyframes shadow-pulse {
31
+ 0%, 80%, 100% { transform: scaleX(1); opacity: 0.4; }
32
+ 30%, 40% { transform: scaleX(1.05); opacity: 0.5; }
33
+ }
34
+
35
+ /* Swaying and fading floating Z keyframes (Adjusted for lowered head) */
36
+ @keyframes float-1 {
37
+ 0% { transform: translate(5px, 8px) scale(0.4); opacity: 0; }
38
+ 10% { opacity: 1; }
39
+ 30% { transform: translate(9px, 4px) scale(0.6); }
40
+ 50% { transform: translate(4px, 0px) scale(0.8); }
41
+ 70% { transform: translate(8px, -4px) scale(1.0); }
42
+ 90% { opacity: 0.8; }
43
+ 100% { transform: translate(6px, -8px) scale(1.1); opacity: 0; }
44
+ }
45
+
46
+ @keyframes float-2 {
47
+ 0% { transform: translate(8px, 9px) scale(0.3); opacity: 0; }
48
+ 10% { opacity: 1; }
49
+ 30% { transform: translate(5px, 5px) scale(0.5); }
50
+ 50% { transform: translate(9px, 1px) scale(0.7); }
51
+ 70% { transform: translate(6px, -3px) scale(0.9); }
52
+ 90% { opacity: 0.8; }
53
+ 100% { transform: translate(8px, -7px) scale(1.0); opacity: 0; }
54
+ }
55
+
56
+ @keyframes float-3 {
57
+ 0% { transform: translate(6px, 7px) scale(0.5); opacity: 0; }
58
+ 10% { opacity: 1; }
59
+ 30% { transform: translate(9px, 3px) scale(0.7); }
60
+ 50% { transform: translate(4px, -1px) scale(0.9); }
61
+ 70% { transform: translate(8px, -5px) scale(1.1); }
62
+ 90% { opacity: 0.8; }
63
+ 100% { transform: translate(5px, -9px) scale(1.2); opacity: 0; }
64
+ }
65
+ </style>
66
+
67
+ <!-- Pixel Art "Z" Definitions -->
68
+ <g id="pixel-z">
69
+ <rect x="0" y="0" width="4" height="1" />
70
+ <rect x="2" y="1" width="1" height="1" />
71
+ <rect x="1" y="2" width="1" height="1" />
72
+ <rect x="0" y="3" width="4" height="1" />
73
+ </g>
74
+
75
+ <g id="pixel-z-small">
76
+ <rect x="0" y="0" width="3" height="1" />
77
+ <rect x="1" y="1" width="1" height="1" />
78
+ <rect x="0" y="2" width="3" height="1" />
79
+ </g>
80
+ </defs>
81
+
82
+ <!-- Ground Shadow (Widened for the splooted posture) -->
83
+ <rect id="ground-shadow" class="shadow-breathe" x="-1" y="15" width="17" height="1" fill="#000000" />
84
+
85
+ <!-- Floating Zzz Bubbles -->
86
+ <g class="zzz-particles">
87
+ <use href="#pixel-z" class="z-particle z1" fill="#90A4AE" />
88
+ <use href="#pixel-z-small" class="z-particle z2" fill="#B0BEC5" />
89
+ <use href="#pixel-z" class="z-particle z3" fill="#CFD8DC" />
90
+ </g>
91
+
92
+ <!-- Splooted / Melted Sleeping Pose -->
93
+ <g class="breathe">
94
+ <!-- Legs pointing up from behind (Relaxed Sploot) -->
95
+ <g fill="#DE886D">
96
+ <rect id="outer-left-leg-up" x="3" y="9" width="1" height="1"/>
97
+ <rect id="inner-left-leg-up" x="5" y="9" width="1" height="1"/>
98
+ <rect id="inner-right-leg-up" x="9" y="9" width="1" height="1"/>
99
+ <rect id="outer-right-leg-up" x="11" y="9" width="1" height="1"/>
100
+ </g>
101
+
102
+ <!-- Squashed Body Resting on the Floor -->
103
+ <g fill="#DE886D">
104
+ <!-- Main flattened torso -->
105
+ <rect id="torso-sploot" x="1" y="10" width="13" height="5"/>
106
+
107
+ <!-- Arms spread flat on the ground -->
108
+ <rect id="left-arm-sploot" x="-1" y="13" width="2" height="2"/>
109
+ <rect id="right-arm-sploot" x="14" y="13" width="2" height="2"/>
110
+ </g>
111
+
112
+ <!-- Ultra-Thin Shut Eyes (Dashes) -->
113
+ <g fill="#000000">
114
+ <rect id="left-eye-shut" x="3.5" y="12.5" width="2" height="0.4"/>
115
+ <rect id="right-eye-shut" x="9.5" y="12.5" width="2" height="0.4"/>
116
+ </g>
117
+ </g>
118
+ </svg>
@@ -0,0 +1,277 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500" shape-rendering="crispEdges">
2
+ <defs>
3
+ <style>
4
+ .once {
5
+ animation-duration: 1.5s;
6
+ animation-fill-mode: forwards;
7
+ animation-iteration-count: 1;
8
+ }
9
+
10
+ .scale-top-left {
11
+ transform-box: fill-box;
12
+ transform-origin: top left;
13
+ }
14
+
15
+ .shadow {
16
+ transform-origin: 7.5px 15.5px;
17
+ animation-name: shadow-wake;
18
+ animation-timing-function: linear;
19
+ }
20
+
21
+ .body-motion {
22
+ transform-origin: 7.5px 15px;
23
+ animation-name: body-motion;
24
+ animation-timing-function: cubic-bezier(0.24, 0.8, 0.24, 1);
25
+ }
26
+
27
+ .torso-shift {
28
+ animation: torso-shift 1.5s linear forwards;
29
+ }
30
+
31
+ .torso-shape {
32
+ animation: torso-shape 1.5s linear forwards;
33
+ }
34
+
35
+ .arm-left {
36
+ animation: arm-left 1.5s linear forwards;
37
+ }
38
+
39
+ .arm-right {
40
+ animation: arm-right 1.5s linear forwards;
41
+ }
42
+
43
+ .leg-shift {
44
+ animation: leg-shift 1.5s linear forwards;
45
+ }
46
+
47
+ .leg-grow {
48
+ animation: leg-grow 1.5s linear forwards;
49
+ }
50
+
51
+ .eye-shift {
52
+ animation: eye-shift 1.5s linear forwards;
53
+ }
54
+
55
+ .eye-shape {
56
+ animation: eye-shape 1.5s linear forwards;
57
+ }
58
+
59
+ @keyframes shadow-wake {
60
+ 0% {
61
+ opacity: 0.4;
62
+ transform: scaleX(1);
63
+ }
64
+ 20% {
65
+ opacity: 0.47;
66
+ transform: scaleX(0.56);
67
+ }
68
+ 33.333% {
69
+ opacity: 0.54;
70
+ transform: scaleX(0.42);
71
+ }
72
+ 46.667% {
73
+ opacity: 0.48;
74
+ transform: scaleX(0.48);
75
+ }
76
+ 56% {
77
+ opacity: 0.52;
78
+ transform: scaleX(0.56);
79
+ }
80
+ 66.667%, 100% {
81
+ opacity: 0.5;
82
+ transform: scaleX(0.5294);
83
+ }
84
+ }
85
+
86
+ @keyframes body-motion {
87
+ 0% {
88
+ transform: translate(0, 0) scale(1, 1) rotate(0deg);
89
+ }
90
+ 6.667% {
91
+ transform: translate(0, 0.35px) scale(1.03, 0.96) rotate(0deg);
92
+ }
93
+ 20% {
94
+ transform: translate(0, -2.6px) scale(0.98, 1.04) rotate(-6deg);
95
+ }
96
+ 33.333% {
97
+ transform: translate(0, -4.1px) scale(0.9, 1.22) rotate(2deg);
98
+ }
99
+ 46.667% {
100
+ transform: translate(0, -2px) scale(0.95, 1.11) rotate(0deg);
101
+ }
102
+ 54% {
103
+ transform: translate(0, -0.55px) scale(1.02, 0.98) rotate(-4deg);
104
+ }
105
+ 60% {
106
+ transform: translate(0, -0.2px) scale(0.99, 1.02) rotate(2.5deg);
107
+ }
108
+ 66.667%, 100% {
109
+ transform: translate(0, 0) scale(1, 1) rotate(0deg);
110
+ }
111
+ }
112
+
113
+ @keyframes torso-shift {
114
+ 0% {
115
+ transform: translate(-1px, 4px);
116
+ }
117
+ 8% {
118
+ transform: translate(-0.82px, 3.4px);
119
+ }
120
+ 20%, 100% {
121
+ transform: translate(0, 0);
122
+ }
123
+ }
124
+
125
+ @keyframes torso-shape {
126
+ 0% {
127
+ transform: scale(1.1818, 0.7143);
128
+ }
129
+ 8% {
130
+ transform: scale(1.14, 0.76);
131
+ }
132
+ 20%, 100% {
133
+ transform: scale(1, 1);
134
+ }
135
+ }
136
+
137
+ @keyframes arm-left {
138
+ 0% {
139
+ transform: translate(-1px, 4px);
140
+ }
141
+ 8% {
142
+ transform: translate(-0.8px, 3.4px);
143
+ }
144
+ 20%, 100% {
145
+ transform: translate(0, 0);
146
+ }
147
+ }
148
+
149
+ @keyframes arm-right {
150
+ 0% {
151
+ transform: translate(1px, 4px);
152
+ }
153
+ 8% {
154
+ transform: translate(0.8px, 3.4px);
155
+ }
156
+ 20%, 100% {
157
+ transform: translate(0, 0);
158
+ }
159
+ }
160
+
161
+ @keyframes leg-shift {
162
+ 0% {
163
+ transform: translate(0, -2px);
164
+ }
165
+ 8% {
166
+ transform: translate(0, -1.5px);
167
+ }
168
+ 20%, 100% {
169
+ transform: translate(0, 0);
170
+ }
171
+ }
172
+
173
+ @keyframes leg-grow {
174
+ 0% {
175
+ transform: scale(1, 0.25);
176
+ }
177
+ 8% {
178
+ transform: scale(1, 0.45);
179
+ }
180
+ 20%, 100% {
181
+ transform: scale(1, 1);
182
+ }
183
+ }
184
+
185
+ @keyframes eye-shift {
186
+ 0% {
187
+ transform: translate(-0.5px, 4.5px);
188
+ }
189
+ 6.667% {
190
+ transform: translate(-0.5px, 4.15px);
191
+ }
192
+ 10% {
193
+ transform: translate(-0.2px, 1px);
194
+ }
195
+ 14% {
196
+ transform: translate(-0.06px, 0.2px);
197
+ }
198
+ 20%, 54% {
199
+ transform: translate(0, 0);
200
+ }
201
+ 58% {
202
+ transform: translate(0, 0.5px);
203
+ }
204
+ 62%, 100% {
205
+ transform: translate(0, 0);
206
+ }
207
+ }
208
+
209
+ @keyframes eye-shape {
210
+ 0% {
211
+ transform: scale(2, 0.2);
212
+ }
213
+ 6.667% {
214
+ transform: scale(2.12, 0.12);
215
+ }
216
+ 10% {
217
+ transform: scale(1.45, 1.8);
218
+ }
219
+ 14% {
220
+ transform: scale(0.92, 1.08);
221
+ }
222
+ 20%, 54% {
223
+ transform: scale(1, 1);
224
+ }
225
+ 58% {
226
+ transform: scale(1, 0.08);
227
+ }
228
+ 62% {
229
+ transform: scale(1, 1.08);
230
+ }
231
+ 66.667%, 100% {
232
+ transform: scale(1, 1);
233
+ }
234
+ }
235
+ </style>
236
+ </defs>
237
+
238
+ <rect class="once shadow" x="-1" y="15" width="17" height="1" fill="#000000" opacity="0.4"/>
239
+
240
+ <g class="once body-motion">
241
+ <g fill="#DE886D">
242
+ <g class="once leg-shift">
243
+ <rect class="once scale-top-left leg-grow" x="3" y="11" width="1" height="4"/>
244
+ </g>
245
+ <g class="once leg-shift">
246
+ <rect class="once scale-top-left leg-grow" x="5" y="11" width="1" height="4"/>
247
+ </g>
248
+ <g class="once leg-shift">
249
+ <rect class="once scale-top-left leg-grow" x="9" y="11" width="1" height="4"/>
250
+ </g>
251
+ <g class="once leg-shift">
252
+ <rect class="once scale-top-left leg-grow" x="11" y="11" width="1" height="4"/>
253
+ </g>
254
+ </g>
255
+
256
+ <g class="once torso-shift">
257
+ <rect class="once scale-top-left torso-shape" x="2" y="6" width="11" height="7" fill="#DE886D"/>
258
+ </g>
259
+
260
+ <g class="once arm-left">
261
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
262
+ </g>
263
+
264
+ <g class="once arm-right">
265
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
266
+ </g>
267
+
268
+ <g fill="#000000">
269
+ <g class="once eye-shift">
270
+ <rect class="once scale-top-left eye-shape" x="4" y="8" width="1" height="2"/>
271
+ </g>
272
+ <g class="once eye-shift">
273
+ <rect class="once scale-top-left eye-shape" x="10" y="8" width="1" height="2"/>
274
+ </g>
275
+ </g>
276
+ </g>
277
+ </svg>
@@ -0,0 +1,21 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 16" width="300" height="320">
2
+ <rect id="ground-shadow" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
3
+
4
+ <g id="master-group">
5
+ <g id="body-color-group" fill="#DE886D">
6
+ <rect id="torso" x="2" y="6" width="11" height="7"/>
7
+ <rect id="left-arm" x="0" y="9" width="2" height="2"/>
8
+ <rect id="right-arm" x="13" y="9" width="2" height="2"/>
9
+
10
+ <rect id="outer-left-leg" x="3" y="13" width="1" height="2"/>
11
+ <rect id="inner-left-leg" x="5" y="13" width="1" height="2"/>
12
+ <rect id="inner-right-leg" x="9" y="13" width="1" height="2"/>
13
+ <rect id="outer-right-leg" x="11" y="13" width="1" height="2"/>
14
+ </g>
15
+
16
+ <g id="eyes-color-group" fill="#000000">
17
+ <rect id="left-eye" x="4" y="8" width="1" height="2"/>
18
+ <rect id="right-eye" x="10" y="8" width="1" height="2"/>
19
+ </g>
20
+ </g>
21
+ </svg>
@@ -0,0 +1,136 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ .body-anim {
5
+ animation: body-move 6s infinite ease-in-out;
6
+ }
7
+ .eyes-anim {
8
+ animation: eyes-move 6s infinite ease-in-out;
9
+ }
10
+ .eyes-blink {
11
+ transform-origin: 7.5px 9px;
12
+ animation: blink 6s infinite linear;
13
+ }
14
+ .question-mark {
15
+ transform-origin: center;
16
+ animation: question-fade 6s infinite ease-in-out;
17
+ }
18
+ .exclamation-mark {
19
+ transform-origin: center;
20
+ animation: exclamation-fade 6s infinite ease-in-out;
21
+ }
22
+ .ble-icon-group {
23
+ animation: ble-float 3s infinite ease-in-out;
24
+ }
25
+ .ble-shadow {
26
+ transform-origin: 26px 15.5px;
27
+ animation: ble-shadow-pulse 3s infinite ease-in-out;
28
+ }
29
+ .glow-pulse {
30
+ transform-origin: 0px 0px;
31
+ animation: glow 3s infinite ease-in-out;
32
+ }
33
+
34
+ /* Character Upper Body Movement (Simulates Side-to-Side Head/Torso Tilt) */
35
+ @keyframes body-move {
36
+ 0%, 5% { transform: translate(0px, 0px); }
37
+ 12%, 22% { transform: translate(-1px, 0px); } /* Looks left */
38
+ 29%, 39% { transform: translate(1px, 0px); } /* Looks right */
39
+ 44% { transform: translate(-1px, 0px); } /* Quick look left */
40
+ 49% { transform: translate(1px, 0px); } /* Quick look right */
41
+ 56%, 88% { transform: translate(1px, -1px); } /* Stares up-right */
42
+ 95%, 100% { transform: translate(0px, 0px); }
43
+ }
44
+
45
+ /* Eye Movement for Parallax Directional Looking */
46
+ @keyframes eyes-move {
47
+ 0%, 5% { transform: translate(0px, 0px); }
48
+ 12%, 22% { transform: translate(-2px, 0px); }
49
+ 29%, 39% { transform: translate(2px, 0px); }
50
+ 44% { transform: translate(-2px, 0px); }
51
+ 49% { transform: translate(2px, 0px); }
52
+ 56%, 88% { transform: translate(3px, -2px); }
53
+ 95%, 100% { transform: translate(0px, 0px); }
54
+ }
55
+
56
+ /* Occasional Blinking */
57
+ @keyframes blink {
58
+ 0%, 20%, 24%, 60%, 64%, 80%, 84%, 100% { transform: scaleY(1); }
59
+ 22%, 62%, 82% { transform: scaleY(0.1); }
60
+ }
61
+
62
+ /* Confused Question Mark Animation */
63
+ @keyframes question-fade {
64
+ 0%, 5% { opacity: 0; transform: translate(-4px, 4px) scale(0.5); }
65
+ 12%, 46% { opacity: 1; transform: translate(-4px, 0px) scale(1); }
66
+ 50%, 100% { opacity: 0; transform: translate(-4px, -4px) scale(1.2); }
67
+ }
68
+
69
+ /* Exclamation Mark Animation (Spotting the BLE Icon) */
70
+ @keyframes exclamation-fade {
71
+ 0%, 50% { opacity: 0; transform: translate(6px, 0px) scale(0.5); }
72
+ 56%, 85% { opacity: 1; transform: translate(6px, -4px) scale(1); }
73
+ 90%, 100% { opacity: 0; transform: translate(6px, -8px) scale(1.2); }
74
+ }
75
+
76
+ /* Floating BLE Icon */
77
+ @keyframes ble-float {
78
+ 0%, 100% { transform: translate(26px, -3px); }
79
+ 50% { transform: translate(26px, -6px); }
80
+ }
81
+
82
+ /* Floating BLE Shadow */
83
+ @keyframes ble-shadow-pulse {
84
+ 0%, 100% { transform: scale(1); opacity: 0.3; }
85
+ 50% { transform: scale(0.8); opacity: 0.15; }
86
+ }
87
+
88
+ /* BLE Glow Pulse */
89
+ @keyframes glow {
90
+ 0%, 100% { transform: scale(1); opacity: 0.4; }
91
+ 50% { transform: scale(1.3); opacity: 0.1; }
92
+ }
93
+ </style>
94
+ </defs>
95
+
96
+ <!-- Mirrored: entire scene flipped -->
97
+ <g transform="translate(15, 0) scale(-1, 1)">
98
+ <rect id="ground-shadow" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
99
+
100
+ <g id="legs" fill="#DE886D">
101
+ <rect id="outer-left-leg" x="3" y="12" width="1" height="3"/>
102
+ <rect id="inner-left-leg" x="5" y="12" width="1" height="3"/>
103
+ <rect id="inner-right-leg" x="9" y="12" width="1" height="3"/>
104
+ <rect id="outer-right-leg" x="11" y="12" width="1" height="3"/>
105
+ </g>
106
+
107
+ <g class="body-anim">
108
+ <g fill="#DE886D">
109
+ <rect id="torso" x="2" y="6" width="11" height="7"/>
110
+ <rect id="left-arm" x="0" y="9" width="2" height="2"/>
111
+ <rect id="right-arm" x="13" y="9" width="2" height="2"/>
112
+ </g>
113
+ <g class="eyes-anim">
114
+ <g class="eyes-blink" fill="#000000">
115
+ <rect id="left-eye" x="4" y="8" width="1" height="2"/>
116
+ <rect id="right-eye" x="10" y="8" width="1" height="2"/>
117
+ </g>
118
+ </g>
119
+ </g>
120
+
121
+ <g class="question-mark" fill="#FFFFFF" opacity="0">
122
+ <rect x="1" y="0" width="2" height="1"/>
123
+ <rect x="3" y="1" width="1" height="1"/>
124
+ <rect x="0" y="1" width="1" height="2"/>
125
+ <rect x="1" y="3" width="1" height="1"/>
126
+ <rect x="2" y="4" width="1" height="1"/>
127
+ <rect x="2" y="6" width="1" height="1"/>
128
+ </g>
129
+
130
+ <g class="exclamation-mark" fill="#0082FC" opacity="0">
131
+ <rect x="1" y="0" width="1" height="4"/>
132
+ <rect x="1" y="5" width="1" height="1"/>
133
+ </g>
134
+ </g>
135
+
136
+ </svg>
@@ -0,0 +1,94 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ .body-exhausted {
5
+ transform-origin: 7.5px 15px;
6
+ animation: heavy-breathe 2.5s infinite ease-in-out;
7
+ }
8
+ .arm-fan {
9
+ transform-origin: 14px 10px;
10
+ animation: fan-self 0.4s infinite alternate ease-in-out;
11
+ }
12
+ .smoke {
13
+ opacity: 0;
14
+ animation: puff-smoke 3s infinite ease-out;
15
+ }
16
+ .sm1 { animation-delay: 0s; }
17
+ .sm2 { animation-delay: 1s; }
18
+ .sm3 { animation-delay: 2s; }
19
+
20
+ /* Error warning flash */
21
+ .error-warning {
22
+ animation: error-flash 0.8s infinite ease-in-out;
23
+ }
24
+
25
+ @keyframes heavy-breathe {
26
+ 0%, 100% { transform: scale(1, 1) translateY(0); }
27
+ 50% { transform: scale(1.05, 0.9) translateY(1.5px); }
28
+ }
29
+ @keyframes fan-self {
30
+ 0% { transform: rotate(0deg); }
31
+ 100% { transform: rotate(-60deg); }
32
+ }
33
+ @keyframes puff-smoke {
34
+ 0% { transform: translate(7.5px, 6px) scale(0.5); opacity: 0; }
35
+ 20% { opacity: 0.6; }
36
+ 100% { transform: translate(7.5px, -15px) scale(2); opacity: 0; }
37
+ }
38
+ @keyframes error-flash {
39
+ 0%, 100% { opacity: 1; }
40
+ 50% { opacity: 0.15; }
41
+ }
42
+ </style>
43
+ <g id="smoke-puff">
44
+ <rect x="-1" y="-1" width="2" height="2" fill="#B0BEC5" rx="0.5"/>
45
+ <rect x="0" y="-2" width="2" height="2" fill="#CFD8DC" rx="0.5"/>
46
+ </g>
47
+ </defs>
48
+
49
+ <rect id="ground-shadow" x="-1" y="15" width="17" height="1" fill="#000000" opacity="0.5"/>
50
+
51
+ <!-- Smoke -->
52
+ <g>
53
+ <use href="#smoke-puff" class="smoke sm1"/>
54
+ <use href="#smoke-puff" class="smoke sm2" transform="translate(-2, 0)"/>
55
+ <use href="#smoke-puff" class="smoke sm3" transform="translate(2, 0)"/>
56
+ </g>
57
+
58
+ <g class="body-exhausted">
59
+ <!-- Sploot Legs -->
60
+ <g fill="#DE886D">
61
+ <rect x="3" y="9" width="1" height="1"/>
62
+ <rect x="5" y="9" width="1" height="1"/>
63
+ <rect x="9" y="9" width="1" height="1"/>
64
+ <rect x="11" y="9" width="1" height="1"/>
65
+ </g>
66
+
67
+ <!-- Torso Sploot -->
68
+ <g fill="#DE886D">
69
+ <rect x="1" y="10" width="13" height="5"/>
70
+ <rect x="-1" y="13" width="2" height="2"/>
71
+ </g>
72
+
73
+ <!-- Fanning Arm (closer to body) -->
74
+ <g class="arm-fan">
75
+ <rect x="13" y="11" width="2" height="2" fill="#DE886D"/>
76
+ </g>
77
+
78
+ <!-- XX Eyes -->
79
+ <g fill="#000000">
80
+ <!-- Left X -->
81
+ <rect x="3" y="12" width="0.6" height="2.2" transform="rotate(45 3.3 13.1)"/>
82
+ <rect x="3" y="12" width="0.6" height="2.2" transform="rotate(-45 3.3 13.1)"/>
83
+ <!-- Right X -->
84
+ <rect x="10" y="12" width="0.6" height="2.2" transform="rotate(45 10.3 13.1)"/>
85
+ <rect x="10" y="12" width="0.6" height="2.2" transform="rotate(-45 10.3 13.1)"/>
86
+ </g>
87
+ </g>
88
+
89
+ <!-- Error Warning (flashing) -->
90
+ <g class="error-warning">
91
+ <!-- Error text only -->
92
+ <text x="7.5" y="6" text-anchor="middle" font-family="'Söhne', 'Helvetica Neue', Arial, sans-serif" font-size="3.5" font-weight="700" fill="#FF3B30">ERROR</text>
93
+ </g>
94
+ </svg>