@jjlmoya/utils-science 1.1.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 (73) hide show
  1. package/package.json +64 -0
  2. package/src/category/i18n/en.ts +97 -0
  3. package/src/category/i18n/es.ts +97 -0
  4. package/src/category/i18n/fr.ts +96 -0
  5. package/src/category/index.ts +17 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +24 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +251 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +19 -0
  17. package/src/tests/locale_completeness.test.ts +42 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +48 -0
  20. package/src/tests/seo_length.test.ts +22 -0
  21. package/src/tests/tool_validation.test.ts +17 -0
  22. package/src/tool/asteroid-impact/AsteroidImpact.css +799 -0
  23. package/src/tool/asteroid-impact/bibliography.astro +14 -0
  24. package/src/tool/asteroid-impact/component.astro +436 -0
  25. package/src/tool/asteroid-impact/constants.ts +67 -0
  26. package/src/tool/asteroid-impact/helpers.ts +17 -0
  27. package/src/tool/asteroid-impact/i18n/en.ts +153 -0
  28. package/src/tool/asteroid-impact/i18n/es.ts +153 -0
  29. package/src/tool/asteroid-impact/i18n/fr.ts +153 -0
  30. package/src/tool/asteroid-impact/index.ts +24 -0
  31. package/src/tool/asteroid-impact/logic/impactPhysics.ts +86 -0
  32. package/src/tool/asteroid-impact/script.ts +256 -0
  33. package/src/tool/asteroid-impact/seo.astro +15 -0
  34. package/src/tool/asteroid-impact/ui-helpers.ts +56 -0
  35. package/src/tool/asteroid-impact/ui.ts +69 -0
  36. package/src/tool/asteroid-impact/utils.ts +17 -0
  37. package/src/tool/cellular-renewal/CellularRenewal.css +1 -0
  38. package/src/tool/cellular-renewal/bibliography.astro +14 -0
  39. package/src/tool/cellular-renewal/component.astro +387 -0
  40. package/src/tool/cellular-renewal/i18n/en.ts +170 -0
  41. package/src/tool/cellular-renewal/i18n/es.ts +170 -0
  42. package/src/tool/cellular-renewal/i18n/fr.ts +170 -0
  43. package/src/tool/cellular-renewal/index.ts +24 -0
  44. package/src/tool/cellular-renewal/logic/CellularRenewalEngine.ts +50 -0
  45. package/src/tool/cellular-renewal/seo.astro +14 -0
  46. package/src/tool/colony-counter/ColonyCounter.css +473 -0
  47. package/src/tool/colony-counter/bibliography.astro +14 -0
  48. package/src/tool/colony-counter/component.astro +358 -0
  49. package/src/tool/colony-counter/i18n/en.ts +151 -0
  50. package/src/tool/colony-counter/i18n/es.ts +151 -0
  51. package/src/tool/colony-counter/i18n/fr.ts +151 -0
  52. package/src/tool/colony-counter/index.ts +27 -0
  53. package/src/tool/colony-counter/seo.astro +15 -0
  54. package/src/tool/microwave-detector/MicrowaveDetector.css +122 -0
  55. package/src/tool/microwave-detector/bibliography.astro +14 -0
  56. package/src/tool/microwave-detector/component.astro +650 -0
  57. package/src/tool/microwave-detector/i18n/en.ts +155 -0
  58. package/src/tool/microwave-detector/i18n/es.ts +155 -0
  59. package/src/tool/microwave-detector/i18n/fr.ts +155 -0
  60. package/src/tool/microwave-detector/index.ts +24 -0
  61. package/src/tool/microwave-detector/logic/MicrowaveEngine.ts +89 -0
  62. package/src/tool/microwave-detector/seo.astro +14 -0
  63. package/src/tool/simulation-probability/SimulationProbability.css +1 -0
  64. package/src/tool/simulation-probability/bibliography.astro +14 -0
  65. package/src/tool/simulation-probability/component.astro +348 -0
  66. package/src/tool/simulation-probability/i18n/en.ts +184 -0
  67. package/src/tool/simulation-probability/i18n/es.ts +184 -0
  68. package/src/tool/simulation-probability/i18n/fr.ts +184 -0
  69. package/src/tool/simulation-probability/index.ts +24 -0
  70. package/src/tool/simulation-probability/logic/SimulationEngine.ts +42 -0
  71. package/src/tool/simulation-probability/seo.astro +14 -0
  72. package/src/tools.ts +15 -0
  73. package/src/types.ts +72 -0
