whiskers.git / assets / whiskers / whiskers-speaking.svg
whiskers-speaking.svg288 lines · 12.1 KB · raw
1<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2  <defs>
3    <style>
4      /* ===== Body (KEEP) ===== */
5      .body-bounce {
6        transform-origin: 7.5px 15px;
7        animation: body-bounce 0.35s infinite ease-in-out;
8      }
9      .breathe {
10        transform-origin: 7.5px 13px;
11        animation: breathe 3.2s infinite ease-in-out;
12      }
13
14      /* ===== Arms (KEEP) ===== */
15      .arm-l-type {
16        transform-origin: 2px 10px;
17        animation: type-l 0.15s infinite ease-in-out;
18      }
19      .arm-r-type {
20        transform-origin: 13px 10px;
21        animation: type-r 0.12s infinite ease-in-out;
22      }
23
24      /* ===== Eyes ===== */
25      .eyes-code {
26        transform-origin: 7.5px 9px;
27        animation: eye-code 10s infinite ease-in-out;
28      }
29
30      /* ===== Code lines: each line grows, holds, then slides up + fades ===== */
31      .code-line {
32        transform-box: fill-box;
33        transform-origin: left center;
34      }
35      .cl1 { animation: cl1 6s infinite; }
36      .cl2 { animation: cl2 6s infinite; }
37      .cl3 { animation: cl3 6s infinite; }
38      .cl4 { animation: cl4 6s infinite; }
39
40      /* Key press flashes — different periods so they look random */
41      .key-flash { opacity: 0; }
42      .kf1 { animation: kflash 0.6s infinite; }
43      .kf2 { animation: kflash 0.8s infinite; animation-delay: -0.25s; }
44      .kf3 { animation: kflash 0.5s infinite; animation-delay: -0.1s; }
45      .kf4 { animation: kflash 0.7s infinite; animation-delay: -0.45s; }
46      .kf5 { animation: kflash 0.55s infinite; animation-delay: -0.3s; }
47      .kf6 { animation: kflash 0.9s infinite; animation-delay: -0.5s; }
48
49      /* Data particles (float up behind screen) */
50      .data-bit { opacity: 0; animation: float-data 1.5s infinite linear; }
51      .d1 { animation-delay: 0s; }
52      .d2 { animation-delay: -0.4s; }
53      .d3 { animation-delay: -0.8s; }
54      .d4 { animation-delay: -1.2s; }
55
56      /* Shadow */
57      .shadow-anim {
58        transform-origin: 7.5px 15.5px;
59        animation: shadow-bob 0.4s infinite ease-in-out;
60      }
61
62      /* ==================== Keyframes ==================== */
63
64      @keyframes body-bounce {
65        0%, 100% { transform: translateY(0); }
66        50% { transform: translateY(0.8px); }
67      }
68      @keyframes breathe {
69        0%, 100% { transform: scale(1, 1) translate(0, 0); }
70        50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
71      }
72      @keyframes shadow-bob {
73        0%, 100% { transform: scaleX(1.02); opacity: 0.5; }
74        50% { transform: scaleX(1.05); opacity: 0.55; }
75      }
76
77      @keyframes type-l {
78        0%   { transform: rotate(-5deg); }
79        25%  { transform: rotate(-38deg); }
80        50%  { transform: rotate(-10deg); }
81        75%  { transform: rotate(-30deg); }
82        100% { transform: rotate(-5deg); }
83      }
84      @keyframes type-r {
85        0%   { transform: rotate(5deg); }
86        25%  { transform: rotate(38deg); }
87        50%  { transform: rotate(10deg); }
88        75%  { transform: rotate(30deg); }
89        100% { transform: rotate(5deg); }
90      }
91
92      /* Eyes: long keyboard squint → 2 consecutive scans → keyboard */
93      @keyframes eye-code {
94        0%   { transform: translate(0, 1px) scaleY(0.6); }
95        14%  { transform: translate(0, 1px) scaleY(0.6); }
96        15%  { transform: translate(0, 1px) scaleY(0.1); }
97        16%  { transform: translate(0, 1px) scaleY(0.6); }
98        36%  { transform: translate(0, 1px) scaleY(0.6); }
99        37%  { transform: translate(0, 1px) scaleY(0.1); }
100        38%  { transform: translate(0, 1px) scaleY(0.6); }
101        54%  { transform: translate(0, 1px) scaleY(0.6); }
102        55%  { transform: translate(0, 1px) scaleY(0.1); }
103        57%  { transform: translate(-1px, -0.5px) scaleY(1); }
104        62%  { transform: translate(1.5px, -0.5px) scaleY(1); }
105        64%  { transform: translate(-0.5px, -0.3px) scaleY(1); }
106        69%  { transform: translate(1.5px, -0.5px) scaleY(1); }
107        71%  { transform: translate(1px, -0.3px) scaleY(0.1); }
108        73%  { transform: translate(0, 1px) scaleY(0.6); }
109        89%  { transform: translate(0, 1px) scaleY(0.6); }
110        90%  { transform: translate(0, 1px) scaleY(0.1); }
111        91%  { transform: translate(0, 1px) scaleY(0.6); }
112        100% { transform: translate(0, 1px) scaleY(0.6); }
113      }
114
115      /* Code lines: grow from left → hold → slide up + fade out
116         Each line staggers by ~15%. Slide-up gives "scroll" feel.
117         At 95-100% all invisible → brief blank → cycle restarts */
118      @keyframes cl1 {
119        0%        { transform: scaleX(0); opacity: 0; }
120        3%        { transform: scaleX(0); opacity: 1; }
121        13%       { transform: scaleX(1); opacity: 1; }
122        13%, 78%  { transform: scaleX(1) translateY(0); opacity: 1; }
123        88%       { transform: scaleX(1) translateY(-3px); opacity: 0; }
124        89%, 100% { transform: scaleX(0) translateY(0); opacity: 0; }
125      }
126      @keyframes cl2 {
127        0%, 14%   { transform: scaleX(0); opacity: 0; }
128        15%       { transform: scaleX(0); opacity: 1; }
129        27%       { transform: scaleX(1); opacity: 1; }
130        27%, 82%  { transform: scaleX(1) translateY(0); opacity: 1; }
131        91%       { transform: scaleX(1) translateY(-3px); opacity: 0; }
132        92%, 100% { transform: scaleX(0) translateY(0); opacity: 0; }
133      }
134      @keyframes cl3 {
135        0%, 29%   { transform: scaleX(0); opacity: 0; }
136        30%       { transform: scaleX(0); opacity: 1; }
137        42%       { transform: scaleX(1); opacity: 1; }
138        42%, 85%  { transform: scaleX(1) translateY(0); opacity: 1; }
139        93%       { transform: scaleX(1) translateY(-3px); opacity: 0; }
140        94%, 100% { transform: scaleX(0) translateY(0); opacity: 0; }
141      }
142      @keyframes cl4 {
143        0%, 44%   { transform: scaleX(0); opacity: 0; }
144        45%       { transform: scaleX(0); opacity: 1; }
145        57%       { transform: scaleX(1); opacity: 1; }
146        57%, 88%  { transform: scaleX(1) translateY(0); opacity: 1; }
147        95%       { transform: scaleX(1) translateY(-3px); opacity: 0; }
148        96%, 100% { transform: scaleX(0) translateY(0); opacity: 0; }
149      }
150
151      /* Key flash: brief bright pulse, mostly off */
152      @keyframes kflash {
153        0%, 70%, 100% { opacity: 0; }
154        35% { opacity: 0.8; }
155      }
156
157      @keyframes float-data {
158        0%   { transform: translateY(0) scale(0.5); opacity: 0; }
159        10%  { opacity: 0.8; }
160        100% { transform: translateY(-17px) scale(1); opacity: 0; }
161      }
162    </style>
163    <g id="pixel-packet">
164      <rect x="0" y="0" width="1.5" height="1.5"/>
165    </g>
166  </defs>
167
168  <!-- Ground Shadow -->
169  <rect class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000" opacity="0.5"/>
170
171  <!-- Data particles (behind screen, float up and disappear behind it) -->
172  <g fill="#40C4FF">
173    <use href="#pixel-packet" class="data-bit d1" x="3" y="7"/>
174    <use href="#pixel-packet" class="data-bit d2" x="7" y="8"/>
175    <use href="#pixel-packet" class="data-bit d3" x="11" y="7"/>
176    <use href="#pixel-packet" class="data-bit d4" x="5" y="8"/>
177  </g>
178
179  <!-- Mini Screen -->
180  <g id="screen" transform="translate(1.25, 0)">
181    <rect x="-0.5" y="-6" width="13.5" height="10.5" fill="#1E1E2E" rx="0.3"/>
182    <rect x="-0.5" y="-6" width="13.5" height="1.2" fill="#2D2D3D" rx="0.3"/>
183    <rect x="0.3" y="-5.6" width="0.5" height="0.4" fill="#FF5F56"/>
184    <rect x="1.2" y="-5.6" width="0.5" height="0.4" fill="#FFBD2E"/>
185    <rect x="2.1" y="-5.6" width="0.5" height="0.4" fill="#27C93F"/>
186
187    <!-- Code lines (indented, varying lengths = code structure) -->
188    <rect class="code-line cl1" x="0.5" y="-3.5" width="5"   height="0.7" fill="#4CAF50" opacity="0.8"/>
189    <rect class="code-line cl2" x="2"   y="-1.8" width="8"   height="0.7" fill="#4CAF50" opacity="0.8"/>
190    <rect class="code-line cl3" x="2"   y="-0.1" width="4.5" height="0.7" fill="#40C4FF" opacity="0.7"/>
191    <rect class="code-line cl4" x="0.5" y="1.6"  width="2"   height="0.7" fill="#FFC107" opacity="0.7"/>
192
193  </g>
194
195  <!-- Layer 1: Body -->
196  <g class="body-bounce">
197    <g id="accessory-anchor" class="breathe">
198      <g fill="#DE886D">
199        <rect x="3" y="13" width="1" height="2"/>
200        <rect x="5" y="13" width="1" height="2"/>
201        <rect x="9" y="13" width="1" height="2"/>
202        <rect x="11" y="13" width="1" height="2"/>
203        <g class="cat-behind" fill="#DE886D">
204        <rect x="2" y="5" width="1" height="2"/><rect x="3" y="4" width="1" height="3"/>
205        <rect x="11" y="4" width="1" height="3"/><rect x="12" y="5" width="1" height="2"/>
206        <rect x="13" y="12" width="2" height="1"/><rect x="14" y="10.5" width="1" height="1.5"/>
207      </g>
208      <g class="cat-inner-ear" fill="#F2A7B0">
209        <rect x="3" y="5" width="1" height="2"/><rect x="11" y="5" width="1" height="2"/>
210      </g>
211      <rect x="2" y="6" width="11" height="7"/>
212      <g class="cat-face">
213        <rect x="7" y="9.5" width="1" height="1" fill="#F2A7B0"/>
214        <g fill="#F5EDE6">
215          <rect x="-1" y="8" width="4" height="0.35"/><rect x="-1" y="11.3" width="4" height="0.35"/>
216          <rect x="12" y="8" width="4" height="0.35"/><rect x="12" y="11.3" width="4" height="0.35"/>
217        </g>
218      </g>
219      </g>
220      <g class="eyes-code" fill="#000">
221        <rect x="4" y="8" width="1" height="2"/>
222        <rect x="10" y="8" width="1" height="2"/>
223      </g>
224    </g>
225  </g>
226
227  <!-- Layer 2: Keyboard -->
228  <g id="keyboard" transform="translate(-0.5, 11.8)">
229    <rect x="0" y="0" width="16" height="3.2" fill="#455A64" rx="0.3"/>
230    <g fill="#78909C">
231      <rect x="0.5" y="0.4" width="1" height="0.7"/>
232      <rect x="1.8" y="0.4" width="1" height="0.7"/>
233      <rect x="3.5" y="0.4" width="6" height="0.7" rx="0.2"/>
234      <rect x="10.2" y="0.4" width="1" height="0.7"/>
235      <rect x="11.5" y="0.4" width="1" height="0.7"/>
236      <rect x="12.8" y="0.4" width="1" height="0.7"/>
237      <rect x="14.1" y="0.4" width="1.3" height="0.7"/>
238    </g>
239    <g fill="#78909C">
240      <rect x="0.8" y="1.3" width="0.9" height="0.7"/>
241      <rect x="2.0" y="1.3" width="0.9" height="0.7"/>
242      <rect x="3.2" y="1.3" width="0.9" height="0.7"/>
243      <rect x="4.4" y="1.3" width="0.9" height="0.7"/>
244      <rect x="5.6" y="1.3" width="0.9" height="0.7"/>
245      <rect x="6.8" y="1.3" width="0.9" height="0.7"/>
246      <rect x="8.0" y="1.3" width="0.9" height="0.7"/>
247      <rect x="9.2" y="1.3" width="0.9" height="0.7"/>
248      <rect x="10.4" y="1.3" width="0.9" height="0.7"/>
249      <rect x="11.6" y="1.3" width="0.9" height="0.7"/>
250      <rect x="12.8" y="1.3" width="0.9" height="0.7"/>
251      <rect x="14.0" y="1.3" width="0.9" height="0.7"/>
252    </g>
253    <g fill="#78909C">
254      <rect x="0.5" y="2.2" width="0.9" height="0.7"/>
255      <rect x="1.7" y="2.2" width="0.9" height="0.7"/>
256      <rect x="2.9" y="2.2" width="0.9" height="0.7"/>
257      <rect x="4.1" y="2.2" width="0.9" height="0.7"/>
258      <rect x="5.3" y="2.2" width="0.9" height="0.7"/>
259      <rect x="6.5" y="2.2" width="0.9" height="0.7"/>
260      <rect x="7.7" y="2.2" width="0.9" height="0.7"/>
261      <rect x="8.9" y="2.2" width="0.9" height="0.7"/>
262      <rect x="10.1" y="2.2" width="0.9" height="0.7"/>
263      <rect x="11.3" y="2.2" width="0.9" height="0.7"/>
264      <rect x="12.5" y="2.2" width="0.9" height="0.7"/>
265      <rect x="13.7" y="2.2" width="0.9" height="0.7"/>
266      <rect x="14.9" y="2.2" width="0.6" height="0.7"/>
267    </g>
268    <!-- Key press highlights (overlay on top of keys) -->
269    <g fill="#B0BEC5">
270      <rect class="key-flash kf1" x="4.4" y="1.3" width="0.9" height="0.7"/>
271      <rect class="key-flash kf2" x="9.2" y="1.3" width="0.9" height="0.7"/>
272      <rect class="key-flash kf3" x="2.9" y="2.2" width="0.9" height="0.7"/>
273      <rect class="key-flash kf4" x="7.7" y="2.2" width="0.9" height="0.7"/>
274      <rect class="key-flash kf5" x="11.6" y="1.3" width="0.9" height="0.7"/>
275      <rect class="key-flash kf6" x="3.5" y="0.4" width="6" height="0.7" rx="0.2"/>
276    </g>
277  </g>
278
279  <!-- Layer 3: Arms -->
280  <g class="body-bounce">
281    <g class="breathe">
282      <g fill="#DE886D">
283        <g class="arm-l-type"><rect x="0" y="9" width="2" height="2"/></g>
284        <g class="arm-r-type"><rect x="13" y="9" width="2" height="2"/></g>
285      </g>
286    </g>
287  </g>
288</svg>