@jjlmoya/utils-home 1.29.0 → 1.31.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 (54) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +7 -1
  3. package/src/index.ts +2 -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/applianceCostCalculator/appliance-cost-calculator.css +635 -0
  7. package/src/tool/applianceCostCalculator/bibliography.astro +14 -0
  8. package/src/tool/applianceCostCalculator/bibliography.ts +14 -0
  9. package/src/tool/applianceCostCalculator/component.astro +322 -0
  10. package/src/tool/applianceCostCalculator/entry.ts +29 -0
  11. package/src/tool/applianceCostCalculator/i18n/de.ts +229 -0
  12. package/src/tool/applianceCostCalculator/i18n/en.ts +229 -0
  13. package/src/tool/applianceCostCalculator/i18n/es.ts +229 -0
  14. package/src/tool/applianceCostCalculator/i18n/fr.ts +229 -0
  15. package/src/tool/applianceCostCalculator/i18n/id.ts +229 -0
  16. package/src/tool/applianceCostCalculator/i18n/it.ts +229 -0
  17. package/src/tool/applianceCostCalculator/i18n/ja.ts +229 -0
  18. package/src/tool/applianceCostCalculator/i18n/ko.ts +229 -0
  19. package/src/tool/applianceCostCalculator/i18n/nl.ts +229 -0
  20. package/src/tool/applianceCostCalculator/i18n/pl.ts +229 -0
  21. package/src/tool/applianceCostCalculator/i18n/pt.ts +229 -0
  22. package/src/tool/applianceCostCalculator/i18n/ru.ts +229 -0
  23. package/src/tool/applianceCostCalculator/i18n/sv.ts +229 -0
  24. package/src/tool/applianceCostCalculator/i18n/tr.ts +229 -0
  25. package/src/tool/applianceCostCalculator/i18n/zh.ts +229 -0
  26. package/src/tool/applianceCostCalculator/index.ts +9 -0
  27. package/src/tool/applianceCostCalculator/logic.ts +122 -0
  28. package/src/tool/applianceCostCalculator/seo.astro +15 -0
  29. package/src/tool/applianceCostCalculator/ui.ts +41 -0
  30. package/src/tool/tileLayoutCalculator/bibliography.astro +14 -0
  31. package/src/tool/tileLayoutCalculator/bibliography.ts +10 -0
  32. package/src/tool/tileLayoutCalculator/component.astro +415 -0
  33. package/src/tool/tileLayoutCalculator/entry.ts +29 -0
  34. package/src/tool/tileLayoutCalculator/i18n/de.ts +208 -0
  35. package/src/tool/tileLayoutCalculator/i18n/en.ts +208 -0
  36. package/src/tool/tileLayoutCalculator/i18n/es.ts +208 -0
  37. package/src/tool/tileLayoutCalculator/i18n/fr.ts +208 -0
  38. package/src/tool/tileLayoutCalculator/i18n/id.ts +208 -0
  39. package/src/tool/tileLayoutCalculator/i18n/it.ts +208 -0
  40. package/src/tool/tileLayoutCalculator/i18n/ja.ts +208 -0
  41. package/src/tool/tileLayoutCalculator/i18n/ko.ts +208 -0
  42. package/src/tool/tileLayoutCalculator/i18n/nl.ts +208 -0
  43. package/src/tool/tileLayoutCalculator/i18n/pl.ts +208 -0
  44. package/src/tool/tileLayoutCalculator/i18n/pt.ts +208 -0
  45. package/src/tool/tileLayoutCalculator/i18n/ru.ts +208 -0
  46. package/src/tool/tileLayoutCalculator/i18n/sv.ts +208 -0
  47. package/src/tool/tileLayoutCalculator/i18n/tr.ts +208 -0
  48. package/src/tool/tileLayoutCalculator/i18n/zh.ts +208 -0
  49. package/src/tool/tileLayoutCalculator/index.ts +9 -0
  50. package/src/tool/tileLayoutCalculator/logic.ts +55 -0
  51. package/src/tool/tileLayoutCalculator/seo.astro +15 -0
  52. package/src/tool/tileLayoutCalculator/tile-layout-calculator.css +404 -0
  53. package/src/tool/tileLayoutCalculator/ui.ts +37 -0
  54. 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 = 'calculadora-disposicao-azulejos';
