@jjlmoya/utils-nature 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.
- package/package.json +60 -0
- package/src/category/i18n/en.ts +110 -0
- package/src/category/i18n/es.ts +127 -0
- package/src/category/i18n/fr.ts +110 -0
- package/src/category/index.ts +14 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +30 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/cricketThermometer/bibliography.astro +14 -0
- package/src/tool/cricketThermometer/component.astro +549 -0
- package/src/tool/cricketThermometer/i18n/en.ts +181 -0
- package/src/tool/cricketThermometer/i18n/es.ts +181 -0
- package/src/tool/cricketThermometer/i18n/fr.ts +181 -0
- package/src/tool/cricketThermometer/index.ts +34 -0
- package/src/tool/cricketThermometer/logic.ts +6 -0
- package/src/tool/cricketThermometer/seo.astro +15 -0
- package/src/tool/cricketThermometer/ui.ts +11 -0
- package/src/tool/digitalCarbon/bibliography.astro +9 -0
- package/src/tool/digitalCarbon/component.astro +582 -0
- package/src/tool/digitalCarbon/i18n/en.ts +235 -0
- package/src/tool/digitalCarbon/i18n/es.ts +235 -0
- package/src/tool/digitalCarbon/i18n/fr.ts +235 -0
- package/src/tool/digitalCarbon/index.ts +33 -0
- package/src/tool/digitalCarbon/logic.ts +107 -0
- package/src/tool/digitalCarbon/seo.astro +14 -0
- package/src/tool/digitalCarbon/ui.ts +38 -0
- package/src/tool/rainHarvester/bibliography.astro +9 -0
- package/src/tool/rainHarvester/component.astro +559 -0
- package/src/tool/rainHarvester/i18n/en.ts +185 -0
- package/src/tool/rainHarvester/i18n/es.ts +185 -0
- package/src/tool/rainHarvester/i18n/fr.ts +185 -0
- package/src/tool/rainHarvester/index.ts +33 -0
- package/src/tool/rainHarvester/logic.ts +12 -0
- package/src/tool/rainHarvester/seo.astro +14 -0
- package/src/tool/rainHarvester/ui.ts +23 -0
- package/src/tool/seedCalculator/bibliography.astro +8 -0
- package/src/tool/seedCalculator/component.astro +812 -0
- package/src/tool/seedCalculator/i18n/en.ts +213 -0
- package/src/tool/seedCalculator/i18n/es.ts +213 -0
- package/src/tool/seedCalculator/i18n/fr.ts +213 -0
- package/src/tool/seedCalculator/index.ts +34 -0
- package/src/tool/seedCalculator/logic.ts +19 -0
- package/src/tool/seedCalculator/seo.astro +9 -0
- package/src/tool/seedCalculator/ui.ts +39 -0
- package/src/tools.ts +12 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { RainHarvesterLocaleContent } from '../index';
|
|
3
|
+
|
|
4
|
+
const slug = 'rainwater-calculator';
|
|
5
|
+
const title = 'Rainwater Harvesting Calculator';
|
|
6
|
+
const description = 'Calculate how much rainwater you can collect from your roof and size your storage tank.';
|
|
7
|
+
|
|
8
|
+
const faqData = [
|
|
9
|
+
{
|
|
10
|
+
question: 'How much water can I actually collect from my roof?',
|
|
11
|
+
answer: 'The general rule is that for every square meter of roof and every millimeter of rain, you can collect approximately 1 liter of water. However, there are losses from evaporation and filtration adjusted with the "runoff coefficient".',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'What is the runoff coefficient?',
|
|
15
|
+
answer: 'It is a percentage that indicates how much water is lost depending on the roof material. A metal or tile roof is very efficient (0.85-0.95), while a gravel or soil roof is much less efficient (0.1-0.3).',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: 'How do I size the storage tank?',
|
|
19
|
+
answer: 'You should calculate the maximum expected rain volume in a month and cross-reference it with your estimated monthly consumption. A tank that is too small will overflow in storms, and one that is too large will be unnecessarily expensive.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Is it safe to drink collected rainwater?',
|
|
23
|
+
answer: 'Not directly. Water carries dust, bird droppings, and airborne particles. For human consumption, it must pass through sediment filters, activated carbon, and disinfection using UV light or chlorine.',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const howToData = [
|
|
28
|
+
{
|
|
29
|
+
name: 'Measure the horizontal surface',
|
|
30
|
+
text: 'Measure the length and width of your roof base (not the sloped surface, but the area that projects shadows on the ground).',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Check local rainfall',
|
|
34
|
+
text: 'Search the national meteorological service for the average annual or monthly precipitation in your area in millimeters (mm).',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Apply material efficiency',
|
|
38
|
+
text: 'Select your roof material in our calculator to discount the water that will be lost through absorption or heat.',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Calculate the required volume',
|
|
42
|
+
text: 'Use the annual liters result to choose a tank that can store at least 20-30% of the total harvest for dry periods.',
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'FAQPage',
|
|
49
|
+
mainEntity: faqData.map((item) => ({
|
|
50
|
+
'@type': 'Question',
|
|
51
|
+
name: item.question,
|
|
52
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
53
|
+
})),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
57
|
+
'@context': 'https://schema.org',
|
|
58
|
+
'@type': 'HowTo',
|
|
59
|
+
name: title,
|
|
60
|
+
description,
|
|
61
|
+
step: howToData.map((step, i) => ({
|
|
62
|
+
'@type': 'HowToStep',
|
|
63
|
+
position: i + 1,
|
|
64
|
+
name: step.name,
|
|
65
|
+
text: step.text,
|
|
66
|
+
})),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
70
|
+
'@context': 'https://schema.org',
|
|
71
|
+
'@type': 'SoftwareApplication',
|
|
72
|
+
name: title,
|
|
73
|
+
description,
|
|
74
|
+
applicationCategory: 'UtilityApplication',
|
|
75
|
+
operatingSystem: 'All',
|
|
76
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
77
|
+
inLanguage: 'en',
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const content: RainHarvesterLocaleContent = {
|
|
81
|
+
slug,
|
|
82
|
+
title,
|
|
83
|
+
description,
|
|
84
|
+
ui: {
|
|
85
|
+
headInputs: 'Roof Settings',
|
|
86
|
+
headResults: 'Harvest Potential',
|
|
87
|
+
labelArea: 'Roof Area',
|
|
88
|
+
labelRainfall: 'Annual Rainfall',
|
|
89
|
+
labelMaterial: 'Roof Material',
|
|
90
|
+
unitM2: 'm²',
|
|
91
|
+
unitMm: 'mm',
|
|
92
|
+
unitLiters: 'Liters',
|
|
93
|
+
helpRainfall: 'Don\'t know? Search "average annual precipitation [your city]" on Google.',
|
|
94
|
+
efficiencyTitle: 'Efficiency Factor',
|
|
95
|
+
efficiencyNote: 'A 10% loss is applied for filters and evaporation.',
|
|
96
|
+
resultTitle: 'Annual Harvest Potential',
|
|
97
|
+
equivalenciesTitle: 'Practical Equivalents',
|
|
98
|
+
labelFlushes: 'Toilet Flushes',
|
|
99
|
+
labelShowers: 'Showers (10 min)',
|
|
100
|
+
labelGarden: 'Garden Watering',
|
|
101
|
+
gardenArea: '(50m²)',
|
|
102
|
+
materialMetal: 'Metal / Glazed Tile',
|
|
103
|
+
materialClay: 'Arabic Tile / Clay',
|
|
104
|
+
materialConcrete: 'Concrete / Asphalt',
|
|
105
|
+
materialGravel: 'Gravel / Green Roof',
|
|
106
|
+
},
|
|
107
|
+
seo: [
|
|
108
|
+
{
|
|
109
|
+
type: 'title',
|
|
110
|
+
text: 'Rainwater Harvesting: Autonomy and Sustainability',
|
|
111
|
+
level: 2,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'paragraph',
|
|
115
|
+
html: 'Most homeowners are unaware of the potential of their own roofs. A standard roof can capture thousands of liters of free water each year. This tool quantifies that potential, allowing you to calculate exactly how much water you can "harvest" and determine the ideal tank size for storage.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'title',
|
|
119
|
+
text: 'Calculation Logic',
|
|
120
|
+
level: 3,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: 'The base formula for rainwater collection is simple but powerful:',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
type: 'paragraph',
|
|
128
|
+
html: '<code style="display:block;padding:1rem;background:var(--bg-alt);border-radius:0.5rem;margin:1rem 0;font-family:monospace;">Volume = Area × Rainfall × Runoff Coefficient × Filter Efficiency</code>',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'list',
|
|
132
|
+
items: [
|
|
133
|
+
'<strong>Area:</strong> Your roof footprint (projected length × width).',
|
|
134
|
+
'<strong>Rainfall:</strong> Falling rain in millimeters.',
|
|
135
|
+
'<strong>Coefficient:</strong> How much water your roof loses (e.g., absorption).',
|
|
136
|
+
'<strong>Efficiency:</strong> Losses in pre-tank filters (~10%).',
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
type: 'title',
|
|
141
|
+
text: 'Why Collect Rainwater?',
|
|
142
|
+
level: 3,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'list',
|
|
146
|
+
items: [
|
|
147
|
+
'<strong>Savings:</strong> Significantly reduce your water bill.',
|
|
148
|
+
'<strong>Gardening:</strong> Plants love water without chlorine or lime.',
|
|
149
|
+
'<strong>Resilience:</strong> Maintain an emergency reserve in case of cuts.',
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'title',
|
|
154
|
+
text: 'Tank Sizing',
|
|
155
|
+
level: 2,
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'paragraph',
|
|
159
|
+
html: 'The most common mistake is buying a tank based only on budget. If it is too small, you will waste thousands of liters due to overflow. If it is too large, you will spend money unnecessarily. A general rule is to have capacity to store <strong>3 months</strong> of average rainfall in your area, allowing you to bridge dry seasons.',
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
faqTitle: 'Frequently Asked Questions',
|
|
163
|
+
faq: faqData,
|
|
164
|
+
howTo: howToData,
|
|
165
|
+
bibliographyTitle: 'Scientific References',
|
|
166
|
+
bibliography: [
|
|
167
|
+
{
|
|
168
|
+
name: 'FAO - Rainwater Harvesting and Storage',
|
|
169
|
+
url: 'https://www.fao.org/3/a1348s/a1348s.pdf',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'Texas A&M AgriLife Extension - Rainwater Harvesting',
|
|
173
|
+
url: 'https://rainwaterharvesting.tamu.edu/',
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: 'Brad Lancaster - Rainwater Harvesting for Drylands',
|
|
177
|
+
url: 'https://www.harvestingrainwater.com/',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'European Environment Agency - Water Resources',
|
|
181
|
+
url: 'https://www.eea.europa.eu/en/topics/in-depth/water',
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
185
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { RainHarvesterLocaleContent } from '../index';
|
|
3
|
+
|
|
4
|
+
const slug = 'calculadora-agua-lluvia';
|
|
5
|
+
const title = 'Calculadora de Agua de Lluvia';
|
|
6
|
+
const description = 'Calcula cuánta agua puedes recolectar de tu tejado y dimensiona tu tanque de almacenamiento.';
|
|
7
|
+
|
|
8
|
+
const faqData = [
|
|
9
|
+
{
|
|
10
|
+
question: '¿Cuánta agua puedo recoger realmente de mi tejado?',
|
|
11
|
+
answer: 'La regla general es que por cada metro cuadrado de techo y cada milímetro de lluvia, puedes recoger aproximadamente 1 litro de agua. Sin embargo, hay pérdidas por evaporación y filtración que se ajustan con el "coeficiente de escorrentía".',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: '¿Qué es el coeficiente de escorrentía?',
|
|
15
|
+
answer: 'Es un porcentaje que indica cuánto agua se pierde según el material del techo. Un tejado de chapa o azulejo es muy eficiente (0.85-0.95), mientras que uno de grava o tierra es mucho menos eficiente (0.1-0.3).',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: '¿Cómo dimensionar el tanque de almacenamiento?',
|
|
19
|
+
answer: 'Debes calcular el volumen de lluvia máxima esperada en un mes y cruzarlo con tu consumo mensual estimado. Un tanque demasiado pequeño desbordará en tormentas, y uno demasiado grande será innecesariamente caro.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '¿Es seguro beber agua de lluvia recolectada?',
|
|
23
|
+
answer: 'No directamente. El agua arrastra polvo, excrementos de pájaros y partículas del aire. Para consumo humano, debe pasar por filtros de sedimentos, carbón activado y desinfección mediante luz UV o cloro.',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const howToData = [
|
|
28
|
+
{
|
|
29
|
+
name: 'Medir la superficie horizontal',
|
|
30
|
+
text: 'Mide el largo y ancho de la base de tu tejado (no la superficie inclinada, sino el área que proyecta sombras sobre el suelo).',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Consultar la pluviosidad local',
|
|
34
|
+
text: 'Busca en el servicio meteorológico nacional la precipitación media anual o mensual de tu zona en milímetros (mm).',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Aplicar eficiencia de materiales',
|
|
38
|
+
text: 'Selecciona el material de tu techo en nuestra calculadora para descontar el agua que se perderá por absorción o calor.',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Calcular el volumen necesario',
|
|
42
|
+
text: 'Usa el resultado de litros anuales para elegir un depósito que pueda almacenar al menos el 20-30% de la cosecha total para épocas de sequía.',
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'FAQPage',
|
|
49
|
+
mainEntity: faqData.map((item) => ({
|
|
50
|
+
'@type': 'Question',
|
|
51
|
+
name: item.question,
|
|
52
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
53
|
+
})),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
57
|
+
'@context': 'https://schema.org',
|
|
58
|
+
'@type': 'HowTo',
|
|
59
|
+
name: title,
|
|
60
|
+
description,
|
|
61
|
+
step: howToData.map((step, i) => ({
|
|
62
|
+
'@type': 'HowToStep',
|
|
63
|
+
position: i + 1,
|
|
64
|
+
name: step.name,
|
|
65
|
+
text: step.text,
|
|
66
|
+
})),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
70
|
+
'@context': 'https://schema.org',
|
|
71
|
+
'@type': 'SoftwareApplication',
|
|
72
|
+
name: title,
|
|
73
|
+
description,
|
|
74
|
+
applicationCategory: 'UtilityApplication',
|
|
75
|
+
operatingSystem: 'All',
|
|
76
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
77
|
+
inLanguage: 'es',
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const content: RainHarvesterLocaleContent = {
|
|
81
|
+
slug,
|
|
82
|
+
title,
|
|
83
|
+
description,
|
|
84
|
+
ui: {
|
|
85
|
+
headInputs: 'Configuración del Techo',
|
|
86
|
+
headResults: 'Potencial de Cosecha',
|
|
87
|
+
labelArea: 'Área del Techo',
|
|
88
|
+
labelRainfall: 'Precipitación Anual',
|
|
89
|
+
labelMaterial: 'Material del Techo',
|
|
90
|
+
unitM2: 'm²',
|
|
91
|
+
unitMm: 'mm',
|
|
92
|
+
unitLiters: 'Litros',
|
|
93
|
+
helpRainfall: '¿No lo sabes? Busca "precipitación media anual [tu ciudad]" en Google.',
|
|
94
|
+
efficiencyTitle: 'Factor de Eficiencia',
|
|
95
|
+
efficiencyNote: 'Se aplica una pérdida del 10% por filtros y evaporación.',
|
|
96
|
+
resultTitle: 'Potencial de Cosecha Anual',
|
|
97
|
+
equivalenciesTitle: 'Equivalencias Prácticas',
|
|
98
|
+
labelFlushes: 'Descargas de WC',
|
|
99
|
+
labelShowers: 'Duchas (10 min)',
|
|
100
|
+
labelGarden: 'Riegos de Jardín',
|
|
101
|
+
gardenArea: '(50m²)',
|
|
102
|
+
materialMetal: 'Metal / Teja Esmaltada',
|
|
103
|
+
materialClay: 'Teja Arábica / Arcilla',
|
|
104
|
+
materialConcrete: 'Hormigón / Asfalto',
|
|
105
|
+
materialGravel: 'Grava / Techo Verde',
|
|
106
|
+
},
|
|
107
|
+
seo: [
|
|
108
|
+
{
|
|
109
|
+
type: 'title',
|
|
110
|
+
text: 'Cosecha de Agua de Lluvia: Autonomía y Sostenibilidad',
|
|
111
|
+
level: 2,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'paragraph',
|
|
115
|
+
html: 'La mayoría de los propietarios desconocen el potencial de sus propios tejados. Un techo estándar puede capturar miles de litros de agua gratuita cada año. Esta herramienta cuantifica ese potencial, permitiéndote calcular exactamente cuánta agua puedes "cosechar" y determinar el tamaño ideal del tanque para almacenarla.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'title',
|
|
119
|
+
text: 'Lógica del Cálculo',
|
|
120
|
+
level: 3,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: 'La fórmula base para la recolección de agua de lluvia es simple pero poderosa:',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
type: 'paragraph',
|
|
128
|
+
html: '<code style="display:block;padding:1rem;background:var(--bg-alt);border-radius:0.5rem;margin:1rem 0;font-family:monospace;">Volumen = Área × Precipitación × Coeficiente de Escorrentía × Eficiencia del Filtro</code>',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'list',
|
|
132
|
+
items: [
|
|
133
|
+
'<strong>Área:</strong> La huella de tu techo (largo × ancho proyectado).',
|
|
134
|
+
'<strong>Precipitación:</strong> La lluvia caída en milímetros.',
|
|
135
|
+
'<strong>Coeficiente:</strong> Qué tanta agua pierde tu techo (ej. absorción).',
|
|
136
|
+
'<strong>Eficiencia:</strong> Pérdidas en los filtros previos al tanque (~10%).',
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
type: 'title',
|
|
141
|
+
text: '¿Por qué recolectar lluvia?',
|
|
142
|
+
level: 3,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'list',
|
|
146
|
+
items: [
|
|
147
|
+
'<strong>Ahorro:</strong> Reduce tu factura de agua significativamente.',
|
|
148
|
+
'<strong>Jardinería:</strong> A las plantas les encanta el agua sin cloro ni cal.',
|
|
149
|
+
'<strong>Resiliencia:</strong> Mantén una reserva de emergencia en caso de cortes.',
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'title',
|
|
154
|
+
text: 'Dimensionamiento del Tanque',
|
|
155
|
+
level: 2,
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'paragraph',
|
|
159
|
+
html: 'El error más común es comprar un tanque basándose solo en el presupuesto. Si es muy pequeño, desperdiciarás miles de litros por desbordamiento. Si es muy grande, gastarás dinero innecesariamente. Una regla general es tener capacidad para almacenar el agua de <strong>3 meses</strong> de lluvia promedio en tu zona, permitiéndote superar las estaciones secas.',
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
163
|
+
faq: faqData,
|
|
164
|
+
bibliographyTitle: 'Referencias Científicas',
|
|
165
|
+
bibliography: [
|
|
166
|
+
{
|
|
167
|
+
name: 'FAO - Captación y almacenamiento de agua de lluvia',
|
|
168
|
+
url: 'https://www.fao.org/3/a1348s/a1348s.pdf',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: 'Texas A&M AgriLife Extension - Rainwater Harvesting',
|
|
172
|
+
url: 'https://rainwaterharvesting.tamu.edu/',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'Brad Lancaster - Rainwater Harvesting for Drylands',
|
|
176
|
+
url: 'https://www.harvestingrainwater.com/',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: 'European Environment Agency - Water Resources',
|
|
180
|
+
url: 'https://www.eea.europa.eu/en/topics/in-depth/water',
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
howTo: howToData,
|
|
184
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
185
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { RainHarvesterLocaleContent } from '../index';
|
|
3
|
+
|
|
4
|
+
const slug = 'calculateur-eau-pluie';
|
|
5
|
+
const title = 'Calculateur de récupération d\'eau de pluie';
|
|
6
|
+
const description = 'Calculez la quantité d\'eau que vous pouvez collecter sur votre toit et dimensionnez votre réservoir de stockage.';
|
|
7
|
+
|
|
8
|
+
const faqData = [
|
|
9
|
+
{
|
|
10
|
+
question: 'Combien d\'eau puis-je réellement collecter sur mon toit ?',
|
|
11
|
+
answer: 'La règle générale est que pour chaque mètre carré de toit et chaque millimètre de pluie, vous pouvez collecter environ 1 litre d\'eau. Cependant, il y a des pertes par évaporation et filtration ajustées avec le "coefficient de ruissellement".',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
question: 'Qu\'est-ce que le coefficient de ruissellement ?',
|
|
15
|
+
answer: 'C\'est un pourcentage qui indique la quantité d\'eau perdue selon le matériau du toit. Un toit en métal o en tuiles est très efficace (0,85-0,95), tandis qu\'un toit en gravier ou en terre est beaucoup moins efficace (0,1-0,3).',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
question: 'Comment dimensionner le réservoir de stockage ?',
|
|
19
|
+
answer: 'Vous devez calculer le volume de pluie maximum attendu par mois et le croiser avec votre consommation mensuelle estimée. Un réservoir trop petit débordera pendant les tempêtes, et un réservoir trop grand sera inutilement coûteux.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Peut-on boire l\'eau de pluie collectée en toute sécurité ?',
|
|
23
|
+
answer: 'Pas directement. L\'eau transporte de la poussière, des fientes d\'oiseaux et des particules en suspension. Pour la consommation humaine, elle doit passer par des filtres à sédiments, du charbon actif et une désinfection par lumière UV ou chlore.',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const howToData = [
|
|
28
|
+
{
|
|
29
|
+
name: 'Mesurer la surface horizontale',
|
|
30
|
+
text: 'Mesurez la longueur et la largeur de la base de votre toit (pas la surface inclinée, mais la zone qui projette des ombres sur le sol).',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Vérifier les précipitations locales',
|
|
34
|
+
text: 'Recherchez auprès du service météorologique national les précipitations annuelles ou mensuelles moyennes de votre région en millimètres (mm).',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Appliquer l\'efficacité des matériaux',
|
|
38
|
+
text: 'Sélectionnez le matériau de votre toit dans notre calculateur pour déduire l\'eau qui sera perdue par absorption ou chaleur.',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Calculer le volume requis',
|
|
42
|
+
text: 'Utilisez le résultat en litres annuels pour choisir un réservoir capable de stocker au moins 20 à 30 % de la récolte totale pour les périodes sèches.',
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
47
|
+
'@context': 'https://schema.org',
|
|
48
|
+
'@type': 'FAQPage',
|
|
49
|
+
mainEntity: faqData.map((item) => ({
|
|
50
|
+
'@type': 'Question',
|
|
51
|
+
name: item.question,
|
|
52
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
53
|
+
})),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
57
|
+
'@context': 'https://schema.org',
|
|
58
|
+
'@type': 'HowTo',
|
|
59
|
+
name: title,
|
|
60
|
+
description,
|
|
61
|
+
step: howToData.map((step, i) => ({
|
|
62
|
+
'@type': 'HowToStep',
|
|
63
|
+
position: i + 1,
|
|
64
|
+
name: step.name,
|
|
65
|
+
text: step.text,
|
|
66
|
+
})),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
70
|
+
'@context': 'https://schema.org',
|
|
71
|
+
'@type': 'SoftwareApplication',
|
|
72
|
+
name: title,
|
|
73
|
+
description,
|
|
74
|
+
applicationCategory: 'UtilityApplication',
|
|
75
|
+
operatingSystem: 'All',
|
|
76
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
77
|
+
inLanguage: 'fr',
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const content: RainHarvesterLocaleContent = {
|
|
81
|
+
slug,
|
|
82
|
+
title,
|
|
83
|
+
description,
|
|
84
|
+
ui: {
|
|
85
|
+
headInputs: 'Paramètres du toit',
|
|
86
|
+
headResults: 'Potentiel de récolte',
|
|
87
|
+
labelArea: 'Surface du toit',
|
|
88
|
+
labelRainfall: 'Précipitations annuelles',
|
|
89
|
+
labelMaterial: 'Matériau du toit',
|
|
90
|
+
unitM2: 'm²',
|
|
91
|
+
unitMm: 'mm',
|
|
92
|
+
unitLiters: 'Litres',
|
|
93
|
+
helpRainfall: 'Vous ne savez pas ? Recherchez "précipitations annuelles moyennes [votre ville]" sur Google.',
|
|
94
|
+
efficiencyTitle: 'Facteur d\'efficacité',
|
|
95
|
+
efficiencyNote: 'Une perte de 10% est appliquée pour les filtres et l\'évaporation.',
|
|
96
|
+
resultTitle: 'Potentiel de récolte annuel',
|
|
97
|
+
equivalenciesTitle: 'Équivalences pratiques',
|
|
98
|
+
labelFlushes: 'Chasses d\'eau',
|
|
99
|
+
labelShowers: 'Douches (10 min)',
|
|
100
|
+
labelGarden: 'Arrosages du jardin',
|
|
101
|
+
gardenArea: '(50m²)',
|
|
102
|
+
materialMetal: 'Métal / Tuile émaillée',
|
|
103
|
+
materialClay: 'Tuile arabe / Argile',
|
|
104
|
+
materialConcrete: 'Béton / Asphalte',
|
|
105
|
+
materialGravel: 'Gravier / Toit végétalisé',
|
|
106
|
+
},
|
|
107
|
+
seo: [
|
|
108
|
+
{
|
|
109
|
+
type: 'title',
|
|
110
|
+
text: 'Récupération de l\'eau de pluie : Autonomie et durabilité',
|
|
111
|
+
level: 2,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'paragraph',
|
|
115
|
+
html: 'La plupart des propriétaires ignorent le potentiel de leur propre toit. Un toit standard peut capturer des milliers de litres d\'eau gratuite chaque année. Cet outil quantifie ce potentiel, vous permettant de calculer exactement la quantité d\'eau que vous pouvez "récolter" et de déterminer la taille idéale du réservoir de stockage.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: 'title',
|
|
119
|
+
text: 'Logique de Calcul',
|
|
120
|
+
level: 3,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: 'paragraph',
|
|
124
|
+
html: 'La formule de base pour la collecte de l\'eau de pluie est simple mais puissante :',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
type: 'paragraph',
|
|
128
|
+
html: '<code style="display:block;padding:1rem;background:var(--bg-alt);border-radius:0.5rem;margin:1rem 0;font-family:monospace;">Volume = Surface × Précipitations × Coefficient de Ruissellement × Efficacité du Filtre</code>',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'list',
|
|
132
|
+
items: [
|
|
133
|
+
'<strong>Surface :</strong> L\'empreinte de votre toit (longueur × largeur projetée).',
|
|
134
|
+
'<strong>Précipitations :</strong> La pluie tombée en millimètres.',
|
|
135
|
+
'<strong>Coefficient :</strong> La quantité d\'eau que votre toit perd (ex: absorption).',
|
|
136
|
+
'<strong>Efficacité :</strong> Pertes dans les filtres avant le réservoir (~10%).',
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
type: 'title',
|
|
141
|
+
text: 'Pourquoi collecter l\'eau de pluie ?',
|
|
142
|
+
level: 3,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'list',
|
|
146
|
+
items: [
|
|
147
|
+
'<strong>Économies :</strong> Réduisez considérablement votre facture d\'eau.',
|
|
148
|
+
'<strong>Jardinage :</strong> Les plantes adorent l\'eau sans chlore ni calcaire.',
|
|
149
|
+
'<strong>Resiliénce :</strong> Maintenez une réserve d\'urgence en cas de coupure.',
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'title',
|
|
154
|
+
text: 'Dimensionnement du réservoir',
|
|
155
|
+
level: 2,
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'paragraph',
|
|
159
|
+
html: 'L\'erreur la plus courante est d\'acheter un réservoir en se basant uniquement sur le budget. S\'il est trop petit, vous perdrez des milliers de litres par débordement. S\'il est trop grand, vous dépenserez de l\'argent inutilement. Une règle générale est d\'avoir une capacité de stockage pour <strong>3 mois</strong> de précipitations moyennes dans votre région, vous permettant de traverser les saisons sèches.',
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
faqTitle: 'Questions Fréquemment Posées',
|
|
163
|
+
faq: faqData,
|
|
164
|
+
howTo: howToData,
|
|
165
|
+
bibliographyTitle: 'Références Scientifiques',
|
|
166
|
+
bibliography: [
|
|
167
|
+
{
|
|
168
|
+
name: 'FAO - Collecte et stockage de l\'eau de pluie',
|
|
169
|
+
url: 'https://www.fao.org/3/a1348s/a1348s.pdf',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'Texas A&M AgriLife Extension - Rainwater Harvesting',
|
|
173
|
+
url: 'https://rainwaterharvesting.tamu.edu/',
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: 'Brad Lancaster - Rainwater Harvesting for Drylands',
|
|
177
|
+
url: 'https://www.harvestingrainwater.com/',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'European Environment Agency - Water Resources',
|
|
181
|
+
url: 'https://www.eea.europa.eu/en/topics/in-depth/water',
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
185
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { NatureToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
import RainHarvesterComponent from './component.astro';
|
|
3
|
+
import RainHarvesterSEO from './seo.astro';
|
|
4
|
+
import RainHarvesterBibliography from './bibliography.astro';
|
|
5
|
+
import type { RainHarvesterUI } from './ui';
|
|
6
|
+
|
|
7
|
+
export type RainHarvesterLocaleContent = ToolLocaleContent<RainHarvesterUI>;
|
|
8
|
+
|
|
9
|
+
import { content as es } from './i18n/es';
|
|
10
|
+
import { content as en } from './i18n/en';
|
|
11
|
+
import { content as fr } from './i18n/fr';
|
|
12
|
+
|
|
13
|
+
export const rainHarvester: NatureToolEntry<RainHarvesterUI> = {
|
|
14
|
+
id: 'rain-harvester',
|
|
15
|
+
icons: {
|
|
16
|
+
bg: 'mdi:weather-pouring',
|
|
17
|
+
fg: 'mdi:water',
|
|
18
|
+
},
|
|
19
|
+
i18n: {
|
|
20
|
+
es: async () => es,
|
|
21
|
+
en: async () => en,
|
|
22
|
+
fr: async () => fr,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { RainHarvesterComponent, RainHarvesterSEO, RainHarvesterBibliography };
|
|
27
|
+
|
|
28
|
+
export const RAIN_HARVESTER_TOOL: ToolDefinition = {
|
|
29
|
+
entry: rainHarvester,
|
|
30
|
+
Component: RainHarvesterComponent,
|
|
31
|
+
SEOComponent: RainHarvesterSEO,
|
|
32
|
+
BibliographyComponent: RainHarvesterBibliography,
|
|
33
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const FILTER_EFFICIENCY = 0.9;
|
|
2
|
+
|
|
3
|
+
export const ROOF_MATERIALS = [
|
|
4
|
+
{ id: 'metal', coefficient: 0.95 },
|
|
5
|
+
{ id: 'clay', coefficient: 0.85 },
|
|
6
|
+
{ id: 'concrete', coefficient: 0.85 },
|
|
7
|
+
{ id: 'gravel', coefficient: 0.6 },
|
|
8
|
+
] as const;
|
|
9
|
+
|
|
10
|
+
export function calculateNetVolume(area: number, rainfall: number, coefficient: number): number {
|
|
11
|
+
return area * rainfall * coefficient * FILTER_EFFICIENCY;
|
|
12
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { rainHarvester } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale } = Astro.props;
|
|
11
|
+
const content = await rainHarvester.i18n[locale]!();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<SEORenderer content={{ locale: locale as string, sections: content.seo }} />
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface RainHarvesterUI {
|
|
2
|
+
headInputs: string;
|
|
3
|
+
headResults: string;
|
|
4
|
+
labelArea: string;
|
|
5
|
+
labelRainfall: string;
|
|
6
|
+
labelMaterial: string;
|
|
7
|
+
unitM2: string;
|
|
8
|
+
unitMm: string;
|
|
9
|
+
unitLiters: string;
|
|
10
|
+
helpRainfall: string;
|
|
11
|
+
efficiencyTitle: string;
|
|
12
|
+
efficiencyNote: string;
|
|
13
|
+
resultTitle: string;
|
|
14
|
+
equivalenciesTitle: string;
|
|
15
|
+
labelFlushes: string;
|
|
16
|
+
labelShowers: string;
|
|
17
|
+
labelGarden: string;
|
|
18
|
+
gardenArea: string;
|
|
19
|
+
materialMetal: string;
|
|
20
|
+
materialClay: string;
|
|
21
|
+
materialConcrete: string;
|
|
22
|
+
materialGravel: string;
|
|
23
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { seedCalculator } from './index';
|
|
4
|
+
|
|
5
|
+
const { locale = 'es' } = Astro.props;
|
|
6
|
+
const content = await seedCalculator.i18n[locale as keyof typeof seedCalculator.i18n]?.();
|
|
7
|
+
---
|
|
8
|
+
{content && <SharedBibliography links={content.bibliography} />}
|