@jjlmoya/utils-cooking 1.35.0 → 1.37.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 (80) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +6 -0
  3. package/src/entries.ts +7 -1
  4. package/src/index.ts +3 -0
  5. package/src/tests/brix-sorbet-density-calculator.test.ts +53 -0
  6. package/src/tests/i18n-titles.test.ts +2 -2
  7. package/src/tests/locale_completeness.test.ts +2 -2
  8. package/src/tests/tool_validation.test.ts +2 -2
  9. package/src/tool/brix-sorbet-density-calculator/bibliography.astro +6 -0
  10. package/src/tool/brix-sorbet-density-calculator/bibliography.ts +10 -0
  11. package/src/tool/brix-sorbet-density-calculator/brix-sorbet-density-calculator.css +878 -0
  12. package/src/tool/brix-sorbet-density-calculator/component.astro +220 -0
  13. package/src/tool/brix-sorbet-density-calculator/entry.ts +26 -0
  14. package/src/tool/brix-sorbet-density-calculator/helpers.ts +102 -0
  15. package/src/tool/brix-sorbet-density-calculator/i18n/de.ts +295 -0
  16. package/src/tool/brix-sorbet-density-calculator/i18n/en.ts +295 -0
  17. package/src/tool/brix-sorbet-density-calculator/i18n/es.ts +295 -0
  18. package/src/tool/brix-sorbet-density-calculator/i18n/fr.ts +295 -0
  19. package/src/tool/brix-sorbet-density-calculator/i18n/id.ts +295 -0
  20. package/src/tool/brix-sorbet-density-calculator/i18n/it.ts +295 -0
  21. package/src/tool/brix-sorbet-density-calculator/i18n/ja.ts +295 -0
  22. package/src/tool/brix-sorbet-density-calculator/i18n/ko.ts +295 -0
  23. package/src/tool/brix-sorbet-density-calculator/i18n/nl.ts +295 -0
  24. package/src/tool/brix-sorbet-density-calculator/i18n/pl.ts +295 -0
  25. package/src/tool/brix-sorbet-density-calculator/i18n/pt.ts +295 -0
  26. package/src/tool/brix-sorbet-density-calculator/i18n/ru.ts +295 -0
  27. package/src/tool/brix-sorbet-density-calculator/i18n/sv.ts +295 -0
  28. package/src/tool/brix-sorbet-density-calculator/i18n/tr.ts +295 -0
  29. package/src/tool/brix-sorbet-density-calculator/i18n/zh.ts +295 -0
  30. package/src/tool/brix-sorbet-density-calculator/index.ts +11 -0
  31. package/src/tool/brix-sorbet-density-calculator/logic.ts +180 -0
  32. package/src/tool/brix-sorbet-density-calculator/script.ts +114 -0
  33. package/src/tool/brix-sorbet-density-calculator/seo.astro +15 -0
  34. package/src/tool/macaron-drying-predictor/bibliography.astro +6 -0
  35. package/src/tool/macaron-drying-predictor/bibliography.ts +14 -0
  36. package/src/tool/macaron-drying-predictor/component.astro +319 -0
  37. package/src/tool/macaron-drying-predictor/entry.ts +26 -0
  38. package/src/tool/macaron-drying-predictor/i18n/de.ts +245 -0
  39. package/src/tool/macaron-drying-predictor/i18n/en.ts +247 -0
  40. package/src/tool/macaron-drying-predictor/i18n/es.ts +245 -0
  41. package/src/tool/macaron-drying-predictor/i18n/fr.ts +245 -0
  42. package/src/tool/macaron-drying-predictor/i18n/id.ts +245 -0
  43. package/src/tool/macaron-drying-predictor/i18n/it.ts +245 -0
  44. package/src/tool/macaron-drying-predictor/i18n/ja.ts +245 -0
  45. package/src/tool/macaron-drying-predictor/i18n/ko.ts +245 -0
  46. package/src/tool/macaron-drying-predictor/i18n/nl.ts +245 -0
  47. package/src/tool/macaron-drying-predictor/i18n/pl.ts +245 -0
  48. package/src/tool/macaron-drying-predictor/i18n/pt.ts +245 -0
  49. package/src/tool/macaron-drying-predictor/i18n/ru.ts +245 -0
  50. package/src/tool/macaron-drying-predictor/i18n/sv.ts +245 -0
  51. package/src/tool/macaron-drying-predictor/i18n/tr.ts +245 -0
  52. package/src/tool/macaron-drying-predictor/i18n/zh.ts +245 -0
  53. package/src/tool/macaron-drying-predictor/index.ts +11 -0
  54. package/src/tool/macaron-drying-predictor/logic.ts +58 -0
  55. package/src/tool/macaron-drying-predictor/macaron-drying-predictor.css +551 -0
  56. package/src/tool/macaron-drying-predictor/seo.astro +15 -0
  57. package/src/tool/oil-smoke-point-tracker/bibliography.astro +6 -0
  58. package/src/tool/oil-smoke-point-tracker/bibliography.ts +10 -0
  59. package/src/tool/oil-smoke-point-tracker/component.astro +445 -0
  60. package/src/tool/oil-smoke-point-tracker/entry.ts +26 -0
  61. package/src/tool/oil-smoke-point-tracker/i18n/de.ts +285 -0
  62. package/src/tool/oil-smoke-point-tracker/i18n/en.ts +285 -0
  63. package/src/tool/oil-smoke-point-tracker/i18n/es.ts +285 -0
  64. package/src/tool/oil-smoke-point-tracker/i18n/fr.ts +285 -0
  65. package/src/tool/oil-smoke-point-tracker/i18n/id.ts +244 -0
  66. package/src/tool/oil-smoke-point-tracker/i18n/it.ts +244 -0
  67. package/src/tool/oil-smoke-point-tracker/i18n/ja.ts +244 -0
  68. package/src/tool/oil-smoke-point-tracker/i18n/ko.ts +244 -0
  69. package/src/tool/oil-smoke-point-tracker/i18n/nl.ts +244 -0
  70. package/src/tool/oil-smoke-point-tracker/i18n/pl.ts +244 -0
  71. package/src/tool/oil-smoke-point-tracker/i18n/pt.ts +244 -0
  72. package/src/tool/oil-smoke-point-tracker/i18n/ru.ts +244 -0
  73. package/src/tool/oil-smoke-point-tracker/i18n/sv.ts +244 -0
  74. package/src/tool/oil-smoke-point-tracker/i18n/tr.ts +244 -0
  75. package/src/tool/oil-smoke-point-tracker/i18n/zh.ts +244 -0
  76. package/src/tool/oil-smoke-point-tracker/index.ts +11 -0
  77. package/src/tool/oil-smoke-point-tracker/logic.ts +70 -0
  78. package/src/tool/oil-smoke-point-tracker/oil-smoke-point-tracker.css +937 -0
  79. package/src/tool/oil-smoke-point-tracker/seo.astro +15 -0
  80. package/src/tools.ts +6 -0
