@jjlmoya/utils-diy 1.3.0 โ†’ 1.5.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 (193) 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/index.ts +1 -1
  16. package/src/tests/category_validation.test.ts +18 -0
  17. package/src/tests/faq_count.test.ts +1 -1
  18. package/src/tests/i18n_coverage.test.ts +36 -0
  19. package/src/tests/locale_completeness.test.ts +2 -2
  20. package/src/tests/seo_length.test.ts +3 -0
  21. package/src/tests/slug_language_code_format.test.ts +23 -0
  22. package/src/tests/slug_uniqueness.test.ts +81 -0
  23. package/src/tool/balusterCalculator/i18n/de.ts +264 -0
  24. package/src/tool/balusterCalculator/i18n/id.ts +264 -0
  25. package/src/tool/balusterCalculator/i18n/it.ts +264 -0
  26. package/src/tool/balusterCalculator/i18n/ja.ts +264 -0
  27. package/src/tool/balusterCalculator/i18n/ko.ts +264 -0
  28. package/src/tool/balusterCalculator/i18n/nl.ts +264 -0
  29. package/src/tool/balusterCalculator/i18n/pl.ts +264 -0
  30. package/src/tool/balusterCalculator/i18n/pt.ts +264 -0
  31. package/src/tool/balusterCalculator/i18n/ru.ts +264 -0
  32. package/src/tool/balusterCalculator/i18n/sv.ts +264 -0
  33. package/src/tool/balusterCalculator/i18n/tr.ts +264 -0
  34. package/src/tool/balusterCalculator/i18n/zh.ts +264 -0
  35. package/src/tool/balusterCalculator/index.ts +15 -7
  36. package/src/tool/clayCalculator/i18n/de.ts +183 -0
  37. package/src/tool/clayCalculator/i18n/id.ts +183 -0
  38. package/src/tool/clayCalculator/i18n/it.ts +183 -0
  39. package/src/tool/clayCalculator/i18n/ja.ts +182 -0
  40. package/src/tool/clayCalculator/i18n/ko.ts +183 -0
  41. package/src/tool/clayCalculator/i18n/nl.ts +183 -0
  42. package/src/tool/clayCalculator/i18n/pl.ts +183 -0
  43. package/src/tool/clayCalculator/i18n/pt.ts +183 -0
  44. package/src/tool/clayCalculator/i18n/ru.ts +183 -0
  45. package/src/tool/clayCalculator/i18n/sv.ts +183 -0
  46. package/src/tool/clayCalculator/i18n/tr.ts +183 -0
  47. package/src/tool/clayCalculator/i18n/zh.ts +183 -0
  48. package/src/tool/clayCalculator/index.ts +15 -7
  49. package/src/tool/concreteCalculator/i18n/de.ts +201 -0
  50. package/src/tool/concreteCalculator/i18n/id.ts +201 -0
  51. package/src/tool/concreteCalculator/i18n/it.ts +201 -0
  52. package/src/tool/concreteCalculator/i18n/ja.ts +201 -0
  53. package/src/tool/concreteCalculator/i18n/ko.ts +201 -0
  54. package/src/tool/concreteCalculator/i18n/nl.ts +201 -0
  55. package/src/tool/concreteCalculator/i18n/pl.ts +201 -0
  56. package/src/tool/concreteCalculator/i18n/pt.ts +201 -0
  57. package/src/tool/concreteCalculator/i18n/ru.ts +201 -0
  58. package/src/tool/concreteCalculator/i18n/sv.ts +201 -0
  59. package/src/tool/concreteCalculator/i18n/tr.ts +201 -0
  60. package/src/tool/concreteCalculator/i18n/zh.ts +201 -0
  61. package/src/tool/concreteCalculator/index.ts +17 -5
  62. package/src/tool/cutOptimizer/i18n/de.ts +178 -0
  63. package/src/tool/cutOptimizer/i18n/id.ts +178 -0
  64. package/src/tool/cutOptimizer/i18n/it.ts +178 -0
  65. package/src/tool/cutOptimizer/i18n/ja.ts +178 -0
  66. package/src/tool/cutOptimizer/i18n/ko.ts +178 -0
  67. package/src/tool/cutOptimizer/i18n/nl.ts +178 -0
  68. package/src/tool/cutOptimizer/i18n/pl.ts +178 -0
  69. package/src/tool/cutOptimizer/i18n/pt.ts +178 -0
  70. package/src/tool/cutOptimizer/i18n/ru.ts +178 -0
  71. package/src/tool/cutOptimizer/i18n/sv.ts +178 -0
  72. package/src/tool/cutOptimizer/i18n/tr.ts +178 -0
  73. package/src/tool/cutOptimizer/i18n/zh.ts +178 -0
  74. package/src/tool/cutOptimizer/index.ts +17 -5
  75. package/src/tool/drillCalculator/i18n/de.ts +137 -0
  76. package/src/tool/drillCalculator/i18n/id.ts +137 -0
  77. package/src/tool/drillCalculator/i18n/it.ts +137 -0
  78. package/src/tool/drillCalculator/i18n/ja.ts +137 -0
  79. package/src/tool/drillCalculator/i18n/ko.ts +137 -0
  80. package/src/tool/drillCalculator/i18n/nl.ts +137 -0
  81. package/src/tool/drillCalculator/i18n/pl.ts +137 -0
  82. package/src/tool/drillCalculator/i18n/pt.ts +137 -0
  83. package/src/tool/drillCalculator/i18n/ru.ts +137 -0
  84. package/src/tool/drillCalculator/i18n/sv.ts +137 -0
  85. package/src/tool/drillCalculator/i18n/tr.ts +137 -0
  86. package/src/tool/drillCalculator/i18n/zh.ts +137 -0
  87. package/src/tool/drillCalculator/index.ts +17 -5
  88. package/src/tool/drillSharpener/i18n/de.ts +120 -0
  89. package/src/tool/drillSharpener/i18n/id.ts +120 -0
  90. package/src/tool/drillSharpener/i18n/it.ts +120 -0
  91. package/src/tool/drillSharpener/i18n/ja.ts +120 -0
  92. package/src/tool/drillSharpener/i18n/ko.ts +120 -0
  93. package/src/tool/drillSharpener/i18n/nl.ts +120 -0
  94. package/src/tool/drillSharpener/i18n/pl.ts +120 -0
  95. package/src/tool/drillSharpener/i18n/pt.ts +120 -0
  96. package/src/tool/drillSharpener/i18n/ru.ts +120 -0
  97. package/src/tool/drillSharpener/i18n/sv.ts +120 -0
  98. package/src/tool/drillSharpener/i18n/tr.ts +120 -0
  99. package/src/tool/drillSharpener/i18n/zh.ts +120 -0
  100. package/src/tool/drillSharpener/index.ts +17 -5
  101. package/src/tool/epoxyCalculator/i18n/de.ts +118 -0
  102. package/src/tool/epoxyCalculator/i18n/id.ts +118 -0
  103. package/src/tool/epoxyCalculator/i18n/it.ts +118 -0
  104. package/src/tool/epoxyCalculator/i18n/ja.ts +118 -0
  105. package/src/tool/epoxyCalculator/i18n/ko.ts +118 -0
  106. package/src/tool/epoxyCalculator/i18n/nl.ts +118 -0
  107. package/src/tool/epoxyCalculator/i18n/pl.ts +118 -0
  108. package/src/tool/epoxyCalculator/i18n/pt.ts +118 -0
  109. package/src/tool/epoxyCalculator/i18n/ru.ts +118 -0
  110. package/src/tool/epoxyCalculator/i18n/sv.ts +118 -0
  111. package/src/tool/epoxyCalculator/i18n/tr.ts +118 -0
  112. package/src/tool/epoxyCalculator/i18n/zh.ts +118 -0
  113. package/src/tool/epoxyCalculator/index.ts +15 -7
  114. package/src/tool/furnitureFit/i18n/de.ts +113 -0
  115. package/src/tool/furnitureFit/i18n/id.ts +113 -0
  116. package/src/tool/furnitureFit/i18n/it.ts +113 -0
  117. package/src/tool/furnitureFit/i18n/ja.ts +113 -0
  118. package/src/tool/furnitureFit/i18n/ko.ts +113 -0
  119. package/src/tool/furnitureFit/i18n/nl.ts +113 -0
  120. package/src/tool/furnitureFit/i18n/pl.ts +113 -0
  121. package/src/tool/furnitureFit/i18n/pt.ts +113 -0
  122. package/src/tool/furnitureFit/i18n/ru.ts +113 -0
  123. package/src/tool/furnitureFit/i18n/sv.ts +113 -0
  124. package/src/tool/furnitureFit/i18n/tr.ts +113 -0
  125. package/src/tool/furnitureFit/i18n/zh.ts +113 -0
  126. package/src/tool/furnitureFit/index.ts +17 -5
  127. package/src/tool/mortarCalculator/i18n/de.ts +129 -0
  128. package/src/tool/mortarCalculator/i18n/id.ts +129 -0
  129. package/src/tool/mortarCalculator/i18n/it.ts +129 -0
  130. package/src/tool/mortarCalculator/i18n/ja.ts +129 -0
  131. package/src/tool/mortarCalculator/i18n/ko.ts +129 -0
  132. package/src/tool/mortarCalculator/i18n/nl.ts +129 -0
  133. package/src/tool/mortarCalculator/i18n/pl.ts +129 -0
  134. package/src/tool/mortarCalculator/i18n/pt.ts +129 -0
  135. package/src/tool/mortarCalculator/i18n/ru.ts +129 -0
  136. package/src/tool/mortarCalculator/i18n/sv.ts +129 -0
  137. package/src/tool/mortarCalculator/i18n/tr.ts +129 -0
  138. package/src/tool/mortarCalculator/i18n/zh.ts +129 -0
  139. package/src/tool/mortarCalculator/index.ts +17 -5
  140. package/src/tool/passepartoutCalculator/i18n/de.ts +108 -0
  141. package/src/tool/passepartoutCalculator/i18n/id.ts +108 -0
  142. package/src/tool/passepartoutCalculator/i18n/it.ts +108 -0
  143. package/src/tool/passepartoutCalculator/i18n/ja.ts +108 -0
  144. package/src/tool/passepartoutCalculator/i18n/ko.ts +108 -0
  145. package/src/tool/passepartoutCalculator/i18n/nl.ts +108 -0
  146. package/src/tool/passepartoutCalculator/i18n/pl.ts +108 -0
  147. package/src/tool/passepartoutCalculator/i18n/pt.ts +108 -0
  148. package/src/tool/passepartoutCalculator/i18n/ru.ts +108 -0
  149. package/src/tool/passepartoutCalculator/i18n/sv.ts +108 -0
  150. package/src/tool/passepartoutCalculator/i18n/tr.ts +108 -0
  151. package/src/tool/passepartoutCalculator/i18n/zh.ts +108 -0
  152. package/src/tool/passepartoutCalculator/index.ts +17 -5
  153. package/src/tool/stairCalculator/i18n/de.ts +144 -0
  154. package/src/tool/stairCalculator/i18n/id.ts +144 -0
  155. package/src/tool/stairCalculator/i18n/it.ts +144 -0
  156. package/src/tool/stairCalculator/i18n/ja.ts +144 -0
  157. package/src/tool/stairCalculator/i18n/ko.ts +144 -0
  158. package/src/tool/stairCalculator/i18n/nl.ts +144 -0
  159. package/src/tool/stairCalculator/i18n/pl.ts +144 -0
  160. package/src/tool/stairCalculator/i18n/pt.ts +144 -0
  161. package/src/tool/stairCalculator/i18n/ru.ts +144 -0
  162. package/src/tool/stairCalculator/i18n/sv.ts +144 -0
  163. package/src/tool/stairCalculator/i18n/tr.ts +144 -0
  164. package/src/tool/stairCalculator/i18n/zh.ts +144 -0
  165. package/src/tool/stairCalculator/index.ts +17 -5
  166. package/src/tool/thermalExpansionCalculator/i18n/de.ts +132 -0
  167. package/src/tool/thermalExpansionCalculator/i18n/id.ts +130 -0
  168. package/src/tool/thermalExpansionCalculator/i18n/it.ts +130 -0
  169. package/src/tool/thermalExpansionCalculator/i18n/ja.ts +130 -0
  170. package/src/tool/thermalExpansionCalculator/i18n/ko.ts +130 -0
  171. package/src/tool/thermalExpansionCalculator/i18n/nl.ts +130 -0
  172. package/src/tool/thermalExpansionCalculator/i18n/pl.ts +130 -0
  173. package/src/tool/thermalExpansionCalculator/i18n/pt.ts +130 -0
  174. package/src/tool/thermalExpansionCalculator/i18n/ru.ts +130 -0
  175. package/src/tool/thermalExpansionCalculator/i18n/sv.ts +130 -0
  176. package/src/tool/thermalExpansionCalculator/i18n/tr.ts +130 -0
  177. package/src/tool/thermalExpansionCalculator/i18n/zh.ts +130 -0
  178. package/src/tool/thermalExpansionCalculator/index.ts +17 -5
  179. package/src/tool/voltageDropCalculator/i18n/de.ts +112 -0
  180. package/src/tool/voltageDropCalculator/i18n/id.ts +110 -0
  181. package/src/tool/voltageDropCalculator/i18n/it.ts +110 -0
  182. package/src/tool/voltageDropCalculator/i18n/ja.ts +110 -0
  183. package/src/tool/voltageDropCalculator/i18n/ko.ts +110 -0
  184. package/src/tool/voltageDropCalculator/i18n/nl.ts +110 -0
  185. package/src/tool/voltageDropCalculator/i18n/pl.ts +110 -0
  186. package/src/tool/voltageDropCalculator/i18n/pt.ts +110 -0
  187. package/src/tool/voltageDropCalculator/i18n/ru.ts +110 -0
  188. package/src/tool/voltageDropCalculator/i18n/sv.ts +110 -0
  189. package/src/tool/voltageDropCalculator/i18n/tr.ts +110 -0
  190. package/src/tool/voltageDropCalculator/i18n/zh.ts +110 -0
  191. package/src/tool/voltageDropCalculator/index.ts +17 -5
  192. package/src/tools.ts +2 -0
  193. package/src/types.ts +1 -1
