@jjlmoya/utils-textiles 1.1.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 (134) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +76 -0
  3. package/src/category/i18n/es.ts +76 -0
  4. package/src/category/i18n/fr.ts +73 -0
  5. package/src/category/index.ts +17 -0
  6. package/src/category/seo.astro +15 -0
  7. package/src/components/PreviewNavSidebar.astro +116 -0
  8. package/src/components/PreviewToolbar.astro +143 -0
  9. package/src/data.ts +11 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +32 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +253 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +19 -0
  17. package/src/tests/locale_completeness.test.ts +42 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +48 -0
  20. package/src/tests/seo_length.test.ts +22 -0
  21. package/src/tests/title_separators.test.ts +40 -0
  22. package/src/tests/tool_validation.test.ts +17 -0
  23. package/src/tool/burnTest/bibliography.astro +34 -0
  24. package/src/tool/burnTest/component.astro +602 -0
  25. package/src/tool/burnTest/i18n/en.ts +225 -0
  26. package/src/tool/burnTest/i18n/es.ts +225 -0
  27. package/src/tool/burnTest/i18n/fr.ts +225 -0
  28. package/src/tool/burnTest/index.ts +34 -0
  29. package/src/tool/burnTest/logic.ts +3 -0
  30. package/src/tool/burnTest/seo.astro +40 -0
  31. package/src/tool/burnTest/ui.ts +36 -0
  32. package/src/tool/clothingSizeConverter/bibliography.astro +34 -0
  33. package/src/tool/clothingSizeConverter/component.astro +1226 -0
  34. package/src/tool/clothingSizeConverter/i18n/en.ts +356 -0
  35. package/src/tool/clothingSizeConverter/i18n/es.ts +356 -0
  36. package/src/tool/clothingSizeConverter/i18n/fr.ts +356 -0
  37. package/src/tool/clothingSizeConverter/index.ts +34 -0
  38. package/src/tool/clothingSizeConverter/logic.ts +30 -0
  39. package/src/tool/clothingSizeConverter/seo.astro +40 -0
  40. package/src/tool/clothingSizeConverter/ui.ts +70 -0
  41. package/src/tool/fabricProjectCalculator/bibliography.astro +19 -0
  42. package/src/tool/fabricProjectCalculator/component.astro +914 -0
  43. package/src/tool/fabricProjectCalculator/i18n/en.ts +250 -0
  44. package/src/tool/fabricProjectCalculator/i18n/es.ts +250 -0
  45. package/src/tool/fabricProjectCalculator/i18n/fr.ts +250 -0
  46. package/src/tool/fabricProjectCalculator/index.ts +34 -0
  47. package/src/tool/fabricProjectCalculator/logic.ts +89 -0
  48. package/src/tool/fabricProjectCalculator/seo.astro +40 -0
  49. package/src/tool/fabricProjectCalculator/ui.ts +57 -0
  50. package/src/tool/fabricTruth/bibliography.astro +40 -0
  51. package/src/tool/fabricTruth/component.astro +708 -0
  52. package/src/tool/fabricTruth/i18n/en.ts +282 -0
  53. package/src/tool/fabricTruth/i18n/es.ts +316 -0
  54. package/src/tool/fabricTruth/i18n/fr.ts +282 -0
  55. package/src/tool/fabricTruth/index.ts +34 -0
  56. package/src/tool/fabricTruth/logic.ts +91 -0
  57. package/src/tool/fabricTruth/seo.astro +40 -0
  58. package/src/tool/fabricTruth/ui.ts +28 -0
  59. package/src/tool/fiberPrep/bibliography.astro +33 -0
  60. package/src/tool/fiberPrep/component.astro +987 -0
  61. package/src/tool/fiberPrep/i18n/en.ts +225 -0
  62. package/src/tool/fiberPrep/i18n/es.ts +225 -0
  63. package/src/tool/fiberPrep/i18n/fr.ts +225 -0
  64. package/src/tool/fiberPrep/index.ts +34 -0
  65. package/src/tool/fiberPrep/logic.ts +36 -0
  66. package/src/tool/fiberPrep/seo.astro +40 -0
  67. package/src/tool/fiberPrep/ui.ts +38 -0
  68. package/src/tool/knittingGauge/bibliography.astro +14 -0
  69. package/src/tool/knittingGauge/component.astro +828 -0
  70. package/src/tool/knittingGauge/i18n/en.ts +234 -0
  71. package/src/tool/knittingGauge/i18n/es.ts +234 -0
  72. package/src/tool/knittingGauge/i18n/fr.ts +234 -0
  73. package/src/tool/knittingGauge/index.ts +34 -0
  74. package/src/tool/knittingGauge/logic.ts +28 -0
  75. package/src/tool/knittingGauge/seo.astro +40 -0
  76. package/src/tool/knittingGauge/ui.ts +41 -0
  77. package/src/tool/laundryGuide/bibliography.astro +33 -0
  78. package/src/tool/laundryGuide/component.astro +486 -0
  79. package/src/tool/laundryGuide/data-en.ts +166 -0
  80. package/src/tool/laundryGuide/data-es.ts +166 -0
  81. package/src/tool/laundryGuide/data-fr.ts +103 -0
  82. package/src/tool/laundryGuide/i18n/en.ts +275 -0
  83. package/src/tool/laundryGuide/i18n/es.ts +275 -0
  84. package/src/tool/laundryGuide/i18n/fr.ts +291 -0
  85. package/src/tool/laundryGuide/index.ts +29 -0
  86. package/src/tool/laundryGuide/logic.ts +19 -0
  87. package/src/tool/laundryGuide/seo.astro +40 -0
  88. package/src/tool/needleConverter/bibliography.astro +14 -0
  89. package/src/tool/needleConverter/component.astro +518 -0
  90. package/src/tool/needleConverter/i18n/en.ts +217 -0
  91. package/src/tool/needleConverter/i18n/es.ts +217 -0
  92. package/src/tool/needleConverter/i18n/fr.ts +217 -0
  93. package/src/tool/needleConverter/index.ts +34 -0
  94. package/src/tool/needleConverter/logic.ts +31 -0
  95. package/src/tool/needleConverter/seo.astro +15 -0
  96. package/src/tool/needleConverter/ui.ts +17 -0
  97. package/src/tool/sewingPatternScaler/bibliography.astro +14 -0
  98. package/src/tool/sewingPatternScaler/component.astro +550 -0
  99. package/src/tool/sewingPatternScaler/i18n/en.ts +196 -0
  100. package/src/tool/sewingPatternScaler/i18n/es.ts +231 -0
  101. package/src/tool/sewingPatternScaler/i18n/fr.ts +187 -0
  102. package/src/tool/sewingPatternScaler/index.ts +34 -0
  103. package/src/tool/sewingPatternScaler/logic.ts +35 -0
  104. package/src/tool/sewingPatternScaler/seo.astro +49 -0
  105. package/src/tool/sewingPatternScaler/ui.ts +29 -0
  106. package/src/tool/shoeSizeConverter/bibliography.astro +34 -0
  107. package/src/tool/shoeSizeConverter/component.astro +437 -0
  108. package/src/tool/shoeSizeConverter/i18n/en.ts +188 -0
  109. package/src/tool/shoeSizeConverter/i18n/es.ts +188 -0
  110. package/src/tool/shoeSizeConverter/i18n/fr.ts +188 -0
  111. package/src/tool/shoeSizeConverter/index.ts +34 -0
  112. package/src/tool/shoeSizeConverter/logic.ts +8 -0
  113. package/src/tool/shoeSizeConverter/seo.astro +40 -0
  114. package/src/tool/shoeSizeConverter/ui.ts +21 -0
  115. package/src/tool/stainChemistry/bibliography.astro +40 -0
  116. package/src/tool/stainChemistry/component.astro +717 -0
  117. package/src/tool/stainChemistry/i18n/en.ts +303 -0
  118. package/src/tool/stainChemistry/i18n/es.ts +300 -0
  119. package/src/tool/stainChemistry/i18n/fr.ts +310 -0
  120. package/src/tool/stainChemistry/index.ts +34 -0
  121. package/src/tool/stainChemistry/logic.ts +11 -0
  122. package/src/tool/stainChemistry/seo.astro +40 -0
  123. package/src/tool/stainChemistry/ui.ts +51 -0
  124. package/src/tool/yarnCalculator/bibliography.astro +19 -0
  125. package/src/tool/yarnCalculator/component.astro +792 -0
  126. package/src/tool/yarnCalculator/i18n/en.ts +310 -0
  127. package/src/tool/yarnCalculator/i18n/es.ts +310 -0
  128. package/src/tool/yarnCalculator/i18n/fr.ts +310 -0
  129. package/src/tool/yarnCalculator/index.ts +34 -0
  130. package/src/tool/yarnCalculator/logic.ts +84 -0
  131. package/src/tool/yarnCalculator/seo.astro +14 -0
  132. package/src/tool/yarnCalculator/ui.ts +42 -0
  133. package/src/tools.ts +16 -0
  134. package/src/types.ts +72 -0
