@jjlmoya/utils-home 1.30.0 → 1.32.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 (56) hide show
  1. package/package.json +2 -1
  2. package/src/entries.ts +7 -1
  3. package/src/index.ts +1 -0
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/tool_validation.test.ts +2 -2
  6. package/src/tool/lightingCalculator/bibliography.astro +36 -0
  7. package/src/tool/lightingCalculator/bibliography.ts +10 -0
  8. package/src/tool/lightingCalculator/component.astro +308 -0
  9. package/src/tool/lightingCalculator/draw.ts +247 -0
  10. package/src/tool/lightingCalculator/entry.ts +29 -0
  11. package/src/tool/lightingCalculator/how-many-lights-per-room.css +493 -0
  12. package/src/tool/lightingCalculator/i18n/de.ts +213 -0
  13. package/src/tool/lightingCalculator/i18n/en.ts +213 -0
  14. package/src/tool/lightingCalculator/i18n/es.ts +213 -0
  15. package/src/tool/lightingCalculator/i18n/fr.ts +213 -0
  16. package/src/tool/lightingCalculator/i18n/id.ts +213 -0
  17. package/src/tool/lightingCalculator/i18n/it.ts +213 -0
  18. package/src/tool/lightingCalculator/i18n/ja.ts +213 -0
  19. package/src/tool/lightingCalculator/i18n/ko.ts +213 -0
  20. package/src/tool/lightingCalculator/i18n/nl.ts +213 -0
  21. package/src/tool/lightingCalculator/i18n/pl.ts +213 -0
  22. package/src/tool/lightingCalculator/i18n/pt.ts +213 -0
  23. package/src/tool/lightingCalculator/i18n/ru.ts +213 -0
  24. package/src/tool/lightingCalculator/i18n/sv.ts +213 -0
  25. package/src/tool/lightingCalculator/i18n/tr.ts +213 -0
  26. package/src/tool/lightingCalculator/i18n/zh.ts +213 -0
  27. package/src/tool/lightingCalculator/index.ts +9 -0
  28. package/src/tool/lightingCalculator/logic.ts +119 -0
  29. package/src/tool/lightingCalculator/seo.astro +15 -0
  30. package/src/tool/lightingCalculator/state.ts +113 -0
  31. package/src/tool/lightingCalculator/ui.ts +48 -0
  32. package/src/tool/tileLayoutCalculator/bibliography.astro +14 -0
  33. package/src/tool/tileLayoutCalculator/bibliography.ts +10 -0
  34. package/src/tool/tileLayoutCalculator/component.astro +415 -0
  35. package/src/tool/tileLayoutCalculator/entry.ts +29 -0
  36. package/src/tool/tileLayoutCalculator/i18n/de.ts +208 -0
  37. package/src/tool/tileLayoutCalculator/i18n/en.ts +208 -0
  38. package/src/tool/tileLayoutCalculator/i18n/es.ts +208 -0
  39. package/src/tool/tileLayoutCalculator/i18n/fr.ts +208 -0
  40. package/src/tool/tileLayoutCalculator/i18n/id.ts +208 -0
  41. package/src/tool/tileLayoutCalculator/i18n/it.ts +208 -0
  42. package/src/tool/tileLayoutCalculator/i18n/ja.ts +208 -0
  43. package/src/tool/tileLayoutCalculator/i18n/ko.ts +208 -0
  44. package/src/tool/tileLayoutCalculator/i18n/nl.ts +208 -0
  45. package/src/tool/tileLayoutCalculator/i18n/pl.ts +208 -0
  46. package/src/tool/tileLayoutCalculator/i18n/pt.ts +208 -0
  47. package/src/tool/tileLayoutCalculator/i18n/ru.ts +208 -0
  48. package/src/tool/tileLayoutCalculator/i18n/sv.ts +208 -0
  49. package/src/tool/tileLayoutCalculator/i18n/tr.ts +208 -0
  50. package/src/tool/tileLayoutCalculator/i18n/zh.ts +208 -0
  51. package/src/tool/tileLayoutCalculator/index.ts +9 -0
  52. package/src/tool/tileLayoutCalculator/logic.ts +55 -0
  53. package/src/tool/tileLayoutCalculator/seo.astro +15 -0
  54. package/src/tool/tileLayoutCalculator/tile-layout-calculator.css +404 -0
  55. package/src/tool/tileLayoutCalculator/ui.ts +37 -0
  56. package/src/tools.ts +4 -0