@@ -0,0 +1,113 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FurnitureFitUI } from '../ui';
4
+
5
+ const slug = 'kalkulator-ruang-furnitur';
6
+ const title = 'Kalkulator Ruang untuk Pindahan dan Furnitur';
7
+ const description = 'Periksa apakah sofa, lemari, atau meja Anda muat di lift atau melalui pintu. Gunakan teorema Pythagoras 3D untuk menghitung kemiringan.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Mengapa sofa mungkin tidak muat padahal lebih kecil dari pintu?',
12
+ answer: 'Karena sudut putar. Jika lorong sempit, sofa harus masuk menyamping atau miring. Faktor pembatas bukan hanya lebar pintu, tetapi radius putar yang tersedia di ruangan.',
13
+ },
14
+ {
15
+ question: 'Apa itu diagonal furnitur dan mengapa itu penting?',
16
+ answer: 'Adalah jarak terjauh antara dua sudut yang berlawanan. Sangat penting untuk mengetahui apakah furnitur tinggi dapat ditegakkan di ruangan dengan langit-langit rendah setelah dirakit di lantai.',
17
+ },
18
+ {
19
+ question: 'Bagaimana cara mengukur lift dengan benar?',
20
+ answer: 'Jangan hanya mengukur lantai. Ukur lebar pintu yang terbuka, kedalaman bersih, dan tinggi total. Diagonal dari dasar pintu hingga sudut belakang atas adalah data yang paling penting.',
21
+ },
22
+ {
23
+ question: 'Bagian apa yang harus dilepas terlebih dahulu?',
24
+ answer: 'Kaki sofa, pegangan lemari, dan pintu kulkas seringkali menambah ruang kritis 5 hingga 10 cm yang membuat perbedaan antara furnitur muat atau tertahan di luar.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'Ukur furnitur (Panjang, Lebar, Tinggi)', text: 'Ambil ukuran maksimal objek, termasuk bagian yang menonjol seperti sandaran tangan atau pegangan.' },
30
+ { name: 'Ukur akses kritis', text: 'Ukur celah bebas pintu (dari kusen ke kusen), bagian dalam lift, dan lebar lorong.' },
31
+ { name: 'Masukkan data ke simulator', text: 'Tulis dimensi di alat ini untuk melihat apakah volume furnitur kompatibel dengan ruang akses.' },
32
+ { name: 'Hitung kemiringan', text: 'Jika furnitur sangat tinggi, gunakan diagonal yang dihitung untuk memverifikasi apakah Anda dapat memutarnya di tangga atau di dalam lift.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((step, i) => ({
51
+ '@type': 'HowToStep',
52
+ position: i + 1,
53
+ name: step.name,
54
+ text: step.text,
55
+ })),
56
+ };
57
+
58
+ const appSchema: WithContext<SoftwareApplication> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'SoftwareApplication',
61
+ name: title,
62
+ description,
63
+ applicationCategory: 'UtilityApplication',
64
+ operatingSystem: 'All',
65
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
66
+ inLanguage: 'id',
67
+ };
68
+
69
+ export const content: ToolLocaleContent<FurnitureFitUI> = {
70
+ slug,
71
+ title,
72
+ description,
73
+ faqTitle: 'Pertanyaan Umum',
74
+ faq: faqData,
75
+ bibliographyTitle: 'Referensi Teknis',
76
+ bibliography: [
77
+ { name: 'Geometric Fit in Confined Spaces (MDPI Buildings)', url: 'https://www.mdpi.com/2075-5309/15/2/157' },
78
+ { name: 'Moving Sofa Problem: Wolfram MathWorld', url: 'https://mathworld.wolfram.com/MovingSofaProblem.html' },
79
+ ],
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ { type: 'title', text: 'Sains dalam Pindahan dan Teorema Pythagoras', level: 2 },
84
+ { type: 'paragraph', html: 'Pindahan bukan hanya ujian kekuatan fisik; ini adalah teka-teki geometris yang kompleks. Ruang yang terlihat di sebuah ruangan atau lift seringkali menipu mata manusia, terutama ketika kita mengabaikan dimensi ketiga. Matematika dapat menyelamatkan Anda dari kerugian jutaan rupiah akibat pengembalian barang dan transportasi yang gagal.' },
85
+ { type: 'title', text: 'Trik Diagonal 3D', level: 3 },
86
+ { type: 'card', icon: 'mdi:math-log', title: 'Aturan Emas', html: '<p>Jangan pernah hanya mengukur furniturnya saja. Selalu ukur <strong>titik akses kritis</strong>: lebar kusen pintu (dikurangi ketebalan pintu jika tidak terbuka 180ยฐ), titik terendah langit-langit di tangga, dan kedalaman nyata lift dengan pintu tertutup. Rumus <code>d = โˆš(wยฒ + hยฒ + zยฒ)</code> menunjukkan apakah barang muat jika dimiringkan.</p>' },
87
+ { type: 'title', text: 'Masalah Sofa di Lorong', level: 3 },
88
+ { type: 'card', icon: 'mdi:sofa', title: 'Margin Manuver', html: '<p>Kesalahan umum adalah mengasumsikan jika furnitur berukuran 80cm dan celahnya 80cm, maka akan muat. Tidak seperti itu. Tangan pengangkut, elastisitas kain, dan ketidaksempurnaan dinding memerlukan margin minimal <strong>2 hingga 5 cm</strong>. Tanpa margin ini, furnitur akan tergores atau terjepit karena tekanan.</p>' },
89
+ { type: 'title', text: '3 Kesalahan yang Merusak Pindahan', level: 3 },
90
+ { type: 'paragraph', html: 'Meskipun dengan ukuran yang benar, faktor tak kasat mata ini sering menyebabkan bencana: <strong>Lampu Langit-langit</strong> โ€” terlupakan saat pemutaran diagonal; <strong>Radius Putar Furnitur</strong> โ€” furnitur yang kaku tidak bisa ditekuk; <strong>Kemasan</strong> โ€” bubble wrap dan kardus pelindung dapat menambah 1 hingga 3 cm di setiap sisi.' },
91
+ ],
92
+ ui: {
93
+ conTitle: 'Dimensi Ruang',
94
+ conHint: 'Contoh: Lift standar, kusen pintu, atau mobil boks.',
95
+ objTitle: 'Dimensi Furnitur',
96
+ labelWidth: 'Lebar (cm)',
97
+ labelHeight: 'Tinggi (cm)',
98
+ labelDepth: 'Kedalaman (cm)',
99
+ labelLength: 'Panjang (cm)',
100
+ labelMargin: 'Margin Kesalahan (cm)',
101
+ vizLabel: 'Tampilan Ruang Sederhana',
102
+ verdictDefault: 'Apakah muat?',
103
+ verdictHint: 'Masukkan ukuran untuk mengecek kompatibilitas ruang.',
104
+ verdictYes: 'YA, MUAT!',
105
+ verdictNo: 'TIDAK MUAT',
106
+ fitDirect: 'Furnitur muat secara langsung dengan sempurna.',
107
+ fitDiagonal3d: 'Muat jika dimiringkan secara diagonal (Pythagoras 3D).',
108
+ fitDiagonalPlane: 'Muat jika dimiringkan pada salah satu sisi.',
109
+ fitNope: 'Furnitur terlalu besar bahkan untuk masuk secara diagonal.',
110
+ diagLabel: 'Diagonal Maksimal (Pythagoras 3D):',
111
+ objLabel: 'Furnitur',
112
+ },
113
+ };
@@ -0,0 +1,113 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FurnitureFitUI } from '../ui';
4
+
5
+ const slug = 'calcolatore-spazio-mobili';
6
+ const title = 'Calcolatore di Spazio per Traslochi e Mobili';
7
+ const description = 'Verifica se il tuo divano, armadio o tavolo entra in ascensore o dalla porta. Usa il teorema di Pitagora 3D per calcolare le inclinazioni.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Perchรฉ un divano puรฒ non entrare anche se รจ piรน piccolo della porta?',
12
+ answer: 'A causa dell\'angolo di rotazione. Se il corridoio รจ stretto, il divano deve entrare di lato o inclinato. Il fattore limitante non รจ solo la larghezza della porta, ma il raggio di rotazione disponibile nel locale.',
13
+ },
14
+ {
15
+ question: 'Cos\'รจ la diagonale di un mobile e perchรฉ รจ importante?',
16
+ answer: 'รˆ la distanza piรน lunga tra due angoli opposti. รˆ fondamentale per sapere se un mobile alto puรฒ essere sollevato in una stanza con soffitto basso dopo essere stato montato a terra.',
17
+ },
18
+ {
19
+ question: 'Come misurare correttamente un ascensore?',
20
+ answer: 'Non misurare solo il pavimento. Misura la larghezza della porta aperta, la profonditร  libera e l\'altezza totale. La diagonale dalla base della porta all\'angolo posteriore superiore รจ il dato piรน importante.',
21
+ },
22
+ {
23
+ question: 'Quali pezzi devono essere smontati per primi?',
24
+ answer: 'Piedini dei divani, maniglie degli armadi e porte dei frigoriferi spesso fanno guadagnare tra i 5 e i 10 cm critici che fanno la differenza tra un mobile che entra o che resta fuori.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'Misurare il mobile (Lungo, Largo, Alto)', text: 'Prendi le misure massime dell\'oggetto, inclusa qualsiasi sporgenza come braccioli o maniglie.' },
30
+ { name: 'Misurare i passaggi critici', text: 'Misura il vano libero della porta (da telaio a telaio), l\'interno dell\'ascensore e la larghezza dei corridoi.' },
31
+ { name: 'Inserire i dati nel simulatore', text: 'Scrivi le dimensioni nello strumento per vedere se il volume del mobile รจ compatibile con lo spazio di passaggio.' },
32
+ { name: 'Calcolare le inclinazioni', text: 'Se il mobile รจ molto alto, usa la diagonale calcolata per verificare se potrai ruotarlo nel pianerottolo o dentro l\'ascensore.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((step, i) => ({
51
+ '@type': 'HowToStep',
52
+ position: i + 1,
53
+ name: step.name,
54
+ text: step.text,
55
+ })),
56
+ };
57
+
58
+ const appSchema: WithContext<SoftwareApplication> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'SoftwareApplication',
61
+ name: title,
62
+ description,
63
+ applicationCategory: 'UtilityApplication',
64
+ operatingSystem: 'All',
65
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
66
+ inLanguage: 'it',
67
+ };
68
+
69
+ export const content: ToolLocaleContent<FurnitureFitUI> = {
70
+ slug,
71
+ title,
72
+ description,
73
+ faqTitle: 'Domande Frequenti',
74
+ faq: faqData,
75
+ bibliographyTitle: 'Riferimenti Tecnici',
76
+ bibliography: [
77
+ { name: 'Geometric Fit in Confined Spaces (MDPI Buildings)', url: 'https://www.mdpi.com/2075-5309/15/2/157' },
78
+ { name: 'Moving Sofa Problem: Wolfram MathWorld', url: 'https://mathworld.wolfram.com/MovingSofaProblem.html' },
79
+ ],
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ { type: 'title', text: 'La Scienza dei Traslochi e il Teorema di Pitagora', level: 2 },
84
+ { type: 'paragraph', html: 'I traslochi non sono solo una prova di forza fisica; sono un complesso puzzle geometrico. Lo spazio apparente di una stanza o di un ascensore inganna l\'occhio umano, specialmente quando ignoriamo la terza dimensione. La matematica puรฒ farti risparmiare centinaia di euro in resi e trasporti falliti.' },
85
+ { type: 'title', text: 'Il Trucco della Diagonale 3D', level: 3 },
86
+ { type: 'card', icon: 'mdi:math-log', title: 'Regola d\'Oro', html: '<p>Non misurare mai solo il mobile. Misura sempre i <strong>punti critici di accesso</strong>: la larghezza del telaio della porta, il punto piรน basso del soffitto sul pianerottolo e la profonditร  reale dell\'ascensore con le porte chiuse. La formula <code>d = โˆš(wยฒ + hยฒ + zยฒ)</code> ti rivela se entra inclinato.</p>' },
87
+ { type: 'title', text: 'Il Problema del Divano nel Corridoio', level: 3 },
88
+ { type: 'card', icon: 'mdi:sofa', title: 'Margine di Manovra', html: '<p>Un errore comune รจ assumere che se il mobile misura 80cm e il vano 80cm, passerร . Non รจ cosรฌ. Le mani dei trasportatori, l\'elasticitร  del tessuto e le imperfezioni delle pareti richiedono un margine minimo di <strong>2-5 cm</strong>. Senza questo margine, il mobile si graffierร  o rimarrร  incastrato per pressione.</p>' },
89
+ { type: 'title', text: 'I 3 Errori che Rovinano un Traslocco', level: 3 },
90
+ { type: 'paragraph', html: 'Anche con misure corrette, questi fattori invisibili causano spesso disastri: <strong>La Lampada a Soffitto</strong> โ€” dimenticata durante la rotazione diagonale; <strong>Il Raggio di Rotazione del Mobile</strong> โ€” un mobile rigido non si piega; <strong>L\'Imballaggio</strong> โ€” il pluriball puรฒ aggiungere da 1 a 3 cm per lato.' },
91
+ ],
92
+ ui: {
93
+ conTitle: 'Dimensioni dello Spazio',
94
+ conHint: 'Es: Ascensore standard, telaio porta o furgone.',
95
+ objTitle: 'Dimensioni del Mobile',
96
+ labelWidth: 'Larghezza (cm)',
97
+ labelHeight: 'Altezza (cm)',
98
+ labelDepth: 'Profonditร  (cm)',
99
+ labelLength: 'Lunghezza (cm)',
100
+ labelMargin: 'Margine di Errore (cm)',
101
+ vizLabel: 'Vista Spaziale Semplificata',
102
+ verdictDefault: 'Entra?',
103
+ verdictHint: 'Inserisci le misure per verificare la compatibilitร  spaziale.',
104
+ verdictYes: 'SรŒ, ENTRA!',
105
+ verdictNo: 'NON ENTRA',
106
+ fitDirect: 'Il mobile entra perfettamente in modo diretto.',
107
+ fitDiagonal3d: 'Entra inclinato diagonalmente (Pitagora 3D).',
108
+ fitDiagonalPlane: 'Entra inclinato in uno dei piani laterali.',
109
+ fitNope: 'Il mobile รจ troppo grande anche per entrare in diagonale.',
110
+ diagLabel: 'Diagonale Massima (Pitagora 3D):',
111
+ objLabel: 'Mobile',
112
+ },
113
+ };
@@ -0,0 +1,113 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FurnitureFitUI } from '../ui';
4
+
5
+ const slug = 'furniture-fit-calculator';
6
+ const title = 'ๅผ•่ถŠใ—ใƒปๅฎถๅ…ทใ‚นใƒšใƒผใ‚น่จˆ็ฎ—ๆฉŸ';
7
+ const description = 'ใ‚ฝใƒ•ใ‚กใ€ใ‚ฟใƒณใ‚นใ€ใƒ†ใƒผใƒ–ใƒซใŒใ‚จใƒฌใƒ™ใƒผใ‚ฟใƒผใ‚„ใƒ‰ใ‚ขใ‚’้€šใ‚‹ใ‹็ขบ่ชใ—ใพใ™ใ€‚3Dใƒ”ใ‚ฟใ‚ดใƒฉใ‚นใฎๅฎš็†ใ‚’ไฝฟ็”จใ—ใฆใ€ๅ‚พใ‘ใŸๆ™‚ใฎใ‚ตใ‚คใ‚บใ‚’่จˆ็ฎ—ใ—ใ€ๅผ•่ถŠใ—ใฎๅคฑๆ•—ใ‚’้˜ฒใŽใพใ™ใ€‚';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'ใƒ‰ใ‚ขใ‚ˆใ‚Šใ‚‚ๅฐใ•ใ„ใฎใซใ‚ฝใƒ•ใ‚กใŒๅ…ฅใ‚‰ใชใ„ใ“ใจใŒใ‚ใ‚‹ใฎใฏใชใœใงใ™ใ‹๏ผŸ',
12
+ answer: 'ๅ›ž่ปข่ง’ๅบฆใฎใŸใ‚ใงใ™ใ€‚ๅปŠไธ‹ใŒ็‹ญใ„ๅ ดๅˆใ€ใ‚ฝใƒ•ใ‚กใ‚’ๆจชๅ‘ใใ‚„ๆ–œใ‚ใซๅ…ฅใ‚Œใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ๅˆถ้™่ฆๅ› ใฏใƒ‰ใ‚ขใฎๅน…ใ ใ‘ใงใชใใ€้ƒจๅฑ‹ใงๅˆฉ็”จๅฏ่ƒฝใชๅ›ž่ปขๅŠๅพ„ใ‚‚ๅซใพใ‚Œใพใ™ใ€‚',
13
+ },
14
+ {
15
+ question: 'ๅฎถๅ…ทใฎๅฏพ่ง’็ทšใจใฏไฝ•ใงใ™ใ‹๏ผŸใชใœ้‡่ฆใชใฎใงใ™ใ‹๏ผŸ',
16
+ answer: '2ใคใฎๅฏพๆฅตใซใ‚ใ‚‹่ง’ใฎ้–“ใฎๆœ€ใ‚‚้•ทใ„่ท้›ขใฎใ“ใจใงใ™ใ€‚ๅบŠใง็ต„ใฟ็ซ‹ใฆใŸๅพŒใฎ่ƒŒใฎ้ซ˜ใ„ๅฎถๅ…ทใ‚’ใ€ๅคฉไบ•ใฎไฝŽใ„้ƒจๅฑ‹ใง็ซ‹ใฆ็›ดใ™ใ“ใจใŒใงใใ‚‹ใ‹ใฉใ†ใ‹ใ‚’็Ÿฅใ‚‹ใŸใ‚ใซไธๅฏๆฌ ใงใ™ใ€‚',
17
+ },
18
+ {
19
+ question: 'ใ‚จใƒฌใƒ™ใƒผใ‚ฟใƒผใฎๆญฃใ—ใ„ๆธฌใ‚Šๆ–นใฏ๏ผŸ',
20
+ answer: 'ๅบŠใ ใ‘ใ‚’ๆธฌใ‚‰ใชใ„ใงใใ ใ•ใ„ใ€‚้–‹ใ„ใŸใƒ‰ใ‚ขใฎๅน…ใ€ๆœ‰ๅŠนๅฅฅ่กŒใใ€ๅ…จ้ซ˜ใ‚’ๆธฌใ‚Šใพใ™ใ€‚ใƒ‰ใ‚ขใฎไป˜ใ‘ๆ นใ‹ใ‚‰ๅพŒๆ–นใฎๅคฉไบ•ใฎ่ง’ใพใงใฎๅฏพ่ง’็ทšใŒๆœ€ใ‚‚้‡่ฆใชใƒ‡ใƒผใ‚ฟใงใ™ใ€‚',
21
+ },
22
+ {
23
+ question: 'ใพใšใฉใฎ้ƒจๅ“ใ‚’ๅˆ†่งฃใ™ในใใงใ™ใ‹๏ผŸ',
24
+ answer: 'ใ‚ฝใƒ•ใ‚กใฎ่„šใ€ใ‚ฟใƒณใ‚นใฎๅ–ใฃๆ‰‹ใ€ๅ†ท่”ตๅบซใฎใƒ‰ใ‚ขใชใฉใฏใ€ๆ•ฐใ‚ปใƒณใƒใ‹ใ‚‰10ใ‚ปใƒณใƒใปใฉใฎไฝ™่ฃ•ใ‚’็”Ÿใ‚€ใ“ใจใŒๅคšใใ€ๅฎถๅ…ทใŒๅ…ฅใ‚‹ใ‹ๅ…ฅใ‚‰ใชใ„ใ‹ใฎๅˆ†ใ‹ใ‚Œ็›ฎใซใชใ‚Šใพใ™ใ€‚',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'ๅฎถๅ…ทใ‚’ๆธฌใ‚‹๏ผˆ้•ทใ•ใ€ๅน…ใ€้ซ˜ใ•๏ผ‰', text: '่‚˜ๆŽ›ใ‘ใ‚„ๅ–ใฃๆ‰‹ใชใฉใฎ็ช่ตท้ƒจใ‚’ๅซใ‚ใŸใ€ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎๆœ€ๅคงๅฏธๆณ•ใ‚’ๆธฌใ‚Šใพใ™ใ€‚' },
30
+ { name: '้‡่ฆ็ฎ‡ๆ‰€ใ‚’ๆธฌใ‚‹', text: 'ใƒ‰ใ‚ขใฎๆœ‰ๅŠน้–‹ๅฃๅน…๏ผˆๆž ใ‹ใ‚‰ๆž ใพใง๏ผ‰ใ€ใ‚จใƒฌใƒ™ใƒผใ‚ฟใƒผใฎๅ†…้ƒจใ€ๅปŠไธ‹ใฎๅน…ใ‚’ๆธฌใ‚Šใพใ™ใ€‚' },
31
+ { name: 'ใ‚ทใƒŸใƒฅใƒฌใƒผใ‚ฟใƒผใซใƒ‡ใƒผใ‚ฟใ‚’ๅ…ฅๅŠ›', text: 'ใƒ„ใƒผใƒซใซๅฏธๆณ•ใ‚’ๅ…ฅๅŠ›ใ—ใฆใ€ๅฎถๅ…ทใฎไฝ“็ฉใŒๆฌๅ…ฅ็ตŒ่ทฏใฎใ‚นใƒšใƒผใ‚นใจ้ฉๅˆใ™ใ‚‹ใ‹็ขบ่ชใ—ใพใ™ใ€‚' },
32
+ { name: 'ๅ‚พๆ–œใ‚’่จˆ็ฎ—ใ™ใ‚‹', text: 'ๅฎถๅ…ทใŒ้žๅธธใซ้ซ˜ใ„ๅ ดๅˆใฏใ€่จˆ็ฎ—ใ•ใ‚ŒใŸๅฏพ่ง’็ทšใ‚’ไฝฟ็”จใ—ใฆใ€้šŽๆฎตใฎ่ธŠใ‚Šๅ ดใ‚„ใ‚จใƒฌใƒ™ใƒผใ‚ฟใƒผๅ†…ใงๅ›ž่ปขใงใใ‚‹ใ‹็ขบ่ชใ—ใพใ™ใ€‚' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((step, i) => ({
51
+ '@type': 'HowToStep',
52
+ position: i + 1,
53
+ name: step.name,
54
+ text: step.text,
55
+ })),
56
+ };
57
+
58
+ const appSchema: WithContext<SoftwareApplication> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'SoftwareApplication',
61
+ name: title,
62
+ description,
63
+ applicationCategory: 'UtilityApplication',
64
+ operatingSystem: 'All',
65
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
66
+ inLanguage: 'ja',
67
+ };
68
+
69
+ export const content: ToolLocaleContent<FurnitureFitUI> = {
70
+ slug,
71
+ title,
72
+ description,
73
+ faqTitle: 'ใ‚ˆใใ‚ใ‚‹่ณชๅ•',
74
+ faq: faqData,
75
+ bibliographyTitle: 'ๆŠ€่ก“ใƒชใƒ•ใ‚กใƒฌใƒณใ‚น',
76
+ bibliography: [
77
+ { name: 'Geometric Fit in Confined Spaces (MDPI Buildings)', url: 'https://www.mdpi.com/2075-5309/15/2/157' },
78
+ { name: 'Moving Sofa Problem: Wolfram MathWorld', url: 'https://mathworld.wolfram.com/MovingSofaProblem.html' },
79
+ ],
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ { type: 'title', text: 'ๅผ•่ถŠใ—ใฎ็ง‘ๅญฆใจใƒ”ใ‚ฟใ‚ดใƒฉใ‚นใฎๅฎš็†', level: 2 },
84
+ { type: 'paragraph', html: 'ๅผ•่ถŠใ—ใฏๅ˜ใชใ‚‹ไฝ“ๅŠ›ใฎใƒ†ใ‚นใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚่ค‡้›‘ใชๅนพไฝ•ๅญฆ็š„ใƒ‘ใ‚บใƒซใงใ™ใ€‚้ƒจๅฑ‹ใ‚„ใ‚จใƒฌใƒ™ใƒผใ‚ฟใƒผใฎ่ฆ‹ใ‹ใ‘ใฎใ‚นใƒšใƒผใ‚นใฏใ€็‰นใซ3ๆฌกๅ…ƒใ‚’็„ก่ฆ–ใ™ใ‚‹ใจไบบใฎ็›ฎใ‚’ๆฌบใใพใ™ใ€‚ๆ•ฐๅญฆใ‚’ๅˆฉ็”จใ™ใ‚‹ใ“ใจใงใ€่ฟ”ๅ“ใ‚„ๆฌ้€ใฎๅคฑๆ•—ใซใ‚ˆใ‚‹ๅคš้กใฎๆๅคฑใ‚’้˜ฒใใ“ใจใŒใงใใพใ™ใ€‚' },
85
+ { type: 'title', text: '3Dๅฏพ่ง’็ทšใฎใ‚ณใƒ„', level: 3 },
86
+ { type: 'card', icon: 'mdi:math-log', title: '้ป„้‡‘ๅพ‹', html: '<p>ๅฎถๅ…ทใ ใ‘ใ‚’ๆธฌใฃใฆใฏใ„ใ‘ใพใ›ใ‚“ใ€‚ๅธธใซ<strong>้‡่ฆใชใ‚ขใ‚ฏใ‚ปใ‚นใƒใ‚คใƒณใƒˆ</strong>ใ‚’ๆธฌใฃใฆใใ ใ•ใ„๏ผšใƒ‰ใ‚ขๆž ใฎๅน…๏ผˆใƒ‰ใ‚ขใŒ180ๅบฆ้–‹ใ‹ใชใ„ๅ ดๅˆใฏใƒ‰ใ‚ขใฎๅŽšใฟใ‚’ๅผ•ใ๏ผ‰ใ€่ธŠใ‚Šๅ ดใฎๅคฉไบ•ใฎๆœ€ใ‚‚ไฝŽใ„ๅœฐ็‚นใ€ใใ—ใฆใƒ‰ใ‚ขใ‚’้–‰ใ‚ใŸๆ™‚ใฎใ‚จใƒฌใƒ™ใƒผใ‚ฟใƒผใฎๅฎŸ้š›ใฎๅฅฅ่กŒใใงใ™ใ€‚ๅ…ฌๅผ <code>d = โˆš(wยฒ + hยฒ + zยฒ)</code> ใŒใ€ๆ–œใ‚ใซใ—ใฆๅ…ฅใ‚‹ใ‹ใฉใ†ใ‹ใ‚’ๆ•™ใˆใฆใใ‚Œใพใ™ใ€‚</p>' },
87
+ { type: 'title', text: 'ๅปŠไธ‹ใฎใ‚ฝใƒ•ใ‚กๅ•้กŒ', level: 3 },
88
+ { type: 'card', icon: 'mdi:sofa', title: 'ๆ“ไฝœใฎไฝ™่ฃ•', html: '<p>ๅฎถๅ…ทใŒ80cmใง้–‹ๅฃ้ƒจใŒ80cmใชใ‚‰้€šใ‚‹ใจๆ€ใ„่พผใ‚€ใฎใฏใ‚ˆใใ‚ใ‚‹้–“้•ใ„ใงใ™ใ€‚ใใ†ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ไฝœๆฅญๅ“กใฎๆ‰‹ใ€็”ŸๅœฐใฎๅผพๅŠ›ๆ€งใ€ๅฃใฎๅ‡นๅ‡ธใชใฉใ‚’่€ƒๆ…ฎใ™ใ‚‹ใจใ€ๆœ€ไฝŽ <strong>2ใ€œ5 cm</strong> ใฎไฝ™่ฃ•ใŒๅฟ…่ฆใงใ™ใ€‚ใ“ใฎไฝ™่ฃ•ใŒใชใ„ใจใ€ๅฎถๅ…ทใŒๅ‚ทใคใ„ใŸใ‚Šๅœง่ฟซใ•ใ‚Œใฆๅ‹•ใ‹ใชใใชใฃใŸใ‚Šใ—ใพใ™ใ€‚</p>' },
89
+ { type: 'title', text: 'ๅผ•่ถŠใ—ใ‚’ๅฐ็„กใ—ใซใ™ใ‚‹3ใคใฎ้–“้•ใ„', level: 3 },
90
+ { type: 'paragraph', html: 'ๆญฃใ—ใ„ๆŽกๅฏธใ‚’ใ—ใฆใ„ใฆใ‚‚ใ€ใ“ใ‚Œใ‚‰่ฆ‹ใˆใชใ„่ฆๅ› ใŒ็ฝใ„ใ‚’ใ‚‚ใŸใ‚‰ใ™ใ“ใจใŒใ‚ใ‚Šใพใ™๏ผš<strong>ๅคฉไบ•ใฎ็…งๆ˜Ž</strong> โ€” ๅฏพ่ง’็ทšๅ›ž่ปขไธญใซๅฟ˜ใ‚Œใ‚‰ใ‚ŒใŒใกใงใ™ใ€‚<strong>ๅฎถๅ…ทใฎๅ›ž่ปขๅŠๅพ„</strong> โ€” ๅ›บใ„ๅฎถๅ…ทใฏๆ›ฒใŒใ‚Šใพใ›ใ‚“ใ€‚<strong>ๆขฑๅŒ…</strong> โ€” ใƒ—ใƒใƒ—ใƒใ‚„ไฟ่ญท็”จใƒ€ใƒณใƒœใƒผใƒซใฏๅ„่พบใซ1ใ€œ3cmๅŠ ใ‚ใ‚Šใพใ™ใ€‚' },
91
+ ],
92
+ ui: {
93
+ conTitle: 'ใ‚นใƒšใƒผใ‚นใฎๅฏธๆณ•',
94
+ conHint: 'ไพ‹๏ผšๆจ™ๆบ–ใ‚จใƒฌใƒ™ใƒผใ‚ฟใƒผใ€ใƒ‰ใ‚ขๆž ใ€ใƒˆใƒฉใƒƒใ‚ฏใชใฉใ€‚',
95
+ objTitle: 'ๅฎถๅ…ทใฎๅฏธๆณ•',
96
+ labelWidth: 'ๅน… (cm)',
97
+ labelHeight: '้ซ˜ใ• (cm)',
98
+ labelDepth: 'ๅฅฅ่กŒใ (cm)',
99
+ labelLength: '้•ทใ• (cm)',
100
+ labelMargin: '่จฑๅฎน่ชคๅทฎ (cm)',
101
+ vizLabel: '็ฐกๆ˜“ใ‚นใƒšใƒผใ‚นใƒ“ใƒฅใƒผ',
102
+ verdictDefault: 'ๅ…ฅใ‚‹๏ผŸ',
103
+ verdictHint: 'ๅฏธๆณ•ใ‚’ๅ…ฅๅŠ›ใ—ใฆใ‚นใƒšใƒผใ‚นใฎ้ฉๅˆๆ€งใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚',
104
+ verdictYes: 'ใฏใ„ใ€ๅ…ฅใ‚Šใพใ™๏ผ',
105
+ verdictNo: 'ๅ…ฅใ‚Šใพใ›ใ‚“',
106
+ fitDirect: 'ๅฎถๅ…ทใฏใใฎใพใพๅฎŒ็’งใซๅ…ฅใ‚Šใพใ™ใ€‚',
107
+ fitDiagonal3d: 'ๅฏพ่ง’็ทšไธŠใซๅ‚พใ‘ใ‚Œใฐๅ…ฅใ‚Šใพใ™๏ผˆ3Dใƒ”ใ‚ฟใ‚ดใƒฉใ‚น๏ผ‰ใ€‚',
108
+ fitDiagonalPlane: 'ๅด้ขใฎใ„ใšใ‚Œใ‹ใฎๅนณ้ขใงๅ‚พใ‘ใ‚Œใฐๅ…ฅใ‚Šใพใ™ใ€‚',
109
+ fitNope: 'ๅฎถๅ…ทใŒๅคงใใ™ใŽใฆใ€ๆ–œใ‚ใซใ—ใฆใ‚‚ๅ…ฅใ‚Šใพใ›ใ‚“ใ€‚',
110
+ diagLabel: 'ๆœ€ๅคงๅฏพ่ง’็ทš๏ผˆ3Dใƒ”ใ‚ฟใ‚ดใƒฉใ‚น๏ผ‰:',
111
+ objLabel: 'ๅฎถๅ…ท',
112
+ },
113
+ };
@@ -0,0 +1,113 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FurnitureFitUI } from '../ui';
4
+
5
+ const slug = 'furniture-fit-calculator';
6
+ const title = '์ด์‚ฌ ๋ฐ ๊ฐ€๊ตฌ ๊ณต๊ฐ„ ๊ณ„์‚ฐ๊ธฐ';
7
+ const description = '์†ŒํŒŒ, ์˜ท์žฅ ๋˜๋Š” ํ…Œ์ด๋ธ”์ด ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋‚˜ ๋ฌธ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. 3D ํ”ผํƒ€๊ณ ๋ผ์Šค ์ •๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์šธ์˜€์„ ๋•Œ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ด์‚ฌ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: '๋ฌธ๋ณด๋‹ค ์ž‘์€๋ฐ ์†ŒํŒŒ๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?',
12
+ answer: 'ํšŒ์ „ ๊ฐ๋„ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณต๋„๊ฐ€ ์ข์€ ๊ฒฝ์šฐ ์†ŒํŒŒ๋ฅผ ์˜†์œผ๋กœ ๋ˆ•ํžˆ๊ฑฐ๋‚˜ ๊ธฐ์šธ์—ฌ์„œ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ ์š”์ธ์€ ๋ฌธ ๋„ˆ๋น„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฉ์—์„œ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๊ฒฝ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.',
13
+ },
14
+ {
15
+ question: '๊ฐ€๊ตฌ์˜ ๋Œ€๊ฐ์„ ์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”?',
16
+ answer: '์„œ๋กœ ๋งˆ์ฃผ ๋ณด๋Š” ๋‘ ๋ชจ์„œ๋ฆฌ ์‚ฌ์ด์˜ ๊ฐ€์žฅ ๊ธด ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋‹ฅ์—์„œ ์กฐ๋ฆฝํ•œ ํ‚ค ํฐ ๊ฐ€๊ตฌ๋ฅผ ์ฒœ์žฅ์ด ๋‚ฎ์€ ๋ฐฉ์—์„œ ๋‹ค์‹œ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.',
17
+ },
18
+ {
19
+ question: '์—˜๋ฆฌ๋ฒ ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?',
20
+ answer: '๋ฐ”๋‹ฅ๋งŒ ์ธก์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์—ด๋ฆฐ ๋ฌธ ๋„ˆ๋น„, ์œ ํšจ ๊นŠ์ด, ์ „์ฒด ๋†’์ด๋ฅผ ์ธก์ •ํ•˜์‹ญ์‹œ์˜ค. ๋ฌธ ๋ฐ”๋‹ฅ์—์„œ ํ›„๋ฉด ์ƒ๋‹จ ๋ชจ์„œ๋ฆฌ๊นŒ์ง€์˜ ๋Œ€๊ฐ์„ ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.',
21
+ },
22
+ {
23
+ question: '์–ด๋–ค ๋ถ€ํ’ˆ์„ ๋จผ์ € ๋ถ„ํ•ดํ•ด์•ผ ํ•˜๋‚˜์š”?',
24
+ answer: '์†ŒํŒŒ ๋‹ค๋ฆฌ, ์˜ท์žฅ ์†์žก์ด, ๋ƒ‰์žฅ๊ณ  ๋ฌธ ๋“ฑ์€ ์ข…์ข… 5~10cm์˜ ์ค‘์š”ํ•œ ์—ฌ์œ  ๊ณต๊ฐ„์„ ๋งŒ๋“ค์–ด ๊ฐ€๊ตฌ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •์ง“์Šต๋‹ˆ๋‹ค.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: '๊ฐ€๊ตฌ ์ธก์ • (๊ธธ์ด, ๋„ˆ๋น„, ๋†’์ด)', text: 'ํŒ”๊ฑธ์ด๋‚˜ ์†์žก์ด ๋“ฑ ๋Œ์ถœ๋œ ๋ถ€๋ถ„์„ ํฌํ•จํ•˜์—ฌ ๋ฌผ์ฒด์˜ ์ตœ๋Œ€ ์น˜์ˆ˜๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.' },
30
+ { name: '์ฃผ์š” ํ†ต๋กœ ์ธก์ •', text: '๋ฌธ ํ†ต๊ณผ ์œ ํšจ ๋„ˆ๋น„(ํ”„๋ ˆ์ž„ ์‚ฌ์ด), ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ๋‚ด๋ถ€, ๋ณต๋„ ๋„ˆ๋น„๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.' },
31
+ { name: '์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋ฐ์ดํ„ฐ ์ž…๋ ฅ', text: '๋„๊ตฌ์— ์น˜์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๊ฐ€๊ตฌ ๋ถ€ํ”ผ๊ฐ€ ํ†ต๋กœ ๊ณต๊ฐ„๊ณผ ํ˜ธํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.' },
32
+ { name: '๊ธฐ์šธ๊ธฐ ๊ณ„์‚ฐ', text: '๊ฐ€๊ตฌ๊ฐ€ ๋งค์šฐ ๋†’์„ ๊ฒฝ์šฐ, ๊ณ„์‚ฐ๋œ ๋Œ€๊ฐ์„ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„๋‹จ์ฐธ์ด๋‚˜ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ๋‚ด๋ถ€์—์„œ ํšŒ์ „ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((step, i) => ({
51
+ '@type': 'HowToStep',
52
+ position: i + 1,
53
+ name: step.name,
54
+ text: step.text,
55
+ })),
56
+ };
57
+
58
+ const appSchema: WithContext<SoftwareApplication> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'SoftwareApplication',
61
+ name: title,
62
+ description,
63
+ applicationCategory: 'UtilityApplication',
64
+ operatingSystem: 'All',
65
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
66
+ inLanguage: 'ko',
67
+ };
68
+
69
+ export const content: ToolLocaleContent<FurnitureFitUI> = {
70
+ slug,
71
+ title,
72
+ description,
73
+ faqTitle: '์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ',
74
+ faq: faqData,
75
+ bibliographyTitle: '๊ธฐ์ˆ  ์ฐธ๊ณ  ์ž๋ฃŒ',
76
+ bibliography: [
77
+ { name: 'Geometric Fit in Confined Spaces (MDPI Buildings)', url: 'https://www.mdpi.com/2075-5309/15/2/157' },
78
+ { name: 'Moving Sofa Problem: Wolfram MathWorld', url: 'https://mathworld.wolfram.com/MovingSofaProblem.html' },
79
+ ],
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ { type: 'title', text: '์ด์‚ฌ์˜ ๊ณผํ•™๊ณผ ํ”ผํƒ€๊ณ ๋ผ์Šค ์ •๋ฆฌ', level: 2 },
84
+ { type: 'paragraph', html: '์ด์‚ฌ๋Š” ๋‹จ์ˆœํžˆ ์ฒด๋ ฅ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๊ธฐํ•˜ํ•™์  ํผ์ฆ์ž…๋‹ˆ๋‹ค. ๋ฐฉ์ด๋‚˜ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ์˜ ๊ฒ‰๋ณด๊ธฐ ๊ณต๊ฐ„์€ ํŠนํžˆ 3์ฐจ์›์„ ๋ฌด์‹œํ•  ๋•Œ ์‚ฌ๋žŒ์˜ ๋ˆˆ์„ ์†์ž…๋‹ˆ๋‹ค. ์ˆ˜ํ•™์„ ํ™œ์šฉํ•˜๋ฉด ๋ฐ˜ํ’ˆ์ด๋‚˜ ์šด์†ก ์‹คํŒจ๋กœ ์ธํ•œ ๋ง‰๋Œ€ํ•œ ๋น„์šฉ ์†์‹ค์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.' },
85
+ { type: 'title', text: '3D ๋Œ€๊ฐ์„ ์˜ ์š”๋ น', level: 3 },
86
+ { type: 'card', icon: 'mdi:math-log', title: 'ํ™ฉ๊ธˆ๋ฅ ', html: '<p>๊ฐ€๊ตฌ๋งŒ ์ธก์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ํ•ญ์ƒ <strong>์ฃผ์š” ์ ‘๊ทผ ํฌ์ธํŠธ</strong>๋ฅผ ์ธก์ •ํ•˜์‹ญ์‹œ์˜ค: ๋ฌธํ‹€ ๋„ˆ๋น„(๋ฌธ์ด 180๋„ ์—ด๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฌธ ๋‘๊ป˜๋ฅผ ๋บ„ ๊ฒƒ), ๊ณ„๋‹จ์ฐธ์˜ ๊ฐ€์žฅ ๋‚ฎ์€ ์ฒœ์žฅ ์ง€์ , ๋ฌธ์„ ๋‹ซ์•˜์„ ๋•Œ์˜ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ์‹ค์ œ ๊นŠ์ด์ž…๋‹ˆ๋‹ค. ๊ณต์‹ <code>d = โˆš(wยฒ + hยฒ + zยฒ)</code>๊ฐ€ ๊ธฐ์šธ์˜€์„ ๋•Œ ๋“ค์–ด๊ฐ€๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.</p>' },
87
+ { type: 'title', text: '๋ณต๋„์˜ ์†ŒํŒŒ ๋ฌธ์ œ', level: 3 },
88
+ { type: 'card', icon: 'mdi:sofa', title: '์กฐ์ž‘ ์—ฌ์œ  ๊ณต๊ฐ„', html: '<p>๊ฐ€๊ตฌ๊ฐ€ 80cm์ด๊ณ  ์ž…๊ตฌ๊ฐ€ 80cm๋ผ๋ฉด ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ํ”ํ•œ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ž์˜ ์†, ์›๋‹จ์˜ ํƒ„์„ฑ, ๋ฒฝ์˜ ๋ฏธ์„ธํ•œ ๊ตด๊ณก ๋“ฑ์„ ๊ณ ๋ คํ•˜๋ฉด ์ตœ์†Œ <strong>2~5cm</strong>์˜ ์—ฌ์œ ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฌ์œ ๊ฐ€ ์—†์œผ๋ฉด ๊ฐ€๊ตฌ๊ฐ€ ๊ธํžˆ๊ฑฐ๋‚˜ ๋ผ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>' },
89
+ { type: 'title', text: '์ด์‚ฌ๋ฅผ ๋ง์น˜๋Š” 3๊ฐ€์ง€ ์‹ค์ˆ˜', level: 3 },
90
+ { type: 'paragraph', html: '์น˜์ˆ˜๋ฅผ ์ •ํ™•ํžˆ ์Ÿ€๋”๋ผ๋„ ์ด๋Ÿฌํ•œ ๋ณด์ด์ง€ ์•Š๋Š” ์š”์ธ์ด ์ข…์ข… ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค: <strong>์ฒœ์žฅ ์กฐ๋ช…</strong> โ€” ๋Œ€๊ฐ์„  ํšŒ์ „ ์ค‘์— ์žŠ์–ด๋ฒ„๋ฆฌ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. <strong>๊ฐ€๊ตฌ์˜ ํšŒ์ „ ๋ฐ˜๊ฒฝ</strong> โ€” ๋”ฑ๋”ฑํ•œ ๊ฐ€๊ตฌ๋Š” ๊ตฌ๋ถ€๋Ÿฌ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. <strong>ํฌ์žฅ</strong> โ€” ๋ฝ๋ฝ์ด(์—์–ด์บก)๋‚˜ ๋ณดํ˜ธ์šฉ ๋ฐ•์Šค๋Š” ๊ฐ ๋ฉด์— 1~3cm๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.' },
91
+ ],
92
+ ui: {
93
+ conTitle: '๊ณต๊ฐ„ ์น˜์ˆ˜',
94
+ conHint: '์˜ˆ: ํ‘œ์ค€ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ, ๋ฌธํ‹€ ๋˜๋Š” ํŠธ๋Ÿญ.',
95
+ objTitle: '๊ฐ€๊ตฌ ์น˜์ˆ˜',
96
+ labelWidth: '๋„ˆ๋น„ (cm)',
97
+ labelHeight: '๋†’์ด (cm)',
98
+ labelDepth: '๊นŠ์ด (cm)',
99
+ labelLength: '๊ธธ์ด (cm)',
100
+ labelMargin: 'ํ—ˆ์šฉ ์˜ค์ฐจ (cm)',
101
+ vizLabel: '๋‹จ์ˆœํ™”๋œ ๊ณต๊ฐ„ ๋ทฐ',
102
+ verdictDefault: '๋“ค์–ด๊ฐˆ๊นŒ์š”?',
103
+ verdictHint: '๊ณต๊ฐ„ ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜๋ ค๋ฉด ์น˜์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.',
104
+ verdictYes: '๋„ค, ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค!',
105
+ verdictNo: '์•ˆ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค',
106
+ fitDirect: '๊ฐ€๊ตฌ๊ฐ€ ๊ทธ๋Œ€๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.',
107
+ fitDiagonal3d: '๋Œ€๊ฐ์„ ์œผ๋กœ ๊ธฐ์šธ์ด๋ฉด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค (3D ํ”ผํƒ€๊ณ ๋ผ์Šค).',
108
+ fitDiagonalPlane: '์ธก๋ฉด ํ‰๋ฉด ์ค‘ ํ•˜๋‚˜๋กœ ๊ธฐ์šธ์ด๋ฉด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.',
109
+ fitNope: '๊ฐ€๊ตฌ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋Œ€๊ฐ์„ ์œผ๋กœ๋„ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.',
110
+ diagLabel: '์ตœ๋Œ€ ๋Œ€๊ฐ์„  (3D ํ”ผํƒ€๊ณ ๋ผ์Šค):',
111
+ objLabel: '๊ฐ€๊ตฌ',
112
+ },
113
+ };
@@ -0,0 +1,113 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FurnitureFitUI } from '../ui';
4
+
5
+ const slug = 'meubel-ruimte-calculator';
6
+ const title = 'Ruimte Calculator voor Verhuizingen en Meubels';
7
+ const description = 'Controleer of je bank, kast of tafel in de lift past of door de deur kan. Gebruik de 3D-stelling van Pythagoras om schuine hoeken te berekenen.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Waarom past een bank soms niet, ook al is hij kleiner dan de deur?',
12
+ answer: 'Vanwege de draaihoek. Als de gang smal is, moet de bank zijwaarts of schuin naar binnen. De beperkende factor is niet alleen de deurbreedte, maar de beschikbare draaicirkel in de ruimte.',
13
+ },
14
+ {
15
+ question: 'Wat is de diagonaal van een meubel en waarom is dat belangrijk?',
16
+ answer: 'Het is de langste afstand tussen twee tegenover elkaar liggende hoeken. Het is essentieel om te weten of een hoog meubel rechtop gezet kan worden in een kamer met een laag plafond nadat het op de grond is gemonteerd.',
17
+ },
18
+ {
19
+ question: 'Hoe meet je een lift correct op?',
20
+ answer: 'Meet niet alleen de vloer. Meet de breedte van de open deur, de vrije diepte en de totale hoogte. De diagonaal van de onderkant van de deur tot de bovenste achterhoek is het belangrijkste gegeven.',
21
+ },
22
+ {
23
+ question: 'Welke onderdelen moeten eerst worden gedemonteerd?',
24
+ answer: 'Bankpoten, kasthandgrepen en koelkastdeuren leveren vaak die kritieke 5 tot 10 cm op die het verschil maken tussen een meubel dat past of buiten blijft staan.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ { name: 'Meubel opmeten (Lengte, Breedte, Hoogte)', text: 'Neem de maximale maten van het object, inclusief eventuele uitsteeksels zoals armleuningen of handgrepen.' },
30
+ { name: 'Kritieke doorgangen meten', text: 'Meet de vrije ruimte van de deur (van kozijn tot kozijn), de binnenkant van de lift en de breedte van de gangen.' },
31
+ { name: 'Gegevens invoeren in de simulator', text: 'Voer de afmetingen in de tool in om te zien of het volume van het meubel compatibel is met de doorgangsruimte.' },
32
+ { name: 'Schuine hoeken berekenen', text: 'Als het meubel erg hoog is, gebruik dan de berekende diagonaal om te verifiรซren of je het op de overloop of in de lift kunt draaien.' },
33
+ ];
34
+
35
+ const faqSchema: WithContext<FAQPage> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'FAQPage',
38
+ mainEntity: faqData.map((item) => ({
39
+ '@type': 'Question',
40
+ name: item.question,
41
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
42
+ })),
43
+ };
44
+
45
+ const howToSchema: WithContext<HowToThing> = {
46
+ '@context': 'https://schema.org',
47
+ '@type': 'HowTo',
48
+ name: title,
49
+ description,
50
+ step: howToData.map((step, i) => ({
51
+ '@type': 'HowToStep',
52
+ position: i + 1,
53
+ name: step.name,
54
+ text: step.text,
55
+ })),
56
+ };
57
+
58
+ const appSchema: WithContext<SoftwareApplication> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'SoftwareApplication',
61
+ name: title,
62
+ description,
63
+ applicationCategory: 'UtilityApplication',
64
+ operatingSystem: 'All',
65
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
66
+ inLanguage: 'nl',
67
+ };
68
+
69
+ export const content: ToolLocaleContent<FurnitureFitUI> = {
70
+ slug,
71
+ title,
72
+ description,
73
+ faqTitle: 'Veelgestelde Vragen',
74
+ faq: faqData,
75
+ bibliographyTitle: 'Technische Referenties',
76
+ bibliography: [
77
+ { name: 'Geometric Fit in Confined Spaces (MDPI Buildings)', url: 'https://www.mdpi.com/2075-5309/15/2/157' },
78
+ { name: 'Moving Sofa Problem: Wolfram MathWorld', url: 'https://mathworld.wolfram.com/MovingSofaProblem.html' },
79
+ ],
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ { type: 'title', text: 'De Wetenschap van Verhuizen en de Stelling van Pythagoras', level: 2 },
84
+ { type: 'paragraph', html: 'Verhuizen is niet alleen een test van fysieke kracht; het is een complex geometrisch puzzelstuk. De schijnbare ruimte van een kamer of een lift bedriegt het menselijk oog, vooral wanneer we de derde dimensie negeren. Wiskunde kan je honderden euro\'s besparen aan retourzendingen en mislukte transporten.' },
85
+ { type: 'title', text: 'De Truc van de 3D-Diagonaal', level: 3 },
86
+ { type: 'card', icon: 'mdi:math-log', title: 'Gouden Regel', html: '<p>Meet nooit alleen het meubel. Meet altijd de <strong>kritieke toegangspunten</strong>: de breedte van het deurkozijn, het laagste punt van het plafond op de overloop en de werkelijke diepte van de lift met gesloten deuren. De formule <code>d = โˆš(wยฒ + hยฒ + zยฒ)</code> onthult of het schuin past.</p>' },
87
+ { type: 'title', text: 'Het Bank-in-de-Gang Probleem', level: 3 },
88
+ { type: 'card', icon: 'mdi:sofa', title: 'Manoeuvreerruimte', html: '<p>Een veelvoorkomende fout is aan te nemen dat als het meubel 80cm breed is en de opening ook 80cm, het zal passen. Dat is niet zo. De handen van verhuizers, de elasticiteit van de stof en oneffenheden van de muren vereisen een minimale marge van <strong>2 tot 5 cm</strong>. Zonder deze marge wordt het meubel bekrast of raakt het klem.</p>' },
89
+ { type: 'title', text: '3 Fouten die een Verhuizing Verpesten', level: 3 },
90
+ { type: 'paragraph', html: 'Zelfs met de juiste maten veroorzaken deze onzichtbare factoren vaak rampen: <strong>De Plafondlamp</strong> โ€” vaak vergeten tijdens het schuin draaien. <strong>De Draaicirkel van het Meubel</strong> โ€” een stijf meubel buigt niet. <strong>De Verpakking</strong> โ€” bubbeltjesplastic kan aan elke kant 1 tot 3 cm toevoegen.' },
91
+ ],
92
+ ui: {
93
+ conTitle: 'Afmetingen van de Ruimte',
94
+ conHint: 'Bijv: Standaard lift, deurkozijn of bestelbus.',
95
+ objTitle: 'Afmetingen van het Meubel',
96
+ labelWidth: 'Breedte (cm)',
97
+ labelHeight: 'Hoogte (cm)',
98
+ labelDepth: 'Diepte (cm)',
99
+ labelLength: 'Lengte (cm)',
100
+ labelMargin: 'Foutmarge (cm)',
101
+ vizLabel: 'Vereenvoudigde Ruimtelijke Weergave',
102
+ verdictDefault: 'Past het?',
103
+ verdictHint: 'Voer de maten in om de ruimtelijke compatibiliteit te controleren.',
104
+ verdictYes: 'JA, HET PAST!',
105
+ verdictNo: 'PAST NIET',
106
+ fitDirect: 'Het meubel past perfect op directe wijze.',
107
+ fitDiagonal3d: 'Past schuin diagonaal (3D Pythagoras).',
108
+ fitDiagonalPlane: 'Past schuin in een van de zijvlakken.',
109
+ fitNope: 'Het meubel is te groot, zelfs om er diagonaal in te passen.',
110
+ diagLabel: 'Maximale Diagonaal (3D Pythagoras):',
111
+ objLabel: 'Meubel',
112
+ },
113
+ };