@qwik.dev/devtools 0.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 (65) hide show
  1. package/README.md +47 -0
  2. package/lib/index.qwik.cjs +4 -0
  3. package/lib/index.qwik.mjs +4 -0
  4. package/lib/kit/constants.qwik.cjs +4 -0
  5. package/lib/kit/constants.qwik.mjs +4 -0
  6. package/lib/kit/context.qwik.cjs +16 -0
  7. package/lib/kit/context.qwik.mjs +16 -0
  8. package/lib/kit/globals.qwik.cjs +6 -0
  9. package/lib/kit/globals.qwik.mjs +6 -0
  10. package/lib/kit/server.qwik.cjs +18 -0
  11. package/lib/kit/server.qwik.mjs +18 -0
  12. package/lib/kit/shared.qwik.cjs +4 -0
  13. package/lib/kit/shared.qwik.mjs +4 -0
  14. package/lib/plugin/assets/index.qwik.cjs +67 -0
  15. package/lib/plugin/assets/index.qwik.mjs +67 -0
  16. package/lib/plugin/index.qwik.cjs +49 -0
  17. package/lib/plugin/index.qwik.mjs +49 -0
  18. package/lib/plugin/npm/index.qwik.cjs +19 -0
  19. package/lib/plugin/npm/index.qwik.mjs +19 -0
  20. package/lib/plugin/routes/index.qwik.cjs +17 -0
  21. package/lib/plugin/routes/index.qwik.mjs +17 -0
  22. package/lib/plugin/rpc/index.qwik.cjs +14 -0
  23. package/lib/plugin/rpc/index.qwik.mjs +14 -0
  24. package/lib-types/devtools.d.ts +1 -0
  25. package/lib-types/entry.dev.d.ts +2 -0
  26. package/lib-types/entry.ssr.d.ts +2 -0
  27. package/lib-types/index.d.ts +1 -0
  28. package/lib-types/kit/client.d.ts +2 -0
  29. package/lib-types/kit/constants.d.ts +1 -0
  30. package/lib-types/kit/context.d.ts +10 -0
  31. package/lib-types/kit/globals.d.ts +20 -0
  32. package/lib-types/kit/index.d.ts +4 -0
  33. package/lib-types/kit/server.d.ts +2 -0
  34. package/lib-types/kit/shared.d.ts +1 -0
  35. package/lib-types/kit/types.d.ts +33 -0
  36. package/lib-types/plugin/assets/index.d.ts +5 -0
  37. package/lib-types/plugin/components/index.d.ts +0 -0
  38. package/lib-types/plugin/index.d.ts +2 -0
  39. package/lib-types/plugin/npm/index.d.ts +5 -0
  40. package/lib-types/plugin/routes/index.d.ts +5 -0
  41. package/lib-types/plugin/rpc/index.d.ts +3 -0
  42. package/lib-types/plugin/types/index.d.ts +5 -0
  43. package/lib-types/root.d.ts +2 -0
  44. package/package.json +70 -0
  45. package/src/devtools.css +558 -0
  46. package/src/devtools.tsx +411 -0
  47. package/src/entry.dev.tsx +17 -0
  48. package/src/entry.ssr.tsx +25 -0
  49. package/src/index.ts +1 -0
  50. package/src/kit/client.ts +21 -0
  51. package/src/kit/constants.ts +1 -0
  52. package/src/kit/context.ts +42 -0
  53. package/src/kit/globals.ts +22 -0
  54. package/src/kit/index.ts +4 -0
  55. package/src/kit/server.ts +21 -0
  56. package/src/kit/shared.ts +11 -0
  57. package/src/kit/types.ts +48 -0
  58. package/src/plugin/assets/index.ts +126 -0
  59. package/src/plugin/components/index.ts +0 -0
  60. package/src/plugin/index.ts +50 -0
  61. package/src/plugin/npm/index.ts +24 -0
  62. package/src/plugin/routes/index.ts +16 -0
  63. package/src/plugin/rpc/index.ts +14 -0
  64. package/src/plugin/types/index.ts +6 -0
  65. package/src/root.tsx +15 -0
