@jjlmoya/utils-diy 1.20.0 → 1.22.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 (31) hide show
  1. package/package.json +2 -2
  2. package/src/category/index.ts +14 -14
  3. package/src/entries.ts +4 -1
  4. package/src/tests/locale_completeness.test.ts +2 -2
  5. package/src/tests/tool_validation.test.ts +2 -2
  6. package/src/tool/drywallCalculator/bibliography.astro +7 -0
  7. package/src/tool/drywallCalculator/bibliography.ts +16 -0
  8. package/src/tool/drywallCalculator/component.astro +324 -0
  9. package/src/tool/drywallCalculator/drywall-calculator.css +426 -0
  10. package/src/tool/drywallCalculator/entry.ts +24 -0
  11. package/src/tool/drywallCalculator/i18n/de.ts +169 -0
  12. package/src/tool/drywallCalculator/i18n/en.ts +169 -0
  13. package/src/tool/drywallCalculator/i18n/es.ts +169 -0
  14. package/src/tool/drywallCalculator/i18n/fr.ts +169 -0
  15. package/src/tool/drywallCalculator/i18n/id.ts +169 -0
  16. package/src/tool/drywallCalculator/i18n/it.ts +169 -0
  17. package/src/tool/drywallCalculator/i18n/ja.ts +169 -0
  18. package/src/tool/drywallCalculator/i18n/ko.ts +169 -0
  19. package/src/tool/drywallCalculator/i18n/nl.ts +169 -0
  20. package/src/tool/drywallCalculator/i18n/pl.ts +169 -0
  21. package/src/tool/drywallCalculator/i18n/pt.ts +169 -0
  22. package/src/tool/drywallCalculator/i18n/ru.ts +169 -0
  23. package/src/tool/drywallCalculator/i18n/sv.ts +169 -0
  24. package/src/tool/drywallCalculator/i18n/tr.ts +169 -0
  25. package/src/tool/drywallCalculator/i18n/zh.ts +169 -0
  26. package/src/tool/drywallCalculator/index.ts +10 -0
  27. package/src/tool/drywallCalculator/logic.test.ts +39 -0
  28. package/src/tool/drywallCalculator/logic.ts +33 -0
  29. package/src/tool/drywallCalculator/seo.astro +14 -0
  30. package/src/tool/drywallCalculator/ui.ts +52 -0
  31. package/src/tools.ts +2 -1
