@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,617 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { LuggageCalculatorUI, LuggageCalculatorLocaleContent } from '../index';
3
+
4
+ const slug = 'airline-luggage-calculator';
5
+ const title = 'Carry-on Luggage Calculator: Airline Measurements 2026';
6
+ const description = 'Check the dimensions and weight allowed for your carry-on suitcase and personal item on Ryanair, Vueling, Iberia, and +30 airlines. Avoid surcharges!';
7
+
8
+ const ui: LuggageCalculatorUI = {
9
+ title: "Carry-on Luggage Calculator",
10
+ searchLabel: 'Search your airline',
11
+ searchPlaceholder: 'Search your airline...',
12
+ personalItemTitle: 'Personal Item',
13
+ cabinBagTitle: 'Cabin Bag',
14
+ weightLabel: 'Max Weight',
15
+ noResults: 'We couldn\'t find that airline. Try the global search.',
16
+ modalNoteTitle: 'Important Note:',
17
+ modalNoteText: 'Some low-cost airlines only allow the cabin suitcase under the seat if "Priority" or an additional suitcase service has not been contracted.',
18
+ personalItemDetail: 'Under-Seat Bag',
19
+ cabinBagDetail: 'Carry-on Suitcase',
20
+ airlines: [
21
+ {
22
+ name: "Ryanair",
23
+ personal: "40 x 20 x 25 cm",
24
+ personalWeight: "No limit",
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: "No limit",
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: "No limit",
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: "No limit",
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: "No limit",
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: "No limit",
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: "No limit",
121
+ cabin: "55 x 40 x 20 cm",
122
+ cabinWeight: "10 kg (total)",
123
+ icon: "mdi:airplane",
124
+ },
125
+ {
126
+ name: "Emirates",
127
+ personal: "Included in cabin",
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: "Included in cabin",
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: "No limit",
153
+ cabin: "56 x 36 x 23 cm",
154
+ cabinWeight: "No limit",
155
+ icon: "mdi:airplane",
156
+ },
157
+ {
158
+ name: "Delta Air Lines",
159
+ personal: "Under seat",
160
+ personalWeight: "-",
161
+ cabin: "56 x 35 x 23 cm",
162
+ cabinWeight: "No limit",
163
+ icon: "mdi:airplane",
164
+ },
165
+ {
166
+ name: "United Airlines",
167
+ personal: "43 x 25 x 22 cm",
168
+ personalWeight: "No limit",
169
+ cabin: "56 x 35 x 22 cm",
170
+ cabinWeight: "No limit",
171
+ icon: "mdi:airplane",
172
+ },
173
+ {
174
+ name: "Southwest Airlines",
175
+ personal: "47 x 34 x 21 cm",
176
+ personalWeight: "No limit",
177
+ cabin: "61 x 40 x 25 cm",
178
+ cabinWeight: "No limit",
179
+ icon: "mdi:airplane",
180
+ },
181
+ {
182
+ name: "JetBlue",
183
+ personal: "43 x 33 x 20 cm",
184
+ personalWeight: "No limit",
185
+ cabin: "56 x 35 x 23 cm",
186
+ cabinWeight: "No limit",
187
+ icon: "mdi:airplane",
188
+ },
189
+ {
190
+ name: "Air Canada",
191
+ personal: "43 x 33 x 16 cm",
192
+ personalWeight: "No limit",
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: "No limit",
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: "No limit",
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: "No limit",
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: "No limit",
225
+ cabin: "55 x 40 x 25 cm",
226
+ cabinWeight: "10 kg",
227
+ icon: "mdi:airplane",
228
+ },
229
+ {
230
+ name: "Singapore Airlines",
231
+ personal: "Under seat",
232
+ personalWeight: "No limit",
233
+ cabin: "55 x 40 x 20 cm",
234
+ cabinWeight: "7 kg",
235
+ icon: "mdi:airplane",
236
+ },
237
+ {
238
+ name: "Qantas",
239
+ personal: "Under seat",
240
+ personalWeight: "No limit",
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: "No limit",
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: "No limit",
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: "Under seat",
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: "No limit",
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: "No limit",
281
+ cabin: "56 x 36 x 23 cm",
282
+ cabinWeight: "7 kg",
283
+ icon: "mdi:airplane",
284
+ },
285
+ {
286
+ name: "Thai Airways",
287
+ personal: "Under seat",
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: "Under seat",
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: "No limit",
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: "No limit",
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: "No limit",
321
+ cabin: "56 x 36 x 23 cm",
322
+ cabinWeight: "10 kg",
323
+ icon: "mdi:airplane",
324
+ },
325
+ {
326
+ name: "Air India",
327
+ personal: "Personal item dimensions",
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: "Under seat",
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: "Under seat",
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: "Under seat",
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: "Reduced dimensions",
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: "Under seat",
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: "What happens if my suitcase exceeds the measurements by 1 or 2 cm?",
380
+ answer: "It depends on the airline and the gate staff. Low-cost airlines usually use a metal measuring box; if the suitcase does not enter freely (including wheels), they will charge you the gate check-in fee, which usually ranges between €45 and €65.",
381
+ },
382
+ {
383
+ question: "Can I bring a backpack and a carry-on for free?",
384
+ answer: "On airlines like Iberia, British Airways, or Lufthansa, yes. On airlines like Ryanair or Vueling (basic fare), you can only bring a small item that fits under the seat. To take the carry-on suitcase in the cabin, you must pay for the 'Priority' extra.",
385
+ },
386
+ {
387
+ question: "Do wheels count in luggage measurements?",
388
+ answer: "Yes, always. Official airline measurements (e.g., 55x40x20) are total dimensions. If your suitcase measures 55cm in body but the wheels add another 3cm, you are legally exceeding the limit.",
389
+ },
390
+ {
391
+ question: "Is there a weight limit for the personal item under the seat?",
392
+ answer: "Most airlines do not usually weigh the small personal item, as long as it maintains reasonable dimensions and fits under the seat. However, some like EasyJet set a limit of 15kg for all combined carry-on luggage.",
393
+ },
394
+ ];
395
+
396
+ const howTo: LuggageCalculatorLocaleContent['howTo'] = [
397
+ {
398
+ name: "Search for your airline",
399
+ text: "Type the name of the airline you are flying with in our search engine to see its specific limits.",
400
+ },
401
+ {
402
+ name: "Measure your suitcase at home",
403
+ text: "Use a measuring tape to measure the height (including wheels), width, and depth of your luggage.",
404
+ },
405
+ {
406
+ name: "Check the weight",
407
+ text: "Use a luggage scale or a domestic one to ensure you do not exceed the allowed kilos (usually 8kg or 10kg).",
408
+ },
409
+ ];
410
+
411
+ const bibliography: LuggageCalculatorLocaleContent['bibliography'] = [
412
+ {
413
+ name: "AENA: Passengers and Baggage",
414
+ url: "https://www.aena.es/es/pasajeros/pasajeros.html",
415
+ },
416
+ {
417
+ name: "Air Passenger Rights - EU",
418
+ url: "https://europa.eu/youreurope/citizens/travel/passenger-rights/air/index_es.htm",
419
+ },
420
+ {
421
+ name: "IATA: Passenger Baggage Rules",
422
+ url: "https://www.iata.org/en/programs/ops-infra/baggage/passenger-baggage-rules/",
423
+ },
424
+ ];
425
+
426
+ const seo: LuggageCalculatorLocaleContent['seo'] = [
427
+ {
428
+ type: "title",
429
+ text: "Complete Guide to Carry-on Luggage Dimensions 2026",
430
+ level: 2,
431
+ },
432
+ {
433
+ type: "summary",
434
+ title: "Everything you need to know before you fly",
435
+ items: [
436
+ "Updated guide to personal item and cabin bag dimensions.",
437
+ "Weight allowance comparison by airline (from 7kg to 23kg).",
438
+ "Difference between personal item, carry-on bag, and checked luggage.",
439
+ "Tips to avoid boarding gate surcharges.",
440
+ ],
441
+ },
442
+ {
443
+ type: "paragraph",
444
+ html: "Traveling today has become a logistical puzzle. What used to be a universal standard (the 10kg bag) is now a jungle of measurements that vary by a few centimeters between airlines. Our <strong>luggage calculator</strong> was born to answer the most repeated question at airports: \"Will I be charged for this bag?\".",
445
+ },
446
+ {
447
+ type: "title",
448
+ text: "Personal Item vs. Cabin Bag",
449
+ level: 3,
450
+ },
451
+ {
452
+ type: "paragraph",
453
+ html: "Understanding the modern luggage hierarchy is vital. Since the *Low Cost* model took over, most airlines have fragmented what you can take on the plane. The <strong>personal item</strong> (small backpack, purse, or laptop bag) is usually the only one that is free on basic fares, while the <strong>cabin bag</strong> (the traditional trolley) usually requires a supplement or is included in Priority.",
454
+ },
455
+ {
456
+ type: "comparative",
457
+ items: [
458
+ {
459
+ title: "Low Cost Airlines",
460
+ description: "Strict rules, usually only allowing one small bag under the seat for free.",
461
+ icon: "mdi:tag-outline",
462
+ points: [
463
+ "Ryanair/Vueling: Cabin bag is paid",
464
+ "Dimensions monitored with sizer box",
465
+ "Maximum weights between 8kg and 10kg",
466
+ "High surcharges if you exceed size",
467
+ ],
468
+ },
469
+ {
470
+ title: "Flat Carriers / Traditional",
471
+ description: "More flexible policies, usually including a cabin bag in almost all fares.",
472
+ icon: "mdi:airplane-takeoff",
473
+ highlight: true,
474
+ points: [
475
+ "Iberia/Lufthansa: Cabin bag included",
476
+ "Higher weight limits (up to 23kg on BA)",
477
+ "Combination of personal item + bag",
478
+ "Free gate checking service if flight is full",
479
+ ],
480
+ },
481
+ ],
482
+ },
483
+ {
484
+ type: "title",
485
+ text: "Measurements by Airline: Reference Table",
486
+ level: 3,
487
+ },
488
+ {
489
+ type: "paragraph",
490
+ html: "Although you can use our interactive search, here is a summary of the most common policies for quick planning:",
491
+ },
492
+ {
493
+ type: "table",
494
+ headers: ["Airline", "Personal Item (Under seat)", "Cabin Bag (Hand)"],
495
+ rows: [
496
+ ["<strong>Ryanair</strong>", "40 x 20 x 25 cm", "55 x 40 x 20 cm (Paid)"],
497
+ ["<strong>Vueling</strong>", "40 x 20 x 30 cm", "55 x 40 x 20 cm (Paid)"],
498
+ ["<strong>Iberia</strong>", "40 x 30 x 15 cm", "56 x 40 x 25 cm (Free)"],
499
+ ["<strong>Air France</strong>", "40 x 30 x 15 cm", "55 x 35 x 25 cm (Free)"],
500
+ ["<strong>EasyJet</strong>", "45 x 36 x 20 cm", "56 x 45 x 25 cm (Priority)"],
501
+ ["<strong>Lufthansa</strong>", "40 x 30 x 10 cm", "55 x 40 x 23 cm (Free)"],
502
+ ["<strong>American Airlines</strong>", "45 x 35 x 20 cm", "56 x 36 x 23 cm (Free)"],
503
+ ["<strong>Emirates</strong>", "40 x 30 x 15 cm", "55 x 38 x 20 cm (Free)"],
504
+ ["<strong>Qatar Airways</strong>", "Under seat", "50 x 37 x 25 cm (Free)"],
505
+ ],
506
+ },
507
+ {
508
+ type: "tip",
509
+ title: "The Weight Trick",
510
+ html: "<p>Many airlines like Emirates or Qatar are very strict with weight (7kg) but more relaxed with measurements. Others like British Airways allow up to 23kg as long as you can lift the bag yourself. Always weigh it at home!</p>",
511
+ },
512
+ {
513
+ type: "title",
514
+ text: "Why standard measurements fail",
515
+ level: 3,
516
+ },
517
+ {
518
+ type: "paragraph",
519
+ html: "Many travelers buy bags labeled \"Cabin Size\" and get an unpleasant surprise. The reason is that manufacturers usually indicate the measurement of the bag body, but airlines measure the total set: <strong>wheels + handle + outside pockets</strong>.",
520
+ },
521
+ {
522
+ type: "title",
523
+ text: "Expert Packing Tips",
524
+ level: 3,
525
+ },
526
+ {
527
+ type: "list",
528
+ icon: "mdi:check-decagram",
529
+ items: [
530
+ "<strong>Difference between 'Personal Item' and 'Carry-on':</strong> The personal item must fit under the front seat. The carry-on bag goes in the overhead bins.",
531
+ "<strong>The wheel factor:</strong> The measurements we indicate include wheels and handles. A 55cm bag with 3cm wheels will stick out of the official sizer.",
532
+ "<strong>Compression and Flexibility:</strong> Soft backpacks are preferable to hard suitcases if you are at the limit, as they can be slightly compressed in the sizer.",
533
+ "<strong>Combined rates:</strong> Sometimes it's cheaper to pay a 'Plus' fare than to add the cabin bag separately after purchase.",
534
+ ],
535
+ },
536
+ {
537
+ type: "title",
538
+ text: "Special Rules and Prohibited Items",
539
+ level: 3,
540
+ },
541
+ {
542
+ type: "paragraph",
543
+ html: "It's not all centimeters and kilos. Hand luggage is subject to strict security regulations (EASA regulation). Remember the liquids rule: containers of maximum 100ml stored in a transparent bag of 1 liter total capacity.",
544
+ },
545
+ {
546
+ type: "table",
547
+ headers: ["Object", "Allowed?"],
548
+ rows: [
549
+ ["External batteries (Powerbanks)", "Yes (Carry-on only)"],
550
+ ["Liquids > 100ml", "Not allowed"],
551
+ ["Small scissors (<6cm)", "Generally yes"],
552
+ ["Sharp tools", "Not allowed"],
553
+ ],
554
+ },
555
+ {
556
+ type: "tip",
557
+ title: "Security notice",
558
+ html: "<p>Lithium batteries are prohibited in the aircraft hold due to fire risk. They must always travel in your carry-on luggage.</p>",
559
+ },
560
+ {
561
+ type: "title",
562
+ text: "Conclusion: Travel Stress-Free",
563
+ level: 3,
564
+ },
565
+ {
566
+ type: "paragraph",
567
+ html: "Checking your bag measurements before leaving for the airport will save you not only money (gate charges often exceed €50), but also the stress of starting your vacation with a discussion at the counter. Use our calculator and fly with peace of mind!",
568
+ },
569
+ ];
570
+
571
+ const faqSchema: WithContext<FAQPage> = {
572
+ '@context': 'https://schema.org',
573
+ '@type': 'FAQPage',
574
+ mainEntity: faq.map((item: any) => ({
575
+ '@type': 'Question',
576
+ name: item.question,
577
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
578
+ })),
579
+ };
580
+
581
+ const howToSchema: WithContext<HowTo> = {
582
+ '@context': 'https://schema.org',
583
+ '@type': 'HowTo',
584
+ name: title,
585
+ description,
586
+ step: howTo.map((step: any) => ({
587
+ '@type': 'HowToStep',
588
+ name: step.name,
589
+ text: step.text,
590
+ })),
591
+ };
592
+
593
+ const appSchema: WithContext<SoftwareApplication> = {
594
+ '@context': 'https://schema.org',
595
+ '@type': 'SoftwareApplication',
596
+ name: title,
597
+ description,
598
+ applicationCategory: 'UtilitiesApplication',
599
+ operatingSystem: 'Web',
600
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
601
+ inLanguage: 'en',
602
+ };
603
+
604
+ export const content: LuggageCalculatorLocaleContent = {
605
+ slug,
606
+ title,
607
+ description,
608
+ ui,
609
+ seo,
610
+ faq,
611
+ faqTitle: "Frequently Asked Questions",
612
+ bibliography,
613
+ bibliographyTitle: "Sources and References",
614
+ howTo,
615
+ howToTitle: "How to use the calculator",
616
+ schemas: [faqSchema, howToSchema, appSchema],
617
+ };