@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,264 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { BalusterCalculatorUI } from '../ui';
4
+
5
+ const slug = 'calculateur-balustres';
6
+ const title = 'Calculateur de Balustres: Espacement Exact pour Rampes';
7
+ const description =
8
+ "Calculez l'espacement exact entre balustres pour les rambardes en respectant la règle des 10 cm. Plans automatiques.";
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Quelle est la distance maximale légale entre les balustres?',
13
+ answer:
14
+ "Dans la plupart des codes de construction internationaux, l'espace libre entre les éléments d'une rambarde ne doit pas permettre le passage d'une sphère de 10 cm de diamètre afin de prévenir les accidents infantiles.",
15
+ },
16
+ {
17
+ question: "Comment mesure-t-on l'espacement: entre axes ou espace libre?",
18
+ answer:
19
+ "Notre calculateur fournit les deux. L'espace libre est le vide réel entre les balustres (essentiel pour la sécurité), tandis que la distance entre axes est utilisée pour marquer où percer ou fixer chaque balustre.",
20
+ },
21
+ {
22
+ question: "Que faire si la répartition n'est pas exacte?",
23
+ answer:
24
+ 'Le calculateur ajuste automatiquement le nombre de balustres pour que le premier et le dernier espace soient identiques, garantissant la symétrie visuelle et le respect strict de l\'espace maximal autorisé.',
25
+ },
26
+ {
27
+ question: 'Vaut-il mieux souder ou visser les balustres?',
28
+ answer:
29
+ "Cela dépend du matériau. Pour l'acier, la soudure offre une rigidité structurelle maximale. Pour le bois ou l'aluminium, on utilise des ancrages mécaniques ou des boulons traversants. La rambarde doit résister à une charge horizontale d'au moins 0,8 kN/m.",
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Mesurer la longueur totale',
36
+ text: 'Mesurez la distance exacte entre le premier et le dernier poteau où sera installée la rambarde.',
37
+ },
38
+ {
39
+ name: 'Définir l\'épaisseur du balustre',
40
+ text: 'Mesurez la largeur d\'un balustre individuel (ex. 2x2 cm pour tube carré ou le diamètre si rond).',
41
+ },
42
+ {
43
+ name: "Définir l'espace maximal",
44
+ text: "Indiquez l'espacement maximal souhaité (10 cm recommandé pour respecter la réglementation).",
45
+ },
46
+ {
47
+ name: "Obtenir les repères d'installation",
48
+ text: 'Consultez la liste des positions exactes pour percer et assurer une répartition symétrique et sécurisée.',
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<BalusterCalculatorUI> = {
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: 'IBC - International Building Code',
96
+ url: 'https://codes.iccsafe.org/content/IBC2021',
97
+ },
98
+ {
99
+ name: 'IRC - International Residential Code (États-Unis)',
100
+ url: 'https://codes.iccsafe.org/content/IRC2021',
101
+ },
102
+ {
103
+ name: 'CTE - Código Técnico de la Edificación (Espagne)',
104
+ url: 'https://www.codigotecnico.org/',
105
+ },
106
+ ],
107
+ howTo: howToData,
108
+ schemas: [faqSchema, howToSchema, appSchema],
109
+ seo: [
110
+ {
111
+ type: 'title',
112
+ text: 'Guide Complet: Comment Calculer l\'Espacement des Balustres pour Rambardes',
113
+ level: 2,
114
+ },
115
+ {
116
+ type: 'paragraph',
117
+ html: "Concevoir une rambarde sûre et esthétiquement parfaite est un art qui combine la précision mathématique avec les normes de construction. Que ce soit pour une terrasse, un balcon ou un escalier intérieur, le calcul correct des balustres est l'étape la plus critique du projet. Une erreur de calcul ne ruine pas seulement la symétrie visuelle, mais peut rendre votre structure illégale et dangereuse.",
118
+ },
119
+ {
120
+ type: 'card',
121
+ icon: 'mdi:alert-circle-outline',
122
+ title: 'Pourquoi ce calcul est si important?',
123
+ html: '<p>Il ne s\'agit pas seulement de "remplir l\'espace". Il s\'agit de respecter la <strong>Règle de la Sphère de 10 cm</strong>, une norme de sécurité internationale conçue pour prévenir les accidents infantiles.</p>',
124
+ },
125
+ {
126
+ type: 'title',
127
+ text: '1. La Réglementation de Sécurité: La Règle des 10 cm',
128
+ level: 3,
129
+ },
130
+ {
131
+ type: 'paragraph',
132
+ html: 'Avant de couper la première pièce de bois ou de métal, vous devez comprendre le "pourquoi" des mathématiques. Le Code de Construction International (IRC) aux États-Unis établit une règle claire: <em>"L\'espace libre entre les éléments verticaux ne doit pas permettre le passage d\'une sphère de 10 cm (4 pouces) de diamètre."</em>',
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: "Cette mesure n'est pas arbitraire. C'est le diamètre moyen de la tête d'un jeune enfant (généralement de moins d'1 an). Si un enfant peut passer son corps mais que sa tête se coince, le risque d'asphyxie est extrêmement élevé. L'objectif de notre <strong>Calculateur de Balustres</strong> n'est donc pas seulement esthétique — il sauve des vies.",
137
+ },
138
+ {
139
+ type: 'title',
140
+ text: "2. Le Problème Mathématique: L'Erreur du Poteau de Clôture",
141
+ level: 3,
142
+ },
143
+ {
144
+ type: 'paragraph',
145
+ html: 'En programmation et en construction, il existe un problème classique appelé <em>"Fencepost Error"</em> (Erreur du Poteau de Clôture). Si vous voulez construire une clôture de 10 mètres avec des poteaux tous les mètres, combien de poteaux vous faut-il? La réponse intuitive est 10, mais la bonne réponse est 11.',
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: "Avec les balustres, quelque chose de similaire se produit, mais plus complexe, car la largeur du balustre lui-même occupe de l'espace. La formule utilisée par notre outil résout ce système d'équations pour vous:",
150
+ },
151
+ {
152
+ type: 'grid',
153
+ columns: [
154
+ {
155
+ type: 'card',
156
+ icon: 'mdi:calculator',
157
+ title: 'Étape A: Calculer les Espaces',
158
+ html: '<p class="bc-formula">n = (L - g_max) / (w + g_max)</p><p>On détermine d\'abord combien de balustres rentrent théoriquement en utilisant l\'espace maximal autorisé. On arrondit ce nombre vers le haut pour s\'assurer que les espaces résultants soient <em>inférieurs</em> au maximum.</p>',
159
+ },
160
+ {
161
+ type: 'card',
162
+ icon: 'mdi:function-variant',
163
+ title: "Étape B: Recalculer l'Espace Exact",
164
+ html: '<p class="bc-formula">g = (L - n × w) / (n + 1)</p><p>Une fois que nous connaissons le nombre exact de balustres (n), nous calculons combien d\'espace "reste" après avoir soustrait toute la largeur du bois, et nous le divisons équitablement entre les espaces (n+1).</p>',
165
+ },
166
+ ],
167
+ },
168
+ {
169
+ type: 'title',
170
+ text: "3. Guide d'Installation Étape par Étape",
171
+ level: 3,
172
+ },
173
+ {
174
+ type: 'paragraph',
175
+ html: "Avoir les chiffres n'est que la moitié de la bataille. Voici comment transférer ces données du papier (ou de l'écran) à la réalité de votre chantier.",
176
+ },
177
+ {
178
+ type: 'title',
179
+ text: 'Étape 1: Mesure de Précision',
180
+ level: 3,
181
+ },
182
+ {
183
+ type: 'paragraph',
184
+ html: 'Mesurez la distance <strong>intérieure</strong> entre poteau et poteau. Ne mesurez pas depuis le centre du poteau. Vous avez besoin de connaître l\'espace net exact que vous allez remplir (L). Si votre rambarde comporte plusieurs travées, mesurez chacune individuellement.',
185
+ },
186
+ {
187
+ type: 'title',
188
+ text: 'Étape 2: Trouver le Centre',
189
+ level: 3,
190
+ },
191
+ {
192
+ type: 'paragraph',
193
+ html: 'L\'erreur numéro un des débutants est de commencer à placer les balustres d\'un bout à l\'autre. Cela entraîne presque toujours un dernier espace de taille bizarre.<ul><li>Marquez le <strong>centre exact</strong> de la rambarde (L / 2).</li><li>Décidez si vous voulez un <em>balustre</em> ou un <em>espace</em> au centre.</li><li>Si vous voulez un balustre au centre: marquez la moitié de la largeur du balustre de chaque côté de votre repère central.</li><li>Si vous voulez un espace au centre: marquez la moitié de la distance de l\'espace (g / 2) de chaque côté.</li></ul>',
194
+ },
195
+ {
196
+ type: 'title',
197
+ text: 'Étape 3: Fabriquer un Gabarit (Spacer)',
198
+ level: 3,
199
+ },
200
+ {
201
+ type: 'paragraph',
202
+ html: "N'utilisez pas le mètre ruban pour chaque balustre. L'erreur humaine cumulative fera que le dernier balustre sera décalé de plusieurs centimètres. La méthode professionnelle consiste à couper un bloc de bois avec la mesure exacte de l'espace (g) donné par notre calculateur.",
203
+ },
204
+ {
205
+ type: 'paragraph',
206
+ html: "Utilisez ce bloc comme gabarit physique. Placez un balustre, posez le bloc, placez le balustre suivant serré contre le bloc, et fixez-le. Cela garantit une cohérence au millimètre près.",
207
+ },
208
+ {
209
+ type: 'title',
210
+ text: '4. Matériaux et Outils Nécessaires',
211
+ level: 3,
212
+ },
213
+ {
214
+ type: 'card',
215
+ icon: 'mdi:tools',
216
+ title: 'Équipement pour une finition professionnelle',
217
+ html: '<ul><li>Mètre ruban de haute précision</li><li>Crayon de charpentier</li><li>Niveau à bulle (pour la verticalité)</li><li>Scie à onglets (pour des coupes nettes)</li><li>Perceuse et vis à bois</li><li>Blocs gabarits (faits sur mesure)</li></ul>',
218
+ },
219
+ {
220
+ type: 'title',
221
+ text: '5. Questions Techniques Supplémentaires',
222
+ level: 3,
223
+ },
224
+ {
225
+ type: 'card',
226
+ icon: 'mdi:help-circle-outline',
227
+ title: "Que faire si le dernier espace ne s'adapte pas?",
228
+ html: "<p>Si vous avez utilisé notre calculateur, cela ne devrait pas arriver. Cependant, dans le monde réel, le bois se courbe et les poteaux ne sont pas toujours droits. Si vous avez un écart de 1-2 mm, c'est imperceptible. S'il manque 1 cm, vérifiez vos blocs gabarits.</p>",
229
+ },
230
+ {
231
+ type: 'card',
232
+ icon: 'mdi:shield-check-outline',
233
+ title: "Balustres plus espacés sans enfants?",
234
+ html: "<p>Légalement, non. Le code de construction s'applique au logement, pas aux occupants actuels. Si vous vendez un jour, une rambarde non conforme sera un problème lors de l'inspection. De plus, les visiteurs (neveux, petits-enfants) peuvent être en danger.</p>",
235
+ },
236
+ {
237
+ type: 'card',
238
+ icon: 'mdi:wrench-outline',
239
+ title: 'Bois, Métal ou Verre?',
240
+ html: '<p>Ce calculateur fonctionne pour <strong>tout élément vertical répétitif</strong>. Pour les câbles en acier horizontaux, une réglementation différente s\'applique. Pour le verre, c\'est un panneau continu et l\'espacement ne s\'applique pas — c\'est la résistance aux chocs qui compte.</p>',
241
+ },
242
+ {
243
+ type: 'card',
244
+ icon: 'mdi:format-quote-close',
245
+ title: 'Mies van der Rohe',
246
+ html: '<p><em>"L\'architecture est la volonté d\'une époque traduite dans l\'espace."</em></p><p>Nous espérons que cet outil vous aidera à construire des espaces plus sûrs et plus beaux. Consultez toujours le code de construction local de votre municipalité.</p>',
247
+ },
248
+ ],
249
+ ui: {
250
+ sectionTitle: 'Dimensions',
251
+ sectionDesc: 'Entrez les mesures de votre rambarde',
252
+ labelRailLength: 'Longueur Totale (L)',
253
+ labelBalusterWidth: 'Largeur Balustre (w)',
254
+ labelMaxGap: 'Espace Maximal (g)',
255
+ blueprintTitle: 'Plan de Montage',
256
+ blueprintRef: 'RÉF: BAL-001 // ÉCHELLE: AUTO',
257
+ labelRequired: 'Balustres Requis',
258
+ labelExactGap: 'Espace Exact',
259
+ labelOnCenter: 'Entre Axes',
260
+ labelTotalSpaces: 'Espaces Totaux',
261
+ labelCoveredLength: 'Longueur Couverte',
262
+ labelDisclaimer: '* Les dimensions affichées sont approximatives pour la visualisation.',
263
+ },
264
+ };
@@ -0,0 +1,33 @@
1
+ import type { DiyToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+ import BalusterCalculatorComponent from './component.astro';
3
+ import BalusterCalculatorSEO from './seo.astro';
4
+ import BalusterCalculatorBibliography from './bibliography.astro';
5
+ import type { BalusterCalculatorUI } from './ui';
6
+
7
+ export type BalusterCalculatorLocaleContent = ToolLocaleContent<BalusterCalculatorUI>;
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 balusterCalculator: DiyToolEntry<BalusterCalculatorUI> = {
14
+ id: 'baluster-calculator',
15
+ icons: {
16
+ bg: 'mdi:ruler',
17
+ fg: 'mdi:view-week',
18
+ },
19
+ i18n: {
20
+ es: async () => es,
21
+ en: async () => en,
22
+ fr: async () => fr,
23
+ },
24
+ };
25
+
26
+ export { BalusterCalculatorComponent, BalusterCalculatorSEO, BalusterCalculatorBibliography };
27
+
28
+ export const BALUSTER_CALCULATOR_TOOL: ToolDefinition = {
29
+ entry: balusterCalculator,
30
+ Component: BalusterCalculatorComponent,
31
+ SEOComponent: BalusterCalculatorSEO,
32
+ BibliographyComponent: BalusterCalculatorBibliography,
33
+ };
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { balusterCalculator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await balusterCalculator.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ <SEORenderer content={{ locale: locale as string, sections: content.seo }} />
@@ -0,0 +1,15 @@
1
+ export interface BalusterCalculatorUI extends Record<string, string> {
2
+ sectionTitle: string;
3
+ sectionDesc: string;
4
+ labelRailLength: string;
5
+ labelBalusterWidth: string;
6
+ labelMaxGap: string;
7
+ blueprintTitle: string;
8
+ blueprintRef: string;
9
+ labelRequired: string;
10
+ labelExactGap: string;
11
+ labelOnCenter: string;
12
+ labelTotalSpaces: string;
13
+ labelCoveredLength: string;
14
+ labelDisclaimer: string;
15
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { clayCalculator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await clayCalculator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}