@jjlmoya/utils-travel 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 (58) hide show
  1. package/package.json +60 -0
  2. package/src/category/i18n/en.ts +185 -0
  3. package/src/category/i18n/es.ts +187 -0
  4. package/src/category/i18n/fr.ts +100 -0
  5. package/src/category/index.ts +12 -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 +15 -0
  10. package/src/env.d.ts +5 -0
  11. package/src/index.ts +22 -0
  12. package/src/layouts/PreviewLayout.astro +117 -0
  13. package/src/pages/[locale]/[slug].astro +146 -0
  14. package/src/pages/[locale].astro +278 -0
  15. package/src/pages/index.astro +4 -0
  16. package/src/tests/faq_count.test.ts +8 -0
  17. package/src/tests/locale_completeness.test.ts +21 -0
  18. package/src/tests/mocks/astro_mock.js +2 -0
  19. package/src/tests/no_h1_in_components.test.ts +8 -0
  20. package/src/tests/seo_length.test.ts +8 -0
  21. package/src/tests/tool_validation.test.ts +17 -0
  22. package/src/tool/luggage-calculator/bibliography.astro +14 -0
  23. package/src/tool/luggage-calculator/component.astro +560 -0
  24. package/src/tool/luggage-calculator/i18n/en.ts +617 -0
  25. package/src/tool/luggage-calculator/i18n/es.ts +617 -0
  26. package/src/tool/luggage-calculator/i18n/fr.ts +549 -0
  27. package/src/tool/luggage-calculator/index.ts +53 -0
  28. package/src/tool/luggage-calculator/seo.astro +14 -0
  29. package/src/tool/mini-adventures/bibliography.astro +14 -0
  30. package/src/tool/mini-adventures/component.astro +665 -0
  31. package/src/tool/mini-adventures/i18n/en.ts +161 -0
  32. package/src/tool/mini-adventures/i18n/es.ts +286 -0
  33. package/src/tool/mini-adventures/i18n/fr.ts +144 -0
  34. package/src/tool/mini-adventures/index.ts +70 -0
  35. package/src/tool/mini-adventures/seo.astro +14 -0
  36. package/src/tool/optimal-routes/bibliography.astro +14 -0
  37. package/src/tool/optimal-routes/component.astro +439 -0
  38. package/src/tool/optimal-routes/i18n/en.ts +42 -0
  39. package/src/tool/optimal-routes/i18n/es.ts +52 -0
  40. package/src/tool/optimal-routes/index.ts +63 -0
  41. package/src/tool/optimal-routes/lib/RouteManager.ts +181 -0
  42. package/src/tool/optimal-routes/seo.astro +14 -0
  43. package/src/tool/suitcase-checklist/bibliography.astro +14 -0
  44. package/src/tool/suitcase-checklist/component.astro +710 -0
  45. package/src/tool/suitcase-checklist/i18n/en.ts +261 -0
  46. package/src/tool/suitcase-checklist/i18n/es.ts +261 -0
  47. package/src/tool/suitcase-checklist/i18n/fr.ts +259 -0
  48. package/src/tool/suitcase-checklist/index.ts +75 -0
  49. package/src/tool/suitcase-checklist/seo.astro +14 -0
  50. package/src/tool/tip-calculator/bibliography.astro +14 -0
  51. package/src/tool/tip-calculator/component.astro +683 -0
  52. package/src/tool/tip-calculator/i18n/en.ts +264 -0
  53. package/src/tool/tip-calculator/i18n/es.ts +264 -0
  54. package/src/tool/tip-calculator/i18n/fr.ts +264 -0
  55. package/src/tool/tip-calculator/index.ts +53 -0
  56. package/src/tool/tip-calculator/seo.astro +14 -0
  57. package/src/tools.ts +13 -0
  58. package/src/types.ts +73 -0
