@jjlmoya/utils-alcohol 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +19 -0
  3. package/src/category/i18n/es.ts +28 -0
  4. package/src/category/i18n/fr.ts +19 -0
  5. package/src/category/index.ts +12 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +19 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +155 -0
  14. package/src/pages/[locale].astro +271 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/content_mandatory.test.ts +32 -0
  17. package/src/tests/faq_count.test.ts +17 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/seo_length.test.ts +39 -0
  20. package/src/tests/tool_validation.test.ts +17 -0
  21. package/src/tool/alcoholClearance/component.astro +219 -0
  22. package/src/tool/alcoholClearance/component.css +369 -0
  23. package/src/tool/alcoholClearance/i18n/en.ts +172 -0
  24. package/src/tool/alcoholClearance/i18n/es.ts +181 -0
  25. package/src/tool/alcoholClearance/i18n/fr.ts +163 -0
  26. package/src/tool/alcoholClearance/index.ts +50 -0
  27. package/src/tool/alcoholClearance/logic.ts +59 -0
  28. package/src/tool/beerCooler/component.astro +236 -0
  29. package/src/tool/beerCooler/component.css +381 -0
  30. package/src/tool/beerCooler/i18n/en.ts +168 -0
  31. package/src/tool/beerCooler/i18n/es.ts +181 -0
  32. package/src/tool/beerCooler/i18n/fr.ts +168 -0
  33. package/src/tool/beerCooler/index.ts +49 -0
  34. package/src/tool/beerCooler/logic.ts +34 -0
  35. package/src/tool/carbonationCalculator/component.astro +225 -0
  36. package/src/tool/carbonationCalculator/component.css +483 -0
  37. package/src/tool/carbonationCalculator/i18n/en.ts +175 -0
  38. package/src/tool/carbonationCalculator/i18n/es.ts +179 -0
  39. package/src/tool/carbonationCalculator/i18n/fr.ts +175 -0
  40. package/src/tool/carbonationCalculator/index.ts +48 -0
  41. package/src/tool/carbonationCalculator/logic.ts +40 -0
  42. package/src/tool/cocktailBalancer/bibliography.astro +14 -0
  43. package/src/tool/cocktailBalancer/component.astro +396 -0
  44. package/src/tool/cocktailBalancer/component.css +1218 -0
  45. package/src/tool/cocktailBalancer/data/IngredientRepository.ts +83 -0
  46. package/src/tool/cocktailBalancer/data/Presets.ts +122 -0
  47. package/src/tool/cocktailBalancer/domain/Ingredient.ts +29 -0
  48. package/src/tool/cocktailBalancer/i18n/en.ts +193 -0
  49. package/src/tool/cocktailBalancer/i18n/es.ts +193 -0
  50. package/src/tool/cocktailBalancer/i18n/fr.ts +193 -0
  51. package/src/tool/cocktailBalancer/index.ts +68 -0
  52. package/src/tool/cocktailBalancer/logic.ts +118 -0
  53. package/src/tool/cocktailBalancer/seo.astro +53 -0
  54. package/src/tool/partyKeg/component.astro +269 -0
  55. package/src/tool/partyKeg/component.css +660 -0
  56. package/src/tool/partyKeg/i18n/en.ts +162 -0
  57. package/src/tool/partyKeg/i18n/es.ts +166 -0
  58. package/src/tool/partyKeg/i18n/fr.ts +162 -0
  59. package/src/tool/partyKeg/index.ts +46 -0
  60. package/src/tool/partyKeg/logic.ts +36 -0
  61. package/src/tools.ts +14 -0
  62. package/src/types.ts +72 -0