@@ -0,0 +1,169 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DrywallCalculatorUI } from '../ui';
4
+ import { drywallCalculatorBibliography } from '../bibliography';
5
+
6
+ const slug = 'gipsskivor-kalkylator';
7
+ const title = 'Gipsskivor Kalkylator: Regelverk, Skivor och Spackel';
8
+ const description = 'Professionell materialkalkylator for innervaggar och stålregelverk. Berakna exakt antal gipsskivor, stålreglar, skenor, skruv, skarvremsa och spackel.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Hur beraknar jag hur manga gipsskivor som behovsk till en innervagg?',
13
+ answer: 'Multiplicera vaggens langd med takhojden for att fa vaggarean. For dubbelsidiga vaggar multiplicerar du med 2; for dubbla skivlager pa bada sidor multiplicerar du med 4. Dela den totala arean med ytan for en skiva (2.88 m2 for skiva 120x240 cm) och lagg till 10% spillmarginal.',
14
+ },
15
+ {
16
+ question: 'Nar ska jag valja regelavstand 40 cm eller 60 cm (cc 45/60)?',
17
+ answer: 'Standard avstand cc 60 cm passar vanliga torra innervaggar upp till 3,0 m hojd. Anvand cc 40 cm vid kakelsattning, i vatrum (badrum, kok), vid ljudisolerande vaggar eller hojder over 3,0 meter.',
18
+ },
19
+ {
20
+ question: 'Vilken typ av gipsskiva ska valjas per utrymme?',
21
+ answer: 'Anvand Standard Vit (Typ A) for bostadsrum; Humid/Vatrum Gron (Typ H1) for badrum; Brand/Kombiform Rosa (Typ F) for eldstader; och Ljudskiva Bld for ljuddampning.',
22
+ },
23
+ {
24
+ question: 'Hur manga gipsskruvar kravs per gipsskiva?',
25
+ answer: 'Räkna med ca 30 gipsskruvar (3.5x25 mm) per skiva 120x240 cm vid enkelgips. Skruva med 25 cm avstand langs kanterna och 30 cm pa de mittersta reglarna.',
26
+ },
27
+ {
28
+ question: 'Varfor ar isoleringsband obligatoriskt under skenorna?',
29
+ answer: 'Sjalvhäftande akustikband i polyeten isolerar stålskenorna fran golv och tak, vilket forhindrar stomljud och akustiska lackage.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ { name: 'Ange Vaggens Mått', text: 'Fyll i vaggens langd och takhojd i meter eller fot.' },
35
+ { name: 'Konfigurera Regelverk och Skivlager', text: 'Valj regelavstand (40 cm eller 60 cm), antal skivlager och enkelsidig/dubbelsidig beplankning.' },
36
+ { name: 'Granska Materialspecifikation och CAD-ritning', text: 'Se komplett materiallista for reglar, skruvar, skarvremsa och spackel samt ritning.' },
37
+ ];
38
+
39
+ const faqSchema: WithContext<FAQPage> = {
40
+ '@context': 'https://schema.org',
41
+ '@type': 'FAQPage',
42
+ mainEntity: faqData.map((item) => ({
43
+ '@type': 'Question',
44
+ name: item.question,
45
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
46
+ })),
47
+ };
48
+
49
+ const howToSchema: WithContext<HowToThing> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'HowTo',
52
+ name: title,
53
+ description,
54
+ step: howToData.map((step, i) => ({
55
+ '@type': 'HowToStep',
56
+ position: i + 1,
57
+ name: step.name,
58
+ text: step.text,
59
+ })),
60
+ };
61
+
62
+ const appSchema: WithContext<SoftwareApplication> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'SoftwareApplication',
65
+ name: title,
66
+ description,
67
+ applicationCategory: 'UtilityApplication',
68
+ operatingSystem: 'All',
69
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
70
+ inLanguage: 'sv',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<DrywallCalculatorUI> = {
74
+ slug,
75
+ title,
76
+ description,
77
+ faqTitle: 'Vanliga Frågor',
78
+ faq: faqData,
79
+ bibliography: drywallCalculatorBibliography,
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ {
84
+ type: 'title',
85
+ text: 'Teknisk Dimensionering av Stålregelverk och Gipsskivor',
86
+ level: 2,
87
+ },
88
+ {
89
+ type: 'paragraph',
90
+ html: 'Att bygga latta innervaggar med gipsskivor kraver exakt dimensionering av galvaniserade stålprofiler (reglar och skenor) samt forskjutning av skivskarvar enligt EN 520.',
91
+ },
92
+ {
93
+ type: 'title',
94
+ text: 'Regler for Regelavstand: 40 cm vs 60 cm (cc)',
95
+ level: 3,
96
+ },
97
+ {
98
+ type: 'paragraph',
99
+ html: '<strong>Standardavstand cc 60 cm</strong> anpassas till skivbredd 120 cm. <strong>Cc 40 cm</strong> ar obligatoriskt under kakel och vid hojder over 3,0 m.',
100
+ },
101
+ {
102
+ type: 'card',
103
+ icon: 'mdi:shield-check-outline',
104
+ title: 'Forskjutna Skarvar och Skruvmonster',
105
+ html: '<p>Undvik korsskarvar. Forskjut skivskarvar minst 40 cm. Skruva med 3.5x25 mm skruv med <strong>25 cm avstand pa kanten</strong> och <strong>30 cm pa mitten reglarna</strong>.</p>',
106
+ },
107
+ {
108
+ type: 'title',
109
+ text: 'Spillmarginal och Spackelforbrukning',
110
+ level: 3,
111
+ },
112
+ {
113
+ type: 'paragraph',
114
+ html: 'Lagg alltid till <strong>10% spillmarginal</strong> for kapningar vid dorrar och fonster. Skarvspackling fordtar ca 0.8 kg spackel per kvadratmeter.',
115
+ },
116
+ ],
117
+ ui: {
118
+ unitSystemLabel: 'Måttsystem',
119
+ unitMetric: 'Metrisk (m, cm, kg)',
120
+ unitImperial: 'Imperial (ft, in, lb)',
121
+
122
+ paramLengthLabel: 'Vägglängd',
123
+ paramHeightLabel: 'Takhöjd',
124
+ paramSpacingLabel: 'Regelavstånd (cc)',
125
+ paramSpacing40Metric: '40 cm (Hög Belastning)',
126
+ paramSpacing60Metric: '60 cm (Standard)',
127
+ paramSpacing40Imperial: '16 in (Hög Belastning)',
128
+ paramSpacing60Imperial: '24 in (Standard)',
129
+ paramLayersLabel: 'Skivlager',
130
+ paramSingleLayer: 'Enkelgips',
131
+ paramDoubleLayer: 'Dubbelgips',
132
+ paramSidesLabel: 'Sidor Beplankade',
133
+ paramDoubleSided: '2 Sidor (Innervägg)',
134
+ paramSingleSided: '1 Sida (Försettvägg)',
135
+ paramBoardTypeLabel: 'Gipsskivtyp',
136
+ boardTypeStandard: 'Standard (Typ A)',
137
+ boardTypeMoisture: 'Våtrum/Fukt (Typ H1)',
138
+ boardTypeFire: 'Brand (Typ F)',
139
+ boardTypeAcoustic: 'Ljudskiva (Typ A)',
140
+ paramWasteLabel: 'Spillmarginal',
141
+
142
+ summaryWallArea: 'Nettoväggarea',
143
+ summaryBoardArea: 'Total Skivarea',
144
+
145
+ resBoardsLabel: 'Gipsskivor',
146
+ resBoardsUnit: 'st',
147
+ resStudsLabel: 'Vertikala Stålreglar (C)',
148
+ resStudsUnit: 'st',
149
+ resTracksLabel: 'Horisontella Skenor (U)',
150
+ resTracksUnit: 'längder',
151
+ resDrywallScrewsLabel: 'Gipsskruv',
152
+ resDrywallScrewsUnit: 'st',
153
+ resFramingScrewsLabel: 'Montegipsskruv',
154
+ resFramingScrewsUnit: 'st',
155
+ resJointTapeLabel: 'Skarvremsa',
156
+ resJointTapeUnit: 'längd',
157
+ resJointCompoundLabel: 'Skarvspackel',
158
+ resJointCompoundUnit: 'vikt',
159
+ resAcousticBandLabel: 'Akustikband / Dämpband',
160
+ resAcousticBandUnit: 'längd',
161
+
162
+ diagramWallTitle: 'CAD-Ritning Höjdsnitt',
163
+ diagramStudLegend: 'Stålreglar C',
164
+ diagramTrackLegend: 'Skenor U',
165
+ diagramBoardLegend: 'Förskjutna Skivskarvar',
166
+ diagramModeStructure: 'Stålregelverk',
167
+ diagramModeBoard: 'Gipsbeplankning',
168
+ },
169
+ };
@@ -0,0 +1,169 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DrywallCalculatorUI } from '../ui';
4
+ import { drywallCalculatorBibliography } from '../bibliography';
5
+
6
+ const slug = 'alcipan-hesaplayici';
7
+ const title = 'Alçıpan ve Bölme Duvar Malzeme Hesaplayıcı';
8
+ const description = 'Alçıpan bölme duvar ve giydirme duvarlar için profesyonel malzeme hesaplama aracı. Alçıpan plakaları, C dikmeleri, U rayları, vidaları, derz bandı ve derz dolgusunu tam olarak hesaplayın.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Bölme duvar için kaç adet alçıpan plakası gerektiğini nasıl hesaplarım?',
13
+ answer: 'Duvar uzunluğu ile tavan yüksekliğini çarparak toplam duvar alanını bulun. Çift taraflı bölme duvarlar için alanı 2 ile çarpın; çift kat kaplama için 4 ile çarpın. Toplam kaplama alanını bir plakanın net alanına (120x240 cm plaka için 2.88 m2) bölün ve %10 fire payı ekleyin.',
14
+ },
15
+ {
16
+ question: 'Dikme aralığı 40 cm mi yoksa 60 cm mi seçilmelidir?',
17
+ answer: 'Standart 60 cm dikme aralığı 3.0 m yüksekliğe kadar olan iç mekân kuru duvarları için uygundur. Ağır seramik kaplama yapılacak duvarlarda, ıslak hacimlerde (banyo, mutfak) ve 3.0 metreyi aşan yüksekliklerde 40 cm dikme aralığı zorunludur.',
18
+ },
19
+ {
20
+ question: 'Hangi alçıpan çeşidi nerede kullanılmalıdır?',
21
+ answer: 'Oturma ve yatak odalarında Beyaz Standart Alçıpan (Tip A); banyo ve mutfaklarda Yeşil Suya Dayanıklı Alçıpan (Tip H1); baca ve kazan dairelerinde Pembe Yangına Dayanıklı Alçıpan (Tip F); ses yalıtımlı alanlarda Mavi Akustik Alçıpan kullanın.',
22
+ },
23
+ {
24
+ question: 'Bir plaka alçıpan için kaç adet borazan vida gereklidir?',
25
+ answer: 'Tek kat kaplamada 120x240 cm boyutundaki plaka başına yaklaşık 30 adet borazan vida (3.5x25 mm) kullanılır. Vidalar kenarlarda 25 cm, orta dikmelerde 30 cm aralıkla sıkılır.',
26
+ },
27
+ {
28
+ question: 'U profillerinin altına neden ses yalıtım bandı yapıştırılmalıdır?',
29
+ answer: 'Kendinden yapışkanlı polietilen ses yalıtım bantları U raylarını döşeme ve tavandan ayırarak titreşim ve darbe seslerinin iletimini engeller.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ { name: 'Duvar Ölçülerini Girin', text: 'Bölme duvar uzunluğunu ve tavan yüksekliğini metre veya fit cinsinden belirtin.' },
35
+ { name: 'Karkas ve Kaplama Katını Ayarlayın', text: 'Dikme aralığını (40 cm veya 60 cm), kat sayısını ve kaplama yönünü seçin.' },
36
+ { name: 'Malzeme Listesi ve CAD Çizimini İnceleyin', text: 'Profil, vida, derz bandı ve dolgu macunu metrajı ile karkas görünüş çizimini inceleyin.' },
37
+ ];
38
+
39
+ const faqSchema: WithContext<FAQPage> = {
40
+ '@context': 'https://schema.org',
41
+ '@type': 'FAQPage',
42
+ mainEntity: faqData.map((item) => ({
43
+ '@type': 'Question',
44
+ name: item.question,
45
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
46
+ })),
47
+ };
48
+
49
+ const howToSchema: WithContext<HowToThing> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'HowTo',
52
+ name: title,
53
+ description,
54
+ step: howToData.map((step, i) => ({
55
+ '@type': 'HowToStep',
56
+ position: i + 1,
57
+ name: step.name,
58
+ text: step.text,
59
+ })),
60
+ };
61
+
62
+ const appSchema: WithContext<SoftwareApplication> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'SoftwareApplication',
65
+ name: title,
66
+ description,
67
+ applicationCategory: 'UtilityApplication',
68
+ operatingSystem: 'All',
69
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
70
+ inLanguage: 'tr',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<DrywallCalculatorUI> = {
74
+ slug,
75
+ title,
76
+ description,
77
+ faqTitle: 'Sıkça Sorulan Sorular',
78
+ faq: faqData,
79
+ bibliography: drywallCalculatorBibliography,
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ {
84
+ type: 'title',
85
+ text: 'Alçıpan Bölme Duvar Karkas Hesabı Esasları',
86
+ level: 2,
87
+ },
88
+ {
89
+ type: 'paragraph',
90
+ html: 'Hafif bölme duvarların yapımında galvanizli çelik profillerin (C dikme ve U ray) doğru boyutlandırılması ve ek yerlerinin şaşırtmalı yerleştirilmesi TS EN 520 standartlarına göre çatlamaları önler.',
91
+ },
92
+ {
93
+ type: 'title',
94
+ text: 'Dikme Eksen Aralığı: 40 cm ve 60 cm Kuralları',
95
+ level: 3,
96
+ },
97
+ {
98
+ type: 'paragraph',
99
+ html: '<strong>60 cm eksen aralığı</strong> 120 cm genişliğindeki plakalar için standarttır. Seramik kaplama altında ve 3.0 metreden yüksek duvarlarda <strong>40 cm eksen aralığı</strong> zorunludur.',
100
+ },
101
+ {
102
+ type: 'card',
103
+ icon: 'mdi:shield-check-outline',
104
+ title: 'Plaka Ek Yeri Şaşırtması ve Vidalama Düzeni',
105
+ html: '<p>Derzlerde artı şeklinde kesişmelerden kaçının. Ek yerlerini en az 40 cm şaşırtın. Plakaları 3.5x25 mm borazan vidalarla <strong>kenarlarda 25 cm</strong> ve <strong>ortada 30 cm</strong> aralıkla sabitleyin.</p>',
106
+ },
107
+ {
108
+ type: 'title',
109
+ text: 'Fire Payı Oranı ve Derz Dolgusu Tüketimi',
110
+ level: 3,
111
+ },
112
+ {
113
+ type: 'paragraph',
114
+ html: 'Kapı ve pencere boşluklarındaki kesimler için her zaman <strong>%10 fire payı</strong> ekleyin. Derz dolgusu için metrekare başına yaklaşık 0.8 kg alçı bazlı derz macunu gereklidir.',
115
+ },
116
+ ],
117
+ ui: {
118
+ unitSystemLabel: 'Ölçü Sistemi',
119
+ unitMetric: 'Metrik (m, cm, kg)',
120
+ unitImperial: 'İngiliz (ft, in, lb)',
121
+
122
+ paramLengthLabel: 'Duvar Uzunluğu',
123
+ paramHeightLabel: 'Tavan Yüksekliği',
124
+ paramSpacingLabel: 'C Dikme Eksen Aralığı',
125
+ paramSpacing40Metric: '40 cm (Yüksek Yük)',
126
+ paramSpacing60Metric: '60 cm (Standart)',
127
+ paramSpacing40Imperial: '16 in (Yüksek Yük)',
128
+ paramSpacing60Imperial: '24 in (Standart)',
129
+ paramLayersLabel: 'Kaplama Kat Sayısı',
130
+ paramSingleLayer: 'Tek Kat Kaplama',
131
+ paramDoubleLayer: 'Çift Kat Kaplama',
132
+ paramSidesLabel: 'Kaplanan Yüz Sayısı',
133
+ paramDoubleSided: '2 Yüz (Bölme Duvar)',
134
+ paramSingleSided: '1 Yüz (Giydirme Duvar)',
135
+ paramBoardTypeLabel: 'Alçıpan Türü',
136
+ boardTypeStandard: 'Standart (Tip A)',
137
+ boardTypeMoisture: 'Suya Dayanıklı (Tip H1)',
138
+ boardTypeFire: 'Yangına Dayanıklı (Tip F)',
139
+ boardTypeAcoustic: 'Akustik (Tip A)',
140
+ paramWasteLabel: 'Fire Payı Oranı',
141
+
142
+ summaryWallArea: 'Net Duvar Alanı',
143
+ summaryBoardArea: 'Toplam Alçıpan Alanı',
144
+
145
+ resBoardsLabel: 'Alçıpan Plakası',
146
+ resBoardsUnit: 'adet',
147
+ resStudsLabel: 'C Dikey Profil (Sütun)',
148
+ resStudsUnit: 'adet',
149
+ resTracksLabel: 'U Yatay Profil (Ray)',
150
+ resTracksUnit: 'boy',
151
+ resDrywallScrewsLabel: 'Borazan Vida',
152
+ resDrywallScrewsUnit: 'adet',
153
+ resFramingScrewsLabel: 'Karkas Vidası (Mercimek)',
154
+ resFramingScrewsUnit: 'adet',
155
+ resJointTapeLabel: 'Derz Bandı',
156
+ resJointTapeUnit: 'uzunluk',
157
+ resJointCompoundLabel: 'Derz Dolgu Macunu',
158
+ resJointCompoundUnit: 'ağırlık',
159
+ resAcousticBandLabel: 'Ses Yalıtım Bandı',
160
+ resAcousticBandUnit: 'uzunluk',
161
+
162
+ diagramWallTitle: 'CAD Karkas Görünüşü',
163
+ diagramStudLegend: 'C Dikme Profil',
164
+ diagramTrackLegend: 'U Ray Profil',
165
+ diagramBoardLegend: 'Şaşırtmalı Ek Yerleri',
166
+ diagramModeStructure: 'Çelik Karkas',
167
+ diagramModeBoard: 'Alçıpan Kaplama',
168
+ },
169
+ };
@@ -0,0 +1,169 @@
1
+ import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DrywallCalculatorUI } from '../ui';
4
+ import { drywallCalculatorBibliography } from '../bibliography';
5
+
6
+ const slug = 'drywall-calculator';
7
+ const title = '石膏板用量与轻钢龙骨计算器';
8
+ const description = '专业的隔墙与贴面墙石膏板用量计算器。准确计算石膏板、C型竖向龙骨、U型沿顶沿地龙骨、自攻螺 clandestine、接缝纸带与嵌缝腻子用量。';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '如何计算隔墙所需的石膏板数量?',
13
+ answer: '将墙体长度乘以层高计算出净墙面积。双面隔墙乘以2,双层双面封板乘以4。除以单张石膏板有效面积(120x240cm板约2.88平方米),并加上10%的损耗率。',
14
+ },
15
+ {
16
+ question: '龙骨间距应该选择40cm还是60cm?',
17
+ answer: '标准60cm间距适用于3.0米以下普通干燥室内隔墙。若墙面贴重型瓷砖、处于潮湿环境(浴室、厨房)或墙高超过3.0米,必须采用40cm龙骨间距。',
18
+ },
19
+ {
20
+ question: '不同区域应该选择哪种石膏板?',
21
+ answer: '普通卧室使用标准白板(A型);浴室厨房使用耐水绿板(H1型);烟道与机房周边使用防火粉红板(F型);隔音墙体使用高密度隔音蓝板。',
22
+ },
23
+ {
24
+ question: '每张石膏板需要多少颗自攻螺钉?',
25
+ answer: '单层封板时,每张120x240cm石膏板约需30颗自攻螺钉(3.5x25mm)。边缘间距25cm,中间龙骨间距30cm。',
26
+ },
27
+ {
28
+ question: '为什么沿顶沿地龙骨下方必须铺设隔音密封胶带?',
29
+ answer: '自粘聚乙烯隔音胶带能阻断U型龙骨与楼板地面之间的机械振动传递,防止结构传声与声漏。',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ { name: '输入墙体尺寸', text: '输入隔墙长度与层高(米或英尺)。' },
35
+ { name: '配置龙骨间距与封板层数', text: '选择龙骨间距(40cm或60cm)、单层/双层封板及单面/双面施工。' },
36
+ { name: '查看材料清单与CAD图', text: '查看龙骨、螺钉、接缝带、腻子清单及龙骨立面排布图。' },
37
+ ];
38
+
39
+ const faqSchema: WithContext<FAQPage> = {
40
+ '@context': 'https://schema.org',
41
+ '@type': 'FAQPage',
42
+ mainEntity: faqData.map((item) => ({
43
+ '@type': 'Question',
44
+ name: item.question,
45
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
46
+ })),
47
+ };
48
+
49
+ const howToSchema: WithContext<HowToThing> = {
50
+ '@context': 'https://schema.org',
51
+ '@type': 'HowTo',
52
+ name: title,
53
+ description,
54
+ step: howToData.map((step, i) => ({
55
+ '@type': 'HowToStep',
56
+ position: i + 1,
57
+ name: step.name,
58
+ text: step.text,
59
+ })),
60
+ };
61
+
62
+ const appSchema: WithContext<SoftwareApplication> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'SoftwareApplication',
65
+ name: title,
66
+ description,
67
+ applicationCategory: 'UtilityApplication',
68
+ operatingSystem: 'All',
69
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
70
+ inLanguage: 'zh',
71
+ };
72
+
73
+ export const content: ToolLocaleContent<DrywallCalculatorUI> = {
74
+ slug,
75
+ title,
76
+ description,
77
+ faqTitle: '常见问题解答',
78
+ faq: faqData,
79
+ bibliography: drywallCalculatorBibliography,
80
+ howTo: howToData,
81
+ schemas: [faqSchema, howToSchema, appSchema],
82
+ seo: [
83
+ {
84
+ type: 'title',
85
+ text: '轻钢龙骨石膏板隔墙结构计算原理',
86
+ level: 2,
87
+ },
88
+ {
89
+ type: 'paragraph',
90
+ html: '轻钢龙骨隔墙施工中,镀锌钢板C型竖向龙骨与U型沿顶沿地龙骨的合理布置及板缝错缝排列是防止挠度变形与接缝开裂的关键。',
91
+ },
92
+ {
93
+ type: 'title',
94
+ text: '龙骨间距规范: 40cm与60cm对比',
95
+ level: 3,
96
+ },
97
+ {
98
+ type: 'paragraph',
99
+ html: '<strong>60cm间距</strong>是120cm宽石膏板的标准配置。贴饰面砖或墙高大于3.0米时必须采用<strong>40cm间距</strong>。',
100
+ },
101
+ {
102
+ type: 'card',
103
+ icon: 'mdi:shield-check-outline',
104
+ title: '板缝错缝与螺钉固定规范',
105
+ html: '<p>严禁出现十字通缝,相邻石膏板竖缝应错开至少40cm。螺钉固定间距为<strong>板边25cm</strong>,<strong>板中30cm</strong>。</p>',
106
+ },
107
+ {
108
+ type: 'title',
109
+ text: '损耗率与嵌缝腻子用量计算',
110
+ level: 3,
111
+ },
112
+ {
113
+ type: 'paragraph',
114
+ html: '门窗洞口裁切需预留<strong>10%损耗率</strong>。接缝处理每平方米约消耗0.8kg嵌缝腻子。',
115
+ },
116
+ ],
117
+ ui: {
118
+ unitSystemLabel: '计量单位体系',
119
+ unitMetric: '公制 (m, cm, kg)',
120
+ unitImperial: '英制 (ft, in, lb)',
121
+
122
+ paramLengthLabel: '墙体长度',
123
+ paramHeightLabel: '墙体高度 (层高)',
124
+ paramSpacingLabel: '竖向龙骨间距',
125
+ paramSpacing40Metric: '40 cm (高承重)',
126
+ paramSpacing60Metric: '60 cm (标准)',
127
+ paramSpacing40Imperial: '16 in (高承重)',
128
+ paramSpacing60Imperial: '24 in (标准)',
129
+ paramLayersLabel: '封板层数',
130
+ paramSingleLayer: '单层封板',
131
+ paramDoubleLayer: '双层封板',
132
+ paramSidesLabel: '施工面',
133
+ paramDoubleSided: '双面施工 (隔墙)',
134
+ paramSingleSided: '单面施工 (贴面墙)',
135
+ paramBoardTypeLabel: '石膏板类型',
136
+ boardTypeStandard: '标准白板 (A型)',
137
+ boardTypeMoisture: '耐水绿板 (H1型)',
138
+ boardTypeFire: '防火粉红板 (F型)',
139
+ boardTypeAcoustic: '隔音蓝板 (A型)',
140
+ paramWasteLabel: '损耗预留率',
141
+
142
+ summaryWallArea: '净墙面积',
143
+ summaryBoardArea: '石膏板总铺设面积',
144
+
145
+ resBoardsLabel: '石膏板数量',
146
+ resBoardsUnit: '张',
147
+ resStudsLabel: 'C型竖向龙骨 (主龙骨)',
148
+ resStudsUnit: '根',
149
+ resTracksLabel: 'U型沿顶沿地龙骨',
150
+ resTracksUnit: '根',
151
+ resDrywallScrewsLabel: '石膏板自攻螺钉',
152
+ resDrywallScrewsUnit: '颗',
153
+ resFramingScrewsLabel: '龙骨连接螺钉 (穿心钉)',
154
+ resFramingScrewsUnit: '颗',
155
+ resJointTapeLabel: '接缝纸带/网格带',
156
+ resJointTapeUnit: '长度',
157
+ resJointCompoundLabel: '嵌缝膏/石膏腻子',
158
+ resJointCompoundUnit: '重量',
159
+ resAcousticBandLabel: '减震隔音密封带',
160
+ resAcousticBandUnit: '长度',
161
+
162
+ diagramWallTitle: 'CAD 龙骨立面排布图',
163
+ diagramStudLegend: 'C型竖向龙骨',
164
+ diagramTrackLegend: 'U型沿顶沿地龙骨',
165
+ diagramBoardLegend: '错缝拼板模式',
166
+ diagramModeStructure: '轻钢骨架',
167
+ diagramModeBoard: '石膏板封板',
168
+ },
169
+ };
@@ -0,0 +1,10 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { drywallCalculatorEntry } from './entry';
3
+ export * from './entry';
4
+
5
+ export const DRYWALL_CALCULATOR_TOOL: ToolDefinition = {
6
+ entry: drywallCalculatorEntry,
7
+ Component: () => import('./component.astro'),
8
+ SEOComponent: () => import('./seo.astro'),
9
+ BibliographyComponent: () => import('./bibliography.astro'),
10
+ };
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { calculateDrywall } from './logic';
3
+
4
+ describe('calculateDrywall', () => {
5
+ it('calculates metric materials correctly', () => {
6
+ const res = calculateDrywall({
7
+ unitSystem: 'metric',
8
+ length: 5,
9
+ height: 2.5,
10
+ studSpacingCm: 60,
11
+ layers: 1,
12
+ doubleSided: true,
13
+ boardType: 'standard',
14
+ wastePercentage: 10,
15
+ });
16
+
17
+ expect(res.wallArea).toBe(12.5);
18
+ expect(res.drywallBoards).toBe(12);
19
+ expect(res.tracksStandardLengths).toBe(4);
20
+ expect(res.studsCount).toBe(10);
21
+ expect(res.jointCompoundWeight).toBe(22);
22
+ });
23
+
24
+ it('calculates imperial materials correctly', () => {
25
+ const res = calculateDrywall({
26
+ unitSystem: 'imperial',
27
+ length: 16.4,
28
+ height: 8.2,
29
+ studSpacingCm: 60,
30
+ layers: 1,
31
+ doubleSided: true,
32
+ boardType: 'standard',
33
+ wastePercentage: 10,
34
+ });
35
+
36
+ expect(res.wallArea).toBeGreaterThan(130);
37
+ expect(res.drywallBoards).toBeGreaterThanOrEqual(10);
38
+ });
39
+ });
@@ -0,0 +1,33 @@
1
+ import type { DrywallInput, DrywallOutput } from './ui';
2
+
3
+ function getStudSpacingMeters(isImp: boolean, studSpacingCm: number): number {
4
+ if (isImp) {
5
+ return studSpacingCm === 40 ? 1.333 : 2;
6
+ }
7
+ return studSpacingCm / 100;
8
+ }
9
+
10
+ export function calculateDrywall(params: DrywallInput): DrywallOutput {
11
+ const isImp = params.unitSystem === 'imperial';
12
+ const wasteMult = 1 + (params.wastePercentage || 0) / 100;
13
+ const wallArea = params.length * params.height;
14
+ const totalArea = wallArea * (params.doubleSided ? 2 : 1) * params.layers;
15
+ const boardArea = isImp ? 32 : 2.4;
16
+ const spacing = getStudSpacingMeters(isImp, params.studSpacingCm);
17
+ const studsCount = Math.ceil(params.length / spacing) + 1;
18
+ const totalBoardsUnwasted = Math.ceil(totalArea / boardArea);
19
+
20
+ return {
21
+ wallArea,
22
+ totalBoardArea: totalArea * wasteMult,
23
+ drywallBoards: Math.ceil((totalArea * wasteMult) / boardArea),
24
+ studsCount,
25
+ tracksStandardLengths: Math.ceil((params.length * 2 * wasteMult) / (isImp ? 10 : 3)),
26
+ drywallScrews: totalBoardsUnwasted * 30,
27
+ framingScrews: studsCount * 4,
28
+ jointTapeLength: Math.ceil(totalArea * 1.5 * wasteMult),
29
+ jointCompoundWeight: Math.ceil(totalArea * (isImp ? 1.6 : 0.8) * wasteMult),
30
+ acousticBandLength: Math.ceil((params.length * 2 + params.height * 2) * wasteMult),
31
+ boardType: params.boardType,
32
+ };
33
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ ---
3
+
4
+ <div class="drywall-seo-content">
5
+ <p>
6
+ Planning a drywall partition wall or ceiling lining requires precise calculations of light gauge steel framing members, plasterboard sheets, and jointing materials. This calculator provides complete material takeoffs based on standard architectural specifications for dry construction systems.
7
+ </p>
8
+ <h3>Key Drywall Installation Principles</h3>
9
+ <ul>
10
+ <li><strong>Stud Spacing:</strong> Standard non-load-bearing interior partitions use 60 cm stud centers for speed and efficiency. Damp locations or tiled walls require 40 cm centers to prevent structural deflection.</li>
11
+ <li><strong>Joint Staggering:</strong> Plasterboard sheets must be staggered horizontally by at least 40 cm between courses to prevent continuous vertical stress seams.</li>
12
+ <li><strong>Fastener Density:</strong> Board perimeter screws are placed every 25 cm, while interior field screws are spaced every 30 cm along studs.</li>
13
+ </ul>
14
+ </div>
@@ -0,0 +1,52 @@
1
+ export interface DrywallCalculatorUI extends Record<string, string> {
2
+ unitSystemLabel: string;
3
+ unitMetric: string;
4
+ unitImperial: string;
5
+
6
+ paramLengthLabel: string;
7
+ paramHeightLabel: string;
8
+ paramSpacingLabel: string;
9
+ paramSpacing40Metric: string;
10
+ paramSpacing60Metric: string;
11
+ paramSpacing40Imperial: string;
12
+ paramSpacing60Imperial: string;
13
+ paramLayersLabel: string;
14
+ paramSingleLayer: string;
15
+ paramDoubleLayer: string;
16
+ paramSidesLabel: string;
17
+ paramDoubleSided: string;
18
+ paramSingleSided: string;
19
+ paramBoardTypeLabel: string;
20
+ boardTypeStandard: string;
21
+ boardTypeMoisture: string;
22
+ boardTypeFire: string;
23
+ boardTypeAcoustic: string;
24
+ paramWasteLabel: string;
25
+
26
+ summaryWallArea: string;
27
+ summaryBoardArea: string;
28
+
29
+ resBoardsLabel: string;
30
+ resBoardsUnit: string;
31
+ resStudsLabel: string;
32
+ resStudsUnit: string;
33
+ resTracksLabel: string;
34
+ resTracksUnit: string;
35
+ resDrywallScrewsLabel: string;
36
+ resDrywallScrewsUnit: string;
37
+ resFramingScrewsLabel: string;
38
+ resFramingScrewsUnit: string;
39
+ resJointTapeLabel: string;
40
+ resJointTapeUnit: string;
41
+ resJointCompoundLabel: string;
42
+ resJointCompoundUnit: string;
43
+ resAcousticBandLabel: string;
44
+ resAcousticBandUnit: string;
45
+
46
+ diagramWallTitle: string;
47
+ diagramStudLegend: string;
48
+ diagramTrackLegend: string;
49
+ diagramBoardLegend: string;
50
+ diagramModeStructure: string;
51
+ diagramModeBoard: string;
52
+ }
package/src/tools.ts CHANGED
@@ -16,6 +16,7 @@ import { DRILL_SHARPENER_TOOL } from './tool/drillSharpener/index';
16
16
  import { WORKSHOP_FRACTION_CONVERTER_TOOL } from './tool/workshopFractionConverter/index';
17
17
  import { PYTHAGOREAN_RIGHT_ANGLE_CALCULATOR_TOOL } from './tool/pythagoreanRightAngleCalculator/index';
18
18
  import { TWO_STROKE_MIXTURE_CALCULATOR_TOOL } from './tool/twoStrokeMixtureCalculator/index';
19
+ import { DRYWALL_CALCULATOR_TOOL } from './tool/drywallCalculator/index';
19
20
 
20
- export const ALL_TOOLS: ToolDefinition[] = [CLAY_CALCULATOR_TOOL, EPOXY_CALCULATOR_TOOL, BALUSTER_CALCULATOR_TOOL, MORTAR_CALCULATOR_TOOL, PASSEPARTOUT_CALCULATOR_TOOL, CONCRETE_CALCULATOR_TOOL, CUT_OPTIMIZER_TOOL, VOLTAGE_DROP_CALCULATOR_TOOL, FURNITURE_FIT_TOOL, THERMAL_EXPANSION_CALCULATOR_TOOL, DRILL_CALCULATOR_TOOL, STAIR_CALCULATOR_TOOL, DRILL_SHARPENER_TOOL, WORKSHOP_FRACTION_CONVERTER_TOOL, PYTHAGOREAN_RIGHT_ANGLE_CALCULATOR_TOOL, TWO_STROKE_MIXTURE_CALCULATOR_TOOL];
21
+ export const ALL_TOOLS: ToolDefinition[] = [CLAY_CALCULATOR_TOOL, EPOXY_CALCULATOR_TOOL, BALUSTER_CALCULATOR_TOOL, MORTAR_CALCULATOR_TOOL, PASSEPARTOUT_CALCULATOR_TOOL, CONCRETE_CALCULATOR_TOOL, CUT_OPTIMIZER_TOOL, VOLTAGE_DROP_CALCULATOR_TOOL, FURNITURE_FIT_TOOL, THERMAL_EXPANSION_CALCULATOR_TOOL, DRILL_CALCULATOR_TOOL, STAIR_CALCULATOR_TOOL, DRILL_SHARPENER_TOOL, WORKSHOP_FRACTION_CONVERTER_TOOL, PYTHAGOREAN_RIGHT_ANGLE_CALCULATOR_TOOL, TWO_STROKE_MIXTURE_CALCULATOR_TOOL, DRYWALL_CALCULATOR_TOOL];
21
22