@jjlmoya/utils-diy 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +110 -0
  3. package/src/category/i18n/es.ts +110 -0
  4. package/src/category/i18n/fr.ts +101 -0
  5. package/src/category/index.ts +25 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +57 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +251 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +19 -0
  17. package/src/tests/locale_completeness.test.ts +42 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +48 -0
  20. package/src/tests/schemas_fulfillment.test.ts +23 -0
  21. package/src/tests/seo_length.test.ts +22 -0
  22. package/src/tests/title_quality.test.ts +55 -0
  23. package/src/tests/tool_validation.test.ts +17 -0
  24. package/src/tool/balusterCalculator/bibliography.astro +14 -0
  25. package/src/tool/balusterCalculator/component.astro +605 -0
  26. package/src/tool/balusterCalculator/i18n/en.ts +264 -0
  27. package/src/tool/balusterCalculator/i18n/es.ts +264 -0
  28. package/src/tool/balusterCalculator/i18n/fr.ts +264 -0
  29. package/src/tool/balusterCalculator/index.ts +33 -0
  30. package/src/tool/balusterCalculator/seo.astro +15 -0
  31. package/src/tool/balusterCalculator/ui.ts +15 -0
  32. package/src/tool/clayCalculator/bibliography.astro +14 -0
  33. package/src/tool/clayCalculator/component.astro +731 -0
  34. package/src/tool/clayCalculator/i18n/en.ts +183 -0
  35. package/src/tool/clayCalculator/i18n/es.ts +183 -0
  36. package/src/tool/clayCalculator/i18n/fr.ts +183 -0
  37. package/src/tool/clayCalculator/index.ts +33 -0
  38. package/src/tool/clayCalculator/seo.astro +15 -0
  39. package/src/tool/clayCalculator/ui.ts +19 -0
  40. package/src/tool/concreteCalculator/bibliography.astro +13 -0
  41. package/src/tool/concreteCalculator/component.astro +1089 -0
  42. package/src/tool/concreteCalculator/i18n/en.ts +201 -0
  43. package/src/tool/concreteCalculator/i18n/es.ts +201 -0
  44. package/src/tool/concreteCalculator/i18n/fr.ts +201 -0
  45. package/src/tool/concreteCalculator/index.ts +28 -0
  46. package/src/tool/concreteCalculator/seo.astro +14 -0
  47. package/src/tool/concreteCalculator/ui.ts +35 -0
  48. package/src/tool/cutOptimizer/bibliography.astro +13 -0
  49. package/src/tool/cutOptimizer/component.astro +825 -0
  50. package/src/tool/cutOptimizer/i18n/en.ts +178 -0
  51. package/src/tool/cutOptimizer/i18n/es.ts +178 -0
  52. package/src/tool/cutOptimizer/i18n/fr.ts +178 -0
  53. package/src/tool/cutOptimizer/index.ts +28 -0
  54. package/src/tool/cutOptimizer/optimizer.ts +199 -0
  55. package/src/tool/cutOptimizer/seo.astro +14 -0
  56. package/src/tool/cutOptimizer/ui.ts +25 -0
  57. package/src/tool/drillCalculator/bibliography.astro +13 -0
  58. package/src/tool/drillCalculator/component.astro +1210 -0
  59. package/src/tool/drillCalculator/engine.ts +63 -0
  60. package/src/tool/drillCalculator/i18n/en.ts +137 -0
  61. package/src/tool/drillCalculator/i18n/es.ts +137 -0
  62. package/src/tool/drillCalculator/i18n/fr.ts +137 -0
  63. package/src/tool/drillCalculator/index.ts +28 -0
  64. package/src/tool/drillCalculator/seo.astro +14 -0
  65. package/src/tool/drillCalculator/ui.ts +41 -0
  66. package/src/tool/drillSharpener/bibliography.astro +13 -0
  67. package/src/tool/drillSharpener/component.astro +712 -0
  68. package/src/tool/drillSharpener/engine.ts +42 -0
  69. package/src/tool/drillSharpener/i18n/en.ts +121 -0
  70. package/src/tool/drillSharpener/i18n/es.ts +121 -0
  71. package/src/tool/drillSharpener/i18n/fr.ts +121 -0
  72. package/src/tool/drillSharpener/index.ts +31 -0
  73. package/src/tool/drillSharpener/seo.astro +14 -0
  74. package/src/tool/drillSharpener/ui.ts +53 -0
  75. package/src/tool/epoxyCalculator/bibliography.astro +14 -0
  76. package/src/tool/epoxyCalculator/component.astro +888 -0
  77. package/src/tool/epoxyCalculator/i18n/en.ts +195 -0
  78. package/src/tool/epoxyCalculator/i18n/es.ts +195 -0
  79. package/src/tool/epoxyCalculator/i18n/fr.ts +195 -0
  80. package/src/tool/epoxyCalculator/index.ts +33 -0
  81. package/src/tool/epoxyCalculator/seo.astro +15 -0
  82. package/src/tool/epoxyCalculator/ui.ts +22 -0
  83. package/src/tool/furnitureFit/bibliography.astro +13 -0
  84. package/src/tool/furnitureFit/component.astro +552 -0
  85. package/src/tool/furnitureFit/engine.ts +51 -0
  86. package/src/tool/furnitureFit/i18n/en.ts +152 -0
  87. package/src/tool/furnitureFit/i18n/es.ts +152 -0
  88. package/src/tool/furnitureFit/i18n/fr.ts +152 -0
  89. package/src/tool/furnitureFit/index.ts +28 -0
  90. package/src/tool/furnitureFit/seo.astro +14 -0
  91. package/src/tool/furnitureFit/ui.ts +21 -0
  92. package/src/tool/mortarCalculator/bibliography.astro +13 -0
  93. package/src/tool/mortarCalculator/component.astro +1139 -0
  94. package/src/tool/mortarCalculator/i18n/en.ts +219 -0
  95. package/src/tool/mortarCalculator/i18n/es.ts +205 -0
  96. package/src/tool/mortarCalculator/i18n/fr.ts +220 -0
  97. package/src/tool/mortarCalculator/index.ts +24 -0
  98. package/src/tool/mortarCalculator/seo.astro +14 -0
  99. package/src/tool/mortarCalculator/ui.ts +37 -0
  100. package/src/tool/passepartoutCalculator/bibliography.astro +13 -0
  101. package/src/tool/passepartoutCalculator/component.astro +741 -0
  102. package/src/tool/passepartoutCalculator/i18n/en.ts +178 -0
  103. package/src/tool/passepartoutCalculator/i18n/es.ts +178 -0
  104. package/src/tool/passepartoutCalculator/i18n/fr.ts +178 -0
  105. package/src/tool/passepartoutCalculator/index.ts +28 -0
  106. package/src/tool/passepartoutCalculator/seo.astro +14 -0
  107. package/src/tool/passepartoutCalculator/ui.ts +17 -0
  108. package/src/tool/stairCalculator/bibliography.astro +52 -0
  109. package/src/tool/stairCalculator/component.astro +766 -0
  110. package/src/tool/stairCalculator/engine.ts +128 -0
  111. package/src/tool/stairCalculator/i18n/en.ts +149 -0
  112. package/src/tool/stairCalculator/i18n/es.ts +149 -0
  113. package/src/tool/stairCalculator/i18n/fr.ts +149 -0
  114. package/src/tool/stairCalculator/index.ts +31 -0
  115. package/src/tool/stairCalculator/seo.astro +211 -0
  116. package/src/tool/stairCalculator/ui.ts +109 -0
  117. package/src/tool/thermalExpansionCalculator/bibliography.astro +13 -0
  118. package/src/tool/thermalExpansionCalculator/component.astro +771 -0
  119. package/src/tool/thermalExpansionCalculator/engine.ts +23 -0
  120. package/src/tool/thermalExpansionCalculator/i18n/en.ts +174 -0
  121. package/src/tool/thermalExpansionCalculator/i18n/es.ts +174 -0
  122. package/src/tool/thermalExpansionCalculator/i18n/fr.ts +174 -0
  123. package/src/tool/thermalExpansionCalculator/index.ts +28 -0
  124. package/src/tool/thermalExpansionCalculator/seo.astro +14 -0
  125. package/src/tool/thermalExpansionCalculator/ui.ts +41 -0
  126. package/src/tool/voltageDropCalculator/bibliography.astro +13 -0
  127. package/src/tool/voltageDropCalculator/component.astro +1022 -0
  128. package/src/tool/voltageDropCalculator/i18n/en.ts +155 -0
  129. package/src/tool/voltageDropCalculator/i18n/es.ts +155 -0
  130. package/src/tool/voltageDropCalculator/i18n/fr.ts +148 -0
  131. package/src/tool/voltageDropCalculator/index.ts +28 -0
  132. package/src/tool/voltageDropCalculator/seo.astro +14 -0
  133. package/src/tool/voltageDropCalculator/ui.ts +22 -0
  134. package/src/tools.ts +16 -0
  135. package/src/types.ts +72 -0