7
+ const title = 'Calculadora de Disposição e Desperdício de Azulejos';
8
+ const description =
9
+ 'Planeie o pavimento do seu quarto com precisão. Calcule a quantidade exata de azulejos, caixas necessárias, custo total e visualize a disposição em tempo real com uma pré-visualização interativa da grelha.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Como calculo quantos azulejos preciso para um quarto?',
14
+ answer:
15
+ 'Meça a largura e o comprimento da divisão, escolha o tamanho do azulejo e indique a largura da junta. A calculadora divide as dimensões da divisão pelo azulejo mais a junta para dar o número exato de peças por fila e coluna.',
16
+ },
17
+ {
18
+ question: 'Que percentagem de desperdício devo acrescentar ao comprar azulejos?',
19
+ answer:
20
+ 'Para divisões retangulares padrão, adicione 10% de desperdício. Para ambientes com muitos cantos, disposições diagonais ou cortes complexos, aumente para 15%. Isto cobre quebras e erros de corte.',
21
+ },
22
+ {
23
+ question: 'A espessura da junta realmente altera a quantidade de azulejos?',
24
+ answer:
25
+ 'Sim. Juntas mais largas reduzem a cobertura efetiva de cada peça, aumentando ligeiramente o número total necessário. A calculadora leva isto em conta automaticamente em cada fila e coluna.',
26
+ },
27
+ {
28
+ question: 'Devo comprar caixas extra para além da percentagem de desperdício?',
29
+ answer:
30
+ 'É sensato adquirir uma caixa extra, se disponível. Os lotes de cor podem variar entre produções, e ter peças sobressalentes a condiciona reparações futuras.',
31
+ },
32
+ {
33
+ question: 'Como coloco azulejos numa divisão de forma irregular?',
34
+ answer:
35
+ 'Divida a divisão em retângulos mais pequenos. Calcule cada secção separadamente e some os totais. Arredonde sempre as caixas parciais para cima para garantir cobertura completa.',
36
+ },
37
+ {
38
+ question: 'Qual é a diferença de desperdício entre cerâmica e porcelanato?',
39
+ answer:
40
+ 'O porcelanato é mais denso e difícil de cortar, o que pode aumentar o desperdício de corte entre 2% e 3% em comparação com a cerâmica padrão. Ambos os materiais devem seguir o mesmo processo de medição.',
41
+ },
42
+ {
43
+ question: 'Posso devolver caixas de azulejos não utilizadas?',
44
+ answer:
45
+ 'A maioria dos retalhistas aceita caixas por abrir no prazo de 30 dias. Guarde sempre o recibo e não abra as caixas excedentes até a instalação estar totalmente concluída.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Meça a divisão',
52
+ text: 'Anote a largura e o comprimento do pavimento no sistema de unidades que preferir.',
53
+ },
54
+ {
55
+ name: 'Selecione azulejo e junta',
56
+ text: 'Escolha as dimensões do azulejo e a largura da junta desejada.',
57
+ },
58
+ {
59
+ name: 'Calcule e visualize',
60
+ text: 'Introduza os valores na calculadora, ajuste a margem de desperdício e reveja a pré-visualização live da disposição.',
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: 'pt',
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: 'Guia Completo para Planificar Pavimentos em Azulejo e Controlar o Desperdício',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Um projeto de colocação de azulejos bem-sucedido começa muito antes de aplicar a primeira camada de cola. A medição precisa, o planeamento inteligente da disposição e a estimativa exata do desperdício determinam se a sua renovação se mantém no orçamento e no prazo. <strong>A nossa calculadora de disposição de azulejos interativa</strong> transforma dimensões brutas num plano visual, mostrando exatamente quantas peças cabem por fila, quantas caixas comprar e onde o seu dinheiro é investido.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Desperdício Padrão', icon: 'mdi:alert-circle' },
119
+ { value: '30+ anos', label: 'Vida útil do azulejo', icon: 'mdi:clock-outline' },
120
+ { value: '48h', label: 'Instalação Média', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Azulejos de Grande Formato',
129
+ description: 'Azulejos superiores a 60 cm criam um aspeto moderno e contínuo, mas exigem substratos perfeitamente planos e geram mais desperdício de corte em divisões pequenas.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Menos juntas visíveis', 'Efeito visual premium', 'Maior desperdício em espaços reduzidos'],
132
+ },
133
+ {
134
+ title: 'Mosaicos de Pequena Dimensão',
135
+ description: 'Ideais para casas de banho e padrões intrincados. Adaptam-se a formas irregulares, mas exigem mais junta e tempo de mão de obra.',
136
+ icon: 'mdi:apps',
137
+ points: ['Flexíveis à volta de obstáculos', 'Mais junta necessária', 'Maior tempo de instalação'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Porque a Visualização da Disposição Importa',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Ver a grelha de azulejos antes da compra evita surpresas dispendiosas. Uma pré-visualização em direto revela se o tamanho escolhido deixa tiras estreitas nos bordos ou cria um pavimento equilibrado e simétrico. Ajustando a largura da junta e a orientação do azulejo na calculadora, pode otimizar a disposição para estética e eficiência antes de encomendar.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Tabela de Referência Rápida de Cobertura',
155
+ icon: 'mdi:table',
156
+ badge: 'Referência',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 cm</strong> → 11 azulejos por m²</li><li><strong>45 x 45 cm</strong> → 5 azulejos por m²</li><li><strong>60 x 60 cm</strong> → 3 azulejos por m²</li><li><strong>60 x 120 cm</strong> → 1,5 azulejos por m²</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Dicas de Profissional para Minimizar o Desperdício',
162
+ items: [
163
+ 'Encomende 10% extra para disposições direitas e 15% para diagonais ou espinha de peixe.',
164
+ 'Guarde todas as caixas do mesmo lote de produção para garantir consistência de cor.',
165
+ 'Meça em diagonal a divisão para verificar a esquadria antes de planear as filas.',
166
+ 'Utilize grandes formatos apenas em divisões mais largas que o comprimento do azulejo para evitar cortes excessivos.',
167
+ 'Arredonde sempre as caixas para cima: sai mais barato do que uma segunda entrega.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Configuração da Divisão',
173
+ labelRoomWidth: 'Largura da divisão',
174
+ labelRoomLength: 'Comprimento da divisão',
175
+ labelTileWidth: 'Largura do azulejo',
176
+ labelTileLength: 'Comprimento do azulejo',
177
+ labelGrout: 'Junta',
178
+ labelWaste: 'Margem de desperdício',
179
+ labelTilesPerBox: 'Azulejos por caixa',
180
+ labelPrice: 'Preço por caixa',
181
+ labelPattern: 'Padrão de colocação',
182
+ unitMetricRoom: 'm',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'cm',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'mm',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'un',
190
+ unitPrice: '/caixa',
191
+ resultBadge: 'Pré-visualização live',
192
+ labelArea: 'Área do pavimento',
193
+ labelTiles: 'Azulejos total',
194
+ labelBoxes: 'Caixas necessárias',
195
+ labelCost: 'Custo total',
196
+ labelWasteCount: 'Azulejos de desperdício',
197
+ labelCuts: 'Cortes parciais',
198
+ currency: 'EUR',
199
+ btnMetric: 'Métrico',
200
+ btnImperial: 'Imperial',
201
+ btnPatternStraight: 'Direito',
202
+ btnPatternBrick: 'Meia-teia',
203
+ btnPatternDiagonal: 'Diagonal',
204
+ badgeOptimal: 'Disposição ótima',
205
+ badgeWarning: 'Alerta de desperdício elevado',
206
+ visualTitle: 'Pré-visualização da disposição',
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 = 'kalkulyator-raskladki-plitki';
7
+ const title = 'Калькулятор раскладки и запаса плитки';
8
+ const description =
9
+ 'Спланируйте напольное покрытие с точностью до миллиметра. Рассчитайте точное количество плитки, необходимое число коробок, общую стоимость и визуализируйте раскладку в реальном времени с помощью интерактивного превью.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Как рассчитать, сколько плитки нужно для комнаты?',
14
+ answer:
15
+ 'Измерьте ширину и длину помещения, выберите размер плитки и укажите ширину шва. Калькулятор делит габариты комнаты на размер плитки плюс шов, чтобы получить точное количество плиток в ряду и колонке.',
16
+ },
17
+ {
18
+ question: 'Какой процент запаса следует заложить при покупке плитки?',
19
+ answer:
20
+ 'Для стандартных прямоугольных комнат добавляйте 10% запаса. Для помещений с множеством углов, диагональной укладкой или сложными резами увеличьте до 15%. Это покроет бои и ошибки распила.',
21
+ },
22
+ {
23
+ question: 'Влияет ли толщина шва на количество плитки?',
24
+ answer:
25
+ 'Да. Более широкие швы уменьшают эффективную площадь каждой плитки, слегка увеличивая общее количество. Калькулятор автоматически учитывает это в каждом ряду и колонке.',
26
+ },
27
+ {
28
+ question: 'Стоит ли покупать дополнительные коробки сверх процента запаса?',
29
+ answer:
30
+ 'Разумно приобрести одну лишнюю коробку, если она есть в наличии. Цветовые партии могут отличаться между производственными запусками, а наличие подходящего запаса упростит будущий ремонт.',
31
+ },
32
+ {
33
+ question: 'Как класть плитку в помещении сложной формы?',
34
+ answer:
35
+ 'Разбейте комнату на меньшие прямоугольники. Рассчитайте каждую зону отдельно и сложите итоги. Всегда округляйте частичные коробки вверх, чтобы обеспечить полное покрытие.',
36
+ },
37
+ {
38
+ question: 'В чём разница в запасе между керамикой и керамогранитом?',
39
+ answer:
40
+ 'Керамогранит плотнее и сложнее в распиле, что может увеличить отходы при резке на 2-3% по сравнению с обычной керамикой. Оба материала требуют одинакового процесса замера.',
41
+ },
42
+ {
43
+ question: 'Можно ли вернуть неиспользованные коробки с плиткой?',
44
+ answer:
45
+ 'Большинство магазинов принимают неоткрытые коробки в течение 30 дней. Всегда сохраняйте чек и не вскрывайте излишки до полного завершения укладки.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Измерьте помещение',
52
+ text: 'Запишите ширину и длину пола в предпочитаемой системе единиц.',
53
+ },
54
+ {
55
+ name: 'Выберите плитку и шов',
56
+ text: 'Укажите размеры плитки и желаемую ширину шва.',
57
+ },
58
+ {
59
+ name: 'Рассчитайте и визуализируйте',
60
+ text: 'Введите значения в калькулятор, откорректируйте запас и изучите превью раскладки в реальном времени.',
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: 'RUB' },
94
+ inLanguage: 'ru',
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: 'Полное руководство по планированию напольной плитки и контролю запаса',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Успешный проект укладки плитки начинается задолго до нанесения первого слоя клея. Точный замер, грамотное планирование раскладки и точный расчёт запаса определяют, уложится ли ремонт в бюджет и сроки. <strong>Наш интерактивный калькулятор раскладки плитки</strong> превращает исходные размеры в наглядный план, показывая точно, сколько плиток влезает в ряд, сколько коробок купить и куда уходят ваши деньги.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Стандартный запас', icon: 'mdi:alert-circle' },
119
+ { value: '30+ лет', label: 'Срок службы плитки', icon: 'mdi:clock-outline' },
120
+ { value: '48ч', label: 'Средняя укладка', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Крупноформатная плитка',
129
+ description: 'Плитка свыше 60 см создаёт бесшовный современный вид, но требует идеально ровного основания и даёт больший отход реза в маленьких комнатах.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Меньше швов', 'Премиальный визуальный эффект', 'Больший отход в тесных помещениях'],
132
+ },
133
+ {
134
+ title: 'Мелкая мозаика',
135
+ description: 'Идеальна для ванных и сложных узоров. Адаптируется к неровным формам, но требует больше шва и времени на укладку.',
136
+ icon: 'mdi:apps',
137
+ points: ['Гибкость вокруг препятствий', 'Больше шва', 'Больше времени на монтаж'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Почему важна визуализация раскладки',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Видеть сетку плитки до покупки позволяет избежать дорогостоящих сюрпризов. Живое превью показывает, оставит ли выбранный размер неприятно узкие полосы по краям или создаст сбалансированный симметричный пол. Подбирая ширину шва и ориентацию плитки в калькуляторе, можно оптимизировать раскладку по эстетике и эффективности ещё до заказа.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Справочная таблица расхода',
155
+ icon: 'mdi:table',
156
+ badge: 'Справка',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 см</strong> → 11 шт. на м²</li><li><strong>45 x 45 см</strong> → 5 шт. на м²</li><li><strong>60 x 60 см</strong> → 3 шт. на м²</li><li><strong>60 x 120 см</strong> → 1,5 шт. на м²</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Советы профессионалов по сокращению отходов',
162
+ items: [
163
+ 'Заказывайте запас 10% для прямой укладки и 15% для диагонали или ёлочки.',
164
+ 'Храните все коробки из одной партии, чтобы цвет совпадал.',
165
+ 'Измерьте комнату по диагонали, чтобы проверить прямоугольность перед планированием рядов.',
166
+ 'Крупноформатную плитку используйте только в комнатах шире длины плитки, чтобы избежать лишних резов.',
167
+ 'Всегда округляйте количество коробок вверх - это дешевле второй доставки.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Параметры помещения',
173
+ labelRoomWidth: 'Ширина комнаты',
174
+ labelRoomLength: 'Длина комнаты',
175
+ labelTileWidth: 'Ширина плитки',
176
+ labelTileLength: 'Длина плитки',
177
+ labelGrout: 'Ширина шва',
178
+ labelWaste: 'Запас',
179
+ labelTilesPerBox: 'Плиток в коробке',
180
+ labelPrice: 'Цена за коробку',
181
+ labelPattern: 'Схема укладки',
182
+ unitMetricRoom: 'м',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'см',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'мм',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'шт',
190
+ unitPrice: '/коробка',
191
+ resultBadge: 'Превью раскладки',
192
+ labelArea: 'Площадь пола',
193
+ labelTiles: 'Всего плитки',
194
+ labelBoxes: 'Коробок нужно',
195
+ labelCost: 'Общая стоимость',
196
+ labelWasteCount: 'Запас плитки',
197
+ labelCuts: 'Частичные резы',
198
+ currency: 'RUB',
199
+ btnMetric: 'Метрическая',
200
+ btnImperial: 'Имперская',
201
+ btnPatternStraight: 'Прямая',
202
+ btnPatternBrick: 'Сдвиг',
203
+ btnPatternDiagonal: 'Диагональ',
204
+ badgeOptimal: 'Оптимальная раскладка',
205
+ badgeWarning: 'Высокий запас',
206
+ visualTitle: 'Превью раскладки',
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 = 'kakel-layout-berakning';
7
+ const title = 'Kakellayout och Spillberäknare';
8
+ const description =
9
+ 'Planera ditt rumsgolv med millimeterprecision. Beräkna exakt antal kakel, lådor som behövs, total kostnad och visualisera layouten i realtid med en interaktiv rutnätsförhandsvisning.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Hur beräknar jag hur många kakelplattor jag behöver för ett rum?',
14
+ answer:
15
+ 'Mät rummets bredd och längd, välj kakelstorlek och ange fogbredden. Kalkylatorn delar rummets mått med kakel plus fog för att ge exakt antal plattor per rad och kolumn.',
16
+ },
17
+ {
18
+ question: 'Vilken spillprocent bör jag lägga till vid köp av kakel?',
19
+ answer:
20
+ 'För standard rektangulära rum, lägg till 10% spill. För rum med många hörn, diagonala mönster eller komplexa snitt, öka till 15%. Detta täcker sönder och snittfel.',
21
+ },
22
+ {
23
+ question: 'Påverkar fogtjockleken verkligen antalet kakelplattor?',
24
+ answer:
25
+ 'Ja. Bredare fogar minskar varje plattas effektiva täckning, vilket ökar det totala antalet något. Kalkylatorn tar hänsyn till detta automatiskt i varje rad och kolumn.',
26
+ },
27
+ {
28
+ question: 'Bör jag köpa extra lådor utöver spillprocenten?',
29
+ answer:
30
+ 'Det är klokt att köpa en extra låda om sådan finns. Färgbad kan variera mellan produktionsomgångar, och matchande reservdelar gör framtida reparationer sömlösa.',
31
+ },
32
+ {
33
+ question: 'Hur kaklar jag ett rum med oregelbunden form?',
34
+ answer:
35
+ 'Dela upp rummet i mindre rektanglar. Beräkna varje sektion separat och summera resultaten. Avrunda alltid delvisa lådor uppåt för att säkerställa full täckning.',
36
+ },
37
+ {
38
+ question: 'Vad är skillnaden i spill mellan keramik och porslin?',
39
+ answer:
40
+ 'Porslin är tätare och svårare att skära, vilket kan öka skärtspill med 2% till 3% jämfört med standardkeramik. Båda materialen bör följa samma mätprocess.',
41
+ },
42
+ {
43
+ question: 'Kan jag returnera oanvända kakellådor?',
44
+ answer:
45
+ 'De flesta återförsäljare accepterar oöppnade lådor inom 30 dagar. Spara alltid kvittot och öppna inte överskottslådor förrän installationen är helt klar.',
46
+ },
47
+ ];
48
+
49
+ const howToData = [
50
+ {
51
+ name: 'Mät rummet',
52
+ text: 'Anteckna bredd och längd på golvyta i ditt föredragna måttsystem.',
53
+ },
54
+ {
55
+ name: 'Välj kakel och fog',
56
+ text: 'Välj dina kakeldimensioner och önskad fogbredd.',
57
+ },
58
+ {
59
+ name: 'Beräkna och visualisera',
60
+ text: 'Mata in värdena i kalkylatorn, justera spillmarginalen och granska live-layout-förhandsvisningen.',
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: 'SEK' },
94
+ inLanguage: 'sv',
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: 'Komplett Guide för Kakelgolvplanering och Spillkontroll',
109
+ level: 2,
110
+ },
111
+ {
112
+ type: 'paragraph',
113
+ html: 'Ett lyckat kakelprojekt börjar långt innan det första limmet läggs på. Noggrann mätning, intelligent layoutplanering och korrekt spilluppskattning avgör om din renovering håller sig inom budget och tidsplan. <strong>Vår interaktiva kakel-layoutkalkylator</strong> omvandlar råa mått till en visuell golvplan som visar exakt hur många plattor som får plats per rad, hur många lådor du behöver köpa och vart dina pengar går.',
114
+ },
115
+ {
116
+ type: 'stats',
117
+ items: [
118
+ { value: '10-15%', label: 'Standardspill', icon: 'mdi:alert-circle' },
119
+ { value: '30+ år', label: 'Kakellivslängd', icon: 'mdi:clock-outline' },
120
+ { value: '48h', label: 'Genomsnittlig montering', icon: 'mdi:calendar-check' },
121
+ ],
122
+ columns: 3,
123
+ },
124
+ {
125
+ type: 'comparative',
126
+ items: [
127
+ {
128
+ title: 'Storformat Kakel',
129
+ description: 'Kakel större än 60 cm skapar en sömlös, modern look men kräver perfekt plana underlag och ger högre skärspill i små rum.',
130
+ icon: 'mdi:arrow-expand',
131
+ points: ['Färre fogar', 'Premium visuell effekt', 'Högre spill i trånga utrymmen'],
132
+ },
133
+ {
134
+ title: 'Små Mosaikplattor',
135
+ description: 'Idealiska för badrum och intrikata mönster. De anpassar sig till oregelbundna former men kräver mer fog och arbetstid.',
136
+ icon: 'mdi:apps',
137
+ points: ['Flexibla runt hinder', 'Mer fog krävs', 'Längre monteringstid'],
138
+ },
139
+ ],
140
+ columns: 2,
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Varför Layoutvisualisering Betyder Något',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Att se ditt kakelnät innan köp förhindrar dyra överraskningar. En live-förhandsvisning avslöjar om din valda kakelstorlek lämnar obehagliga smala strimmor vid kanterna eller skapar ett balanserat, symmetriskt golv. Genom att justera fogbredd och kakelorientering i kalkylatorn kan du optimera layouten för estetik och effektivitet innan du beställer.',
150
+ },
151
+ {
152
+ type: 'diagnostic',
153
+ variant: 'info',
154
+ title: 'Snabb Referenstabell för Täckning',
155
+ icon: 'mdi:table',
156
+ badge: 'Referens',
157
+ html: '<ul style="margin:0;padding-left:1.2em"><li><strong>30 x 30 cm</strong> → 11 plattor per m²</li><li><strong>45 x 45 cm</strong> → 5 plattor per m²</li><li><strong>60 x 60 cm</strong> → 3 plattor per m²</li><li><strong>60 x 120 cm</strong> → 1,5 plattor per m²</li></ul>',
158
+ },
159
+ {
160
+ type: 'summary',
161
+ title: 'Proffstips för att Minimera Spill',
162
+ items: [
163
+ 'Beställ 10% extra för raka mönster och 15% för diagonala eller fiskbensmönster.',
164
+ 'Förvara alla lådor från samma produktionsbatch för att säkerställa färgkonsekvens.',
165
+ 'Mät diagonalt över rummet för att kontrollera vinkelräthet innan du planerar rader.',
166
+ 'Använd storformat endast i rum som är bredare än plattans längd för att undvika överdriven skärning.',
167
+ 'Avrunda alltid lådor uppåt; det är billigare än en andra leverans.',
168
+ ],
169
+ },
170
+ ],
171
+ ui: {
172
+ sectionTitle: 'Rumskonfiguration',
173
+ labelRoomWidth: 'Rumsbredd',
174
+ labelRoomLength: 'Rumslängd',
175
+ labelTileWidth: 'Kakelbredd',
176
+ labelTileLength: 'Kakellängd',
177
+ labelGrout: 'Fogbredd',
178
+ labelWaste: 'Spillmarginal',
179
+ labelTilesPerBox: 'Plattor per låda',
180
+ labelPrice: 'Pris per låda',
181
+ labelPattern: 'Kakelmonstret',
182
+ unitMetricRoom: 'm',
183
+ unitImperialRoom: 'ft',
184
+ unitMetricTile: 'cm',
185
+ unitImperialTile: 'in',
186
+ unitGroutMetric: 'mm',
187
+ unitGroutImperial: 'in',
188
+ unitPercent: '%',
189
+ unitBoxes: 'st',
190
+ unitPrice: '/låda',
191
+ resultBadge: 'Live layout-förhandsvisning',
192
+ labelArea: 'Golvyta',
193
+ labelTiles: 'Totalt antal plattor',
194
+ labelBoxes: 'Lådor som behövs',
195
+ labelCost: 'Total kostnad',
196
+ labelWasteCount: 'Spillplattor',
197
+ labelCuts: 'Delvisa snitt',
198
+ currency: 'SEK',
199
+ btnMetric: 'Metriskt',
200
+ btnImperial: 'Imperialiskt',
201
+ btnPatternStraight: 'Rakt',
202
+ btnPatternBrick: 'Förskjutet',
203
+ btnPatternDiagonal: 'Diagonalt',
204
+ badgeOptimal: 'Optimal layout',
205
+ badgeWarning: 'Högt spill',
206
+ visualTitle: 'Layout förhandsvisning',
207
+ },
208
+ };