@jjlmoya/utils-alcohol 1.24.0 → 1.26.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.
- package/package.json +1 -1
- package/src/entries.ts +7 -1
- package/src/index.ts +1 -0
- package/src/pages/[locale]/[slug].astro +7 -3
- package/src/tests/locale_completeness.test.ts +4 -9
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/alcoholClearance/alcohol-clearance-calculator.css +23 -23
- package/src/tool/alcoholClearance/bibliography.ts +6 -0
- package/src/tool/alcoholClearance/entry.ts +1 -0
- package/src/tool/alcoholClearance/i18n/de.ts +1 -12
- package/src/tool/alcoholClearance/i18n/en.ts +1 -12
- package/src/tool/alcoholClearance/i18n/es.ts +1 -12
- package/src/tool/alcoholClearance/i18n/fr.ts +1 -12
- package/src/tool/alcoholClearance/i18n/id.ts +1 -12
- package/src/tool/alcoholClearance/i18n/it.ts +1 -12
- package/src/tool/alcoholClearance/i18n/ja.ts +1 -12
- package/src/tool/alcoholClearance/i18n/ko.ts +1 -12
- package/src/tool/alcoholClearance/i18n/nl.ts +1 -12
- package/src/tool/alcoholClearance/i18n/pl.ts +1 -12
- package/src/tool/alcoholClearance/i18n/pt.ts +1 -12
- package/src/tool/alcoholClearance/i18n/ru.ts +1 -12
- package/src/tool/alcoholClearance/i18n/sv.ts +1 -12
- package/src/tool/alcoholClearance/i18n/tr.ts +1 -12
- package/src/tool/alcoholClearance/i18n/zh.ts +1 -12
- package/src/tool/beerCooler/beer-cooler.css +22 -22
- package/src/tool/beerCooler/bibliography.ts +6 -0
- package/src/tool/beerCooler/entry.ts +1 -0
- package/src/tool/beerCooler/i18n/de.ts +1 -12
- package/src/tool/beerCooler/i18n/en.ts +1 -12
- package/src/tool/beerCooler/i18n/es.ts +1 -12
- package/src/tool/beerCooler/i18n/fr.ts +1 -12
- package/src/tool/beerCooler/i18n/id.ts +1 -12
- package/src/tool/beerCooler/i18n/it.ts +1 -12
- package/src/tool/beerCooler/i18n/ja.ts +1 -12
- package/src/tool/beerCooler/i18n/ko.ts +1 -12
- package/src/tool/beerCooler/i18n/nl.ts +1 -12
- package/src/tool/beerCooler/i18n/pl.ts +1 -12
- package/src/tool/beerCooler/i18n/pt.ts +1 -12
- package/src/tool/beerCooler/i18n/ru.ts +1 -12
- package/src/tool/beerCooler/i18n/sv.ts +1 -12
- package/src/tool/beerCooler/i18n/tr.ts +1 -12
- package/src/tool/beerCooler/i18n/zh.ts +1 -12
- package/src/tool/carbonationCalculator/beer-carbonation-calculator.css +19 -19
- package/src/tool/carbonationCalculator/bibliography.ts +6 -0
- package/src/tool/carbonationCalculator/entry.ts +1 -0
- package/src/tool/carbonationCalculator/i18n/de.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/en.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/es.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/fr.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/id.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/it.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/ja.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/ko.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/nl.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/pl.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/pt.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/ru.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/sv.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/tr.ts +1 -12
- package/src/tool/carbonationCalculator/i18n/zh.ts +1 -12
- package/src/tool/cocktailBalancer/bibliography.ts +7 -0
- package/src/tool/cocktailBalancer/cocktail-balancer.css +59 -59
- package/src/tool/cocktailBalancer/entry.ts +1 -0
- package/src/tool/cocktailBalancer/i18n/de.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/en.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/es.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/fr.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/id.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/it.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/ja.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/ko.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/nl.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/pl.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/pt.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/ru.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/sv.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/tr.ts +1 -16
- package/src/tool/cocktailBalancer/i18n/zh.ts +1 -16
- package/src/tool/fortifiedWine/bibliography.astro +14 -0
- package/src/tool/fortifiedWine/bibliography.ts +7 -0
- package/src/tool/fortifiedWine/component.astro +331 -0
- package/src/tool/fortifiedWine/entry.ts +62 -0
- package/src/tool/fortifiedWine/fortified-wine-builder.css +534 -0
- package/src/tool/fortifiedWine/i18n/de.ts +66 -0
- package/src/tool/fortifiedWine/i18n/en.ts +140 -0
- package/src/tool/fortifiedWine/i18n/es.ts +140 -0
- package/src/tool/fortifiedWine/i18n/fr.ts +91 -0
- package/src/tool/fortifiedWine/i18n/id.ts +91 -0
- package/src/tool/fortifiedWine/i18n/it.ts +91 -0
- package/src/tool/fortifiedWine/i18n/ja.ts +91 -0
- package/src/tool/fortifiedWine/i18n/ko.ts +91 -0
- package/src/tool/fortifiedWine/i18n/nl.ts +91 -0
- package/src/tool/fortifiedWine/i18n/pl.ts +91 -0
- package/src/tool/fortifiedWine/i18n/pt.ts +91 -0
- package/src/tool/fortifiedWine/i18n/ru.ts +91 -0
- package/src/tool/fortifiedWine/i18n/sv.ts +91 -0
- package/src/tool/fortifiedWine/i18n/tr.ts +91 -0
- package/src/tool/fortifiedWine/i18n/zh.ts +91 -0
- package/src/tool/fortifiedWine/index.ts +8 -0
- package/src/tool/fortifiedWine/logic.ts +46 -0
- package/src/tool/fortifiedWine/seo.astro +41 -0
- package/src/tool/jelloShotLab/bibliography.astro +14 -0
- package/src/tool/jelloShotLab/bibliography.ts +8 -0
- package/src/tool/jelloShotLab/component.astro +183 -0
- package/src/tool/jelloShotLab/entry.ts +62 -0
- package/src/tool/jelloShotLab/i18n/de.ts +156 -0
- package/src/tool/jelloShotLab/i18n/en.ts +156 -0
- package/src/tool/jelloShotLab/i18n/es.ts +156 -0
- package/src/tool/jelloShotLab/i18n/fr.ts +156 -0
- package/src/tool/jelloShotLab/i18n/id.ts +156 -0
- package/src/tool/jelloShotLab/i18n/it.ts +156 -0
- package/src/tool/jelloShotLab/i18n/ja.ts +156 -0
- package/src/tool/jelloShotLab/i18n/ko.ts +156 -0
- package/src/tool/jelloShotLab/i18n/nl.ts +156 -0
- package/src/tool/jelloShotLab/i18n/pl.ts +156 -0
- package/src/tool/jelloShotLab/i18n/pt.ts +156 -0
- package/src/tool/jelloShotLab/i18n/ru.ts +156 -0
- package/src/tool/jelloShotLab/i18n/sv.ts +156 -0
- package/src/tool/jelloShotLab/i18n/tr.ts +156 -0
- package/src/tool/jelloShotLab/i18n/zh.ts +156 -0
- package/src/tool/jelloShotLab/index.ts +11 -0
- package/src/tool/jelloShotLab/jello-shot-lab.css +229 -0
- package/src/tool/jelloShotLab/logic.ts +29 -0
- package/src/tool/jelloShotLab/seo.astro +53 -0
- package/src/tool/partyKeg/bibliography.ts +6 -0
- package/src/tool/partyKeg/entry.ts +1 -0
- package/src/tool/partyKeg/i18n/de.ts +1 -12
- package/src/tool/partyKeg/i18n/en.ts +1 -12
- package/src/tool/partyKeg/i18n/es.ts +1 -12
- package/src/tool/partyKeg/i18n/fr.ts +1 -12
- package/src/tool/partyKeg/i18n/id.ts +1 -12
- package/src/tool/partyKeg/i18n/it.ts +1 -12
- package/src/tool/partyKeg/i18n/ja.ts +1 -12
- package/src/tool/partyKeg/i18n/ko.ts +1 -12
- package/src/tool/partyKeg/i18n/nl.ts +1 -12
- package/src/tool/partyKeg/i18n/pl.ts +1 -12
- package/src/tool/partyKeg/i18n/pt.ts +1 -12
- package/src/tool/partyKeg/i18n/ru.ts +1 -12
- package/src/tool/partyKeg/i18n/sv.ts +1 -12
- package/src/tool/partyKeg/i18n/tr.ts +1 -12
- package/src/tool/partyKeg/i18n/zh.ts +1 -12
- package/src/tool/partyKeg/party-stock-calculator.css +23 -23
- package/src/tools.ts +5 -0
- package/src/types.ts +1 -1
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/* Common Tokens */
|
|
3
|
+
--jsl-radius-xl: 32px;
|
|
4
|
+
--jsl-radius-lg: 20px;
|
|
5
|
+
--jsl-radius-md: 12px;
|
|
6
|
+
--jsl-transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
|
|
7
|
+
--jsl-shadow-xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.jsl-container {
|
|
11
|
+
display: flex;
|
|
12
|
+
justify-content: center;
|
|
13
|
+
align-items: center;
|
|
14
|
+
padding: 1.5rem;
|
|
15
|
+
min-height: 400px;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Light Theme */
|
|
19
|
+
.theme-light .jsl-container,
|
|
20
|
+
.jsl-container:not(.theme-dark) {
|
|
21
|
+
--jsl-card-bg: #fff;
|
|
22
|
+
--jsl-text-main: #0f172a;
|
|
23
|
+
--jsl-text-muted: #64748b;
|
|
24
|
+
--jsl-accent: #2563eb;
|
|
25
|
+
--jsl-accent-soft: #eff6ff;
|
|
26
|
+
--jsl-input-bg: #f8fafc;
|
|
27
|
+
--jsl-border: #e2e8f0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Dark Theme */
|
|
31
|
+
.theme-dark .jsl-container {
|
|
32
|
+
--jsl-card-bg: #1e293b;
|
|
33
|
+
--jsl-text-main: #f8fafc;
|
|
34
|
+
--jsl-text-muted: #94a3b8;
|
|
35
|
+
--jsl-accent: #10b981;
|
|
36
|
+
--jsl-accent-soft: rgba(16, 185, 129, 0.1);
|
|
37
|
+
--jsl-input-bg: rgba(15, 23, 42, 0.4);
|
|
38
|
+
--jsl-border: rgba(255, 255, 255, 0.1);
|
|
39
|
+
--jsl-glass-blur: blur(16px);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.jsl-card {
|
|
43
|
+
width: 100%;
|
|
44
|
+
max-width: 900px;
|
|
45
|
+
background: var(--jsl-card-bg);
|
|
46
|
+
backdrop-filter: var(--jsl-glass-blur);
|
|
47
|
+
border: 1px solid var(--jsl-border);
|
|
48
|
+
border-radius: var(--jsl-radius-xl);
|
|
49
|
+
box-shadow: var(--jsl-shadow-xl);
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
display: grid;
|
|
52
|
+
grid-template-columns: 1.2fr 0.8fr;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@media (max-width: 768px) {
|
|
56
|
+
.jsl-card {
|
|
57
|
+
grid-template-columns: 1fr;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.jsl-content-panel {
|
|
62
|
+
padding: 2.5rem;
|
|
63
|
+
display: flex;
|
|
64
|
+
flex-direction: column;
|
|
65
|
+
gap: 2rem;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.jsl-visual-panel {
|
|
69
|
+
padding: 2.5rem;
|
|
70
|
+
background: var(--jsl-accent-soft);
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-direction: column;
|
|
73
|
+
align-items: center;
|
|
74
|
+
justify-content: center;
|
|
75
|
+
gap: 2rem;
|
|
76
|
+
border-left: 1px solid var(--jsl-border);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@media (max-width: 768px) {
|
|
80
|
+
.jsl-visual-panel {
|
|
81
|
+
border-left: none;
|
|
82
|
+
border-top: 1px solid var(--jsl-border);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.jsl-grid-inputs {
|
|
87
|
+
display: grid;
|
|
88
|
+
grid-template-columns: 1fr 1fr;
|
|
89
|
+
gap: 1.5rem;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@media (max-width: 480px) {
|
|
93
|
+
.jsl-grid-inputs {
|
|
94
|
+
grid-template-columns: 1fr;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.jsl-field {
|
|
99
|
+
display: flex;
|
|
100
|
+
flex-direction: column;
|
|
101
|
+
gap: 0.5rem;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.jsl-label {
|
|
105
|
+
font-size: 0.75rem;
|
|
106
|
+
font-weight: 700;
|
|
107
|
+
color: var(--jsl-text-muted);
|
|
108
|
+
text-transform: uppercase;
|
|
109
|
+
letter-spacing: 0.05em;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* High-end Styled Input & Select */
|
|
113
|
+
.jsl-input, .jsl-select {
|
|
114
|
+
width: 100%;
|
|
115
|
+
padding: 0.875rem 1rem;
|
|
116
|
+
background: var(--jsl-input-bg);
|
|
117
|
+
border: 2px solid transparent;
|
|
118
|
+
border-radius: var(--jsl-radius-md);
|
|
119
|
+
color: var(--jsl-text-main);
|
|
120
|
+
font-size: 1rem;
|
|
121
|
+
font-weight: 600;
|
|
122
|
+
transition: var(--jsl-transition);
|
|
123
|
+
outline: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.jsl-select {
|
|
127
|
+
appearance: none;
|
|
128
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='Length 19 9l-7 7-7-7' /%3E%3C/svg%3E");
|
|
129
|
+
background-repeat: no-repeat;
|
|
130
|
+
background-position: right 1rem center;
|
|
131
|
+
background-size: 1.25rem;
|
|
132
|
+
padding-right: 3rem;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.jsl-input:focus, .jsl-select:focus {
|
|
136
|
+
border-color: var(--jsl-accent);
|
|
137
|
+
background: var(--jsl-card-bg);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Visualization */
|
|
141
|
+
.jsl-tank {
|
|
142
|
+
width: 140px;
|
|
143
|
+
height: 200px;
|
|
144
|
+
border: 3px solid var(--jsl-text-main);
|
|
145
|
+
border-top: none;
|
|
146
|
+
border-radius: 0 0 32px 32px;
|
|
147
|
+
position: relative;
|
|
148
|
+
overflow: hidden;
|
|
149
|
+
background: rgba(0, 0, 0, 0.05);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.jsl-liquid {
|
|
153
|
+
position: absolute;
|
|
154
|
+
bottom: 0;
|
|
155
|
+
left: 0;
|
|
156
|
+
width: 100%;
|
|
157
|
+
transition: height 1s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.jsl-liquid-water {
|
|
161
|
+
background: #3b82f6;
|
|
162
|
+
opacity: 0.7;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.jsl-liquid-alcohol {
|
|
166
|
+
background: var(--jsl-accent);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.jsl-stats-compact {
|
|
170
|
+
display: flex;
|
|
171
|
+
flex-direction: column;
|
|
172
|
+
gap: 1rem;
|
|
173
|
+
width: 100%;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.jsl-stat-row {
|
|
177
|
+
display: flex;
|
|
178
|
+
justify-content: space-between;
|
|
179
|
+
align-items: center;
|
|
180
|
+
padding-bottom: 0.75rem;
|
|
181
|
+
border-bottom: 1px dashed var(--jsl-border);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.jsl-stat-l {
|
|
185
|
+
font-size: 0.875rem;
|
|
186
|
+
color: var(--jsl-text-muted);
|
|
187
|
+
font-weight: 500;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.jsl-stat-v {
|
|
191
|
+
font-size: 1.125rem;
|
|
192
|
+
font-weight: 800;
|
|
193
|
+
color: var(--jsl-accent);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* Toggle repositioned inside card */
|
|
197
|
+
.jsl-card-header {
|
|
198
|
+
grid-column: 1 / -1;
|
|
199
|
+
padding: 1rem 2.5rem;
|
|
200
|
+
background: rgba(0,0,0,0.03);
|
|
201
|
+
display: flex;
|
|
202
|
+
justify-content: flex-end;
|
|
203
|
+
border-bottom: 1px solid var(--jsl-border);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.jsl-mini-toggle {
|
|
207
|
+
display: flex;
|
|
208
|
+
background: var(--jsl-input-bg);
|
|
209
|
+
padding: 0.25rem;
|
|
210
|
+
border-radius: 99px;
|
|
211
|
+
gap: 0.25rem;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.jsl-mini-btn {
|
|
215
|
+
padding: 0.4rem 0.8rem;
|
|
216
|
+
border-radius: 99px;
|
|
217
|
+
border: none;
|
|
218
|
+
background: transparent;
|
|
219
|
+
color: var(--jsl-text-muted);
|
|
220
|
+
cursor: pointer;
|
|
221
|
+
font-size: 0.75rem;
|
|
222
|
+
font-weight: 700;
|
|
223
|
+
transition: var(--jsl-transition);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.jsl-mini-btn.active {
|
|
227
|
+
background: var(--jsl-accent);
|
|
228
|
+
color: white;
|
|
229
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface JelloOptions {
|
|
2
|
+
abv: number;
|
|
3
|
+
totalVolume: number;
|
|
4
|
+
intensity: 'light' | 'balanced' | 'limit';
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface JelloResults {
|
|
8
|
+
boilingWaterVolume: number;
|
|
9
|
+
alcoholVolume: number;
|
|
10
|
+
packetsNeeded: number;
|
|
11
|
+
chillingTimeHours: number;
|
|
12
|
+
finalAbv: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function calculateJelloShot(options: JelloOptions): JelloResults {
|
|
16
|
+
const { abv, totalVolume, intensity } = options;
|
|
17
|
+
|
|
18
|
+
let alcoholRatio = 0.45;
|
|
19
|
+
if (intensity === 'light') alcoholRatio = 0.30;
|
|
20
|
+
if (intensity === 'limit') alcoholRatio = Math.min(0.55, 35 / abv);
|
|
21
|
+
|
|
22
|
+
const alcoholVolume = totalVolume * alcoholRatio;
|
|
23
|
+
const boilingWaterVolume = totalVolume - alcoholVolume;
|
|
24
|
+
const packetsNeeded = totalVolume / 475;
|
|
25
|
+
const chillingTimeHours = 4 + (totalVolume > 1000 ? (totalVolume - 1000) / 1000 : 0);
|
|
26
|
+
const finalAbv = (alcoholVolume * abv) / totalVolume;
|
|
27
|
+
|
|
28
|
+
return { boilingWaterVolume, alcoholVolume, packetsNeeded, chillingTimeHours, finalAbv };
|
|
29
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
import {
|
|
3
|
+
SEOTitle, SEOTable, SEOTip, SEOCard, SEOStats,
|
|
4
|
+
SEOGlossary, SEOProsCons, SEOSummary, SEODiagnostic, SEOArticle
|
|
5
|
+
} from '@jjlmoya/utils-shared';
|
|
6
|
+
import { jelloShotLab } from './index';
|
|
7
|
+
import type { KnownLocale } from '../../types';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
locale?: KnownLocale;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const { locale = 'es' } = Astro.props;
|
|
14
|
+
const content = await jelloShotLab.i18n[locale]?.();
|
|
15
|
+
if (!content) return null;
|
|
16
|
+
|
|
17
|
+
const { seo } = content;
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<SEOArticle>
|
|
21
|
+
{seo.map((section: any) => {
|
|
22
|
+
switch (section.type) {
|
|
23
|
+
case 'summary':
|
|
24
|
+
return <SEOSummary title={section.title} items={section.items} />;
|
|
25
|
+
case 'title':
|
|
26
|
+
return <SEOTitle title={section.text} level={section.level || 2} />;
|
|
27
|
+
case 'paragraph':
|
|
28
|
+
return <p set:html={section.html} />;
|
|
29
|
+
case 'stats':
|
|
30
|
+
return <SEOStats stats={section.items} columns={section.columns} />;
|
|
31
|
+
case 'card':
|
|
32
|
+
return <SEOCard title={section.title} icon={section.icon}><Fragment set:html={section.html} /></SEOCard>;
|
|
33
|
+
case 'tip':
|
|
34
|
+
return <SEOTip title={section.title}><Fragment set:html={section.html} /></SEOTip>;
|
|
35
|
+
case 'table':
|
|
36
|
+
return (
|
|
37
|
+
<SEOTable headers={section.headers}>
|
|
38
|
+
{section.rows.map((row: string[]) => (
|
|
39
|
+
<tr>{row.map((cell: string) => <td set:html={cell} />)}</tr>
|
|
40
|
+
))}
|
|
41
|
+
</SEOTable>
|
|
42
|
+
);
|
|
43
|
+
case 'proscons':
|
|
44
|
+
return <SEOProsCons title={section.title} items={section.items} />;
|
|
45
|
+
case 'diagnostic':
|
|
46
|
+
return <SEODiagnostic title={section.title} icon={section.icon} type={section.variant} badge={section.badge}><Fragment set:html={section.html} /></SEODiagnostic>;
|
|
47
|
+
case 'glossary':
|
|
48
|
+
return <SEOGlossary items={section.items} />;
|
|
49
|
+
default:
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
})}
|
|
53
|
+
</SEOArticle>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{ name: 'Event Planning: Alcohol & Bar Calculations - Spruce Eats', url: 'https://www.thespruceeats.com/stock-your-bar-for-a-party-760394' },
|
|
5
|
+
{ name: 'Thermodynamics of Ice Melting - Engineering Toolbox', url: 'https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html' },
|
|
6
|
+
];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Häufig gestellte Fragen';
|
|
30
|
-
const bibliographyTitle = 'Bibliographie und Quellen';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Frequently Asked Questions';
|
|
30
|
-
const bibliographyTitle = 'Bibliography & Sources';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Preguntas Frecuentes';
|
|
30
|
-
const bibliographyTitle = 'Bibliografía y Fuentes';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -184,7 +174,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
184
174
|
seo,
|
|
185
175
|
faqTitle,
|
|
186
176
|
faq,
|
|
187
|
-
bibliographyTitle,
|
|
188
177
|
bibliography,
|
|
189
178
|
howTo,
|
|
190
179
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Foire Aux Questions';
|
|
30
|
-
const bibliographyTitle = 'Bibliographie & Sources';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Pertanyaan yang Sering Diajukan';
|
|
30
|
-
const bibliographyTitle = 'Bibliografi & Sumber';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Domande Frequenti';
|
|
30
|
-
const bibliographyTitle = 'Bibliografia e Fonti';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'よくある質問';
|
|
30
|
-
const bibliographyTitle = '参考文献とソース';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = '자주 묻는 질문';
|
|
30
|
-
const bibliographyTitle = '참고 문헌 및 소스';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Veelgestelde Vragen';
|
|
30
|
-
const bibliographyTitle = 'Bibliografie en Bronnen';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
1
2
|
import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
|
|
2
3
|
import type { PartyKegUI, PartyKegLocaleContent } from '../index';
|
|
3
4
|
|
|
@@ -27,7 +28,6 @@ const ui: PartyKegUI = {
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
const faqTitle = 'Часто Задаваемые Вопросы';
|
|
30
|
-
const bibliographyTitle = 'Bibliografia i Źródła';
|
|
31
31
|
|
|
32
32
|
const faq: PartyKegLocaleContent['faq'] = [
|
|
33
33
|
{
|
|
@@ -63,16 +63,6 @@ const howTo: PartyKegLocaleContent['howTo'] = [
|
|
|
63
63
|
},
|
|
64
64
|
];
|
|
65
65
|
|
|
66
|
-
const bibliography: PartyKegLocaleContent['bibliography'] = [
|
|
67
|
-
{
|
|
68
|
-
name: "Event Planning: Alcohol & Bar Calculations - Spruce Eats",
|
|
69
|
-
url: "https://www.thespruceeats.com/stock-your-bar-for-a-party-760394",
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
name: "Thermodynamics of Ice Melting - Engineering Toolbox",
|
|
73
|
-
url: "https://www.engineeringtoolbox.com/saturated-ice-steam-d_970.html",
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
66
|
|
|
77
67
|
const seo: PartyKegLocaleContent['seo'] = [
|
|
78
68
|
{
|
|
@@ -180,7 +170,6 @@ export const content: PartyKegLocaleContent = {
|
|
|
180
170
|
seo,
|
|
181
171
|
faqTitle,
|
|
182
172
|
faq,
|
|
183
|
-
bibliographyTitle,
|
|
184
173
|
bibliography,
|
|
185
174
|
howTo,
|
|
186
175
|
schemas,
|