From e5dd331bc2912dbea5140ee35a8f67777190da6e Mon Sep 17 00:00:00 2001 From: dukebody Date: Thu, 23 Jul 2026 07:29:07 +0200 Subject: [PATCH 1/2] feat(accommodation): add recommended hotels with promo codes Replace the coming-soon placeholder with Travelodge, Hotel Jazz, and EasyHotel cards (booking URL, promo code, Maps) in es/en/ca. Co-authored-by: Cursor --- src/components/AccommodationPage.astro | 65 +++++++++++++++++--------- src/data/hotels.ts | 24 ++++++++++ src/i18n/accommodation/ca.ts | 5 +- src/i18n/accommodation/en.ts | 6 ++- src/i18n/accommodation/es.ts | 5 +- src/types/hotels.ts | 6 +++ 6 files changed, 85 insertions(+), 26 deletions(-) create mode 100644 src/data/hotels.ts create mode 100644 src/types/hotels.ts diff --git a/src/components/AccommodationPage.astro b/src/components/AccommodationPage.astro index e415f01..a755cda 100644 --- a/src/components/AccommodationPage.astro +++ b/src/components/AccommodationPage.astro @@ -1,4 +1,5 @@ --- +import { hotels } from '../data/hotels' import { accommodationTexts } from '../i18n/accommodation' import { menuTexts } from '../i18n/menu' import StatusIcon from './icons/StatusIcon.astro' @@ -108,29 +109,49 @@ const areaDesc = (slug: AreaSlug) => t[`accommodation.areas.${slug}.desc` as key -
- - - -
- -

{t['accommodation.hotels.subtitle']}

-

- {t['accommodation.hotels.disclaimer']} -

-
+
+

{t['accommodation.hotels.subtitle']}

+

{t['accommodation.hotels.disclaimer']}

+ + diff --git a/src/data/hotels.ts b/src/data/hotels.ts new file mode 100644 index 0000000..021123b --- /dev/null +++ b/src/data/hotels.ts @@ -0,0 +1,24 @@ +import type { IHotel } from '../types/hotels' + +/** Recommended hotels with PyConES promo codes. */ +export const hotels: IHotel[] = [ + { + name: 'Travelodge Barcelona Poblenou', + bookingUrl: 'https://www.travelodge.es/hoteles-barcelona/poblenou', + promoCode: 'PYCONES2026BCN', + mapsUrl: 'https://maps.app.goo.gl/xAmHRV413JHyWHUx8', + }, + { + name: 'Hotel Jazz', + bookingUrl: + 'https://reservations.hoteljazz.com/hotel/nn_jazz?adultos=1&fini=06-11-2026&noches=2&origin=grponline&epc=U1RNVEhKQkdSUDFCQioqLFBZVEhPTgo=', + promoCode: '(usar enlace directo)', + mapsUrl: 'https://maps.app.goo.gl/ZULETA9Zp2sZW1NL9', + }, + { + name: 'EasyHotel Barcelona Fira', + bookingUrl: 'https://www.easyhotel.com/es/hotels/spain/barcelona/barcelona-fira', + promoCode: 'PYTHON', + mapsUrl: 'https://maps.app.goo.gl/9MErH52umw4XHjFq6', + }, +] diff --git a/src/i18n/accommodation/ca.ts b/src/i18n/accommodation/ca.ts index ef0ec68..a0f331b 100644 --- a/src/i18n/accommodation/ca.ts +++ b/src/i18n/accommodation/ca.ts @@ -5,7 +5,10 @@ export const ca = { 'accommodation.hotels.title': 'Hotels Recomanats', 'accommodation.hotels.subtitle': 'Convenis i opcions properes', 'accommodation.hotels.disclaimer': - 'Estem treballant per tancar convenis exclusius amb descomptes per als assistents. Torna aviat per veure els codis promocionals!', + 'Fes servir el codi promocional en reservar per aplicar el descompte de PyConES.', + 'accommodation.hotels.promoCode': 'Codi promocional', + 'accommodation.hotels.book': 'Reservar hotel', + 'accommodation.hotels.maps': 'Veure a Google Maps', 'accommodation.areas.title': 'Millors Zones', 'accommodation.areas.transportIntro.p1': 'Si has de tornar a casa en tren, les millors opcions són Sants, Eixample Esquerra o Les Corts (per anar a Sants Estació).', diff --git a/src/i18n/accommodation/en.ts b/src/i18n/accommodation/en.ts index f3bdea3..e5ca2d0 100644 --- a/src/i18n/accommodation/en.ts +++ b/src/i18n/accommodation/en.ts @@ -4,8 +4,10 @@ export const en = { 'accommodation.hero.subtitle': 'Recommendations for your stay in Barcelona', 'accommodation.hotels.title': 'Recommended Hotels', 'accommodation.hotels.subtitle': 'Agreements and nearby options', - 'accommodation.hotels.disclaimer': - 'We are working on exclusive discounts for attendees. Check back soon for promo codes!', + 'accommodation.hotels.disclaimer': 'Use the promo code when booking to apply the PyConES discount.', + 'accommodation.hotels.promoCode': 'Promo code', + 'accommodation.hotels.book': 'Book hotel', + 'accommodation.hotels.maps': 'View on Google Maps', 'accommodation.areas.title': 'Best Areas', 'accommodation.areas.transportIntro.p1': 'If you are heading home by train, the best options are Sants, Eixample Esquerra, or Les Corts (for reaching Sants Estació).', diff --git a/src/i18n/accommodation/es.ts b/src/i18n/accommodation/es.ts index 18418e4..74ed9ba 100644 --- a/src/i18n/accommodation/es.ts +++ b/src/i18n/accommodation/es.ts @@ -5,7 +5,10 @@ export const es = { 'accommodation.hotels.title': 'Hoteles Recomendados', 'accommodation.hotels.subtitle': 'Convenios y opciones cercanas', 'accommodation.hotels.disclaimer': - 'Estamos trabajando para cerrar convenios exclusivos con descuentos para los asistentes. ¡Vuelve pronto para ver los códigos promocionales!', + 'Usa el código promocional al reservar para aplicar el descuento de PyConES.', + 'accommodation.hotels.promoCode': 'Código promocional', + 'accommodation.hotels.book': 'Reservar hotel', + 'accommodation.hotels.maps': 'Ver en Google Maps', 'accommodation.areas.title': 'Mejores Zonas', 'accommodation.areas.transportIntro.p1': 'Si tienes que volver a casa en tren, las mejores opciones son Sants, Eixample Esquerra o Les Corts (para ir a Sants Estació).', diff --git a/src/types/hotels.ts b/src/types/hotels.ts new file mode 100644 index 0000000..5bae88a --- /dev/null +++ b/src/types/hotels.ts @@ -0,0 +1,6 @@ +export interface IHotel { + name: string + bookingUrl: string + promoCode: string + mapsUrl: string +} From 77ea960849678a79a460d1fe990fdc731349d815 Mon Sep 17 00:00:00 2001 From: dukebody Date: Thu, 23 Jul 2026 07:36:13 +0200 Subject: [PATCH 2/2] fix(accommodation): improve hotel promo cards accessibility Make promo codes optional with i18n direct-link copy, fix aria-labels, and tighten promo markup and Maps link contrast for screen readers. Co-authored-by: Cursor --- src/components/AccommodationPage.astro | 81 +++++++++++++++----------- src/data/hotels.ts | 1 - src/i18n/accommodation/ca.ts | 1 + src/i18n/accommodation/en.ts | 1 + src/i18n/accommodation/es.ts | 1 + src/types/hotels.ts | 3 +- 6 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/components/AccommodationPage.astro b/src/components/AccommodationPage.astro index a755cda..00c612f 100644 --- a/src/components/AccommodationPage.astro +++ b/src/components/AccommodationPage.astro @@ -116,40 +116,53 @@ const areaDesc = (slug: AreaSlug) => t[`accommodation.areas.${slug}.desc` as key diff --git a/src/data/hotels.ts b/src/data/hotels.ts index 021123b..097f7d6 100644 --- a/src/data/hotels.ts +++ b/src/data/hotels.ts @@ -12,7 +12,6 @@ export const hotels: IHotel[] = [ name: 'Hotel Jazz', bookingUrl: 'https://reservations.hoteljazz.com/hotel/nn_jazz?adultos=1&fini=06-11-2026&noches=2&origin=grponline&epc=U1RNVEhKQkdSUDFCQioqLFBZVEhPTgo=', - promoCode: '(usar enlace directo)', mapsUrl: 'https://maps.app.goo.gl/ZULETA9Zp2sZW1NL9', }, { diff --git a/src/i18n/accommodation/ca.ts b/src/i18n/accommodation/ca.ts index a0f331b..0545507 100644 --- a/src/i18n/accommodation/ca.ts +++ b/src/i18n/accommodation/ca.ts @@ -7,6 +7,7 @@ export const ca = { 'accommodation.hotels.disclaimer': 'Fes servir el codi promocional en reservar per aplicar el descompte de PyConES.', 'accommodation.hotels.promoCode': 'Codi promocional', + 'accommodation.hotels.useDirectLink': "Fes servir l'enllaç de reserva per aplicar el descompte.", 'accommodation.hotels.book': 'Reservar hotel', 'accommodation.hotels.maps': 'Veure a Google Maps', 'accommodation.areas.title': 'Millors Zones', diff --git a/src/i18n/accommodation/en.ts b/src/i18n/accommodation/en.ts index e5ca2d0..1b4c45f 100644 --- a/src/i18n/accommodation/en.ts +++ b/src/i18n/accommodation/en.ts @@ -6,6 +6,7 @@ export const en = { 'accommodation.hotels.subtitle': 'Agreements and nearby options', 'accommodation.hotels.disclaimer': 'Use the promo code when booking to apply the PyConES discount.', 'accommodation.hotels.promoCode': 'Promo code', + 'accommodation.hotels.useDirectLink': 'Use the booking link to apply the discount.', 'accommodation.hotels.book': 'Book hotel', 'accommodation.hotels.maps': 'View on Google Maps', 'accommodation.areas.title': 'Best Areas', diff --git a/src/i18n/accommodation/es.ts b/src/i18n/accommodation/es.ts index 74ed9ba..1decd96 100644 --- a/src/i18n/accommodation/es.ts +++ b/src/i18n/accommodation/es.ts @@ -7,6 +7,7 @@ export const es = { 'accommodation.hotels.disclaimer': 'Usa el código promocional al reservar para aplicar el descuento de PyConES.', 'accommodation.hotels.promoCode': 'Código promocional', + 'accommodation.hotels.useDirectLink': 'Usa el enlace de reserva para aplicar el descuento.', 'accommodation.hotels.book': 'Reservar hotel', 'accommodation.hotels.maps': 'Ver en Google Maps', 'accommodation.areas.title': 'Mejores Zonas', diff --git a/src/types/hotels.ts b/src/types/hotels.ts index 5bae88a..fe8769a 100644 --- a/src/types/hotels.ts +++ b/src/types/hotels.ts @@ -1,6 +1,7 @@ export interface IHotel { name: string bookingUrl: string - promoCode: string + /** Omit when discount is applied via the booking URL only. */ + promoCode?: string mapsUrl: string }