@@ -0,0 +1,208 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { TileLayoutCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'calculateur-disposition-carrelage';
7
+ const title = 'Calculateur de Disposition et de Pertes de Carrelage';
8
+ const description =
9
+ 'Planifiez le sol de votre pièce avec précision. Calculez la quantité exacte de carreaux, le nombre de boîtes nécessaire, le coût total et visualisez la disposition en temps réel avec un aperçu de grille interactif.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Comment calculer le nombre de carreaux nécessaires pour une pièce ?',
14
+ answer:
15
+ 'Mesurez la largeur et la longueur de la pièce, choisissez la dimension du carreau et indiquez la largeur du joint. Le calculateur divise les dimensions de la pièce par la taille du carreau plus le joint pour donner le nombre exact de pièces par rangée et colonne.',
16
+ },
17
+ {
18
+ question: 'Quel pourcentage de pertes dois-je prévoir lors de l\'achat de carrelage ?',
19
+ answer:
20
+ 'Pour les pièces rectangulaires standard, ajoutez 10% de pertes. Pour les pièces avec de nombreux coins, des dispositions en diagonale ou des découpes complexes, augmentez à 15%. Cela couvre les cassures et les erreurs de coupe.',
21
+ },
22
+ {
23
+ question: 'L\'épaisseur du joint change-t-elle vraiment le nombre de carreaux ?',
24
+ answer:
25
+ 'Oui. Des joints plus larges réduisent la couverture effective de chaque carreau, augmentant légèrement le nombre total nécessaire. Le calculateur prend cela en compte automatiquement dans chaque rangée et colonne.',
26
+ },
27
+ {
28
+ question: 'Dois-je acheter des boîtes supplémentaires au-delà du pourcentage de pertes ?',
29
+ answer:
30
+ 'Il est prudent d\'acheter une boîte supplémentaire si disponible. Les teintes de lot peuvent varier d\'une production à l\'autre, et disposer de pièces de rechange correspondantes facilite les réparations futures.',
31
+ },
32
+ {
33
+ question: 'Comment carreler une pièce de forme irrégulière ?',
34
+ answer:
35
+ 'Divisez la pièce en rectangles plus petits. Calculez chaque section séparément et additionnez les totaux. Arrondissez toujours les boîtes partielles au supérieur pour garantir une couverture complète.',
36
+ },
37
+ {
38
+ question: 'Quelle est la différence de pertes entre le grès cérame et la céramique ?',
39
+ answer:
40
+ 'Le grès cérame est plus dense et difficile à couper, ce qui peut augmenter les pertes de coupe de 2% à 3% par rapport à la céramique standard. Les deux matériaux doivent suivre le même processus de mesure.',
41
+ },
42
+ {
43
+ question: 'Puis-je retourner les boîtes de carrelage non utilisées ?',
44
+ answer:
45
+ 'La plupart des détaillants acceptent les boîtes non ouvertes dans un délai de 30 jours. Conservez toujours le reçu et n\'ouvrez pas les boîtes excédentaires tant que l\'installation n\'est pas entièrement terminée.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Mesurer la pièce',
52
+ text: 'Relevez la largeur et la longueur du sol dans le système d\'unités de votre choix.',
53
+ },
54
+ {
55
+ name: 'Choisir le carreau et le joint',
56
+ text: 'Choisissez les dimensions de vos carreaux et la largeur de joint souhaitée.',
57
+ },
58
+ {
59
+ name: 'Calculer et visualiser',
60
+ text: 'Saisissez les valeurs dans le calculateur, ajustez la marge de pertes et examinez l\'aperçu de la disposition en direct.',
61
+ },
62
+ ];
63
+
64
+ const faqSchema: WithContext<FAQPage> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'FAQPage',
67
+ mainEntity: faqData.map((item) => ({
68
+ '@type': 'Question',
69
+ name: item.question,
70
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
71
+ })),
72
+ };
73
+
74
+ const howToSchema: WithContext<HowTo> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'HowTo',
77
+ name: title,
78
+ description,
79
+ step: howToData.map((step) => ({
80
+ '@type': 'HowToStep',
81
+ name: step.name,
82
+ text: step.text,
83
+ })),
84
+ };
85
+
86
+ const appSchema: WithContext<SoftwareApplication> = {
87
+ '@context': 'https://schema.org',
88
+ '@type': 'SoftwareApplication',
89
+ name: title,
90
+ description,
91
+ applicationCategory: 'UtilityApplication',
92
+ operatingSystem: 'All',
93
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
94
+ inLanguage: 'fr',
95
+ };
96
+
97
+ export const content: ToolLocaleContent<TileLayoutCalculatorUI> = {
98
+ slug,
99
+ title,
100
+ description,
101
+ faq: faqData,
102
+ bibliography,
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ {
107
+ type: 'title',
108
+ text: 'Guide Complet pour Planifier un Sol Carrelé et Maîtriser les Pertes',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Un projet de carrelage réussi commence bien avant la première couche d\'adhésif. Le mesurage précis, la planification intelligente de la disposition et l\'estimation exacte des pertes déterminent si votre rénovation reste dans le budget et dans les délais. <strong>Notre calculateur de disposition de carrelage interactif</strong> transforme les dimensions brutes en un plan de sol visuel, montrant exactement combien de carreaux s\'insèrent par rangée, combien de boîtes acheter et où va votre argent.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Pertes Standard', icon: 'mdi:alert-circle' },
119
+ { value: '30+ ans', label: 'Durée de Vie du Carrelage', icon: 'mdi:clock-outline' },
120
+ { value: '48h', label: 'Pose Moyenne', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Grands Formats',
129
+ description: 'Les carreaux de plus de 60 cm créent un rendu moderne et continu, mais nécessitent un support parfaitement plat et génèrent plus de pertes de coupe dans les petites pièces.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Moins de joints visibles', 'Effet visuel premium', 'Pertes élevées dans les espaces restreints'],
132
+ },
133
+ {
134
+ title: 'Petits Mosaïques',
135
+ description: 'Idéaux pour les salles de bain et les motifs complexes. Ils s\'adaptent aux formes irrégulières, mais demandent plus de joint et de temps de pose.',
136
+ icon: 'mdi:apps',
137
+ points: ['Flexibles autour des obstacles', 'Plus de joint requis', 'Temps de pose plus long'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Pourquoi la Visualisation de la Disposition est Essentielle',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Voir votre grille de carrelage avant l\'achat évite les surprises coûteuses. Un aperçu en direct révèle si la taille choisie laisse des bandes étroites maladroites sur les bords ou crée un sol équilibré et symétrique. En ajustant la largeur de joint et l\'orientation du carreau dans le calculateur, vous pouvez optimiser la disposition pour l\'esthétique et l\'efficacité avant de passer commande.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Tableau de Référence Rapide de Couverture',
155
+ icon: 'mdi:table',
156
+ badge: 'Référence',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 cm</strong> → 11 carreaux par m²</li><li><strong>45 x 45 cm</strong> → 5 carreaux par m²</li><li><strong>60 x 60 cm</strong> → 3 carreaux par m²</li><li><strong>60 x 120 cm</strong> → 1,5 carreaux par m²</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Conseils Pros pour Minimiser les Pertes',
162
+ items: [
163
+ 'Commandez 10% de plus pour les poses droites et 15% pour les diagonales ou en chevrons.',
164
+ 'Conservez toutes les boîtes du même lot de production pour garantir la cohérence des teintes.',
165
+ 'Mesurez en diagonale dans la pièce pour vérifier l\'équerrage avant de planifier les rangées.',
166
+ 'Utilisez les grands formats uniquement dans les pièces plus larges que la longueur du carreau pour éviter les coupes excessives.',
167
+ 'Arrondissez toujours les quantités de boîtes au supérieur ; c\'est moins cher qu\'une deuxième livraison.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Configuration de la Pièce',
173
+ labelRoomWidth: 'Largeur de la pièce',
174
+ labelRoomLength: 'Longueur de la pièce',
175
+ labelTileWidth: 'Largeur du carreau',
176
+ labelTileLength: 'Longueur du carreau',
177
+ labelGrout: 'Joint',
178
+ labelWaste: 'Marge de pertes',
179
+ labelTilesPerBox: 'Carreaux par boîte',
180
+ labelPrice: 'Prix par boîte',
181
+ labelPattern: 'Motif de pose',
182
+ unitMetricRoom: 'm',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'cm',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'mm',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'pcs',
190
+ unitPrice: '/boîte',
191
+ resultBadge: 'Aperçu en direct',
192
+ labelArea: 'Surface du sol',
193
+ labelTiles: 'Carreaux total',
194
+ labelBoxes: 'Boîtes nécessaires',
195
+ labelCost: 'Coût total',
196
+ labelWasteCount: 'Pertes de carreaux',
197
+ labelCuts: 'Coupe partielle',
198
+ currency: 'EUR',
199
+ btnMetric: 'Métrique',
200
+ btnImperial: 'Impérial',
201
+ btnPatternStraight: 'Droit',
202
+ btnPatternBrick: 'Décalé',
203
+ btnPatternDiagonal: 'Diagonal',
204
+ badgeOptimal: 'Disposition optimale',
205
+ badgeWarning: 'Alerte pertes élevées',
206
+ visualTitle: 'Aperçu de la disposition',
207
+ },
208
+ };
@@ -0,0 +1,208 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { TileLayoutCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'kalkulator-tata-letak-ubin';
7
+ const title = 'Kalkulator Tata Letak dan Sisa Ubin';
8
+ const description =
9
+ 'Rencanakan lantai ruangan Anda dengan presisi milimeter. Hitung jumlah ubin yang tepat, kotak yang diperlukan, total biaya, dan visualisasikan tata letak secara real-time dengan pratinjau kisi interaktif.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Bagaimana cara menghitung jumlah ubin yang dibutuhkan untuk sebuah ruangan?',
14
+ answer:
15
+ 'Ukur lebar dan panjang ruangan, pilih ukuran ubin, dan masukkan lebar nat. Kalkulator akan membagi dimensi ruangan dengan ukuran ubin ditambah nat untuk memberikan jumlah ubin yang tepat per baris dan kolom.',
16
+ },
17
+ {
18
+ question: 'Berapa persentase sisa yang harus saya tambahkan saat membeli ubin?',
19
+ answer:
20
+ 'Untuk ruangan persegi panjang standar, tambahkan 10% sisa. Untuk ruangan dengan banyak sudut, pola diagonal, atau potongan yang rumit, naikkan menjadi 15%. Ini mencakup kerusakan dan kesalahan pemotongan.',
21
+ },
22
+ {
23
+ question: 'Apakah ketebalan nat benar-benar mengubah jumlah ubin?',
24
+ answer:
25
+ 'Ya. Nat yang lebih lebar mengurangi cakupan efektif setiap ubin, sehingga sedikit meningkatkan jumlah total yang dibutuhkan. Kalkulator memperhitungkan ini secara otomatis di setiap baris dan kolom.',
26
+ },
27
+ {
28
+ question: 'Apakah saya harus membeli kotak tambahan di luar persentase sisa?',
29
+ answer:
30
+ 'Adalah bijaksana untuk membeli satu kotak ekstra jika tersedia. Batch warna dapat bervariasi antar produksi, dan memiliki cadangan yang cocok memudahkan perbaikan di masa depan.',
31
+ },
32
+ {
33
+ question: 'Bagaimana cara memasang ubin di ruangan dengan bentuk tidak beraturan?',
34
+ answer:
35
+ 'Bagi ruangan menjadi persegi panjang yang lebih kecil. Hitung setiap bagian secara terpisah dan jumlahkan totalnya. Selalu bulatkan kotak parsial ke atas untuk memastikan cakupan penuh.',
36
+ },
37
+ {
38
+ question: 'Apa perbedaan sisa antara keramik dan ubin porselen?',
39
+ answer:
40
+ 'Porselen lebih padat dan sulit dipotong, yang dapat meningkatkan sisa pemotongan 2% hingga 3% dibandingkan keramik standar. Kedua material harus mengikuti proses pengukuran yang sama.',
41
+ },
42
+ {
43
+ question: 'Bisakah saya mengembalikan kotak ubin yang tidak terpakai?',
44
+ answer:
45
+ 'Kebanyakan pengecer menerima kotak yang belum dibuka dalam 30 hari. Selalu simpan struk dan jangan membuka kotak cadangan hingga pemasangan sepenuhnya selesai.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Ukur ruangan',
52
+ text: 'Catat lebar dan panjang area lantai dalam sistem unit yang Anda pilih.',
53
+ },
54
+ {
55
+ name: 'Pilih ubin dan nat',
56
+ text: 'Pilih dimensi ubin dan lebar nat yang diinginkan.',
57
+ },
58
+ {
59
+ name: 'Hitung dan visualisasikan',
60
+ text: 'Masukkan nilai ke kalkulator, sesuaikan margin sisa, dan tinjau pratinjau tata letak live.',
61
+ },
62
+ ];
63
+
64
+ const faqSchema: WithContext<FAQPage> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'FAQPage',
67
+ mainEntity: faqData.map((item) => ({
68
+ '@type': 'Question',
69
+ name: item.question,
70
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
71
+ })),
72
+ };
73
+
74
+ const howToSchema: WithContext<HowTo> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'HowTo',
77
+ name: title,
78
+ description,
79
+ step: howToData.map((step) => ({
80
+ '@type': 'HowToStep',
81
+ name: step.name,
82
+ text: step.text,
83
+ })),
84
+ };
85
+
86
+ const appSchema: WithContext<SoftwareApplication> = {
87
+ '@context': 'https://schema.org',
88
+ '@type': 'SoftwareApplication',
89
+ name: title,
90
+ description,
91
+ applicationCategory: 'UtilityApplication',
92
+ operatingSystem: 'All',
93
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'IDR' },
94
+ inLanguage: 'id',
95
+ };
96
+
97
+ export const content: ToolLocaleContent<TileLayoutCalculatorUI> = {
98
+ slug,
99
+ title,
100
+ description,
101
+ faq: faqData,
102
+ bibliography,
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ {
107
+ type: 'title',
108
+ text: 'Panduan Lengkap untuk Perencanaan Lantai Ubin dan Pengendalian Sisa',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Proyek pemasangan ubin yang sukses dimulai jauh sebelum lem pertama dioleskan. Pengukuran yang akurat, perencanaan tata letak yang cerdas, dan estimasi sisa yang tepat menentukan apakah renovasi Anda tetap sesuai anggaran dan jadwal. <strong>Kalkulator tata letak ubin interaktif kami</strong> mengubah dimensi mentah menjadi rencana lantai visual yang menunjukkan dengan tepat berapa banyak ubin yang muat per baris, berapa kotak yang harus dibeli, dan ke mana uang Anda pergi.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Sisa Standar', icon: 'mdi:alert-circle' },
119
+ { value: '30+ tahun', label: 'Umur Ubin', icon: 'mdi:clock-outline' },
120
+ { value: '48 jam', label: 'Pemasangan Rata-rata', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Ubin Format Besar',
129
+ description: 'Ubin lebih dari 60 cm menciptakan tampilan modern yang mulus, tetapi memerlukan alas yang benar-benar rata dan menghasilkan sisa potong lebih tinggi di ruangan kecil.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Lebih sedikit nat', 'Efek visual premium', 'Sisa lebih tinggi di ruang sempit'],
132
+ },
133
+ {
134
+ title: 'Mosaik Kecil',
135
+ description: 'Ideal untuk kamar mandi dan pola yang rumit. Menyesuaikan dengan bentuk tidak beraturan, tetapi memerlukan lebih banyak nat dan waktu pengerjaan.',
136
+ icon: 'mdi:apps',
137
+ points: ['Fleksibel di sekitar rintangan', 'Lebih banyak nat diperlukan', 'Waktu pemasangan lebih lama'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Mengapa Visualisasi Tata Letak Penting',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Melihat kisi ubin sebelum pembelian mencegah kejutan yang mahal. Pratinjau live mengungkapkan apakah ukuran ubin yang Anda pilih meninggalkan strip sempit yang canggung di tepi atau menciptakan lantai yang seimbang dan simetris. Dengan menyesuaikan lebar nat dan orientasi ubin dalam kalkulator, Anda dapat mengoptimalkan tata letak untuk estetika dan efisiensi sebelum memesan.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Tabel Referensi Cakupan Cepat',
155
+ icon: 'mdi:table',
156
+ badge: 'Referensi',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 cm</strong> → 11 ubin per m²</li><li><strong>45 x 45 cm</strong> → 5 ubin per m²</li><li><strong>60 x 60 cm</strong> → 3 ubin per m²</li><li><strong>60 x 120 cm</strong> → 1,5 ubin per m²</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Tips Profesional untuk Meminimalkan Sisa',
162
+ items: [
163
+ 'Pesan 10% ekstra untuk pemasangan lurus dan 15% untuk diagonal atau herringbone.',
164
+ 'Simpan semua kotak dari batch produksi yang sama untuk memastikan konsistensi warna.',
165
+ 'Ukur secara diagonal di ruangan untuk memeriksa kesikuhan sebelum merencanakan baris.',
166
+ 'Gunakan format besar hanya di ruangan yang lebih lebar dari panjang ubin untuk menghindari potongan berlebihan.',
167
+ 'Selalu bulatkan jumlah kotak ke atas; lebih murah daripada pengiriman kedua.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Konfigurasi Ruangan',
173
+ labelRoomWidth: 'Lebar ruangan',
174
+ labelRoomLength: 'Panjang ruangan',
175
+ labelTileWidth: 'Lebar ubin',
176
+ labelTileLength: 'Panjang ubin',
177
+ labelGrout: 'Lebar nat',
178
+ labelWaste: 'Margin sisa',
179
+ labelTilesPerBox: 'Ubin per kotak',
180
+ labelPrice: 'Harga per kotak',
181
+ labelPattern: 'Pola pemasangan',
182
+ unitMetricRoom: 'm',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'cm',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'mm',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'pcs',
190
+ unitPrice: '/kotak',
191
+ resultBadge: 'Pratinjau live',
192
+ labelArea: 'Luas lantai',
193
+ labelTiles: 'Total ubin',
194
+ labelBoxes: 'Kotak yang diperlukan',
195
+ labelCost: 'Total biaya',
196
+ labelWasteCount: 'Ubin sisa',
197
+ labelCuts: 'Potongan parsial',
198
+ currency: 'IDR',
199
+ btnMetric: 'Metrik',
200
+ btnImperial: 'Imperial',
201
+ btnPatternStraight: 'Lurus',
202
+ btnPatternBrick: 'Bata',
203
+ btnPatternDiagonal: 'Diagonal',
204
+ badgeOptimal: 'Tata letak optimal',
205
+ badgeWarning: 'Peringatan sisa tinggi',
206
+ visualTitle: 'Pratinjau tata letak',
207
+ },
208
+ };
@@ -0,0 +1,208 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { TileLayoutCalculatorUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'calcolatore-disposizione-piastrelle';
7
+ const title = 'Calcolatore di Disposizione e Scarti di Piastrelle';
8
+ const description =
9
+ 'Pavimenta la tua stanza con precisione. Calcola la quantità esatta di piastrelle, le scatole necessarie, il costo totale e visualizza la disposizione in tempo reale con un\'anteprima interattiva della griglia.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Come calcolo quante piastrelle mi servono per una stanza?',
14
+ answer:
15
+ 'Misura la larghezza e la lunghezza della stanza, scegli la dimensione della piastrella e indica la larghezza della fuga. Il calcolatore divide le dimensioni della stanza per la piastrella più la fuga per ottenere il numero esatto di pezzi per fila e colonna.',
16
+ },
17
+ {
18
+ question: 'Quale percentuale di scarto devo aggiungere quando acquisto piastrelle?',
19
+ answer:
20
+ 'Per ambienti rettangolari standard, aggiungi uno scarto del 10%. Per stanze con molti angoli, disposizioni diagonali o tagli complessi, aumenta al 15%. Questo copre rotture e errori di taglio.',
21
+ },
22
+ {
23
+ question: 'Lo spessore della fuga influenza davvero il numero di piastrelle?',
24
+ answer:
25
+ 'Sì. Fughe più larghe riducono la copertura effettiva di ogni piastrella, aumentando leggermente il numero totale necessario. Il calcolatore tiene conto automaticamente di questo in ogni fila e colonna.',
26
+ },
27
+ {
28
+ question: 'Dovrei acquistare scatole extra oltre alla percentuale di scarto?',
29
+ answer:
30
+ 'È saggio acquistare una scatola aggiuntiva se disponibile. I lotti di tinta possono variare tra le produzioni, e avere pezzi di ricambio abbinati semplifica le riparazioni future.',
31
+ },
32
+ {
33
+ question: 'Come poso piastrelle in una stanza di forma irregolare?',
34
+ answer:
35
+ 'Suddividi lo spazio in rettangoli più piccoli. Calcola ogni sezione separatamente e somma i totali. Arrotonda sempre per eccesso le scatole parziali per garantire una copertura completa.',
36
+ },
37
+ {
38
+ question: 'Qual è la differenza di scarto tra ceramica e gres porcellanato?',
39
+ answer:
40
+ 'Il gres porcellanato è più denso e difficile da tagliare, il che può aumentare lo scarto di taglio dal 2% al 3% rispetto alla ceramica standard. Entrambi i materiali devono seguire lo stesso processo di misurazione.',
41
+ },
42
+ {
43
+ question: 'Posso restituire le scatole di piastrelle non utilizzate?',
44
+ answer:
45
+ 'La maggior parte dei rivenditori accetta scatole sigillate entro 30 giorni. Conserva sempre lo scontrino e non aprire le scatole in eccedenza fino al completamento dell\'installazione.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Misura la stanza',
52
+ text: 'Annota larghezza e lunghezza della superficie da pavimentare con il sistema di unità che preferisci.',
53
+ },
54
+ {
55
+ name: 'Seleziona piastrella e fuga',
56
+ text: 'Scegli le dimensioni della piastrella e la larghezza della fuga desiderata.',
57
+ },
58
+ {
59
+ name: 'Calcola e visualizza',
60
+ text: 'Inserisci i valori nel calcolatore, regola il margine di scarto e controlla l\'anteprima live della disposizione.',
61
+ },
62
+ ];
63
+
64
+ const faqSchema: WithContext<FAQPage> = {
65
+ '@context': 'https://schema.org',
66
+ '@type': 'FAQPage',
67
+ mainEntity: faqData.map((item) => ({
68
+ '@type': 'Question',
69
+ name: item.question,
70
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
71
+ })),
72
+ };
73
+
74
+ const howToSchema: WithContext<HowTo> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'HowTo',
77
+ name: title,
78
+ description,
79
+ step: howToData.map((step) => ({
80
+ '@type': 'HowToStep',
81
+ name: step.name,
82
+ text: step.text,
83
+ })),
84
+ };
85
+
86
+ const appSchema: WithContext<SoftwareApplication> = {
87
+ '@context': 'https://schema.org',
88
+ '@type': 'SoftwareApplication',
89
+ name: title,
90
+ description,
91
+ applicationCategory: 'UtilityApplication',
92
+ operatingSystem: 'All',
93
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
94
+ inLanguage: 'it',
95
+ };
96
+
97
+ export const content: ToolLocaleContent<TileLayoutCalculatorUI> = {
98
+ slug,
99
+ title,
100
+ description,
101
+ faq: faqData,
102
+ bibliography,
103
+ howTo: howToData,
104
+ schemas: [faqSchema, howToSchema, appSchema],
105
+ seo: [
106
+ {
107
+ type: 'title',
108
+ text: 'Guida Completa alla Pianificazione del Pavimento in Piastrelle e al Controllo degli Scarti',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Un progetto di posa in opera riuscito inizia molto prima di stendere il primo strato di adesivo. La misurazione accurata, la pianificazione intelligente della disposizione e la stima precisa degli scarti determinano se la ristrutturazione rimane in budget e nei tempi. <strong>Il nostro calcolatore interattivo di disposizione piastrelle</strong> trasforma le dimensioni grezze in una pianta visiva, mostrando esattamente quante piastrelle entrano per fila, quante scatole acquistare e dove va il tuo denaro.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Scarto Standard', icon: 'mdi:alert-circle' },
119
+ { value: '30+ anni', label: 'Durata della Piastrella', icon: 'mdi:clock-outline' },
120
+ { value: '48h', label: 'Posa Media', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Piastrelle Grandi Formati',
129
+ description: 'Le piastrelle oltre i 60 cm creano un aspetto moderno e continuo, ma richiedono supporti perfettamente piani e generano maggiori scarti di taglio in ambienti piccoli.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Meno fughe visibili', 'Effetto visivo premium', 'Maggior scarto in spazi stretti'],
132
+ },
133
+ {
134
+ title: 'Mosaici di Piccole Dimensioni',
135
+ description: 'Ideali per bagni e motivi intricati. Si adattano a forme irregolari, ma richiedono più fuga e tempo di manodopera.',
136
+ icon: 'mdi:apps',
137
+ points: ['Flessibili intorno agli ostacoli', 'Più fuga richiesta', 'Maggiore tempo di posa'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Perché la Visualizzazione della Disposizione è Importante',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Vedere la griglia delle piastrelle prima dell\'acquisto previene sorprese costose. L\'anteprima live rivela se la dimensione scelta lascia strisce strette ai margini o crea un pavimento equilibrato e simmetrico. Modificando larghezza fuga e orientamento della piastrella nel calcolatore, puoi ottimizzare la disposizione per estetica ed efficienza prima di ordinare.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Tabella di Riferimento Rapida per la Copertura',
155
+ icon: 'mdi:table',
156
+ badge: 'Riferimento',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 cm</strong> → 11 piastrelle per m²</li><li><strong>45 x 45 cm</strong> → 5 piastrelle per m²</li><li><strong>60 x 60 cm</strong> → 3 piastrelle per m²</li><li><strong>60 x 120 cm</strong> → 1,5 piastrelle per m²</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Suggerimenti Pro per Ridurre gli Scarti',
162
+ items: [
163
+ 'Ordina il 10% in più per pose dritte e il 15% per diagonali o a spina.',
164
+ 'Conserva tutte le scatole dello stesso lotto di produzione per garantire la coerenza cromatica.',
165
+ 'Misura in diagonale la stanza per verificare la squadra prima di pianificare le file.',
166
+ 'Usa grandi formati solo in ambienti più larghi della lunghezza della piastrella per evitare tagli eccessivi.',
167
+ 'Arrotonda sempre le scatole per eccesso: costa meno di una seconda consegna.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Configurazione Stanza',
173
+ labelRoomWidth: 'Larghezza stanza',
174
+ labelRoomLength: 'Lunghezza stanza',
175
+ labelTileWidth: 'Larghezza piastrella',
176
+ labelTileLength: 'Lunghezza piastrella',
177
+ labelGrout: 'Fuga',
178
+ labelWaste: 'Margine di scarto',
179
+ labelTilesPerBox: 'Piastrelle per scatola',
180
+ labelPrice: 'Prezzo per scatola',
181
+ labelPattern: 'Schema di posa',
182
+ unitMetricRoom: 'm',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'cm',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'mm',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'pz',
190
+ unitPrice: '/scatola',
191
+ resultBadge: 'Anteprima live',
192
+ labelArea: 'Superficie pavimento',
193
+ labelTiles: 'Piastrelle totali',
194
+ labelBoxes: 'Scatole necessarie',
195
+ labelCost: 'Costo totale',
196
+ labelWasteCount: 'Piastrelle di scarto',
197
+ labelCuts: 'Tagli parziali',
198
+ currency: 'EUR',
199
+ btnMetric: 'Metrico',
200
+ btnImperial: 'Imperiale',
201
+ btnPatternStraight: 'Dritto',
202
+ btnPatternBrick: 'Sfalsato',
203
+ btnPatternDiagonal: 'Diagonale',
204
+ badgeOptimal: 'Disposizione ottimale',
205
+ badgeWarning: 'Attenzione: scarti elevati',
206
+ visualTitle: 'Anteprima della disposizione',
207
+ },
208
+ };