@jjlmoya/utils-cooking 1.31.0 → 1.33.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 (51) hide show
  1. package/package.json +2 -2
  2. package/src/category/index.ts +2 -0
  3. package/src/entries.ts +3 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/i18n-titles.test.ts +1 -1
  6. package/src/tests/locale_completeness.test.ts +2 -2
  7. package/src/tests/tool_validation.test.ts +2 -2
  8. package/src/tool/meat-binder-transglutaminase-calculator/bibliography.astro +6 -0
  9. package/src/tool/meat-binder-transglutaminase-calculator/bibliography.ts +14 -0
  10. package/src/tool/meat-binder-transglutaminase-calculator/component.astro +249 -0
  11. package/src/tool/meat-binder-transglutaminase-calculator/components/LabReport.astro +59 -0
  12. package/src/tool/meat-binder-transglutaminase-calculator/components/TissueSpecimen.astro +67 -0
  13. package/src/tool/meat-binder-transglutaminase-calculator/components/TissueViewer.astro +137 -0
  14. package/src/tool/meat-binder-transglutaminase-calculator/entry.ts +26 -0
  15. package/src/tool/meat-binder-transglutaminase-calculator/i18n/de.ts +178 -0
  16. package/src/tool/meat-binder-transglutaminase-calculator/i18n/en.ts +178 -0
  17. package/src/tool/meat-binder-transglutaminase-calculator/i18n/es.ts +178 -0
  18. package/src/tool/meat-binder-transglutaminase-calculator/i18n/fr.ts +178 -0
  19. package/src/tool/meat-binder-transglutaminase-calculator/i18n/id.ts +178 -0
  20. package/src/tool/meat-binder-transglutaminase-calculator/i18n/it.ts +178 -0
  21. package/src/tool/meat-binder-transglutaminase-calculator/i18n/ja.ts +178 -0
  22. package/src/tool/meat-binder-transglutaminase-calculator/i18n/ko.ts +178 -0
  23. package/src/tool/meat-binder-transglutaminase-calculator/i18n/nl.ts +178 -0
  24. package/src/tool/meat-binder-transglutaminase-calculator/i18n/pl.ts +178 -0
  25. package/src/tool/meat-binder-transglutaminase-calculator/i18n/pt.ts +178 -0
  26. package/src/tool/meat-binder-transglutaminase-calculator/i18n/ru.ts +178 -0
  27. package/src/tool/meat-binder-transglutaminase-calculator/i18n/sv.ts +178 -0
  28. package/src/tool/meat-binder-transglutaminase-calculator/i18n/tr.ts +178 -0
  29. package/src/tool/meat-binder-transglutaminase-calculator/i18n/zh.ts +178 -0
  30. package/src/tool/meat-binder-transglutaminase-calculator/index.ts +11 -0
  31. package/src/tool/meat-binder-transglutaminase-calculator/logic.ts +66 -0
  32. package/src/tool/meat-binder-transglutaminase-calculator/meat-binder-transglutaminase-calculator.css +785 -0
  33. package/src/tool/meat-binder-transglutaminase-calculator/seo.astro +15 -0
  34. package/src/tool/spherification-bath-calculator/component.astro +2 -2
  35. package/src/tool/spherification-bath-calculator/components/RecipeSummary.astro +2 -2
  36. package/src/tool/spherification-bath-calculator/i18n/de.ts +3 -0
  37. package/src/tool/spherification-bath-calculator/i18n/en.ts +3 -0
  38. package/src/tool/spherification-bath-calculator/i18n/es.ts +3 -0
  39. package/src/tool/spherification-bath-calculator/i18n/fr.ts +3 -0
  40. package/src/tool/spherification-bath-calculator/i18n/id.ts +3 -0
  41. package/src/tool/spherification-bath-calculator/i18n/it.ts +3 -0
  42. package/src/tool/spherification-bath-calculator/i18n/ja.ts +3 -0
  43. package/src/tool/spherification-bath-calculator/i18n/ko.ts +3 -0
  44. package/src/tool/spherification-bath-calculator/i18n/nl.ts +3 -0
  45. package/src/tool/spherification-bath-calculator/i18n/pl.ts +3 -0
  46. package/src/tool/spherification-bath-calculator/i18n/pt.ts +3 -0
  47. package/src/tool/spherification-bath-calculator/i18n/ru.ts +3 -0
  48. package/src/tool/spherification-bath-calculator/i18n/sv.ts +3 -0
  49. package/src/tool/spherification-bath-calculator/i18n/tr.ts +3 -0
  50. package/src/tool/spherification-bath-calculator/i18n/zh.ts +3 -0
  51. package/src/tools.ts +2 -0
