@jjlmoya/utils-cooking 1.23.0 → 1.25.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 (252) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +3 -1
  3. package/src/index.ts +1 -0
  4. package/src/pages/[locale]/[slug].astro +56 -19
  5. package/src/tests/i18n-titles.test.ts +5 -17
  6. package/src/tests/locale_completeness.test.ts +2 -13
  7. package/src/tests/shared-test-helpers.ts +56 -0
  8. package/src/tests/tool_exports.test.ts +34 -0
  9. package/src/tests/tool_validation.test.ts +2 -2
  10. package/src/tool/american-kitchen-converter/bibliography.astro +3 -3
  11. package/src/tool/american-kitchen-converter/bibliography.ts +10 -0
  12. package/src/tool/american-kitchen-converter/i18n/de.ts +2 -11
  13. package/src/tool/american-kitchen-converter/i18n/en.ts +2 -11
  14. package/src/tool/american-kitchen-converter/i18n/es.ts +40 -49
  15. package/src/tool/american-kitchen-converter/i18n/fr.ts +2 -21
  16. package/src/tool/american-kitchen-converter/i18n/id.ts +2 -11
  17. package/src/tool/american-kitchen-converter/i18n/it.ts +2 -11
  18. package/src/tool/american-kitchen-converter/i18n/ja.ts +2 -11
  19. package/src/tool/american-kitchen-converter/i18n/ko.ts +2 -11
  20. package/src/tool/american-kitchen-converter/i18n/nl.ts +2 -11
  21. package/src/tool/american-kitchen-converter/i18n/pl.ts +2 -11
  22. package/src/tool/american-kitchen-converter/i18n/pt.ts +2 -11
  23. package/src/tool/american-kitchen-converter/i18n/ru.ts +2 -11
  24. package/src/tool/american-kitchen-converter/i18n/sv.ts +2 -11
  25. package/src/tool/american-kitchen-converter/i18n/tr.ts +2 -11
  26. package/src/tool/american-kitchen-converter/i18n/zh.ts +2 -11
  27. package/src/tool/american-kitchen-converter/seo.astro +11 -4
  28. package/src/tool/banana-ripeness/bibliography.astro +3 -3
  29. package/src/tool/banana-ripeness/bibliography.ts +10 -0
  30. package/src/tool/banana-ripeness/i18n/de.ts +2 -15
  31. package/src/tool/banana-ripeness/i18n/en.ts +36 -49
  32. package/src/tool/banana-ripeness/i18n/es.ts +36 -49
  33. package/src/tool/banana-ripeness/i18n/fr.ts +36 -49
  34. package/src/tool/banana-ripeness/i18n/id.ts +2 -15
  35. package/src/tool/banana-ripeness/i18n/it.ts +2 -15
  36. package/src/tool/banana-ripeness/i18n/ja.ts +2 -15
  37. package/src/tool/banana-ripeness/i18n/ko.ts +2 -15
  38. package/src/tool/banana-ripeness/i18n/nl.ts +2 -15
  39. package/src/tool/banana-ripeness/i18n/pl.ts +2 -15
  40. package/src/tool/banana-ripeness/i18n/pt.ts +2 -15
  41. package/src/tool/banana-ripeness/i18n/ru.ts +2 -15
  42. package/src/tool/banana-ripeness/i18n/sv.ts +2 -15
  43. package/src/tool/banana-ripeness/i18n/tr.ts +2 -15
  44. package/src/tool/banana-ripeness/i18n/zh.ts +2 -15
  45. package/src/tool/banana-ripeness/seo.astro +10 -3
  46. package/src/tool/brine/bibliography.astro +3 -3
  47. package/src/tool/brine/bibliography.ts +6 -0
  48. package/src/tool/brine/i18n/de.ts +4 -19
  49. package/src/tool/brine/i18n/en.ts +3 -17
  50. package/src/tool/brine/i18n/es.ts +4 -19
  51. package/src/tool/brine/i18n/fr.ts +3 -17
  52. package/src/tool/brine/i18n/id.ts +4 -19
  53. package/src/tool/brine/i18n/it.ts +4 -19
  54. package/src/tool/brine/i18n/ja.ts +4 -19
  55. package/src/tool/brine/i18n/ko.ts +4 -19
  56. package/src/tool/brine/i18n/nl.ts +4 -19
  57. package/src/tool/brine/i18n/pl.ts +4 -19
  58. package/src/tool/brine/i18n/pt.ts +4 -19
  59. package/src/tool/brine/i18n/ru.ts +4 -19
  60. package/src/tool/brine/i18n/sv.ts +4 -19
  61. package/src/tool/brine/i18n/tr.ts +4 -19
  62. package/src/tool/brine/i18n/zh.ts +4 -19
  63. package/src/tool/brine/seo.astro +11 -4
  64. package/src/tool/cookware-guide/bibliography.astro +2 -2
  65. package/src/tool/cookware-guide/bibliography.ts +10 -0
  66. package/src/tool/cookware-guide/cookware-selector.css +470 -19
  67. package/src/tool/cookware-guide/i18n/de.ts +3 -17
  68. package/src/tool/cookware-guide/i18n/en.ts +3 -17
  69. package/src/tool/cookware-guide/i18n/es.ts +3 -17
  70. package/src/tool/cookware-guide/i18n/fr.ts +3 -17
  71. package/src/tool/cookware-guide/i18n/id.ts +3 -17
  72. package/src/tool/cookware-guide/i18n/it.ts +3 -17
  73. package/src/tool/cookware-guide/i18n/ja.ts +3 -17
  74. package/src/tool/cookware-guide/i18n/ko.ts +3 -17
  75. package/src/tool/cookware-guide/i18n/nl.ts +3 -17
  76. package/src/tool/cookware-guide/i18n/pl.ts +3 -17
  77. package/src/tool/cookware-guide/i18n/pt.ts +3 -17
  78. package/src/tool/cookware-guide/i18n/ru.ts +3 -17
  79. package/src/tool/cookware-guide/i18n/sv.ts +3 -17
  80. package/src/tool/cookware-guide/i18n/tr.ts +3 -17
  81. package/src/tool/cookware-guide/i18n/zh.ts +3 -17
  82. package/src/tool/cookware-guide/seo.astro +11 -4
  83. package/src/tool/egg-timer/bibliography.astro +3 -11
  84. package/src/tool/egg-timer/bibliography.ts +10 -0
  85. package/src/tool/egg-timer/i18n/de.ts +3 -17
  86. package/src/tool/egg-timer/i18n/en.ts +2 -15
  87. package/src/tool/egg-timer/i18n/es.ts +127 -141
  88. package/src/tool/egg-timer/i18n/fr.ts +2 -15
  89. package/src/tool/egg-timer/i18n/id.ts +4 -18
  90. package/src/tool/egg-timer/i18n/it.ts +3 -17
  91. package/src/tool/egg-timer/i18n/ja.ts +3 -17
  92. package/src/tool/egg-timer/i18n/ko.ts +3 -17
  93. package/src/tool/egg-timer/i18n/nl.ts +3 -17
  94. package/src/tool/egg-timer/i18n/pl.ts +3 -17
  95. package/src/tool/egg-timer/i18n/pt.ts +3 -17
  96. package/src/tool/egg-timer/i18n/ru.ts +3 -17
  97. package/src/tool/egg-timer/i18n/sv.ts +3 -17
  98. package/src/tool/egg-timer/i18n/tr.ts +3 -17
  99. package/src/tool/egg-timer/i18n/zh.ts +3 -17
  100. package/src/tool/egg-timer/seo.astro +6 -30
  101. package/src/tool/ingredient-rescaler/bibliography.astro +3 -3
  102. package/src/tool/ingredient-rescaler/bibliography.ts +6 -0
  103. package/src/tool/ingredient-rescaler/i18n/de.ts +3 -17
  104. package/src/tool/ingredient-rescaler/i18n/en.ts +3 -18
  105. package/src/tool/ingredient-rescaler/i18n/es.ts +4 -19
  106. package/src/tool/ingredient-rescaler/i18n/fr.ts +2 -15
  107. package/src/tool/ingredient-rescaler/i18n/id.ts +3 -17
  108. package/src/tool/ingredient-rescaler/i18n/it.ts +3 -17
  109. package/src/tool/ingredient-rescaler/i18n/ja.ts +3 -17
  110. package/src/tool/ingredient-rescaler/i18n/ko.ts +3 -17
  111. package/src/tool/ingredient-rescaler/i18n/nl.ts +3 -17
  112. package/src/tool/ingredient-rescaler/i18n/pl.ts +3 -17
  113. package/src/tool/ingredient-rescaler/i18n/pt.ts +3 -17
  114. package/src/tool/ingredient-rescaler/i18n/ru.ts +3 -17
  115. package/src/tool/ingredient-rescaler/i18n/sv.ts +3 -17
  116. package/src/tool/ingredient-rescaler/i18n/tr.ts +3 -17
  117. package/src/tool/ingredient-rescaler/i18n/zh.ts +3 -17
  118. package/src/tool/ingredient-rescaler/recipe-ingredient-scaler-converter-servings.css +290 -17
  119. package/src/tool/ingredient-rescaler/seo.astro +11 -4
  120. package/src/tool/kitchen-timer/bibliography.astro +3 -3
  121. package/src/tool/kitchen-timer/bibliography.ts +10 -0
  122. package/src/tool/kitchen-timer/i18n/de.ts +3 -13
  123. package/src/tool/kitchen-timer/i18n/en.ts +6 -22
  124. package/src/tool/kitchen-timer/i18n/es.ts +6 -22
  125. package/src/tool/kitchen-timer/i18n/fr.ts +6 -22
  126. package/src/tool/kitchen-timer/i18n/id.ts +3 -13
  127. package/src/tool/kitchen-timer/i18n/it.ts +3 -13
  128. package/src/tool/kitchen-timer/i18n/ja.ts +3 -13
  129. package/src/tool/kitchen-timer/i18n/ko.ts +3 -13
  130. package/src/tool/kitchen-timer/i18n/nl.ts +3 -13
  131. package/src/tool/kitchen-timer/i18n/pl.ts +3 -13
  132. package/src/tool/kitchen-timer/i18n/pt.ts +3 -13
  133. package/src/tool/kitchen-timer/i18n/ru.ts +3 -13
  134. package/src/tool/kitchen-timer/i18n/sv.ts +3 -13
  135. package/src/tool/kitchen-timer/i18n/tr.ts +3 -13
  136. package/src/tool/kitchen-timer/i18n/zh.ts +3 -13
  137. package/src/tool/kitchen-timer/seo.astro +10 -3
  138. package/src/tool/meringue-peak/bibliography.astro +3 -3
  139. package/src/tool/meringue-peak/bibliography.ts +14 -0
  140. package/src/tool/meringue-peak/i18n/de.ts +3 -13
  141. package/src/tool/meringue-peak/i18n/en.ts +2 -15
  142. package/src/tool/meringue-peak/i18n/es.ts +135 -149
  143. package/src/tool/meringue-peak/i18n/fr.ts +2 -15
  144. package/src/tool/meringue-peak/i18n/id.ts +3 -13
  145. package/src/tool/meringue-peak/i18n/it.ts +3 -13
  146. package/src/tool/meringue-peak/i18n/ja.ts +3 -13
  147. package/src/tool/meringue-peak/i18n/ko.ts +3 -13
  148. package/src/tool/meringue-peak/i18n/nl.ts +3 -13
  149. package/src/tool/meringue-peak/i18n/pl.ts +3 -13
  150. package/src/tool/meringue-peak/i18n/pt.ts +3 -13
  151. package/src/tool/meringue-peak/i18n/ru.ts +3 -13
  152. package/src/tool/meringue-peak/i18n/sv.ts +3 -13
  153. package/src/tool/meringue-peak/i18n/tr.ts +3 -13
  154. package/src/tool/meringue-peak/i18n/zh.ts +3 -13
  155. package/src/tool/meringue-peak/seo.astro +10 -3
  156. package/src/tool/mold-scaler/bibliography.astro +3 -3
  157. package/src/tool/mold-scaler/bibliography.ts +10 -0
  158. package/src/tool/mold-scaler/i18n/de.ts +5 -17
  159. package/src/tool/mold-scaler/i18n/en.ts +5 -20
  160. package/src/tool/mold-scaler/i18n/es.ts +5 -20
  161. package/src/tool/mold-scaler/i18n/fr.ts +5 -20
  162. package/src/tool/mold-scaler/i18n/id.ts +5 -17
  163. package/src/tool/mold-scaler/i18n/it.ts +5 -17
  164. package/src/tool/mold-scaler/i18n/ja.ts +5 -17
  165. package/src/tool/mold-scaler/i18n/ko.ts +5 -17
  166. package/src/tool/mold-scaler/i18n/nl.ts +5 -17
  167. package/src/tool/mold-scaler/i18n/pl.ts +5 -17
  168. package/src/tool/mold-scaler/i18n/pt.ts +5 -17
  169. package/src/tool/mold-scaler/i18n/ru.ts +5 -17
  170. package/src/tool/mold-scaler/i18n/sv.ts +5 -17
  171. package/src/tool/mold-scaler/i18n/tr.ts +5 -17
  172. package/src/tool/mold-scaler/i18n/zh.ts +5 -17
  173. package/src/tool/mold-scaler/seo.astro +10 -3
  174. package/src/tool/pizza/bibliography.astro +3 -3
  175. package/src/tool/pizza/bibliography.ts +18 -0
  176. package/src/tool/pizza/i18n/de.ts +3 -13
  177. package/src/tool/pizza/i18n/en.ts +58 -75
  178. package/src/tool/pizza/i18n/es.ts +2 -20
  179. package/src/tool/pizza/i18n/fr.ts +58 -75
  180. package/src/tool/pizza/i18n/id.ts +3 -9
  181. package/src/tool/pizza/i18n/it.ts +3 -13
  182. package/src/tool/pizza/i18n/ja.ts +3 -9
  183. package/src/tool/pizza/i18n/ko.ts +3 -9
  184. package/src/tool/pizza/i18n/nl.ts +3 -9
  185. package/src/tool/pizza/i18n/pl.ts +3 -9
  186. package/src/tool/pizza/i18n/pt.ts +3 -9
  187. package/src/tool/pizza/i18n/ru.ts +28 -34
  188. package/src/tool/pizza/i18n/sv.ts +3 -9
  189. package/src/tool/pizza/i18n/tr.ts +3 -9
  190. package/src/tool/pizza/i18n/zh.ts +3 -9
  191. package/src/tool/pizza/seo.astro +11 -4
  192. package/src/tool/roux-guide/bibliography.astro +3 -3
  193. package/src/tool/roux-guide/bibliography.ts +14 -0
  194. package/src/tool/roux-guide/i18n/de.ts +3 -9
  195. package/src/tool/roux-guide/i18n/en.ts +2 -15
  196. package/src/tool/roux-guide/i18n/es.ts +3 -17
  197. package/src/tool/roux-guide/i18n/fr.ts +2 -15
  198. package/src/tool/roux-guide/i18n/id.ts +3 -9
  199. package/src/tool/roux-guide/i18n/it.ts +3 -9
  200. package/src/tool/roux-guide/i18n/ja.ts +3 -9
  201. package/src/tool/roux-guide/i18n/ko.ts +3 -9
  202. package/src/tool/roux-guide/i18n/nl.ts +3 -9
  203. package/src/tool/roux-guide/i18n/pl.ts +3 -9
  204. package/src/tool/roux-guide/i18n/pt.ts +3 -9
  205. package/src/tool/roux-guide/i18n/ru.ts +3 -9
  206. package/src/tool/roux-guide/i18n/sv.ts +3 -9
  207. package/src/tool/roux-guide/i18n/tr.ts +3 -9
  208. package/src/tool/roux-guide/i18n/zh.ts +3 -9
  209. package/src/tool/roux-guide/roux-ratio-calculator-thickening-sauce-guide.css +480 -18
  210. package/src/tool/roux-guide/seo.astro +11 -4
  211. package/src/tool/sourdough-calculator/bibliography.astro +3 -3
  212. package/src/tool/sourdough-calculator/bibliography.ts +14 -0
  213. package/src/tool/sourdough-calculator/i18n/de.ts +3 -9
  214. package/src/tool/sourdough-calculator/i18n/en.ts +3 -17
  215. package/src/tool/sourdough-calculator/i18n/es.ts +4 -18
  216. package/src/tool/sourdough-calculator/i18n/fr.ts +2 -15
  217. package/src/tool/sourdough-calculator/i18n/id.ts +3 -9
  218. package/src/tool/sourdough-calculator/i18n/it.ts +3 -9
  219. package/src/tool/sourdough-calculator/i18n/ja.ts +3 -9
  220. package/src/tool/sourdough-calculator/i18n/ko.ts +3 -9
  221. package/src/tool/sourdough-calculator/i18n/nl.ts +3 -9
  222. package/src/tool/sourdough-calculator/i18n/pl.ts +3 -9
  223. package/src/tool/sourdough-calculator/i18n/pt.ts +3 -9
  224. package/src/tool/sourdough-calculator/i18n/ru.ts +3 -9
  225. package/src/tool/sourdough-calculator/i18n/sv.ts +3 -9
  226. package/src/tool/sourdough-calculator/i18n/tr.ts +3 -9
  227. package/src/tool/sourdough-calculator/i18n/zh.ts +3 -9
  228. package/src/tool/sourdough-calculator/seo.astro +11 -4
  229. package/src/tool/yeast-converter/bibliography.astro +6 -0
  230. package/src/tool/yeast-converter/bibliography.ts +6 -0
  231. package/src/tool/yeast-converter/component.astro +96 -0
  232. package/src/tool/yeast-converter/entry.ts +26 -0
  233. package/src/tool/yeast-converter/i18n/de.ts +235 -0
  234. package/src/tool/yeast-converter/i18n/en.ts +234 -0
  235. package/src/tool/yeast-converter/i18n/es.ts +235 -0
  236. package/src/tool/yeast-converter/i18n/fr.ts +235 -0
  237. package/src/tool/yeast-converter/i18n/id.ts +235 -0
  238. package/src/tool/yeast-converter/i18n/it.ts +235 -0
  239. package/src/tool/yeast-converter/i18n/ja.ts +235 -0
  240. package/src/tool/yeast-converter/i18n/ko.ts +235 -0
  241. package/src/tool/yeast-converter/i18n/nl.ts +235 -0
  242. package/src/tool/yeast-converter/i18n/pl.ts +235 -0
  243. package/src/tool/yeast-converter/i18n/pt.ts +235 -0
  244. package/src/tool/yeast-converter/i18n/ru.ts +235 -0
  245. package/src/tool/yeast-converter/i18n/sv.ts +235 -0
  246. package/src/tool/yeast-converter/i18n/tr.ts +235 -0
  247. package/src/tool/yeast-converter/i18n/zh.ts +235 -0
  248. package/src/tool/yeast-converter/index.ts +11 -0
  249. package/src/tool/yeast-converter/init.ts +277 -0
  250. package/src/tool/yeast-converter/seo.astro +15 -0
  251. package/src/tool/yeast-converter/yeast-converter-fresh-dry-sourdough-starter.css +388 -0
  252. package/src/tools.ts +2 -0
