Repository navigation
Expand file tree
/
Copy pathapp.js
More file actions
1491 lines (1380 loc) · 63.7 KB
/
Copy pathapp.js
File metadata and controls
1491 lines (1380 loc) · 63.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/* ============================================
BioLab Interactivo v2.0 - Application Logic
============================================ */
// ============================================
// DATA: Organelle Information
// ============================================
const organelleData = {
nucleo: {
title: '🧠 Núcleo',
color: '#3949ab',
emoji: '🧠',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Almacena el material genético (ADN) y coordina todas las actividades celulares: replicación, transcripción y regulación génica. Es el "centro de control" de la célula.'
},
{
icon: '🏗️',
title: 'Estructura',
content: 'Envuelto por la <strong>envoltura nuclear</strong> (doble membrana con poros nucleares). Dentro: <strong>cromatina</strong> (ADN + proteínas) y el <strong>nucléolo</strong> (fábrica de ribosomas).'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'Si estiraras todo el ADN de una célula humana, mediría ~2 metros. ¡Y cabe en un espacio de 6 micras! Todos los humanos compartimos el 99.9% de nuestro ADN.'
}
],
memory: '"El núcleo es como el cerebro de la célula — sin él, no hay instrucciones para construir proteínas."'
},
mitocondria: {
title: '⚡ Mitocondria',
color: '#c62828',
emoji: '⚡',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Produce ATP (trifosfato de adenosina) mediante <strong>respiración celular</strong>. Es la central energética de la célula. Una célula activa puede tener miles de mitocondrias.'
},
{
icon: '🏗️',
title: 'Estructura',
content: '<strong>Doble membrana</strong>: externa lisa, interna con <strong>crestas</strong> (cristae) que aumentan la superficie para la producción de ATP. Contiene su propio ADN circular.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'Las mitocondrias tienen su propio ADN y se heredan solo de la madre. Son bacterias que un día decidieron quedarse — teoría de la endosimbiosis. ¡Son tus abuelas bacterianas!'
}
],
memory: '"Mitocondria = Mitocondrial ADN + ATP = ¡Energía! Doble membrana con crestas."'
},
ribosomas: {
title: '🏭 Ribosomas',
color: '#e65100',
emoji: '🏭',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Sintetizan proteínas traduciendo el ARN mensajero (ARNm). Leen el código genético y ensamblan aminoácidos en cadenas polipeptídicas. ¡Sin parar!'
},
{
icon: '🏗️',
title: 'Estructura',
content: 'Dos subunidades (grande y pequeña) hechas de <strong>ARN ribosómico (ARNr)</strong> y proteínas. Se unen solo durante la traducción. Tamaño: ~20-30 nm.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'Una célula eucariota puede tener millones de ribosomas. Producen miles de proteínas por segundo. Los ribosomas procariotas son más pequeños (70S) que los eucariotas (80S).'
}
],
memory: '"ARNm entra → Proteína sale. ¡Así de simple! Dos subunidades = una proteína."'
},
reticulo_rugoso: {
title: '🕸️ Retículo Endoplásmico Rugoso',
color: '#8e24aa',
emoji: '🕸️',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Síntesis y plegamiento de <strong>proteínas</strong> (gracias a los ribosomas adheridos). También modifica proteínas con azúcares (glicosilación).'
},
{
icon: '🏗️',
title: 'Estructura',
content: 'Red de membranas interconectadas que se extiende desde el núcleo. Su superficie está cubierta de <strong>ribosomas</strong>, lo que le da apariencia "rugosa" al microscopio.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'Las células que producen muchas proteínas (como las del páncreas) tienen un retículo rugoso enorme. ¡Puede ocupar más de la mitad del volumen celular!'
}
],
memory: '"Rugoso = ribosomas pegados = proteínas. Si ves puntitos naranjas, es rugoso."'
},
reticulo_liso: {
title: '🧈 Retículo Endoplásmico Liso',
color: '#ba68c8',
emoji: '🧈',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Síntesis de <strong>lípidos</strong> (fosfolípidos, esteroides), <strong>detoxificación</strong> de drogas y alcohol, almacenamiento de calcio (músculo).'
},
{
icon: '🏗️',
title: 'Estructura',
content: 'Igual que el rugoso pero <strong>sin ribosomas</strong> en su superficie, por eso se ve "liso". Forma tubos en lugar de sacos aplanados.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'El retículo liso del hígado desintoxica el alcohol. Tu hígado tiene su propia planta de tratamiento. Las células hepáticas tienen mucho más REL que otras células.'
}
],
memory: '"Liso = sin ribosomas = lípidos y detox. El hígado lo ama."'
},
golgi: {
title: '📦 Aparato de Golgi',
color: '#1565c0',
emoji: '📦',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Modifica, empaca y distribuye <strong>proteínas y lípidos</strong>. Añade etiquetas moleculares para enviar cada molécula a su destino correcto dentro o fuera de la célula.'
},
{
icon: '🏗️',
title: 'Estructura',
content: 'Pila de <strong>4-6 cisternas</strong> (sacos aplanados) con vesículas de entrada (cis) y salida (trans). Cada cisterna tiene enzimas diferentes para modificar cargas.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: '¡Es como Amazon celular! Recibe paquetes del retículo, les pone "etiquetas de envío" y los despacha por vesículas. Descubierto por Camillo Golgi en 1898 con una técnica de tinción especial.'
}
],
memory: '"Golgi = Correos de la célula. Cis (entra) → Modifica → Trans (sale)."'
},
membrana: {
title: '🛡️ Membrana Plasmática',
color: '#e65100',
emoji: '🛡️',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Barrera selectiva que controla qué entra y sale de la célula. Protege, comunica con otras células y mantiene el ambiente interno estable (homeostasis).'
},
{
icon: '🏗️',
title: 'Estructura',
content: '<strong>Mosaico fluido</strong>: bicapa de fosfolípidos (cabeza hidrofílica afuera, colas hidrofóbicas adentro) + proteínas integrales y periféricas + carbohidratos (glucocalix).'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'Si juntaras toda la membrana plasmática de tu cuerpo, cubriría un campo de fútbol. ¡Y es solo 7-10 nm de grosor! Las proteínas "flotan" como icebergs en el mar de lípidos.'
}
],
memory: '"Mosaico fluido = fosfolípidos + proteínas flotantes. Selectivamente permeable."'
},
citoesqueleto: {
title: '🦴 Citoesqueleto',
color: '#455a64',
emoji: '🦴',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Da forma y soporte a la célula, permite movimiento (cilios, flagelos), transporta orgánulos y divide la célula durante la mitosis. Es el "esqueleto" de la célula.'
},
{
icon: '🏗️',
title: 'Estructura',
content: 'Tres tipos: <strong>Microfilamentos</strong> (actina, 7nm), <strong>Filamentos intermedios</strong> (queratina, 10nm), <strong>Microtúbulos</strong> (tubulina, 25nm). Forman una red dinámica.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'Los microtúbulos son como rieles de tren: las vesículas se desplazan sobre ellos usando motorinas (kinesina y dineína). ¡Son autopistas intracelulares a 1 µm/segundo!'
}
],
memory: '"Sin citoesqueleto, la célula sería como gelatina derretida. 3 tipos: microfilamentos, intermedios, microtúbulos."'
},
transporte: {
title: '🚛 Transporte Celular',
color: '#2e7d32',
emoji: '🚛',
sections: [
{
icon: '⚙️',
title: 'Tipos de Transporte',
content: '<strong>Pasivo</strong>: difusión simple, difusión facilitada (con canales), ósmosis (agua). <strong>Activo</strong>: transporte activo (contra gradiente, gasta ATP), endocitosis y exocitosis (vesículas grandes).'
},
{
icon: '🏗️',
title: 'Mecanismos',
content: 'La membrana es <strong>semipermeable</strong>. Moléculas pequeñas y no polares pasan libremente. Iones y moléculas grandes necesitan proteínas transportadoras o vesículas.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'La endocitosis es como "comerse" algo: la membrana se hunde y forma una vesícula. La fagocitosis (células come-bacterias) es un tipo de endocitosis. ¡Las células tienen boca!'
}
],
memory: '"Pasivo = sin energía (bajando la colina). Activo = con ATP (subiendo). Vesículas = endo/exocitosis."'
},
cloroplasto: {
title: '🌿 Cloroplasto',
color: '#2e7d32',
emoji: '🌿',
sections: [
{
icon: '⚙️',
title: 'Función Principal',
content: 'Realiza la <strong>fotosíntesis</strong>: convierte luz solar en energía química (glucosa). Absorbe CO₂ y libera O₂. Solo en células vegetales y algas.'
},
{
icon: '🏗️',
title: 'Estructura',
content: '<strong>Doble membrana</strong> externa. Interior: <strong>estroma</strong> (líquido) y <strong>tilacoides</strong> (discos apilados en grana) con clorofila. También tiene ADN propio.'
},
{
icon: '🤯',
title: 'Dato Curioso',
content: 'Los cloroplastos también vienen de bacterias (endosimbiosis). Una célula vegetal puede tener 50 cloroplastos. ¡Producen ~100 mil millones de toneladas de glucosa al año en la Tierra!'
}
],
memory: '"Cloroplasto = fotosíntesis = luz + CO₂ + H₂O → glucosa + O₂. Tiene tilacoides con clorofila."'
}
};
// ============================================
// DATA: Quiz Questions (20 questions)
// ============================================
const quizQuestions = [
{
id: 1,
category: 'organelles',
icon: '🧠',
question: '¿Qué orgánulo es el "centro de control" de la célula?',
options: ['Mitocondria', 'Núcleo', 'Ribosoma', 'Aparato de Golgi'],
correct: 1,
explanation: 'El núcleo almacena el ADN y coordina todas las actividades celulares. Es el centro de control.'
},
{
id: 2,
category: 'organelles',
icon: '⚡',
question: '¿Qué orgánulo produce ATP mediante respiración celular?',
options: ['Núcleo', 'Ribosoma', 'Mitocondria', 'Retículo liso'],
correct: 2,
explanation: 'La mitocondria es la central energética. Su doble membrana interna con crestas produce ATP.'
},
{
id: 3,
category: 'organelles',
icon: '🏭',
question: '¿Dónde se sintetizan las proteínas en la célula?',
options: ['En el núcleo', 'En los ribosomas', 'En el Golgi', 'En la mitocondria'],
correct: 1,
explanation: 'Los ribosomas traducen el ARNm y ensamblan aminoácidos en proteínas. Son las fábricas celulares.'
},
{
id: 4,
category: 'organelles',
icon: '🕸️',
question: '¿Qué diferencia al retículo endoplásmico rugoso del liso?',
options: ['El rugoso tiene ribosomas', 'El liso es más grande', 'El rugoso produce lípidos', 'No hay diferencia'],
correct: 0,
explanation: 'El retículo rugoso tiene ribosomas adheridos (síntesis de proteínas). El liso no tiene ribosomas (lípidos y detox).'
},
{
id: 5,
category: 'organelles',
icon: '📦',
question: '¿Cuál es la función del Aparato de Golgi?',
options: ['Producir ATP', 'Empacar y distribuir proteínas', 'Sintetizar ADN', 'Digestión celular'],
correct: 1,
explanation: 'El Golgi modifica, empaca y envía proteínas y lípidos a su destino final. Es la estación de correos.'
},
{
id: 6,
category: 'membrane',
icon: '🛡️',
question: '¿Cómo se llama el modelo de la membrana plasmática?',
options: ['Modelo de capa sólida', 'Modelo de mosaico fluido', 'Modelo de doble pared', 'Modelo de membrana rígida'],
correct: 1,
explanation: 'Modelo de mosaico fluido: fosfolípidos forman bicapa y proteínas "flotan" como icebergs.'
},
{
id: 7,
category: 'membrane',
icon: '💧',
question: '¿Qué parte del fosfolípido es hidrofílica?',
options: ['Las colas', 'La cabeza', 'Ambas', 'Ninguna'],
correct: 1,
explanation: 'La cabeza del fosfolípido es hidrofílica (ama el agua) y las colas son hidrofóbicas (rechazan el agua).'
},
{
id: 8,
category: 'transport',
icon: '🚪',
question: '¿Qué transporte NO requiere energía (ATP)?',
options: ['Transporte activo', 'Endocitosis', 'Difusión simple', 'Bomba de sodio-potasio'],
correct: 2,
explanation: 'La difusión simple es pasiva: las moléculas se mueven del alto al bajo concentración sin gastar energía.'
},
{
id: 9,
category: 'transport',
icon: '💦',
question: '¿Qué es la ósmosis?',
options: ['Transporte de proteínas', 'Difusión de agua a través de membrana semipermeable', 'Transporte activo de iones', 'Digestión celular'],
correct: 1,
explanation: 'Ósmosis = difusión de agua a través de una membrana semipermeable, del bajo al alto concentración de soluto.'
},
{
id: 10,
category: 'transport',
icon: '🍽️',
question: '¿Cómo ingieren las células partículas grandes?',
options: ['Difusión simple', 'Transporte facilitado', 'Endocitosis', 'Ósmosis'],
correct: 2,
explanation: 'La endocitosis usa vesículas para "engullir" partículas grandes. La fagocitosis es un tipo de endocitosis.'
},
{
id: 11,
category: 'cytoskeleton',
icon: '🦴',
question: '¿Cuál es la función del citoesqueleto?',
options: ['Producir energía', 'Dar forma y soporte, permitir movimiento', 'Sintetizar proteínas', 'Almacenar ADN'],
correct: 1,
explanation: 'El citoesqueleto es como el esqueleto de la célula: da forma, permite movimiento y transporta orgánulos.'
},
{
id: 12,
category: 'cytoskeleton',
icon: '🛤️',
question: '¿Qué componente del citoesqueleto actúa como "vías de tren"?',
options: ['Microfilamentos', 'Filamentos intermedios', 'Microtúbulos', 'Actina'],
correct: 2,
explanation: 'Los microtúbulos (tubulina) son como rieles por donde se mueven vesículas usando motorinas (kinesina/dineína).'
},
{
id: 13,
category: 'types',
icon: '🦠',
question: '¿Qué característica NO tienen las células procariotas?',
options: ['Ribosomas', 'Membrana plasmática', 'Núcleo definido', 'Citoplasma'],
correct: 2,
explanation: 'Las procariotas NO tienen núcleo definido. Su ADN está libre en el citoplasma (nucleoide).'
},
{
id: 14,
category: 'types',
icon: '🧫',
question: '¿Qué orgánulo tienen las células vegetales pero NO las animales?',
options: ['Mitocondria', 'Núcleo', 'Cloroplasto', 'Ribosoma'],
correct: 2,
explanation: 'Los cloroplastos realizan fotosíntesis y solo existen en células vegetales y algas. Las animales no los tienen.'
},
{
id: 15,
category: 'types',
icon: '📏',
question: '¿Cuál es el tamaño típico de una célula eucariota?',
options: ['0.1-1 µm', '1-10 µm', '10-100 µm', '1-10 mm'],
correct: 2,
explanation: 'Las eucariotas miden 10-100 µm. Las procariotas son más pequeñas (1-10 µm). El ovo humano es una excepción: ~100 µm.'
},
{
id: 16,
category: 'organelles',
icon: '🧬',
question: '¿Dónde se encuentra el nucléolo?',
options: ['En el citoplasma', 'Dentro del núcleo', 'En la mitocondria', 'En el Golgi'],
correct: 1,
explanation: 'El nucléolo está DENTRO del núcleo. Es la fábrica de ribosomas: produce ARNr y ensambla subunidades ribosómicas.'
},
{
id: 17,
category: 'membrane',
icon: '🔬',
question: '¿Qué proteínas atraviesan completamente la membrana?',
options: ['Proteínas periféricas', 'Proteínas integrales', 'Proteínas de adhesión', 'Proteínas de señalización'],
correct: 1,
explanation: 'Las proteínas integrales atraviesan toda la bicapa lipídica. Las periféricas solo se adhieren a una cara.'
},
{
id: 18,
category: 'transport',
icon: '⚡',
question: '¿Qué es el transporte activo?',
options: ['Movimiento con gradiente', 'Movimiento contra gradiente gastando ATP', 'Difusión de agua', 'Transporte por canales'],
correct: 1,
explanation: 'Transporte activo = mover sustancias CONTRA su gradiente de concentración, gastando ATP (ej: bomba Na⁺/K⁺).'
},
{
id: 19,
category: 'organelles',
icon: '🍷',
question: '¿Qué orgánulo desintoxica el alcohol en el hígado?',
options: ['Mitocondria', 'Retículo endoplásmico liso', 'Ribosoma', 'Núcleo'],
correct: 1,
explanation: 'El retículo endoplásmico liso (REL) del hígado contiene enzimas que descomponen drogas, toxinas y alcohol.'
},
{
id: 20,
category: 'types',
icon: '🧱',
question: '¿Qué tienen las células vegetales además de la membrana?',
options: ['Cápsula', 'Pared celular', 'Flagelo', 'Cilios'],
correct: 1,
explanation: 'Las células vegetales tienen pared celular de celulosa ADEMÁS de la membrana plasmática. Les da rigidez y forma.'
}
];
// ============================================
// BIOLOGY DICTIONARY — Tooltips for key terms
// ============================================
const biologyDictionary = {
// Ácidos nucleicos y genética
'ADN': 'Ácido desoxirribonucleico — la molécula que contiene las instrucciones genéticas para todos los organismos vivos.',
'ARN': 'Ácido ribonucleico — molécula esencial para la síntesis de proteínas y la expresión genética.',
'ARNm': 'ARN mensajero — transporta información genética desde el ADN a los ribosomas para la síntesis de proteínas.',
'ARNr': 'ARN ribosómico — un tipo de ARN que constituye el núcleo estructural de los ribosomas.',
'cromatina': 'Un complejo de ADN y proteínas (histonas) que forma los cromosomas dentro del núcleo.',
'nucléolo': 'Una estructura densa dentro del núcleo donde se produce el ARN ribosómico.',
'envoltura nuclear': 'La doble membrana que rodea el núcleo, controlando lo que entra y sale.',
'poros nucleares': 'Canales en la envoltura nuclear que permiten el intercambio de moléculas entre el núcleo y el citoplasma.',
// Energía y metabolismo
'ATP': 'Adenosín trifosfato — la principal moneda energética de la célula.',
'respiración celular': 'El proceso mediante el cual las células descomponen la glucosa para producir ATP (energía).',
'crestas': 'La membrana interna plegada de las mitocondrias donde ocurre la producción de ATP.',
'endosimbiosis': 'La teoría de que las mitocondrias y los cloroplastos evolucionaron a partir de bacterias antiguas.',
// Síntesis de proteínas
'síntesis de proteínas': 'El proceso de construir proteínas a partir de aminoácidos utilizando instrucciones del ADN.',
'traducción': 'Proceso donde los ribosomas convierten el ARNm en una cadena de aminoácidos (proteína).',
'transcripción': 'Proceso donde se copia la información del ADN a ARNm.',
'aminoácidos': 'Los bloques de construcción de las proteínas. Existen 20 tipos diferentes.',
'polipéptidos': 'Cadenas de aminoácidos que se pliegan para formar proteínas funcionales.',
// Retículo endoplásmico y Golgi
'glicosilación': 'El proceso de añadir moléculas de azúcar a las proteínas o lípidos.',
'desintoxicación': 'El proceso de eliminar sustancias tóxicas del cuerpo o de la célula.',
'cisternas': 'Sacos aplanados delimitados por membrana que constituyen el aparato de Golgi.',
'vesículas': 'Pequeños sacos encerrados por membrana que transportan materiales dentro de la célula.',
'glucosa': 'Azúcar simple que las células usan como fuente principal de energía.',
'lípidos': 'Grasas y moléculas similares que forman membranas y almacenan energía.',
'esteroides': 'Tipo de lípido que incluye hormonas como el estrógeno y la testosterona.',
// Membrana celular
'fosfolípidos': 'Moléculas lipídicas que forman la estructura básica de las membranas celulares.',
'modelo de mosaico fluido': 'El modelo que describe la membrana celular como una capa fluida de lípidos con proteínas incrustadas.',
'hidrofílico': 'Ama el agua — describe moléculas que se disuelven en agua.',
'hidrofóbico': 'Le teme al agua — describe moléculas que repelen el agua.',
'proteínas integrales': 'Proteínas que atraviesan toda la membrana, actuando como canales o transportadores.',
'proteínas periféricas': 'Proteínas unidas a un lado de la membrana, a menudo como enzimas o receptores.',
'bicapa lipídica': 'Doble capa de fosfolípidos que forma la base de todas las membranas celulares.',
'glucocálix': 'Capa de carbohidratos en la superficie externa de la membrana, importante para el reconocimiento celular.',
'semipermeable': 'Propiedad de la membrana que permite el paso de algunas moléculas pero no de otras.',
// Transporte celular
'ósmosis': 'La difusión de agua a través de una membrana semipermeable.',
'difusión': 'El movimiento de moléculas desde una zona de alta a baja concentración sin necesidad de energía.',
'difusión simple': 'Paso directo de moléculas pequeñas y no polares a través de la membrana.',
'difusión facilitada': 'Transporte de moléculas a través de proteínas transportadoras sin gasto de energía.',
'transporte activo': 'Movimiento de moléculas en contra de su gradiente, que requiere energía ATP.',
'endocitosis': 'El proceso de introducir materiales en la célula envolviéndolos en una vesícula.',
'exocitosis': 'El proceso de expulsar materiales de la célula utilizando vesículas.',
'fagocitosis': 'Tipo de endocitosis donde la célula engulle partículas grandes o bacterias.',
'canales iónicos': 'Proteínas que forman poros en la membrana para el paso selectivo de iones.',
'gradiente de concentración': 'Diferencia en la concentración de una sustancia entre dos áreas.',
// Citoesqueleto
'microfilamentos': 'Los filamentos más delgados del citoesqueleto hechos de proteína actina.',
'microtúbulos': 'Los filamentos más gruesos del citoesqueleto hechos de proteína tubulina.',
'filamentos intermedios': 'Filamentos de tamaño mediano del citoesqueleto que proporcionan resistencia mecánica.',
'cinesina': 'Una proteína motora que camina a lo largo de los microtúbulos transportando carga celular.',
'dineína': 'Una proteína motora que mueve la carga hacia el centro de la célula a lo largo de los microtúbulos.',
'actina': 'Proteína que forma los microfilamentos, esencial para el movimiento y la estructura celular.',
'tubulina': 'Proteína que forma los microtúbulos, clave en el transporte y la división celular.',
'queratina': 'Proteína que forma los filamentos intermedios en células epiteliales.',
'mitosis': 'Proceso de división celular que produce dos células hijas idénticas.',
// Fotosíntesis
'fotosíntesis': 'El proceso mediante el cual las plantas convierten la energía luminosa en glucosa y oxígeno.',
'clorofila': 'El pigmento verde en los cloroplastos que captura la energía luminosa.',
'tilacoides': 'Discos membranosos dentro de los cloroplastos donde ocurren las reacciones lumínicas.',
'estroma': 'El espacio lleno de líquido dentro de los cloroplastos donde ocurre el ciclo de Calvin.',
'grana': 'Apilamientos de tilacoides en los cloroplastos que aumentan la eficiencia de la fotosíntesis.',
'ciclo de Calvin': 'Fase de la fotosíntesis donde se fija el CO₂ para producir glucosa.',
'reacciones lumínicas': 'Fase de la fotosíntesis que depende de la luz y ocurre en los tilacoides.',
// Tipos celulares
'procariota': 'Células sin núcleo ni orgánulos delimitados por membrana (bacterias, arqueas).',
'eucariota': 'Células con núcleo y orgánulos delimitados por membrana (animales, plantas, hongos).',
'peptidoglicano': 'Un polímero que forma la pared celular de las bacterias.',
'celulosa': 'Un carbohidrato complejo que forma la pared celular de las plantas.',
'arqueas': 'Microorganismos procariotas que viven en ambientes extremos.',
'hongos': 'Organismos eucariotas que incluyen levaduras, mohos y setas.',
// Estructura celular general
'citoplasma': 'El material gelatinoso dentro de la célula donde están suspendidos los orgánulos.',
'orgánulo': 'Una estructura especializada dentro de una célula que realiza una función específica.',
'enzima': 'Una proteína que acelera las reacciones químicas en la célula.',
'homeostasis': 'El mantenimiento de un ambiente interno estable en la célula o el cuerpo.',
'célula': 'La unidad básica de la vida, capaz de realizar todas las funciones vitales.',
'célula animal': 'Célula eucariota sin pared celular ni cloroplastos, con centriolos.',
'célula vegetal': 'Célula eucariota con pared celular de celulosa, cloroplastos y vacuola central.',
'vacuola central': 'Orgánulo grande en células vegetales que almacena agua y mantiene la turgencia.',
'pared celular': 'Capa rígida que rodea la membrana en células vegetales y bacterianas.',
// Procesos celulares
'replicación': 'Proceso de copiar el ADN antes de la división celular.',
'regulación génica': 'Mecanismos que controlan qué genes se expresan y cuándo.',
'señalización celular': 'Proceso de comunicación entre células mediante señales químicas.',
'metabolismo': 'Conjunto de reacciones químicas que ocurren en la célula para mantener la vida.',
'anabolismo': 'Procesos metabólicos que construyen moléculas complejas a partir de simples.',
'catabolismo': 'Procesos metabólicos que descomponen moléculas para liberar energía.',
// Moléculas y componentes
'histonas': 'Proteínas alrededor de las cuales se enrolla el ADN para formar cromatina.',
'cromosomas': 'Estructuras de ADN condensado que contienen los genes.',
'genes': 'Segmentos de ADN que contienen instrucciones para producir proteínas.',
'proteínas': 'Moléculas formadas por aminoácidos que realizan casi todas las funciones celulares.',
'carbohidratos': 'Moléculas que incluyen azúcares y almidones, fuente de energía y estructura.'
};
// Function to add tooltips (only first occurrence of each term)
function addTooltips(content) {
let result = content;
const usedTerms = new Set();
// Ordenar términos por longitud (más largos primero)
const sortedTerms = Object.keys(biologyDictionary).sort((a, b) => b.length - a.length);
for (const term of sortedTerms) {
const escapedTerm = term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const definition = biologyDictionary[term];
const regex = new RegExp(`(?<![<])${escapedTerm}(?![^<>]*>)`, 'gi');
let firstReplacement = true;
result = result.replace(regex, (match) => {
// Solo reemplazar si es la primera vez que aparece este término
if (!firstReplacement) {
return match;
}
// Verificar si ya está dentro de un span
const context = result.substring(Math.max(0, result.indexOf(match) - 50), result.indexOf(match) + match.length + 50);
if (context.includes('bio-term') || context.includes('data-tooltip')) {
return match;
}
firstReplacement = false;
const isStrong = result.substring(Math.max(0, result.indexOf(match) - 8), Math.min(result.length, result.indexOf(match) + match.length + 9)).includes('<strong>');
if (isStrong) {
return `<span class="bio-term" data-tooltip="${definition}"><strong>${match}</strong></span>`;
}
return `<span class="bio-term" data-tooltip="${definition}">${match}</span>`;
});
}
return result;
}
// Cuando el usuario selecciona un orgánulo:
function showOrganelle(organelleKey) {
// Primero, limpiar tooltips anteriores del contenido
const organelle = organelleData[organelleKey];
organelle.sections.forEach(section => {
section.content = cleanContent(section.content);
});
if (organelle.memory) {
organelle.memory = cleanContent(organelle.memory);
}
// Procesar con nuevos tooltips (solo primera vez en TODO el orgánulo)
processOrganelleContent(organelleKey);
// Ahora renderizar
renderOrganelleUI(organelleKey);
}
// ============================================
// PERSISTENT PRODUCT STATE
// ============================================
const STORAGE_KEY = 'biolab-interactive-state-v3';
const ANALYTICS_CODE = window.BIOLAB_ANALYTICS_CODE || '';
let productState = {
xp: 0,
streak: 0,
lastActiveDate: null,
dailyCompletedDate: null,
quizzesCompleted: 0,
quizCorrect: 0,
explored: [],
builderCompleted: false,
missionsCompleted: [],
missionAttempts: {}
};
function loadProductState() {
try {
const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || 'null');
if (saved && typeof saved === 'object') productState = { ...productState, ...saved };
} catch (error) {
console.warn('BioLab: no se pudo cargar el progreso local.', error);
}
}
function saveProductState() {
try { localStorage.setItem(STORAGE_KEY, JSON.stringify(productState)); } catch (_) {}
}
function todayKey() {
const now = new Date();
const y = now.getFullYear();
const m = String(now.getMonth() + 1).padStart(2, '0');
const d = String(now.getDate()).padStart(2, '0');
return `${y}-${m}-${d}`;
}
function registerActivity() {
const today = todayKey();
if (productState.lastActiveDate !== today) {
const previous = productState.lastActiveDate;
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const yesterdayKey = yesterday.toISOString().slice(0, 10);
productState.streak = previous === yesterdayKey ? productState.streak + 1 : 1;
productState.lastActiveDate = today;
saveProductState();
}
}
function awardXP(amount, reason) {
productState.xp += amount;
registerActivity();
saveProductState();
updateDashboard();
trackEvent('xp_earned', { amount, reason });
}
function trackEvent(name, data = {}) {
// If GoatCounter is configured, it gives you aggregate visitor/event analytics
// without requiring user accounts in BioLab.
if (window.goatcounter && typeof window.goatcounter.count === 'function') {
window.goatcounter.count({ path: `event/${name}`, title: name });
}
// Keep a tiny local event counter as a fallback for debugging.
try {
const key = 'biolab-event-counts';
const events = JSON.parse(localStorage.getItem(key) || '{}');
events[name] = (events[name] || 0) + 1;
localStorage.setItem(key, JSON.stringify(events));
} catch (_) {}
}
function loadAnalytics() {
if (!ANALYTICS_CODE || ANALYTICS_CODE === 'YOUR_GOATCOUNTER_CODE') return;
if (document.querySelector('script[data-biolab-analytics]')) return;
const script = document.createElement('script');
script.dataset.biolabAnalytics = 'true';
script.src = 'https://gc.zgo.at/count.js';
script.async = true;
script.dataset.goatcounter = `https://${ANALYTICS_CODE}.goatcounter.com/count`;
document.head.appendChild(script);
}
function updateDashboard() {
const statXP = document.getElementById('stat-xp');
const statStreak = document.getElementById('stat-streak');
const statQuizzes = document.getElementById('stat-quizzes');
const statExplored = document.getElementById('stat-explored');
if (statXP) statXP.textContent = productState.xp;
if (statStreak) statStreak.textContent = productState.streak;
if (statQuizzes) statQuizzes.textContent = productState.quizzesCompleted;
if (statExplored) statExplored.textContent = productState.explored.length;
const dailyTitle = document.getElementById('daily-title');
const dailySubtitle = document.getElementById('daily-subtitle');
const dailyBtn = document.querySelector('.daily-btn');
if (dailyTitle && dailySubtitle && dailyBtn) {
const completed = productState.dailyCompletedDate === todayKey();
const dailyQuestion = getDailyQuestion();
dailyTitle.textContent = completed ? '¡Reto diario completado! ✨' : dailyQuestion.question;
dailySubtitle.textContent = completed
? 'Vuelve mañana para desbloquear una nueva misión.'
: 'Una pregunta rápida. Completa el reto y gana XP.';
dailyBtn.textContent = completed ? 'Repasar →' : 'Comenzar →';
dailyBtn.classList.toggle('daily-complete', completed);
}
}
function getDailyQuestion() {
const date = todayKey();
const hash = [...date].reduce((sum, char) => sum + char.charCodeAt(0), 0);
return quizQuestions[hash % quizQuestions.length];
}
function startDailyChallenge() {
const q = getDailyQuestion();
const index = quizQuestions.findIndex(item => item.id === q.id);
quizState.shuffledQuestions = [q];
quizState.filteredQuestions = [q];
quizState.currentIndex = 0;
quizState.score = 0;
quizState.streak = 0;
quizState.answered = false;
setMode('quiz');
trackEvent('daily_challenge_started', { question: q.id });
}
function completeDailyChallenge() {
const today = todayKey();
if (productState.dailyCompletedDate !== today) {
productState.dailyCompletedDate = today;
awardXP(25, 'daily_challenge');
updateDashboard();
trackEvent('daily_challenge_completed');
}
}
loadProductState();
// ============================================
// STATE
// ============================================
let currentMode = 'explorer';
let exploredOrganelles = new Set(productState.explored || []);
let quizState = {
currentIndex: 0,
score: 0,
streak: 0,
correct: 0,
answered: false,
filter: 'all',
filteredQuestions: [],
shuffledQuestions: []
};
let builderParts = [];
let cellType = 'animal';
// ============================================
// INIT
// ============================================
document.addEventListener('DOMContentLoaded', () => {
loadAnalytics();
registerActivity();
initQuiz();
updateProgress();
updateDashboard();
renderMissions();
trackEvent('app_open');
});
// ============================================
// SCIENTIFIC MISSIONS
// ============================================
const missions = [
{
id: 'energy-crisis', icon: '⚡', difficulty: 'Nivel 1', xp: 40,
title: 'Crisis energética',
summary: 'Una célula deja de producir suficiente ATP. Investiga qué estructura está fallando.',
scenario: 'Tus sensores detectan una caída brusca de ATP. La síntesis de proteínas y el transporte activo comienzan a disminuir. ¿Qué estructura investigarías primero?',
choices: [
{ text: '🧠 Núcleo', correct: false, feedback: 'El núcleo contiene el ADN y regula la expresión génica, pero no es el sitio principal de producción de ATP.' },
{ text: '⚡ Mitocondria', correct: true, feedback: 'Correcto. La mitocondria genera gran parte del ATP mediante la respiración celular.' },
{ text: '📦 Aparato de Golgi', correct: false, feedback: 'El Golgi modifica y distribuye moléculas; no es el principal productor de ATP.' }
]
},
{
id: 'protein-factory', icon: '🧬', difficulty: 'Nivel 2', xp: 50,
title: 'Fábrica de proteínas',
summary: 'Una célula secretora produce muchas proteínas, pero los productos no llegan a su destino.',
scenario: 'Una célula pancreática fabrica una proteína para secretarla fuera de la célula. La proteína se sintetiza, pero el envío falla. ¿Qué ruta deberías revisar?',
choices: [
{ text: '🧬 Ribosoma → RER → Golgi → vesícula', correct: true, feedback: 'Exacto. Los ribosomas sintetizan la proteína, el RER participa en su procesamiento inicial y el Golgi la modifica y clasifica para su destino.' },
{ text: '⚡ Mitocondria → núcleo → membrana', correct: false, feedback: 'La mitocondria no es la ruta de empaquetado y secreción de proteínas.' },
{ text: '🌿 Cloroplasto → vacuola → Golgi', correct: false, feedback: 'Esa secuencia no corresponde a la vía secretora de una célula animal.' }
]
},
{
id: 'membrane-defense', icon: '🛡️', difficulty: 'Nivel 3', xp: 60,
title: 'Defensa de la membrana',
summary: 'Una sustancia atraviesa la membrana. Determina qué mecanismo explica mejor su movimiento.',
scenario: 'Hay mucha más concentración de una molécula pequeña y no polar fuera de la célula que dentro. No se observa gasto de ATP. ¿Cómo esperarías que se mueva?',
choices: [
{ text: '🚪 Difusión simple hacia el interior', correct: true, feedback: 'Correcto. Una molécula pequeña y no polar puede atravesar la bicapa lipídica siguiendo su gradiente de concentración sin ATP.' },
{ text: '🔋 Transporte activo hacia el interior', correct: false, feedback: 'El transporte activo requiere energía y normalmente se utiliza para mover sustancias contra su gradiente.' },
{ text: '📦 Exocitosis', correct: false, feedback: 'La exocitosis utiliza vesículas para sacar materiales de la célula; no describe este caso.' }
]
}
];
let activeMission = null;
let activeMissionAnswered = false;
function renderMissions() {
const grid = document.getElementById('mission-grid');
const pill = document.getElementById('mission-progress-pill');
if (!grid) return;
const completed = productState.missionsCompleted || [];
if (pill) pill.textContent = `${completed.length}/${missions.length} completadas`;
grid.innerHTML = missions.map(m => {
const done = completed.includes(m.id);
return `<article class="mission-card ${done ? 'completed' : ''}">
<div class="mission-icon">${m.icon}</div>
<h3>${m.title}</h3>
<p>${m.summary}</p>
<div class="mission-meta"><span>🧪 ${m.difficulty}</span><span>⚡ +${m.xp} XP</span></div>
<button class="mission-open" onclick="openMission('${m.id}')">${done ? '↻ Repetir misión' : 'Iniciar misión →'}</button>
</article>`;
}).join('');
}
function openMission(id) {
const mission = missions.find(m => m.id === id);
if (!mission) return;
activeMission = mission;
activeMissionAnswered = false;
document.getElementById('mission-grid').hidden = true;
document.querySelector('.missions-hero').hidden = true;
const workspace = document.getElementById('mission-workspace');
workspace.hidden = false;
const content = document.getElementById('mission-content');
content.innerHTML = `<div class="mission-case">
<div class="mission-case-header"><span class="eyebrow">🧪 MISIÓN CIENTÍFICA · ${mission.difficulty.toUpperCase()}</span><h2>${mission.icon} ${mission.title}</h2><p>Resuelve el caso con evidencia biológica.</p></div>
<div class="mission-scenario"><h3>🔬 Caso</h3><p>${mission.scenario}</p></div>
<div class="mission-decision"><h3>🧠 Toma una decisión</h3><div class="mission-choices">${mission.choices.map((c,i)=>`<button class="mission-choice" onclick="answerMission(${i})">${c.text}</button>`).join('')}</div><div class="mission-feedback" id="mission-feedback" hidden></div></div>
</div>`;
productState.missionAttempts[id] = (productState.missionAttempts[id] || 0) + 1;
saveProductState();
trackEvent('mission_started', { mission: id });
}
function answerMission(index) {
if (!activeMission || activeMissionAnswered) return;
const choice = activeMission.choices[index];
const buttons = document.querySelectorAll('.mission-choice');
buttons.forEach((b,i) => { b.disabled = true; if (i === index) b.classList.add(choice.correct ? 'correct' : 'incorrect'); if (activeMission.choices[i].correct) b.classList.add('correct'); });
const feedback = document.getElementById('mission-feedback');
feedback.hidden = false;
feedback.innerHTML = `${choice.correct ? '✅' : '🧭'} <strong>${choice.correct ? 'Decisión correcta.' : 'Todavía no.'}</strong> ${choice.feedback}`;
if (choice.correct) {
activeMissionAnswered = true;
const already = (productState.missionsCompleted || []).includes(activeMission.id);
if (!already) {
productState.missionsCompleted.push(activeMission.id);
awardXP(activeMission.xp, `mission_${activeMission.id}`);
} else {
awardXP(10, 'mission_replay');
}
trackEvent('mission_completed', { mission: activeMission.id });
setTimeout(() => renderMissions(), 0);
feedback.innerHTML += `<div style="margin-top:12px;font-weight:800;color:var(--primary-dark)">🏆 +${already ? 10 : activeMission.xp} XP · Misión completada</div>`;
} else {
trackEvent('mission_wrong_choice', { mission: activeMission.id });
buttons.forEach(b => b.disabled = false);
}
}
function closeMission() {
activeMission = null;
document.getElementById('mission-workspace').hidden = true;
document.getElementById('mission-grid').hidden = false;
document.querySelector('.missions-hero').hidden = false;
renderMissions();
}
// ============================================
// MODE SWITCHING
// ============================================
function setMode(mode) {
currentMode = mode;
// Update tab buttons
document.querySelectorAll('.tab-btn').forEach(btn => {
btn.classList.toggle('active', btn.dataset.tab === mode);
});
// Update sections
document.querySelectorAll('.mode-section').forEach(section => {
section.classList.toggle('active', section.id === 'mode-' + mode);
});
// Mode-specific init
if (mode === 'quiz') {
renderQuizQuestion();
}
if (mode === 'missions') {
renderMissions();
}
}
// ============================================
// EXPLORER MODE
// ============================================
function showInfo(key) {
const data = organelleData[key];
if (!data) return;
const wasNew = !exploredOrganelles.has(key);
exploredOrganelles.add(key);
productState.explored = [...exploredOrganelles];
if (wasNew) awardXP(5, 'explore_organelle'); else saveProductState();
updateProgress();
const panel = document.getElementById('info-panel');
panel.style.borderLeftColor = data.color;
let sectionsHtml = data.sections.map(s => `
<div class="info-section">
<h4><span>${s.icon}</span> ${s.title}</h4>
<p>${addTooltips(s.content)}</p>
</div>
`).join('');
panel.innerHTML = `
<div class="organelle-info">
<h3 class="info-title" style="color:${data.color}">${data.title}</h3>
${sectionsHtml}
<div class="info-fact">
<p>💡 <strong>Dato clave:</strong> ${data.sections[2].content.replace(/<[^>]*>/g, '')}</p>
</div>
<div class="memory-card">
<strong>🎴 Tarjeta de memoria:</strong>
<p>${data.memory}</p>
</div>
</div>
`;
}
function setCellType(type) {
cellType = type;
// Update buttons
document.querySelectorAll('.type-btn').forEach(btn => {
btn.classList.toggle('active', btn.textContent.includes(type === 'animal' ? 'Animal' : 'Vegetal'));
});
// Toggle plant-only elements
const plantElements = ['cell-wall', 'central-vacuole', 'chloroplast1', 'chloroplast2'];
plantElements.forEach(id => {
const el = document.getElementById(id);
if (el) el.style.display = type === 'plant' ? 'block' : 'none';
});
// Update badge
const badge = document.querySelector('.cell-badge');
if (badge) {
badge.innerHTML = `
<span class="badge-icon">${type === 'animal' ? '🐾' : '🌿'}</span>
<span class="badge-text">Célula Eucariota ${type === 'animal' ? 'Animal' : 'Vegetal'}</span>
`;
}
}
function updateProgress() {
const total = Object.keys(organelleData).length;
const explored = exploredOrganelles.size;
const percent = Math.round((explored / total) * 100);
document.getElementById('progress-fill').style.width = percent + '%';
document.getElementById('progress-text').textContent = percent + '% Explorado';
}
// ============================================
// QUIZ MODE
// ============================================
function initQuiz() {
// Shuffle all questions
quizState.shuffledQuestions = [...quizQuestions].sort(() => Math.random() - 0.5);
quizState.filteredQuestions = [...quizState.shuffledQuestions];
quizState.currentIndex = 0;
quizState.score = 0;
quizState.streak = 0;
quizState.correct = 0;
}
function filterQuiz(category) {
quizState.filter = category;