@@ -0,0 +1,1218 @@
1
+ .balancer-app {
2
+ max-width: 72rem;
3
+ margin: 0 auto;
4
+ padding: 0.5rem;
5
+ color: #1e293b;
6
+ }
7
+
8
+ .theme-dark .balancer-app {
9
+ color: #f1f5f9;
10
+ }
11
+
12
+ .balancer-card {
13
+ background: #fff;
14
+ border: 1px solid #e2e8f0;
15
+ border-radius: 1.25rem;
16
+ overflow: clip;
17
+ box-shadow: 0 4px 20px rgba(0,0,0,0.06);
18
+ }
19
+
20
+ .theme-dark .balancer-card {
21
+ background: #0f172a;
22
+ border-color: #1e293b;
23
+ }
24
+
25
+ .balancer-header {
26
+ display: flex;
27
+ flex-direction: column;
28
+ gap: 1rem;
29
+ align-items: center;
30
+ padding: 1rem 1.5rem;
31
+ border-bottom: 1px solid #e2e8f0;
32
+ }
33
+
34
+ @media (min-width: 768px) {
35
+ .balancer-header {
36
+ flex-direction: row;
37
+ justify-content: space-between;
38
+ }
39
+ }
40
+
41
+ .theme-dark .balancer-header {
42
+ border-color: #1e293b;
43
+ }
44
+
45
+ .balancer-title {
46
+ font-size: 1.25rem;
47
+ font-weight: 700;
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 0.5rem;
51
+ margin: 0;
52
+ }
53
+
54
+ .balancer-title-icon {
55
+ color: #6366f1;
56
+ font-size: 1.5rem;
57
+ display: flex;
58
+ }
59
+
60
+ .balancer-version {
61
+ font-size: 0.75rem;
62
+ padding: 0.25rem 0.5rem;
63
+ background: #e0e7ff;
64
+ color: #4f46e5;
65
+ border-radius: 9999px;
66
+ }
67
+
68
+ .theme-dark .balancer-version {
69
+ background: #1e1b4b;
70
+ color: #a5b4fc;
71
+ }
72
+
73
+ .balancer-actions {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 0.75rem;
77
+ }
78
+
79
+ .btn-primary {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 0.5rem;
83
+ padding: 0.5rem 1rem;
84
+ background: #4f46e5;
85
+ color: #fff;
86
+ border: none;
87
+ border-radius: 0.75rem;
88
+ font-weight: 700;
89
+ font-size: 0.875rem;
90
+ cursor: pointer;
91
+ box-shadow: 0 4px 12px rgba(99,102,241,0.3);
92
+ transition: background 0.2s;
93
+ }
94
+
95
+ .btn-primary:hover {
96
+ background: #4338ca;
97
+ }
98
+
99
+ .btn-secondary {
100
+ display: flex;
101
+ align-items: center;
102
+ gap: 0.5rem;
103
+ padding: 0.5rem 1rem;
104
+ background: #f1f5f9;
105
+ color: #475569;
106
+ border: none;
107
+ border-radius: 0.75rem;
108
+ font-weight: 500;
109
+ font-size: 0.875rem;
110
+ cursor: pointer;
111
+ transition: background 0.2s;
112
+ }
113
+
114
+ .theme-dark .btn-secondary {
115
+ background: #1e293b;
116
+ color: #94a3b8;
117
+ }
118
+
119
+ .btn-secondary:hover {
120
+ background: #e0e7ff;
121
+ color: #4f46e5;
122
+ }
123
+
124
+ .theme-dark .btn-secondary:hover {
125
+ background: rgba(99,102,241,0.2);
126
+ }
127
+
128
+ .btn-danger {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 0.5rem;
132
+ padding: 0.5rem;
133
+ color: #ef4444;
134
+ background: none;
135
+ border: none;
136
+ border-radius: 0.75rem;
137
+ cursor: pointer;
138
+ font-weight: 700;
139
+ font-size: 0.875rem;
140
+ transition: background 0.2s;
141
+ }
142
+
143
+ .btn-danger:hover {
144
+ background: #fef2f2;
145
+ }
146
+
147
+ .theme-dark .btn-danger:hover {
148
+ background: rgba(239,68,68,0.1);
149
+ }
150
+
151
+ .btn-danger-solid {
152
+ background: #ef4444;
153
+ color: #fff;
154
+ border: none;
155
+ border-radius: 0.75rem;
156
+ font-weight: 700;
157
+ padding: 0.75rem;
158
+ cursor: pointer;
159
+ transition: background 0.2s;
160
+ box-shadow: 0 4px 12px rgba(239,68,68,0.3);
161
+ }
162
+
163
+ .btn-danger-solid:hover {
164
+ background: #dc2626;
165
+ }
166
+
167
+ .balancer-grid {
168
+ display: grid;
169
+ align-items: start;
170
+ }
171
+
172
+ @media (min-width: 1024px) {
173
+ .balancer-grid {
174
+ grid-template-columns: 7fr 5fr;
175
+ }
176
+ }
177
+
178
+ .recipe-column {
179
+ display: flex;
180
+ flex-direction: column;
181
+ gap: 1.5rem;
182
+ padding: 1.5rem;
183
+ }
184
+
185
+ @media (min-width: 1024px) {
186
+ .recipe-column {
187
+ border-right: 1px solid #e2e8f0;
188
+ }
189
+ }
190
+
191
+ .theme-dark .recipe-column {
192
+ border-color: #1e293b;
193
+ }
194
+
195
+ .recipe-container {
196
+ min-height: 300px;
197
+ display: flex;
198
+ flex-direction: column;
199
+ gap: 1rem;
200
+ }
201
+
202
+ .empty-state {
203
+ display: flex;
204
+ flex-direction: column;
205
+ align-items: center;
206
+ justify-content: center;
207
+ padding: 4rem 1rem;
208
+ border: 2px dashed #e2e8f0;
209
+ border-radius: 1.5rem;
210
+ background: rgba(248,250,252,0.5);
211
+ }
212
+
213
+ .theme-dark .empty-state {
214
+ border-color: #334155;
215
+ background: rgba(30,41,59,0.5);
216
+ }
217
+
218
+ .empty-icon-wrap {
219
+ width: 5rem;
220
+ height: 5rem;
221
+ background: #e0e7ff;
222
+ color: #6366f1;
223
+ border-radius: 50%;
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ font-size: 2.5rem;
228
+ margin-bottom: 1rem;
229
+ }
230
+
231
+ .theme-dark .empty-icon-wrap {
232
+ background: rgba(99,102,241,0.2);
233
+ }
234
+
235
+ .empty-flask-icon {
236
+ width: 2.5rem;
237
+ height: 2.5rem;
238
+ }
239
+
240
+ .empty-title {
241
+ font-size: 1.125rem;
242
+ font-weight: 700;
243
+ color: #334155;
244
+ margin: 0 0 0.5rem;
245
+ }
246
+
247
+ .theme-dark .empty-title {
248
+ color: #e2e8f0;
249
+ }
250
+
251
+ .empty-desc {
252
+ color: #64748b;
253
+ font-size: 0.875rem;
254
+ margin: 0 0 1.5rem;
255
+ max-width: 20rem;
256
+ text-align: center;
257
+ }
258
+
259
+ .theme-dark .empty-desc {
260
+ color: #94a3b8;
261
+ }
262
+
263
+ .btn-add-first {
264
+ padding: 0.75rem 1.5rem;
265
+ font-size: 1rem;
266
+ }
267
+
268
+ .btn-add-more {
269
+ width: 100%;
270
+ padding: 1rem;
271
+ border: 2px dashed #cbd5e1;
272
+ border-radius: 1rem;
273
+ color: #64748b;
274
+ background: none;
275
+ cursor: pointer;
276
+ font-weight: 700;
277
+ display: flex;
278
+ align-items: center;
279
+ justify-content: center;
280
+ gap: 0.5rem;
281
+ transition: all 0.2s;
282
+ }
283
+
284
+ .theme-dark .btn-add-more {
285
+ border-color: #334155;
286
+ }
287
+
288
+ .btn-add-more:hover {
289
+ border-color: #6366f1;
290
+ color: #6366f1;
291
+ }
292
+
293
+ .add-more-icon {
294
+ font-size: 1.5rem;
295
+ }
296
+
297
+ .dashboard-column {
298
+ display: flex;
299
+ flex-direction: column;
300
+ position: sticky;
301
+ top: 0;
302
+ background: #f8fafc;
303
+ }
304
+
305
+ .theme-dark .dashboard-column {
306
+ background: rgba(0,0,0,0.15);
307
+ }
308
+
309
+ .flavor-card {
310
+ padding: 1.5rem;
311
+ border-bottom: 1px solid #e2e8f0;
312
+ position: relative;
313
+ overflow: hidden;
314
+ }
315
+
316
+ .theme-dark .flavor-card {
317
+ border-color: #1e293b;
318
+ }
319
+
320
+ .flavor-card-accent {
321
+ position: absolute;
322
+ top: 0;
323
+ left: 0;
324
+ right: 0;
325
+ height: 3px;
326
+ background: linear-gradient(to right, #6366f1, #a855f7, #ec4899);
327
+ }
328
+
329
+ .flavor-card-header {
330
+ display: flex;
331
+ justify-content: space-between;
332
+ align-items: flex-start;
333
+ margin-bottom: 1rem;
334
+ }
335
+
336
+ .flavor-card-title {
337
+ font-size: 1.125rem;
338
+ font-weight: 700;
339
+ margin: 0;
340
+ }
341
+
342
+ .abv-badge {
343
+ padding: 0.25rem 0.75rem;
344
+ border-radius: 9999px;
345
+ background: #f1f5f9;
346
+ font-size: 0.75rem;
347
+ font-weight: 700;
348
+ color: #64748b;
349
+ }
350
+
351
+ .theme-dark .abv-badge {
352
+ background: #1e293b;
353
+ }
354
+
355
+ .radar-wrap {
356
+ position: relative;
357
+ width: 100%;
358
+ max-width: 280px;
359
+ margin: 0 auto;
360
+ aspect-ratio: 1;
361
+ }
362
+
363
+ .radar-svg {
364
+ width: 100%;
365
+ height: 100%;
366
+ filter: drop-shadow(0 4px 12px rgba(0,0,0,0.1));
367
+ }
368
+
369
+ .radar-bg-poly {
370
+ stroke: #e2e8f0;
371
+ }
372
+
373
+ .theme-dark .radar-bg-poly {
374
+ stroke: #334155;
375
+ }
376
+
377
+ .radar-shape {
378
+ fill: rgba(99,102,241,0.2);
379
+ stroke: #6366f1;
380
+ transition: all 0.7s;
381
+ }
382
+
383
+ .radar-dot {
384
+ fill: #4f46e5;
385
+ transition: all 0.7s;
386
+ }
387
+
388
+ .radar-label {
389
+ position: absolute;
390
+ font-size: 0.625rem;
391
+ text-transform: uppercase;
392
+ font-weight: 700;
393
+ color: #94a3b8;
394
+ letter-spacing: 0.05em;
395
+ background: #f8fafc;
396
+ padding: 0 2px;
397
+ }
398
+
399
+ .theme-dark .radar-label {
400
+ background: transparent;
401
+ }
402
+
403
+ .radar-top {
404
+ top: 0;
405
+ left: 50%;
406
+ transform: translateX(-50%) translateY(-0.5rem);
407
+ }
408
+
409
+ .radar-right-top {
410
+ top: 35%;
411
+ right: 0;
412
+ transform: translateX(0.5rem);
413
+ }
414
+
415
+ .radar-right-bot {
416
+ bottom: 15%;
417
+ right: 0;
418
+ transform: translateX(0.5rem);
419
+ }
420
+
421
+ .radar-left-bot {
422
+ bottom: 15%;
423
+ left: 0;
424
+ transform: translateX(-0.5rem);
425
+ }
426
+
427
+ .radar-left-top {
428
+ top: 35%;
429
+ left: 0;
430
+ transform: translateX(-1rem);
431
+ }
432
+
433
+ .stats-grid {
434
+ display: grid;
435
+ grid-template-columns: repeat(3, 1fr);
436
+ padding: 1rem 1.5rem;
437
+ border-bottom: 1px solid #e2e8f0;
438
+ gap: 0.75rem;
439
+ }
440
+
441
+ .theme-dark .stats-grid {
442
+ border-color: #1e293b;
443
+ }
444
+
445
+ .stat-card {
446
+ padding: 0.75rem;
447
+ border-radius: 0.75rem;
448
+ border: 1px solid #e2e8f0;
449
+ text-align: center;
450
+ }
451
+
452
+ .theme-dark .stat-card {
453
+ border-color: #1e293b;
454
+ }
455
+
456
+ .stat-card-label {
457
+ font-size: 0.75rem;
458
+ color: #94a3b8;
459
+ text-transform: uppercase;
460
+ font-weight: 700;
461
+ margin-bottom: 0.25rem;
462
+ }
463
+
464
+ .stat-card-value {
465
+ font-size: 1.25rem;
466
+ font-weight: 900;
467
+ color: #334155;
468
+ }
469
+
470
+ .theme-dark .stat-card-value {
471
+ color: #e2e8f0;
472
+ }
473
+
474
+ .stat-value-amber {
475
+ color: #f59e0b;
476
+ }
477
+
478
+ .stat-card-unit {
479
+ font-size: 0.75rem;
480
+ color: #94a3b8;
481
+ font-weight: 400;
482
+ margin-left: 0.25rem;
483
+ }
484
+
485
+ .stat-card-color {
486
+ display: flex;
487
+ flex-direction: column;
488
+ align-items: center;
489
+ }
490
+
491
+ .color-swatch {
492
+ width: 2rem;
493
+ height: 2rem;
494
+ border-radius: 50%;
495
+ box-shadow: inset 0 2px 4px rgba(0,0,0,0.1);
496
+ border: 2px solid #f1f5f9;
497
+ overflow: hidden;
498
+ margin-top: 0.5rem;
499
+ }
500
+
501
+ .theme-dark .color-swatch {
502
+ border-color: #334155;
503
+ }
504
+
505
+ .color-swatch-inner {
506
+ width: 100%;
507
+ height: 100%;
508
+ background: transparent;
509
+ transition: background-color 0.5s;
510
+ }
511
+
512
+ .balance-card {
513
+ padding: 1.25rem 1.5rem;
514
+ border-bottom: 1px solid #e2e8f0;
515
+ }
516
+
517
+ .theme-dark .balance-card {
518
+ border-color: #1e293b;
519
+ }
520
+
521
+ .balance-card-header {
522
+ display: flex;
523
+ align-items: center;
524
+ justify-content: space-between;
525
+ margin-bottom: 1.5rem;
526
+ }
527
+
528
+ .balance-card-title {
529
+ font-size: 0.875rem;
530
+ font-weight: 700;
531
+ color: #64748b;
532
+ text-transform: uppercase;
533
+ letter-spacing: 0.1em;
534
+ margin: 0;
535
+ }
536
+
537
+ .balance-verdict {
538
+ font-size: 1rem;
539
+ font-weight: 900;
540
+ color: #cbd5e1;
541
+ }
542
+
543
+ .balance-track {
544
+ position: relative;
545
+ height: 1rem;
546
+ background: #f1f5f9;
547
+ border-radius: 9999px;
548
+ margin: 0 0.5rem 2rem;
549
+ }
550
+
551
+ .theme-dark .balance-track {
552
+ background: #1e293b;
553
+ }
554
+
555
+ .balance-zone {
556
+ position: absolute;
557
+ top: 0;
558
+ height: 100%;
559
+ width: 30%;
560
+ }
561
+
562
+ .balance-zone-left {
563
+ left: 0;
564
+ background: linear-gradient(to right, rgba(132,204,22,0.2), rgba(132,204,22,0.05));
565
+ border-radius: 9999px 0 0 9999px;
566
+ }
567
+
568
+ .balance-zone-right {
569
+ right: 0;
570
+ background: linear-gradient(to left, rgba(245,158,11,0.2), rgba(245,158,11,0.05));
571
+ border-radius: 0 9999px 9999px 0;
572
+ }
573
+
574
+ .balance-center-line {
575
+ position: absolute;
576
+ left: 50%;
577
+ top: 0;
578
+ height: 100%;
579
+ width: 4px;
580
+ background: rgba(203,213,225,0.5);
581
+ transform: translateX(-50%);
582
+ }
583
+
584
+ .balance-needle {
585
+ position: absolute;
586
+ top: 50%;
587
+ transform: translate(-50%, -50%);
588
+ width: 1.5rem;
589
+ height: 1.5rem;
590
+ background: #fff;
591
+ border: 4px solid #0f172a;
592
+ border-radius: 50%;
593
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
594
+ transition: left 0.5s;
595
+ z-index: 1;
596
+ }
597
+
598
+ .theme-dark .balance-needle {
599
+ background: #334155;
600
+ border-color: #fff;
601
+ }
602
+
603
+ .balance-labels {
604
+ display: flex;
605
+ justify-content: space-between;
606
+ font-size: 0.625rem;
607
+ font-weight: 700;
608
+ text-transform: uppercase;
609
+ letter-spacing: 0.1em;
610
+ padding: 0 0.25rem;
611
+ }
612
+
613
+ .balance-lbl-acid {
614
+ color: #65a30d;
615
+ }
616
+
617
+ .balance-lbl-mid {
618
+ color: #cbd5e1;
619
+ }
620
+
621
+ .balance-lbl-sweet {
622
+ color: #d97706;
623
+ }
624
+
625
+ .fix-box {
626
+ background: #eef2ff;
627
+ padding: 1.25rem 1.5rem;
628
+ display: flex;
629
+ gap: 1rem;
630
+ border-top: 1px solid #e0e7ff;
631
+ }
632
+
633
+ .theme-dark .fix-box {
634
+ background: rgba(99,102,241,0.08);
635
+ border-color: rgba(99,102,241,0.2);
636
+ }
637
+
638
+ .fix-icon-wrap {
639
+ width: 2.5rem;
640
+ height: 2.5rem;
641
+ border-radius: 50%;
642
+ background: #e0e7ff;
643
+ color: #4f46e5;
644
+ flex-shrink: 0;
645
+ display: flex;
646
+ align-items: center;
647
+ justify-content: center;
648
+ font-size: 1.25rem;
649
+ }
650
+
651
+ .theme-dark .fix-icon-wrap {
652
+ background: rgba(99,102,241,0.2);
653
+ color: #818cf8;
654
+ }
655
+
656
+ .fix-icon {
657
+ width: 1.5rem;
658
+ height: 1.5rem;
659
+ }
660
+
661
+ .fix-title {
662
+ font-weight: 700;
663
+ color: #1e1b4b;
664
+ margin: 0 0 0.25rem;
665
+ font-size: 0.875rem;
666
+ }
667
+
668
+ .theme-dark .fix-title {
669
+ color: #c7d2fe;
670
+ }
671
+
672
+ .fix-text {
673
+ font-size: 0.875rem;
674
+ color: rgba(30,27,75,0.8);
675
+ line-height: 1.6;
676
+ margin: 0;
677
+ }
678
+
679
+ .theme-dark .fix-text {
680
+ color: #a5b4fc;
681
+ }
682
+
683
+ .modal-dialog {
684
+ margin: auto;
685
+ border: none;
686
+ background: transparent;
687
+ padding: 0;
688
+ width: 100%;
689
+ max-width: 42rem;
690
+ border-radius: 1.5rem;
691
+ box-shadow: 0 25px 50px rgba(0,0,0,0.25);
692
+ }
693
+
694
+ .modal-dialog::backdrop {
695
+ background: rgba(15,23,42,0.4);
696
+ backdrop-filter: blur(4px);
697
+ }
698
+
699
+ .modal-dialog-wide {
700
+ max-width: 56rem;
701
+ }
702
+
703
+ .modal-dialog-sm {
704
+ max-width: 24rem;
705
+ }
706
+
707
+ .modal-body {
708
+ background: #fff;
709
+ border: 1px solid #e2e8f0;
710
+ border-radius: 1.5rem;
711
+ overflow: hidden;
712
+ max-height: 85vh;
713
+ display: flex;
714
+ flex-direction: column;
715
+ }
716
+
717
+ .theme-dark .modal-body {
718
+ background: #0f172a;
719
+ border-color: #1e293b;
720
+ }
721
+
722
+ .modal-header {
723
+ padding: 1.5rem;
724
+ border-bottom: 1px solid #f1f5f9;
725
+ background: rgba(248,250,252,0.8);
726
+ backdrop-filter: blur(4px);
727
+ position: sticky;
728
+ top: 0;
729
+ z-index: 1;
730
+ }
731
+
732
+ .theme-dark .modal-header {
733
+ background: rgba(15,23,42,0.8);
734
+ border-color: #1e293b;
735
+ }
736
+
737
+ .modal-header-row {
738
+ display: flex;
739
+ justify-content: space-between;
740
+ align-items: center;
741
+ margin-bottom: 1rem;
742
+ }
743
+
744
+ .modal-header-simple {
745
+ display: flex;
746
+ justify-content: space-between;
747
+ align-items: center;
748
+ }
749
+
750
+ .modal-title {
751
+ font-size: 1.25rem;
752
+ font-weight: 700;
753
+ margin: 0;
754
+ }
755
+
756
+ .modal-title-with-icon {
757
+ display: flex;
758
+ align-items: center;
759
+ gap: 0.5rem;
760
+ }
761
+
762
+ .modal-title-icon {
763
+ color: #6366f1;
764
+ width: 1.5rem;
765
+ height: 1.5rem;
766
+ }
767
+
768
+ .modal-close-btn {
769
+ padding: 0.5rem;
770
+ background: none;
771
+ border: none;
772
+ border-radius: 50%;
773
+ cursor: pointer;
774
+ color: #64748b;
775
+ display: flex;
776
+ transition: background 0.2s;
777
+ }
778
+
779
+ .modal-close-btn:hover {
780
+ background: #f1f5f9;
781
+ }
782
+
783
+ .theme-dark .modal-close-btn:hover {
784
+ background: #1e293b;
785
+ }
786
+
787
+ .modal-search-wrap {
788
+ position: relative;
789
+ }
790
+
791
+ .modal-search-icon {
792
+ position: absolute;
793
+ left: 0.75rem;
794
+ top: 50%;
795
+ transform: translateY(-50%);
796
+ color: #94a3b8;
797
+ width: 1.25rem;
798
+ height: 1.25rem;
799
+ }
800
+
801
+ .modal-search-input {
802
+ width: 100%;
803
+ padding: 0.75rem 1rem 0.75rem 2.5rem;
804
+ background: #fff;
805
+ border: 2px solid #e2e8f0;
806
+ border-radius: 0.75rem;
807
+ outline: none;
808
+ transition: border-color 0.2s;
809
+ box-sizing: border-box;
810
+ }
811
+
812
+ .theme-dark .modal-search-input {
813
+ background: #1e293b;
814
+ border-color: #334155;
815
+ color: #f1f5f9;
816
+ }
817
+
818
+ .modal-search-input:focus {
819
+ border-color: #6366f1;
820
+ }
821
+
822
+ .modal-scroll {
823
+ flex: 1;
824
+ overflow-y: auto;
825
+ padding: 1rem;
826
+ }
827
+
828
+ .modal-scroll-bg {
829
+ background: #f8fafc;
830
+ }
831
+
832
+ .theme-dark .modal-scroll-bg {
833
+ background: rgba(0,0,0,0.1);
834
+ }
835
+
836
+ .ing-grid {
837
+ display: grid;
838
+ gap: 0.75rem;
839
+ }
840
+
841
+ @media (min-width: 640px) {
842
+ .ing-grid {
843
+ grid-template-columns: 1fr 1fr;
844
+ }
845
+ }
846
+
847
+ .ing-select-btn {
848
+ display: flex;
849
+ align-items: center;
850
+ gap: 0.75rem;
851
+ padding: 0.75rem;
852
+ background: #f8fafc;
853
+ border: 1px solid transparent;
854
+ border-radius: 0.75rem;
855
+ cursor: pointer;
856
+ text-align: left;
857
+ transition: all 0.15s;
858
+ }
859
+
860
+ .theme-dark .ing-select-btn {
861
+ background: rgba(30,41,59,0.5);
862
+ }
863
+
864
+ .ing-select-btn:hover {
865
+ background: #eef2ff;
866
+ border-color: #c7d2fe;
867
+ }
868
+
869
+ .theme-dark .ing-select-btn:hover {
870
+ background: rgba(99,102,241,0.1);
871
+ border-color: rgba(99,102,241,0.4);
872
+ }
873
+
874
+ .ing-icon-wrap {
875
+ width: 2.5rem;
876
+ height: 2.5rem;
877
+ border-radius: 0.5rem;
878
+ display: flex;
879
+ align-items: center;
880
+ justify-content: center;
881
+ font-size: 1.25rem;
882
+ flex-shrink: 0;
883
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
884
+ }
885
+
886
+ .ing-icon-spirit {
887
+ background: #e0e7ff;
888
+ color: #4f46e5;
889
+ }
890
+
891
+ .ing-icon-citrus {
892
+ background: #ecfccb;
893
+ color: #65a30d;
894
+ }
895
+
896
+ .ing-icon-syrup {
897
+ background: #fef3c7;
898
+ color: #d97706;
899
+ }
900
+
901
+ .ing-icon-other {
902
+ background: #f1f5f9;
903
+ color: #475569;
904
+ }
905
+
906
+ .ing-info {
907
+ display: flex;
908
+ flex-direction: column;
909
+ }
910
+
911
+ .ing-name {
912
+ font-weight: 700;
913
+ color: #334155;
914
+ font-size: 0.875rem;
915
+ }
916
+
917
+ .theme-dark .ing-name {
918
+ color: #e2e8f0;
919
+ }
920
+
921
+ .ing-select-btn:hover .ing-name {
922
+ color: #4f46e5;
923
+ }
924
+
925
+ .theme-dark .ing-select-btn:hover .ing-name {
926
+ color: #818cf8;
927
+ }
928
+
929
+ .ing-meta {
930
+ font-size: 0.625rem;
931
+ color: #94a3b8;
932
+ font-weight: 700;
933
+ text-transform: uppercase;
934
+ letter-spacing: 0.05em;
935
+ margin-top: 0.125rem;
936
+ }
937
+
938
+ .presets-grid {
939
+ display: grid;
940
+ gap: 1rem;
941
+ margin-bottom: 2rem;
942
+ }
943
+
944
+ @media (min-width: 768px) {
945
+ .presets-grid {
946
+ grid-template-columns: 1fr 1fr;
947
+ }
948
+ }
949
+
950
+ @media (min-width: 1024px) {
951
+ .presets-grid {
952
+ grid-template-columns: repeat(3, 1fr);
953
+ }
954
+ }
955
+
956
+ .preset-load-btn {
957
+ display: flex;
958
+ flex-direction: column;
959
+ gap: 0.5rem;
960
+ padding: 1rem;
961
+ background: #fff;
962
+ border: 1px solid #e2e8f0;
963
+ border-radius: 0.75rem;
964
+ text-align: left;
965
+ cursor: pointer;
966
+ transition: all 0.15s;
967
+ box-shadow: 0 1px 3px rgba(0,0,0,0.05);
968
+ }
969
+
970
+ .theme-dark .preset-load-btn {
971
+ background: #1e293b;
972
+ border-color: #334155;
973
+ }
974
+
975
+ .preset-load-btn:hover {
976
+ border-color: #6366f1;
977
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
978
+ }
979
+
980
+ .preset-icon-row {
981
+ display: flex;
982
+ align-items: center;
983
+ gap: 0.5rem;
984
+ color: #6366f1;
985
+ margin-bottom: 0.25rem;
986
+ }
987
+
988
+ .preset-icon {
989
+ width: 1.25rem;
990
+ height: 1.25rem;
991
+ }
992
+
993
+ .preset-name {
994
+ font-weight: 700;
995
+ color: #0f172a;
996
+ font-size: 0.875rem;
997
+ }
998
+
999
+ .theme-dark .preset-name {
1000
+ color: #fff;
1001
+ }
1002
+
1003
+ .preset-desc {
1004
+ font-size: 0.75rem;
1005
+ color: #64748b;
1006
+ line-height: 1.4;
1007
+ margin: 0;
1008
+ display: -webkit-box;
1009
+ -webkit-line-clamp: 2;
1010
+ -webkit-box-orient: vertical;
1011
+ overflow: hidden;
1012
+ }
1013
+
1014
+ .section-heading {
1015
+ font-size: 0.75rem;
1016
+ font-weight: 700;
1017
+ text-transform: uppercase;
1018
+ color: #94a3b8;
1019
+ letter-spacing: 0.1em;
1020
+ margin: 0 0 1rem;
1021
+ }
1022
+
1023
+ .saved-section {
1024
+ margin-bottom: 2rem;
1025
+ }
1026
+
1027
+ .confirm-body {
1028
+ background: #fff;
1029
+ border: 1px solid #e2e8f0;
1030
+ border-radius: 1.5rem;
1031
+ padding: 1.5rem;
1032
+ display: flex;
1033
+ flex-direction: column;
1034
+ align-items: center;
1035
+ gap: 1rem;
1036
+ text-align: center;
1037
+ }
1038
+
1039
+ .theme-dark .confirm-body {
1040
+ background: #0f172a;
1041
+ border-color: #1e293b;
1042
+ }
1043
+
1044
+ .confirm-icon-wrap {
1045
+ width: 4rem;
1046
+ height: 4rem;
1047
+ border-radius: 50%;
1048
+ background: #fef2f2;
1049
+ color: #ef4444;
1050
+ display: flex;
1051
+ align-items: center;
1052
+ justify-content: center;
1053
+ font-size: 1.875rem;
1054
+ margin-bottom: 0.5rem;
1055
+ }
1056
+
1057
+ .theme-dark .confirm-icon-wrap {
1058
+ background: rgba(239,68,68,0.2);
1059
+ }
1060
+
1061
+ .confirm-icon {
1062
+ width: 2.5rem;
1063
+ height: 2.5rem;
1064
+ }
1065
+
1066
+ .confirm-title {
1067
+ font-size: 1.25rem;
1068
+ font-weight: 700;
1069
+ margin: 0 0 0.5rem;
1070
+ }
1071
+
1072
+ .confirm-text {
1073
+ color: #64748b;
1074
+ font-size: 0.875rem;
1075
+ margin: 0;
1076
+ }
1077
+
1078
+ .theme-dark .confirm-text {
1079
+ color: #94a3b8;
1080
+ }
1081
+
1082
+ .confirm-actions {
1083
+ display: flex;
1084
+ gap: 0.75rem;
1085
+ width: 100%;
1086
+ margin-top: 0.5rem;
1087
+ }
1088
+
1089
+ .btn-confirm {
1090
+ flex: 1;
1091
+ padding: 0.75rem;
1092
+ }
1093
+
1094
+ .recipe-row {
1095
+ background: #fff;
1096
+ border-radius: 1rem;
1097
+ padding: 1rem;
1098
+ box-shadow: 0 1px 3px rgba(0,0,0,0.05);
1099
+ border: 1px solid #f1f5f9;
1100
+ }
1101
+
1102
+ .theme-dark .recipe-row {
1103
+ background: #0f172a;
1104
+ border-color: #1e293b;
1105
+ }
1106
+
1107
+ .recipe-row-top {
1108
+ display: flex;
1109
+ align-items: center;
1110
+ justify-content: space-between;
1111
+ margin-bottom: 0.75rem;
1112
+ }
1113
+
1114
+ .recipe-row-info {
1115
+ display: flex;
1116
+ align-items: center;
1117
+ gap: 0.75rem;
1118
+ }
1119
+
1120
+ .recipe-row-name {
1121
+ font-weight: 700;
1122
+ color: #334155;
1123
+ }
1124
+
1125
+ .theme-dark .recipe-row-name {
1126
+ color: #e2e8f0;
1127
+ }
1128
+
1129
+ .recipe-row-type {
1130
+ font-size: 0.625rem;
1131
+ background: #f1f5f9;
1132
+ padding: 0.125rem 0.5rem;
1133
+ border-radius: 0.25rem;
1134
+ color: #64748b;
1135
+ font-weight: 700;
1136
+ text-transform: uppercase;
1137
+ }
1138
+
1139
+ .theme-dark .recipe-row-type {
1140
+ background: #1e293b;
1141
+ }
1142
+
1143
+ .recipe-row-del {
1144
+ opacity: 0;
1145
+ transition: opacity 0.2s;
1146
+ }
1147
+
1148
+ .recipe-row:hover .recipe-row-del {
1149
+ opacity: 1;
1150
+ }
1151
+
1152
+ .recipe-row-controls {
1153
+ display: flex;
1154
+ align-items: center;
1155
+ gap: 1rem;
1156
+ }
1157
+
1158
+ .recipe-range {
1159
+ flex: 1;
1160
+ height: 0.5rem;
1161
+ border-radius: 0.5rem;
1162
+ appearance: none;
1163
+ cursor: pointer;
1164
+ accent-color: #4f46e5;
1165
+ background: #e2e8f0;
1166
+ }
1167
+
1168
+ .theme-dark .recipe-range {
1169
+ background: #334155;
1170
+ }
1171
+
1172
+ .recipe-number-wrap {
1173
+ position: relative;
1174
+ width: 5rem;
1175
+ }
1176
+
1177
+ .recipe-number {
1178
+ width: 100%;
1179
+ background: #f8fafc;
1180
+ border: 1px solid #e2e8f0;
1181
+ border-radius: 0.5rem;
1182
+ padding: 0.25rem 0.5rem;
1183
+ text-align: right;
1184
+ font-weight: 700;
1185
+ color: #334155;
1186
+ font-size: 0.875rem;
1187
+ box-sizing: border-box;
1188
+ }
1189
+
1190
+ .theme-dark .recipe-number {
1191
+ background: #1e293b;
1192
+ border-color: #334155;
1193
+ color: #e2e8f0;
1194
+ }
1195
+
1196
+ .text-indigo-400 {
1197
+ color: #818cf8;
1198
+ }
1199
+
1200
+ .text-amber-400 {
1201
+ color: #fbbf24;
1202
+ }
1203
+
1204
+ .text-red-500 {
1205
+ color: #ef4444;
1206
+ }
1207
+
1208
+ .text-lime-400 {
1209
+ color: #a3e635;
1210
+ }
1211
+
1212
+ .text-emerald-400 {
1213
+ color: #34d399;
1214
+ }
1215
+
1216
+ .text-yellow-400 {
1217
+ color: #facc15;
1218
+ }