@@ -1,21 +1,483 @@
1
1
  :root {
2
- --rg-primary: hsl(38deg, 92%, 50%);
3
- --rg-primary-light: hsl(38deg, 92%, 90%);
4
- --rg-secondary: hsl(25deg, 95%, 53%);
5
- --rg-bg-card: hsl(0deg, 0%, 100%);
6
- --rg-bg-app: hsl(210deg, 20%, 98%);
7
- --rg-border: hsl(210deg, 20%, 90%);
8
- --rg-text-main: hsl(210deg, 30%, 20%);
9
- --rg-text-muted: hsl(210deg, 15%, 50%);
10
- --rg-shadow-lg: 0 10px 15px -3px rgb(0, 0, 0, 0.1);
11
- --rg-radius: 1rem;
2
+ --rg-primary: hsl(38deg, 92%, 50%);
3
+ --rg-primary-light: hsl(38deg, 92%, 90%);
4
+ --rg-secondary: hsl(25deg, 95%, 53%);
5
+ --rg-bg-card: hsl(0deg, 0%, 100%);
6
+ --rg-bg-app: hsl(210deg, 20%, 98%);
7
+ --rg-border: hsl(210deg, 20%, 90%);
8
+ --rg-text-main: hsl(210deg, 30%, 20%);
9
+ --rg-text-muted: hsl(210deg, 15%, 50%);
10
+ --rg-shadow-lg: 0 10px 15px -3px rgb(0, 0, 0, 0.1);
11
+ --rg-radius: 1rem;
12
+ }
13
+
14
+ .theme-dark {
15
+ --rg-bg-card: hsl(220deg, 25%, 12%);
16
+ --rg-bg-app: hsl(220deg, 30%, 7%);
17
+ --rg-border: hsl(220deg, 20%, 20%);
18
+ --rg-text-main: hsl(210deg, 20%, 95%);
19
+ --rg-text-muted: hsl(210deg, 15%, 70%);
20
+ --rg-primary-light: hsl(38deg, 92%, 12%);
21
+ }
22
+
23
+ input[type='number']::-webkit-outer-spin-button,
24
+ input[type='number']::-webkit-inner-spin-button {
25
+ -webkit-appearance: none;
26
+ margin: 0;
27
+ }
28
+
29
+ .rg-container {
30
+ width: 100%;
31
+ max-width: 100%;
32
+ padding: 1rem;
33
+ }
34
+
35
+ .rg-card {
36
+ background: var(--rg-bg-card);
37
+ border: 1px solid var(--rg-border);
38
+ border-radius: var(--rg-radius);
39
+ box-shadow: var(--rg-shadow-lg);
40
+ overflow: hidden;
41
+ }
42
+
43
+ .rg-progress-wrapper {
44
+ height: 0.375rem;
45
+ width: 100%;
46
+ background: var(--rg-bg-app);
47
+ position: relative;
48
+ }
49
+
50
+ .rg-progress-bar {
51
+ height: 100%;
52
+ background: linear-gradient(to right, var(--rg-primary), var(--rg-secondary));
53
+ transition: width 0.3s ease;
54
+ width: 50%;
55
+ }
56
+
57
+ .rg-content {
58
+ padding: 2rem;
59
+ }
60
+
61
+ @media (max-width: 1024px) {
62
+ .rg-content {
63
+ padding: 1.5rem;
64
+ }
65
+ }
66
+
67
+ @media (max-width: 640px) {
68
+ .rg-content {
69
+ padding: 1rem;
70
+ }
71
+ }
72
+
73
+ .rg-grid {
74
+ display: grid;
75
+ grid-template-columns: 1fr;
76
+ gap: 3rem;
77
+ }
78
+
79
+ @media (min-width: 1024px) {
80
+ .rg-grid {
81
+ grid-template-columns: 1fr 1fr;
82
+ }
83
+ }
84
+
85
+ .rg-controls {
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 2.5rem;
89
+ }
90
+
91
+ .rg-control-group {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 1rem;
95
+ }
96
+
97
+ .rg-label {
98
+ font-size: 0.75rem;
99
+ font-weight: 700;
100
+ color: var(--rg-text-muted);
101
+ text-transform: uppercase;
102
+ letter-spacing: 0.05em;
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 0.75rem;
106
+ }
107
+
108
+ .rg-step {
109
+ width: 1.5rem;
110
+ height: 1.5rem;
111
+ border-radius: 50%;
112
+ background: hsl(38deg, 92%, 90%);
113
+ color: var(--rg-primary);
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ font-weight: 700;
118
+ font-size: 0.75rem;
119
+ }
120
+
121
+ .theme-dark .rg-step {
122
+ background: hsl(38deg, 92%, 12%);
123
+ }
124
+
125
+ .rg-volume-wrapper {
126
+ display: flex;
127
+ flex-direction: column;
128
+ gap: 1rem;
129
+ }
130
+
131
+ @media (min-width: 640px) {
132
+ .rg-volume-wrapper {
133
+ flex-direction: row;
134
+ gap: 1rem;
135
+ }
136
+ }
137
+
138
+ .rg-input-group {
139
+ position: relative;
140
+ flex: 1;
141
+ }
142
+
143
+ .rg-input {
144
+ width: 100%;
145
+ padding: 1rem 2rem 1rem 1rem;
146
+ border: 2px solid var(--rg-border);
147
+ border-radius: 0.75rem;
148
+ background: var(--rg-bg-app);
149
+ color: var(--rg-text-main);
150
+ font-weight: 600;
151
+ font-size: 1.875rem;
152
+ text-align: center;
153
+ transition: all 0.3s ease;
154
+ }
155
+
156
+ .rg-input:focus {
157
+ outline: none;
158
+ border-color: var(--rg-primary);
159
+ box-shadow: 0 0 0 3px hsl(38deg, 92%, 50%, 0.1);
160
+ }
161
+
162
+ .rg-unit {
163
+ position: absolute;
164
+ right: 1rem;
165
+ top: 50%;
166
+ transform: translateY(-50%);
167
+ color: var(--rg-text-muted);
168
+ font-weight: 600;
169
+ font-size: 0.875rem;
170
+ text-transform: uppercase;
171
+ letter-spacing: 0.05em;
172
+ pointer-events: none;
173
+ }
174
+
175
+ .rg-liquid-buttons {
176
+ display: grid;
177
+ grid-template-columns: repeat(4, 1fr);
178
+ gap: 0.5rem;
179
+ }
180
+
181
+ @media (max-width: 640px) {
182
+ .rg-liquid-buttons {
183
+ grid-template-columns: repeat(2, 1fr);
184
+ }
185
+ }
186
+
187
+ .rg-liquid-btn {
188
+ display: flex;
189
+ align-items: center;
190
+ justify-content: center;
191
+ padding: 0.75rem;
192
+ border: 2px solid var(--rg-border);
193
+ border-radius: 0.75rem;
194
+ background: var(--rg-bg-card);
195
+ color: var(--rg-text-muted);
196
+ cursor: pointer;
197
+ transition: all 0.3s ease;
198
+ }
199
+
200
+ .rg-liquid-btn:hover {
201
+ border-color: var(--rg-primary);
202
+ color: var(--rg-primary);
203
+ }
204
+
205
+ .rg-liquid-btn.active {
206
+ background: var(--rg-bg-app);
207
+ border-color: var(--rg-primary);
208
+ color: var(--rg-primary);
209
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
210
+ }
211
+
212
+ .rg-btn-icon {
213
+ width: 1.5rem;
214
+ height: 1.5rem;
215
+ }
216
+
217
+ .rg-texture-grid {
218
+ display: grid;
219
+ grid-template-columns: repeat(2, 1fr);
220
+ gap: 0.75rem;
221
+ }
222
+
223
+ @media (min-width: 640px) {
224
+ .rg-texture-grid {
225
+ grid-template-columns: repeat(4, 1fr);
12
226
  }
227
+ }
228
+
229
+ .rg-texture-btn {
230
+ display: flex;
231
+ flex-direction: column;
232
+ align-items: center;
233
+ gap: 0.75rem;
234
+ padding: 1rem 0.75rem;
235
+ border: 2px solid var(--rg-border);
236
+ border-radius: 0.75rem;
237
+ background: var(--rg-bg-card);
238
+ color: var(--rg-text-muted);
239
+ cursor: pointer;
240
+ transition: all 0.3s ease;
241
+ text-align: center;
242
+ }
243
+
244
+ .rg-texture-btn:hover {
245
+ border-color: var(--rg-primary);
246
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
247
+ }
248
+
249
+ .rg-texture-btn.active {
250
+ background: var(--rg-primary-light);
251
+ border-color: var(--rg-primary);
252
+ color: var(--rg-primary);
253
+ }
254
+
255
+ .rg-texture-visual {
256
+ width: 1.5rem;
257
+ height: 1.5rem;
258
+ border: 1px solid currentcolor;
259
+ border-radius: 0.25rem;
260
+ overflow: hidden;
261
+ display: flex;
262
+ align-items: flex-end;
263
+ }
264
+
265
+ .rg-texture-bar {
266
+ width: 100%;
267
+ background: currentcolor;
268
+ transition: height 0.3s ease;
269
+ }
270
+
271
+ .rg-texture-btn[data-level="1"] .rg-texture-bar {
272
+ height: 25%;
273
+ }
274
+
275
+ .rg-texture-btn[data-level="2"] .rg-texture-bar {
276
+ height: 50%;
277
+ }
278
+
279
+ .rg-texture-btn[data-level="3"] .rg-texture-bar {
280
+ height: 75%;
281
+ }
282
+
283
+ .rg-texture-btn[data-level="4"] .rg-texture-bar {
284
+ height: 100%;
285
+ }
286
+
287
+ .rg-texture-label {
288
+ font-size: 0.75rem;
289
+ font-weight: 600;
290
+ line-height: 1.2;
291
+ }
292
+
293
+ .rg-results {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 1.5rem;
297
+ }
298
+
299
+ .rg-result-hero {
300
+ background: linear-gradient(135deg, var(--rg-primary), var(--rg-secondary));
301
+ border-radius: var(--rg-radius);
302
+ padding: 2rem;
303
+ color: var(--rg-bg-card);
304
+ box-shadow: var(--rg-shadow-lg);
305
+ position: relative;
306
+ overflow: hidden;
307
+ }
308
+
309
+ .rg-result-hero::before {
310
+ content: '';
311
+ position: absolute;
312
+ top: -50%;
313
+ left: -50%;
314
+ width: 200%;
315
+ height: 200%;
316
+ background: radial-gradient(circle, hsla(0deg, 0%, 100%, 0.1), transparent 60%);
317
+ pointer-events: none;
318
+ }
319
+
320
+ .rg-result-header {
321
+ display: flex;
322
+ justify-content: space-between;
323
+ align-items: center;
324
+ margin-bottom: 1.5rem;
325
+ position: relative;
326
+ z-index: 1;
327
+ }
328
+
329
+ .rg-result-label {
330
+ font-size: 0.75rem;
331
+ font-weight: 700;
332
+ text-transform: uppercase;
333
+ letter-spacing: 0.1em;
334
+ opacity: 0.8;
335
+ }
336
+
337
+ .rg-roux-type {
338
+ font-size: 0.75rem;
339
+ font-weight: 600;
340
+ background: hsla(0deg, 0%, 0%, 0.2);
341
+ padding: 0.5rem 1rem;
342
+ border-radius: 0.5rem;
343
+ text-transform: capitalize;
344
+ }
345
+
346
+ .rg-result-amounts {
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: space-around;
350
+ margin-bottom: 1.5rem;
351
+ position: relative;
352
+ z-index: 1;
353
+ text-align: center;
354
+ }
355
+
356
+ .rg-amount {
357
+ flex: 1;
358
+ }
359
+
360
+ .rg-amount-value {
361
+ font-size: 2.5rem;
362
+ font-weight: 800;
363
+ margin-bottom: 0.5rem;
364
+ line-height: 1;
365
+ }
366
+
367
+ .rg-amount-unit {
368
+ font-size: 0.75rem;
369
+ font-weight: 600;
370
+ text-transform: uppercase;
371
+ opacity: 0.8;
372
+ }
373
+
374
+ .rg-amount-plus {
375
+ font-size: 1.5rem;
376
+ opacity: 0.3;
377
+ margin: 0 1rem;
378
+ }
379
+
380
+ .rg-instructions-box {
381
+ background: hsla(0deg, 0%, 0%, 0.2);
382
+ border-radius: 0.75rem;
383
+ border: 1px solid hsla(0deg, 0%, 100%, 0.1);
384
+ padding: 1rem;
385
+ position: relative;
386
+ z-index: 1;
387
+ backdrop-filter: blur(4px);
388
+ }
389
+
390
+ .rg-instructions-header {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 0.5rem;
394
+ margin-bottom: 0.75rem;
395
+ color: hsl(38deg, 92%, 90%);
396
+ }
397
+
398
+ .rg-instructions-icon {
399
+ width: 1rem;
400
+ height: 1rem;
401
+ }
402
+
403
+ .rg-instructions-title {
404
+ font-size: 0.75rem;
405
+ font-weight: 700;
406
+ text-transform: uppercase;
407
+ letter-spacing: 0.1em;
408
+ }
409
+
410
+ .rg-instructions-text {
411
+ font-size: 0.875rem;
412
+ font-weight: 500;
413
+ line-height: 1.5;
414
+ color: hsl(38deg, 92%, 95%);
415
+ margin: 0;
416
+ }
417
+
418
+ .rg-sauce-info {
419
+ background: var(--rg-bg-app);
420
+ border: 1px solid var(--rg-border);
421
+ border-radius: var(--rg-radius);
422
+ padding: 1.5rem;
423
+ display: flex;
424
+ flex-direction: column;
425
+ gap: 1rem;
426
+ }
427
+
428
+ .rg-sauce-header {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: 1rem;
432
+ margin-bottom: 0.5rem;
433
+ }
434
+
435
+ .rg-sauce-icon {
436
+ width: 2.5rem;
437
+ height: 2.5rem;
438
+ border-radius: 0.5rem;
439
+ background: hsl(38deg, 92%, 90%);
440
+ color: var(--rg-primary);
441
+ display: flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ flex-shrink: 0;
445
+ }
446
+
447
+ .theme-dark .rg-sauce-icon {
448
+ background: hsl(38deg, 92%, 12%);
449
+ }
450
+
451
+ .rg-icon-lg {
452
+ width: 1.25rem;
453
+ height: 1.25rem;
454
+ }
455
+
456
+ .rg-sauce-name {
457
+ font-size: 1rem;
458
+ font-weight: 700;
459
+ color: var(--rg-text-main);
460
+ flex: 1;
461
+ }
462
+
463
+ .rg-sauce-ratio {
464
+ font-size: 0.75rem;
465
+ font-weight: 700;
466
+ color: var(--rg-text-muted);
467
+ text-transform: uppercase;
468
+ letter-spacing: 0.05em;
469
+ white-space: nowrap;
470
+ }
13
471
 
