@jjlmoya/utils-diy 1.2.0 → 1.4.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 (189) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +12 -0
  3. package/src/category/i18n/id.ts +12 -0
  4. package/src/category/i18n/it.ts +12 -0
  5. package/src/category/i18n/ja.ts +12 -0
  6. package/src/category/i18n/ko.ts +12 -0
  7. package/src/category/i18n/nl.ts +12 -0
  8. package/src/category/i18n/pl.ts +12 -0
  9. package/src/category/i18n/pt.ts +12 -0
  10. package/src/category/i18n/ru.ts +12 -0
  11. package/src/category/i18n/sv.ts +12 -0
  12. package/src/category/i18n/tr.ts +12 -0
  13. package/src/category/i18n/zh.ts +12 -0
  14. package/src/category/index.ts +13 -1
  15. package/src/tests/faq_count.test.ts +1 -1
  16. package/src/tests/i18n_coverage.test.ts +36 -0
  17. package/src/tests/locale_completeness.test.ts +2 -2
  18. package/src/tests/seo_length.test.ts +3 -0
  19. package/src/tests/slug_uniqueness.test.ts +58 -0
  20. package/src/tool/balusterCalculator/i18n/de.ts +264 -0
  21. package/src/tool/balusterCalculator/i18n/id.ts +264 -0
  22. package/src/tool/balusterCalculator/i18n/it.ts +264 -0
  23. package/src/tool/balusterCalculator/i18n/ja.ts +264 -0
  24. package/src/tool/balusterCalculator/i18n/ko.ts +264 -0
  25. package/src/tool/balusterCalculator/i18n/nl.ts +264 -0
  26. package/src/tool/balusterCalculator/i18n/pl.ts +264 -0
  27. package/src/tool/balusterCalculator/i18n/pt.ts +264 -0
  28. package/src/tool/balusterCalculator/i18n/ru.ts +264 -0
  29. package/src/tool/balusterCalculator/i18n/sv.ts +264 -0
  30. package/src/tool/balusterCalculator/i18n/tr.ts +264 -0
  31. package/src/tool/balusterCalculator/i18n/zh.ts +264 -0
  32. package/src/tool/balusterCalculator/index.ts +15 -7
  33. package/src/tool/clayCalculator/i18n/de.ts +183 -0
  34. package/src/tool/clayCalculator/i18n/id.ts +183 -0
  35. package/src/tool/clayCalculator/i18n/it.ts +183 -0
  36. package/src/tool/clayCalculator/i18n/ja.ts +182 -0
  37. package/src/tool/clayCalculator/i18n/ko.ts +183 -0
  38. package/src/tool/clayCalculator/i18n/nl.ts +183 -0
  39. package/src/tool/clayCalculator/i18n/pl.ts +183 -0
  40. package/src/tool/clayCalculator/i18n/pt.ts +183 -0
  41. package/src/tool/clayCalculator/i18n/ru.ts +183 -0
  42. package/src/tool/clayCalculator/i18n/sv.ts +183 -0
  43. package/src/tool/clayCalculator/i18n/tr.ts +183 -0
  44. package/src/tool/clayCalculator/i18n/zh.ts +183 -0
  45. package/src/tool/clayCalculator/index.ts +15 -7
  46. package/src/tool/concreteCalculator/i18n/de.ts +201 -0
  47. package/src/tool/concreteCalculator/i18n/id.ts +201 -0
  48. package/src/tool/concreteCalculator/i18n/it.ts +201 -0
  49. package/src/tool/concreteCalculator/i18n/ja.ts +201 -0
  50. package/src/tool/concreteCalculator/i18n/ko.ts +201 -0
  51. package/src/tool/concreteCalculator/i18n/nl.ts +201 -0
  52. package/src/tool/concreteCalculator/i18n/pl.ts +201 -0
  53. package/src/tool/concreteCalculator/i18n/pt.ts +201 -0
  54. package/src/tool/concreteCalculator/i18n/ru.ts +201 -0
  55. package/src/tool/concreteCalculator/i18n/sv.ts +201 -0
  56. package/src/tool/concreteCalculator/i18n/tr.ts +201 -0
  57. package/src/tool/concreteCalculator/i18n/zh.ts +201 -0
  58. package/src/tool/concreteCalculator/index.ts +17 -5
  59. package/src/tool/cutOptimizer/i18n/de.ts +178 -0
  60. package/src/tool/cutOptimizer/i18n/id.ts +178 -0
  61. package/src/tool/cutOptimizer/i18n/it.ts +178 -0
  62. package/src/tool/cutOptimizer/i18n/ja.ts +178 -0
  63. package/src/tool/cutOptimizer/i18n/ko.ts +178 -0
  64. package/src/tool/cutOptimizer/i18n/nl.ts +178 -0
  65. package/src/tool/cutOptimizer/i18n/pl.ts +178 -0
  66. package/src/tool/cutOptimizer/i18n/pt.ts +178 -0
  67. package/src/tool/cutOptimizer/i18n/ru.ts +178 -0
  68. package/src/tool/cutOptimizer/i18n/sv.ts +178 -0
  69. package/src/tool/cutOptimizer/i18n/tr.ts +178 -0
  70. package/src/tool/cutOptimizer/i18n/zh.ts +178 -0
  71. package/src/tool/cutOptimizer/index.ts +17 -5
  72. package/src/tool/drillCalculator/i18n/de.ts +137 -0
  73. package/src/tool/drillCalculator/i18n/id.ts +137 -0
  74. package/src/tool/drillCalculator/i18n/it.ts +137 -0
  75. package/src/tool/drillCalculator/i18n/ja.ts +137 -0
  76. package/src/tool/drillCalculator/i18n/ko.ts +137 -0
  77. package/src/tool/drillCalculator/i18n/nl.ts +137 -0
  78. package/src/tool/drillCalculator/i18n/pl.ts +137 -0
  79. package/src/tool/drillCalculator/i18n/pt.ts +137 -0
  80. package/src/tool/drillCalculator/i18n/ru.ts +137 -0
  81. package/src/tool/drillCalculator/i18n/sv.ts +137 -0
  82. package/src/tool/drillCalculator/i18n/tr.ts +137 -0
  83. package/src/tool/drillCalculator/i18n/zh.ts +137 -0
  84. package/src/tool/drillCalculator/index.ts +17 -5
  85. package/src/tool/drillSharpener/i18n/de.ts +120 -0
  86. package/src/tool/drillSharpener/i18n/id.ts +120 -0
  87. package/src/tool/drillSharpener/i18n/it.ts +120 -0
  88. package/src/tool/drillSharpener/i18n/ja.ts +120 -0
  89. package/src/tool/drillSharpener/i18n/ko.ts +120 -0
  90. package/src/tool/drillSharpener/i18n/nl.ts +120 -0
  91. package/src/tool/drillSharpener/i18n/pl.ts +120 -0
  92. package/src/tool/drillSharpener/i18n/pt.ts +120 -0
  93. package/src/tool/drillSharpener/i18n/ru.ts +120 -0
  94. package/src/tool/drillSharpener/i18n/sv.ts +120 -0
  95. package/src/tool/drillSharpener/i18n/tr.ts +120 -0
  96. package/src/tool/drillSharpener/i18n/zh.ts +120 -0
  97. package/src/tool/drillSharpener/index.ts +17 -5
  98. package/src/tool/epoxyCalculator/i18n/de.ts +118 -0
  99. package/src/tool/epoxyCalculator/i18n/id.ts +118 -0
  100. package/src/tool/epoxyCalculator/i18n/it.ts +118 -0
  101. package/src/tool/epoxyCalculator/i18n/ja.ts +118 -0
  102. package/src/tool/epoxyCalculator/i18n/ko.ts +118 -0
  103. package/src/tool/epoxyCalculator/i18n/nl.ts +118 -0
  104. package/src/tool/epoxyCalculator/i18n/pl.ts +118 -0
  105. package/src/tool/epoxyCalculator/i18n/pt.ts +118 -0
  106. package/src/tool/epoxyCalculator/i18n/ru.ts +118 -0
  107. package/src/tool/epoxyCalculator/i18n/sv.ts +118 -0
  108. package/src/tool/epoxyCalculator/i18n/tr.ts +118 -0
  109. package/src/tool/epoxyCalculator/i18n/zh.ts +118 -0
  110. package/src/tool/epoxyCalculator/index.ts +15 -7
  111. package/src/tool/furnitureFit/i18n/de.ts +113 -0
  112. package/src/tool/furnitureFit/i18n/id.ts +113 -0
  113. package/src/tool/furnitureFit/i18n/it.ts +113 -0
  114. package/src/tool/furnitureFit/i18n/ja.ts +113 -0
  115. package/src/tool/furnitureFit/i18n/ko.ts +113 -0
  116. package/src/tool/furnitureFit/i18n/nl.ts +113 -0
  117. package/src/tool/furnitureFit/i18n/pl.ts +113 -0
  118. package/src/tool/furnitureFit/i18n/pt.ts +113 -0
  119. package/src/tool/furnitureFit/i18n/ru.ts +113 -0
  120. package/src/tool/furnitureFit/i18n/sv.ts +113 -0
  121. package/src/tool/furnitureFit/i18n/tr.ts +113 -0
  122. package/src/tool/furnitureFit/i18n/zh.ts +113 -0
  123. package/src/tool/furnitureFit/index.ts +17 -5
  124. package/src/tool/mortarCalculator/i18n/de.ts +129 -0
  125. package/src/tool/mortarCalculator/i18n/id.ts +129 -0
  126. package/src/tool/mortarCalculator/i18n/it.ts +129 -0
  127. package/src/tool/mortarCalculator/i18n/ja.ts +129 -0
  128. package/src/tool/mortarCalculator/i18n/ko.ts +129 -0
  129. package/src/tool/mortarCalculator/i18n/nl.ts +129 -0
  130. package/src/tool/mortarCalculator/i18n/pl.ts +129 -0
  131. package/src/tool/mortarCalculator/i18n/pt.ts +129 -0
  132. package/src/tool/mortarCalculator/i18n/ru.ts +129 -0
  133. package/src/tool/mortarCalculator/i18n/sv.ts +129 -0
  134. package/src/tool/mortarCalculator/i18n/tr.ts +129 -0
  135. package/src/tool/mortarCalculator/i18n/zh.ts +129 -0
  136. package/src/tool/mortarCalculator/index.ts +17 -5
  137. package/src/tool/passepartoutCalculator/i18n/de.ts +108 -0
  138. package/src/tool/passepartoutCalculator/i18n/id.ts +108 -0
  139. package/src/tool/passepartoutCalculator/i18n/it.ts +108 -0
  140. package/src/tool/passepartoutCalculator/i18n/ja.ts +108 -0
  141. package/src/tool/passepartoutCalculator/i18n/ko.ts +108 -0
  142. package/src/tool/passepartoutCalculator/i18n/nl.ts +108 -0
  143. package/src/tool/passepartoutCalculator/i18n/pl.ts +108 -0
  144. package/src/tool/passepartoutCalculator/i18n/pt.ts +108 -0
  145. package/src/tool/passepartoutCalculator/i18n/ru.ts +108 -0
  146. package/src/tool/passepartoutCalculator/i18n/sv.ts +108 -0
  147. package/src/tool/passepartoutCalculator/i18n/tr.ts +108 -0
  148. package/src/tool/passepartoutCalculator/i18n/zh.ts +108 -0
  149. package/src/tool/passepartoutCalculator/index.ts +17 -5
  150. package/src/tool/stairCalculator/i18n/de.ts +144 -0
  151. package/src/tool/stairCalculator/i18n/id.ts +144 -0
  152. package/src/tool/stairCalculator/i18n/it.ts +144 -0
  153. package/src/tool/stairCalculator/i18n/ja.ts +144 -0
  154. package/src/tool/stairCalculator/i18n/ko.ts +144 -0
  155. package/src/tool/stairCalculator/i18n/nl.ts +144 -0
  156. package/src/tool/stairCalculator/i18n/pl.ts +144 -0
  157. package/src/tool/stairCalculator/i18n/pt.ts +144 -0
  158. package/src/tool/stairCalculator/i18n/ru.ts +144 -0
  159. package/src/tool/stairCalculator/i18n/sv.ts +144 -0
  160. package/src/tool/stairCalculator/i18n/tr.ts +144 -0
  161. package/src/tool/stairCalculator/i18n/zh.ts +144 -0
  162. package/src/tool/stairCalculator/index.ts +17 -5
  163. package/src/tool/thermalExpansionCalculator/i18n/de.ts +132 -0
  164. package/src/tool/thermalExpansionCalculator/i18n/id.ts +130 -0
  165. package/src/tool/thermalExpansionCalculator/i18n/it.ts +130 -0
  166. package/src/tool/thermalExpansionCalculator/i18n/ja.ts +130 -0
  167. package/src/tool/thermalExpansionCalculator/i18n/ko.ts +130 -0
  168. package/src/tool/thermalExpansionCalculator/i18n/nl.ts +130 -0
  169. package/src/tool/thermalExpansionCalculator/i18n/pl.ts +130 -0
  170. package/src/tool/thermalExpansionCalculator/i18n/pt.ts +130 -0
  171. package/src/tool/thermalExpansionCalculator/i18n/ru.ts +130 -0
  172. package/src/tool/thermalExpansionCalculator/i18n/sv.ts +130 -0
  173. package/src/tool/thermalExpansionCalculator/i18n/tr.ts +130 -0
  174. package/src/tool/thermalExpansionCalculator/i18n/zh.ts +130 -0
  175. package/src/tool/thermalExpansionCalculator/index.ts +17 -5
  176. package/src/tool/voltageDropCalculator/i18n/de.ts +112 -0
  177. package/src/tool/voltageDropCalculator/i18n/id.ts +110 -0
  178. package/src/tool/voltageDropCalculator/i18n/it.ts +110 -0
  179. package/src/tool/voltageDropCalculator/i18n/ja.ts +110 -0
  180. package/src/tool/voltageDropCalculator/i18n/ko.ts +110 -0
  181. package/src/tool/voltageDropCalculator/i18n/nl.ts +110 -0
  182. package/src/tool/voltageDropCalculator/i18n/pl.ts +110 -0
  183. package/src/tool/voltageDropCalculator/i18n/pt.ts +110 -0
  184. package/src/tool/voltageDropCalculator/i18n/ru.ts +110 -0
  185. package/src/tool/voltageDropCalculator/i18n/sv.ts +110 -0
  186. package/src/tool/voltageDropCalculator/i18n/tr.ts +110 -0
  187. package/src/tool/voltageDropCalculator/i18n/zh.ts +110 -0
  188. package/src/tool/voltageDropCalculator/index.ts +17 -5
  189. package/src/types.ts +1 -1