@@ -0,0 +1,937 @@
1
+ .ospt {
2
+ --ospt-gold: #f59e0b;
3
+ --ospt-amber: #d97706;
4
+ --ospt-bronze: #78350f;
5
+ --ospt-bg: #fffbf0;
6
+ --ospt-bg-dark: #0f0b02;
7
+ --ospt-surface: #fff;
8
+ --ospt-surface-dark: #1f1607;
9
+ --ospt-border: #fef3c7;
10
+ --ospt-border-dark: #3d2a0c;
11
+ --ospt-ink: #451a03;
12
+ --ospt-ink-dark: #fef3c7;
13
+ --ospt-muted: #92400e;
14
+ --ospt-muted-dark: #d97706;
15
+ --ospt-red: #ef4444;
16
+ --ospt-green: #10b981;
17
+ --ospt-green-ink: #047857;
18
+ --ospt-green-dark: #34d399;
19
+ --ospt-gold-ink: #b45309;
20
+ --ospt-gold-dark: #fbbf24;
21
+ --ospt-red-ink: #b91c1c;
22
+ --ospt-red-dark: #f87171;
23
+
24
+ width: 100%;
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ .ospt-card {
29
+ position: relative;
30
+ max-width: 900px;
31
+ margin: 0 auto;
32
+ background: var(--ospt-surface);
33
+ border: 1px solid var(--ospt-border);
34
+ border-radius: 2rem;
35
+ overflow: hidden;
36
+ box-shadow: 0 10px 30px rgba(217, 119, 6, 0.05);
37
+ }
38
+
39
+ .theme-dark .ospt-card {
40
+ background: var(--ospt-surface-dark);
41
+ border-color: var(--ospt-border-dark);
42
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
43
+ }
44
+
45
+ .ospt-unit-row {
46
+ position: absolute;
47
+ top: 0.75rem;
48
+ right: 0.75rem;
49
+ display: flex;
50
+ border: 1px solid var(--ospt-border);
51
+ border-radius: 6px;
52
+ overflow: hidden;
53
+ z-index: 2;
54
+ opacity: 0.65;
55
+ transition: opacity 0.2s;
56
+ }
57
+
58
+ .ospt-unit-row:hover {
59
+ opacity: 1;
60
+ }
61
+
62
+ .theme-dark .ospt-unit-row {
63
+ border-color: var(--ospt-border-dark);
64
+ }
65
+
66
+ .ospt-unit-btn {
67
+ font-size: 1rem;
68
+ font-weight: 700;
69
+ padding: 0.3rem 0.5rem;
70
+ border: none;
71
+ cursor: pointer;
72
+ background: transparent;
73
+ color: var(--ospt-muted);
74
+ letter-spacing: 0.04em;
75
+ transition: all 0.2s;
76
+ line-height: 1;
77
+ }
78
+
79
+ .theme-dark .ospt-unit-btn {
80
+ color: var(--ospt-muted-dark);
81
+ }
82
+
83
+ .ospt-unit-btn.active {
84
+ background: var(--ospt-gold);
85
+ color: var(--ospt-surface);
86
+ }
87
+
88
+ .theme-dark .ospt-unit-btn.active {
89
+ background: var(--ospt-gold);
90
+ color: var(--ospt-surface-dark);
91
+ }
92
+
93
+ .ospt-body {
94
+ display: grid;
95
+ grid-template-columns: 1fr;
96
+ gap: 0;
97
+ }
98
+
99
+ @media (min-width: 768px) {
100
+ .ospt-body {
101
+ grid-template-columns: 1.1fr 1fr;
102
+ }
103
+ }
104
+
105
+ .ospt-controls {
106
+ padding: 2rem;
107
+ display: flex;
108
+ flex-direction: column;
109
+ gap: 1.5rem;
110
+ border-bottom: 1px solid var(--ospt-border);
111
+ }
112
+
113
+ @media (min-width: 768px) {
114
+ .ospt-controls {
115
+ border-bottom: none;
116
+ border-right: 1px solid var(--ospt-border);
117
+ }
118
+ .theme-dark .ospt-controls {
119
+ border-right-color: var(--ospt-border-dark);
120
+ }
121
+ }
122
+
123
+ .theme-dark .ospt-controls {
124
+ border-bottom-color: var(--ospt-border-dark);
125
+ }
126
+
127
+ .ospt-input-group {
128
+ display: flex;
129
+ flex-direction: column;
130
+ gap: 0.5rem;
131
+ }
132
+
133
+ .ospt-label {
134
+ font-size: 1.1rem;
135
+ font-weight: 800;
136
+ color: var(--ospt-ink);
137
+ text-transform: uppercase;
138
+ letter-spacing: 0.05em;
139
+ }
140
+
141
+ .theme-dark .ospt-label {
142
+ color: var(--ospt-ink-dark);
143
+ }
144
+
145
+ .ospt-oil-list {
146
+ display: grid;
147
+ grid-template-columns: 1fr 1fr;
148
+ gap: 0.5rem;
149
+ max-height: 200px;
150
+ overflow-y: auto;
151
+ padding: 0.25rem;
152
+ border: 1px solid var(--ospt-border);
153
+ border-radius: 0.75rem;
154
+ }
155
+
156
+ .theme-dark .ospt-oil-list {
157
+ border-color: var(--ospt-border-dark);
158
+ }
159
+
160
+ .ospt-oil-item {
161
+ display: flex;
162
+ align-items: center;
163
+ gap: 0.6rem;
164
+ padding: 0.6rem;
165
+ border: 1px solid var(--ospt-border);
166
+ border-radius: 0.5rem;
167
+ background: var(--ospt-surface);
168
+ color: var(--ospt-ink);
169
+ font-size: 1.05rem;
170
+ font-weight: 700;
171
+ cursor: pointer;
172
+ text-align: left;
173
+ transition: all 0.2s;
174
+ }
175
+
176
+ .ospt-oil-color {
177
+ width: 12px;
178
+ height: 12px;
179
+ border-radius: 50%;
180
+ flex-shrink: 0;
181
+ border: 1px solid rgba(0,0,0,0.1);
182
+ }
183
+ .theme-dark .ospt-oil-color {
184
+ border-color: rgba(255, 255, 255, 0.15);
185
+ }
186
+
187
+ .ospt-oil-color.color-avocado-refined { background: #d9f99d; }
188
+ .ospt-oil-color.color-sunflower-refined { background: #fef08a; }
189
+ .ospt-oil-color.color-peanut-refined { background: #fbbf24; }
190
+ .ospt-oil-color.color-canola-refined { background: #facc15; }
191
+ .ospt-oil-color.color-olive-extra-virgin { background: #4d7c0f; }
192
+ .ospt-oil-color.color-olive-pomace { background: #b45309; }
193
+ .ospt-oil-color.color-coconut-unrefined { background: #f8fafc; }
194
+ .ospt-oil-color.color-sunflower-unrefined { background: #d97706; }
195
+
196
+ .ospt-food-icon {
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: center;
200
+ color: var(--ospt-muted);
201
+ }
202
+ .ospt-radio-btn.active .ospt-food-icon {
203
+ color: var(--ospt-gold);
204
+ }
205
+
206
+ .theme-dark .ospt-oil-item {
207
+ border-color: var(--ospt-border-dark);
208
+ background: var(--ospt-surface-dark);
209
+ color: var(--ospt-ink-dark);
210
+ }
211
+
212
+ .ospt-oil-item:hover,
213
+ .ospt-oil-item.active {
214
+ border-color: var(--ospt-amber);
215
+ background: rgba(217, 119, 6, 0.08);
216
+ }
217
+
218
+ .ospt-oil-item.active {
219
+ box-shadow: 0 0 0 2px var(--ospt-amber);
220
+ }
221
+
222
+ .ospt-card-group {
223
+ background: rgba(245, 158, 11, 0.015);
224
+ border: 1px solid var(--ospt-border);
225
+ border-radius: 1.25rem;
226
+ padding: 1.25rem;
227
+ display: flex;
228
+ flex-direction: column;
229
+ gap: 0.6rem;
230
+ }
231
+
232
+ .theme-dark .ospt-card-group {
233
+ background: rgba(0, 0, 0, 0.15);
234
+ border-color: var(--ospt-border-dark);
235
+ }
236
+
237
+ .ospt-slider-wrap {
238
+ display: flex;
239
+ align-items: center;
240
+ gap: 1rem;
241
+ }
242
+
243
+ .ospt-slider {
244
+ -webkit-appearance: none;
245
+ appearance: none;
246
+ flex: 1;
247
+ height: 6px;
248
+ border-radius: 3px;
249
+ background: var(--ospt-border);
250
+ outline: none;
251
+ cursor: pointer;
252
+ }
253
+
254
+ .theme-dark .ospt-slider {
255
+ background: var(--ospt-border-dark);
256
+ }
257
+
258
+ #ospt-uses::-webkit-slider-runnable-track {
259
+ background: linear-gradient(90deg, #fef08a 0%, #78350f var(--uses-pct, 0%), var(--ospt-border) var(--uses-pct, 0%));
260
+ height: 6px;
261
+ border-radius: 3px;
262
+ }
263
+ .theme-dark #ospt-uses::-webkit-slider-runnable-track { background: linear-gradient(90deg, #fef08a 0%, #78350f var(--uses-pct, 0%), var(--ospt-border-dark) var(--uses-pct, 0%)); }
264
+ #ospt-temp::-webkit-slider-runnable-track {
265
+ background: linear-gradient(90deg, var(--ospt-green) 0%, var(--ospt-green) var(--temp-safe-pct, 70%), var(--ospt-gold) var(--temp-safe-pct, 70%), var(--ospt-gold) var(--temp-danger-pct, 90%), var(--ospt-red) var(--temp-danger-pct, 90%), var(--ospt-red) 100%);
266
+ height: 6px;
267
+ border-radius: 3px;
268
+ }
269
+ .theme-dark #ospt-temp::-webkit-slider-runnable-track { background: linear-gradient(90deg, var(--ospt-green) 0%, var(--ospt-green) var(--temp-safe-pct, 70%), var(--ospt-gold) var(--temp-safe-pct, 70%), var(--ospt-gold) var(--temp-danger-pct, 90%), var(--ospt-red) var(--temp-danger-pct, 90%), var(--ospt-red) 100%); }
270
+ #ospt-uses, #ospt-temp { background: var(--ospt-border); }
271
+ .theme-dark #ospt-uses, .theme-dark #ospt-temp { background: var(--ospt-border-dark); }
272
+
273
+ .ospt-slider::-webkit-slider-thumb {
274
+ -webkit-appearance: none;
275
+ appearance: none;
276
+ width: 24px;
277
+ height: 24px;
278
+ border-radius: 50%;
279
+ border: 2px solid var(--ospt-surface);
280
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
281
+ cursor: pointer;
282
+ transition: transform 0.1s;
283
+ margin-top: -9px;
284
+ background: linear-gradient(135deg, var(--ospt-gold), var(--ospt-amber));
285
+ }
286
+
287
+ .theme-dark .ospt-slider::-webkit-slider-thumb {
288
+ border-color: var(--ospt-surface-dark);
289
+ }
290
+
291
+ .ospt-slider::-webkit-slider-thumb:hover {
292
+ transform: scale(1.15);
293
+ }
294
+
295
+ .ospt-value-display {
296
+ font-size: 1.5rem;
297
+ font-weight: 800;
298
+ color: var(--ospt-ink);
299
+ min-width: 4.5rem;
300
+ text-align: right;
301
+ font-variant-numeric: tabular-nums;
302
+ }
303
+
304
+ .theme-dark .ospt-value-display {
305
+ color: var(--ospt-ink-dark);
306
+ }
307
+
308
+ .ospt-unit {
309
+ font-size: 1rem;
310
+ font-weight: 700;
311
+ color: var(--ospt-muted);
312
+ margin-left: 0.1rem;
313
+ }
314
+
315
+ .ospt-adjuster-btn {
316
+ width: 28px;
317
+ height: 28px;
318
+ border-radius: 50%;
319
+ border: 1px solid var(--ospt-border);
320
+ background: var(--ospt-surface);
321
+ color: var(--ospt-ink);
322
+ font-weight: 800;
323
+ font-size: 1.3rem;
324
+ cursor: pointer;
325
+ display: flex;
326
+ align-items: center;
327
+ justify-content: center;
328
+ transition: all 0.15s;
329
+ }
330
+
331
+ .theme-dark .ospt-adjuster-btn {
332
+ border-color: var(--ospt-border-dark);
333
+ background: var(--ospt-surface-dark);
334
+ color: var(--ospt-ink-dark);
335
+ }
336
+
337
+ .ospt-adjuster-btn:hover {
338
+ background: var(--ospt-gold);
339
+ color: var(--ospt-surface);
340
+ border-color: var(--ospt-gold);
341
+ transform: scale(1.1);
342
+ }
343
+
344
+ .ospt-radio-group {
345
+ display: grid;
346
+ grid-template-columns: 1fr;
347
+ gap: 0.5rem;
348
+ }
349
+
350
+ .ospt-radio-btn {
351
+ display: flex;
352
+ align-items: center;
353
+ gap: 0.5rem;
354
+ padding: 0.75rem 1rem;
355
+ border: 1px solid var(--ospt-border);
356
+ border-radius: 0.75rem;
357
+ background: var(--ospt-surface);
358
+ color: var(--ospt-ink);
359
+ font-size: 1.1rem;
360
+ font-weight: 700;
361
+ cursor: pointer;
362
+ transition: all 0.2s;
363
+ }
364
+
365
+ .theme-dark .ospt-radio-btn {
366
+ border-color: var(--ospt-border-dark);
367
+ background: var(--ospt-surface-dark);
368
+ color: var(--ospt-ink-dark);
369
+ }
370
+
371
+ .ospt-radio-btn:hover,
372
+ .ospt-radio-btn.active {
373
+ border-color: var(--ospt-gold);
374
+ background: rgba(245, 158, 11, 0.08);
375
+ }
376
+
377
+ .ospt-radio-dot {
378
+ width: 12px;
379
+ height: 12px;
380
+ border-radius: 50%;
381
+ border: 2px solid var(--ospt-border);
382
+ display: inline-block;
383
+ transition: all 0.2s;
384
+ }
385
+
386
+ .theme-dark .ospt-radio-dot {
387
+ border-color: var(--ospt-border-dark);
388
+ }
389
+
390
+ .ospt-radio-btn.active .ospt-radio-dot {
391
+ background: var(--ospt-gold);
392
+ border-color: var(--ospt-gold);
393
+ box-shadow: 0 0 6px var(--ospt-gold);
394
+ }
395
+
396
+ .ospt-desc {
397
+ font-size: 0.95rem;
398
+ color: var(--ospt-muted);
399
+ line-height: 1.4;
400
+ }
401
+
402
+ .theme-dark .ospt-desc {
403
+ color: var(--ospt-muted-dark);
404
+ }
405
+
406
+ .ospt-result-panel {
407
+ padding: 2rem;
408
+ display: flex;
409
+ flex-direction: column;
410
+ align-items: center;
411
+ gap: 2rem;
412
+ background: radial-gradient(circle at top right, rgba(245, 158, 11, 0.05), transparent 70%);
413
+ transition: background 0.3s;
414
+ }
415
+
416
+ .ospt-card.status-good .ospt-result-panel {
417
+ background: radial-gradient(circle at top right, rgba(16, 185, 129, 0.08), transparent 70%);
418
+ }
419
+
420
+ .ospt-card.status-caution .ospt-result-panel {
421
+ background: radial-gradient(circle at top right, rgba(245, 158, 11, 0.08), transparent 70%);
422
+ }
423
+
424
+ .ospt-card.status-discard .ospt-result-panel {
425
+ background: radial-gradient(circle at top right, rgba(239, 68, 68, 0.08), transparent 70%);
426
+ }
427
+
428
+ .ospt-visuals-container {
429
+ display: grid;
430
+ grid-template-columns: 1fr 1.2fr;
431
+ gap: 1.5rem;
432
+ width: 100%;
433
+ }
434
+
435
+ .ospt-thermometer-box {
436
+ position: relative;
437
+ height: 220px;
438
+ background: rgba(255, 255, 255, 0.4);
439
+ border: 1px solid var(--ospt-border);
440
+ border-radius: 1.25rem;
441
+ display: flex;
442
+ flex-direction: column;
443
+ align-items: center;
444
+ justify-content: flex-end;
445
+ padding: 1.5rem 0.5rem;
446
+ box-sizing: border-box;
447
+ }
448
+
449
+ .theme-dark .ospt-thermometer-box {
450
+ background: rgba(0, 0, 0, 0.2);
451
+ border-color: var(--ospt-border-dark);
452
+ }
453
+
454
+ .ospt-smoke-emitter {
455
+ position: absolute;
456
+ top: 10px;
457
+ left: 50%;
458
+ transform: translateX(-50%);
459
+ width: 30px;
460
+ height: 40px;
461
+ pointer-events: none;
462
+ display: none;
463
+ }
464
+
465
+ .ospt-smoke-emitter.smoking {
466
+ display: block;
467
+ }
468
+
469
+ .ospt-smoke-particle {
470
+ position: absolute;
471
+ bottom: 0;
472
+ width: 8px;
473
+ height: 8px;
474
+ background: rgba(69, 26, 3, 0.3);
475
+ border-radius: 50%;
476
+ filter: blur(2px);
477
+ animation: float-up 2s infinite ease-out;
478
+ }
479
+
480
+ .ospt-smoke-particle:nth-child(2) {
481
+ left: 8px;
482
+ animation-delay: 0.4s;
483
+ width: 12px;
484
+ height: 12px;
485
+ }
486
+
487
+ .ospt-smoke-particle:nth-child(3) {
488
+ right: 6px;
489
+ animation-delay: 0.8s;
490
+ width: 10px;
491
+ height: 10px;
492
+ }
493
+
494
+ .ospt-smoke-particle:nth-child(4) {
495
+ left: 14px;
496
+ animation-delay: 1.2s;
497
+ width: 14px;
498
+ height: 14px;
499
+ }
500
+
501
+ @keyframes float-up {
502
+ 0% {
503
+ transform: translateY(0) scale(0.8);
504
+ opacity: 0;
505
+ }
506
+ 15% {
507
+ opacity: 0.4;
508
+ }
509
+ 100% {
510
+ transform: translateY(-40px) scale(2.2);
511
+ opacity: 0;
512
+ }
513
+ }
514
+
515
+ .ospt-thermo-graphic {
516
+ position: relative;
517
+ width: 18px;
518
+ height: 120px;
519
+ background: #e2e8f0;
520
+ border-radius: 9px;
521
+ border: 2px solid #cbd5e1;
522
+ overflow: hidden;
523
+ }
524
+
525
+ .theme-dark .ospt-thermo-graphic {
526
+ background: #334155;
527
+ border-color: #475569;
528
+ }
529
+
530
+ .ospt-thermo-danger-zone {
531
+ position: absolute;
532
+ left: 0;
533
+ right: 0;
534
+ top: 0;
535
+ background: linear-gradient(to top, rgba(239, 68, 68, 0.35) 0%, rgba(239, 68, 68, 0.7) 100%);
536
+ border-radius: 7px 7px 0 0;
537
+ transition: bottom 0.4s cubic-bezier(0.16, 1, 0.3, 1);
538
+ box-shadow: inset 0 0 4px rgba(239, 68, 68, 0.4);
539
+ }
540
+
541
+ .ospt-thermo-fluid {
542
+ position: absolute;
543
+ bottom: 0;
544
+ width: 100%;
545
+ height: 50%;
546
+ background: linear-gradient(to top, #f59e0b, #ef4444);
547
+ border-radius: 7px;
548
+ transition: height 0.4s cubic-bezier(0.16, 1, 0.3, 1);
549
+ box-shadow: 0 0 6px rgba(239, 68, 68, 0.4);
550
+ }
551
+
552
+ .ospt-thermo-bulb {
553
+ position: absolute;
554
+ bottom: -10px;
555
+ left: 50%;
556
+ transform: translateX(-50%);
557
+ width: 26px;
558
+ height: 26px;
559
+ border-radius: 50%;
560
+ background: #f59e0b;
561
+ border: 2px solid #cbd5e1;
562
+ box-shadow: 0 0 8px rgba(245, 158, 11, 0.5);
563
+ z-index: 2;
564
+ }
565
+
566
+ .theme-dark .ospt-thermo-bulb {
567
+ border-color: #475569;
568
+ }
569
+
570
+ .ospt-thermo-wrapper {
571
+ display: flex;
572
+ align-items: flex-end;
573
+ gap: 0.5rem;
574
+ height: 120px;
575
+ position: relative;
576
+ }
577
+
578
+ .ospt-thermo-scale {
579
+ position: relative;
580
+ height: 120px;
581
+ width: 45px;
582
+ }
583
+
584
+ .ospt-scale-tick {
585
+ position: absolute;
586
+ right: 0;
587
+ transform: translateY(50%);
588
+ display: flex;
589
+ align-items: center;
590
+ gap: 4px;
591
+ font-size: 0.9rem;
592
+ font-weight: 700;
593
+ color: var(--ospt-muted);
594
+ }
595
+
596
+ .theme-dark .ospt-scale-tick {
597
+ color: var(--ospt-muted-dark);
598
+ }
599
+
600
+ .ospt-scale-tick::after {
601
+ content: '';
602
+ width: 4px;
603
+ height: 1px;
604
+ background: currentcolor;
605
+ opacity: 0.5;
606
+ }
607
+
608
+ .ospt-thermo-smoke-point-marker {
609
+ position: absolute;
610
+ left: -4px;
611
+ width: 26px;
612
+ height: 2px;
613
+ background: #ef4444;
614
+ box-shadow: 0 0 4px #ef4444;
615
+ z-index: 3;
616
+ }
617
+
618
+ .ospt-thermo-smoke-point-label {
619
+ position: absolute;
620
+ left: 32px;
621
+ font-size: 0.9rem;
622
+ font-weight: 800;
623
+ color: var(--ospt-red);
624
+ white-space: nowrap;
625
+ transform: translateY(-50%);
626
+ }
627
+
628
+ .ospt-health-box {
629
+ background: rgba(255, 255, 255, 0.4);
630
+ border: 1px solid var(--ospt-border);
631
+ border-radius: 1.25rem;
632
+ display: flex;
633
+ flex-direction: column;
634
+ align-items: center;
635
+ justify-content: center;
636
+ padding: 1rem;
637
+ box-sizing: border-box;
638
+ }
639
+
640
+ .theme-dark .ospt-health-box {
641
+ background: rgba(0, 0, 0, 0.2);
642
+ border-color: var(--ospt-border-dark);
643
+ }
644
+
645
+ .ospt-gauge-title {
646
+ font-size: 1.1rem;
647
+ font-weight: 800;
648
+ color: var(--ospt-muted);
649
+ text-transform: uppercase;
650
+ letter-spacing: 0.05em;
651
+ margin-bottom: 0.5rem;
652
+ text-align: center;
653
+ }
654
+
655
+ .ospt-radial-gauge {
656
+ position: relative;
657
+ width: 100%;
658
+ max-width: 130px;
659
+ margin: 0 auto;
660
+ }
661
+
662
+ .ospt-radial-svg {
663
+ width: 100%;
664
+ height: auto;
665
+ overflow: visible;
666
+ }
667
+
668
+ .ospt-radial-bg {
669
+ stroke: var(--ospt-border);
670
+ }
671
+
672
+ .theme-dark .ospt-radial-bg {
673
+ stroke: var(--ospt-border-dark);
674
+ }
675
+
676
+ .ospt-radial-needle-group {
677
+ transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1);
678
+ }
679
+
680
+ .ospt-radial-value-container {
681
+ display: flex;
682
+ flex-direction: column;
683
+ align-items: center;
684
+ text-align: center;
685
+ margin-top: 0.25rem;
686
+ }
687
+
688
+ .ospt-radial-val {
689
+ font-size: 1.8rem;
690
+ font-weight: 900;
691
+ color: var(--ospt-ink);
692
+ line-height: 1.1;
693
+ }
694
+
695
+ .theme-dark .ospt-radial-val {
696
+ color: var(--ospt-ink-dark);
697
+ }
698
+
699
+ .ospt-radial-desc {
700
+ font-size: 1.05rem;
701
+ font-weight: 800;
702
+ color: var(--ospt-muted);
703
+ text-transform: uppercase;
704
+ letter-spacing: 0.05em;
705
+ }
706
+
707
+ .theme-dark .ospt-radial-desc {
708
+ color: var(--ospt-muted-dark);
709
+ }
710
+
711
+ .ospt-tpc-curve-container {
712
+ width: 100%;
713
+ background: rgba(245, 158, 11, 0.02);
714
+ border: 1px solid var(--ospt-border);
715
+ border-radius: 1.25rem;
716
+ padding: 1.25rem;
717
+ box-sizing: border-box;
718
+ }
719
+
720
+ .theme-dark .ospt-tpc-curve-container {
721
+ background: var(--ospt-surface-dark);
722
+ border-color: var(--ospt-border-dark);
723
+ }
724
+
725
+ .ospt-tpc-title {
726
+ font-size: 1.1rem;
727
+ font-weight: 800;
728
+ color: var(--ospt-muted);
729
+ text-transform: uppercase;
730
+ letter-spacing: 0.05em;
731
+ margin-bottom: 0.75rem;
732
+ }
733
+
734
+ .ospt-tpc-bar-wrap {
735
+ position: relative;
736
+ height: 10px;
737
+ background: linear-gradient(to right, var(--ospt-green) 0%, var(--ospt-green) 42.8%, var(--ospt-gold) 42.8%, var(--ospt-gold) 71.4%, var(--ospt-red) 71.4%, var(--ospt-red) 100%);
738
+ border-radius: 5px;
739
+ box-shadow: inset 0 1px 3px rgba(0,0,0,0.15);
740
+ overflow: visible;
741
+ }
742
+
743
+ .ospt-tpc-limit-line {
744
+ position: absolute;
745
+ left: 71.4%;
746
+ top: -4px;
747
+ bottom: -4px;
748
+ width: 2px;
749
+ background: #fff;
750
+ box-shadow: 0 0 4px rgba(0,0,0,0.5);
751
+ z-index: 2;
752
+ }
753
+
754
+ .ospt-tpc-current-marker {
755
+ position: absolute;
756
+ top: -3px;
757
+ width: 16px;
758
+ height: 16px;
759
+ background: #fff;
760
+ border: 2px solid var(--ospt-gold);
761
+ border-radius: 50%;
762
+ box-shadow: 0 2px 6px rgba(0,0,0,0.3);
763
+ transform: translateX(-50%);
764
+ transition: left 0.4s cubic-bezier(0.16, 1, 0.3, 1);
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: center;
768
+ z-index: 3;
769
+ }
770
+
771
+ .ospt-tpc-marker-label {
772
+ font-size: 0.55rem;
773
+ font-weight: 800;
774
+ color: var(--ospt-ink);
775
+ }
776
+
777
+ .ospt-tpc-labels {
778
+ position: relative;
779
+ height: 1rem;
780
+ margin-top: 0.75rem;
781
+ }
782
+
783
+ .ospt-tpc-labels span {
784
+ position: absolute;
785
+ transform: translateX(-50%);
786
+ font-size: 0.9rem;
787
+ font-weight: 700;
788
+ color: var(--ospt-muted);
789
+ white-space: nowrap;
790
+ }
791
+
792
+ .ospt-tpc-labels .limit {
793
+ color: var(--ospt-red);
794
+ }
795
+
796
+ .theme-dark .ospt-tpc-labels span {
797
+ color: var(--ospt-muted-dark);
798
+ }
799
+
800
+ .ospt-grid-values {
801
+ width: 100%;
802
+ display: grid;
803
+ grid-template-columns: 1fr 1fr;
804
+ gap: 1rem;
805
+ }
806
+
807
+ .ospt-stat-box {
808
+ background: rgba(245, 158, 11, 0.02);
809
+ border: 1px solid var(--ospt-border);
810
+ border-radius: 1.25rem;
811
+ padding: 1.25rem;
812
+ text-align: center;
813
+ display: flex;
814
+ flex-direction: column;
815
+ align-items: center;
816
+ gap: 0.35rem;
817
+ }
818
+
819
+ .theme-dark .ospt-stat-box {
820
+ background: var(--ospt-surface-dark);
821
+ border-color: var(--ospt-border-dark);
822
+ }
823
+
824
+ .ospt-stat-label {
825
+ font-size: 1.1rem;
826
+ font-weight: 800;
827
+ color: var(--ospt-muted);
828
+ text-transform: uppercase;
829
+ letter-spacing: 0.05em;
830
+ min-height: 2.2rem;
831
+ display: flex;
832
+ align-items: center;
833
+ justify-content: center;
834
+ text-align: center;
835
+ }
836
+
837
+ .ospt-stat-value {
838
+ font-size: 2rem;
839
+ font-weight: 900;
840
+ color: var(--ospt-ink);
841
+ font-variant-numeric: tabular-nums;
842
+ }
843
+
844
+ .theme-dark .ospt-stat-value {
845
+ color: var(--ospt-ink-dark);
846
+ }
847
+
848
+ .ospt-badge {
849
+ display: inline-flex;
850
+ padding: 0.4rem 1rem;
851
+ border-radius: 100px;
852
+ font-size: 1.1rem;
853
+ font-weight: 800;
854
+ text-transform: uppercase;
855
+ letter-spacing: 0.05em;
856
+ }
857
+
858
+ .ospt-badge.good {
859
+ background: rgba(16, 185, 129, 0.1);
860
+ color: var(--ospt-green);
861
+ border: 1px solid rgba(16, 185, 129, 0.2);
862
+ }
863
+
864
+ .ospt-badge.caution {
865
+ background: rgba(245, 158, 11, 0.1);
866
+ color: var(--ospt-gold);
867
+ border: 1px solid rgba(245, 158, 11, 0.2);
868
+ }
869
+
870
+ .ospt-badge.discard {
871
+ background: rgba(239, 68, 68, 0.1);
872
+ color: var(--ospt-red);
873
+ border: 1px solid rgba(239, 68, 68, 0.2);
874
+ }
875
+
876
+ .ospt-status-card {
877
+ width: 100%;
878
+ display: flex;
879
+ flex-direction: column;
880
+ align-items: center;
881
+ gap: 0.75rem;
882
+ padding: 1.25rem;
883
+ border-radius: 1.25rem;
884
+ border: 1px solid transparent;
885
+ transition: all 0.3s;
886
+ box-sizing: border-box;
887
+ }
888
+
889
+ .ospt-status-card.good {
890
+ background: rgba(16, 185, 129, 0.06);
891
+ border-color: rgba(16, 185, 129, 0.2);
892
+ color: var(--ospt-green-ink);
893
+ }
894
+
895
+ .theme-dark .ospt-status-card.good {
896
+ background: rgba(16, 185, 129, 0.1);
897
+ color: var(--ospt-green-dark);
898
+ }
899
+
900
+ .ospt-status-card.caution {
901
+ background: rgba(245, 158, 11, 0.06);
902
+ border-color: rgba(245, 158, 11, 0.25);
903
+ color: var(--ospt-gold-ink);
904
+ }
905
+
906
+ .theme-dark .ospt-status-card.caution {
907
+ background: rgba(245, 158, 11, 0.1);
908
+ color: var(--ospt-gold-dark);
909
+ }
910
+
911
+ .ospt-status-card.discard {
912
+ background: rgba(239, 68, 68, 0.06);
913
+ border-color: rgba(239, 68, 68, 0.25);
914
+ color: var(--ospt-red-ink);
915
+ box-shadow: 0 0 10px rgba(239, 68, 68, 0.05);
916
+ }
917
+
918
+ .theme-dark .ospt-status-card.discard {
919
+ background: rgba(239, 68, 68, 0.1);
920
+ color: var(--ospt-red-dark);
921
+ }
922
+
923
+ .ospt-status-header {
924
+ display: flex;
925
+ align-items: center;
926
+ justify-content: center;
927
+ gap: 0.75rem;
928
+ width: 100%;
929
+ }
930
+
931
+ .ospt-advice {
932
+ width: 100%;
933
+ text-align: center;
934
+ font-size: 1.15rem;
935
+ font-weight: 700;
936
+ line-height: 1.4;
937
+ }