@jjlmoya/utils-cooking 1.2.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 (130) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +24 -0
  3. package/src/category/i18n/es.ts +208 -0
  4. package/src/category/i18n/fr.ts +24 -0
  5. package/src/category/index.ts +37 -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 +32 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +251 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +19 -0
  17. package/src/tests/i18n-titles.test.ts +66 -0
  18. package/src/tests/locale_completeness.test.ts +42 -0
  19. package/src/tests/mocks/astro_mock.js +2 -0
  20. package/src/tests/no_h1_in_components.test.ts +48 -0
  21. package/src/tests/seo_length.test.ts +22 -0
  22. package/src/tests/tool_validation.test.ts +17 -0
  23. package/src/tool/american-kitchen-converter/AmericanKitchenEngine.ts +259 -0
  24. package/src/tool/american-kitchen-converter/bibliography.astro +6 -0
  25. package/src/tool/american-kitchen-converter/component.astro +838 -0
  26. package/src/tool/american-kitchen-converter/i18n/en.ts +282 -0
  27. package/src/tool/american-kitchen-converter/i18n/es.ts +281 -0
  28. package/src/tool/american-kitchen-converter/i18n/fr.ts +292 -0
  29. package/src/tool/american-kitchen-converter/index.ts +24 -0
  30. package/src/tool/american-kitchen-converter/seo.astro +8 -0
  31. package/src/tool/banana-ripeness/BananaCare.css +587 -0
  32. package/src/tool/banana-ripeness/BananaEngine.ts +79 -0
  33. package/src/tool/banana-ripeness/bibliography.astro +6 -0
  34. package/src/tool/banana-ripeness/component.astro +285 -0
  35. package/src/tool/banana-ripeness/i18n/en.ts +177 -0
  36. package/src/tool/banana-ripeness/i18n/es.ts +177 -0
  37. package/src/tool/banana-ripeness/i18n/fr.ts +177 -0
  38. package/src/tool/banana-ripeness/index.ts +24 -0
  39. package/src/tool/banana-ripeness/seo.astro +8 -0
  40. package/src/tool/brine/bibliography.astro +6 -0
  41. package/src/tool/brine/component.astro +884 -0
  42. package/src/tool/brine/i18n/en.ts +221 -0
  43. package/src/tool/brine/i18n/es.ts +222 -0
  44. package/src/tool/brine/i18n/fr.ts +221 -0
  45. package/src/tool/brine/index.ts +26 -0
  46. package/src/tool/brine/seo.astro +8 -0
  47. package/src/tool/cookware-guide/CookwareGuide.css +487 -0
  48. package/src/tool/cookware-guide/bibliography.astro +6 -0
  49. package/src/tool/cookware-guide/component.astro +164 -0
  50. package/src/tool/cookware-guide/i18n/en.ts +163 -0
  51. package/src/tool/cookware-guide/i18n/es.ts +163 -0
  52. package/src/tool/cookware-guide/i18n/fr.ts +164 -0
  53. package/src/tool/cookware-guide/index.ts +24 -0
  54. package/src/tool/cookware-guide/init.ts +174 -0
  55. package/src/tool/cookware-guide/seo.astro +8 -0
  56. package/src/tool/egg-timer/EggTimer.css +503 -0
  57. package/src/tool/egg-timer/bibliography.astro +14 -0
  58. package/src/tool/egg-timer/component.astro +281 -0
  59. package/src/tool/egg-timer/i18n/en.ts +230 -0
  60. package/src/tool/egg-timer/i18n/es.ts +222 -0
  61. package/src/tool/egg-timer/i18n/fr.ts +121 -0
  62. package/src/tool/egg-timer/index.ts +27 -0
  63. package/src/tool/egg-timer/seo.astro +39 -0
  64. package/src/tool/ingredient-rescaler/IngredientRescaler.css +308 -0
  65. package/src/tool/ingredient-rescaler/bibliography.astro +6 -0
  66. package/src/tool/ingredient-rescaler/component.astro +107 -0
  67. package/src/tool/ingredient-rescaler/i18n/en.ts +265 -0
  68. package/src/tool/ingredient-rescaler/i18n/es.ts +268 -0
  69. package/src/tool/ingredient-rescaler/i18n/fr.ts +207 -0
  70. package/src/tool/ingredient-rescaler/index.ts +24 -0
  71. package/src/tool/ingredient-rescaler/init.ts +200 -0
  72. package/src/tool/ingredient-rescaler/seo.astro +8 -0
  73. package/src/tool/kitchen-timer/KitchenTimer.css +325 -0
  74. package/src/tool/kitchen-timer/bibliography.astro +6 -0
  75. package/src/tool/kitchen-timer/component.astro +341 -0
  76. package/src/tool/kitchen-timer/i18n/en.ts +154 -0
  77. package/src/tool/kitchen-timer/i18n/es.ts +154 -0
  78. package/src/tool/kitchen-timer/i18n/fr.ts +154 -0
  79. package/src/tool/kitchen-timer/index.ts +26 -0
  80. package/src/tool/kitchen-timer/init.ts +55 -0
  81. package/src/tool/kitchen-timer/lib/AudioHelper.ts +27 -0
  82. package/src/tool/kitchen-timer/lib/DockManager.ts +97 -0
  83. package/src/tool/kitchen-timer/lib/KitchenTimer.ts +264 -0
  84. package/src/tool/kitchen-timer/seo.astro +8 -0
  85. package/src/tool/meringue-peak/MeringueCalculator.css +298 -0
  86. package/src/tool/meringue-peak/bibliography.astro +6 -0
  87. package/src/tool/meringue-peak/component.astro +169 -0
  88. package/src/tool/meringue-peak/i18n/en.ts +257 -0
  89. package/src/tool/meringue-peak/i18n/es.ts +234 -0
  90. package/src/tool/meringue-peak/i18n/fr.ts +234 -0
  91. package/src/tool/meringue-peak/index.ts +24 -0
  92. package/src/tool/meringue-peak/seo.astro +8 -0
  93. package/src/tool/mold-scaler/MoldScaler.css +406 -0
  94. package/src/tool/mold-scaler/bibliography.astro +6 -0
  95. package/src/tool/mold-scaler/component.astro +126 -0
  96. package/src/tool/mold-scaler/i18n/en.ts +268 -0
  97. package/src/tool/mold-scaler/i18n/es.ts +269 -0
  98. package/src/tool/mold-scaler/i18n/fr.ts +276 -0
  99. package/src/tool/mold-scaler/index.ts +26 -0
  100. package/src/tool/mold-scaler/init.ts +264 -0
  101. package/src/tool/mold-scaler/seo.astro +8 -0
  102. package/src/tool/pizza/Pizza.css +569 -0
  103. package/src/tool/pizza/bibliography.astro +6 -0
  104. package/src/tool/pizza/calculator.ts +143 -0
  105. package/src/tool/pizza/component.astro +237 -0
  106. package/src/tool/pizza/i18n/en.ts +288 -0
  107. package/src/tool/pizza/i18n/es.ts +289 -0
  108. package/src/tool/pizza/i18n/fr.ts +288 -0
  109. package/src/tool/pizza/index.ts +27 -0
  110. package/src/tool/pizza/seo.astro +8 -0
  111. package/src/tool/roux-guide/RouxGuide.css +483 -0
  112. package/src/tool/roux-guide/bibliography.astro +6 -0
  113. package/src/tool/roux-guide/component.astro +194 -0
  114. package/src/tool/roux-guide/i18n/en.ts +233 -0
  115. package/src/tool/roux-guide/i18n/es.ts +225 -0
  116. package/src/tool/roux-guide/i18n/fr.ts +225 -0
  117. package/src/tool/roux-guide/index.ts +24 -0
  118. package/src/tool/roux-guide/init.ts +187 -0
  119. package/src/tool/roux-guide/seo.astro +8 -0
  120. package/src/tool/sourdough-calculator/SourdoughCalculator.css +369 -0
  121. package/src/tool/sourdough-calculator/bibliography.astro +6 -0
  122. package/src/tool/sourdough-calculator/component.astro +198 -0
  123. package/src/tool/sourdough-calculator/i18n/en.ts +242 -0
  124. package/src/tool/sourdough-calculator/i18n/es.ts +243 -0
  125. package/src/tool/sourdough-calculator/i18n/fr.ts +248 -0
  126. package/src/tool/sourdough-calculator/index.ts +24 -0
  127. package/src/tool/sourdough-calculator/init.ts +131 -0
  128. package/src/tool/sourdough-calculator/seo.astro +8 -0
  129. package/src/tools.ts +29 -0
  130. package/src/types.ts +73 -0