14
- .theme-dark {
15
- --rg-bg-card: hsl(220deg, 25%, 12%);
16
- --rg-bg-app: hsl(220deg, 30%, 7%);
17
- --rg-border: hsl(220deg, 20%, 20%);
18
- --rg-text-main: hsl(210deg, 20%, 95%);
19
- --rg-text-muted: hsl(210deg, 15%, 70%);
20
- --rg-primary-light: hsl(38deg, 92%, 12%);
21
- }
472
+ .rg-sauce-tip {
473
+ font-size: 0.875rem;
474
+ font-weight: 500;
475
+ line-height: 1.6;
476
+ color: var(--rg-text-muted);
477
+ font-style: italic;
478
+ background: var(--rg-bg-card);
479
+ padding: 1rem;
480
+ border-radius: 0.75rem;
481
+ border: 1px solid var(--rg-border);
482
+ margin: 0;
483
+ }
@@ -1,8 +1,15 @@
1
1
  ---
2
- import { SEORenderer } from "@jjlmoya/utils-shared";
3
- import { content } from "./i18n/es";
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { ROUX_GUIDE_TOOL } from './index';
4
+ import type { KnownLocale } from '../../types';
4
5
 
5
- const locale = "es";
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await ROUX_GUIDE_TOOL.i18n[locale]?.();
12
+ if (!content) return null;
6
13
  ---
