@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,261 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { SuitcaseChecklistUI } from '../index';
4
+
5
+ const slug = 'suitcase-checklist-generator';
6
+ const title = 'Suitcase Checklist Generator | Create your packing list';
7
+ const description = 'The ultimate online tool to organize your luggage based on trip type, destination, and duration. Never forget your travel essentials again.';
8
+
9
+ const ui: SuitcaseChecklistUI = {
10
+ title: "Packing Planner",
11
+ form: {
12
+ destTitle: "Destination & Climate",
13
+ destTypes: [
14
+ { id: "playa", name: "Beach / Coast", icon: "mdi:beach" },
15
+ { id: "ciudad", name: "City / Urban", icon: "mdi:city" },
16
+ { id: "montana", name: "Mountain / Rural", icon: "mdi:pine-tree" },
17
+ { id: "frio", name: "Cold / Snow", icon: "mdi:snowflake" }
18
+ ],
19
+ daysTitle: "How many days?",
20
+ intlTitle: "International Trip?",
21
+ intlLabel: "Yes, crossing borders",
22
+ reasonTitle: "Travel Purpose",
23
+ reasons: [
24
+ { id: "ocio", name: "Leisure / Pleasure", icon: "mdi:party-popper" },
25
+ { id: "negocios", name: "Business", icon: "mdi:tie" }
26
+ ],
27
+ submitBtn: "Configure Ideal Bag"
28
+ },
29
+ results: {
30
+ title: "Your Packing List",
31
+ editBtn: "Edit",
32
+ printBtn: "Save PDF",
33
+ tipsTitle: "Travel Tips",
34
+ progressText: "Completed"
35
+ },
36
+ itemsDb: {
37
+ essentials: {
38
+ id: "essentials",
39
+ title: "Docs & Basics",
40
+ icon: "mdi:passport",
41
+ items: [
42
+ { label: "ID / Passport" },
43
+ { label: "Bank cards" },
44
+ { label: "Cash" },
45
+ { label: "Tickets (Flight/Train)" },
46
+ { label: "Booking confirmations" },
47
+ { label: "House keys" },
48
+ { label: "International docs", dynamicId: "item-internacional" }
49
+ ]
50
+ },
51
+ technology: {
52
+ id: "technology",
53
+ title: "Technology",
54
+ icon: "mdi:laptop",
55
+ items: [
56
+ { label: "Mobile phone" },
57
+ { label: "Phone charger" },
58
+ { label: "Headphones" },
59
+ { label: "Power bank" },
60
+ { label: "Power adapter", dynamicId: "item-adaptador" }
61
+ ]
62
+ },
63
+ toiletries: {
64
+ id: "toiletries",
65
+ title: "Toiletries",
66
+ icon: "mdi:toothbrush",
67
+ items: [
68
+ { label: "Toothbrush & paste" },
69
+ { label: "Deodorant" },
70
+ { label: "Gel & shampoo" },
71
+ { label: "Comb / Brush" },
72
+ { label: "Mini first-aid kit" },
73
+ { label: "Personal medication" }
74
+ ]
75
+ },
76
+ clothing_base: {
77
+ id: "clothing_base",
78
+ title: "Daily Clothing",
79
+ icon: "mdi:tshirt-crew",
80
+ items: [
81
+ { label: "Underwear", dynamicId: "qty-ropa-interior" },
82
+ { label: "T-shirts / Tops", dynamicId: "qty-camisetas" },
83
+ { label: "Pants / Bottoms", dynamicId: "qty-pantalones" },
84
+ { label: "Socks", dynamicId: "qty-calcetines" },
85
+ { label: "Pajamas" },
86
+ { label: "Light jacket" },
87
+ { label: "Comfortable daily shoes" }
88
+ ]
89
+ }
90
+ },
91
+ specificItems: {
92
+ destType: {
93
+ playa: {
94
+ id: "dest-playa",
95
+ title: "For the Coast",
96
+ icon: "mdi:beach",
97
+ items: [
98
+ { label: "Swimwear" },
99
+ { label: "Beach towel" },
100
+ { label: "Sunscreen" },
101
+ { label: "Sunglasses" },
102
+ { label: "Flip-flops" },
103
+ { label: "Hat or Cap" }
104
+ ]
105
+ },
106
+ ciudad: {
107
+ id: "dest-ciudad",
108
+ title: "Urban",
109
+ icon: "mdi:city",
110
+ items: [
111
+ { label: "Walking sneakers" },
112
+ { label: "Small secure backpack" },
113
+ { label: "Compact umbrella" },
114
+ { label: "City guide" }
115
+ ]
116
+ },
117
+ montana: {
118
+ id: "dest-montana",
119
+ title: "Mountain",
120
+ icon: "mdi:pine-tree",
121
+ items: [
122
+ { label: "Hiking boots" },
123
+ { label: "Windbreaker" },
124
+ { label: "Trekking pants" },
125
+ { label: "Water bottle" },
126
+ { label: "Mountain backpack" }
127
+ ]
128
+ },
129
+ frio: {
130
+ id: "dest-frio",
131
+ title: "Cold Climate",
132
+ icon: "mdi:snowflake",
133
+ items: [
134
+ { label: "Heavy coat" },
135
+ { label: "Hats & gloves" },
136
+ { label: "Winter footwear" },
137
+ { label: "Thermal shirts" },
138
+ { label: "Scarf" }
139
+ ]
140
+ }
141
+ },
142
+ travelType: {
143
+ negocios: {
144
+ id: "travel-negocios",
145
+ title: "Business",
146
+ icon: "mdi:tie",
147
+ items: [
148
+ { label: "Suit / Formal wear" },
149
+ { label: "Dress shirts" },
150
+ { label: "Formal shoes" },
151
+ { label: "Laptop" },
152
+ { label: "Laptop charger" },
153
+ { label: "Work documents" }
154
+ ]
155
+ },
156
+ ocio: {
157
+ id: "travel-ocio",
158
+ title: "Leisure",
159
+ icon: "mdi:camera",
160
+ items: [
161
+ { label: "Nightlife clothes" },
162
+ { label: "Camera (Optional)" },
163
+ { label: "Book / Entertainment" }
164
+ ]
165
+ }
166
+ }
167
+ },
168
+ tips: {
169
+ military: "Rolling clothes 'military style' helps a lot with wrinkles and saves space.",
170
+ longTravel: "You're going for more than a week. Plan to wash your basics halfway through.",
171
+ intlPassport: "International Trip: Check today if your passport is valid for at least 6 months.",
172
+ intlBank: "Check for necessary visas or if your bank charges foreign fees.",
173
+ intlAdapter: "Don't forget your universal adapter if the destination's plugs are different!",
174
+ coldLayers: "For cold weather, dress in layers: base thermal, insulation, and waterproof outer.",
175
+ coldHeavyOn: "Wear your bulkiest/heaviest items on the plane to save cabin space.",
176
+ beachWet: "Pack more than one swimsuit; humidity can prevent them from drying overnight."
177
+ }
178
+ };
179
+
180
+ const seo: ToolLocaleContent<SuitcaseChecklistUI>['seo'] = [
181
+ { type: "title", text: "Suitcase Checklist Generator: Your Ideal Travel Companion", level: 2 },
182
+ { type: "paragraph", html: "Packing your suitcase is often one of the most stressful moments before a trip. The fear of forgetting something important, doubting the weather at your destination, or uncertainty about how much luggage to bring can dampen the days before your long-awaited vacation. This is where a <strong>suitcase checklist generator</strong> becomes your best ally." },
183
+ {
184
+ type: "summary",
185
+ title: "Benefits of using our list creator",
186
+ items: [
187
+ "Absolute personalization adapted to your destination's climate (beach, mountain, city, or snow).",
188
+ "Automatic calculation of clothing based on the duration of your getaway.",
189
+ "Drastic reduction of logistical stress with an interactive checklist you can check off.",
190
+ "Luggage space optimization, avoiding the 'just in case' syndrome."
191
+ ]
192
+ },
193
+ { type: "title", text: "Why is luggage planning fundamental?", level: 3 },
194
+ { type: "paragraph", html: "Travel is a transformative experience, but poor planning can bring unnecessary headaches. By using our smart tool, you automate a process that would otherwise take hours of calculation and memorization. Efficient organization is the foundation of any successful adventure." }
195
+ ];
196
+
197
+ const faq: ToolLocaleContent<SuitcaseChecklistUI>['faq'] = [
198
+ { question: "Can I save the generated list?", answer: "You can check and uncheck items on your list, as well as use the button to print it or save it as a PDF file on your device." },
199
+ { question: "How are clothing quantities calculated?", answer: "Our tool estimates sets of clothes based on the selected trip duration, promoting traveling light and optimizing your luggage." },
200
+ { question: "Does it work for cold weather and snow?", answer: "Yes, you can select the cold climate destination so that the checklist automatically includes indispensable items for those conditions." },
201
+ { question: "Is the tool free?", answer: "Yes, our luggage checklist generator is 100% free and requires no registration or additional app downloads." }
202
+ ];
203
+
204
+ const bibliography: ToolLocaleContent<SuitcaseChecklistUI>['bibliography'] = [
205
+ { name: "KonMari - How to KonMari a Suitcase", url: "https://konmari.com/how-to-konmari-a-suitcase/" },
206
+ { name: "Eagle Creek - What to Pack: Ultimate Travel Packing Checklist", url: "https://eaglecreek.com/blogs/articles/what-pack-ultimate-travel-packing-checklist" }
207
+ ];
208
+
209
+ const howTo: ToolLocaleContent<SuitcaseChecklistUI>['howTo'] = [
210
+ { name: "Define your trip", text: "Select the climate, reason, and duration of your getaway." },
211
+ { name: "Generate list", text: "Press the button and instantly get all necessary items, from cosmetics to technology." },
212
+ { name: "Pack your bag", text: "Check off items as you pack them so you don't forget anything essential." }
213
+ ];
214
+
215
+ const faqSchema: WithContext<FAQPage> = {
216
+ '@context': 'https://schema.org',
217
+ '@type': 'FAQPage',
218
+ mainEntity: faq.map((item) => ({
219
+ '@type': 'Question',
220
+ name: item.question,
221
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
222
+ })),
223
+ };
224
+
225
+ const howToSchema: WithContext<HowTo> = {
226
+ '@context': 'https://schema.org',
227
+ '@type': 'HowTo',
228
+ name: title,
229
+ description: description,
230
+ step: howTo.map((step) => ({
231
+ '@type': 'HowToStep',
232
+ name: step.name,
233
+ text: step.text,
234
+ })),
235
+ };
236
+
237
+ const appSchema: WithContext<SoftwareApplication> = {
238
+ '@context': 'https://schema.org',
239
+ '@type': 'SoftwareApplication',
240
+ name: title,
241
+ description: description,
242
+ applicationCategory: 'UtilitiesApplication',
243
+ operatingSystem: 'All',
244
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
245
+ inLanguage: 'en',
246
+ };
247
+
248
+ export const content: ToolLocaleContent<SuitcaseChecklistUI> = {
249
+ slug,
250
+ title,
251
+ description,
252
+ ui,
253
+ seo,
254
+ faq,
255
+ faqTitle: "Frequently Asked Questions",
256
+ bibliography,
257
+ bibliographyTitle: "Sources and References",
258
+ howTo,
259
+ howToTitle: "How to pack your suitcase",
260
+ schemas: [faqSchema, howToSchema, appSchema],
261
+ };
@@ -0,0 +1,261 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { SuitcaseChecklistUI } from '../index';
4
+
5
+ const slug = 'generador-checklist-maleta';
6
+ const title = 'Generador de Checklist de Maleta | Crea tu lista de equipaje';
7
+ const description = 'La herramienta en línea definitiva para organizar tu equipaje en base a tu tipo de viaje, destino y duración. No vuelvas a olvidar tus imprescindibles de viaje.';
8
+
9
+ const ui: SuitcaseChecklistUI = {
10
+ title: "Planificador de Equipaje",
11
+ form: {
12
+ destTitle: "Destino y Clima",
13
+ destTypes: [
14
+ { id: "playa", name: "Playa / Costa", icon: "mdi:beach" },
15
+ { id: "ciudad", name: "Ciudad / Urbano", icon: "mdi:city" },
16
+ { id: "montana", name: "Montaña / Rural", icon: "mdi:pine-tree" },
17
+ { id: "frio", name: "Clima Frío / Nieve", icon: "mdi:snowflake" }
18
+ ],
19
+ daysTitle: "¿Cuántos días?",
20
+ intlTitle: "¿Viaje Internacional?",
21
+ intlLabel: "Sí, cruzo fronteras",
22
+ reasonTitle: "Motivo del Viaje",
23
+ reasons: [
24
+ { id: "ocio", name: "Ocio / Placer", icon: "mdi:party-popper" },
25
+ { id: "negocios", name: "Negocios", icon: "mdi:tie" }
26
+ ],
27
+ submitBtn: "Configurar Maleta Ideal"
28
+ },
29
+ results: {
30
+ title: "Tu Lista de Viaje",
31
+ editBtn: "Editar",
32
+ printBtn: "Guardar PDF",
33
+ tipsTitle: "Consejos para tu Viaje",
34
+ progressText: "Completado"
35
+ },
36
+ itemsDb: {
37
+ essentials: {
38
+ id: "essentials",
39
+ title: "Documentación y Básico",
40
+ icon: "mdi:passport",
41
+ items: [
42
+ { label: "DNI / Pasaporte" },
43
+ { label: "Tarjetas bancarias" },
44
+ { label: "Efectivo" },
45
+ { label: "Billetes (Avión/Tren)" },
46
+ { label: "Reservas de alojamiento" },
47
+ { label: "Llaves de casa" },
48
+ { label: "Documentación internacional", dynamicId: "item-internacional" }
49
+ ]
50
+ },
51
+ technology: {
52
+ id: "technology",
53
+ title: "Tecnología",
54
+ icon: "mdi:laptop",
55
+ items: [
56
+ { label: "Teléfono móvil" },
57
+ { label: "Cargador del móvil" },
58
+ { label: "Auriculares" },
59
+ { label: "Batería externa" },
60
+ { label: "Adaptador de enchufe", dynamicId: "item-adaptador" }
61
+ ]
62
+ },
63
+ toiletries: {
64
+ id: "toiletries",
65
+ title: "Neceser",
66
+ icon: "mdi:toothbrush",
67
+ items: [
68
+ { label: "Cepillo y pasta de dientes" },
69
+ { label: "Desodorante" },
70
+ { label: "Gel y champú" },
71
+ { label: "Peine / Cepillo" },
72
+ { label: "Mini botiquín" },
73
+ { label: "Medicamentos personales" }
74
+ ]
75
+ },
76
+ clothing_base: {
77
+ id: "clothing_base",
78
+ title: "Ropa Diaria",
79
+ icon: "mdi:tshirt-crew",
80
+ items: [
81
+ { label: "Ropa interior", dynamicId: "qty-ropa-interior" },
82
+ { label: "Camisetas / Arriba", dynamicId: "qty-camisetas" },
83
+ { label: "Pantalones / Abajo", dynamicId: "qty-pantalones" },
84
+ { label: "Calcetines", dynamicId: "qty-calcetines" },
85
+ { label: "Pijama" },
86
+ { label: "Chaqueta ligera" },
87
+ { label: "Zapatos cómodos diarios" }
88
+ ]
89
+ }
90
+ },
91
+ specificItems: {
92
+ destType: {
93
+ playa: {
94
+ id: "dest-playa",
95
+ title: "Para la Costa",
96
+ icon: "mdi:beach",
97
+ items: [
98
+ { label: "Bañadores" },
99
+ { label: "Toalla de playa" },
100
+ { label: "Protector solar" },
101
+ { label: "Gafas de sol" },
102
+ { label: "Chanclas" },
103
+ { label: "Gorra o Sombrero" }
104
+ ]
105
+ },
106
+ ciudad: {
107
+ id: "dest-ciudad",
108
+ title: "Urbano",
109
+ icon: "mdi:city",
110
+ items: [
111
+ { label: "Zapatillas para caminar" },
112
+ { label: "Mochila segura pequeña" },
113
+ { label: "Paraguas compacto" },
114
+ { label: "Guía de ciudad" }
115
+ ]
116
+ },
117
+ montana: {
118
+ id: "dest-montana",
119
+ title: "Montaña",
120
+ icon: "mdi:pine-tree",
121
+ items: [
122
+ { label: "Botas de senderismo" },
123
+ { label: "Cortavientos repelente" },
124
+ { label: "Pantalones trekking" },
125
+ { label: "Cantimplora" },
126
+ { label: "Mochila montaña" }
127
+ ]
128
+ },
129
+ frio: {
130
+ id: "dest-frio",
131
+ title: "Clima Frío",
132
+ icon: "mdi:snowflake",
133
+ items: [
134
+ { label: "Abrigo grueso" },
135
+ { label: "Gorros y guantes" },
136
+ { label: "Calzado de invierno" },
137
+ { label: "Camisetas térmicas" },
138
+ { label: "Bufanda" }
139
+ ]
140
+ }
141
+ },
142
+ travelType: {
143
+ negocios: {
144
+ id: "travel-negocios",
145
+ title: "Negocios",
146
+ icon: "mdi:tie",
147
+ items: [
148
+ { label: "Traje completo / Ropa formal" },
149
+ { label: "Camisas de vestir" },
150
+ { label: "Zapatos formales" },
151
+ { label: "Portátil" },
152
+ { label: "Cargador del portátil" },
153
+ { label: "Documentación de trabajo" }
154
+ ]
155
+ },
156
+ ocio: {
157
+ id: "travel-ocio",
158
+ title: "Ocio",
159
+ icon: "mdi:camera",
160
+ items: [
161
+ { label: "Ropa para salir de noche" },
162
+ { label: "Cámara fotográfica (Opcional)" },
163
+ { label: "Libro / Entretenimiento" }
164
+ ]
165
+ }
166
+ }
167
+ },
168
+ tips: {
169
+ military: "Enrollar la ropa estilo 'militar' ayuda muchísimo a combatir arrugas y ahorra espacio.",
170
+ longTravel: "Vas para más de una semana. En lugar de llevar kilos de ropa, planifica lavar tus básicos a la mitad del viaje.",
171
+ intlPassport: "Viaje Internacional: Revisa hoy mismo si tu pasaporte tiene al menos 6 meses de validez porque muchos países lo exigen.",
172
+ intlBank: "Consulta si hay visas necesarias o si tu banco cobra comisiones en el extranjero.",
173
+ intlAdapter: "¡No olvides tu adaptador universal si las clavijas del país de destino son distintas!",
174
+ coldLayers: "Para el clima frío, la clave es vestirse en capas: una térmica base, una intermedia aislante y un buen abrigo impermeable fuera.",
175
+ coldHeavyOn: "Lleva las prendas más abultadas y pesadas puestas en el avión para ahorrar espacio en cabina.",
176
+ beachWet: "Asegúrate de llevar más de un bañador; la humedad a veces impide que se sequen para el día siguiente."
177
+ }
178
+ };
179
+
180
+ const seo: ToolLocaleContent<SuitcaseChecklistUI>['seo'] = [
181
+ { type: "title", text: "Generador de Checklist de Maleta: Tu Compañero de Viaje Ideal", level: 2 },
182
+ { type: "paragraph", html: "Preparar la maleta suele ser uno de los momentos más estresantes antes de un viaje. El miedo a olvidar algo importante, la duda sobre el clima en el destino o la incertidumbre de cuánto equipaje llevar pueden amargar los días previos a tus tan ansiadas vacaciones. Es aquí donde un <strong>generador de checklist de maleta</strong> se convierte en tu mejor aliado." },
183
+ {
184
+ type: "summary",
185
+ title: "Beneficios de usar nuestro creador de listas",
186
+ items: [
187
+ "Personalización absoluta adaptada al clima de tu destino (playa, montaña, ciudad o nieve).",
188
+ "Cálculo automático de la cantidad de ropa basándose en los días que dura tu escapada.",
189
+ "Reducción drástica del estrés logístico al tener un checklist interactivo que puedes ir marcando.",
190
+ "Optimización del espacio en el equipaje, evitando el síndrome del 'por si acaso'."
191
+ ]
192
+ },
193
+ { type: "title", text: "¿Por qué es fundamental planificar el equipaje?", level: 3 },
194
+ { type: "paragraph", html: "Viajar es una experiencia transformadora, pero una mala planificación puede traer quebraderos de cabeza innecesarios. Al utilizar nuestra herramienta inteligente, automatizas un proceso que de otra forma tomaría varias horas de cálculos y memorización. La organización eficiente es la base de cualquier aventura exitosa." }
195
+ ];
196
+
197
+ const faq: ToolLocaleContent<SuitcaseChecklistUI>['faq'] = [
198
+ { question: "¿Puedo guardar la lista generada?", answer: "Puedes marcar y desmarcar elementos de tu lista, así como utilizar el botón para imprimirla o guardarla como un archivo PDF en tu dispositivo." },
199
+ { question: "¿Cómo se calculan las cantidades de ropa?", answer: "Nuestra herramienta estima las mudas de ropa según la duración del viaje seleccionada, promoviendo viajar ligero y optimizar tu equipaje." },
200
+ { question: "¿Funciona para viajes con clima frío y nieve?", answer: "Sí, puedes seleccionar el destino de clima frío para que el checklist incluya automáticamente artículos indispensables para esa climatología." },
201
+ { question: "¿Tiene la herramienta algún costo?", answer: "No, nuestro generador de listas de equipaje es 100% gratuito y no requiere ningún registro o descarga de aplicación adicional." }
202
+ ];
203
+
204
+ const bibliography: ToolLocaleContent<SuitcaseChecklistUI>['bibliography'] = [
205
+ { name: "KonMari - How to KonMari a Suitcase", url: "https://konmari.com/how-to-konmari-a-suitcase/" },
206
+ { name: "Eagle Creek - What to Pack: Ultimate Travel Packing Checklist", url: "https://eaglecreek.com/blogs/articles/what-pack-ultimate-travel-packing-checklist" }
207
+ ];
208
+
209
+ const howTo: ToolLocaleContent<SuitcaseChecklistUI>['howTo'] = [
210
+ { name: "Define tu viaje", text: "Selecciona el clima, el motivo y la duración de tu escapada." },
211
+ { name: "Genera la lista", text: "Pulsa el botón y obtén al instante todas las cosas necesarias, desde cosmética hasta tecnología." },
212
+ { name: "Prepara la maleta", text: "Marca los artículos a medida que los guardes para no olvidar absolutamente nada esencial." }
213
+ ];
214
+
215
+ const faqSchema: WithContext<FAQPage> = {
216
+ '@context': 'https://schema.org',
217
+ '@type': 'FAQPage',
218
+ mainEntity: faq.map((item) => ({
219
+ '@type': 'Question',
220
+ name: item.question,
221
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
222
+ })),
223
+ };
224
+
225
+ const howToSchema: WithContext<HowTo> = {
226
+ '@context': 'https://schema.org',
227
+ '@type': 'HowTo',
228
+ name: title,
229
+ description: description,
230
+ step: howTo.map((step) => ({
231
+ '@type': 'HowToStep',
232
+ name: step.name,
233
+ text: step.text,
234
+ })),
235
+ };
236
+
237
+ const appSchema: WithContext<SoftwareApplication> = {
238
+ '@context': 'https://schema.org',
239
+ '@type': 'SoftwareApplication',
240
+ name: title,
241
+ description: description,
242
+ applicationCategory: 'UtilitiesApplication',
243
+ operatingSystem: 'All',
244
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
245
+ inLanguage: 'es',
246
+ };
247
+
248
+ export const content: ToolLocaleContent<SuitcaseChecklistUI> = {
249
+ slug,
250
+ title,
251
+ description,
252
+ ui,
253
+ seo,
254
+ faq,
255
+ faqTitle: "Preguntas Frecuentes",
256
+ bibliography,
257
+ bibliographyTitle: "Fuentes y Referencias",
258
+ howTo,
259
+ howToTitle: "Cómo planificar tu maleta",
260
+ schemas: [faqSchema, howToSchema, appSchema],
261
+ };