@@ -0,0 +1,8 @@
1
+ ---
2
+ import { SEORenderer } from "@jjlmoya/utils-shared";
3
+ import { content } from "./i18n/es";
4
+
5
+ const locale = "es";
6
+ ---
7
+
8
+ <SEORenderer content={{ sections: content.seo, locale }} />
@@ -0,0 +1,487 @@
1
+ :root {
2
+ --cw-primary: hsl(240deg, 94%, 60%);
3
+ --cw-primary-light: hsl(240deg, 100%, 95%);
4
+ --cw-primary-dark: hsl(240deg, 50%, 25%);
5
+ --cw-bg-card: hsl(0deg, 0%, 100%);
6
+ --cw-bg-dark: hsl(217deg, 33%, 17%);
7
+ --cw-bg-app: hsl(210deg, 40%, 98%);
8
+ --cw-border: hsl(210deg, 14%, 89%);
9
+ --cw-text-main: hsl(210deg, 40%, 14%);
10
+ --cw-text-muted: hsl(210deg, 8%, 40%);
11
+ --cw-text-light: hsl(0deg, 0%, 100%);
12
+ --cw-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06);
13
+ --cw-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
14
+ --cw-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
15
+ --cw-radius: 1.5rem;
16
+ --cw-radius-sm: 0.75rem;
17
+ --cw-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
18
+ --cw-orange: hsl(33deg, 100%, 50%);
19
+ --cw-yellow: hsl(45deg, 100%, 50%);
20
+ --cw-red: hsl(0deg, 100%, 50%);
21
+ --cw-blue: hsl(217deg, 100%, 50%);
22
+ --cw-green: hsl(142deg, 76%, 36%);
23
+ }
24
+
25
+ .theme-dark {
26
+ --cw-bg-card: hsl(217deg, 33%, 12%);
27
+ --cw-bg-app: hsl(217deg, 39%, 8%);
28
+ --cw-border: hsl(217deg, 33%, 25%);
29
+ --cw-text-main: hsl(210deg, 40%, 98%);
30
+ --cw-text-muted: hsl(210deg, 14%, 55%);
31
+ --cw-primary-light: hsl(240deg, 100%, 12%);
32
+ }
33
+
34
+ .cw-container {
35
+ width: 100%;
36
+ max-width: 100%;
37
+ padding: 1rem;
38
+ }
39
+
40
+ .cw-card {
41
+ background: var(--cw-bg-card);
42
+ border: 1px solid var(--cw-border);
43
+ border-radius: var(--cw-radius);
44
+ box-shadow: var(--cw-shadow-xl);
45
+ overflow: hidden;
46
+ transition: var(--cw-transition);
47
+ }
48
+
49
+ .cw-progress-bar {
50
+ height: 0.375rem;
51
+ width: 0%;
52
+ background: linear-gradient(to right, var(--cw-primary), hsl(270deg, 94%, 60%));
53
+ transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
54
+ }
55
+
56
+ .cw-content {
57
+ padding: 2rem;
58
+ }
59
+
60
+ @media (max-width: 1024px) {
61
+ .cw-content {
62
+ padding: 1.5rem;
63
+ }
64
+ }
65
+
66
+ @media (max-width: 640px) {
67
+ .cw-content {
68
+ padding: 1rem;
69
+ }
70
+ }
71
+
72
+ .cw-grid {
73
+ display: grid;
74
+ grid-template-columns: 1fr;
75
+ gap: 2rem;
76
+ }
77
+
78
+ @media (min-width: 1024px) {
79
+ .cw-grid {
80
+ grid-template-columns: 1.4fr 1fr;
81
+ gap: 2rem;
82
+ }
83
+ }
84
+
85
+ .cw-left {
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 2rem;
89
+ }
90
+
91
+ .cw-right {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 1.5rem;
95
+ }
96
+
97
+ .cw-section {
98
+ display: flex;
99
+ flex-direction: column;
100
+ gap: 1rem;
101
+ }
102
+
103
+ .cw-step-label {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 0.75rem;
107
+ font-size: 0.625rem;
108
+ font-weight: 900;
109
+ color: var(--cw-text-muted);
110
+ text-transform: uppercase;
111
+ letter-spacing: 0.2em;
112
+ }
113
+
114
+ .cw-step-number {
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ width: 1.25rem;
119
+ height: 1.25rem;
120
+ border-radius: 50%;
121
+ background: var(--cw-primary-light);
122
+ color: var(--cw-primary);
123
+ font-weight: 900;
124
+ font-size: 0.625rem;
125
+ flex-shrink: 0;
126
+ }
127
+
128
+ .theme-dark .cw-step-number {
129
+ background: hsl(240deg, 100%, 20%);
130
+ }
131
+
132
+ /* Style Grid (4 buttons in 2x2) */
133
+ .cw-style-grid {
134
+ display: grid;
135
+ grid-template-columns: repeat(2, 1fr);
136
+ gap: 0.75rem;
137
+ }
138
+
139
+ @media (min-width: 640px) {
140
+ .cw-style-grid {
141
+ grid-template-columns: repeat(2, 1fr);
142
+ }
143
+ }
144
+
145
+ .cw-style-btn {
146
+ display: flex;
147
+ flex-direction: column;
148
+ align-items: flex-start;
149
+ gap: 0.5rem;
150
+ padding: 1rem;
151
+ border: 2px solid var(--cw-border);
152
+ border-radius: var(--cw-radius-sm);
153
+ background: var(--cw-bg-card);
154
+ color: var(--cw-text-muted);
155
+ cursor: pointer;
156
+ transition: var(--cw-transition);
157
+ text-align: left;
158
+ font-size: inherit;
159
+ }
160
+
161
+ .cw-style-btn:hover {
162
+ border-color: var(--cw-primary-light);
163
+ box-shadow: var(--cw-shadow-md);
164
+ }
165
+
166
+ .cw-style-btn.active {
167
+ background: var(--cw-primary-light);
168
+ border-color: var(--cw-primary);
169
+ color: var(--cw-primary);
170
+ }
171
+
172
+ .theme-dark .cw-style-btn.active {
173
+ background: hsl(240deg, 100%, 20%);
174
+ }
175
+
176
+ .cw-icon {
177
+ width: 1.5rem;
178
+ height: 1.5rem;
179
+ }
180
+
181
+ .cw-icon-orange {
182
+ color: var(--cw-orange);
183
+ }
184
+
185
+ .cw-icon-yellow {
186
+ color: var(--cw-yellow);
187
+ }
188
+
189
+ .cw-icon-red {
190
+ color: var(--cw-red);
191
+ }
192
+
193
+ .cw-icon-blue {
194
+ color: var(--cw-blue);
195
+ }
196
+
197
+ .cw-icon-large {
198
+ width: 6rem;
199
+ height: 6rem;
200
+ color: var(--cw-text-light);
201
+ }
202
+
203
+ .cw-style-name {
204
+ font-size: 0.75rem;
205
+ font-weight: 900;
206
+ display: block;
207
+ color: var(--cw-text-main);
208
+ }
209
+
210
+ .cw-style-btn.active .cw-style-name {
211
+ color: var(--cw-primary);
212
+ }
213
+
214
+ .cw-style-desc {
215
+ font-weight: 600;
216
+ opacity: 0.7;
217
+ display: block;
218
+ text-transform: uppercase;
219
+ }
220
+
221
+ /* Maintenance Grid (3 buttons) */
222
+ .cw-maint-grid {
223
+ display: grid;
224
+ grid-template-columns: 1fr;
225
+ gap: 0.75rem;
226
+ }
227
+
228
+ @media (min-width: 640px) {
229
+ .cw-maint-grid {
230
+ grid-template-columns: repeat(3, 1fr);
231
+ }
232
+ }
233
+
234
+ .cw-maint-btn {
235
+ display: flex;
236
+ flex-direction: column;
237
+ align-items: center;
238
+ text-align: center;
239
+ gap: 0.75rem;
240
+ padding: 1.25rem;
241
+ border: 2px solid var(--cw-border);
242
+ border-radius: var(--cw-radius-sm);
243
+ background: var(--cw-bg-card);
244
+ color: var(--cw-text-muted);
245
+ cursor: pointer;
246
+ transition: var(--cw-transition);
247
+ font-size: inherit;
248
+ }
249
+
250
+ .cw-maint-btn:hover {
251
+ border-color: var(--cw-primary-light);
252
+ box-shadow: var(--cw-shadow-md);
253
+ }
254
+
255
+ .cw-maint-btn.active {
256
+ background: var(--cw-primary-light);
257
+ border-color: var(--cw-primary);
258
+ }
259
+
260
+ .theme-dark .cw-maint-btn.active {
261
+ background: hsl(240deg, 100%, 20%);
262
+ }
263
+
264
+ .cw-maint-icon {
265
+ width: 3rem;
266
+ height: 3rem;
267
+ border-radius: var(--cw-radius-sm);
268
+ background: var(--cw-bg-app);
269
+ display: flex;
270
+ align-items: center;
271
+ justify-content: center;
272
+ color: var(--cw-text-muted);
273
+ transition: var(--cw-transition);
274
+ }
275
+
276
+ .cw-maint-btn.active .cw-maint-icon {
277
+ color: var(--cw-primary);
278
+ }
279
+
280
+ .cw-maint-btn:hover .cw-maint-icon {
281
+ color: var(--cw-primary);
282
+ }
283
+
284
+ .cw-maint-name {
285
+ font-size: 0.75rem;
286
+ font-weight: 900;
287
+ display: block;
288
+ color: var(--cw-text-main);
289
+ }
290
+
291
+ .cw-maint-btn.active .cw-maint-name {
292
+ color: var(--cw-primary);
293
+ }
294
+
295
+ .cw-maint-desc {
296
+ font-size: 0.625rem;
297
+ font-weight: 500;
298
+ opacity: 0.7;
299
+ display: block;
300
+ line-height: 1.3;
301
+ }
302
+
303
+ /* Result Card */
304
+ .cw-result-card {
305
+ background: var(--cw-bg-dark);
306
+ border-radius: var(--cw-radius);
307
+ padding: 2rem;
308
+ color: var(--cw-text-light);
309
+ box-shadow: var(--cw-shadow-xl);
310
+ position: relative;
311
+ overflow: hidden;
312
+ min-height: 320px;
313
+ display: flex;
314
+ flex-direction: column;
315
+ justify-content: center;
316
+ transition: var(--cw-transition);
317
+ }
318
+
319
+ .cw-card-bg {
320
+ position: absolute;
321
+ inset: 0;
322
+ background: linear-gradient(135deg, hsl(217deg, 33%, 17%), hsl(217deg, 33%, 7%));
323
+ transition: background 1s cubic-bezier(0.4, 0, 0.2, 1);
324
+ }
325
+
326
+ .cw-card-glow {
327
+ position: absolute;
328
+ right: -3rem;
329
+ top: -3rem;
330
+ width: 12rem;
331
+ height: 12rem;
332
+ background: rgba(255, 255, 255, 0.1);
333
+ border-radius: 50%;
334
+ filter: blur(3rem);
335
+ transition: transform 0.7s cubic-bezier(0.4, 0, 0.2, 1);
336
+ }
337
+
338
+ .cw-result-card:hover .cw-card-glow {
339
+ transform: scale(1.25);
340
+ }
341
+
342
+ .cw-card-content {
343
+ position: relative;
344
+ z-index: 10;
345
+ display: flex;
346
+ flex-direction: column;
347
+ gap: 1.5rem;
348
+ text-align: center;
349
+ }
350
+
351
+ .cw-icon-container {
352
+ display: flex;
353
+ justify-content: center;
354
+ align-items: center;
355
+ height: 6rem;
356
+ }
357
+
358
+ .cw-result-icon {
359
+ display: none;
360
+ }
361
+
362
+ .cw-result-icon:not(.cw-hidden) {
363
+ display: block;
364
+ }
365
+
366
+ .cw-result-label {
367
+ font-size: 0.625rem;
368
+ font-weight: 900;
369
+ text-transform: uppercase;
370
+ letter-spacing: 0.3em;
371
+ color: rgba(255, 255, 255, 0.4);
372
+ margin-bottom: 0.5rem;
373
+ }
374
+
375
+ .cw-result-name {
376
+ font-size: 1.875rem;
377
+ font-weight: 900;
378
+ letter-spacing: -0.02em;
379
+ margin: 0;
380
+ }
381
+
382
+ .cw-result-tag {
383
+ font-size: 0.75rem;
384
+ font-weight: 500;
385
+ color: rgba(255, 255, 255, 0.6);
386
+ margin: 0;
387
+ }
388
+
389
+ .cw-result-details {
390
+ display: none;
391
+ grid-template-columns: 1fr 1fr;
392
+ gap: 0.75rem;
393
+ padding-top: 1rem;
394
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
395
+ }
396
+
397
+ .cw-result-details:not(.cw-hidden) {
398
+ display: grid;
399
+ }
400
+
401
+ .cw-detail-box {
402
+ background: rgba(255, 255, 255, 0.05);
403
+ border: 1px solid rgba(255, 255, 255, 0.05);
404
+ border-radius: var(--cw-radius-sm);
405
+ padding: 0.75rem;
406
+ }
407
+
408
+ .cw-detail-pro .cw-detail-label {
409
+ color: hsl(142deg, 76%, 56%);
410
+ }
411
+
412
+ .cw-detail-con .cw-detail-label {
413
+ color: hsl(0deg, 84%, 60%);
414
+ }
415
+
416
+ .cw-detail-label {
417
+ font-size: 0.5rem;
418
+ font-weight: 900;
419
+ text-transform: uppercase;
420
+ letter-spacing: 0.1em;
421
+ display: block;
422
+ margin-bottom: 0.25rem;
423
+ }
424
+
425
+ .cw-detail-text {
426
+ font-size: 0.625rem;
427
+ line-height: 1.4;
428
+ color: rgba(255, 255, 255, 0.9);
429
+ margin: 0;
430
+ }
431
+
432
+ /* Tip Card */
433
+ .cw-tip-card {
434
+ background: var(--cw-bg-app);
435
+ border: 1px solid var(--cw-border);
436
+ border-radius: var(--cw-radius);
437
+ padding: 1.5rem;
438
+ display: flex;
439
+ flex-direction: column;
440
+ gap: 1rem;
441
+ }
442
+
443
+ .cw-tip-header {
444
+ display: flex;
445
+ align-items: center;
446
+ gap: 0.75rem;
447
+ }
448
+
449
+ .cw-tip-icon {
450
+ padding: 0.5rem;
451
+ background: var(--cw-primary-light);
452
+ border-radius: var(--cw-radius-sm);
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ color: var(--cw-primary);
457
+ flex-shrink: 0;
458
+ }
459
+
460
+ .theme-dark .cw-tip-icon {
461
+ background: hsl(240deg, 100%, 20%);
462
+ }
463
+
464
+ .cw-tip-title {
465
+ font-size: 0.875rem;
466
+ font-weight: 900;
467
+ color: var(--cw-text-main);
468
+ text-transform: uppercase;
469
+ letter-spacing: 0.05em;
470
+ }
471
+
472
+ .cw-tip-text {
473
+ font-size: 0.6875rem;
474
+ line-height: 1.6;
475
+ color: var(--cw-text-muted);
476
+ font-weight: 300;
477
+ font-style: italic;
478
+ background: var(--cw-bg-card);
479
+ padding: 1rem;
480
+ border-radius: var(--cw-radius-sm);
481
+ border: 1px solid var(--cw-border);
482
+ margin: 0;
483
+ }
484
+
485
+ .cw-hidden {
486
+ display: none;
487
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ import { Bibliography as BibliographyComponent } from '@jjlmoya/utils-shared';
3
+ import { content } from './i18n/es';
4
+ ---
5
+
6
+ <BibliographyComponent links={content.bibliography} />
@@ -0,0 +1,164 @@
1
+ ---
2
+ import { Icon } from 'astro-icon/components';
3
+ import './CookwareGuide.css';
4
+
5
+ interface Props {
6
+ ui: Record<string, string>;
7
+ }
8
+
9
+ const { ui } = Astro.props;
10
+ ---
11
+
12
+ <div class="cw-container" id="cookware-selector">
13
+ <div class="cw-card">
14
+ <div class="cw-progress-bar" id="progress-bar" style="width: 0%"></div>
15
+
16
+ <div class="cw-content">
17
+ <div class="cw-grid">
18
+ <div class="cw-left">
19
+ <div class="cw-section">
20
+ <label class="cw-step-label">
21
+ <span class="cw-step-number">1</span>
22
+ {ui.step1}
23
+ </label>
24
+
25
+ <div class="cw-style-grid">
26
+ <button class="cw-style-btn style-btn" data-value="sear">
27
+ <Icon name="mdi:fire" class="cw-icon cw-icon-orange" />
28
+ <span class="cw-style-name">{ui.highHeat}</span>
29
+ <span class="cw-style-desc">{ui.sear}</span>
30
+ </button>
31
+
32
+ <button class="cw-style-btn style-btn" data-value="delicate">
33
+ <Icon name="mdi:egg-fried" class="cw-icon cw-icon-yellow" />
34
+ <span class="cw-style-name">{ui.delicate}</span>
35
+ <span class="cw-style-desc">{ui.fry}</span>
36
+ </button>
37
+
38
+ <button class="cw-style-btn style-btn" data-value="stew">
39
+ <Icon name="mdi:pot-mix" class="cw-icon cw-icon-red" />
40
+ <span class="cw-style-name">{ui.stew}</span>
41
+ <span class="cw-style-desc">{ui.slowCook}</span>
42
+ </button>
43
+
44
+ <button class="cw-style-btn style-btn" data-value="fast">
45
+ <Icon name="mdi:flash" class="cw-icon cw-icon-blue" />
46
+ <span class="cw-style-name">{ui.fast}</span>
47
+ <span class="cw-style-desc">{ui.quick}</span>
48
+ </button>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="cw-section">
53
+ <label class="cw-step-label">
54
+ <span class="cw-step-number">2</span>
55
+ {ui.step2}
56
+ </label>
57
+
58
+ <div class="cw-maint-grid">
59
+ <button class="cw-maint-btn maint-btn" data-value="lazy">
60
+ <div class="cw-maint-icon">
61
+ <Icon name="mdi:dishwasher" class="cw-icon" />
62
+ </div>
63
+ <span class="cw-maint-name">{ui.maintenanceLazy}</span>
64
+ <span class="cw-maint-desc">{ui.maintenanceLazyDesc}</span>
65
+ </button>
66
+
67
+ <button class="cw-maint-btn maint-btn" data-value="care">
68
+ <div class="cw-maint-icon">
69
+ <Icon name="mdi:hand-water" class="cw-icon" />
70
+ </div>
71
+ <span class="cw-maint-name">{ui.maintenanceCare}</span>
72
+ <span class="cw-maint-desc">{ui.maintenanceCareDesc}</span>
73
+ </button>
74
+
75
+ <button class="cw-maint-btn maint-btn" data-value="ritual">
76
+ <div class="cw-maint-icon">
77
+ <Icon name="mdi:diamond-stone" class="cw-icon" />
78
+ </div>
79
+ <span class="cw-maint-name">{ui.maintenanceRitual}</span>
80
+ <span class="cw-maint-desc">{ui.maintenanceRitualDesc}</span>
81
+ </button>
82
+ </div>
83
+ </div>
84
+ </div>
85
+
86
+ <div class="cw-right">
87
+ <div class="cw-result-card" id="final-card">
88
+ <div class="cw-card-bg" id="card-grad"></div>
89
+ <div class="cw-card-glow"></div>
90
+
91
+ <div class="cw-card-content">
92
+ <div class="cw-icon-container" id="res-icon-container">
93
+ <div id="icon-placeholder" class="cw-result-icon">
94
+ <Icon name="mdi:chef-hat" class="cw-icon cw-icon-large" />
95
+ </div>
96
+ <div id="icon-stainless" class="cw-result-icon cw-hidden">
97
+ <Icon name="mdi:shield-star-outline" class="cw-icon cw-icon-large" />
98
+ </div>
99
+ <div id="icon-nonstick" class="cw-result-icon cw-hidden">
100
+ <Icon name="mdi:feather" class="cw-icon cw-icon-large" />
101
+ </div>
102
+ <div id="icon-castiron" class="cw-result-icon cw-hidden">
103
+ <Icon name="mdi:weight-kilogram" class="cw-icon cw-icon-large" />
104
+ </div>
105
+ <div id="icon-carbon" class="cw-result-icon cw-hidden">
106
+ <Icon name="mdi:chef-hat" class="cw-icon cw-icon-large" />
107
+ </div>
108
+ <div id="icon-enameled" class="cw-result-icon cw-hidden">
109
+ <Icon name="mdi:pot" class="cw-icon cw-icon-large" />
110
+ </div>
111
+ </div>
112
+
113
+ <span class="cw-result-label">{ui.idealPan}</span>
114
+ <h3 class="cw-result-name" id="res-name">{ui.selectOptions}</h3>
115
+ <p class="cw-result-tag" id="res-tag">{ui.seeRecommendation}</p>
116
+
117
+ <div class="cw-result-details cw-hidden" id="res-details">
118
+ <div class="cw-detail-box cw-detail-pro">
119
+ <span class="cw-detail-label">{ui.pro}</span>
120
+ <p class="cw-detail-text" id="res-pros">-</p>
121
+ </div>
122
+ <div class="cw-detail-box cw-detail-con">
123
+ <span class="cw-detail-label">{ui.con}</span>
124
+ <p class="cw-detail-text" id="res-cons">-</p>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </div>
129
+
130
+ <div class="cw-tip-card">
131
+ <div class="cw-tip-header">
132
+ <div class="cw-tip-icon">
133
+ <Icon name="mdi:lightbulb-on-outline" class="cw-icon" />
134
+ </div>
135
+ <span class="cw-tip-title">{ui.masterTip}</span>
136
+ </div>
137
+ <p class="cw-tip-text" id="res-tip">
138
+ "{ui.defaultTip}"
139
+ </p>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ </div>
146
+
147
+ <script>
148
+ import { initCookwareGuide } from './init';
149
+ window.__initCookwareGuide = initCookwareGuide;
150
+ </script>
151
+
152
+ <script define:vars={{ ui }} is:inline>
153
+ const init = () => {
154
+ if (window.__initCookwareGuide) {
155
+ window.__initCookwareGuide(ui);
156
+ }
157
+ };
158
+
159
+ if (document.readyState === 'loading') {
160
+ document.addEventListener('DOMContentLoaded', init);
161
+ } else {
162
+ init();
163
+ }
164
+ </script>