7
14
 
8
- <SEORenderer content={{ sections: content.seo, locale }} />
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -1,6 +1,6 @@
1
1
  ---
2
- import { Bibliography } from '@jjlmoya/utils-shared';
3
- import { content } from './i18n/es';
2
+ import { Bibliography as BibliographyComponent } from '@jjlmoya/utils-shared';
3
+ import { bibliography } from './bibliography';
4
4
  ---
5
5
 
6
- <Bibliography links={content.bibliography} />
6
+ <BibliographyComponent links={bibliography} />
@@ -0,0 +1,14 @@
1
+ export const bibliography = [
2
+ {
3
+ name: 'Tartine Bread - Chad Robertson',
4
+ url: 'https://www.penguinrandomhouse.com/books/310016/tartine-bread-by-chad-robertson/',
5
+ },
6
+ {
7
+ name: 'The Flavor Bible - Scaling and Ratios',
8
+ url: 'https://www.flavorprints.com/',
9
+ },
10
+ {
11
+ name: 'Full Proof Baking - Guides on Sourdough',
12
+ url: 'https://www.fullproofbaking.com/',
13
+ },
14
+ ];
@@ -1,4 +1,5 @@
1
1
  import type { ToolLocaleContent } from '../../../types';
2
+ import { bibliography } from '../bibliography';
2
3
 