@@ -0,0 +1,799 @@
1
+ /* Simulador de Impacto de Asteroides - Variables CSS */
2
+ :root,
3
+ .theme-light {
4
+ --asteroid-primary: #f97316;
5
+ --asteroid-secondary: #ef4444;
6
+ --asteroid-accent: #64748b;
7
+ --asteroid-success: #10b981;
8
+ --asteroid-warning: #f59e0b;
9
+ --asteroid-danger: #dc2626;
10
+ --asteroid-bg-light: #f8fafc;
11
+ --asteroid-bg-dark: #0f172a;
12
+ --asteroid-bg-card: #fff;
13
+ --asteroid-bg-modal: rgba(255, 255, 255, 0.9);
14
+ --asteroid-border-light: #e2e8f0;
15
+ --asteroid-border-dark: #1e293b;
16
+ --asteroid-text-primary: #1e293b;
17
+ --asteroid-text-secondary: #64748b;
18
+ --asteroid-text-light: #f1f5f9;
19
+ --asteroid-shadow-sm: 0 2px 5px rgba(0, 0, 0, 0.02);
20
+ --asteroid-shadow-md: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
21
+ --asteroid-shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
22
+ --asteroid-shadow-xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
23
+ --asteroid-radius-sm: 0.75rem;
24
+ --asteroid-radius-md: 1.5rem;
25
+ --asteroid-radius-lg: 2rem;
26
+ --asteroid-radius-full: 9999px;
27
+ --asteroid-transition: all 0.2s ease;
28
+ --asteroid-transition-slow: all 0.3s ease;
29
+ }
30
+
31
+ .theme-dark {
32
+ --asteroid-bg-light: #0f172a;
33
+ --asteroid-bg-card: #1e293b;
34
+ --asteroid-bg-modal: rgba(30, 41, 59, 0.9);
35
+ --asteroid-border-light: #334155;
36
+ --asteroid-text-primary: #f1f5f9;
37
+ --asteroid-text-secondary: #cbd5e1;
38
+ }
39
+
40
+ /* Contenedor Principal */
41
+ .asteroid-app {
42
+ position: relative;
43
+ width: 100%;
44
+ height: 85vh;
45
+ min-height: 600px;
46
+ border-radius: var(--asteroid-radius-md);
47
+ overflow: hidden;
48
+ background: var(--asteroid-bg-dark);
49
+ box-shadow: var(--asteroid-shadow-xl);
50
+ border: 1px solid var(--asteroid-border-dark);
51
+ user-select: none;
52
+ touch-action: none;
53
+ }
54
+
55
+ /* Mapa */
56
+ .asteroid-game-map {
57
+ position: absolute;
58
+ inset: 0;
59
+ z-index: 0;
60
+ background: var(--asteroid-bg-light);
61
+ touch-action: none;
62
+ }
63
+
64
+ /* Overlay de Objetivo */
65
+ .asteroid-map-target-overlay {
66
+ position: absolute;
67
+ inset: 0;
68
+ z-index: 10;
69
+ pointer-events: none;
70
+ opacity: 0;
71
+ transition: opacity var(--asteroid-transition-slow);
72
+ background: rgba(16, 185, 129, 0.05);
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ }
77
+
78
+ .asteroid-map-target-overlay.active {
79
+ opacity: 1;
80
+ }
81
+
82
+ .asteroid-target-crosshair {
83
+ position: absolute;
84
+ width: 100%;
85
+ height: 1px;
86
+ background: rgba(16, 185, 129, 0.2);
87
+ }
88
+
89
+ .asteroid-target-crosshair.vertical {
90
+ width: 1px;
91
+ height: 100%;
92
+ }
93
+
94
+ .asteroid-target-box {
95
+ position: absolute;
96
+ border: 2px solid rgba(16, 185, 129, 0.3);
97
+ border-radius: var(--asteroid-radius-md);
98
+ width: 80%;
99
+ height: 80%;
100
+ }
101
+
102
+ /* Barra Superior */
103
+ .asteroid-top-bar {
104
+ position: absolute;
105
+ top: 1rem;
106
+ left: 0;
107
+ right: 0;
108
+ z-index: 30;
109
+ display: flex;
110
+ flex-direction: column;
111
+ align-items: center;
112
+ pointer-events: none;
113
+ padding: 0 1rem;
114
+ }
115
+
116
+ /* Botón GPS */
117
+ .asteroid-gps-btn {
118
+ pointer-events: auto;
119
+ margin-bottom: 0.5rem;
120
+ background: rgba(255, 255, 255, 0.9);
121
+ backdrop-filter: blur(12px);
122
+ color: var(--asteroid-text-primary);
123
+ padding: 0.5rem 1rem;
124
+ border-radius: var(--asteroid-radius-full);
125
+ font-size: 0.75rem;
126
+ font-weight: 700;
127
+ border: 1px solid rgba(255, 255, 255, 0.4);
128
+ box-shadow: var(--asteroid-shadow-md);
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 0.5rem;
132
+ cursor: pointer;
133
+ transition: var(--asteroid-transition);
134
+ }
135
+
136
+ .asteroid-gps-btn:hover {
137
+ transform: scale(1.05);
138
+ }
139
+
140
+ .asteroid-gps-dot {
141
+ width: 0.5rem;
142
+ height: 0.5rem;
143
+ border-radius: 50%;
144
+ background: var(--asteroid-accent);
145
+ transition: var(--asteroid-transition);
146
+ }
147
+
148
+ .asteroid-gps-dot.active {
149
+ background: var(--asteroid-success);
150
+ animation: pulse 2s infinite;
151
+ }
152
+
153
+ @keyframes pulse {
154
+ 0%, 100% { opacity: 1; }
155
+ 50% { opacity: 0.5; }
156
+ }
157
+
158
+ /* Píldora de Veredicto */
159
+ .asteroid-verdict-pill {
160
+ max-width: 100%;
161
+ transform: translateY(-20px);
162
+ opacity: 0;
163
+ transition: all var(--asteroid-transition-slow);
164
+ pointer-events: none;
165
+ }
166
+
167
+ .asteroid-verdict-pill.active {
168
+ transform: translateY(0);
169
+ opacity: 1;
170
+ pointer-events: auto;
171
+ }
172
+
173
+ .asteroid-verdict-container {
174
+ background: var(--asteroid-bg-dark);
175
+ color: white;
176
+ padding: 0.75rem 1.25rem;
177
+ border-radius: var(--asteroid-radius-lg);
178
+ box-shadow: var(--asteroid-shadow-xl);
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 0.75rem;
182
+ backdrop-filter: blur(8px);
183
+ border: 1px solid rgba(255, 255, 255, 0.1);
184
+ }
185
+
186
+ .asteroid-verdict-icon {
187
+ width: 1.5rem;
188
+ height: 1.5rem;
189
+ flex-shrink: 0;
190
+ display: flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ }
194
+
195
+ .asteroid-verdict-text {
196
+ text-align: left;
197
+ line-height: 1;
198
+ }
199
+
200
+ .asteroid-verdict-label {
201
+ font-weight: 700;
202
+ font-size: 0.5625rem;
203
+ text-transform: uppercase;
204
+ letter-spacing: 0.125em;
205
+ opacity: 0.6;
206
+ margin-bottom: 0.125rem;
207
+ }
208
+
209
+ .asteroid-verdict-value {
210
+ font-weight: 900;
211
+ font-size: 1.125rem;
212
+ text-transform: uppercase;
213
+ white-space: nowrap;
214
+ font-style: italic;
215
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
216
+ }
217
+
218
+ .asteroid-verdict-safe .asteroid-verdict-value {
219
+ color: #34d399;
220
+ }
221
+
222
+ .asteroid-verdict-shock .asteroid-verdict-value {
223
+ color: #60a5fa;
224
+ }
225
+
226
+ .asteroid-verdict-burned .asteroid-verdict-value {
227
+ color: #fb923c;
228
+ }
229
+
230
+ .asteroid-verdict-vaporized .asteroid-verdict-value {
231
+ color: #f87171;
232
+ }
233
+
234
+ /* Panel de Control Escritorio */
235
+ .asteroid-desktop-lab {
236
+ display: none;
237
+ }
238
+
239
+ @media (min-width: 768px) {
240
+ .asteroid-desktop-lab {
241
+ display: flex;
242
+ position: absolute;
243
+ top: 1.5rem;
244
+ left: 1.5rem;
245
+ bottom: 1.5rem;
246
+ width: 20rem;
247
+ z-index: 30;
248
+ flex-direction: column;
249
+ pointer-events: none;
250
+ }
251
+ }
252
+
253
+ .asteroid-lab-panel {
254
+ background: rgba(255, 255, 255, 0.9);
255
+ backdrop-filter: blur(32px);
256
+ border: 1px solid rgba(255, 255, 255, 0.4);
257
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
258
+ border-radius: var(--asteroid-radius-lg);
259
+ padding: 1.25rem;
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: 1rem;
263
+ pointer-events: auto;
264
+ height: 100%;
265
+ overflow: hidden;
266
+ }
267
+
268
+ .asteroid-lab-header {
269
+ display: flex;
270
+ align-items: center;
271
+ justify-content: space-between;
272
+ padding-bottom: 0.5rem;
273
+ border-bottom: 1px solid rgba(226, 232, 240, 0.6);
274
+ flex-shrink: 0;
275
+ }
276
+
277
+ .asteroid-lab-title {
278
+ display: flex;
279
+ align-items: center;
280
+ gap: 0.5rem;
281
+ }
282
+
283
+ .asteroid-lab-icon {
284
+ width: 2rem;
285
+ height: 2rem;
286
+ border-radius: var(--asteroid-radius-sm);
287
+ background: linear-gradient(135deg, var(--asteroid-primary) 0%, var(--asteroid-secondary) 100%);
288
+ display: flex;
289
+ align-items: center;
290
+ justify-content: center;
291
+ color: white;
292
+ box-shadow: 0 4px 8px rgba(var(--asteroid-primary-rgb), 0.3);
293
+ }
294
+
295
+ .asteroid-lab-name {
296
+ font-weight: 900;
297
+ color: var(--asteroid-text-primary);
298
+ font-size: 1rem;
299
+ line-height: 1;
300
+ }
301
+
302
+ .asteroid-lab-subtitle {
303
+ font-size: 0.5625rem;
304
+ font-weight: 700;
305
+ color: var(--asteroid-text-secondary);
306
+ text-transform: uppercase;
307
+ letter-spacing: 0.125em;
308
+ }
309
+
310
+ .asteroid-lab-content {
311
+ flex: 1;
312
+ overflow-y: auto;
313
+ padding-right: 0.25rem;
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: 1.5rem;
317
+ }
318
+
319
+ .asteroid-lab-content::-webkit-scrollbar {
320
+ width: 6px;
321
+ }
322
+
323
+ .asteroid-lab-content::-webkit-scrollbar-track {
324
+ background: transparent;
325
+ }
326
+
327
+ .asteroid-lab-content::-webkit-scrollbar-thumb {
328
+ background: rgba(100, 116, 139, 0.3);
329
+ border-radius: 3px;
330
+ }
331
+
332
+ /* Sección de Arrastre del Asteroide */
333
+ .asteroid-drag-source {
334
+ position: relative;
335
+ cursor: grab;
336
+ transform-origin: center;
337
+ transition: var(--asteroid-transition);
338
+ }
339
+
340
+ .asteroid-drag-source:active {
341
+ cursor: grabbing;
342
+ transform: scale(0.98);
343
+ }
344
+
345
+ .asteroid-drag-source:hover {
346
+ transform: scale(1.02);
347
+ }
348
+
349
+ .asteroid-drag-bg {
350
+ position: absolute;
351
+ inset: 0;
352
+ background: linear-gradient(135deg, #f3f4f6 0%, #fff 100%);
353
+ border-radius: var(--asteroid-radius-lg);
354
+ border: 1px solid var(--asteroid-border-light);
355
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.05);
356
+ }
357
+
358
+ .asteroid-drag-tooltip {
359
+ position: absolute;
360
+ top: -2.5rem;
361
+ left: 50%;
362
+ transform: translateX(-50%);
363
+ opacity: 0;
364
+ display: flex;
365
+ align-items: center;
366
+ justify-content: center;
367
+ z-index: 10;
368
+ pointer-events: none;
369
+ transition: opacity var(--asteroid-transition);
370
+ }
371
+
372
+ .asteroid-drag-source:hover .asteroid-drag-tooltip {
373
+ opacity: 1;
374
+ }
375
+
376
+ .asteroid-drag-tooltip-text {
377
+ background: rgba(0, 0, 0, 0.85);
378
+ color: white;
379
+ font-size: 0.65rem;
380
+ font-weight: 700;
381
+ padding: 0.4rem 0.75rem;
382
+ border-radius: var(--asteroid-radius-sm);
383
+ border: 1px solid rgba(255, 255, 255, 0.1);
384
+ backdrop-filter: blur(8px);
385
+ box-shadow: var(--asteroid-shadow-lg);
386
+ }
387
+
388
+ .asteroid-drag-visual {
389
+ position: relative;
390
+ height: 12rem;
391
+ display: flex;
392
+ align-items: center;
393
+ justify-content: center;
394
+ overflow: visible;
395
+ border-radius: var(--asteroid-radius-lg);
396
+ }
397
+
398
+ .asteroid-drag-grid {
399
+ position: absolute;
400
+ inset: 0;
401
+ background-image: radial-gradient(#cbd5e1 1px, transparent 1px);
402
+ background-size: 20px 20px;
403
+ opacity: 0.5;
404
+ }
405
+
406
+ .asteroid-visual {
407
+ width: 5rem;
408
+ height: 5rem;
409
+ border-radius: 50%;
410
+ box-shadow: 10px 10px 30px rgba(0, 0, 0, 0.2), -5px -5px 15px rgba(255, 255, 255, 0.8);
411
+ position: relative;
412
+ transition: var(--asteroid-transition);
413
+ z-index: 10;
414
+ }
415
+
416
+ .asteroid-visual.ice-type {
417
+ box-shadow:
418
+ 0 0 20px rgba(103, 232, 249, 0.6),
419
+ 10px 10px 30px rgba(0, 0, 0, 0.2),
420
+ -5px -5px 15px rgba(255, 255, 255, 0.8);
421
+ }
422
+
423
+ .asteroid-drag-icon-parent {
424
+ position: absolute;
425
+ bottom: 0.5rem;
426
+ right: 0.5rem;
427
+ width: 2rem;
428
+ height: 2rem;
429
+ background: rgba(0, 0, 0, 0.85);
430
+ border: 1px solid rgba(255, 255, 255, 0.1);
431
+ border-radius: var(--asteroid-radius-sm);
432
+ display: flex;
433
+ align-items: center;
434
+ justify-content: center;
435
+ color: white;
436
+ z-index: 20;
437
+ opacity: 1;
438
+ transition: var(--asteroid-transition);
439
+ }
440
+
441
+ .asteroid-drag-source:hover .asteroid-drag-icon-parent {
442
+ background: rgba(0, 0, 0, 0.95);
443
+ }
444
+
445
+ .asteroid-surface {
446
+ position: absolute;
447
+ inset: 0;
448
+ border-radius: 50%;
449
+ background: var(--asteroid-accent);
450
+ overflow: hidden;
451
+ border: 2px solid rgba(255, 255, 255, 0.2);
452
+ }
453
+
454
+ .asteroid-surface-gradient {
455
+ position: absolute;
456
+ top: 0;
457
+ right: 0;
458
+ width: 100%;
459
+ height: 100%;
460
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(0, 0, 0, 0.3) 100%);
461
+ animation: asteroid-spin 8s linear infinite;
462
+ }
463
+
464
+ @keyframes asteroid-spin {
465
+ from { transform: rotate(0deg); }
466
+ to { transform: rotate(360deg); }
467
+ }
468
+
469
+ .asteroid-params-badge {
470
+ position: absolute;
471
+ top: 0.5rem;
472
+ left: 0.5rem;
473
+ background: rgba(0, 0, 0, 0.85);
474
+ border: 1px solid rgba(255, 255, 255, 0.1);
475
+ border-radius: var(--asteroid-radius-sm);
476
+ padding: 0.5rem 0.75rem;
477
+ display: flex;
478
+ flex-direction: column;
479
+ gap: 0.25rem;
480
+ z-index: 20;
481
+ font-size: 0.7rem;
482
+ font-weight: 700;
483
+ color: white;
484
+ white-space: nowrap;
485
+ opacity: 1;
486
+ transition: opacity var(--asteroid-transition-slow);
487
+ }
488
+
489
+ .asteroid-param-item {
490
+ display: flex;
491
+ align-items: center;
492
+ gap: 0.25rem;
493
+ }
494
+
495
+ .asteroid-param-item:nth-child(1) {
496
+ color: var(--asteroid-primary);
497
+ }
498
+
499
+ .asteroid-param-item:nth-child(2) {
500
+ color: var(--asteroid-success);
501
+ }
502
+
503
+ .asteroid-param-item:nth-child(3) {
504
+ color: var(--asteroid-accent);
505
+ }
506
+
507
+ /* Presets */
508
+ .asteroid-presets {
509
+ display: grid;
510
+ grid-template-columns: repeat(2, 1fr);
511
+ gap: 0.75rem;
512
+ }
513
+
514
+ .asteroid-preset-btn {
515
+ position: relative;
516
+ overflow: hidden;
517
+ background: white;
518
+ border: 1px solid var(--asteroid-border-light);
519
+ border-radius: var(--asteroid-radius-md);
520
+ padding: 0.75rem;
521
+ text-align: left;
522
+ transition: var(--asteroid-transition-slow);
523
+ cursor: pointer;
524
+ flex-shrink: 0;
525
+ }
526
+
527
+ .asteroid-preset-btn:hover {
528
+ box-shadow: var(--asteroid-shadow-lg);
529
+ transform: translateY(-2px);
530
+ border-color: var(--asteroid-primary);
531
+ }
532
+
533
+ .asteroid-preset-title {
534
+ font-size: 0.6875rem;
535
+ font-weight: 900;
536
+ color: var(--asteroid-text-primary);
537
+ margin-bottom: 0.125rem;
538
+ position: relative;
539
+ z-index: 10;
540
+ transition: var(--asteroid-transition);
541
+ }
542
+
543
+ .asteroid-preset-btn:hover .asteroid-preset-title {
544
+ color: var(--asteroid-primary);
545
+ }
546
+
547
+ .asteroid-preset-subtitle {
548
+ font-size: 0.5625rem;
549
+ font-weight: 500;
550
+ color: var(--asteroid-text-secondary);
551
+ position: relative;
552
+ z-index: 10;
553
+ }
554
+
555
+ /* Controles */
556
+ .asteroid-control-group {
557
+ background: var(--asteroid-bg-light);
558
+ border-radius: var(--asteroid-radius-md);
559
+ padding: 0.75rem;
560
+ border: 1px solid var(--asteroid-border-light);
561
+ }
562
+
563
+ .asteroid-control-label {
564
+ display: flex;
565
+ justify-content: space-between;
566
+ align-items: flex-end;
567
+ margin-bottom: 0.5rem;
568
+ }
569
+
570
+ .asteroid-control-text {
571
+ font-size: 0.625rem;
572
+ font-weight: 700;
573
+ color: var(--asteroid-text-secondary);
574
+ text-transform: uppercase;
575
+ letter-spacing: 0.05em;
576
+ }
577
+
578
+ .asteroid-control-value {
579
+ font-size: 0.875rem;
580
+ font-weight: 900;
581
+ color: var(--asteroid-text-primary);
582
+ }
583
+
584
+ .asteroid-slider {
585
+ width: 100%;
586
+ height: 0.375rem;
587
+ background: var(--asteroid-border-light);
588
+ border-radius: 0.5rem;
589
+ appearance: none;
590
+ cursor: pointer;
591
+ accent-color: var(--asteroid-primary);
592
+ }
593
+
594
+ .asteroid-slider::-webkit-slider-thumb {
595
+ appearance: none;
596
+ width: 1.25rem;
597
+ height: 1.25rem;
598
+ background: var(--asteroid-primary);
599
+ border-radius: 50%;
600
+ cursor: pointer;
601
+ box-shadow: var(--asteroid-shadow-md);
602
+ transition: var(--asteroid-transition);
603
+ }
604
+
605
+ .asteroid-slider::-webkit-slider-thumb:hover {
606
+ transform: scale(1.2);
607
+ box-shadow: var(--asteroid-shadow-lg);
608
+ }
609
+
610
+ .asteroid-slider::-moz-range-thumb {
611
+ width: 1.25rem;
612
+ height: 1.25rem;
613
+ background: var(--asteroid-primary);
614
+ border: none;
615
+ border-radius: 50%;
616
+ cursor: pointer;
617
+ box-shadow: var(--asteroid-shadow-md);
618
+ transition: var(--asteroid-transition);
619
+ }
620
+
621
+ .asteroid-slider::-moz-range-thumb:hover {
622
+ transform: scale(1.2);
623
+ box-shadow: var(--asteroid-shadow-lg);
624
+ }
625
+
626
+ /* Selectores de Composición */
627
+ .asteroid-material-buttons {
628
+ display: grid;
629
+ grid-template-columns: repeat(3, 1fr);
630
+ gap: 0.5rem;
631
+ }
632
+
633
+ .asteroid-material-btn {
634
+ padding: 0.5rem;
635
+ border-radius: var(--asteroid-radius-md);
636
+ border: 1px solid var(--asteroid-border-light);
637
+ background: var(--asteroid-bg-light);
638
+ cursor: pointer;
639
+ transition: var(--asteroid-transition);
640
+ display: flex;
641
+ flex-direction: column;
642
+ align-items: center;
643
+ gap: 0.25rem;
644
+ }
645
+
646
+ .asteroid-material-btn:hover {
647
+ background: white;
648
+ }
649
+
650
+ .asteroid-material-btn.active {
651
+ border-color: var(--asteroid-primary);
652
+ background: rgba(249, 115, 22, 0.1);
653
+ }
654
+
655
+ .asteroid-material-dot {
656
+ width: 1rem;
657
+ height: 1rem;
658
+ border-radius: 50%;
659
+ box-shadow: var(--asteroid-shadow-sm);
660
+ transition: var(--asteroid-transition);
661
+ }
662
+
663
+ .asteroid-material-btn:hover .asteroid-material-dot {
664
+ transform: scale(1.1);
665
+ }
666
+
667
+ .asteroid-material-name {
668
+ font-size: 0.5625rem;
669
+ font-weight: 700;
670
+ color: var(--asteroid-text-secondary);
671
+ text-transform: uppercase;
672
+ }
673
+
674
+ /* Botón Limpiar */
675
+ .asteroid-clear-btn {
676
+ width: 100%;
677
+ padding: 0.75rem;
678
+ border-radius: var(--asteroid-radius-md);
679
+ background: var(--asteroid-bg-light);
680
+ color: var(--asteroid-text-secondary);
681
+ font-weight: 700;
682
+ font-size: 0.75rem;
683
+ text-transform: uppercase;
684
+ letter-spacing: 0.05em;
685
+ border: none;
686
+ cursor: pointer;
687
+ transition: var(--asteroid-transition);
688
+ display: flex;
689
+ align-items: center;
690
+ justify-content: center;
691
+ gap: 0.5rem;
692
+ flex-shrink: 0;
693
+ }
694
+
695
+ .asteroid-clear-btn:hover {
696
+ background: rgba(220, 38, 38, 0.1);
697
+ color: var(--asteroid-danger);
698
+ }
699
+
700
+ /* Panel de Control Móvil */
701
+ .asteroid-mobile-control {
702
+ display: flex;
703
+ align-items: center;
704
+ justify-content: center;
705
+ }
706
+
707
+ @media (min-width: 768px) {
708
+ .asteroid-mobile-control {
709
+ display: none;
710
+ }
711
+ }
712
+
713
+ .asteroid-mobile-bar {
714
+ position: absolute;
715
+ bottom: 1.5rem;
716
+ left: 1rem;
717
+ right: 1rem;
718
+ z-index: 40;
719
+ background: rgba(255, 255, 255, 0.9);
720
+ backdrop-filter: blur(12px);
721
+ border-radius: var(--asteroid-radius-lg);
722
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
723
+ border: 1px solid rgba(255, 255, 255, 0.6);
724
+ padding: 0.5rem;
725
+ display: flex;
726
+ align-items: center;
727
+ justify-content: space-between;
728
+ pointer-events: auto;
729
+ }
730
+
731
+ .asteroid-mobile-asteroid {
732
+ width: 4rem;
733
+ height: 4rem;
734
+ background: var(--asteroid-bg-light);
735
+ border-radius: 50%;
736
+ box-shadow: var(--asteroid-shadow-lg);
737
+ border: 1px solid white;
738
+ display: flex;
739
+ align-items: center;
740
+ justify-content: center;
741
+ cursor: grab;
742
+ position: relative;
743
+ overflow: hidden;
744
+ transition: var(--asteroid-transition);
745
+ }
746
+
747
+ .asteroid-mobile-asteroid:active {
748
+ cursor: grabbing;
749
+ transform: scale(0.95);
750
+ }
751
+
752
+ .asteroid-mobile-asteroid-label {
753
+ position: absolute;
754
+ top: -0.75rem;
755
+ background: var(--asteroid-bg-dark);
756
+ color: white;
757
+ font-size: 0.5625rem;
758
+ font-weight: 900;
759
+ letter-spacing: 0.125em;
760
+ padding: 0 0.5rem;
761
+ border-radius: var(--asteroid-radius-full);
762
+ box-shadow: var(--asteroid-shadow-lg);
763
+ transform: scale(0.9);
764
+ }
765
+
766
+ .asteroid-mobile-person {
767
+ width: 4rem;
768
+ height: 4rem;
769
+ background: rgba(59, 130, 246, 0.05);
770
+ border-radius: 50%;
771
+ box-shadow: var(--asteroid-shadow-lg);
772
+ border: 1px solid white;
773
+ display: flex;
774
+ align-items: center;
775
+ justify-content: center;
776
+ cursor: grab;
777
+ position: relative;
778
+ overflow: hidden;
779
+ transition: var(--asteroid-transition);
780
+ }
781
+
782
+ .asteroid-mobile-person:active {
783
+ cursor: grabbing;
784
+ transform: scale(0.95);
785
+ }
786
+
787
+ .asteroid-person-icon {
788
+ width: 2rem;
789
+ height: 2rem;
790
+ color: #3b82f6;
791
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
792
+ }
793
+
794
+ .asteroid-divider {
795
+ height: 2rem;
796
+ width: 1px;
797
+ background: var(--asteroid-border-light);
798
+ margin: 0 0.5rem;
799
+ }