@@ -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 = 'baluster-rekenmachine';
6
+ const title = 'Baluster Calculator: Exacte Afstand voor Leuningen';
7
+ const description =
8
+ 'Bereken de exacte afstand tussen spijlen of balusters voor leuningen volgens de 10cm-norm. Automatische bouwplannen.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Wat is de maximale wettelijke afstand tussen balusters?',
13
+ answer:
14
+ 'In de meeste internationale bouwvoorschriften mag de vrije ruimte tussen de onderdelen van een leuning niet groter zijn dan 10 cm (de 10cm-regel), zodat er geen sfeer met een diameter van 10 cm doorheen kan. Dit is essentieel voor de veiligheid van kinderen.',
15
+ },
16
+ {
17
+ question: 'Hoe wordt de afstand gemeten: tussen de harten of de tussenruimtes?',
18
+ answer:
19
+ "Onze calculator geeft beide weer. De 'vrije ruimte' is de daadwerkelijke opening tussen de spijlen (cruciaal voor de veiligheid), terwijl de 'hart-op-hart afstand' aangeeft waar je elke baluster moet boren of bevestigen.",
20
+ },
21
+ {
22
+ question: 'Wat gebeurt er als de verdeling niet precies uitkomt?',
23
+ answer:
24
+ 'De calculator past automatisch het aantal spijlen aan, zodat de eerste en laatste opening identiek zijn. Dit garandeert visuele symmetrie en strikte naleving van de maximaal toegestane tussenruimte.',
25
+ },
26
+ {
27
+ question: 'Is het beter om balusters te lassen of te schroeven?',
28
+ answer:
29
+ 'Dit hangt af van het materiaal. Bij staal biedt lassen de maximale structurele stijfheid. Bij hout of aluminium worden vaak mechanische ankers of doorgaande bouten gebruikt. Belangrijk is dat de leuning een horizontale kracht van minstens 0,8 kN/m kan weerstaan.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Totale lengte meten',
36
+ text: 'Meet de exacte afstand tussen de eerste en de laatste paal waar de leuning wordt geplaatst.',
37
+ },
38
+ {
39
+ name: 'Dikte van de baluster bepalen',
40
+ text: 'Meet de breedte van een individuele spijl (bijv. 2x2 cm voor een kokerprofiel of de diameter bij een ronde spijl).',
41
+ },
42
+ {
43
+ name: 'Maximale tussenruimte instellen',
44
+ text: 'Geef de gewenste maximale opening aan (10 cm wordt aanbevolen om aan de normen te voldoen).',
45
+ },
46
+ {
47
+ name: 'Installatiemarkeringen ontvangen',
48
+ text: 'Bekijk de lijst met exacte posities voor het boren om een symmetrische en veilige verdeling te garanderen.',
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: 'nl',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<BalusterCalculatorUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Veelgestelde Vragen',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Technische Verwijzingen',
93
+ bibliography: [
94
+ {
95
+ name: 'Bouwbesluit (Nederland)',
96
+ url: 'https://www.bouwbesluitonline.nl/',
97
+ },
98
+ {
99
+ name: 'IRC - International Residential Code (VS)',
100
+ url: 'https://codes.iccsafe.org/content/IRC2021',
101
+ },
102
+ {
103
+ name: 'IBC - International Building Code',
104
+ url: 'https://codes.iccsafe.org/content/IBC2021',
105
+ },
106
+ ],
107
+ howTo: howToData,
108
+ schemas: [faqSchema, howToSchema, appSchema],
109
+ seo: [
110
+ {
111
+ type: 'title',
112
+ text: 'De Ultieme Gids: Hoe Bereken je de Afstand tussen Balusters?',
113
+ level: 2,
114
+ },
115
+ {
116
+ type: 'paragraph',
117
+ html: 'Het ontwerpen van een veilige en esthetisch perfecte leuning is een kunst die wiskundige precisie combineert met bouwvoorschriften. Of het nu gaat om een terras, een balkon of een binnentrap, de juiste berekening van de balusters (of spijlen) is de meest kritische stap van het project. Een rekenfout bederft niet alleen de visuele symmetrie, maar kan je constructie ook onveilig en illegaal maken.',
118
+ },
119
+ {
120
+ type: 'card',
121
+ icon: 'mdi:alert-circle-outline',
122
+ title: 'Waarom is deze berekening zo belangrijk?',
123
+ html: '<p>Het gaat niet alleen om het "vullen van het gat". Het gaat om het voldoen aan de <strong>4-inch sfeer-regel (10 cm)</strong>, een internationale veiligheidsnorm die is ontworpen om ongelukken met kinderen te voorkomen.</p>',
124
+ },
125
+ {
126
+ type: 'title',
127
+ text: '1. Veiligheidsvoorschriften: De 10cm-regel',
128
+ level: 3,
129
+ },
130
+ {
131
+ type: 'paragraph',
132
+ html: 'Voordat je het eerste stuk hout of metaal zaagt, moet je begrijpen waarom deze wiskunde nodig is. Het Bouwbesluit in Nederland en soortgelijke codes internationaal (zoals de IRC) stellen een duidelijke norm: <em>"De vrije ruimte tussen verticale elementen mag niet zodanig zijn dat een sfeer met een diameter van 10 cm erdoorheen kan."</em>',
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: 'Deze maat is niet willekeurig. Het is de gemiddelde diameter van het hoofd van een klein kind (meestal onder de 1 jaar). Als een kind met zijn lichaam erdoorheen kan maar het hoofd blijft steken, is het risico op verstikking extreem hoog. Als het hoofd er wel doorheen kan, kan het kind vallen. Daarom is het doel van onze <strong>Baluster Calculator</strong> niet alleen esthetiek, maar het redden van levens.',
137
+ },
138
+ {
139
+ type: 'title',
140
+ text: '2. Het Wiskundige Probleem: De Fencepost Error',
141
+ level: 3,
142
+ },
143
+ {
144
+ type: 'paragraph',
145
+ html: 'In de informatica en de bouw bestaat een klassiek probleem genaamd de <em>"Fencepost Error"</em> (de paal-en-hek-fout). Als je een hek van 10 meter wilt bouwen met palen om de meter, hoeveel palen heb je dan nodig? Het intuïtieve antwoord is 10, maar het juiste antwoord is 11.',
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Bij balusters werkt het vergelijkbaar, maar ingewikkelder, omdat de breedte van de baluster zelf ook ruimte inneemt. De formule die onze tool gebruikt, lost dit stelsel van vergelijkingen voor je op:',
150
+ },
151
+ {
152
+ type: 'grid',
153
+ columns: [
154
+ {
155
+ type: 'card',
156
+ icon: 'mdi:calculator',
157
+ title: 'Stap A: Tussenruimtes Berekenen',
158
+ html: '<p class="bc-formula">n = (L - g_max) / (w + g_max)</p><p>Eerst bepalen we hoeveel balusters er theoretisch passen als we de maximaal toegestane ruimte gebruiken. We ronden dit getal naar boven af om er zeker van te zijn dat de resulterende tussenruimtes <em>kleiner</em> zijn dan het maximum.</p>',
159
+ },
160
+ {
161
+ type: 'card',
162
+ icon: 'mdi:function-variant',
163
+ title: 'Stap B: Exacte Afstand Herberekenen',
164
+ html: '<p class="bc-formula">g = (L - n × w) / (n + 1)</p><p>Zodra we het exacte aantal balusters (n) weten, berekenen we hoeveel ruimte er "overblijft" als we de breedte van alle materialen aftrekken, en verdelen we dit gelijkmatig over de tussenruimtes (n+1).</p>',
165
+ },
166
+ ],
167
+ },
168
+ {
169
+ type: 'title',
170
+ text: '3. Stap-voor-stap Gids voor de Perfecte Installatie',
171
+ level: 3,
172
+ },
173
+ {
174
+ type: 'paragraph',
175
+ html: 'De cijfers hebben is slechts het halve werk. Hier leggen we uit hoe je die getallen van het papier (of scherm) vertaalt naar de realiteit van je bouwproject.',
176
+ },
177
+ {
178
+ type: 'title',
179
+ text: 'Stap 1: Precisie Meting',
180
+ level: 3,
181
+ },
182
+ {
183
+ type: 'paragraph',
184
+ html: 'Meet de <strong>interne</strong> afstand tussen paal en paal. Meet niet vanaf het hart van de paal. Je moet de exacte dagmaat weten die je gaat opvullen (L). Als je leuning meerdere secties heeft, meet dan elke sectie afzonderlijk; constructies zijn zelden perfect haaks en een fout van 0,5 cm kan de symmetrie verpesten.',
185
+ },
186
+ {
187
+ type: 'title',
188
+ text: 'Stap 2: Het Midden Vinden',
189
+ level: 3,
190
+ },
191
+ {
192
+ type: 'paragraph',
193
+ html: 'De meest gemaakte beginnersfout is om balusters vanaf de ene kant naar de andere kant te plaatsen. Dit resulteert bijna altijd in een laatste tussenruimte met een vreemde afmeting, wat de visuele harmonie verstoort.<ul><li>Markeer het <strong>exacte midden</strong> van de leuning (L / 2).</li><li>Bepaal of je in het midden een <em>baluster</em> of een <em>tussenruimte</em> wilt hebben.</li><li>Als je een baluster in het midden wilt: markeer de helft van de balusterbreedte aan weerszijden van je middenmarkering.</li><li>Als je een tussenruimte in het midden wilt: markeer de helft van de tussenruimte-afstand (g / 2) aan weerszijden.</li></ul>',
194
+ },
195
+ {
196
+ type: 'title',
197
+ text: 'Stap 3: Een Afstandhouder (Spacer) Maken',
198
+ level: 3,
199
+ },
200
+ {
201
+ type: 'paragraph',
202
+ html: 'Gebruik niet het meetlint voor elke baluster. De cumulatieve menselijke fout zal ervoor zorgen dat de laatste baluster enkele centimeters afwijkt. De professionele aanpak is om een blok hout (of twee) te zagen met de exacte maat van de opening (g) die onze calculator heeft berekend.',
203
+ },
204
+ {
205
+ type: 'paragraph',
206
+ html: 'Gebruik dit blok als een mal. Plaats een baluster, leg het blok ertegenaan, plaats de volgende baluster strak tegen het blok en zet deze vast. Dit garandeert een consistentie op de millimeter nauwkeurig.',
207
+ },
208
+ {
209
+ type: 'title',
210
+ text: '4. Benodigde Materialen en Gereedschap',
211
+ level: 3,
212
+ },
213
+ {
214
+ type: 'card',
215
+ icon: 'mdi:tools',
216
+ title: 'Uitrusting voor een professionele afwerking',
217
+ html: '<ul><li>Hoogwaardig meetlint</li><li>Timmermanspotlood</li><li>Waterpas (voor de verticaliteit)</li><li>Afkortzaag (voor strakke sneden)</li><li>Boormachine en houtschroeven</li><li>Afstandhouders (op maat gemaakt)</li></ul>',
218
+ },
219
+ {
220
+ type: 'title',
221
+ text: '5. Aanvullende Technische Vragen',
222
+ level: 3,
223
+ },
224
+ {
225
+ type: 'card',
226
+ icon: 'mdi:help-circle-outline',
227
+ title: 'Wat als de laatste opening niet uitkomt?',
228
+ html: '<p>Als je onze calculator hebt gebruikt, zou dit niet mogen gebeuren. Echter, in de echte wereld werkt hout en staan palen niet altijd kaarsrecht. Als je aan het einde 1-2 mm overhoudt of tekortkomt, is dat onzichtbaar. Als je 1 cm tekortkomt, controleer dan je afstandhouders; waarschijnlijk heb je bij elke stap een kleine fout geaccumuleerd.</p>',
229
+ },
230
+ {
231
+ type: 'card',
232
+ icon: 'mdi:shield-check-outline',
233
+ title: 'Mag ik balusters verder uit elkaar plaatsen als ik geen kinderen heb?',
234
+ html: '<p>Wettelijk gezien niet. De bouwvoorschriften gelden voor de woning, niet voor de huidige bewoners. Als je het huis ooit verkoopt, zal een leuning die niet aan de norm voldoet een probleem vormen bij de inspectie. Bovendien kunnen bezoekers (neefjes, kleinkinderen) gevaar lopen.</p>',
235
+ },
236
+ {
237
+ type: 'card',
238
+ icon: 'mdi:wrench-outline',
239
+ title: 'Hout, Metaal of Glas?',
240
+ html: '<p>Deze calculator werkt voor <strong>elk herhalend verticaal element</strong>. Als je horizontale spankabels gebruikt, zijn de regels anders (meestal mogen deze niet opklimbaar zijn, het "trapeffect"). Voor glas wordt het beschouwd als een gesloten paneel en geldt er geen tussenruimte-eis, maar een impact-eis.</p>',
241
+ },
242
+ {
243
+ type: 'card',
244
+ icon: 'mdi:format-quote-close',
245
+ title: 'Mies van der Rohe',
246
+ html: '<p><em>"Architectuur is de wil van de tijd vertaald in ruimte."</em></p><p>We hopen dat deze tool je helpt om veiligere en mooiere ruimtes te creëren. Vergeet niet om altijd de lokale bouwverordening van je gemeente te raadplegen, aangezien er specifieke variaties kunnen zijn in minimale hoogte (meestal 90-110 cm) of belastingseisen.</p>',
247
+ },
248
+ ],
249
+ ui: {
250
+ sectionTitle: 'Afmetingen',
251
+ sectionDesc: 'Voer de maten van je leuning in',
252
+ labelRailLength: 'Totale Lengte (L)',
253
+ labelBalusterWidth: 'Balusterbreedte (w)',
254
+ labelMaxGap: 'Maximale Opening (g)',
255
+ blueprintTitle: 'Bouwplan',
256
+ blueprintRef: 'REF: BAL-001 // SCHAAL: AUTO',
257
+ labelRequired: 'Benodigde Balusters',
258
+ labelExactGap: 'Exacte Opening',
259
+ labelOnCenter: 'Hart-op-Hart',
260
+ labelTotalSpaces: 'Totaal Aantal Gaten',
261
+ labelCoveredLength: 'Bedekte Lengte',
262
+ labelDisclaimer: '* De getoonde afmetingen zijn bij benadering voor visualisatie.',
263
+ },
264
+ };
@@ -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 = 'kalkulator-tralek';
6
+ const title = 'Kalkulator Tralek: Dokładne Rozmieszczenie dla Barierek';
7
+ const description =
8
+ 'Oblicz dokładny odstęp między szczeblami lub tralkami barierek zgodnie z normą 10 cm. Automatyczne plany.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Jaka jest maksymalna legalna odległość między tralkami?',
13
+ answer:
14
+ 'W większości międzynarodowych przepisów budowlanych wolna przestrzeń między elementami barierki nie powinna pozwalać na przejście sfery o średnicy 10 cm, aby zapobiec wypadkom z udziałem dzieci.',
15
+ },
16
+ {
17
+ question: 'Jak mierzy się odstępy: między środkami czy prześwity?',
18
+ answer:
19
+ "Nasz kalkulator podaje obie wartości. 'Prześwit' to rzeczywista luka między szczeblami (kluczowa dla bezpieczeństwa), natomiast 'odległość między środkami' (on-center) wyznacza miejsca wiercenia lub mocowania każdej tralki.",
20
+ },
21
+ {
22
+ question: 'Co jeśli podział nie jest dokładny?',
23
+ answer:
24
+ 'Kalkulator automatycznie dostosowuje liczbę szczebli, aby pierwsza i ostatnia luka były identyczne, gwarantując symetrię wizualną i ścisłe przestrzeganie maksymalnego dozwolonego prześwitu.',
25
+ },
26
+ {
27
+ question: 'Lepiej spawać czy przykręcać tralki?',
28
+ answer:
29
+ 'To zależy od materiału. W przypadku stali spawanie zapewnia maksymalną sztywność konstrukcyjną. W drewnie lub aluminium stosuje się kotwy mechaniczne lub śruby przelotowe. Ważne jest, aby barierka wytrzymała siłę poziomą co najmniej 0,8 kN/m.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Zmierz długość całkowitą',
36
+ text: 'Zmierzy dokładną odległość między pierwszym a ostatnim słupkiem, gdzie zostanie zainstalowana barierka.',
37
+ },
38
+ {
39
+ name: 'Określ grubość tralki',
40
+ text: 'Zmierz szerokość pojedynczego szczebla (np. 2x2 cm dla profilu kwadratowego lub średnicę, jeśli jest okrągły).',
41
+ },
42
+ {
43
+ name: 'Ustal maksymalny prześwit',
44
+ text: 'Wskaż maksymalną pożądaną separację (zalecane 10 cm dla zachowania norm).',
45
+ },
46
+ {
47
+ name: 'Pobierz oznaczenia montażowe',
48
+ text: 'Sprawdź listę dokładnych pozycji do wiercenia otworów, aby zapewnić symetryczny i bezpieczny rozkład.',
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: 'pl',
84
+ };
85
+
86
+ export const content: ToolLocaleContent<BalusterCalculatorUI> = {
87
+ slug,
88
+ title,
89
+ description,
90
+ faqTitle: 'Często Zadawane Pytania',
91
+ faq: faqData,
92
+ bibliographyTitle: 'Referencje Techniczne',
93
+ bibliography: [
94
+ {
95
+ name: 'Prawo Budowlane (Polska)',
96
+ url: 'https://isap.sejm.gov.pl/',
97
+ },
98
+ {
99
+ name: 'IRC - International Residential Code (USA)',
100
+ url: 'https://codes.iccsafe.org/content/IRC2021',
101
+ },
102
+ {
103
+ name: 'IBC - International Building Code',
104
+ url: 'https://codes.iccsafe.org/content/IBC2021',
105
+ },
106
+ ],
107
+ howTo: howToData,
108
+ schemas: [faqSchema, howToSchema, appSchema],
109
+ seo: [
110
+ {
111
+ type: 'title',
112
+ text: 'Ostateczny Przewodnik: Jak Obliczyć Rozstaw Tralek w Barierkach',
113
+ level: 2,
114
+ },
115
+ {
116
+ type: 'paragraph',
117
+ html: 'Projektowanie bezpiecznej i estetycznie doskonałej barierki to sztuka łącząca precyzję matematyczną z przepisami budowlanymi. Czy to na taras, balkon czy schody wewnętrzne, prawidłowe obliczenie tralek (lub szczebli) jest najbardziej krytycznym krokiem projektu. Błąd w obliczeniach nie tylko psuje symetrię wizualną, ale może sprawić, że Twoja konstrukcja będzie nielegalna i niebezpieczna.',
118
+ },
119
+ {
120
+ type: 'card',
121
+ icon: 'mdi:alert-circle-outline',
122
+ title: 'Dlaczego to obliczenie jest takie ważne?',
123
+ html: '<p>Nie chodzi tylko o "wypełnienie luki". Chodzi o przestrzeganie <strong>Zasady Sfery 4 Cali (10 cm)</strong>, międzynarodowej normy bezpieczeństwa zaprojektowanej w celu zapobiegania wypadkom dzieci.</p>',
124
+ },
125
+ {
126
+ type: 'title',
127
+ text: '1. Przepisy Bezpieczeństwa: Zasada 10 cm',
128
+ level: 3,
129
+ },
130
+ {
131
+ type: 'paragraph',
132
+ html: 'Zanim przetniesz pierwszy kawałek drewna lub metalu, musisz zrozumieć "dlaczego" kryjące się za matematyką. Przepisy budowlane w wielu krajach ustalają jasną normę: <em>"Wolna przestrzeń między elementami pionowymi nie powinna pozwalać na przejście sfery o średnicy 10 cm (4 cale)."</em>',
133
+ },
134
+ {
135
+ type: 'paragraph',
136
+ html: 'Ta miara nie jest przypadkowa. Jest to średnia średnica głowy małego dziecka (zwykle poniżej 1 roku życia). Jeśli dziecko może przełożyć ciało, ale głowa utknie, ryzyko uduszenia jest bardzo wysokie. Jeśli głowa przejdzie, może spaść w przepaść. Dlatego celem naszego <strong>Kalkulatora Tralek</strong> nie jest tylko estetyka, ale ratowanie życia.',
137
+ },
138
+ {
139
+ type: 'title',
140
+ text: '2. Problem Matematyczny: Błąd Słupka Ogrodzeniowego',
141
+ level: 3,
142
+ },
143
+ {
144
+ type: 'paragraph',
145
+ html: 'W programowaniu i budownictwie istnieje klasyczny problem zwany <em>"Fencepost Error"</em> (Błąd Słupka Ogrodzeniowego). Jeśli chcesz zbudować 10-metrowy płot ze słupkami co metr, ilu słupków potrzebujesz? Intuicyjna odpowiedź to 10, ale poprawna to 11.',
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Z tralkami dzieje się coś podobnego, ale bardziej złożonego, ponieważ szerokość samej tralki zajmuje miejsce. Formuła, której używa nasze narzędzie, rozwiązuje ten układ równań za Ciebie:',
150
+ },
151
+ {
152
+ type: 'grid',
153
+ columns: [
154
+ {
155
+ type: 'card',
156
+ icon: 'mdi:calculator',
157
+ title: 'Krok A: Obliczanie Luk',
158
+ html: '<p class="bc-formula">n = (L - g_max) / (w + g_max)</p><p>Najpierw określamy, ile tralek zmieściłoby się teoretycznie przy użyciu maksymalnej dozwolonej przestrzeni. Zaokrąglamy tę liczbę w górę, aby zapewnić, że wynikowe luki są <em>mniejsze</em> niż maksimum.</p>',
159
+ },
160
+ {
161
+ type: 'card',
162
+ icon: 'mdi:function-variant',
163
+ title: 'Krok B: Ponowne Obliczenie Dokładnego Odstępu',
164
+ html: '<p class="bc-formula">g = (L - n × w) / (n + 1)</p><p>Gdy znamy dokładną liczbę tralek (n), obliczamy ile miejsca "zostaje" po odjęciu szerokości całego materiału i dzielimy je równo między luki (n+1).</p>',
165
+ },
166
+ ],
167
+ },
168
+ {
169
+ type: 'title',
170
+ text: '3. Przewodnik Krok po Kroku dla Idealnej Instalacji',
171
+ level: 3,
172
+ },
173
+ {
174
+ type: 'paragraph',
175
+ html: 'Posiadanie liczb to tylko połowa sukcesu. Tutaj wyjaśniamy, jak przenieść te dane z papieru (lub ekranu) do rzeczywistości Twojej budowy.',
176
+ },
177
+ {
178
+ type: 'title',
179
+ text: 'Krok 1: Pomiar Precyzyjny',
180
+ level: 3,
181
+ },
182
+ {
183
+ type: 'paragraph',
184
+ html: 'Zmierz odległość <strong>wewnętrzną</strong> między słupkiem a słupkiem. Nie mierz od środka słupka. Musisz znać dokładny prześwit, który wypełnisz (L). Jeśli Twoja barierka ma kilka odcinków, zmierz każdy indywidualnie; konstrukcje rzadko są idealnie prostopadłe, a błąd 0,5 cm może zepsuć symetrię.',
185
+ },
186
+ {
187
+ type: 'title',
188
+ text: 'Krok 2: Znalezienie Środka',
189
+ level: 3,
190
+ },
191
+ {
192
+ type: 'paragraph',
193
+ html: 'Błąd numer jeden początkujących to zaczynanie rozmieszczania tralek od jednego końca do drugiego. Prawie zawsze skutkuje to ostatnią luką o dziwnym rozmiarze, co niszczy harmonię wizualną.<ul><li>Zaznacz <strong>dokładny środek</strong> barierki (L / 2).</li><li>Zdecyduj, czy na środku ma być <em>tralka</em> czy <em>luka</em>.</li><li>Jeśli chcesz tralkę na środku: zaznacz połowę szerokości tralki po obu stronach znaku środkowego.</li><li>Jeśli chcesz lukę na środku: zaznacz połowę odległości luki (g / 2) po obu stronach.</li></ul>',
194
+ },
195
+ {
196
+ type: 'title',
197
+ text: 'Krok 3: Wykonanie Szablonu (Dystansów)',
198
+ level: 3,
199
+ },
200
+ {
201
+ type: 'paragraph',
202
+ html: 'Nie używaj miarki przy każdej tralce. Skumulowany błąd ludzki sprawi, że ostatnia tralka odchyli się o kilka centymetrów. Profesjonalnym sposobem jest wycięcie klocka drewna (lub dwóch) o dokładnym wymiarze luki (g) podanym przez nasz kalkulator.',
203
+ },
204
+ {
205
+ type: 'paragraph',
206
+ html: 'Użyj tego klocka jako szablonu fizycznego. Umieść tralkę, przyłóż klocek, umieść następną tralkę dociśniętą do klocka i zamocuj ją. Gwarantuje to milimetrową spójność.',
207
+ },
208
+ {
209
+ type: 'title',
210
+ text: '4. Materiały i Potrzebne Narzędzia',
211
+ level: 3,
212
+ },
213
+ {
214
+ type: 'card',
215
+ icon: 'mdi:tools',
216
+ title: 'Wyposażenie dla profesjonalnego wykończenia',
217
+ html: '<ul><li>Miarka o wysokiej precyzji</li><li>Ołówek stolarski</li><li>Poziomica (do pionowania)</li><li>Ukośnica (do czystych cięć)</li><li>Wiertarka i wkręty do drewna</li><li>Klocki dystansowe (wykonane na wymiar)</li></ul>',
218
+ },
219
+ {
220
+ type: 'title',
221
+ text: '5. Dodatkowe Pytania Techniczne',
222
+ level: 3,
223
+ },
224
+ {
225
+ type: 'card',
226
+ icon: 'mdi:help-circle-outline',
227
+ title: 'Co jeśli ostatnia luka nie pasuje?',
228
+ html: '<p>Jeśli skorzystałeś z naszego kalkulatora, nie powinno to się zdarzyć. Jednak w świecie rzeczywistym drewno się wygina, a słupki nie zawsze są proste. Jeśli po dotarciu do końca zostanie lub zabraknie Ci 1-2 mm, jest to niezauważalne. Jeśli brakuje 1 cm, sprawdź swoje klocki dystansowe, prawdopodobnie na każdym kroku traciłeś milimetry.</p>',
229
+ },
230
+ {
231
+ type: 'card',
232
+ icon: 'mdi:shield-check-outline',
233
+ title: 'Czy mogę umieścić tralki rzadziej, jeśli nie mam dzieci?',
234
+ html: '<p>Prawnie: nie. Przepisy budowlane dotyczą domu, a nie obecnych mieszkańców. Jeśli kiedyś sprzedasz dom, barierka niezgodna z normami będzie problemem przy inspekcji. Ponadto goście (siostrzeńcy, wnuki) mogą być w niebezpieczeństwie.</p>',
235
+ },
236
+ {
237
+ type: 'card',
238
+ icon: 'mdi:wrench-outline',
239
+ title: 'Drewno, Metal czy Szkło?',
240
+ html: '<p>Ten kalkulator działa dla <strong>każdego powtarzalnego elementu pionowego</strong>. Jeśli używasz poziomych linek stalowych, przepisy są inne (zazwyczaj nie mogą pozwalać na wspinanie się, "efekt drabiny"). W przypadku szkła uważa się je za panel ciągły i nie stosuje się rozstawu, lecz odporność na uderzenia.</p>',
241
+ },
242
+ {
243
+ type: 'card',
244
+ icon: 'mdi:format-quote-close',
245
+ title: 'Mies van der Rohe',
246
+ html: '<p><em>"Architektura jest wolą epoki przełożoną na przestrzeń."</em></p><p>Mamy nadzieję, że to narzędzie pomoże Ci budować bezpieczniejsze i piękniejsze przestrzenie. Zawsze pamiętaj o sprawdzeniu lokalnych przepisów budowlanych w Twojej gminie, ponieważ mogą istnieć specyficzne warianty dotyczące minimalnej wysokości (zwykle 90-110 cm) lub obciążeń siłowych.</p>',
247
+ },
248
+ ],
249
+ ui: {
250
+ sectionTitle: 'Wymiary',
251
+ sectionDesc: 'Wprowadź wymiary swojej barierki',
252
+ labelRailLength: 'Długość Całkowita (L)',
253
+ labelBalusterWidth: 'Szerokość Tralki (w)',
254
+ labelMaxGap: 'Maksymalna Luka (g)',
255
+ blueprintTitle: 'Plan Montażu',
256
+ blueprintRef: 'REF: BAL-001 // SKALA: AUTO',
257
+ labelRequired: 'Wymagane Tralki',
258
+ labelExactGap: 'Dokładna Luka',
259
+ labelOnCenter: 'Od Środka do Środka',
260
+ labelTotalSpaces: 'Łączna Liczba Luk',
261
+ labelCoveredLength: 'Długość Pokryta',
262
+ labelDisclaimer: '* Pokazane wymiary są przybliżone do celów wizualizacji.',
263
+ },
264
+ };