@@ -0,0 +1,219 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MortarCalculatorUI } from '../ui';
4
+
5
+ const slug = 'lime-mortar-calculator';
6
+ const title = 'Lime Mortar Mix Ratios: Proportions for Heritage Render and Plaster';
7
+ const description =
8
+ 'Calculate exact lime mortar mix ratios for traditional render, scratch coat and finish coat. Based on Vitruvian proportions used in heritage restoration.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'What is the difference between NHL 2, NHL 3.5 and NHL 5 lime?',
13
+ answer:
14
+ 'NHL stands for Natural Hydraulic Lime. The number indicates compressive strength (MPa). NHL 2 is the softest and most breathable, ideal for soft stone and historic render. NHL 3.5 is a versatile all-purpose lime mortar. NHL 5 is the strongest, used for exposed or below-ground work. For most heritage restoration, NHL 3.5 is the standard choice.',
15
+ },
16
+ {
17
+ question: 'What is the correct lime mortar mix ratio for a scratch coat?',
18
+ answer:
19
+ 'For a traditional scratch coat (trullissatio), the Vitruvian proportion is 1:3 (one part NHL lime to three parts coarse sand by volume). This creates a strong, slightly rough surface that keys the next coat. For mine sand, reduce to 1:2 to compensate for the irregular grain shape.',
20
+ },
21
+ {
22
+ question: 'How long does NHL lime mortar take to cure?',
23
+ answer:
24
+ 'NHL lime mortar begins to set hydraulically within hours, but full carbonation takes months or years. Initial hardening occurs in 3-7 days; protect from frost for at least 48 hours. Full strength and breathability are reached after several months of slow curing. Avoid painting or sealing the surface for at least 6 months.',
25
+ },
26
+ {
27
+ question: 'Can I use lime mortar on a modern cement-rendered wall?',
28
+ answer:
29
+ 'No. Lime mortar is more flexible and breathable than cement. Applying lime over cement traps moisture, causing spalling. For heritage restoration, the correct approach is to remove all cement render and rebuild using compatible lime mortars throughout all layers.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Identify the substrate',
36
+ text: 'Check whether you are working on limestone, old brick, or sandstone. The substrate must be clean, sound, and slightly damp before applying lime mortar.',
37
+ },
38
+ {
39
+ name: 'Select aggregate grading',
40
+ text: 'Use coarse sharp sand (2-5mm) for the scratch coat. Use washed building sand (0.5-2mm) for the float coat. Use marble dust or fine sand for the finish coat.',
41
+ },
42
+ {
43
+ name: 'Mix dry before adding water',
44
+ text: 'Combine NHL lime and aggregate dry first, then add water gradually. The mix should be plastic but not runny. For NHL 3.5, a 1:2.5 mix by volume is typical.',
45
+ },
46
+ {
47
+ name: 'Apply and scratch back',
48
+ text: 'Apply each coat with a steel float, then scratch back with a devil float to open the surface and key the next layer. Allow each coat to stiffen before applying the next.',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowToThing> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step, i) => ({
68
+ '@type': 'HowToStep',
69
+ position: i + 1,
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
83
+ inLanguage: 'en',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<MortarCalculatorUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Frequently Asked Questions',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Technical References',
93
+ bibliography: [
94
+ {
95
+ name: 'EN 459: Building Lime Standard',
96
+ url: 'https://www.bsigroup.com/en-GB/standards/',
97
+ },
98
+ {
99
+ name: 'Historic England: Mortars, Renders and Plasters',
100
+ url: 'https://historicengland.org.uk/advice/technical-advice/buildings/',
101
+ },
102
+ {
103
+ name: 'Vitruvius: De Architectura, Book VII',
104
+ url: 'https://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:2007.01.0072',
105
+ },
106
+ {
107
+ name: 'ICCROM: Conservation of Historic Masonry',
108
+ url: 'https://www.iccrom.org/',
109
+ },
110
+ ],
111
+ howTo: howToData,
112
+ schemas: [faqSchema, howToSchema, appSchema],
113
+ seo: [
114
+ {
115
+ type: 'title',
116
+ text: 'Complete Guide to NHL Lime Mortar for Heritage Restoration',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Natural Hydraulic Lime (NHL) mortars are the material of choice for heritage restoration, conservation projects, and traditional masonry. Unlike cement, which traps moisture and damages old stone, NHL lime mortar is breathable, flexible, and compatible with historic substrates. This calculator uses the proportional system codified by the Roman architect Vitruvius in 25 BC — a system still valid today.',
122
+ },
123
+ {
124
+ type: 'card',
125
+ icon: 'mdi:alert-circle-outline',
126
+ title: 'Why lime mortar compatibility matters',
127
+ html: '<p>Using cement mortar in historic buildings causes severe damage. Cement is <strong>harder than the surrounding stone</strong>, meaning thermal movement cracks the stone instead of the joint. It also traps moisture behind impermeable render, causing spalling and frost damage. Lime mortar is always sacrificial: it crumbles before the stone does.</p>',
128
+ },
129
+ {
130
+ type: 'title',
131
+ text: 'The Three Vitruvian Layers: Trullissatio, Arenato, Marmorato',
132
+ level: 3,
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: 'Vitruvius described a three-coat render system that remains the standard for lime plasterwork. Each coat has a specific function and aggregate size: <strong>Trullissatio</strong> (scratch coat, 1:3, 30mm) bonds to the substrate; <strong>Arenato</strong> (float coat, 1:2, 16mm) creates a flat, even surface; <strong>Marmorato</strong> (finish coat, 1:1, 4mm) provides the final texture, traditionally with marble dust.',
137
+ },
138
+ {
139
+ type: 'title',
140
+ text: 'NHL Grades and Their Applications',
141
+ level: 3,
142
+ },
143
+ {
144
+ type: 'grid',
145
+ columns: [
146
+ {
147
+ type: 'card',
148
+ icon: 'mdi:feather',
149
+ title: 'NHL 2: Soft Masonry',
150
+ html: '<p>Compressive strength: 2-7 MPa. Best for very soft stone (tufa, sandstone), interior work, and conservation of fragile historic fabric. The most breathable NHL grade.</p>',
151
+ },
152
+ {
153
+ type: 'card',
154
+ icon: 'mdi:home-outline',
155
+ title: 'NHL 3.5: General Heritage Use',
156
+ html: '<p>Compressive strength: 3.5-10 MPa. The most versatile NHL grade, suitable for brick, medium limestone, exposed exterior render, and most heritage restoration work.</p>',
157
+ },
158
+ {
159
+ type: 'card',
160
+ icon: 'mdi:shield-outline',
161
+ title: 'NHL 5: Exposed and Hydraulic',
162
+ html: '<p>Compressive strength: 5-15 MPa. Used for below-ground work, plinths, exposed copings, and areas subject to water saturation. Less breathable than NHL 2 or 3.5.</p>',
163
+ },
164
+ ],
165
+ },
166
+ {
167
+ type: 'title',
168
+ text: 'Aggregate Selection for Lime Mortar',
169
+ level: 3,
170
+ },
171
+ {
172
+ type: 'paragraph',
173
+ html: 'The aggregate is not a filler — it is <strong>60-75% of your mortar by volume</strong>. Sand quality directly determines mortar quality. Sharp washed sand with angular grains creates stronger mechanical keying. Rounded river sand gives a more workable mix but lower strength. For heritage pointing, always try to match the colour and texture of the original mortar through petrographic analysis.',
174
+ },
175
+ {
176
+ type: 'card',
177
+ icon: 'mdi:format-quote-close',
178
+ title: 'Vitruvius, De Architectura Book VII, Ch. 2',
179
+ html: '<p><em>"When the lime is slaked, let it be beaten with iron tools [...] if it stick to the tool and come away clean, it shows the lime is rich and well slaked; if it is soft and heavy, it is deficient in lime."</em></p><p>Two thousand years of empirical testing, condensed into a single field test that still works today.</p>',
180
+ },
181
+ ],
182
+ ui: {
183
+ leftTitle: 'Vitruvian System',
184
+ centerTitle: 'Available Materials',
185
+ rightTitle: 'Estimated Coverage',
186
+ btnCal: 'Lime',
187
+ btnArena: 'Sand',
188
+ labelCalPasta: 'Putty (1.30 kg/L)',
189
+ labelCalPolvo: 'NHL Powder (0.65 kg/L)',
190
+ labelQuantity: 'Available quantity:',
191
+ labelNeedsAlso: 'You will also need:',
192
+ labelProportion: 'Ratio: ',
193
+ labelCoverage: 'Coverage:',
194
+ labelThickness: 'Total thickness:',
195
+ labelLayers: 'Coats:',
196
+ labelWasteFactor: 'Waste factor: 20%',
197
+ layersSingular: 'coat',
198
+ layersPlural: 'coats',
199
+ materialCal: 'Lime',
200
+ materialArena: 'Sand',
201
+ materialMarmol: 'Marble',
202
+ phaseDescTrullissatio: 'Rough scratch coat. 2 coats of 15mm. Mix ratio 1:3 (Lime:River sand).',
203
+ phaseDescArenato: 'Float coat. 2 coats of 8mm. Mix ratio 1:2 (Lime:Washed sand).',
204
+ phaseDescMarmorato: 'Fine finish coat. 1 double coat of 4mm. Mix ratio 1:1 (Lime:Marble dust).',
205
+ granulometryTitle: 'Aggregate Grading',
206
+ grainTitleCoarse: 'Coarse Sand',
207
+ grainSubtitleCoarse: 'Sharp River Sand',
208
+ grainUsageCoarse: 'Scratch coat',
209
+ grainTitleMedium: 'Medium Sand',
210
+ grainSubtitleMedium: 'Washed Building Sand',
211
+ grainUsageMedium: 'Float coat',
212
+ grainTitleFine: 'Fine Powder',
213
+ grainSubtitleFine: 'Marble Dust (Marmolina)',
214
+ grainUsageFine: 'Finish coat',
215
+ specSize: 'Size:',
216
+ specUse: 'Use:',
217
+ specDensity: 'Density:',
218
+ },
219
+ };
@@ -0,0 +1,205 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MortarCalculatorUI } from '../ui';
4
+
5
+ const slug = 'morteros-cal';
6
+ const title = 'Proporciones Morteros de Cal Tradicionales: Enfoscados y Revocos';
7
+ const description =
8
+ 'Calculadora gratuita para morteros de cal y arena. Obtén las proporciones exactas para enfoscados, revocos y enlucidos según métodos tradicionales (Vitruvio)';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '¿Por qué usar cal en lugar de cemento?',
13
+ answer:
14
+ "La cal es un material 'vivo' y transpirable que permite la evacuación del vapor de agua, evitando humedades por condensación. Además, es más flexible que el cemento, lo que reduce la aparición de grietas en muros antiguos.",
15
+ },
16
+ {
17
+ question: '¿Cuál es la proporción ideal para un enfoscado?',
18
+ answer:
19
+ 'Según la tradición vitruviana, para arena de río limpia se usa una proporción de 1:3 (una parte de cal por tres de arena). Para arena de mina, se recomienda 1:2 para asegurar la cohesión del mortero.',
20
+ },
21
+ {
22
+ question: '¿Qué es el revoco fino o enlucido?',
23
+ answer:
24
+ 'Es la última capa del muro. Se usa una arena mucho más fina (polvo de mármol en ocasiones) y una mayor proporción de cal para obtener un acabado liso y sedoso que puede ser pintado o dejado al natural.',
25
+ },
26
+ {
27
+ question: '¿Cuánto tiempo tarda en endurecer el mortero de cal?',
28
+ answer:
29
+ 'La cal aérea endurece por carbonatación (absorbiendo CO2 del aire). El proceso inicial de fraguado es de unos días, pero la dureza máxima se alcanza meses después, ganando resistencia con el paso de los años.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Identificar el tipo de soporte',
36
+ text: 'Comprueba si vas a trabajar sobre piedra, ladrillo antiguo o bloque. El soporte debe estar limpio y ligeramente húmedo.',
37
+ },
38
+ {
39
+ name: 'Elegir la granulometría de la arena',
40
+ text: 'Usa arena gruesa para la capa de agarre y arena fina para el acabado cosmético. La pureza de la arena define la calidad del mortero.',
41
+ },
42
+ {
43
+ name: 'Mezcla de componentes',
44
+ text: 'Mezcla la cal y la arena en seco antes de añadir agua. La consistencia debe ser plástica, no líquida.',
45
+ },
46
+ {
47
+ name: 'Aplicación y fratasado',
48
+ text: 'Extiende el mortero con llana y usa un fratas para igualar la superficie cuando el mortero empiece a tirar (endurecerse superficialmente).',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowToThing> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step, i) => ({
68
+ '@type': 'HowToStep',
69
+ position: i + 1,
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
83
+ inLanguage: 'es',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<MortarCalculatorUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Preguntas Frecuentes',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Referencias Técnicas',
93
+ bibliography: [
94
+ {
95
+ name: 'Vitruvio - De Architectura, Libro VII',
96
+ url: 'https://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:2007.01.0072',
97
+ },
98
+ {
99
+ name: 'Norma EN 459 - Cales para la Construcción',
100
+ url: 'https://www.une.org/encuentra-tu-norma/busca-tu-norma/norma?c=N0053796',
101
+ },
102
+ {
103
+ name: 'CTE - Código Técnico de la Edificación',
104
+ url: 'https://www.codigotecnico.org/',
105
+ },
106
+ {
107
+ name: 'ICCROM - Conservation of Historic Masonry',
108
+ url: 'https://www.iccrom.org/',
109
+ },
110
+ ],
111
+ howTo: howToData,
112
+ schemas: [faqSchema, howToSchema, appSchema],
113
+ seo: [
114
+ {
115
+ type: 'title',
116
+ text: 'Tratado de los Morteros: La Sabiduría de Vitruvio',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Marco Vitruvio Polión, en el Libro VII de su <em>De Architectura</em>, no solo describió técnicas, sino una filosofía. Entendía que la eternidad de un edificio reside en sus uniones. El mortero no es mero pegamento; es el tejido conectivo. Sus proporciones (1:3, 1:2, 1:1) son el legado de siglos de observación empírica romana, buscando el equilibrio perfecto entre resistencia y flexibilidad.',
122
+ },
123
+ {
124
+ type: 'title',
125
+ text: 'Granulometría del Árido: La Clave de la Calidad',
126
+ level: 3,
127
+ },
128
+ {
129
+ type: 'paragraph',
130
+ html: 'La calidad de un mortero de cal depende en gran medida de la granulometría del árido. Para el <strong>Trullissatio</strong> (enfoscado base), se usa arena gruesa de río de 2-5 mm, con densidad 1,6 kg/L. Para el <strong>Arenato</strong> (revoco intermedio), arena media lavada de 0,5-2 mm, densidad 1,5 kg/L. Para el <strong>Marmorato</strong> (enlucido fino), polvo de mármol (marmolina) menor de 0,5 mm, densidad 1,2 kg/L.',
131
+ },
132
+ {
133
+ type: 'title',
134
+ text: 'El Misterio del Agarre Mecánico',
135
+ level: 3,
136
+ },
137
+ {
138
+ type: 'paragraph',
139
+ html: 'El agarre no es químico, es <strong>mecánico</strong>. Imagina millones de raíces microscópicas. El mortero debe penetrar en los poros del ladrillo para crear una "llave" física. Por eso Vitruvio prohibía aplicar capas gruesas sobre superficies lisas. Sin porosidad, no hay anclaje. El muro y el mortero deben convertirse en una sola entidad monolítica.',
140
+ },
141
+ {
142
+ type: 'title',
143
+ text: 'El Arte del Fratasado',
144
+ level: 3,
145
+ },
146
+ {
147
+ type: 'card',
148
+ icon: 'mdi:tools',
149
+ title: 'Técnica del fratás de madera',
150
+ html: '<p>El fratasado no es solo alisar; es preparar el futuro. El uso del <strong>fratás de madera</strong> es crucial en las capas base porque "abre el poro", dejando una textura rugosa ideal para que la siguiente capa se agarre. La llana de acero cierra el poro y saca el agua a la superficie ("quemar" el mortero), técnica reservada solo para el enlucido final o estucos.</p><p>El secreto está en el <em>tempo</em>: saber esperar a que el mortero haya "tirado" (endurecido ligeramente) pero siga húmedo. Es un diálogo silencioso entre la herramienta y la cal.</p>',
151
+ },
152
+ {
153
+ type: 'title',
154
+ text: 'El Ciclo de la Cal: Un Material Vivo',
155
+ level: 3,
156
+ },
157
+ {
158
+ type: 'paragraph',
159
+ html: 'A diferencia del cemento moderno, la cal es un material "vivo". Fragua lentamente mediante <strong>carbonatación</strong>: absorbe el CO₂ del aire para volver a convertirse en piedra caliza. Es un ciclo eterno: de la piedra venimos y a la piedra volvemos. Esta respiración permite que el edificio se adapte a los movimientos sin agrietarse, sanando sus propias heridas con el tiempo.',
160
+ },
161
+ {
162
+ type: 'card',
163
+ icon: 'mdi:format-quote-close',
164
+ title: 'Vitruvio, De Architectura, Libro VII',
165
+ html: '<p><em>"La preparación de la cal se hace de la siguiente manera: se toman piedras las más duras y lo más pesadas que se puedan encontrar [...] Una vez cocidas, se apagan con agua para que se deshagan en polvo."</em></p><p>Las proporciones vitruvianas han resistido dos mil años porque no son arbitrarias: son el resultado de la observación sistemática del comportamiento de los materiales.</p>',
166
+ },
167
+ ],
168
+ ui: {
169
+ leftTitle: 'Sistema Vitrubio',
170
+ centerTitle: 'Materiales Disponibles',
171
+ rightTitle: 'Cobertura Estimada',
172
+ btnCal: 'Cal',
173
+ btnArena: 'Arena',
174
+ labelCalPasta: 'Pasta (1.30 kg/L)',
175
+ labelCalPolvo: 'Polvo NHL (0.65 kg/L)',
176
+ labelQuantity: 'Cantidad disponible:',
177
+ labelNeedsAlso: 'Necesitarás también:',
178
+ labelProportion: 'Proporción: ',
179
+ labelCoverage: 'Cobertura:',
180
+ labelThickness: 'Espesor total:',
181
+ labelLayers: 'Capas:',
182
+ labelWasteFactor: 'Factor de merma: 20%',
183
+ layersSingular: 'mano',
184
+ layersPlural: 'manos',
185
+ materialCal: 'Cal',
186
+ materialArena: 'Arena',
187
+ materialMarmol: 'Mármol',
188
+ phaseDescTrullissatio: 'Capa base rugosa. 2 manos de 15mm. Proporción 1:3 (Cal:Arena de río).',
189
+ phaseDescArenato: 'Capa intermedia. 2 manos de 8mm. Proporción 1:2 (Cal:Arena lavada).',
190
+ phaseDescMarmorato: 'Acabado fino. 1 mano doble de 4mm. Proporción 1:1 (Cal:Polvo de mármol).',
191
+ granulometryTitle: 'Granulometría del Árido',
192
+ grainTitleCoarse: 'Arena Gruesa (Cero)',
193
+ grainSubtitleCoarse: 'Arena de Río',
194
+ grainUsageCoarse: 'Enfoscado base',
195
+ grainTitleMedium: 'Arena Media (Cero Fino)',
196
+ grainSubtitleMedium: 'Arena Lavada',
197
+ grainUsageMedium: 'Revoco intermedio',
198
+ grainTitleFine: 'Polvo Fino',
199
+ grainSubtitleFine: 'Polvo de Mármol (Marmolina)',
200
+ grainUsageFine: 'Enlucido fino',
201
+ specSize: 'Tamaño:',
202
+ specUse: 'Uso:',
203
+ specDensity: 'Densidad:',
204
+ },
205
+ };
@@ -0,0 +1,220 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MortarCalculatorUI } from '../ui';
4
+
5
+ const slug = 'dosage-mortier-chaux-nhl';
6
+ const title = 'Dosage Mortier de Chaux NHL: Proportions pour Enduits et Crépis Traditionnels';
7
+ const description =
8
+ 'Calculez les dosages exacts pour mortiers de chaux aérienne CL 90 et chaux hydraulique naturelle NHL. Proportions vitruviennes pour crépis, enduits et badigeons patrimoniaux.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Quelle est la différence entre chaux aérienne CL 90 et chaux hydraulique NHL?',
13
+ answer:
14
+ "La chaux aérienne CL 90 durcit uniquement par carbonatation (absorption du CO₂ atmosphérique). Elle est très souple et très respirante, idéale pour les maçonneries anciennes fragiles. La chaux hydraulique naturelle NHL durcit également par réaction hydraulique avec l'eau, ce qui lui donne une prise plus rapide et une résistance mécanique supérieure, adaptée aux travaux extérieurs exposés.",
15
+ },
16
+ {
17
+ question: 'Quel dosage pour un crépi bâtard à la chaux?',
18
+ answer:
19
+ "Pour la couche de corps (arenato vitruvien), le dosage traditionnel est de 1 volume de chaux pour 2 volumes de sable lavé. Pour la couche de fond (trullissatio), on adopte 1:3 avec un sable de rivière à granulométrie grossière (2-5 mm). Ces proportions garantissent une résistance suffisante tout en préservant la souplesse nécessaire aux bâtiments anciens.",
20
+ },
21
+ {
22
+ question: 'Combien de temps faut-il entre deux couches de mortier de chaux?',
23
+ answer:
24
+ "Chaque couche doit \"tirer\" avant l'application de la suivante. En conditions normales (15-20°C, hygrométrie 60-70%), comptez 24 à 48 heures entre la couche de corps et la couche de finition. Évitez d'appliquer en plein soleil ou par vent fort: le séchage trop rapide empêche la carbonatation correcte et provoque des fissures.",
25
+ },
26
+ {
27
+ question: "Peut-on appliquer un enduit à la chaux sur du ciment?",
28
+ answer:
29
+ "Non, c'est une erreur fréquente aux conséquences graves. Le ciment est imperméable et plus rigide que la chaux. L'enduit à la chaux appliqué sur du ciment se décolle en plaques car il ne peut pas respirer. Pour une restauration patrimoniale correcte, il faut déposer tous les enduits ciment et reprendre l'ensemble en chaux, couche par couche.",
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Préparer le support',
36
+ text: "Vérifiez la nature du support: pierre calcaire, brique ancienne ou moellon. Le support doit être propre, sain et légèrement humidifié avant l'application du mortier de chaux.",
37
+ },
38
+ {
39
+ name: 'Choisir la granulométrie du sable',
40
+ text: "Utilisez un sable grossier (2-5 mm) pour la couche d'accrochage et un sable fin lavé (0,5-2 mm) pour la couche de finition. La pureté du sable détermine la qualité du mortier.",
41
+ },
42
+ {
43
+ name: 'Gâcher le mortier',
44
+ text: "Mélangez la chaux et le sable à sec avant d'ajouter l'eau progressivement. La consistance doit être plastique, ni trop ferme ni coulante. Pour la NHL 3.5, un dosage de 1:2,5 par volume est standard.",
45
+ },
46
+ {
47
+ name: 'Application et talochage',
48
+ text: "Appliquez le mortier à la truelle et talochezavec une taloche bois pour ouvrir les pores et préparer l'accrochage de la couche suivante. La taloche métallique est réservée à la finition.",
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowToThing> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step, i) => ({
68
+ '@type': 'HowToStep',
69
+ position: i + 1,
70
+ name: step.name,
71
+ text: step.text,
72
+ })),
73
+ };
74
+
75
+ const appSchema: WithContext<SoftwareApplication> = {
76
+ '@context': 'https://schema.org',
77
+ '@type': 'SoftwareApplication',
78
+ name: title,
79
+ description,
80
+ applicationCategory: 'UtilityApplication',
81
+ operatingSystem: 'All',
82
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
83
+ inLanguage: 'fr',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<MortarCalculatorUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Questions Fréquentes',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Références Techniques',
93
+ bibliography: [
94
+ {
95
+ name: 'NF EN 459: Chaux de Construction',
96
+ url: 'https://www.boutique.afnor.org/',
97
+ },
98
+ {
99
+ name: 'ICOMOS: Charte de Venise pour la Conservation',
100
+ url: 'https://www.icomos.org/charte-de-venise',
101
+ },
102
+ {
103
+ name: 'Vitruve: De Architectura, Livre VII',
104
+ url: 'https://www.perseus.tufts.edu/hopper/text?doc=Perseus:text:2007.01.0072',
105
+ },
106
+ {
107
+ name: 'CSTB: Guide des enduits à la chaux',
108
+ url: 'https://www.cstb.fr/',
109
+ },
110
+ ],
111
+ howTo: howToData,
112
+ schemas: [faqSchema, howToSchema, appSchema],
113
+ seo: [
114
+ {
115
+ type: 'title',
116
+ text: 'Guide Complet des Mortiers de Chaux: Chaux Aérienne et NHL en Restauration',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: "Les mortiers de chaux connaissent un renouveau dans la restauration du patrimoine bâti ancien. Contrairement au ciment, qui piège l'humidité et endommage irrémédiablement la pierre, la chaux est un matériau respirant, souple et réversible. Ce calculateur applique le système de proportions codifié par l'architecte romain Vitruve au I<sup>er</sup> siècle av. J.-C., un système toujours en usage dans les chantiers de restauration patrimoniale.",
122
+ },
123
+ {
124
+ type: 'card',
125
+ icon: 'mdi:alert-circle-outline',
126
+ title: 'Le piège du ciment dans le bâti ancien',
127
+ html: "<p>L'utilisation de ciment sur des maçonneries anciennes est une erreur fréquente aux conséquences graves. Le ciment est <strong>plus rigide que la pierre environnante</strong>: les mouvements thermiques fissurent la pierre plutôt que le joint. De plus, son imperméabilité bloque l'évaporation de l'humidité ascensionnelle, provoquant des sels, des efflorescences et des éclatements dus au gel.</p>",
128
+ },
129
+ {
130
+ type: 'title',
131
+ text: 'Les Trois Couches Vitruviennes: Trullissatio, Arenato, Marmorato',
132
+ level: 3,
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: "Vitruve décrit un système d'enduit en trois couches que l'on retrouve dans tous les grands monuments romains: le <strong>Trullissatio</strong> (gobetis 1:3, 30mm) accroche au support; l'<strong>Arenato</strong> (corps d'enduit 1:2, 16mm) crée le planéité; le <strong>Marmorato</strong> (finition 1:1, 4mm) donne la texture finale, traditionnellement réalisée à la poudre de marbre.",
137
+ },
138
+ {
139
+ type: 'title',
140
+ text: 'Choisir entre Chaux Aérienne CL 90 et Chaux Hydraulique NHL',
141
+ level: 3,
142
+ },
143
+ {
144
+ type: 'grid',
145
+ columns: [
146
+ {
147
+ type: 'card',
148
+ icon: 'mdi:weather-windy',
149
+ title: 'Chaux Aérienne CL 90',
150
+ html: "<p>Durcit uniquement par carbonatation. Très souple, très respirante. Idéale pour les pierres tendres, les badigeons, les stucs, et la restauration de maçonneries fragiles. Séchage lent: protection contre le gel obligatoire pendant 7 jours.</p>",
151
+ },
152
+ {
153
+ type: 'card',
154
+ icon: 'mdi:water-outline',
155
+ title: 'Chaux Hydraulique NHL 3.5',
156
+ html: "<p>Prise hydraulique + carbonatation. La plus polyvalente pour les travaux extérieurs, crépis, soubassements. Résistance à la compression: 3,5-10 MPa. Recommandée pour la majorité des travaux de restauration en France.</p>",
157
+ },
158
+ {
159
+ type: 'card',
160
+ icon: 'mdi:shield-outline',
161
+ title: 'Chaux Hydraulique NHL 5',
162
+ html: "<p>Haute résistance mécanique (5-15 MPa). Convient aux zones très exposées, maçonneries enterrées, pieds de mur humides. Moins respirante que la CL 90, à réserver aux situations qui l'exigent.</p>",
163
+ },
164
+ ],
165
+ },
166
+ {
167
+ type: 'title',
168
+ text: "La Granulométrie du Sable: Facteur Clé de la Qualité",
169
+ level: 3,
170
+ },
171
+ {
172
+ type: 'paragraph',
173
+ html: "Le sable représente <strong>60 à 75% du volume du mortier</strong>. Son choix n'est pas anodin. Un sable de rivière à grains anguleux offre une accroche mécanique supérieure. Pour la restauration patrimoniale, il est recommandé d'effectuer une analyse pétrographique du mortier existant pour en reproduire fidèlement la couleur et la texture, évitant ainsi les contrastes inesthétiques sur façades classées.",
174
+ },
175
+ {
176
+ type: 'card',
177
+ icon: 'mdi:format-quote-close',
178
+ title: 'Vitruve, De Architectura, Livre VII, Ch. 2',
179
+ html: "<p><em>\"Pour les bâtiments achevés avec soin, les joints de la maçonnerie doivent être remplis trois fois: une première fois avec le mortier grossier, une seconde avec le mortier moyen, et une troisième avec la couche de finition.\"</em></p><p>Deux mille ans d'expérience empirique, résumés en une règle de trois qui reste la norme sur tous les chantiers de restauration patrimoniaux aujourd'hui.</p>",
180
+ },
181
+ ],
182
+ ui: {
183
+ leftTitle: 'Système Vitruve',
184
+ centerTitle: 'Matériaux Disponibles',
185
+ rightTitle: 'Couverture Estimée',
186
+ btnCal: 'Chaux',
187
+ btnArena: 'Sable',
188
+ labelCalPasta: 'Pâte (1,30 kg/L)',
189
+ labelCalPolvo: 'Poudre NHL (0,65 kg/L)',
190
+ labelQuantity: 'Quantité disponible:',
191
+ labelNeedsAlso: 'Il vous faudra aussi:',
192
+ labelProportion: 'Proportion: ',
193
+ labelCoverage: 'Couverture:',
194
+ labelThickness: 'Épaisseur totale:',
195
+ labelLayers: 'Passes:',
196
+ labelWasteFactor: 'Coefficient de perte: 20%',
197
+ layersSingular: 'passe',
198
+ layersPlural: 'passes',
199
+ materialCal: 'Chaux',
200
+ materialArena: 'Sable',
201
+ materialMarmol: 'Marbre',
202
+ phaseDescTrullissatio:
203
+ 'Gobetis rugueux. 2 passes de 15mm. Dosage 1:3 (Chaux:Sable de rivière).',
204
+ phaseDescArenato: "Corps d'enduit. 2 passes de 8mm. Dosage 1:2 (Chaux:Sable lavé).",
205
+ phaseDescMarmorato: 'Finition fine. 1 double passe de 4mm. Dosage 1:1 (Chaux:Poudre de marbre).',
206
+ granulometryTitle: 'Granulométrie du Granulat',
207
+ grainTitleCoarse: 'Sable Grossier',
208
+ grainSubtitleCoarse: 'Sable de Rivière',
209
+ grainUsageCoarse: 'Gobetis',
210
+ grainTitleMedium: 'Sable Moyen',
211
+ grainSubtitleMedium: 'Sable Lavé',
212
+ grainUsageMedium: "Corps d'enduit",
213
+ grainTitleFine: 'Poudre Fine',
214
+ grainSubtitleFine: 'Poudre de Marbre (Marmolina)',
215
+ grainUsageFine: 'Finition',
216
+ specSize: 'Taille:',
217
+ specUse: 'Usage:',
218
+ specDensity: 'Densité:',
219
+ },
220
+ };
@@ -0,0 +1,24 @@
1
+ import MortarCalculatorComponent from './component.astro';
2
+ import MortarCalculatorSEO from './seo.astro';
3
+ import MortarCalculatorBibliography from './bibliography.astro';
4
+ import type { DiyToolEntry, ToolDefinition } from '../../types';
5
+ import type { MortarCalculatorUI } from './ui';
6
+
7
+ export { MortarCalculatorComponent, MortarCalculatorSEO, MortarCalculatorBibliography };
8
+
9
+ const es = async () => (await import('./i18n/es')).content;
10
+ const en = async () => (await import('./i18n/en')).content;
11
+ const fr = async () => (await import('./i18n/fr')).content;
12
+
13
+ export const mortarCalculator: DiyToolEntry<MortarCalculatorUI> = {
14
+ id: 'mortar-calculator',
15
+ icons: { bg: 'mdi:wall', fg: 'mdi:bucket-outline' },
16
+ i18n: { es, en, fr },
17
+ };
18
+
19
+ export const MORTAR_CALCULATOR_TOOL: ToolDefinition = {
20
+ entry: mortarCalculator,
21
+ Component: MortarCalculatorComponent,
22
+ SEOComponent: MortarCalculatorSEO,
23
+ BibliographyComponent: MortarCalculatorBibliography,
24
+ };