@@ -0,0 +1,5 @@
1
+ import { ViteDevServer, ResolvedConfig } from 'vite';
2
+ export interface ServerContext {
3
+ server: ViteDevServer;
4
+ config: ResolvedConfig;
5
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: () => import("@qwik.dev/core").JSXOutput;
2
+ export default _default;
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@qwik.dev/devtools",
3
+ "version": "0.0.1",
4
+ "description": "Qwik devtools package",
5
+ "main": "./lib/index.qwik.mjs",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./lib/index.qwik.mjs"
9
+ },
10
+ "./component": {
11
+ "import": "./src/devtools.tsx"
12
+ }
13
+ },
14
+ "files": [
15
+ "src",
16
+ "lib",
17
+ "lib-types"
18
+ ],
19
+ "engines": {
20
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
21
+ },
22
+ "private": false,
23
+ "type": "module",
24
+ "scripts": {
25
+ "build": "qwik build",
26
+ "build.lib": "vite build --mode lib",
27
+ "build.types": "tsc --emitDeclarationOnly",
28
+ "dev:ssr": "vite --mode ssr",
29
+ "dev": "nodemon --watch src -e tsx,ts,css --exec 'npm run build.lib'",
30
+ "dev.debug": "node --inspect-brk ./node_modules/vite/bin/vite.js --mode ssr --force",
31
+ "fmt": "prettier --write .",
32
+ "fmt.check": "prettier --check .",
33
+ "lint": "eslint \"src/**/*.ts*\"",
34
+ "release": "np",
35
+ "start": "vite --open --mode ssr",
36
+ "test": "echo \"No test specified\" && exit 0",
37
+ "qwik": "qwik"
38
+ },
39
+ "peerDependencies": {
40
+ "@qwik.dev/core": "^2.0.0-alpha.4",
41
+ "@qwik.dev/router": "^2.0.0-alpha.4",
42
+ "vite": "^6.0.0"
43
+ },
44
+ "dependencies": {
45
+ "image-meta": "^0.2.1",
46
+ "birpc": "^0.2.19",
47
+ "perfect-debounce": "^1.0.0",
48
+ "fast-glob": "^3.3.2",
49
+ "superjson": "^2.2.2",
50
+ "dree": "^5.1.5",
51
+ "@qwikest/icons": "^0.0.13",
52
+ "vite-hot-client": "^0.2.4"
53
+ },
54
+ "devDependencies": {
55
+ "@qwik.dev/core": "^2.0.0-alpha.4",
56
+ "@qwik.dev/router": "^2.0.0-alpha.4",
57
+ "@types/eslint": "8.56.10",
58
+ "@types/node": "20.14.11",
59
+ "@typescript-eslint/eslint-plugin": "7.16.1",
60
+ "@typescript-eslint/parser": "7.16.1",
61
+ "eslint": "8.57.0",
62
+ "eslint-plugin-qwik": "2.0.0-alpha.3",
63
+ "np": "^8.0.4",
64
+ "prettier": "3.3.3",
65
+ "typescript": "5.4.5",
66
+ "vite": "5.4.10",
67
+ "vite-tsconfig-paths": "^4.2.1",
68
+ "cpy-cli": "^5.0.0"
69
+ }
70
+ }
@@ -0,0 +1,558 @@
1
+ .devtools-container {
2
+ position: fixed;
3
+ bottom: 0;
4
+ right: 0;
5
+ z-index: 9999;
6
+ font-family:
7
+ system-ui,
8
+ -apple-system,
9
+ sans-serif;
10
+ }
11
+
12
+ .devtools-toggle {
13
+ position: fixed;
14
+ bottom: 16px;
15
+ right: 16px;
16
+ width: 36px;
17
+ height: 36px;
18
+ background: #18181b;
19
+ border: 1px solid rgba(255, 255, 255, 0.1);
20
+ border-radius: 8px;
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ cursor: pointer;
25
+ box-shadow:
26
+ 0 4px 12px rgba(0, 0, 0, 0.15),
27
+ inset 0 1px 1px rgba(255, 255, 255, 0.1);
28
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
29
+ transform-origin: center;
30
+ overflow: hidden;
31
+ backdrop-filter: blur(8px);
32
+ animation: glow 2s ease-in-out infinite;
33
+ }
34
+
35
+ @keyframes glow {
36
+ 0% {
37
+ box-shadow:
38
+ 0 4px 12px rgba(0, 0, 0, 0.15),
39
+ inset 0 1px 1px rgba(255, 255, 255, 0.1);
40
+ }
41
+ 50% {
42
+ box-shadow:
43
+ 0 4px 12px rgba(0, 220, 130, 0.35),
44
+ inset 0 1px 1px rgba(255, 255, 255, 0.1),
45
+ 0 0 25px rgba(0, 220, 130, 0.25);
46
+ border-color: rgba(0, 220, 130, 0.5);
47
+ }
48
+ 100% {
49
+ box-shadow:
50
+ 0 4px 12px rgba(0, 0, 0, 0.15),
51
+ inset 0 1px 1px rgba(255, 255, 255, 0.1);
52
+ }
53
+ }
54
+
55
+ .devtools-toggle:hover {
56
+ transform: scale(1.05);
57
+ box-shadow:
58
+ 0 6px 16px rgba(0, 220, 130, 0.4),
59
+ inset 0 1px 1px rgba(255, 255, 255, 0.15),
60
+ 0 0 30px rgba(0, 220, 130, 0.3);
61
+ border-color: rgba(0, 220, 130, 0.6);
62
+ background: #1c1c1f;
63
+ animation: none;
64
+ }
65
+
66
+ .devtools-toggle:active {
67
+ transform: scale(0.98);
68
+ box-shadow:
69
+ 0 2px 8px rgba(0, 0, 0, 0.15),
70
+ inset 0 1px 1px rgba(255, 255, 255, 0.1);
71
+ animation: none;
72
+ }
73
+
74
+ .devtools-toggle.is-open {
75
+ transform: rotate(90deg);
76
+ background: #1c1c1f;
77
+ animation: none;
78
+ border-color: rgba(0, 220, 130, 0.5);
79
+ box-shadow:
80
+ 0 4px 12px rgba(0, 220, 130, 0.35),
81
+ inset 0 1px 1px rgba(255, 255, 255, 0.1),
82
+ 0 0 25px rgba(0, 220, 130, 0.25);
83
+ }
84
+
85
+ .devtools-toggle.is-open:hover {
86
+ transform: rotate(90deg) scale(1.05);
87
+ box-shadow:
88
+ 0 6px 16px rgba(0, 220, 130, 0.4),
89
+ inset 0 1px 1px rgba(255, 255, 255, 0.15),
90
+ 0 0 30px rgba(0, 220, 130, 0.3);
91
+ }
92
+
93
+ .devtools-panel {
94
+ position: fixed;
95
+ bottom: 0;
96
+ right: 0;
97
+ width: 100%;
98
+ height: 50vh;
99
+ background: #18181b;
100
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
101
+ color: #fff;
102
+ box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.15);
103
+ display: flex;
104
+ transform: translateY(100%);
105
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
106
+ backdrop-filter: blur(16px);
107
+ }
108
+
109
+ .devtools-open .devtools-panel {
110
+ transform: translateY(0);
111
+ }
112
+
113
+ @media (min-width: 640px) {
114
+ .devtools-panel {
115
+ width: 60%;
116
+ right: 0;
117
+ }
118
+ }
119
+
120
+ .devtools-header {
121
+ padding: 12px;
122
+ border-bottom: 1px solid #27272a;
123
+ }
124
+
125
+ .devtools-tabs {
126
+ display: flex;
127
+ flex-direction: column;
128
+ gap: 8px;
129
+ padding: 12px;
130
+ border-right: 1px solid #27272a;
131
+ background: #1c1c1f;
132
+ }
133
+
134
+ .devtools-tabs button {
135
+ padding: 4px;
136
+ background: transparent;
137
+ border: none;
138
+ color: #a1a1aa;
139
+ cursor: pointer;
140
+ border-radius: 6px;
141
+ transition: all 0.2s ease;
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: center;
145
+ width: 36px;
146
+ height: 36px;
147
+ }
148
+
149
+ .devtools-tabs button:hover {
150
+ background: #27272a;
151
+ color: #fff;
152
+ }
153
+
154
+ .devtools-tabs button.tab-active {
155
+ background: #3b82f6;
156
+ color: white;
157
+ }
158
+
159
+ .devtools-content {
160
+ padding: 16px;
161
+ height: 100%;
162
+ overflow-y: auto;
163
+ flex: 1;
164
+ }
165
+
166
+ .tab-content h3 {
167
+ margin: 0 0 16px 0;
168
+ font-size: 18px;
169
+ font-weight: 600;
170
+ }
171
+
172
+ .info-grid {
173
+ display: grid;
174
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
175
+ gap: 16px;
176
+ }
177
+
178
+ .info-item {
179
+ background: #27272a;
180
+ padding: 12px;
181
+ border-radius: 8px;
182
+ }
183
+
184
+ .info-label {
185
+ display: block;
186
+ color: #a1a1aa;
187
+ font-size: 12px;
188
+ margin-bottom: 4px;
189
+ }
190
+
191
+ .info-value {
192
+ font-size: 14px;
193
+ font-weight: 500;
194
+ }
195
+
196
+ /* Asset specific styles */
197
+ .assets-grid {
198
+ display: grid;
199
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
200
+ gap: 1.25rem;
201
+ margin-top: 1.5rem;
202
+ padding: 0.5rem;
203
+ }
204
+
205
+ .asset-card {
206
+ background: rgba(255, 255, 255, 0.03);
207
+ border: 1px solid rgba(255, 255, 255, 0.08);
208
+ border-radius: 8px;
209
+ overflow: hidden;
210
+ transition: all 0.2s ease;
211
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
212
+ }
213
+
214
+ .asset-card:hover {
215
+ transform: translateY(-2px);
216
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
217
+ border-color: rgba(255, 255, 255, 0.15);
218
+ }
219
+
220
+ .asset-preview {
221
+ height: 120px;
222
+ background: rgba(0, 0, 0, 0.3);
223
+ display: flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ overflow: hidden;
227
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
228
+ }
229
+
230
+ .asset-preview img {
231
+ width: 70%;
232
+ height: 70%;
233
+ object-fit: contain;
234
+ padding: 0.5rem;
235
+ }
236
+
237
+ .file-preview {
238
+ height: 120px;
239
+ background: rgba(0, 0, 0, 0.2);
240
+ display: flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
244
+ }
245
+
246
+ .file-ext {
247
+ font-size: 1.5rem;
248
+ font-weight: 600;
249
+ color: rgba(255, 255, 255, 0.7);
250
+ text-transform: uppercase;
251
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
252
+ }
253
+
254
+ .asset-info {
255
+ padding: 0.75rem;
256
+ background: rgba(0, 0, 0, 0.2);
257
+ }
258
+
259
+ .asset-path {
260
+ color: #fff;
261
+ font-size: 0.875rem;
262
+ font-weight: 500;
263
+ margin-bottom: 0.5rem;
264
+ white-space: nowrap;
265
+ overflow: hidden;
266
+ text-overflow: ellipsis;
267
+ }
268
+
269
+ .asset-meta {
270
+ display: flex;
271
+ justify-content: space-between;
272
+ align-items: center;
273
+ gap: 0.5rem;
274
+ }
275
+
276
+ .asset-size {
277
+ color: #94a3b8;
278
+ font-size: 0.75rem;
279
+ }
280
+
281
+ .asset-type {
282
+ color: #94a3b8;
283
+ font-size: 0.75rem;
284
+ padding: 0.25rem 0.5rem;
285
+ background: rgba(255, 255, 255, 0.1);
286
+ border-radius: 4px;
287
+ letter-spacing: 0.025em;
288
+ }
289
+
290
+ .tab-content.overview {
291
+ padding: 1.5rem;
292
+ }
293
+
294
+ .metrics-grid {
295
+ display: grid;
296
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
297
+ gap: 1.25rem;
298
+ margin-bottom: 2rem;
299
+ }
300
+
301
+ .metric-card {
302
+ background: rgba(255, 255, 255, 0.03);
303
+ border: 1px solid rgba(255, 255, 255, 0.1);
304
+ border-radius: 12px;
305
+ padding: 1.25rem;
306
+ display: flex;
307
+ align-items: center;
308
+ gap: 1.25rem;
309
+ transition: all 0.2s ease;
310
+ }
311
+
312
+ .metric-card:hover {
313
+ background: rgba(255, 255, 255, 0.05);
314
+ transform: translateY(-1px);
315
+ }
316
+
317
+ .metric-icon {
318
+ background: rgba(255, 255, 255, 0.05);
319
+ border: 1px solid rgba(255, 255, 255, 0.1);
320
+ border-radius: 10px;
321
+ padding: 0.875rem;
322
+ display: flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ transition: all 0.2s ease;
326
+ }
327
+
328
+ .metric-card:hover .metric-icon {
329
+ background: rgba(255, 255, 255, 0.08);
330
+ }
331
+
332
+ .icon {
333
+ width: 1.5rem;
334
+ height: 1.5rem;
335
+ color: #10b981;
336
+ }
337
+
338
+ .metric-content {
339
+ display: flex;
340
+ flex-direction: column;
341
+ gap: 0.25rem;
342
+ }
343
+
344
+ .metric-value {
345
+ font-size: 1.75rem;
346
+ font-weight: 600;
347
+ color: #fff;
348
+ line-height: 1.2;
349
+ }
350
+
351
+ .metric-label {
352
+ color: #94a3b8;
353
+ font-size: 0.875rem;
354
+ font-weight: 500;
355
+ letter-spacing: 0.01em;
356
+ }
357
+
358
+ .performance-section {
359
+ background: rgba(255, 255, 255, 0.03);
360
+ border: 1px solid rgba(255, 255, 255, 0.1);
361
+ border-radius: 12px;
362
+ padding: 1.25rem;
363
+ }
364
+
365
+ .performance-section h3 {
366
+ margin: 0 0 1.25rem 0;
367
+ font-size: 1rem;
368
+ font-weight: 600;
369
+ color: #fff;
370
+ letter-spacing: 0.01em;
371
+ }
372
+
373
+ .performance-metrics {
374
+ display: flex;
375
+ flex-direction: column;
376
+ gap: 0.75rem;
377
+ }
378
+
379
+ .perf-item {
380
+ display: flex;
381
+ justify-content: space-between;
382
+ color: #94a3b8;
383
+ font-size: 0.875rem;
384
+ padding: 0.5rem 0;
385
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
386
+ }
387
+
388
+ .perf-item:last-child {
389
+ border-bottom: none;
390
+ }
391
+
392
+ .perf-value {
393
+ color: #fff;
394
+ font-weight: 500;
395
+ }
396
+
397
+ .header-section {
398
+ display: flex;
399
+ align-items: center;
400
+ justify-content: space-between;
401
+ margin-bottom: 2rem;
402
+ padding-bottom: 1.5rem;
403
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
404
+ }
405
+
406
+ .title-container {
407
+ display: flex;
408
+ align-items: center;
409
+ gap: 0.75rem;
410
+ }
411
+
412
+ .qwik-logo {
413
+ width: 2rem;
414
+ height: 2rem;
415
+ }
416
+
417
+ .title-container h1 {
418
+ font-size: 1.5rem;
419
+ font-weight: 600;
420
+ color: #fff;
421
+ margin: 0;
422
+ }
423
+
424
+ .version {
425
+ font-size: 0.875rem;
426
+ color: #94a3b8;
427
+ font-weight: 500;
428
+ padding: 0.25rem 0.75rem;
429
+ background: rgba(255, 255, 255, 0.05);
430
+ border-radius: 9999px;
431
+ border: 1px solid rgba(255, 255, 255, 0.1);
432
+ }
433
+
434
+ .packages-section {
435
+ background: rgba(255, 255, 255, 0.03);
436
+ border: 1px solid rgba(255, 255, 255, 0.1);
437
+ border-radius: 12px;
438
+ padding: 1.25rem;
439
+ margin-bottom: 1.25rem;
440
+ }
441
+
442
+ .packages-section h3 {
443
+ margin: 0 0 1.25rem 0;
444
+ font-size: 1rem;
445
+ font-weight: 600;
446
+ color: #fff;
447
+ letter-spacing: 0.01em;
448
+ }
449
+
450
+ .packages-grid {
451
+ display: grid;
452
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
453
+ gap: 0.75rem;
454
+ }
455
+
456
+ .package-item {
457
+ display: flex;
458
+ justify-content: space-between;
459
+ align-items: center;
460
+ padding: 0.75rem 1rem;
461
+ background: rgba(255, 255, 255, 0.05);
462
+ border-radius: 8px;
463
+ transition: all 0.2s ease;
464
+ }
465
+
466
+ .package-item:hover {
467
+ background: rgba(255, 255, 255, 0.08);
468
+ }
469
+
470
+ .package-name {
471
+ color: #fff;
472
+ font-size: 0.875rem;
473
+ font-weight: 500;
474
+ }
475
+
476
+ .package-version {
477
+ color: #94a3b8;
478
+ font-size: 0.75rem;
479
+ font-weight: 500;
480
+ padding: 0.25rem 0.5rem;
481
+ background: rgba(255, 255, 255, 0.05);
482
+ border-radius: 9999px;
483
+ border: 1px solid rgba(255, 255, 255, 0.1);
484
+ }
485
+
486
+ .tab-content.assets {
487
+ padding: 1.5rem;
488
+ }
489
+
490
+ .assets-stats {
491
+ display: flex;
492
+ gap: 1rem;
493
+ }
494
+
495
+ .stat-item {
496
+ color: #94a3b8;
497
+ font-size: 0.875rem;
498
+ padding: 0.25rem 0.75rem;
499
+ background: rgba(255, 255, 255, 0.05);
500
+ border-radius: 9999px;
501
+ border: 1px solid rgba(255, 255, 255, 0.1);
502
+ }
503
+
504
+ .routes-table {
505
+ background: #18181b;
506
+ border-radius: 8px;
507
+ overflow: hidden;
508
+ }
509
+
510
+ .table-header {
511
+ display: grid;
512
+ grid-template-columns: 2fr 1fr 1fr 1fr;
513
+ padding: 12px 16px;
514
+ background: #27272a;
515
+ font-weight: 500;
516
+ border-bottom: 1px solid #3f3f46;
517
+ }
518
+
519
+ .table-row {
520
+ display: grid;
521
+ grid-template-columns: 2fr 1fr 1fr 1fr;
522
+ padding: 12px 16px;
523
+ border-bottom: 1px solid #27272a;
524
+ align-items: center;
525
+ }
526
+
527
+ .table-row:hover {
528
+ background: #27272a;
529
+ }
530
+
531
+ .active-route {
532
+ background: #22c55e20;
533
+ color: #22c55e;
534
+ padding: 4px 8px;
535
+ border-radius: 4px;
536
+ }
537
+
538
+ .col-route {
539
+ font-family: monospace;
540
+ }
541
+
542
+ .custom-layout {
543
+ color: #3b82f6;
544
+ }
545
+
546
+ .toggle-icon {
547
+ width: 20px;
548
+ height: 20px;
549
+ transition: all 0.3s ease;
550
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
551
+ opacity: 0.9;
552
+ }
553
+
554
+ .devtools-toggle:hover .toggle-icon {
555
+ transform: scale(1.1);
556
+ filter: drop-shadow(0 3px 6px rgba(0, 0, 0, 0.3));
557
+ opacity: 1;
558
+ }