diff --git a/frontend/messages/es.json b/frontend/messages/es.json
index a976437..c0bab22 100644
--- a/frontend/messages/es.json
+++ b/frontend/messages/es.json
@@ -1,7 +1,7 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"accommodation_info": "Cómo llegar",
- "about": "Sobre el evento",
+ "about": "El evento",
"agenda": "Agenda",
"an_error_has_occurred": "Ha ocurrido un error",
"cancel": "Cancelar",
@@ -48,10 +48,10 @@
"prices": "Precios",
"privacy_policy": "Política de privacidad",
"register": "Registro",
- "registration": "Registro",
+ "registration": "Inscripción",
"reset_password_sent": "Si tu correo está registrado, hemos enviado un mensaje con un enlace para establecer una contraseña nueva.",
"send": "Enviar",
- "speakers": "Invitados",
+ "speakers": "Invitadas",
"streaming": "Streaming",
"venue_info": "El lugar",
"we_sent_an_email": "Te hemos enviado un correo a {email}",
diff --git a/frontend/src/app.scss b/frontend/src/app.scss
index abff0e7..98088ea 100644
--- a/frontend/src/app.scss
+++ b/frontend/src/app.scss
@@ -220,6 +220,7 @@ body {
color: $color-primary;
padding-left: 1.5rem !important;
padding-right: 1.5rem !important;
+ white-space: nowrap;
&:hover {
background-color: #43b2dc !important;
color: $color-white !important;
@@ -228,7 +229,7 @@ body {
img {
max-height: 3rem;
- transform: rotate(5deg);
+ transform: rotate(var(--logo-rotation, 5deg));
}
&.brand {
@@ -240,10 +241,12 @@ body {
}
.brand-home-label {
+ display: flex;
+ flex-direction: column;
font-family: $font-family-primary;
font-size: 1em;
font-weight: 600;
- line-height: inherit;
+ line-height: 1.05;
color: inherit;
white-space: nowrap;
@@ -262,6 +265,7 @@ body {
width: 100%;
justify-content: flex-end;
padding-right: 5rem;
+ gap: 0.25rem;
}
&-left {
diff --git a/frontend/src/assets/images/calavera.svg b/frontend/src/assets/images/calavera.svg
new file mode 100644
index 0000000..4b6d9d5
--- /dev/null
+++ b/frontend/src/assets/images/calavera.svg
@@ -0,0 +1,88 @@
+
+
+
diff --git a/frontend/src/assets/images/camiseta.jpg b/frontend/src/assets/images/camiseta.jpg
new file mode 100644
index 0000000..5bc5b54
Binary files /dev/null and b/frontend/src/assets/images/camiseta.jpg differ
diff --git a/frontend/src/assets/images/timon.svg b/frontend/src/assets/images/timon.svg
new file mode 100644
index 0000000..916186e
--- /dev/null
+++ b/frontend/src/assets/images/timon.svg
@@ -0,0 +1,91 @@
+
+
+
diff --git a/frontend/src/assets/images/timon_png.png b/frontend/src/assets/images/timon_png.png
new file mode 100644
index 0000000..8f2ea9e
Binary files /dev/null and b/frontend/src/assets/images/timon_png.png differ
diff --git a/frontend/src/lib/ActivityModal.svelte b/frontend/src/lib/ActivityModal.svelte
index 22e84eb..0b5b333 100644
--- a/frontend/src/lib/ActivityModal.svelte
+++ b/frontend/src/lib/ActivityModal.svelte
@@ -1,78 +1,226 @@
-
+
{#if isOpen}
+
+
+
+
+
+
+
+
+ {#if activity.long_description}
+
+ {/if}
+
+
+
+ {#if activity.tag1 || activity.tag2}
+
+ {/if}
+
+
{/if}
\ No newline at end of file
+ .activity-modal {
+ position: fixed;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 1rem;
+ pointer-events: auto;
+ }
+
+ .activity-modal__card {
+ position: relative;
+ overflow: hidden;
+ width: min(92vw, 760px);
+ border: 1px solid rgba(13, 59, 68, 0.16);
+ border-radius: 0.5rem;
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.28);
+ }
+
+ .activity-modal__card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1;
+ height: 0.35rem;
+ background: linear-gradient(90deg, #0d3b44, #43b2dc, #8d627b);
+ }
+
+ .activity-modal__head {
+ position: relative;
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 1.5rem;
+ padding: 2rem 4rem 1.4rem 2rem;
+ background:
+ linear-gradient(rgba(255, 255, 255, 0.96), rgba(255, 255, 255, 0.96)),
+ radial-gradient(circle at top right, rgba(67, 178, 220, 0.2), transparent 42%);
+ border-bottom: 1px solid rgba(13, 59, 68, 0.1);
+ }
+
+ .activity-modal__title {
+ margin: 0;
+ font-size: 1.55rem;
+ line-height: 1.25;
+ color: #0d3b44;
+ flex-grow: initial;
+ flex-shrink: initial;
+ }
+
+ .activity-modal__title::after {
+ content: '';
+ display: block;
+ width: 4rem;
+ height: 2px;
+ margin-top: 0.75rem;
+ background: #43b2dc;
+ }
+
+ .activity-modal__subtitle {
+ margin-top: 0.8rem;
+ margin-bottom: 0;
+ font-family: Lora, serif;
+ font-size: 1rem;
+ font-style: italic;
+ color: #0d3b44;
+ }
+
+ .activity-modal__close {
+ position: absolute;
+ top: 1.5rem;
+ right: 1.5rem;
+ z-index: 2;
+ }
+
+ .activity-modal__body {
+ padding: 1.8rem 2rem 2rem;
+ background: #ffffff;
+ }
+
+ .activity-modal__content {
+ color: #0d3b44;
+ }
+
+ .activity-modal__content :global(img) {
+ display: block;
+ width: min(100%, 34rem);
+ height: auto;
+ margin: 1rem auto;
+ border-radius: 0.35rem;
+ box-shadow: 0 1rem 2rem rgba(13, 59, 68, 0.16);
+ }
+
+ .activity-modal__foot {
+ display: block;
+ padding: 1.15rem 2rem 1.35rem;
+ background: #0d3b44;
+ border-top: 0;
+ }
+
+ .activity-modal__tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ }
+
+ .activity-modal__tag {
+ display: inline-flex;
+ width: fit-content;
+ padding: 0.35rem 0.75rem;
+ font-size: 0.75rem;
+ font-weight: 700;
+ line-height: 1.2;
+ letter-spacing: 0.02em;
+ text-transform: uppercase;
+ }
+
+ .activity-modal__tag--primary {
+ color: #ffffff;
+ background: #8d627b;
+ border-left: 4px solid #43b2dc;
+ }
+
+ .activity-modal__tag--secondary {
+ color: #0d3b44;
+ background: #d1f0f9;
+ }
+
+ @media screen and (max-width: 768px) {
+ .activity-modal {
+ padding: 0.75rem;
+ }
+
+ .activity-modal__head {
+ padding: 1.6rem 3.75rem 1.2rem 1.25rem;
+ }
+
+ .activity-modal__title {
+ font-size: 1.25rem;
+ }
+
+ .activity-modal__body {
+ padding: 1.4rem 1.25rem 1.6rem;
+ }
+
+ .activity-modal__foot {
+ padding: 1.15rem 1.25rem 1.35rem;
+ }
+
+ .activity-modal__close {
+ top: 1.15rem;
+ right: 1.15rem;
+ display: block !important;
+ z-index: 10;
+ width: 32px;
+ height: 32px;
+ min-width: 32px;
+ min-height: 32px;
+ }
+
+ .activity-modal__content :global(p:has(img)) {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .activity-modal__content :global(p:has(img) img) {
+ width: min(100%, 17rem);
+ margin: 0;
+ }
+ }
+
diff --git a/frontend/src/lib/Footer.svelte b/frontend/src/lib/Footer.svelte
index 74bb39d..6bc8bff 100644
--- a/frontend/src/lib/Footer.svelte
+++ b/frontend/src/lib/Footer.svelte
@@ -1,4 +1,5 @@
-
- {#if isOpen}
-
-
-
-
-
-
-
-
-
- {#if profile.title}
- {profile.title}
- {/if}
-
-
- {#if profile.bio}
-
- {/if}
- {#if profile.pronouns}
-
- {profile.pronouns}
-
- {/if}
-
- {#if profile.is_guest}
- Special guest
- {/if}
-
-
-
-
-
-
-
-
-
- {/if}
-
-
\ No newline at end of file
+ import SvelteMarkdown from '@humanspeak/svelte-markdown';
+
+ let { isOpen, close, profile } = $props();
+
+
+{#if isOpen}
+
+
+
+
+
+
+
+
+ {#if profile.is_guest}
+ Invitada principal
+ {/if}
+
+ {#if profile.pronouns}
+ {profile.pronouns}
+ {/if}
+
+
+
+ {#if profile.bio}
+
+ {/if}
+
+
+
+ {#if profile.activities?.length > 0}
+
+ {/if}
+
+
+{/if}
+
+
diff --git a/frontend/src/lib/i18n.ts b/frontend/src/lib/i18n.ts
index 6272c1f..e4aed4b 100644
--- a/frontend/src/lib/i18n.ts
+++ b/frontend/src/lib/i18n.ts
@@ -7,7 +7,7 @@ export const i18n = createI18n(runtime, {
pathnames: {
'/about-us': {
en: '/about-us',
- es: '/sobre-el-evento'
+ es: '/el-evento'
},
'/accommodation-info': {
en: '/accommodation-info',
@@ -95,7 +95,7 @@ export const i18n = createI18n(runtime, {
},
'/speakers': {
en: '/speakers',
- es: '/invitados'
+ es: '/invitadas'
},
'/sponsors': {
en: '/sponsors',
@@ -115,7 +115,7 @@ export const i18n = createI18n(runtime, {
},
'/price': {
en: '/price',
- es: '/precio'
+ es: '/precios'
}
}
});
diff --git a/frontend/src/routes/+page.js b/frontend/src/routes/+page.js
index 5c94d08..6c98c14 100644
--- a/frontend/src/routes/+page.js
+++ b/frontend/src/routes/+page.js
@@ -16,19 +16,26 @@ const sitePath = `/site?${encodeQuery({
populate: '*'
})}`;
+const registrationInfoPath = `/registration-info?${encodeQuery({
+ populate: '*'
+})}`;
+
/** @type {import('./$types').PageLoad} */
export async function load({ params }) {
let data = {};
- const [homepageData, speakersData, siteData] = await Promise.all([
+ const [homepageData, speakersData, siteData, registrationInfoData] = await Promise.all([
fetchSingle(homepagePath),
fetchSingle(speakersPath),
- fetchSingle(sitePath)
+ fetchSingle(sitePath),
+ fetchSingle(registrationInfoPath)
]);
+
data = {
homepage: homepageData,
speakers: speakersData,
site: siteData,
+ registrationInfo: registrationInfoData
};
return data;
diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte
index 888ec27..1efd26f 100644
--- a/frontend/src/routes/+page.svelte
+++ b/frontend/src/routes/+page.svelte
@@ -122,7 +122,7 @@
FINISHED: 'finished'
};
- const { homepage, speakers, site, ...settings } = data;
+ const { homepage, speakers, site, registrationInfo, ...settings } = data;
const REGISTRATION = {
HIDDEN: 'hidden',
@@ -134,8 +134,31 @@
const eventStartDate = new Date('2026-09-24T00:00:00');
const today = new Date();
const daysUntilEvent = Math.max(0, Math.ceil((eventStartDate - today) / (1000 * 60 * 60 * 24)));
- const eventStatus = settings.eventStatus ?? settings.event_status ?? EVENT_STATUS.HYPE;
+ const eventStatus = site?.eventStatus ?? site?.event_status ?? EVENT_STATUS.HYPE;
+ function plainStatusText(content, fallback) {
+ if (!content) return fallback;
+
+ return content
+ .replace(/[#*_`>~-]/g, '')
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
+ .trim();
+ }
+
+ const registrationSoonText = plainStatusText(
+ registrationInfo?.content_soon,
+ 'Pronto abriremos las inscripciones'
+ );
+
+ const registrationOpenText = plainStatusText(
+ registrationInfo?.content_open,
+ '¡Inscripciones abiertas!'
+ );
+
+ const registrationFinishedText = plainStatusText(
+ registrationInfo?.content_finished,
+ 'Inscripciones finalizadas'
+ );
const heroImage = heroLosPuertosGrises;
@@ -148,7 +171,7 @@
- © Ted Nasmith - And Aragorn Came
+ © Ted Nasmith - Thus Came Aragorn
{#if homepage && homepage.title}
@@ -183,14 +206,14 @@
class="button home-hero__button-primary home-hero__button-primary--disabled"
aria-disabled="true"
>
- Pronto abriremos las inscripciones
+ {registrationSoonText}
{:else if eventStatus === EVENT_STATUS.PUBLIC}
- ¡Inscripciones abiertas! →
+ {registrationOpenText} →
{:else if eventStatus === EVENT_STATUS.FINISHED}
-
Inscripciones finalizadas
+
{registrationFinishedText}
{/if}
diff --git a/frontend/src/routes/code-of-conduct/+page.svelte b/frontend/src/routes/code-of-conduct/+page.svelte
index 089d4df..520f38e 100644
--- a/frontend/src/routes/code-of-conduct/+page.svelte
+++ b/frontend/src/routes/code-of-conduct/+page.svelte
@@ -131,27 +131,20 @@
.charter-card__image {
position: relative;
- height: 11rem;
overflow: hidden;
border-radius: 1.15rem;
- background: var(--bulma-dark, #123f46);
+ background: transparent;
}
.charter-card__image::after {
- content: '';
- position: absolute;
- inset: 0;
- background:
- linear-gradient(90deg, rgba(18, 63, 70, 0.2), transparent 45%),
- linear-gradient(180deg, transparent 40%, rgba(18, 63, 70, 0.35));
- pointer-events: none;
+ display: none;
}
.charter-card__image img {
display: block;
width: 100%;
- height: 100%;
- object-fit: cover;
+ height: auto;
+ object-fit: contain;
object-position: center;
}
@@ -247,7 +240,8 @@
}
.charter-card__image {
- height: 10rem;
+ height: auto;
+ aspect-ratio: auto;
}
.charter-card__credit {
diff --git a/frontend/src/routes/gira-el-timon/+page.js b/frontend/src/routes/gira-el-timon/+page.js
new file mode 100644
index 0000000..ce00bd5
--- /dev/null
+++ b/frontend/src/routes/gira-el-timon/+page.js
@@ -0,0 +1,13 @@
+import { fetchSingle } from '../../services/api';
+
+/** @type {import('./$types').PageLoad} */
+export async function load() {
+ const pages = await fetchSingle('/simple-pages/?filters[path][$eq]=gira-el-timon');
+
+ return (
+ pages?.[0] ?? {
+ title: 'Gira el timón',
+ content: ''
+ }
+ );
+}
diff --git a/frontend/src/routes/gira-el-timon/+page.svelte b/frontend/src/routes/gira-el-timon/+page.svelte
new file mode 100644
index 0000000..9132510
--- /dev/null
+++ b/frontend/src/routes/gira-el-timon/+page.svelte
@@ -0,0 +1,344 @@
+
+
+
+
+
+
+
+ {#if wheelContent.intro}
+
+
+
+ {/if}
+
+
+
+
+
+
+
+
+

+
+ {#each prizes as prize, index}
+
+ {prize.number}
+
+ {/each}
+
+
+
+
+
+
+
+{#if selectedPrize}
+
+
+
+
+ Te ha tocado...
+ El número {selectedPrize.number}
+
+
+
+
+
+
+
+
+{/if}
+
+
diff --git a/frontend/src/routes/preinscripcion/+page.js b/frontend/src/routes/preinscripcion/+page.js
index 3108198..127ceda 100644
--- a/frontend/src/routes/preinscripcion/+page.js
+++ b/frontend/src/routes/preinscripcion/+page.js
@@ -2,13 +2,13 @@ import { fetchSingle } from '../../services/api';
/** @type {import('./$types').PageLoad} */
export async function load({}) {
- let data = {}
+ let data = {};
const [settingsEntry, siteEntry] = await Promise.all([
- fetchSingle("/setting"),
- fetchSingle("/enrollment")
- ]);
- if (settingsEntry || siteEntry) {
- data = {...settingsEntry, ...siteEntry}
- }
- return data;
-}
\ No newline at end of file
+ fetchSingle('/setting'),
+ fetchSingle('/enrollment')
+ ]);
+ if (settingsEntry || siteEntry) {
+ data = { ...settingsEntry, ...siteEntry };
+ }
+ return data;
+}
diff --git a/frontend/src/routes/preinscripcion/+page.svelte b/frontend/src/routes/preinscripcion/+page.svelte
index 2c51bab..74bed01 100644
--- a/frontend/src/routes/preinscripcion/+page.svelte
+++ b/frontend/src/routes/preinscripcion/+page.svelte
@@ -1,40 +1,49 @@
+
{#if data.content}
-
+
{/if}
+
{#if data.enrollment_active && options.length > 0}
-
- {#each options as optionObj_ (optionObj_.href)}
+
+ {#each options as optionObj_ (optionObj_.href)}
- {/each}
-
+ {/each}
+
{/if}
-
\ No newline at end of file
+
diff --git a/frontend/src/routes/price/+page.js b/frontend/src/routes/price/+page.js
index 849163d..f6c0294 100644
--- a/frontend/src/routes/price/+page.js
+++ b/frontend/src/routes/price/+page.js
@@ -1,13 +1,31 @@
-import { fetchCollection } from '../../services/api';
+import { encodeQuery, fetchBasic, fetchCollection } from '../../services/api';
/** @type {import('./$types').PageLoad} */
export async function load({}) {
- let data = {}
- const priceEntries = await fetchCollection("/prices?populate=*");
- if (priceEntries) {
- data = {
- prices: priceEntries
- };
- }
- return data;
-}
\ No newline at end of file
+ const tshirtFrontImagePath = `/upload/files?${encodeQuery({
+ filters: {
+ name: {
+ $eq: 'camiseta.jpg'
+ }
+ }
+ })}`;
+
+ const tshirtBackImagePath = `/upload/files?${encodeQuery({
+ filters: {
+ name: {
+ $eq: 'camiseta_trasera.jpg'
+ }
+ }
+ })}`;
+
+ const [priceEntries, tshirtFrontImages, tshirtBackImages] = await Promise.all([
+ fetchCollection('/prices?populate=*'),
+ fetchBasic(tshirtFrontImagePath),
+ fetchBasic(tshirtBackImagePath)
+ ]);
+
+ return {
+ prices: priceEntries ?? [],
+ tshirtImages: [tshirtFrontImages?.[0], tshirtBackImages?.[0]].filter(Boolean)
+ };
+}
diff --git a/frontend/src/routes/price/+page.svelte b/frontend/src/routes/price/+page.svelte
index 38a6f9b..d079334 100644
--- a/frontend/src/routes/price/+page.svelte
+++ b/frontend/src/routes/price/+page.svelte
@@ -1,9 +1,13 @@
@@ -92,8 +145,6 @@
Habitaciones
-
-
@@ -150,33 +201,59 @@
Inscripción premium
-
-
{#each premiumPrices as priceObj}
-
-
-
{priceObj.name}
-
- {#if priceObj.description}
-
{priceObj.description}
- {/if}
-
-
- openTshirtModal(priceObj)}
>
- {#if isPricePending(priceObj.value)}
- PRECIO POR DETERMINAR
- {:else}
- {priceObj.value}
- {priceObj.currency}
- {/if}
-
-
+
+
{priceObj.name}
+
+ {#if priceObj.description}
+
{priceObj.description}
+ {/if}
+
+
+
+ {#if isPricePending(priceObj.value)}
+ PRECIO POR DETERMINAR
+ {:else}
+ {priceObj.value}
+ {priceObj.currency}
+ {/if}
+
+
+ {:else}
+
+
+
{priceObj.name}
+
+ {#if priceObj.description}
+
{priceObj.description}
+ {/if}
+
+
+
+ {#if isPricePending(priceObj.value)}
+ PRECIO POR DETERMINAR
+ {:else}
+ {priceObj.value}
+ {priceObj.currency}
+ {/if}
+
+
+ {/if}
{/each}
@@ -185,10 +262,6 @@
\ No newline at end of file
+ .registration-status {
+ margin-bottom: 3rem;
+ }
+
+ .registration-status__sign {
+ position: relative;
+ display: grid;
+ grid-template-columns: 6.5rem minmax(0, 1fr) 6.5rem;
+ align-items: center;
+ gap: 1rem;
+ max-width: min(100%, 52rem);
+ margin-right: auto;
+ margin-left: auto;
+ padding: 1rem;
+ background:
+ linear-gradient(
+ 90deg,
+ rgba(70, 38, 15, 0.28),
+ transparent 14%,
+ transparent 86%,
+ rgba(70, 38, 15, 0.28)
+ ),
+ repeating-linear-gradient(
+ 90deg,
+ #8a5a2b 0,
+ #8a5a2b 1.7rem,
+ #7a4b22 1.7rem,
+ #7a4b22 1.9rem,
+ #9b6a35 1.9rem,
+ #9b6a35 3.6rem
+ );
+ border: 3px solid #4d2b13;
+ box-shadow:
+ inset 0 0 0 2px rgba(255, 226, 154, 0.22),
+ inset 0 0 1.8rem rgba(45, 22, 8, 0.5),
+ 0 1.1rem 2.4rem rgba(13, 59, 68, 0.24);
+ }
+
+ .registration-status__sign::before,
+ .registration-status__sign::after {
+ content: '';
+ position: absolute;
+ top: 0.75rem;
+ width: 0.7rem;
+ height: 0.7rem;
+ border-radius: 50%;
+ background: radial-gradient(circle, #f3d27a 0 28%, #6c3d1b 30% 100%);
+ box-shadow:
+ 0 0 0 2px rgba(45, 22, 8, 0.35),
+ 0 0.15rem 0.25rem rgba(0, 0, 0, 0.35);
+ }
+
+ .registration-status__sign::before {
+ left: 0.75rem;
+ }
+
+ .registration-status__sign::after {
+ right: 0.75rem;
+ }
+
+ .registration-status__icon {
+ display: block;
+ width: 100%;
+ max-width: 4.8rem;
+ height: auto;
+ justify-self: center;
+ opacity: 0.92;
+ filter: brightness(0) invert(1) drop-shadow(0 0.25rem 0.25rem rgba(45, 22, 8, 0.45));
+ }
+
+ .registration-status__icon--left {
+ transform: rotate(-8deg);
+ }
+
+ .registration-status__icon--right {
+ transform: rotate(8deg);
+ }
+
+ .registration-status__buttons {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 0.9rem;
+ max-width: 100%;
+ padding: 1.15rem 1.4rem;
+ background:
+ linear-gradient(rgba(255, 244, 207, 0.92), rgba(255, 244, 207, 0.92)),
+ radial-gradient(circle at 20% 20%, rgba(176, 107, 45, 0.18), transparent 34%),
+ radial-gradient(circle at 80% 80%, rgba(13, 59, 68, 0.12), transparent 38%);
+ border: 2px solid rgba(77, 43, 19, 0.78);
+ box-shadow:
+ inset 0 0 0 3px rgba(255, 255, 255, 0.35),
+ 0 0.55rem 1rem rgba(45, 22, 8, 0.24);
+ }
+
+ .registration-status__buttons::before,
+ .registration-status__buttons::after {
+ content: '';
+ position: absolute;
+ right: 1rem;
+ left: 1rem;
+ height: 1px;
+ background: linear-gradient(90deg, transparent, rgba(77, 43, 19, 0.5), transparent);
+ }
+
+ .registration-status__buttons::before {
+ top: 0.55rem;
+ }
+
+ .registration-status__buttons::after {
+ bottom: 0.55rem;
+ }
+
+ .registration-status__button {
+ position: relative;
+ z-index: 1;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ max-width: 100%;
+ height: auto;
+ min-height: auto;
+ padding: 1rem 2.1rem;
+ overflow: hidden;
+ border: 1px solid rgba(255, 244, 207, 0.72);
+ border-radius: 999px;
+ background:
+ linear-gradient(135deg, rgba(255, 255, 255, 0.18), transparent 38%),
+ linear-gradient(180deg, #ffe6a3 0%, #d7b56d 54%, #a96b2b 100%);
+ color: #0d3b44;
+ font-family: var(--bulma-family-primary, inherit);
+ font-size: 1.1rem;
+ font-weight: 900;
+ line-height: 1.2;
+ text-align: center;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.38);
+ white-space: normal;
+ box-shadow:
+ inset 0 1px 0 rgba(255, 255, 255, 0.72),
+ inset 0 -0.25rem 0 rgba(77, 43, 19, 0.22),
+ 0 0.9rem 1.8rem rgba(45, 22, 8, 0.28);
+ transition:
+ transform 180ms ease,
+ box-shadow 180ms ease,
+ filter 180ms ease;
+ }
+
+ .registration-status__button::before {
+ content: '';
+ position: absolute;
+ inset: 0.28rem;
+ border: 1px solid rgba(77, 43, 19, 0.28);
+ border-radius: inherit;
+ pointer-events: none;
+ }
+
+ .registration-status__button::after {
+ content: '';
+ position: absolute;
+ top: -60%;
+ left: -35%;
+ width: 32%;
+ height: 220%;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.45), transparent);
+ transform: rotate(18deg);
+ transition: left 260ms ease;
+ pointer-events: none;
+ }
+
+ .registration-status__button:hover {
+ border-color: rgba(255, 244, 207, 0.9);
+ background:
+ linear-gradient(135deg, rgba(255, 255, 255, 0.22), transparent 38%),
+ linear-gradient(180deg, #fff0bd 0%, #ddb96d 54%, #a96b2b 100%);
+ color: #0d3b44;
+ filter: brightness(1.03);
+ transform: translateY(-2px);
+ box-shadow:
+ inset 0 1px 0 rgba(255, 255, 255, 0.8),
+ inset 0 -0.25rem 0 rgba(77, 43, 19, 0.24),
+ 0 1.1rem 2rem rgba(45, 22, 8, 0.34);
+ }
+
+ .registration-status__button:hover::after {
+ left: 105%;
+ }
+
+ .registration-status__button span {
+ display: inline-block;
+ margin-left: 0.35rem;
+ line-height: 1;
+ transition: transform 180ms ease;
+ }
+
+ .registration-status__button:hover span {
+ transform: translateX(3px);
+ }
+
+ .registration-status__button--disabled,
+ .registration-status__button--disabled:hover {
+ cursor: not-allowed;
+ border-color: rgba(255, 244, 207, 0.36);
+ background:
+ linear-gradient(135deg, rgba(255, 255, 255, 0.08), transparent 38%),
+ linear-gradient(180deg, rgba(215, 181, 109, 0.52), rgba(169, 107, 43, 0.44));
+ color: rgba(13, 59, 68, 0.62);
+ text-shadow: none;
+ box-shadow:
+ inset 0 1px 0 rgba(255, 255, 255, 0.26),
+ inset 0 -0.2rem 0 rgba(77, 43, 19, 0.12),
+ 0 0.65rem 1.2rem rgba(45, 22, 8, 0.18);
+ filter: none;
+ transform: none;
+ }
+
+ .registration-status__button--disabled::after {
+ display: none;
+ }
+
+ .registration-status__button--disabled:hover span {
+ transform: none;
+ }
+
+ .registration-status__message {
+ position: relative;
+ z-index: 1;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ max-width: 100%;
+ margin: 0;
+ padding: 0.9rem 1.4rem;
+ border: 2px solid #4d2b13;
+ background: rgba(13, 59, 68, 0.88);
+ color: rgba(255, 244, 207, 0.96);
+ font-family: var(--bulma-family-primary, inherit);
+ font-weight: 700;
+ line-height: 1.25;
+ text-align: center;
+ white-space: normal;
+ box-shadow:
+ inset 0 0 0 2px rgba(255, 255, 255, 0.08),
+ 0 0.55rem 1rem rgba(45, 22, 8, 0.24);
+ }
+
+ .registration-process__intro {
+ margin-bottom: 2rem;
+ }
+
+ .registration-steps {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+ .registration-step {
+ position: relative;
+ display: grid;
+ grid-template-columns: auto minmax(0, 1fr);
+ gap: 1.1rem;
+ margin-bottom: 1.4rem;
+ }
+
+ .registration-step:not(:last-child)::before {
+ content: '';
+ position: absolute;
+ top: 3rem;
+ bottom: -1.4rem;
+ left: 1.35rem;
+ width: 0.35rem;
+ background: repeating-linear-gradient(
+ 180deg,
+ #b06b2d 0,
+ #b06b2d 0.45rem,
+ #d7b56d 0.45rem,
+ #d7b56d 0.9rem
+ );
+ border-radius: 999px;
+ box-shadow: inset 0 0 0 1px rgba(13, 59, 68, 0.12);
+ }
+
+ .registration-step__number {
+ position: relative;
+ z-index: 1;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 3rem;
+ height: 3rem;
+ border: 3px solid #b06b2d;
+ border-radius: 50%;
+ background: #ffffff;
+ color: #0d3b44;
+ font-family: var(--bulma-family-primary, inherit);
+ font-weight: 700;
+ box-shadow:
+ 0 0 0 0.35rem rgba(255, 255, 255, 0.95),
+ 0 0.5rem 1rem rgba(13, 59, 68, 0.12);
+ }
+
+ .registration-step__content {
+ padding: 1rem 1.25rem;
+ border-left: 4px solid #43b2dc;
+ background: rgba(255, 255, 255, 0.72);
+ box-shadow: 0 0.6rem 1.4rem rgba(13, 59, 68, 0.08);
+ }
+
+ .registration-step__content :global(p) {
+ margin: 0;
+ }
+
+ @media screen and (max-width: 768px) {
+ .registration-status__sign {
+ grid-template-columns: 3.8rem minmax(0, 1fr) 3.8rem;
+ gap: 0.55rem;
+ padding: 0.7rem;
+ }
+
+ .registration-status__buttons {
+ padding: 0.95rem 0.8rem;
+ }
+
+ .registration-status__icon {
+ max-width: 3.1rem;
+ }
+
+ .registration-status__button,
+ .registration-status__message {
+ width: 100%;
+ font-size: 0.95rem;
+ }
+
+ .registration-step {
+ gap: 0.85rem;
+ }
+
+ .registration-step__content {
+ padding: 0.9rem 1rem;
+ }
+ }
+
diff --git a/frontend/src/routes/speakers/+page.js b/frontend/src/routes/speakers/+page.js
index 9ae4b9b..9319330 100644
--- a/frontend/src/routes/speakers/+page.js
+++ b/frontend/src/routes/speakers/+page.js
@@ -2,16 +2,18 @@ import { fetchSingle, fetchCollection } from '../../services/api';
/** @type {import('./$types').PageLoad} */
export async function load({}) {
- let data = {}
+ let data = {};
const [speakersEntry, profileEntries] = await Promise.all([
- fetchSingle("/speakers"),
- fetchCollection("/public-profiles?filters[$or][0][is_guest][$eq]=true&filters[$or][1][is_speaker][$eq]=true&populate=*&sort[0]=order:asc"),
- ]);
- if (speakersEntry || profileEntries) {
- data = {
- speakers: speakersEntry,
- speaker_profiles: profileEntries,
- };
- }
- return data;
+ fetchSingle('/speakers'),
+ fetchCollection(
+ '/public-profiles?filters[$or][0][is_guest][$eq]=true&filters[$or][1][is_speaker][$eq]=true&populate=*&sort=order:asc'
+ )
+ ]);
+ if (speakersEntry || profileEntries) {
+ data = {
+ speakers: speakersEntry,
+ speaker_profiles: profileEntries
+ };
+ }
+ return data;
}
diff --git a/frontend/src/routes/speakers/+page.svelte b/frontend/src/routes/speakers/+page.svelte
index e7ec233..59780a0 100644
--- a/frontend/src/routes/speakers/+page.svelte
+++ b/frontend/src/routes/speakers/+page.svelte
@@ -1,62 +1,157 @@
-
-
- {#if data.speakers.content}
-
- {/if}
-
-
- {#each data.speaker_profiles as speaker_profile, i}
-
-
-
-
-
![]()
handleClick(speaker_profile)} src="{storage_url}{speaker_profile.photo.url}"/>
-
-
- {#if speaker_profile.is_guest}
-
Special guest
- {/if}
-
-
-
{speaker_profile.fullname}
- {#if speaker_profile.nickname}
- "{speaker_profile.nickname}"
- {/if}
-
-
- {#if speaker_profile.title}
-
{speaker_profile.title}
- {/if}
-
-
-
-
- {/each}
-
-
+
+
+ {#if data.speakers.content}
+
+ {/if}
+
+
+ {#each data.speaker_profiles as speaker_profile, i}
+
+
+
+
![]()
handleClick(speaker_profile)}
+ src="{storage_url}{speaker_profile.photo.url}"
+ alt={speaker_profile.fullname}
+ />
+
+
+
+ {#if speaker_profile.is_guest}
+
Invitada principal
+ {/if}
+
+
+ {speaker_profile.fullname}
+ {#if speaker_profile.nickname}
+ "{speaker_profile.nickname}"
+ {/if}
+
+
+ {#if speaker_profile.title}
+
{speaker_profile.title}
+ {/if}
+
+
+
+ {/each}
+
+
+
+
+