@@ -0,0 +1,785 @@
1
+ .tg {
2
+ --tg-paper: #f5f0eb;
3
+ --tg-paper-dark: #0c0c0e;
4
+ --tg-surface: #fff;
5
+ --tg-surface-dark: #151518;
6
+ --tg-card: #faf8f5;
7
+ --tg-card-dark: #1a1a20;
8
+ --tg-border: #e5ddd4;
9
+ --tg-border-dark: #2a2a35;
10
+ --tg-ink: #292524;
11
+ --tg-ink-dark: #e4e4e7;
12
+ --tg-ink-muted: #8a8078;
13
+ --tg-ink-muted-dark: #6b7280;
14
+ --tg-ink-faint: #c5bdb4;
15
+ --tg-ink-faint-dark: #3f3f4a;
16
+ --tg-accent-rust: #b91c1c;
17
+ --tg-accent-rust-dark: #ef4444;
18
+ --tg-accent-teal: #0d9488;
19
+ --tg-accent-teal-dark: #2dd4bf;
20
+ --tg-accent-bond: #059669;
21
+ --tg-accent-bond-dark: #22c55e;
22
+ --tg-accent-bond-glow: rgba(5, 150, 105, 0.15);
23
+ --tg-accent-bond-glow-dark: rgba(34, 197, 94, 0.2);
24
+ --tg-accent-warn: #dc2626;
25
+ --tg-accent-warn-dark: #f87171;
26
+ --tg-grid: #e5ddd4;
27
+ --tg-grid-dark: #1f1f28;
28
+ --tg-shape-a: #dc2626;
29
+ --tg-shape-a-dark: #ef4444;
30
+ --tg-shape-b: #b91c1c;
31
+ --tg-shape-b-dark: #dc2626;
32
+ --tg-fiber: #fca5a5;
33
+ --tg-fiber-dark: #7f1d1d;
34
+ --tg-denatured: #9ca3af;
35
+ --tg-shadow: rgba(0, 0, 0, 0.04);
36
+ --tg-shadow-dark: rgba(0, 0, 0, 0.4);
37
+ --tg-white: #fff;
38
+
39
+ display: flex;
40
+ flex-direction: column;
41
+ align-items: center;
42
+ width: 100%;
43
+ box-sizing: border-box;
44
+
45
+ }
46
+
47
+ .tg-bench {
48
+ position: relative;
49
+ width: 100%;
50
+ max-width: 1240px;
51
+ background: var(--tg-paper);
52
+ border: 1px solid var(--tg-border);
53
+ border-radius: 4px;
54
+ padding: 2px;
55
+ box-shadow: 0 4px 24px var(--tg-shadow);
56
+ }
57
+
58
+ .theme-dark .tg-bench {
59
+ background: var(--tg-paper-dark);
60
+ border-color: var(--tg-border-dark);
61
+ box-shadow: 0 4px 24px var(--tg-shadow-dark);
62
+ }
63
+
64
+ .tg-bench-inner {
65
+ position: relative;
66
+ background: var(--tg-surface);
67
+ border: 1px solid var(--tg-border);
68
+ border-radius: 2px;
69
+ padding: 2.5rem 2rem;
70
+ }
71
+
72
+ .theme-dark .tg-bench-inner {
73
+ background: var(--tg-surface-dark);
74
+ border-color: var(--tg-border-dark);
75
+ }
76
+
77
+ .tg-grid {
78
+ position: absolute;
79
+ inset: 0;
80
+ background-image:
81
+ linear-gradient(var(--tg-grid) 1px, transparent 1px),
82
+ linear-gradient(90deg, var(--tg-grid) 1px, transparent 1px);
83
+ background-size: 32px 32px;
84
+ opacity: 0.3;
85
+ pointer-events: none;
86
+ }
87
+
88
+ .theme-dark .tg-grid {
89
+ background-image:
90
+ linear-gradient(var(--tg-grid-dark) 1px, transparent 1px),
91
+ linear-gradient(90deg, var(--tg-grid-dark) 1px, transparent 1px);
92
+ }
93
+
94
+ .tg-header {
95
+ position: relative;
96
+ z-index: 2;
97
+ margin-bottom: 2rem;
98
+ padding-bottom: 0.75rem;
99
+ border-bottom: 2px solid var(--tg-accent-rust);
100
+ }
101
+
102
+ .theme-dark .tg-header {
103
+ border-bottom-color: var(--tg-accent-rust-dark);
104
+ }
105
+
106
+ .tg-header-title {
107
+ font-size: 0.8rem;
108
+ font-weight: 700;
109
+ color: var(--tg-ink);
110
+ letter-spacing: 0.04em;
111
+ margin: 0;
112
+ }
113
+
114
+ .theme-dark .tg-header-title {
115
+ color: var(--tg-ink-dark);
116
+ }
117
+
118
+ .tg-header-sub {
119
+ font-size: 0.6rem;
120
+ color: var(--tg-ink-muted);
121
+ letter-spacing: 0.08em;
122
+ text-transform: uppercase;
123
+ margin: 0.15rem 0 0;
124
+ }
125
+
126
+ .theme-dark .tg-header-sub {
127
+ color: var(--tg-ink-muted-dark);
128
+ }
129
+
130
+ .tg-layout {
131
+ position: relative;
132
+ z-index: 2;
133
+ display: grid;
134
+ grid-template-columns: 280px 1fr 240px;
135
+ gap: 1.5rem;
136
+ }
137
+
138
+ @media (max-width: 1024px) {
139
+ .tg-layout {
140
+ grid-template-columns: 1fr;
141
+ gap: 1.25rem;
142
+ }
143
+ }
144
+
145
+ /* ===== SPECIMEN SHEET (Controls) ===== */
146
+ .tg-specimen {
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: 1px;
150
+ background: var(--tg-border);
151
+ border: 1px solid var(--tg-border);
152
+ }
153
+
154
+ .theme-dark .tg-specimen {
155
+ background: var(--tg-border-dark);
156
+ border-color: var(--tg-border-dark);
157
+ }
158
+
159
+ .tg-specimen-header {
160
+ background: var(--tg-card);
161
+ padding: 0.6rem 0.85rem;
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 0.5rem;
165
+ }
166
+
167
+ .theme-dark .tg-specimen-header {
168
+ background: var(--tg-card-dark);
169
+ }
170
+
171
+ .tg-specimen-dot {
172
+ width: 6px;
173
+ height: 6px;
174
+ border-radius: 50%;
175
+ background: var(--tg-accent-rust);
176
+ flex-shrink: 0;
177
+ }
178
+
179
+ .theme-dark .tg-specimen-dot {
180
+ background: var(--tg-accent-rust-dark);
181
+ }
182
+
183
+ .tg-specimen-label {
184
+ font-size: 0.55rem;
185
+ font-weight: 700;
186
+ color: var(--tg-ink-muted);
187
+ text-transform: uppercase;
188
+ letter-spacing: 0.1em;
189
+ }
190
+
191
+ .theme-dark .tg-specimen-label {
192
+ color: var(--tg-ink-muted-dark);
193
+ }
194
+
195
+ .tg-specimen-body {
196
+ background: var(--tg-card);
197
+ padding: 0.85rem;
198
+ display: flex;
199
+ flex-direction: column;
200
+ gap: 0.85rem;
201
+ }
202
+
203
+ .theme-dark .tg-specimen-body {
204
+ background: var(--tg-card-dark);
205
+ }
206
+
207
+ .tg-field {
208
+ display: flex;
209
+ flex-direction: column;
210
+ gap: 0.2rem;
211
+ }
212
+
213
+ .tg-field-label {
214
+ font-size: 0.55rem;
215
+ font-weight: 600;
216
+ color: var(--tg-ink-muted);
217
+ text-transform: uppercase;
218
+ letter-spacing: 0.06em;
219
+ }
220
+
221
+ .theme-dark .tg-field-label {
222
+ color: var(--tg-ink-muted-dark);
223
+ }
224
+
225
+ .tg-toggle-group {
226
+ display: grid;
227
+ grid-template-columns: 1fr 1fr;
228
+ gap: 2px;
229
+ background: var(--tg-border);
230
+ padding: 2px;
231
+ }
232
+
233
+ .theme-dark .tg-toggle-group {
234
+ background: var(--tg-border-dark);
235
+ }
236
+
237
+ .tg-toggle {
238
+ background: var(--tg-card);
239
+ border: none;
240
+ color: var(--tg-ink-muted);
241
+ padding: 0.4rem 0.3rem;
242
+ font-size: 0.6rem;
243
+ font-weight: 600;
244
+ cursor: pointer;
245
+ transition: all 0.15s;
246
+ text-align: center;
247
+ letter-spacing: 0.02em;
248
+ }
249
+
250
+ .theme-dark .tg-toggle {
251
+ background: var(--tg-card-dark);
252
+ color: var(--tg-ink-muted-dark);
253
+ }
254
+
255
+ .tg-toggle:hover {
256
+ background: var(--tg-accent-bond-glow);
257
+ }
258
+
259
+ .theme-dark .tg-toggle:hover {
260
+ background: var(--tg-accent-bond-glow-dark);
261
+ }
262
+
263
+ .tg-toggle.active {
264
+ background: var(--tg-accent-rust);
265
+ color: var(--tg-white, #fff);
266
+ box-shadow: inset 0 1px 2px rgba(0,0,0,0.15);
267
+ }
268
+
269
+ .theme-dark .tg-toggle.active {
270
+ background: var(--tg-accent-rust-dark);
271
+ }
272
+
273
+ .tg-input {
274
+ background: var(--tg-surface);
275
+ border: 1px solid var(--tg-border);
276
+ border-radius: 2px;
277
+ color: var(--tg-ink);
278
+ padding: 0.45rem 0.6rem;
279
+ font-size: 0.75rem;
280
+ width: 100%;
281
+ box-sizing: border-box;
282
+ outline: none;
283
+ transition: border-color 0.15s;
284
+ }
285
+
286
+ .theme-dark .tg-input {
287
+ background: var(--tg-surface-dark);
288
+ border-color: var(--tg-border-dark);
289
+ color: var(--tg-ink-dark);
290
+ }
291
+
292
+ .tg-input:focus {
293
+ border-color: var(--tg-accent-teal);
294
+ box-shadow: 0 0 0 1px var(--tg-accent-teal);
295
+ }
296
+
297
+ .theme-dark .tg-input:focus {
298
+ border-color: var(--tg-accent-teal-dark);
299
+ box-shadow: 0 0 0 1px var(--tg-accent-teal-dark);
300
+ }
301
+
302
+ .tg-select {
303
+ background: var(--tg-surface);
304
+ border: 1px solid var(--tg-border);
305
+ border-radius: 2px;
306
+ color: var(--tg-ink);
307
+ padding: 0.45rem 0.6rem;
308
+ font-size: 0.65rem;
309
+ width: 100%;
310
+ box-sizing: border-box;
311
+ outline: none;
312
+ cursor: pointer;
313
+ appearance: none;
314
+ -webkit-appearance: none;
315
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='4'%3E%3Cpath d='M1 1l3 3 3-3' fill='none' stroke='%238a8078' stroke-width='1.2'/%3E%3C/svg%3E");
316
+ background-repeat: no-repeat;
317
+ background-position: right 8px center;
318
+ }
319
+
320
+ .theme-dark .tg-select {
321
+ background: var(--tg-surface-dark);
322
+ border-color: var(--tg-border-dark);
323
+ color: var(--tg-ink-dark);
324
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='4'%3E%3Cpath d='M1 1l3 3 3-3' fill='none' stroke='%236b7280' stroke-width='1.2'/%3E%3C/svg%3E");
325
+ }
326
+
327
+ .tg-select:focus {
328
+ border-color: var(--tg-accent-teal);
329
+ box-shadow: 0 0 0 1px var(--tg-accent-teal);
330
+ }
331
+
332
+ .theme-dark .tg-select:focus {
333
+ border-color: var(--tg-accent-teal-dark);
334
+ box-shadow: 0 0 0 1px var(--tg-accent-teal-dark);
335
+ }
336
+
337
+ /* ===== TISSUE VISUALIZER ===== */
338
+ .tg-visualizer {
339
+ display: flex;
340
+ flex-direction: column;
341
+ background: var(--tg-card);
342
+ border: 1px solid var(--tg-border);
343
+ }
344
+
345
+ .theme-dark .tg-visualizer {
346
+ background: var(--tg-card-dark);
347
+ border-color: var(--tg-border-dark);
348
+ }
349
+
350
+ .tg-visualizer-header {
351
+ padding: 0.6rem 0.85rem;
352
+ border-bottom: 1px solid var(--tg-border);
353
+ display: flex;
354
+ justify-content: space-between;
355
+ align-items: center;
356
+ }
357
+
358
+ .theme-dark .tg-visualizer-header {
359
+ border-bottom-color: var(--tg-border-dark);
360
+ }
361
+
362
+ .tg-visualizer-label {
363
+ font-size: 0.55rem;
364
+ font-weight: 700;
365
+ color: var(--tg-ink-muted);
366
+ text-transform: uppercase;
367
+ letter-spacing: 0.1em;
368
+ }
369
+
370
+ .theme-dark .tg-visualizer-label {
371
+ color: var(--tg-ink-muted-dark);
372
+ }
373
+
374
+ .tg-visualizer-status {
375
+ font-size: 0.5rem;
376
+ color: var(--tg-ink-faint);
377
+ text-transform: uppercase;
378
+ letter-spacing: 0.08em;
379
+ }
380
+
381
+ .theme-dark .tg-visualizer-status {
382
+ color: var(--tg-ink-faint-dark);
383
+ }
384
+
385
+ .tg-visualizer-body {
386
+ padding: 1rem;
387
+ display: flex;
388
+ align-items: stretch;
389
+ justify-content: center;
390
+ flex: 1;
391
+ min-height: 280px;
392
+ gap: 0.75rem;
393
+ }
394
+
395
+ .tg-visualizer-svg {
396
+ flex: 1;
397
+ max-width: 480px;
398
+ height: auto;
399
+ min-height: 240px;
400
+ }
401
+
402
+ /* ===== Temperature Bar (HTML) ===== */
403
+ .tg-temp-bar {
404
+ display: flex;
405
+ flex-direction: column;
406
+ align-items: center;
407
+ gap: 0.3rem;
408
+ flex-shrink: 0;
409
+ width: 40px;
410
+ padding: 0.25rem 0;
411
+ }
412
+
413
+ .tg-temp-bar-label {
414
+ font-size: 0.5rem;
415
+ font-weight: 700;
416
+ color: var(--tg-ink-muted);
417
+ letter-spacing: 0.1em;
418
+ }
419
+
420
+ .theme-dark .tg-temp-bar-label {
421
+ color: var(--tg-ink-muted-dark);
422
+ }
423
+
424
+ .tg-temp-bar-track {
425
+ position: relative;
426
+ width: 8px;
427
+ flex: 1;
428
+ min-height: 180px;
429
+ background: var(--tg-border);
430
+ border-radius: 4px;
431
+ overflow: hidden;
432
+ }
433
+
434
+ .theme-dark .tg-temp-bar-track {
435
+ background: var(--tg-border-dark);
436
+ }
437
+
438
+ .tg-temp-bar-fill {
439
+ position: absolute;
440
+ left: 0;
441
+ right: 0;
442
+ border-radius: 4px;
443
+ background: var(--tg-accent-teal);
444
+ transition: height 0.3s, background 0.3s, bottom 0.3s;
445
+ }
446
+
447
+ .theme-dark .tg-temp-bar-fill {
448
+ background: var(--tg-accent-teal-dark);
449
+ }
450
+
451
+ .tg-temp-bar-fill.warm { background: #f59e0b; }
452
+ .tg-temp-bar-fill.hot { background: var(--tg-accent-warn); }
453
+ .theme-dark .tg-temp-bar-fill.warm { background: #fbbf24; }
454
+ .theme-dark .tg-temp-bar-fill.hot { background: var(--tg-accent-warn-dark); }
455
+
456
+ .tg-temp-bar-tick {
457
+ position: absolute;
458
+ left: 12px;
459
+ transform: translateY(50%);
460
+ pointer-events: none;
461
+ }
462
+
463
+ .tg-temp-bar-tick span {
464
+ font-size: 0.5rem;
465
+ color: var(--tg-ink-faint);
466
+ white-space: nowrap;
467
+
468
+ }
469
+
470
+ .theme-dark .tg-temp-bar-tick span {
471
+ color: var(--tg-ink-faint-dark);
472
+ }
473
+
474
+ .tg-temp-bar-value {
475
+ font-size: 0.65rem;
476
+ font-weight: 700;
477
+ color: var(--tg-ink);
478
+ text-align: center;
479
+
480
+ }
481
+
482
+ .theme-dark .tg-temp-bar-value {
483
+ color: var(--tg-ink-dark);
484
+ }
485
+ .tg-report {
486
+ display: flex;
487
+ flex-direction: column;
488
+ gap: 1px;
489
+ background: var(--tg-border);
490
+ border: 1px solid var(--tg-border);
491
+ }
492
+
493
+ .theme-dark .tg-report {
494
+ background: var(--tg-border-dark);
495
+ border-color: var(--tg-border-dark);
496
+ }
497
+
498
+ .tg-report-header {
499
+ background: var(--tg-card);
500
+ padding: 0.6rem 0.85rem;
501
+ display: flex;
502
+ align-items: center;
503
+ gap: 0.5rem;
504
+ }
505
+
506
+ .theme-dark .tg-report-header {
507
+ background: var(--tg-card-dark);
508
+ }
509
+
510
+ .tg-report-dot {
511
+ width: 6px;
512
+ height: 6px;
513
+ border-radius: 50%;
514
+ background: var(--tg-accent-teal);
515
+ flex-shrink: 0;
516
+ }
517
+
518
+ .theme-dark .tg-report-dot {
519
+ background: var(--tg-accent-teal-dark);
520
+ }
521
+
522
+ .tg-report-label {
523
+ font-size: 0.55rem;
524
+ font-weight: 700;
525
+ color: var(--tg-ink-muted);
526
+ text-transform: uppercase;
527
+ letter-spacing: 0.1em;
528
+ }
529
+
530
+ .theme-dark .tg-report-label {
531
+ color: var(--tg-ink-muted-dark);
532
+ }
533
+
534
+ .tg-report-body {
535
+ background: var(--tg-card);
536
+ padding: 0.85rem;
537
+ display: flex;
538
+ flex-direction: column;
539
+ gap: 0.6rem;
540
+ }
541
+
542
+ .theme-dark .tg-report-body {
543
+ background: var(--tg-card-dark);
544
+ }
545
+
546
+ .tg-measurement {
547
+ display: flex;
548
+ justify-content: space-between;
549
+ align-items: baseline;
550
+ padding: 0.3rem 0;
551
+ border-bottom: 1px dotted var(--tg-border);
552
+ }
553
+
554
+ .theme-dark .tg-measurement {
555
+ border-bottom-color: var(--tg-border-dark);
556
+ }
557
+
558
+ .tg-measurement:last-child {
559
+ border-bottom: none;
560
+ }
561
+
562
+ .tg-measurement-label {
563
+ font-size: 0.55rem;
564
+ color: var(--tg-ink-muted);
565
+ text-transform: uppercase;
566
+ letter-spacing: 0.04em;
567
+ }
568
+
569
+ .theme-dark .tg-measurement-label {
570
+ color: var(--tg-ink-muted-dark);
571
+ }
572
+
573
+ .tg-measurement-value {
574
+ font-size: 0.85rem;
575
+ font-weight: 700;
576
+ color: var(--tg-ink);
577
+ font-variant-numeric: tabular-nums;
578
+ }
579
+
580
+ .theme-dark .tg-measurement-value {
581
+ color: var(--tg-ink-dark);
582
+ }
583
+
584
+ .tg-measurement-value .tg-unit {
585
+ font-size: 0.55rem;
586
+ font-weight: 500;
587
+ color: var(--tg-ink-muted);
588
+ margin-left: 0.15rem;
589
+ }
590
+
591
+ .theme-dark .tg-measurement-value .tg-unit {
592
+ color: var(--tg-ink-muted-dark);
593
+ }
594
+
595
+ .tg-incubation-badge {
596
+ background: var(--tg-accent-bond-glow);
597
+ border: 1px solid var(--tg-accent-bond);
598
+ border-radius: 2px;
599
+ padding: 0.5rem 0.65rem;
600
+ text-align: center;
601
+ margin-top: 0.3rem;
602
+ }
603
+
604
+ .theme-dark .tg-incubation-badge {
605
+ background: var(--tg-accent-bond-glow-dark);
606
+ border-color: var(--tg-accent-bond-dark);
607
+ }
608
+
609
+ .tg-incubation-badge-label {
610
+ font-size: 0.5rem;
611
+ text-transform: uppercase;
612
+ letter-spacing: 0.08em;
613
+ color: var(--tg-accent-bond);
614
+ margin-bottom: 0.1rem;
615
+ }
616
+
617
+ .theme-dark .tg-incubation-badge-label {
618
+ color: var(--tg-accent-bond-dark);
619
+ }
620
+
621
+ .tg-incubation-badge-value {
622
+ font-size: 0.95rem;
623
+ font-weight: 700;
624
+ color: var(--tg-ink);
625
+ }
626
+
627
+ .theme-dark .tg-incubation-badge-value {
628
+ color: var(--tg-ink-dark);
629
+ }
630
+
631
+ .tg-alert {
632
+ background: #fef2f2;
633
+ border: 1px solid var(--tg-accent-warn);
634
+ border-radius: 2px;
635
+ padding: 0.6rem;
636
+ text-align: center;
637
+ }
638
+
639
+ .theme-dark .tg-alert {
640
+ background: rgba(220, 38, 38, 0.08);
641
+ border-color: var(--tg-accent-warn-dark);
642
+ }
643
+
644
+ .tg-alert-text {
645
+ font-size: 0.6rem;
646
+ color: var(--tg-accent-warn);
647
+ line-height: 1.4;
648
+ margin: 0;
649
+ }
650
+
651
+ .theme-dark .tg-alert-text {
652
+ color: var(--tg-accent-warn-dark);
653
+ }
654
+
655
+ /* ===== ANNOTATION (method description) ===== */
656
+ .tg-annotation {
657
+ background: var(--tg-card);
658
+ border: 1px solid var(--tg-border);
659
+ padding: 0.65rem 0.85rem;
660
+ margin-top: 1px;
661
+ }
662
+
663
+ .theme-dark .tg-annotation {
664
+ background: var(--tg-card-dark);
665
+ border-color: var(--tg-border-dark);
666
+ }
667
+
668
+ .tg-annotation-text {
669
+ font-size: 0.6rem;
670
+ color: var(--tg-ink-muted);
671
+ line-height: 1.5;
672
+ margin: 0;
673
+ }
674
+
675
+ .theme-dark .tg-annotation-text {
676
+ color: var(--tg-ink-muted-dark);
677
+ }
678
+
679
+ /* ===== SVG Tissue Styles ===== */
680
+ .tg-tissue-a { fill: var(--tg-tissue-a-current, var(--tg-shape-a)); }
681
+ .tg-tissue-b { fill: var(--tg-tissue-b-current, var(--tg-shape-b)); }
682
+ .theme-dark .tg-tissue-a { fill: var(--tg-tissue-a-current, var(--tg-shape-a-dark)); }
683
+ .theme-dark .tg-tissue-b { fill: var(--tg-tissue-b-current, var(--tg-shape-b-dark)); }
684
+
685
+ .tg-fiber {
686
+ stroke: var(--tg-fiber-current, var(--tg-fiber));
687
+ fill: none;
688
+ }
689
+ .theme-dark .tg-fiber {
690
+ stroke: var(--tg-fiber-current, var(--tg-fiber-dark));
691
+ }
692
+
693
+ .tg-bond-line {
694
+ stroke: var(--tg-accent-bond);
695
+ stroke-width: 1.5;
696
+ fill: none;
697
+ opacity: 0;
698
+ transition: opacity 0.4s;
699
+ }
700
+
701
+ .theme-dark .tg-bond-line {
702
+ stroke: var(--tg-accent-bond-dark);
703
+ }
704
+
705
+ .tg-bond-line.active {
706
+ opacity: 0.7;
707
+ animation: tg-bond-pulse 2s ease-in-out infinite;
708
+ }
709
+
710
+ @keyframes tg-bond-pulse {
711
+ 0%, 100% {
712
+ stroke-dashoffset: 0;
713
+ opacity: 0.4;
714
+ }
715
+ 50% {
716
+ stroke-dashoffset: -8;
717
+ opacity: 0.9;
718
+ }
719
+ }
720
+
721
+ .tg-bond-node {
722
+ fill: var(--tg-accent-bond);
723
+ opacity: 0;
724
+ transition: opacity 0.4s;
725
+ }
726
+
727
+ .theme-dark .tg-bond-node {
728
+ fill: var(--tg-accent-bond-dark);
729
+ }
730
+
731
+ .tg-bond-node.active {
732
+ animation: tg-node-glow 1.5s ease-in-out infinite;
733
+ }
734
+
735
+ @keyframes tg-node-glow {
736
+ 0%, 100% {
737
+ opacity: 0.4;
738
+ }
739
+ 50% {
740
+ opacity: 1;
741
+ }
742
+ }
743
+
744
+ .tg-particle {
745
+ fill: var(--tg-accent-bond);
746
+ opacity: 0;
747
+ }
748
+
749
+ .theme-dark .tg-particle {
750
+ fill: var(--tg-accent-bond-dark);
751
+ }
752
+
753
+ .tg-particle.active {
754
+ animation: tg-particle-drift 3s ease-in-out infinite;
755
+ }
756
+
757
+ @keyframes tg-particle-drift {
758
+ 0% {
759
+ opacity: 0;
760
+ transform: translateX(0);
761
+ }
762
+ 10% {
763
+ opacity: 0.8;
764
+ }
765
+ 50% {
766
+ opacity: 1;
767
+ }
768
+ 90% {
769
+ opacity: 0.8;
770
+ }
771
+ 100% {
772
+ opacity: 0;
773
+ transform: translateX(60px);
774
+ }
775
+ }
776
+
777
+ .tg-denatured-overlay {
778
+ fill: var(--tg-denatured);
779
+ opacity: 0;
780
+ transition: opacity 0.5s;
781
+ }
782
+
783
+ .tg-denatured-overlay.active {
784
+ opacity: 0.6;
785
+ }