@@ -0,0 +1,356 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { ClothingSizeConverterUI } from '../ui';
4
+
5
+ const slug = 'convertisseur-tailles-vetements';
6
+ const title = 'Convertisseur de Tailles de Vêtements International';
7
+ const description =
8
+ 'Convertissez les tailles de vêtements entre les systèmes EU, US, UK et IT. T-shirts, pantalons, robes et vestes pour homme, femme et unisexe. Guide de mesures et recommandations par marque.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Quelle est la différence entre les tailles EU et US en vêtements ?',
13
+ answer:
14
+ 'Les tailles européennes (EU) utilisent des numéros progressifs (XS, S, M, L ou 32, 34, 36, 38) tandis que les tailles américaines (US) utilisent des lettres ou des numéros pour les pantalons féminins (0, 2, 4, 6). En général, un EU 36 correspond à un US 4 pour les femmes.',
15
+ },
16
+ {
17
+ question: 'Les tailles varient-elles selon le genre ?',
18
+ answer:
19
+ 'Oui, absolument. Même dans le même pays, une taille 40 pour homme n\'est pas la même que pour femme. Les hommes ont des proportions différentes (épaules plus larges), donc le calcul de taille varie.',
20
+ },
21
+ {
22
+ question: 'Comment savoir si je dois prendre une taille au-dessus ou en dessous ?',
23
+ answer:
24
+ 'Le meilleur moyen est de lire les avis d\'autres clients. Des expressions comme « taille petit » ou « taille grand » sont très utiles. Consultez aussi le guide des tailles spécifique de la marque.',
25
+ },
26
+ {
27
+ question: 'La table de conversion des tailles est-elle exacte ?',
28
+ answer:
29
+ 'La table de conversion est un guide. Bien qu\'elle soit généralement précise, chaque marque a ses propres spécifications. Vérifiez toujours le guide des tailles du magasin avant d\'acheter.',
30
+ },
31
+ {
32
+ question: 'Les vêtements rétrécissent-ils après le lavage ?',
33
+ answer:
34
+ 'Le coton 100% peut rétrécir de 5 à 10% si lavé à l\'eau chaude et séché en machine. Les matières synthétiques gardent mieux leur forme. Vérifiez toujours les instructions d\'entretien.',
35
+ },
36
+ ];
37
+
38
+ const howToData = [
39
+ {
40
+ name: 'Sélectionner le Vêtement et le Genre',
41
+ text: 'Choisissez le type de vêtement (t-shirt, pantalon, robe, veste) et le genre correspondant.',
42
+ },
43
+ {
44
+ name: 'Choisir votre Système de Taille',
45
+ text: 'Sélectionnez le système que vous connaissez : EU, US, UK ou IT.',
46
+ },
47
+ {
48
+ name: 'Sélectionner votre Taille',
49
+ text: 'Choisissez votre taille dans le sélecteur ou cliquez sur la grille. Vous verrez les équivalences instantanément.',
50
+ },
51
+ {
52
+ name: 'Consulter le Guide des Marques',
53
+ text: 'Vérifiez si cette marque taille petit, normal ou grand pour ajuster votre achat.',
54
+ },
55
+ ];
56
+
57
+ const faqSchema: WithContext<FAQPage> = {
58
+ '@context': 'https://schema.org',
59
+ '@type': 'FAQPage',
60
+ mainEntity: faqData.map((item) => ({
61
+ '@type': 'Question',
62
+ name: item.question,
63
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
64
+ })),
65
+ };
66
+
67
+ const howToSchema: WithContext<HowTo> = {
68
+ '@context': 'https://schema.org',
69
+ '@type': 'HowTo',
70
+ name: title,
71
+ description,
72
+ step: howToData.map((step) => ({
73
+ '@type': 'HowToStep',
74
+ name: step.name,
75
+ text: step.text,
76
+ })),
77
+ };
78
+
79
+ const appSchema: WithContext<SoftwareApplication> = {
80
+ '@context': 'https://schema.org',
81
+ '@type': 'SoftwareApplication',
82
+ name: title,
83
+ description,
84
+ applicationCategory: 'UtilityApplication',
85
+ operatingSystem: 'All',
86
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
87
+ inLanguage: 'fr',
88
+ };
89
+
90
+ const shirtsData = {
91
+ men: [
92
+ { EU: 'XS', US: 'XS', UK: 'XS', IT: '36' },
93
+ { EU: 'S', US: 'S', UK: 'S', IT: '38' },
94
+ { EU: 'M', US: 'M', UK: 'M', IT: '40' },
95
+ { EU: 'L', US: 'L', UK: 'L', IT: '42' },
96
+ { EU: 'XL', US: 'XL', UK: 'XL', IT: '44' },
97
+ { EU: 'XXL', US: 'XXL', UK: 'XXL', IT: '46' },
98
+ ],
99
+ women: [
100
+ { EU: 'XS', US: 'XS', UK: 'XS', IT: '32' },
101
+ { EU: 'S', US: 'S', UK: 'S', IT: '34' },
102
+ { EU: 'M', US: 'M', UK: 'M', IT: '36' },
103
+ { EU: 'L', US: 'L', UK: 'L', IT: '38' },
104
+ { EU: 'XL', US: 'XL', UK: 'XL', IT: '40' },
105
+ { EU: 'XXL', US: 'XXL', UK: 'XXL', IT: '42' },
106
+ ],
107
+ unisex: [
108
+ { EU: 'XS', US: 'XS', UK: 'XS', IT: '34' },
109
+ { EU: 'S', US: 'S', UK: 'S', IT: '36' },
110
+ { EU: 'M', US: 'M', UK: 'M', IT: '38' },
111
+ { EU: 'L', US: 'L', UK: 'L', IT: '40' },
112
+ { EU: 'XL', US: 'XL', UK: 'XL', IT: '42' },
113
+ { EU: 'XXL', US: 'XXL', UK: 'XXL', IT: '44' },
114
+ ],
115
+ };
116
+
117
+ const pantsData = {
118
+ men: [
119
+ { EU: '30', US: '30', UK: '30', IT: '44' },
120
+ { EU: '32', US: '32', UK: '32', IT: '46' },
121
+ { EU: '34', US: '34', UK: '34', IT: '48' },
122
+ { EU: '36', US: '36', UK: '36', IT: '50' },
123
+ { EU: '38', US: '38', UK: '38', IT: '52' },
124
+ { EU: '40', US: '40', UK: '40', IT: '54' },
125
+ ],
126
+ women: [
127
+ { EU: '32', US: '0', UK: '4', IT: '36' },
128
+ { EU: '34', US: '2', UK: '6', IT: '38' },
129
+ { EU: '36', US: '4', UK: '8', IT: '40' },
130
+ { EU: '38', US: '6', UK: '10', IT: '42' },
131
+ { EU: '40', US: '8', UK: '12', IT: '44' },
132
+ { EU: '42', US: '10', UK: '14', IT: '46' },
133
+ ],
134
+ unisex: [],
135
+ };
136
+
137
+ const dressesData = {
138
+ men: [
139
+ { EU: 'XS', US: 'XS', UK: 'XS', IT: '36' },
140
+ { EU: 'S', US: 'S', UK: 'S', IT: '38' },
141
+ { EU: 'M', US: 'M', UK: 'M', IT: '40' },
142
+ { EU: 'L', US: 'L', UK: 'L', IT: '42' },
143
+ ],
144
+ women: [
145
+ { EU: 'XS', US: '0-2', UK: '4-6', IT: '32-34' },
146
+ { EU: 'S', US: '4-6', UK: '8-10', IT: '36-38' },
147
+ { EU: 'M', US: '8-10', UK: '12-14', IT: '40-42' },
148
+ { EU: 'L', US: '12-14', UK: '16-18', IT: '44-46' },
149
+ { EU: 'XL', US: '16-18', UK: '20-22', IT: '48-50' },
150
+ ],
151
+ unisex: [],
152
+ };
153
+
154
+ const jacketsData = {
155
+ men: [
156
+ { EU: 'XS', US: 'XS', UK: 'XS', IT: '44' },
157
+ { EU: 'S', US: 'S', UK: 'S', IT: '46' },
158
+ { EU: 'M', US: 'M', UK: 'M', IT: '48' },
159
+ { EU: 'L', US: 'L', UK: 'L', IT: '50' },
160
+ { EU: 'XL', US: 'XL', UK: 'XL', IT: '52' },
161
+ ],
162
+ women: [
163
+ { EU: 'XS', US: 'XS', UK: 'XS', IT: '32' },
164
+ { EU: 'S', US: 'S', UK: 'S', IT: '34' },
165
+ { EU: 'M', US: 'M', UK: 'M', IT: '36' },
166
+ { EU: 'L', US: 'L', UK: 'L', IT: '38' },
167
+ { EU: 'XL', US: 'XL', UK: 'XL', IT: '40' },
168
+ ],
169
+ unisex: [],
170
+ };
171
+
172
+ const measurementRanges = {
173
+ shirts: [
174
+ { size: 'XS', chest: 84, waist: 76, hip: 84 },
175
+ { size: 'S', chest: 92, waist: 84, hip: 92 },
176
+ { size: 'M', chest: 100, waist: 92, hip: 100 },
177
+ { size: 'L', chest: 108, waist: 100, hip: 108 },
178
+ { size: 'XL', chest: 116, waist: 108, hip: 116 },
179
+ { size: 'XXL', chest: 124, waist: 116, hip: 124 },
180
+ ],
181
+ pants: [
182
+ { size: '30', chest: 80, waist: 76, hip: 89 },
183
+ { size: '32', chest: 85, waist: 81, hip: 94 },
184
+ { size: '34', chest: 90, waist: 86, hip: 99 },
185
+ { size: '36', chest: 95, waist: 91, hip: 104 },
186
+ { size: '38', chest: 100, waist: 96, hip: 109 },
187
+ { size: '40', chest: 105, waist: 101, hip: 114 },
188
+ ],
189
+ dresses: [
190
+ { size: 'XS', chest: 80, waist: 72, hip: 88 },
191
+ { size: 'S', chest: 88, waist: 80, hip: 96 },
192
+ { size: 'M', chest: 96, waist: 88, hip: 104 },
193
+ { size: 'L', chest: 104, waist: 96, hip: 112 },
194
+ { size: 'XL', chest: 112, waist: 104, hip: 120 },
195
+ ],
196
+ jackets: [
197
+ { size: 'XS', chest: 84, waist: 76, hip: 88 },
198
+ { size: 'S', chest: 92, waist: 84, hip: 96 },
199
+ { size: 'M', chest: 100, waist: 92, hip: 104 },
200
+ { size: 'L', chest: 108, waist: 100, hip: 112 },
201
+ { size: 'XL', chest: 116, waist: 108, hip: 120 },
202
+ ],
203
+ };
204
+
205
+ export const content: ToolLocaleContent<ClothingSizeConverterUI> = {
206
+ slug,
207
+ title,
208
+ description,
209
+ faqTitle: 'Questions Fréquentes',
210
+ faq: faqData,
211
+ bibliographyTitle: 'Bibliographie',
212
+ bibliography: [
213
+ { name: 'ISO 3635: Clothing Sizes - Official Standard', url: 'https://www.iso.org/standard/68644.html' },
214
+ { name: 'Clothing Size Standards - Wikipedia', url: 'https://en.wikipedia.org/wiki/Clothing_size' },
215
+ {
216
+ name: 'International Clothing Size Conversion - Wikipedia',
217
+ url: 'https://en.wikipedia.org/wiki/Clothing_size#International_variations',
218
+ },
219
+ ],
220
+ howTo: howToData,
221
+ schemas: [faqSchema, howToSchema, appSchema],
222
+ seo: [
223
+ {
224
+ type: 'title',
225
+ text: 'Convertisseur de Tailles : Guide International Complet',
226
+ level: 2,
227
+ },
228
+ {
229
+ type: 'paragraph',
230
+ html: "Acheter des vêtements dans des boutiques internationales peut être déroutant lorsque les tailles ne correspondent pas. Le <strong>convertisseur de tailles de vêtements</strong> vous aide à trouver votre taille parfaite dans les systèmes EU, US, UK et IT.",
231
+ },
232
+ {
233
+ type: 'title',
234
+ text: 'Pourquoi les tailles de vêtements varient-elles selon les pays ?',
235
+ level: 2,
236
+ },
237
+ {
238
+ type: 'paragraph',
239
+ html: "Il n'existe pas de norme internationale unique pour les tailles de vêtements. Chaque région a développé son propre système, créant une confusion lors des achats dans des boutiques étrangères.",
240
+ },
241
+ {
242
+ type: 'list',
243
+ items: [
244
+ '<span><strong>Tailles EU (Europe) :</strong> Utilisent des numéros progressifs (XS, S, M, L ou 32, 34, 36...). Le système le plus courant en France et en Italie.</span>',
245
+ '<span><strong>Tailles US (États-Unis) :</strong> Utilisent des lettres (XS, S, M, L) ou des numéros pour les pantalons féminins (0, 2, 4, 6).</span>',
246
+ '<span><strong>Tailles UK (Royaume-Uni) :</strong> Similaires à EU mais avec sa propre numérotation, généralement inférieure à US.</span>',
247
+ '<span><strong>Tailles IT (Italie) :</strong> Numérotation italienne avec des variations par rapport au système EU général.</span>',
248
+ ],
249
+ },
250
+ {
251
+ type: 'tip',
252
+ title: 'Conseil Professionnel',
253
+ html: "Les tailles varient considérablement selon les marques. Une taille 38 chez Zara peut être différente d'une 38 chez H&amp;M. Consultez toujours le guide des tailles spécifique du magasin avant d'acheter.",
254
+ },
255
+ {
256
+ type: 'title',
257
+ text: 'Comment mesurer votre corps correctement',
258
+ level: 2,
259
+ },
260
+ {
261
+ type: 'paragraph',
262
+ html: 'Pour garantir la bonne taille, mesurez votre corps avec un ruban mètre souple. Mesurez en fin de journée, lorsque votre corps est à son expansion maximale.',
263
+ },
264
+ {
265
+ type: 'list',
266
+ items: [
267
+ '<span><strong>Poitrine :</strong> Mesurez autour de la partie la plus large de votre poitrine, en passant le ruban sous les bras.</span>',
268
+ '<span><strong>Taille :</strong> Mesurez à hauteur du nombril sans rentrer artificiellement le ventre.</span>',
269
+ '<span><strong>Hanches :</strong> Mesurez autour de la partie la plus large des hanches, le ruban parallèle au sol.</span>',
270
+ ],
271
+ },
272
+ {
273
+ type: 'title',
274
+ text: 'Guide de coupe par marque',
275
+ level: 2,
276
+ },
277
+ {
278
+ type: 'list',
279
+ items: [
280
+ '<span><strong>Zara :</strong> Tailles normales. Un 36 chez Zara est généralement fiable pour des mesures standard.</span>',
281
+ "<span><strong>H&amp;M :</strong> Tend à tailler grand. Envisagez de prendre une taille en dessous de votre taille habituelle.</span>",
282
+ '<span><strong>Uniqlo :</strong> Taille petit, surtout pour les basiques. Il est recommandé de prendre une taille au-dessus.</span>',
283
+ '<span><strong>Nike / Adidas :</strong> Coupes ajustées pour l\'activité physique. Envisagez de prendre une demi-taille de plus.</span>',
284
+ ],
285
+ },
286
+ ],
287
+ ui: {
288
+ categoryLabel: 'Type de Vêtement',
289
+ categoryShirts: 'T-Shirts',
290
+ categoryPants: 'Pantalons',
291
+ categoryDresses: 'Robes',
292
+ categoryJackets: 'Vestes',
293
+ genderLabel: 'Genre',
294
+ genderMen: 'Homme',
295
+ genderWomen: 'Femme',
296
+ genderUnisex: 'Unisexe',
297
+ tabBySize: 'Par Taille',
298
+ tabByMeasurements: 'Par Mesures',
299
+ regionLabel: 'Votre Système de Taille',
300
+ sizeLabel: 'Sélectionnez votre Taille',
301
+ regionEU: 'Europe (EU)',
302
+ regionUS: 'États-Unis (US)',
303
+ regionUK: 'Royaume-Uni (UK)',
304
+ regionIT: 'Italie (IT)',
305
+ labelEU: 'Europe',
306
+ labelUS: 'États-Unis',
307
+ labelUK: 'Royaume-Uni',
308
+ labelIT: 'Italie',
309
+ quickGridTitle: 'Référence Rapide (EU)',
310
+ tableTitle: 'Table de Conversion Complète',
311
+ measurementsTitle: 'Entrez vos Mesures',
312
+ chestLabel: 'Poitrine (cm)',
313
+ waistLabel: 'Taille (cm)',
314
+ hipLabel: 'Hanches (cm)',
315
+ chestPlaceholder: 'Ex. : 95',
316
+ waistPlaceholder: 'Ex. : 85',
317
+ hipPlaceholder: 'Ex. : 95',
318
+ recommendBtnLabel: 'Recommander une Taille',
319
+ tipsTitle: 'Conseils de Mesure',
320
+ tipOverClothes: 'Par-dessus les vêtements',
321
+ tipStraight: 'Droite et parallèle',
322
+ tipNoTight: 'Sans serrer',
323
+ tipEndOfDay: 'En fin de journée',
324
+ recommendationTitle: 'Taille Recommandée',
325
+ recommendedSizePrefix: 'Nous recommandons la taille :',
326
+ measuredBy: 'Sur la base de vos mesures :',
327
+ chestShort: 'Poitrine',
328
+ waistShort: 'Taille',
329
+ hipShort: 'Hanches',
330
+ recommendationError: 'Veuillez remplir toutes les mesures pour obtenir une recommandation.',
331
+ recommendationNoData: 'Aucune donnée disponible pour cette catégorie.',
332
+ fitGuideTitle: 'Guide de Coupe par Marque',
333
+ fitSmall: 'Petite Taille',
334
+ fitRegular: 'Taille Normale',
335
+ fitLarge: 'Grande Taille',
336
+ fitInfoDefault: 'Cliquez sur une marque pour obtenir des recommandations spécifiques.',
337
+ fitNotif1: ' taille généralement ',
338
+ fitNotifSmall: 'petit',
339
+ fitNotifRegular: 'normal',
340
+ fitNotifLarge: 'grand',
341
+ fitNotif2: 'Prenez',
342
+ fitNotif3: "si c'est la première fois que vous achetez dans cette marque.",
343
+ fitAdviceSmall: 'une taille au-dessus',
344
+ fitAdviceRegular: 'votre taille habituelle',
345
+ fitAdviceLarge: 'une taille en dessous',
346
+ fitSelectedSuffix: 'sélectionnée. Sélectionnez une autre marque pour comparer.',
347
+ infoBannerTitle: 'Conseil Pro :',
348
+ infoBannerText:
349
+ "Les tailles de vêtements varient considérablement selon les marques. Consultez toujours le guide des tailles spécifique du magasin avant d'acheter.",
350
+ shirtsData,
351
+ pantsData,
352
+ dressesData,
353
+ jacketsData,
354
+ measurementRanges,
355
+ },
356
+ };
@@ -0,0 +1,34 @@
1
+ import type { TextilesToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
+ import ClothingSizeConverterComponent from './component.astro';
3
+ import ClothingSizeConverterSEO from './seo.astro';
4
+ import ClothingSizeConverterBibliography from './bibliography.astro';
5
+
6
+ import type { ClothingSizeConverterUI } from './ui';
7
+
8
+ export type ClothingSizeConverterLocaleContent = ToolLocaleContent<ClothingSizeConverterUI>;
9
+
10
+ import { content as es } from './i18n/es';
11
+ import { content as en } from './i18n/en';
12
+ import { content as fr } from './i18n/fr';
13
+
14
+ export const clothingSizeConverter: TextilesToolEntry<ClothingSizeConverterUI> = {
15
+ id: 'clothing-size-converter',
16
+ icons: {
17
+ bg: 'mdi:tshirt-crew',
18
+ fg: 'mdi:ruler',
19
+ },
20
+ i18n: {
21
+ es: async () => es,
22
+ en: async () => en,
23
+ fr: async () => fr,
24
+ },
25
+ };
26
+
27
+ export { ClothingSizeConverterComponent, ClothingSizeConverterSEO, ClothingSizeConverterBibliography };
28
+
29
+ export const CLOTHING_SIZE_CONVERTER_TOOL: ToolDefinition = {
30
+ entry: clothingSizeConverter,
31
+ Component: ClothingSizeConverterComponent,
32
+ SEOComponent: ClothingSizeConverterSEO,
33
+ BibliographyComponent: ClothingSizeConverterBibliography,
34
+ };
@@ -0,0 +1,30 @@
1
+ export type SizeData = Record<string, string>;
2
+ export type ClothingRegion = 'EU' | 'US' | 'UK' | 'IT';
3
+
4
+ export interface MeasurementRange {
5
+ size: string;
6
+ chest: number;
7
+ waist: number;
8
+ hip: number;
9
+ }
10
+
11
+ export function findBestSize(
12
+ chest: number,
13
+ waist: number,
14
+ hip: number,
15
+ ranges: MeasurementRange[],
16
+ ): MeasurementRange {
17
+ let best = ranges[0];
18
+ let bestScore = Infinity;
19
+ for (const range of ranges) {
20
+ const score =
21
+ Math.abs(chest - range.chest) +
22
+ Math.abs(waist - range.waist) +
23
+ Math.abs(hip - range.hip);
24
+ if (score < bestScore) {
25
+ bestScore = score;
26
+ best = range;
27
+ }
28
+ }
29
+ return best;
30
+ }
@@ -0,0 +1,40 @@
1
+ ---
2
+ import {
3
+ SEOTitle,
4
+ SEOCard,
5
+ SEOTip,
6
+ SEOList,
7
+ SEOArticle
8
+ } from '@jjlmoya/utils-shared';
9
+ import { clothingSizeConverter } from './index';
10
+ import type { KnownLocale } from '../../types';
11
+
12
+ interface Props {
13
+ locale?: KnownLocale;
14
+ }
15
+
16
+ const { locale = 'es' } = Astro.props;
17
+ const content = await clothingSizeConverter.i18n[locale]?.();
18
+ if (!content) return null;
19
+
20
+ const { seo } = content;
21
+ ---
22
+
23
+ <SEOArticle>
24
+ {seo.map((section: any) => {
25
+ switch (section.type) {
26
+ case 'title':
27
+ return <SEOTitle title={section.text} level={section.level || 2} />;
28
+ case 'paragraph':
29
+ return <p set:html={section.html} />;
30
+ case 'list':
31
+ return <SEOList items={section.items} />;
32
+ case 'card':
33
+ return <SEOCard title={section.title} icon={section.icon}><Fragment set:html={section.html} /></SEOCard>;
34
+ case 'tip':
35
+ return <SEOTip title={section.title}><Fragment set:html={section.html} /></SEOTip>;
36
+ default:
37
+ return null;
38
+ }
39
+ })}
40
+ </SEOArticle>
@@ -0,0 +1,70 @@
1
+ import type { SizeData, MeasurementRange } from './logic';
2
+
3
+ export interface ClothingSizeConverterUI {
4
+ categoryLabel: string;
5
+ categoryShirts: string;
6
+ categoryPants: string;
7
+ categoryDresses: string;
8
+ categoryJackets: string;
9
+ genderLabel: string;
10
+ genderMen: string;
11
+ genderWomen: string;
12
+ genderUnisex: string;
13
+ tabBySize: string;
14
+ tabByMeasurements: string;
15
+ regionLabel: string;
16
+ sizeLabel: string;
17
+ regionEU: string;
18
+ regionUS: string;
19
+ regionUK: string;
20
+ regionIT: string;
21
+ labelEU: string;
22
+ labelUS: string;
23
+ labelUK: string;
24
+ labelIT: string;
25
+ quickGridTitle: string;
26
+ tableTitle: string;
27
+ measurementsTitle: string;
28
+ chestLabel: string;
29
+ waistLabel: string;
30
+ hipLabel: string;
31
+ chestPlaceholder: string;
32
+ waistPlaceholder: string;
33
+ hipPlaceholder: string;
34
+ recommendBtnLabel: string;
35
+ tipsTitle: string;
36
+ tipOverClothes: string;
37
+ tipStraight: string;
38
+ tipNoTight: string;
39
+ tipEndOfDay: string;
40
+ recommendationTitle: string;
41
+ recommendedSizePrefix: string;
42
+ measuredBy: string;
43
+ chestShort: string;
44
+ waistShort: string;
45
+ hipShort: string;
46
+ recommendationError: string;
47
+ recommendationNoData: string;
48
+ fitGuideTitle: string;
49
+ fitSmall: string;
50
+ fitRegular: string;
51
+ fitLarge: string;
52
+ fitInfoDefault: string;
53
+ fitNotif1: string;
54
+ fitNotifSmall: string;
55
+ fitNotifRegular: string;
56
+ fitNotifLarge: string;
57
+ fitNotif2: string;
58
+ fitNotif3: string;
59
+ fitAdviceSmall: string;
60
+ fitAdviceRegular: string;
61
+ fitAdviceLarge: string;
62
+ fitSelectedSuffix: string;
63
+ infoBannerTitle: string;
64
+ infoBannerText: string;
65
+ shirtsData: Record<string, SizeData[]>;
66
+ pantsData: Record<string, SizeData[]>;
67
+ dressesData: Record<string, SizeData[]>;
68
+ jacketsData: Record<string, SizeData[]>;
69
+ measurementRanges: Record<string, MeasurementRange[]>;
70
+ }
@@ -0,0 +1,19 @@
1
+ ---
2
+ ---
3
+ <ul>
4
+ <li>
5
+ <a href="https://www.threadsmagazine.com/forum/measuring-fabric" target="_blank" rel="noopener noreferrer">
6
+ Fabric Estimation Guide - Threads Magazine
7
+ </a>
8
+ </li>
9
+ <li>
10
+ <a href="https://www.seamwork.com/sewing-tutorials/the-anatomy-of-a-sewing-pattern" target="_blank" rel="noopener noreferrer">
11
+ How much fabric do I need? - Seamwork
12
+ </a>
13
+ </li>
14
+ <li>
15
+ <a href="https://www.textileschool.com/209/fabric-consumption-in-garment-making/" target="_blank" rel="noopener noreferrer">
16
+ Standard Fabric Consumption Charts - Textile School
17
+ </a>
18
+ </li>
19
+ </ul>