3
4
  const title = "Sauerteig Rechner: Fermentationsverhältnisse";
4
5
  const description = "Berechnen Sie automatisch die Proportionen von Sauerteig, Mehl und Wasser zur Pflege Ihres Ansatzes. Vordefinierte oder benutzerdefinierte Verhältnisse.";
@@ -72,15 +73,7 @@ export const content: ToolLocaleContent = {
72
73
  title,
73
74
  description,
74
75
  faqTitle: 'Häufig gestellte Fragen',
75
- faq,
76
- bibliographyTitle: 'Bibliografie',
77
- bibliography: [
78
- {
79
- name: 'Tartine Bread - Chad Robertson',
80
- url: 'https://www.penguinrandomhouse.com/books/310016/tartine-bread-by-chad-robertson/',
81
- },
82
- ],
83
- howTo,
76
+ faq, howTo,
84
77
  seo: [
85
78
  {
86
79
  type: 'title',
@@ -138,5 +131,6 @@ export const content: ToolLocaleContent = {
138
131
  totalDough: 'Gesamtgewicht',
139
132
  mm: 'ASG',
140
133
  },
134
+ bibliography,
141
135
  schemas: [faqSchema, howToSchema, appSchema],
142
136
  };
@@ -1,4 +1,5 @@
1
1
  import type { ToolLocaleContent } from '../../../types';
2
+ import { bibliography } from '../bibliography';
2
3
 
3
4
  const title = "Sourdough Starter Feeding Calculator";
4
5
  const description = "Automatically calculate exact proportions of starter, flour, and water for your sourdough maintenance and feeding. Preset or custom ratios available.";
@@ -97,23 +98,7 @@ export const content: ToolLocaleContent = {
97
98
  question: 'Does the calculator round the grams?',
98
99
  answer: 'Yes. It rounds to the nearest whole number for practicality. For maximum precision, use a digital scale; however, small rounding differences won\'t significantly impact fermentation.',
99
100
  },
100
- ],
101
- bibliographyTitle: 'Bibliography & Resources',
102
- bibliography: [
103
- {
104
- name: 'Tartine Bread - Chad Robertson',
105
- url: 'https://www.penguinrandomhouse.com/books/310016/tartine-bread-by-chad-robertson/',
106
- },
107
- {
108
- name: 'The Flavor Bible - Scaling and Ratios',
109
- url: 'https://www.flavorprints.com/',
110
- },
111
- {
112
- name: 'Full Proof Baking - Guides on Sourdough',
113
- url: 'https://www.fullproofbaking.com/',
114
- },
115
- ],
116
- howTo: [
101
+ ], howTo: [
117
102
  {
118
103
  name: 'Enter total amount needed',
119
104
  text: 'Define the total weight of sourdough starter you need for your recipe (e.g., 300g for a typical loaf).',
@@ -309,5 +294,6 @@ export const content: ToolLocaleContent = {
309
294
  totalDough: 'Total Dough',
310
295
  mm: 'ST',
311
296
  },
297
+ bibliography,
312
298
  schemas: [faqSchema, howToSchema, appSchema],
313
299
  };
@@ -1,4 +1,5 @@
1
1
  import type { ToolLocaleContent } from '../../../types';
2
+ import { bibliography } from '../bibliography';
2
3
 
3
4
  const title = "Calculadora de Masa Madre Ratios de Fermentación";
4
5
  const description = "Calcula automáticamente las proporciones de masa madre, harina y agua para mantener tu cultivo. Ratios predefinidos o personalizados.";
@@ -97,23 +98,7 @@ export const content: ToolLocaleContent = {
97
98
  question: '¿La calculadora redondea los gramos?',
98
99
  answer: 'Sí. Redondea al número entero más cercano para practicidad. Si necesitas máxima precisión, usa una báscula digital. Los pequeños redondeos no afectan significativamente la fermentación.',
99
100
  },
100
- ],
101
- bibliographyTitle: 'Bibliografía',
102
- bibliography: [
103
- {
104
- name: 'Tartine Bread - Chad Robertson',
105
- url: 'https://www.penguinrandomhouse.com/books/310016/tartine-bread-by-chad-robertson/',
106
- },
107
- {
108
- name: 'The Flavor Bible - Scaling and Ratios',
109
- url: 'https://www.flavorprints.com/',
110
- },
111
- {
112
- name: 'Full Proof Baking - Guides on Sourdough',
113
- url: 'https://www.fullproofbaking.com/',
114
- },
115
- ],
116
- howTo: [
101
+ ], howTo: [
117
102
  {
118
103
  name: 'Ingresa la cantidad total que necesitas',
119
104
  text: 'Define el peso total de masa madre que requieres para tu receta (ej: 300g para un pan típico).',
@@ -127,7 +112,7 @@ export const content: ToolLocaleContent = {
127
112
  text: 'La calculadora te muestra cuánto de masa madre, harina y agua necesitas. Mezcla estos ingredientes y deja fermentar según tu protocolo.',
128
113
  },
129
114
  ],
130
- seo: [
115
+ seo: [
131
116
  {
132
117
  type: 'title',
133
118
  text: 'Guía Maestra para el Mantenimiento y Refresco de Masa Madre',
@@ -310,5 +295,6 @@ export const content: ToolLocaleContent = {
310
295
  totalDough: 'Total Masa',
311
296
  mm: 'MM',
312
297
  },
298
+ bibliography,
313
299
  schemas: [faqSchema, howToSchema, appSchema],
314
300
  };
@@ -1,4 +1,5 @@
1
1
  import type { ToolLocaleContent } from "../../../types";
2
+ import { bibliography } from '../bibliography';
2
3
 
3
4
  const title = "Calculateur de Rafraîchissement du Levain";
4
5
  const description = "Le choix le plus courant en boulangerie artisanale moderne. Très facile à mélanger et à incorporer.";
@@ -109,21 +110,6 @@ export const content: ToolLocaleContent = {
109
110
  "Oui. Il arrondit à l'entier le plus proche par praticité. Pour une précision maximale, utilisez une balance digitale ; toutefois, de petits écarts d'arrondi n'impactent pas significativement la fermentation.",
110
111
  },
111
112
  ],
112
- bibliographyTitle: "Bibliographie et Ressources",
113
- bibliography: [
114
- {
115
- name: "Tartine Bread - Chad Robertson",
116
- url: "https://www.penguinrandomhouse.com/books/310016/tartine-bread-by-chad-robertson/",
117
- },
118
- {
119
- name: "The Flavor Bible - Scaling and Ratios",
120
- url: "https://www.flavorprints.com/",
121
- },
122
- {
123
- name: "Full Proof Baking - Guides on Sourdough",
124
- url: "https://www.fullproofbaking.com/",
125
- },
126
- ],
127
113
  howTo: [
128
114
  {
129
115
  name: "Entrez la quantité totale",
@@ -320,5 +306,6 @@ export const content: ToolLocaleContent = {
320
306
  totalDough: "Total Levain",
321
307
  mm: "Levain",
322
308
  },
309
+ bibliography,
323
310
  schemas: [faqSchema, howToSchema, appSchema],
324
311
  };