@@ -0,0 +1,549 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
+
4
+ const slug = 'calculateur-bagages-cabine';
5
+ const title = 'Calculateur de Bagages Cabine : Mesures par Compagnie 2026';
6
+ const description = 'Consultez les dimensions et le poids autorisés pour votre bagage cabine et votre accessoire personnel sur toutes les compagnies aériennes. Évitez les surtaxes à l\'aéroport.';
7
+
8
+ const ui: LuggageCalculatorUI = {
9
+ title: "Mesures par Compagnie",
10
+ searchLabel: 'Recherchez votre compagnie',
11
+ searchPlaceholder: 'Recherchez votre compagnie...',
12
+ personalItemTitle: 'Petit Sac',
13
+ cabinBagTitle: 'Valise Cabine',
14
+ weightLabel: 'Poids Max',
15
+ noResults: 'Nous n\'avons pas trouvé cette compagnie. Essayez la recherche globale.',
16
+ modalNoteTitle: 'Note importante :',
17
+ modalNoteText: 'Certaines compagnies low-cost n\'autorisent la valise cabine que sous le siège si le service "Priorité" n\'a pas été souscrit.',
18
+ personalItemDetail: 'Sac sous le siège',
19
+ cabinBagDetail: 'Bagage à main',
20
+ airlines: [
21
+ {
22
+ name: "Ryanair",
23
+ personal: "40 x 20 x 25 cm",
24
+ personalWeight: "Sans limite",
25
+ cabin: "55 x 40 x 20 cm",
26
+ cabinWeight: "10 kg",
27
+ icon: "mdi:airplane",
28
+ },
29
+ {
30
+ name: "Vueling",
31
+ personal: "40 x 20 x 30 cm",
32
+ personalWeight: "Sans limite",
33
+ cabin: "55 x 40 x 20 cm",
34
+ cabinWeight: "10 kg",
35
+ icon: "mdi:airplane",
36
+ },
37
+ {
38
+ name: "Iberia / Air Nostrum",
39
+ personal: "40 x 30 x 15 cm",
40
+ personalWeight: "Sans limite",
41
+ cabin: "56 x 40 x 25 cm",
42
+ cabinWeight: "10 kg",
43
+ icon: "mdi:airplane",
44
+ },
45
+ {
46
+ name: "EasyJet",
47
+ personal: "45 x 36 x 20 cm",
48
+ personalWeight: "15 kg",
49
+ cabin: "56 x 45 x 25 cm",
50
+ cabinWeight: "15 kg",
51
+ icon: "mdi:airplane",
52
+ },
53
+ {
54
+ name: "Air Europa",
55
+ personal: "40 x 30 x 15 cm",
56
+ personalWeight: "Sans limite",
57
+ cabin: "55 x 35 x 25 cm",
58
+ cabinWeight: "10 kg",
59
+ icon: "mdi:airplane",
60
+ },
61
+ {
62
+ name: "Air France",
63
+ personal: "40 x 30 x 15 cm",
64
+ personalWeight: "12 kg (total)",
65
+ cabin: "55 x 35 x 25 cm",
66
+ cabinWeight: "12 kg (total)",
67
+ icon: "mdi:airplane",
68
+ },
69
+ {
70
+ name: "Lufthansa",
71
+ personal: "40 x 30 x 10 cm",
72
+ personalWeight: "Sans limite",
73
+ cabin: "55 x 40 x 23 cm",
74
+ cabinWeight: "8 kg",
75
+ icon: "mdi:airplane",
76
+ },
77
+ {
78
+ name: "British Airways",
79
+ personal: "40 x 30 x 15 cm",
80
+ personalWeight: "23 kg",
81
+ cabin: "56 x 45 x 25 cm",
82
+ cabinWeight: "23 kg",
83
+ icon: "mdi:airplane",
84
+ },
85
+ {
86
+ name: "KLM",
87
+ personal: "40 x 30 x 15 cm",
88
+ personalWeight: "12 kg (total)",
89
+ cabin: "55 x 35 x 25 cm",
90
+ cabinWeight: "12 kg (total)",
91
+ icon: "mdi:airplane",
92
+ },
93
+ {
94
+ name: "Swiss",
95
+ personal: "40 x 30 x 10 cm",
96
+ personalWeight: "Sans limite",
97
+ cabin: "55 x 40 x 23 cm",
98
+ cabinWeight: "8 kg",
99
+ icon: "mdi:airplane",
100
+ },
101
+ {
102
+ name: "Norwegian",
103
+ personal: "30 x 20 x 38 cm",
104
+ personalWeight: "10 kg (total)",
105
+ cabin: "55 x 40 x 23 cm",
106
+ cabinWeight: "10 kg (total)",
107
+ icon: "mdi:airplane",
108
+ },
109
+ {
110
+ name: "TAP Air Portugal",
111
+ personal: "40 x 30 x 15 cm",
112
+ personalWeight: "2 kg",
113
+ cabin: "55 x 40 x 20 cm",
114
+ cabinWeight: "8 kg",
115
+ icon: "mdi:airplane",
116
+ },
117
+ {
118
+ name: "Volotea",
119
+ personal: "40 x 30 x 20 cm",
120
+ personalWeight: "Sans limite",
121
+ cabin: "55 x 40 x 20 cm",
122
+ cabinWeight: "10 kg (total)",
123
+ icon: "mdi:airplane",
124
+ },
125
+ {
126
+ name: "Emirates",
127
+ personal: "En cabine",
128
+ personalWeight: "-",
129
+ cabin: "55 x 38 x 20 cm",
130
+ cabinWeight: "7 kg",
131
+ icon: "mdi:airplane",
132
+ },
133
+ {
134
+ name: "Qatar Airways",
135
+ personal: "En cabine",
136
+ personalWeight: "-",
137
+ cabin: "50 x 37 x 25 cm",
138
+ cabinWeight: "7 kg",
139
+ icon: "mdi:airplane",
140
+ },
141
+ {
142
+ name: "Turkish Airlines",
143
+ personal: "40 x 30 x 15 cm",
144
+ personalWeight: "4 kg",
145
+ cabin: "55 x 40 x 23 cm",
146
+ cabinWeight: "8 kg",
147
+ icon: "mdi:airplane",
148
+ },
149
+ {
150
+ name: "American Airlines",
151
+ personal: "45 x 35 x 20 cm",
152
+ personalWeight: "Sans limite",
153
+ cabin: "56 x 36 x 23 cm",
154
+ cabinWeight: "Sans limite",
155
+ icon: "mdi:airplane",
156
+ },
157
+ {
158
+ name: "Delta Air Lines",
159
+ personal: "Sous le siège",
160
+ personalWeight: "-",
161
+ cabin: "56 x 35 x 23 cm",
162
+ cabinWeight: "Sans limite",
163
+ icon: "mdi:airplane",
164
+ },
165
+ {
166
+ name: "United Airlines",
167
+ personal: "43 x 25 x 22 cm",
168
+ personalWeight: "Sans limite",
169
+ cabin: "56 x 35 x 22 cm",
170
+ cabinWeight: "Sans limite",
171
+ icon: "mdi:airplane",
172
+ },
173
+ {
174
+ name: "Southwest Airlines",
175
+ personal: "47 x 34 x 21 cm",
176
+ personalWeight: "Sans limite",
177
+ cabin: "61 x 40 x 25 cm",
178
+ cabinWeight: "Sans limite",
179
+ icon: "mdi:airplane",
180
+ },
181
+ {
182
+ name: "JetBlue",
183
+ personal: "43 x 33 x 20 cm",
184
+ personalWeight: "Sans limite",
185
+ cabin: "56 x 35 x 23 cm",
186
+ cabinWeight: "Sans limite",
187
+ icon: "mdi:airplane",
188
+ },
189
+ {
190
+ name: "Air Canada",
191
+ personal: "43 x 33 x 16 cm",
192
+ personalWeight: "Sans limite",
193
+ cabin: "55 x 40 x 23 cm",
194
+ cabinWeight: "10 kg",
195
+ icon: "mdi:airplane",
196
+ },
197
+ {
198
+ name: "Avianca",
199
+ personal: "45 x 35 x 25 cm",
200
+ personalWeight: "Sans limite",
201
+ cabin: "55 x 35 x 25 cm",
202
+ cabinWeight: "10 kg",
203
+ icon: "mdi:airplane",
204
+ },
205
+ {
206
+ name: "LATAM",
207
+ personal: "45 x 35 x 20 cm",
208
+ personalWeight: "Sans limite",
209
+ cabin: "55 x 35 x 25 cm",
210
+ cabinWeight: "10 kg",
211
+ icon: "mdi:airplane",
212
+ },
213
+ {
214
+ name: "Aerolineas Argentinas",
215
+ personal: "40 x 30 x 15 cm",
216
+ personalWeight: "Sans limite",
217
+ cabin: "55 x 35 x 25 cm",
218
+ cabinWeight: "8 kg",
219
+ icon: "mdi:airplane",
220
+ },
221
+ {
222
+ name: "Japan Airlines (JAL)",
223
+ personal: "40 x 30 x 15 cm",
224
+ personalWeight: "Sans limite",
225
+ cabin: "55 x 40 x 25 cm",
226
+ cabinWeight: "10 kg",
227
+ icon: "mdi:airplane",
228
+ },
229
+ {
230
+ name: "Singapore Airlines",
231
+ personal: "Sous le siège",
232
+ personalWeight: "Sans limite",
233
+ cabin: "55 x 40 x 20 cm",
234
+ cabinWeight: "7 kg",
235
+ icon: "mdi:airplane",
236
+ },
237
+ {
238
+ name: "Qantas",
239
+ personal: "Sous le siège",
240
+ personalWeight: "Sans limite",
241
+ cabin: "56 x 36 x 23 cm",
242
+ cabinWeight: "7 kg",
243
+ icon: "mdi:airplane",
244
+ },
245
+ {
246
+ name: "Finnair",
247
+ personal: "40 x 30 x 15 cm",
248
+ personalWeight: "Sans limite",
249
+ cabin: "55 x 40 x 23 cm",
250
+ cabinWeight: "8 kg",
251
+ icon: "mdi:airplane",
252
+ },
253
+ {
254
+ name: "ITA Airways",
255
+ personal: "45 x 36 x 20 cm",
256
+ personalWeight: "Sans limite",
257
+ cabin: "55 x 35 x 25 cm",
258
+ cabinWeight: "8 kg",
259
+ icon: "mdi:airplane",
260
+ },
261
+ {
262
+ name: "Air New Zealand",
263
+ personal: "Sous le siège",
264
+ personalWeight: "-",
265
+ cabin: "56 x 36 x 23 cm",
266
+ cabinWeight: "7 kg",
267
+ icon: "mdi:airplane",
268
+ },
269
+ {
270
+ name: "Cathay Pacific",
271
+ personal: "40 x 30 x 15 cm",
272
+ personalWeight: "Sans limite",
273
+ cabin: "56 x 36 x 23 cm",
274
+ cabinWeight: "7 kg",
275
+ icon: "mdi:airplane",
276
+ },
277
+ {
278
+ name: "Eva Air",
279
+ personal: "40 x 30 x 15 cm",
280
+ personalWeight: "Sans limite",
281
+ cabin: "56 x 36 x 23 cm",
282
+ cabinWeight: "7 kg",
283
+ icon: "mdi:airplane",
284
+ },
285
+ {
286
+ name: "Thai Airways",
287
+ personal: "Sous le siège",
288
+ personalWeight: "-",
289
+ cabin: "56 x 45 x 25 cm",
290
+ cabinWeight: "7 kg",
291
+ icon: "mdi:airplane",
292
+ },
293
+ {
294
+ name: "ANA (All Nippon Airways)",
295
+ personal: "Sous le siège",
296
+ personalWeight: "-",
297
+ cabin: "55 x 40 x 25 cm",
298
+ cabinWeight: "10 kg",
299
+ icon: "mdi:airplane",
300
+ },
301
+ {
302
+ name: "Korean Air",
303
+ personal: "40 x 30 x 15 cm",
304
+ personalWeight: "Sans limite",
305
+ cabin: "55 x 40 x 20 cm",
306
+ cabinWeight: "10 kg",
307
+ icon: "mdi:airplane",
308
+ },
309
+ {
310
+ name: "Aeroméxico",
311
+ personal: "45 x 35 x 20 cm",
312
+ personalWeight: "Sans limite",
313
+ cabin: "55 x 35 x 25 cm",
314
+ cabinWeight: "10 kg",
315
+ icon: "mdi:airplane",
316
+ },
317
+ {
318
+ name: "Copa Airlines",
319
+ personal: "43 x 25 x 22 cm",
320
+ personalWeight: "Sans limite",
321
+ cabin: "56 x 36 x 23 cm",
322
+ cabinWeight: "10 kg",
323
+ icon: "mdi:airplane",
324
+ },
325
+ {
326
+ name: "Air India",
327
+ personal: "Dimensions personnelles",
328
+ personalWeight: "-",
329
+ cabin: "55 x 35 x 25 cm",
330
+ cabinWeight: "8 kg",
331
+ icon: "mdi:airplane",
332
+ },
333
+ {
334
+ name: "Ethiopian Airlines",
335
+ personal: "Sous le siège",
336
+ personalWeight: "-",
337
+ cabin: "55 x 40 x 23 cm",
338
+ cabinWeight: "7 kg",
339
+ icon: "mdi:airplane",
340
+ },
341
+ {
342
+ name: "Kenya Airways",
343
+ personal: "Sous le siège",
344
+ personalWeight: "-",
345
+ cabin: "55 x 35 x 25 cm",
346
+ cabinWeight: "12 kg",
347
+ icon: "mdi:airplane",
348
+ },
349
+ {
350
+ name: "Jetstar",
351
+ personal: "Sous le siège",
352
+ personalWeight: "7 kg (total)",
353
+ cabin: "56 x 36 x 23 cm",
354
+ cabinWeight: "7 kg (total)",
355
+ icon: "mdi:airplane",
356
+ },
357
+ {
358
+ name: "Lion Air",
359
+ personal: "Dimensions réduites",
360
+ personalWeight: "-",
361
+ cabin: "40 x 30 x 20 cm",
362
+ cabinWeight: "7 kg",
363
+ icon: "mdi:airplane",
364
+ },
365
+ {
366
+ name: "China Southern Airlines",
367
+ personal: "Sous le siège",
368
+ personalWeight: "-",
369
+ cabin: "55 x 40 x 20 cm",
370
+ cabinWeight: "5 kg",
371
+ icon: "mdi:airplane",
372
+ },
373
+ ],
374
+
375
+ };
376
+
377
+ const faq: LuggageCalculatorLocaleContent['faq'] = [
378
+ {
379
+ question: "Que se passe-t-il si ma valise dépasse les mesures de 1 ou 2 cm ?",
380
+ answer: "Cela dépend de la compagnie et du personnel de porte. Les compagnies low-cost utilisent souvent un gabarit métallique ; si la valise n'y entre pas librement, vous devrez payer un supplément en porte, généralement entre 45€ et 65€.",
381
+ },
382
+ {
383
+ question: "Puis-je emporter un sac à dos et une valise cabine gratuitement ?",
384
+ answer: "Sur des compagnies comme Air France ou Lufthansa, oui. Sur des compagnies comme Ryanair ou Vueling (tarif de base), vous ne pouvez emporter qu'un petit sac sous le siège.",
385
+ },
386
+ ];
387
+
388
+ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
389
+ {
390
+ name: "Recherchez votre compagnie",
391
+ text: "Utilisez notre moteur de recherche pour voir les limites spécifiques de votre transporteur.",
392
+ },
393
+ ];
394
+
395
+ const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
396
+ {
397
+ name: "AENA: Pasajeros y Equipajes",
398
+ url: "https://www.aena.es/es/pasajeros/pasajeros.html",
399
+ },
400
+ {
401
+ name: "Droits des Passagers Aériens - UE",
402
+ url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
403
+ },
404
+ {
405
+ name: "IATA: Passenger Baggage Rules",
406
+ url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
407
+ },
408
+ ];
409
+
410
+ const seo: LuggageCalculatorLocaleContent['seo'] = [
411
+ {
412
+ type: "title",
413
+ text: "Guide Complet des Dimensions des Bagages Cabine 2026",
414
+ level: 2,
415
+ },
416
+ {
417
+ type: "summary",
418
+ title: "Tout ce qu'il faut savoir avant de s'envoler",
419
+ items: [
420
+ "Guide actualisé des dimensions pour l'accessoire personnel et la valise cabine.",
421
+ "Comparaison des poids autorisés par compagnie (de 7kg à 23kg).",
422
+ "Différence entre article personnel, bagage à main et bagage enregistré.",
423
+ "Conseils pour éviter les suppléments à la porte d'embarquement.",
424
+ ],
425
+ },
426
+ {
427
+ type: "paragraph",
428
+ html: "Voyager aujourd'hui est devenu un véritable puzzle logistique. Ce qui était autrefois un standard universel (le sac de 10 kg) est devenu une jungle de mesures qui varient de quelques centimètres d'une compagnie à l'autre. Notre <strong>calculateur de bagages</strong> est né pour répondre à la question la plus répétée dans les aéroports : \"Vais-je payer un supplément pour ce sac ?\".",
429
+ },
430
+ {
431
+ type: "title",
432
+ text: "Article Personnel vs. Bagage Cabine",
433
+ level: 3,
434
+ },
435
+ {
436
+ type: "paragraph",
437
+ html: "Comprendre la hiérarchie moderne des bagages est vital. Depuis que le modèle *Low Cost* s'est imposé, la plupart des compagnies ont fragmenté ce que vous pouvez emporter dans l'avion. L'<strong>article personnel</strong> (petit sac à dos, sac à main ou sac d'ordinateur) est généralement le seul qui soit gratuit sur les tarifs de base, tandis que le <strong>bagage cabine</strong> (le trolley traditionnel) nécessite souvent un supplément.",
438
+ },
439
+ {
440
+ type: "comparative",
441
+ items: [
442
+ {
443
+ title: "Compagnies Low Cost",
444
+ description: "Règles strictes, n'autorisant généralement qu'un petit sac sous le siège gratuitement.",
445
+ icon: "mdi:tag-outline",
446
+ points: [
447
+ "Ryanair/Vueling : Bagage cabine payant",
448
+ "Dimensions surveillées avec gabarit",
449
+ "Poids maximum entre 8kg et 10kg",
450
+ "Suppléments élevés si vous dépassez la taille",
451
+ ],
452
+ },
453
+ {
454
+ title: "Compagnies Traditionnelles",
455
+ description: "Politiques plus flexibles, incluant généralement un bagage cabine dans presque tous les tarifs.",
456
+ icon: "mdi:airplane-takeoff",
457
+ highlight: true,
458
+ points: [
459
+ "Air France/Lufthansa : Bagage cabine inclus",
460
+ "Limites de poids plus élevées (jusqu'à 23kg chez BA)",
461
+ "Combinaison article personnel + bagage",
462
+ "Service d'enregistrement gratuit en porte si le vol est complet",
463
+ ],
464
+ },
465
+ ],
466
+ },
467
+ {
468
+ type: "title",
469
+ text: "Dimensions par Compagnie : Tableau Récapitulatif",
470
+ level: 3,
471
+ },
472
+ {
473
+ type: "table",
474
+ headers: ["Compagnie", "Petit Sac (Sous le siège)", "Bagage Cabine (Main)"],
475
+ rows: [
476
+ ["<strong>Ryanair</strong>", "40 x 20 x 25 cm", "55 x 40 x 20 cm (Payant)"],
477
+ ["<strong>Vueling</strong>", "40 x 20 x 30 cm", "55 x 40 x 20 cm (Payant)"],
478
+ ["<strong>Iberia</strong>", "40 x 30 x 15 cm", "56 x 40 x 25 cm (Gratuit)"],
479
+ ["<strong>Air France</strong>", "40 x 30 x 15 cm", "55 x 35 x 25 cm (Gratuit)"],
480
+ ["<strong>EasyJet</strong>", "45 x 36 x 20 cm", "56 x 45 x 25 cm (Priorité)"],
481
+ ["<strong>Lufthansa</strong>", "40 x 30 x 10 cm", "55 x 40 x 23 cm (Gratuit)"],
482
+ ["<strong>American Airlines</strong>", "45 x 35 x 20 cm", "56 x 36 x 23 cm (Gratuit)"],
483
+ ["<strong>Emirates</strong>", "40 x 30 x 15 cm", "55 x 38 x 20 cm (Gratuit)"],
484
+ ["<strong>Qatar Airways</strong>", "Sous le siège", "50 x 37 x 25 cm (Gratuit)"],
485
+ ],
486
+ },
487
+ {
488
+ type: "tip",
489
+ title: "L'Astuce du Poids",
490
+ html: "<p>De nombreuses compagnies comme Emirates ou Qatar sont très strictes sur le poids (7kg) mais plus détendues sur les mesures. D'autres comme British Airways autorisent jusqu'à 23kg tant que vous pouvez soulever le bagage vous-même. Pesez-le toujours chez vous !</p>",
491
+ },
492
+ {
493
+ type: "title",
494
+ text: "Conclusion : Voyagez sans Stress",
495
+ level: 3,
496
+ },
497
+ {
498
+ type: "paragraph",
499
+ html: "Vérifier les mesures de vos bagages avant de partir pour l'aéroport vous fera économiser non seulement de l'argent (les frais de porte dépassent souvent 50€), mais aussi le stress de commencer vos vacances par une dispute au comptoir.",
500
+ },
501
+ ];
502
+
503
+ const faqSchema: WithContext<FAQPage> = {
504
+ '@context': 'https://schema.org',
505
+ '@type': 'FAQPage',
506
+ mainEntity: faq.map((item: any) => ({
507
+ '@type': 'Question',
508
+ name: item.question,
509
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
510
+ })),
511
+ };
512
+
513
+ const howToSchema: WithContext<HowTo> = {
514
+ '@context': 'https://schema.org',
515
+ '@type': 'HowTo',
516
+ name: title,
517
+ description,
518
+ step: howTo.map((step: any) => ({
519
+ '@type': 'HowToStep',
520
+ name: step.name,
521
+ text: step.text,
522
+ })),
523
+ };
524
+
525
+ const appSchema: WithContext<SoftwareApplication> = {
526
+ '@context': 'https://schema.org',
527
+ '@type': 'SoftwareApplication',
528
+ name: title,
529
+ description,
530
+ applicationCategory: 'UtilitiesApplication',
531
+ operatingSystem: 'Web',
532
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
533
+ inLanguage: 'fr',
534
+ };
535
+
536
+ export const content: LuggageCalculatorLocaleContent = {
537
+ slug,
538
+ title,
539
+ description,
540
+ ui,
541
+ seo,
542
+ faq,
543
+ faqTitle: "Questions Fréquentes",
544
+ bibliography,
545
+ bibliographyTitle: "Sources et Références",
546
+ howTo,
547
+ howToTitle: "Comment utiliser le calculateur",
548
+ schemas: [faqSchema, howToSchema, appSchema],
549
+ };
@@ -0,0 +1,53 @@
1
+ import type { TravelToolEntry, ToolDefinition, ToolLocaleContent } from '../../types';
2
+ import LuggageCalculator from './component.astro';
3
+ import LuggageCalculatorSEO from './seo.astro';
4
+ import LuggageCalculatorBibliography from './bibliography.astro';
5
+
6
+ export interface Airline {
7
+ name: string;
8
+ personal: string;
9
+ personalWeight: string;
10
+ cabin: string;
11
+ cabinWeight: string;
12
+ icon: string;
13
+ }
14
+
15
+ export interface LuggageCalculatorUI {
16
+ [key: string]: unknown;
17
+ title: string;
18
+ searchLabel: string;
19
+ searchPlaceholder: string;
20
+ personalItemTitle: string;
21
+ cabinBagTitle: string;
22
+ weightLabel: string;
23
+ noResults: string;
24
+ modalNoteTitle: string;
25
+ modalNoteText: string;
26
+ personalItemDetail: string;
27
+ cabinBagDetail: string;
28
+ airlines: Airline[];
29
+ }
30
+
31
+ export type LuggageCalculatorLocaleContent = ToolLocaleContent<LuggageCalculatorUI>;
32
+
33
+ export const luggageCalculator: TravelToolEntry<LuggageCalculatorUI> = {
34
+ id: 'luggage-calculator',
35
+ icons: {
36
+ bg: 'mdi:bag-suitcase',
37
+ fg: 'mdi:airplane',
38
+ },
39
+ i18n: {
40
+ es: () => import('./i18n/es').then((m) => m.content),
41
+ en: () => import('./i18n/en').then((m) => m.content),
42
+ fr: () => import('./i18n/fr').then((m) => m.content),
43
+ },
44
+ };
45
+
46
+ export { LuggageCalculator, LuggageCalculatorSEO, LuggageCalculatorBibliography };
47
+
48
+ export const LUGGAGE_CALCULATOR_TOOL: ToolDefinition = {
49
+ entry: luggageCalculator,
50
+ Component: LuggageCalculator,
51
+ SEOComponent: LuggageCalculatorSEO,
52
+ BibliographyComponent: LuggageCalculatorBibliography,
53
+ };
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { SEORenderer } from "@jjlmoya/utils-shared";
3
+ import { luggageCalculator } from "./index";
4
+ import type { KnownLocale } from "../../types";
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = "es" } = Astro.props;
11
+ const content = await luggageCalculator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from "@jjlmoya/utils-shared";
3
+ import { miniAdventures } from "./index";
4
+ import type { KnownLocale } from "../../types";
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = "es" } = Astro.props;
11
+ const content = await miniAdventures.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}