family.hotelalpenhof.it
Open in
urlscan Pro
142.93.106.92
Public Scan
Submitted URL: https://mail.aa.hotelalpenhof.it/lnk/CAAABXtin3sAAAAAAAAAADXACS8AAAAArmkAAAAAACDBgQBmL9surn5U3nozSg60ouqCeS4WZAAZSds/10/48Ux4-j3X...
Effective URL: https://family.hotelalpenhof.it/it/vacanza-di-famiglia?utm_source=additive-newsletter&utm_medium=email&utm_campaign=o_p_t_n_l_ap...
Submission: On April 30 via manual from IT — Scanned from IT
Effective URL: https://family.hotelalpenhof.it/it/vacanza-di-famiglia?utm_source=additive-newsletter&utm_medium=email&utm_campaign=o_p_t_n_l_ap...
Submission: On April 30 via manual from IT — Scanned from IT
Form analysis
1 forms found in the DOM/hotelalpenhof-it/guestenquiries
<form class="p-6 sm:p-12 sm:pt-4" action="/hotelalpenhof-it/guestenquiries" x-data="enquiryForm()" x-init="
$watch('formData.person.givenName', value => { validate('givenName', value) });
$watch('formData.person.familyName', value => { validate('familyName', value) });
$watch('formData.person.email', value => { validate('email', value) });
$watch('privacy', value => { validate('privacy', value) });
$nextTick(() => {
trackStartPurchase = function(type, id) {
if (!type || !id) {
return;
}
const uuid = crypto.randomUUID();
const payload = { meta_data: {
'unique_event_id': uuid
}
};
if (typeof ddtv === 'function') {
ddtv('send', 'action', 'StartPurchase', type, id, payload);
}
if (typeof fbq === 'function') {
const trackingData = {};
if (type) {
trackingData.content_type = 'Product';
trackingData.content_category = type;
if (id) {
trackingData.content_ids = [id];
trackingData.num_items = 1;
}
}
fbq('track', 'InitiateCheckout', trackingData, {eventID: uuid});
}
if (typeof ttq === 'object' && typeof ttq.track === 'function') {
ttq.instance(this.tiktokId).track('InitiateCheckout');
}
isStartPurchaseTracked = true;
}
selectLastMinuteOffer = function(id) {
if (datePicker && lastMinuteOffers[id].timespan.startsAt && lastMinuteOffers[id].timespan.endsAt) {
selectedLastMinuteOffer = lastMinuteOffers[id];
isBooking = true;
let startsAt = new Date(lastMinuteOffers[id].timespan.startsAt);
if (new Date() > startsAt) {
startsAt = new Date();
}
datePicker.setEndDate( lastMinuteOffers[id].timespan.endsAt);
datePicker.setStartDate(lastMinuteOffers[id].timespan.startsAt);
datePicker.trigger('select');
}
if (lastMinuteOffers[id].occupancyMin) {
minAdults = parseInt(lastMinuteOffers[id].occupancyMin);
}
if (lastMinuteOffers[id].occupancyMax) {
maxAdults = parseInt(lastMinuteOffers[id].occupancyMax);
}
if (formData.roomStays[0].adults.count < minAdults) {
formData.roomStays[0].adults.count = minAdults;
} else if (formData.roomStays[0].adults.count > maxAdults) {
formData.roomStays[0].adults.count = maxAdults;
}
}
});
" @submit.prevent="submitData" style="border-radius: 2px;">
<div class="flex flex-col justify-between lg:flex-row mb-12">
<div class="lg:w-1/2 lg:pr-20">
<div class="mb-12" x-data="{
dateOptions: { weekday: 'short', year: 'numeric', month: windowWidth < 1024 ? 'short' : '2-digit', day: windowWidth < 1024 ? 'numeric' : '2-digit' },
startDate: null,
get formattedStartDate() {
return this.startDate?.toLocaleDateString('it', this.dateOptions);
},
endDate: null,
get formattedEndDate() {
return this.endDate?.toLocaleDateString('it', this.dateOptions);
},
get dateDiff() {
if (!this.startDate || !this.endDate) {
return null;
}
const dayDiff = (this.endDate - this.startDate) / 86400000;
return dayDiff === 1 ? dayDiff + ' notte' : dayDiff + ' notti';
},
init() {
const today = new Date();
const nextWeek = new Date();
nextWeek.setDate(nextWeek.getDate() + 7);
let blockedDateRanges = [
].sort((a, b) => {
if (a.start < b.start) {
return -1;
}
if (a.start > b.start) {
return 1;
}
return 0;
}).reduce((accumulator, nextRange) => {
const lastRange = accumulator.length && accumulator[accumulator.length - 1];
let lastRangeEnd = null;
if (lastRange) {
lastRangeEnd = new Date(lastRange.end);
lastRangeEnd.setDate(lastRangeEnd.getDate() + 1);
}
let nextRangeStart = new Date(nextRange.start);
nextRangeStart.setDate(nextRangeStart.getDate() - 1);
if (lastRangeEnd && nextRangeStart <= lastRangeEnd) {
lastRange.end = lastRange.end > nextRange.end ? lastRange.end : nextRange.end;
} else {
accumulator.push({ ...nextRange });
}
return accumulator;
}, []);
const startDate = new Date(this.formData.roomStays[0].startDate);
this.startDate = new Date(`${startDate.getFullYear()}/${(startDate.getMonth() + 1)}/${startDate.getDate()} 12:00:00 GMT`);
const endDate = new Date(this.formData.roomStays[0].endDate);
this.endDate = new Date(`${endDate.getFullYear()}/${(endDate.getMonth() + 1)}/${endDate.getDate()} 12:00:00 GMT`);
let firstPossibleStartDay = this.startDate;
let firstPossibleEndDay = this.endDate;
blockedDateRanges.forEach((range) => {
let rangeStart = new Date(range.start);
rangeStart.setDate(rangeStart.getDate() - 1);
if (firstPossibleStartDay >= rangeStart && firstPossibleStartDay <= new Date(range.end)) {
firstPossibleStartDay = new Date(range.end);
firstPossibleStartDay.setDate(firstPossibleStartDay.getDate() + 1);
firstPossibleEndDay = new Date(range.end);
firstPossibleEndDay.setDate(firstPossibleEndDay.getDate() + 8);
}
if (firstPossibleEndDay >= new Date(range.start) && firstPossibleEndDay <= new Date(range.end) || firstPossibleEndDay >= new Date(range.end) && firstPossibleStartDay < new Date(range.start)) {
firstPossibleEndDay = new Date(range.start);
firstPossibleEndDay.setDate(firstPossibleEndDay.getDate() - 1);
}
});
if (firstPossibleStartDay != this.startDate) {
this.startDate = new Date(`${firstPossibleStartDay.getFullYear()}/${(firstPossibleStartDay.getMonth() + 1)}/${firstPossibleStartDay.getDate()} 12:00:00 GMT`);
this.formData.roomStays[0].startDate = `${this.startDate.getFullYear()}-${('0'+(this.startDate.getMonth()+1)).slice(-2)}-${('0'+(this.startDate.getDate())).slice(-2)}`;
}
if (firstPossibleEndDay != this.endDate) {
this.endDate = new Date(`${firstPossibleEndDay.getFullYear()}/${(firstPossibleEndDay.getMonth() + 1)}/${firstPossibleEndDay.getDate()} 12:00:00 GMT`);
this.formData.roomStays[0].endDate = `${this.endDate.getFullYear()}-${('0'+(this.endDate.getMonth()+1)).slice(-2)}-${('0'+(this.endDate.getDate())).slice(-2)}`;
}
$nextTick(() => {
datePicker = new easepick.create({
element: '#date-start',
lang: 'it',
zIndex: 1,
css: [
'https://content.additive-apps.tech/css/landing-page.css'
],
plugins: ['RangePlugin', 'LockPlugin'],
RangePlugin: {
elementEnd: '#date-end',
startDate: today,
endDate: nextWeek,
tooltip: false
},
LockPlugin: {
minDate: new Date(),
minDays: 2,
inseparable: true,
filter(date, picked) {
return blockedDateRanges.some((range) => {
if (range.start <= date.format('YYYY-MM-DD') && range.end >= date.format('YYYY-MM-DD')) {
return true;
}
});
},
},
setup: (datePicker) => {
datePicker.on('select', () => {
const startDate = datePicker.getStartDate();
this.startDate = startDate
? new Date(`${startDate.getFullYear()}/${(startDate.getMonth() + 1)}/${startDate.getDate()} 12:00:00 GMT`)
: null;
this.formData.roomStays[0].startDate = startDate
? `${this.startDate.getFullYear()}-${('0'+(this.startDate.getMonth()+1)).slice(-2)}-${('0'+(this.startDate.getDate())).slice(-2)}`
: null;
const endDate = datePicker.getEndDate();
this.endDate = endDate
? new Date(`${endDate.getFullYear()}/${(endDate.getMonth() + 1)}/${endDate.getDate()} 12:00:00 GMT`)
: null;
this.formData.roomStays[0].endDate = this.endDate
? `${this.endDate.getFullYear()}-${('0'+(this.endDate.getMonth()+1)).slice(-2)}-${('0'+(this.endDate.getDate())).slice(-2)}`
: null;
if (!isStartPurchaseTracked) {
typeof trackStartPurchase === 'function' && trackStartPurchase();
}
validate('dateRange', this.formData.roomStays[0].startDate, this.formData.roomStays[0].endDate);
})
}
});
datePicker.setEndDate(this.endDate);
datePicker.setStartDate(this.startDate);
datePicker.trigger('select');
});
}
}" @resize.window="
dateOptions = { weekday: 'short', year: 'numeric', month: windowWidth < 1024 ? 'short' : '2-digit', day: windowWidth < 1024 ? 'numeric' : '2-digit' };
">
<div class="font-semibold mb-6">Selezionare giorno d'arrivo e di partenza</div>
<div class="sm:flex mb-1">
<div class="sm:w-1/2 sm:pr-1">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="date-start">Giorno d'arrivo</label>
<div>
<template x-if="!selectedLastMinuteOffer">
<div class="relative h-12 px-4" id="date-wrapper-start">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<div class="flex h-full items-center">
<svg class="min-w-3.5" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M2 0.5C2 0.223858 2.22386 0 2.5 0H4.5C4.77614 0 5 0.223858 5 0.5V2H9V0.5C9 0.223858 9.22386 0 9.5 0H11.5C11.7761 0 12 0.223858 12 0.5V2H13.5C13.7761 2 14 2.22386 14 2.5V5V6.5V15.5C14 15.7761 13.7761 16 13.5 16H0.5C0.223857 16 0 15.7761 0 15.5V6.5V5V2.5C0 2.22386 0.223858 2 0.5 2H2V0.5ZM12.5 3.5V5H1.5V3.5H12.5ZM1.5 14.5V6.5H12.5V14.5H1.5ZM3.5 8C3.22386 8 3 8.22386 3 8.5V10.5C3 10.7761 3.22386 11 3.5 11H5.5C5.77614 11 6 10.7761 6 10.5V8.5C6 8.22386 5.77614 8 5.5 8H3.5Z">
</path>
</svg>
<div class="ml-3" x-text="formattedStartDate"></div>
</div>
<input class="absolute top-0 left-0 w-full h-full cursor-pointer opacity-0" name="date[start]" id="date-start" type="text" x-model="formData.roomStays[0].startDate">
</div>
</template>
<div class="relative h-12 px-4" id="date-wrapper-start">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<div class="flex h-full items-center">
<svg class="min-w-3.5" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M2 0.5C2 0.223858 2.22386 0 2.5 0H4.5C4.77614 0 5 0.223858 5 0.5V2H9V0.5C9 0.223858 9.22386 0 9.5 0H11.5C11.7761 0 12 0.223858 12 0.5V2H13.5C13.7761 2 14 2.22386 14 2.5V5V6.5V15.5C14 15.7761 13.7761 16 13.5 16H0.5C0.223857 16 0 15.7761 0 15.5V6.5V5V2.5C0 2.22386 0.223858 2 0.5 2H2V0.5ZM12.5 3.5V5H1.5V3.5H12.5ZM1.5 14.5V6.5H12.5V14.5H1.5ZM3.5 8C3.22386 8 3 8.22386 3 8.5V10.5C3 10.7761 3.22386 11 3.5 11H5.5C5.77614 11 6 10.7761 6 10.5V8.5C6 8.22386 5.77614 8 5.5 8H3.5Z">
</path>
</svg>
<div class="ml-3" x-text="formattedStartDate">mar 30/04/2024</div>
</div>
<input class="absolute top-0 left-0 w-full h-full cursor-pointer opacity-0" name="date[start]" id="date-start" type="text" x-model="formData.roomStays[0].startDate" readonly=""><span class="easepick-wrapper"
style="position: absolute; pointer-events: none;"></span>
</div>
</div>
<div>
<template x-if="selectedLastMinuteOffer">
<div x-text="formattedStartDate"></div>
</template>
</div>
</div>
<div class="mt-4 sm:w-1/2 sm:pl-1 sm:mt-0">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="date-end">Giorno di partenza</label>
<div>
<template x-if="!selectedLastMinuteOffer">
<div class="relative h-12 px-4" id="date-wrapper-end">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<div class="flex h-full items-center">
<svg class="min-w-3.5" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M2 0.5C2 0.223858 2.22386 0 2.5 0H4.5C4.77614 0 5 0.223858 5 0.5V2H9V0.5C9 0.223858 9.22386 0 9.5 0H11.5C11.7761 0 12 0.223858 12 0.5V2H13.5C13.7761 2 14 2.22386 14 2.5V5V6.5V15.5C14 15.7761 13.7761 16 13.5 16H0.5C0.223857 16 0 15.7761 0 15.5V6.5V5V2.5C0 2.22386 0.223858 2 0.5 2H2V0.5ZM12.5 3.5V5H1.5V3.5H12.5ZM1.5 14.5V6.5H12.5V14.5H1.5ZM3.5 8C3.22386 8 3 8.22386 3 8.5V10.5C3 10.7761 3.22386 11 3.5 11H5.5C5.77614 11 6 10.7761 6 10.5V8.5C6 8.22386 5.77614 8 5.5 8H3.5Z">
</path>
</svg>
<div class="ml-3" x-text="formattedEndDate"></div>
</div>
<input class="absolute top-0 left-0 w-full h-full cursor-pointer opacity-0" name="date[end]" id="date-end" type="text" x-model="formData.roomStays[0].endDate">
</div>
</template>
<div class="relative h-12 px-4" id="date-wrapper-end">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<div class="flex h-full items-center">
<svg class="min-w-3.5" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd"
d="M2 0.5C2 0.223858 2.22386 0 2.5 0H4.5C4.77614 0 5 0.223858 5 0.5V2H9V0.5C9 0.223858 9.22386 0 9.5 0H11.5C11.7761 0 12 0.223858 12 0.5V2H13.5C13.7761 2 14 2.22386 14 2.5V5V6.5V15.5C14 15.7761 13.7761 16 13.5 16H0.5C0.223857 16 0 15.7761 0 15.5V6.5V5V2.5C0 2.22386 0.223858 2 0.5 2H2V0.5ZM12.5 3.5V5H1.5V3.5H12.5ZM1.5 14.5V6.5H12.5V14.5H1.5ZM3.5 8C3.22386 8 3 8.22386 3 8.5V10.5C3 10.7761 3.22386 11 3.5 11H5.5C5.77614 11 6 10.7761 6 10.5V8.5C6 8.22386 5.77614 8 5.5 8H3.5Z">
</path>
</svg>
<div class="ml-3" x-text="formattedEndDate">mar 07/05/2024</div>
</div>
<input class="absolute top-0 left-0 w-full h-full cursor-pointer opacity-0" name="date[end]" id="date-end" type="text" x-model="formData.roomStays[0].endDate" readonly="">
</div>
</div>
<div>
<template x-if="selectedLastMinuteOffer">
<div x-text="formattedEndDate"></div>
</template>
</div>
</div>
</div>
<div class="block label-font-style text-red mb-3" :class="{
'h-5 mb-1': validation.dateRange.message,
'mb-3': !validation.dateRange.message
}" x-text="validation.dateRange.message"></div>
<div class="small-font-style md:small-font-style" x-text="dateDiff">7 notti</div>
</div>
<div>
<div class="font-semibold mb-6">Dati di viaggio</div>
<div class="mb-8" x-data="{
get countString() { return this.formData.roomStays[0].adults.count === 1 ? this.formData.roomStays[0].adults.count + ' Adulto' : this.formData.roomStays[0].adults.count + ' Adulti' },
get decrementDisabled() { return this.formData.roomStays[0].adults.count === minAdults },
get incrementDisabled() { return this.formData.roomStays[0].adults.count === maxAdults },
increment($event) {
if (this.formData.roomStays[0].adults.count < maxAdults) {
this.formData.roomStays[0].adults.count++;
}
},
decrement() {
if (this.formData.roomStays[0].adults.count > minAdults) {
this.formData.roomStays[0].adults.count--;
}
}
}">
<label class="block small-font-style mb-3 opacity-40 md:small-font-style">Adulti</label>
<div class="flex items-center">
<button type="button" class="flex items-center justify-center w-8 h-8 rounded-sm border bg-transparent transition text-button border-button hover:opacity-60" :class="decrementDisabled ? 'opacity-20' : 'hover:opacity-60'"
:disabled="decrementDisabled" @click="decrement()">
<svg width="12" height="2" viewBox="0 0 12 2" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M11.8334 0.791667V1.20833C11.8334 1.43845 11.6469 1.625 11.4167 1.625H0.583415C0.353296 1.625 0.166748 1.43845 0.166748 1.20833V0.791667C0.166748 0.561548 0.353296 0.375 0.583415 0.375H11.4167C11.6469 0.375 11.8334 0.561548 11.8334 0.791667Z">
</path>
</svg>
</button>
<button type="button" class="flex items-center justify-center w-8 h-8 ml-2 rounded-sm border bg-transparent transition text-button border-button hover:opacity-60" :class="incrementDisabled ? 'opacity-20' : 'hover:opacity-60'"
:disabled="incrementDisabled" @click="increment()">
<svg width="12" height="12" viewBox="0 0 12 12" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.20842 0.166748C6.43853 0.166748 6.62508 0.353296 6.62508 0.583415V5.37508H11.4167C11.6469 5.37508 11.8334 5.56163 11.8334 5.79175V6.20842C11.8334 6.43853 11.6469 6.62508 11.4167 6.62508H6.62508V11.4167C6.62508 11.6469 6.43853 11.8334 6.20842 11.8334H5.79175C5.56163 11.8334 5.37508 11.6469 5.37508 11.4167V6.62508H0.583415C0.353296 6.62508 0.166748 6.43853 0.166748 6.20842V5.79175C0.166748 5.56163 0.353296 5.37508 0.583415 5.37508H5.37508V0.583415C5.37508 0.353296 5.56163 0.166748 5.79175 0.166748H6.20842Z">
</path>
</svg>
</button>
<div class="font-semibold ml-4" id="adults-label" x-text="countString">2 Adulti</div>
<input name="adults" id="adults" type="hidden" x-model="formData.roomStays[0].adults.count" value="2">
</div>
</div>
<template x-if="!isBooking">
<div class="mb-8" x-data="{
get countString() { return this.formData.roomStays[0].children.count === 1 ? this.formData.roomStays[0].children.count + ' Bambino' : this.formData.roomStays[0].children.count + ' Bambini' },
get decrementDisabled() { return this.formData.roomStays[0].children.count === 0 },
get incrementDisabled() { return this.formData.roomStays[0].children.count === 5 },
increment($event) {
if (this.formData.roomStays[0].children.count < 5) {
this.formData.roomStays[0].children.count++;
this.formData.roomStays[0].children.ages.push('');
}
},
decrement() {
if (this.formData.roomStays[0].children.count > 0) {
this.formData.roomStays[0].children.count--;
this.formData.roomStays[0].children.ages.splice(-1);
if (validation.childrenAges.error) {
validate('childrenAges', formData.roomStays[0].children?.ages);
}
}
}
}">
<label class="block small-font-style mb-3 opacity-40 md:small-font-style">Bambini</label>
<div class="flex items-center">
<button type="button" class="flex items-center justify-center w-8 h-8 rounded-sm border bg-transparent transition text-button border-button" :class="decrementDisabled ? 'opacity-20' : 'hover:opacity-60'" :disabled="decrementDisabled"
@click="decrement()">
<svg width="12" height="2" viewBox="0 0 12 2" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M11.8334 0.791667V1.20833C11.8334 1.43845 11.6469 1.625 11.4167 1.625H0.583415C0.353296 1.625 0.166748 1.43845 0.166748 1.20833V0.791667C0.166748 0.561548 0.353296 0.375 0.583415 0.375H11.4167C11.6469 0.375 11.8334 0.561548 11.8334 0.791667Z">
</path>
</svg>
</button>
<button type="button" class="flex items-center justify-center w-8 h-8 ml-2 rounded-sm border bg-transparent transition text-button border-button" :class="incrementDisabled ? 'opacity-20' : 'hover:opacity-60'"
:disabled="incrementDisabled" @click="increment()">
<svg width="12" height="12" viewBox="0 0 12 12" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.20842 0.166748C6.43853 0.166748 6.62508 0.353296 6.62508 0.583415V5.37508H11.4167C11.6469 5.37508 11.8334 5.56163 11.8334 5.79175V6.20842C11.8334 6.43853 11.6469 6.62508 11.4167 6.62508H6.62508V11.4167C6.62508 11.6469 6.43853 11.8334 6.20842 11.8334H5.79175C5.56163 11.8334 5.37508 11.6469 5.37508 11.4167V6.62508H0.583415C0.353296 6.62508 0.166748 6.43853 0.166748 6.20842V5.79175C0.166748 5.56163 0.353296 5.37508 0.583415 5.37508H5.37508V0.583415C5.37508 0.353296 5.56163 0.166748 5.79175 0.166748H6.20842Z">
</path>
</svg>
</button>
<div class="font-semibold ml-4" id="adults-label" x-text="countString">0 Bambini</div>
<input name="adults" id="adults" type="hidden" x-model="formData.roomStays[0].children.count">
</div>
<template x-if="formData.roomStays[0].children.count > 0">
<div class="mt-8">
<label class="block small-font-style mb-3 opacity-40 md:small-font-style">Età bambini</label>
<div class="flex flex-wrap -ml-2">
<template x-for="i in formData.roomStays[0].children.count">
<div class="relative h-12 ml-2 mb-2">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<select class="relative w-full h-full bg-transparent pl-2 pr-4" :name="'minorage[' + i + ']'"
@change="formData.roomStays[0].children.ages[i-1] = $event.target.value; validation.childrenAges.error && validate('childrenAges', formData.roomStays[0].children?.ages);">
<option class="dn" disabled="" selected="" value="">Seleziona età</option>
<template x-for="j in 19">
<option :selected="formData.roomStays[0].children.ages[i-1] === String(-1 + j)" :value="-1 + j" x-text="(-1 + j) === 1 ? `${ -1 + j } Anno` : `${ -1 + j } Anni`"></option>
</template>
</select>
</div>
</template>
</div>
<div class="block label-font-style h-5 text-red" x-text="validation.childrenAges.message"></div>
</div>
</template>
</div>
</template>
<div class="mb-8" x-data="{
get countString() { return this.formData.roomStays[0].children.count === 1 ? this.formData.roomStays[0].children.count + ' Bambino' : this.formData.roomStays[0].children.count + ' Bambini' },
get decrementDisabled() { return this.formData.roomStays[0].children.count === 0 },
get incrementDisabled() { return this.formData.roomStays[0].children.count === 5 },
increment($event) {
if (this.formData.roomStays[0].children.count < 5) {
this.formData.roomStays[0].children.count++;
this.formData.roomStays[0].children.ages.push('');
}
},
decrement() {
if (this.formData.roomStays[0].children.count > 0) {
this.formData.roomStays[0].children.count--;
this.formData.roomStays[0].children.ages.splice(-1);
if (validation.childrenAges.error) {
validate('childrenAges', formData.roomStays[0].children?.ages);
}
}
}
}">
<label class="block small-font-style mb-3 opacity-40 md:small-font-style">Bambini</label>
<div class="flex items-center">
<button type="button" class="flex items-center justify-center w-8 h-8 rounded-sm border bg-transparent transition text-button border-button opacity-20" :class="decrementDisabled ? 'opacity-20' : 'hover:opacity-60'"
:disabled="decrementDisabled" @click="decrement()" disabled="disabled">
<svg width="12" height="2" viewBox="0 0 12 2" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M11.8334 0.791667V1.20833C11.8334 1.43845 11.6469 1.625 11.4167 1.625H0.583415C0.353296 1.625 0.166748 1.43845 0.166748 1.20833V0.791667C0.166748 0.561548 0.353296 0.375 0.583415 0.375H11.4167C11.6469 0.375 11.8334 0.561548 11.8334 0.791667Z">
</path>
</svg>
</button>
<button type="button" class="flex items-center justify-center w-8 h-8 ml-2 rounded-sm border bg-transparent transition text-button border-button hover:opacity-60" :class="incrementDisabled ? 'opacity-20' : 'hover:opacity-60'"
:disabled="incrementDisabled" @click="increment()">
<svg width="12" height="12" viewBox="0 0 12 12" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.20842 0.166748C6.43853 0.166748 6.62508 0.353296 6.62508 0.583415V5.37508H11.4167C11.6469 5.37508 11.8334 5.56163 11.8334 5.79175V6.20842C11.8334 6.43853 11.6469 6.62508 11.4167 6.62508H6.62508V11.4167C6.62508 11.6469 6.43853 11.8334 6.20842 11.8334H5.79175C5.56163 11.8334 5.37508 11.6469 5.37508 11.4167V6.62508H0.583415C0.353296 6.62508 0.166748 6.43853 0.166748 6.20842V5.79175C0.166748 5.56163 0.353296 5.37508 0.583415 5.37508H5.37508V0.583415C5.37508 0.353296 5.56163 0.166748 5.79175 0.166748H6.20842Z">
</path>
</svg>
</button>
<div class="font-semibold ml-4" id="adults-label" x-text="countString">0 Bambini</div>
<input name="adults" id="adults" type="hidden" x-model="formData.roomStays[0].children.count" value="0">
</div>
<template x-if="formData.roomStays[0].children.count > 0">
<div class="mt-8">
<label class="block small-font-style mb-3 opacity-40 md:small-font-style">Età bambini</label>
<div class="flex flex-wrap -ml-2">
<template x-for="i in formData.roomStays[0].children.count">
<div class="relative h-12 ml-2 mb-2">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<select class="relative w-full h-full bg-transparent pl-2 pr-4" :name="'minorage[' + i + ']'"
@change="formData.roomStays[0].children.ages[i-1] = $event.target.value; validation.childrenAges.error && validate('childrenAges', formData.roomStays[0].children?.ages);">
<option class="dn" disabled="" selected="" value="">Seleziona età</option>
<template x-for="j in 19">
<option :selected="formData.roomStays[0].children.ages[i-1] === String(-1 + j)" :value="-1 + j" x-text="(-1 + j) === 1 ? `${ -1 + j } Anno` : `${ -1 + j } Anni`"></option>
</template>
</select>
</div>
</template>
</div>
<div class="block label-font-style h-5 text-red" x-text="validation.childrenAges.message"></div>
</div>
</template>
</div>
</div>
<template x-if="Object.keys(rooms).length">
<div class="mb-8 dn" x-init="
$nextTick(() => {
selectRoom = function(id, isLastMinute = false, shouldScrollToForm = true) {
$el.classList.remove('dn');
formData.roomStays[0].roomType = rooms[id].code;
formData.roomStays[0].roomTypeDescription = rooms[id].name;
if (!isLastMinute) {
selectedLastMinuteOffer = null;
minAdults = configuredMinAdults;
maxAdults = configuredMaxAdults;
if (formData.roomStays[0].adults.count < minAdults) {
formData.roomStays[0].adults.count = minAdults;
} else if (formData.roomStays[0].adults.count > maxAdults) {
formData.roomStays[0].adults.count = maxAdults;
}
}
shouldScrollToForm && typeof scrollToForm === 'function' && scrollToForm();
}
})
">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="roomType">Camera</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<select class="relative w-full h-full bg-transparent pl-2 pr-4" name="roomType" id="roomType" x-model="formData.roomStays[0].roomType" x-data="{
get sortedRooms() {
const roomsArray = [];
for (const [key, value] of Object.entries(rooms)) {
roomsArray.push({ ...value });
}
return roomsArray.sort((a, b) => a.name.localeCompare(b.name));
}
}" @change="
target = $event.target;
roomId = target.options[target.selectedIndex].id
formData.roomStays[0].roomTypeDescription = rooms[roomId]?.name || 'Nessuna preferenza';
" :disabled="selectedLastMinuteOffer">
<option value="">Nessuna preferenza</option>
<template x-for="room in sortedRooms">
<option :id="room.id" :value="room.code" x-text="room.name"></option>
</template>
</select>
</div>
</div>
</template>
<div class="mb-8 dn" x-init="
$nextTick(() => {
selectRoom = function(id, isLastMinute = false, shouldScrollToForm = true) {
$el.classList.remove('dn');
formData.roomStays[0].roomType = rooms[id].code;
formData.roomStays[0].roomTypeDescription = rooms[id].name;
if (!isLastMinute) {
selectedLastMinuteOffer = null;
minAdults = configuredMinAdults;
maxAdults = configuredMaxAdults;
if (formData.roomStays[0].adults.count < minAdults) {
formData.roomStays[0].adults.count = minAdults;
} else if (formData.roomStays[0].adults.count > maxAdults) {
formData.roomStays[0].adults.count = maxAdults;
}
}
shouldScrollToForm && typeof scrollToForm === 'function' && scrollToForm();
}
})
">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="roomType">Camera</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<select class="relative w-full h-full bg-transparent pl-2 pr-4" name="roomType" id="roomType" x-model="formData.roomStays[0].roomType" x-data="{
get sortedRooms() {
const roomsArray = [];
for (const [key, value] of Object.entries(rooms)) {
roomsArray.push({ ...value });
}
return roomsArray.sort((a, b) => a.name.localeCompare(b.name));
}
}" @change="
target = $event.target;
roomId = target.options[target.selectedIndex].id
formData.roomStays[0].roomTypeDescription = rooms[roomId]?.name || 'Nessuna preferenza';
" :disabled="selectedLastMinuteOffer">
<option value="">Nessuna preferenza</option>
<template x-for="room in sortedRooms">
<option :id="room.id" :value="room.code" x-text="room.name"></option>
</template>
<option :id="room.id" :value="room.code" x-text="room.name" id="a94049ab-425c-4208-9e20-9cce2b4ff689" value="KOM">Comfort</option>
<option :id="room.id" :value="room.code" x-text="room.name" id="969b550c-dd4d-4841-a75c-bbe6390b707b" value="FS">Family Suite</option>
<option :id="room.id" :value="room.code" x-text="room.name" id="b5172635-dd4b-4d51-a5f1-eb79656fa06b" value="SU">Suite con balcone</option>
<option :id="room.id" :value="room.code" x-text="room.name" id="c44c7581-24ff-462b-a3c6-449e443e46cc" value="SUOB">Suite senza balcone</option>
<option :id="room.id" :value="room.code" x-text="room.name" id="984807a4-8965-4ae8-bf18-98d6c29d5849" value="SUP">Superior</option>
</select>
</div>
</div>
<template x-if="Object.keys(offers).length">
<div class="mb-8 dn" x-init="
$nextTick(() => {
selectOffer = function(id, shouldScrollToForm = true) {
selectedLastMinuteOffer = null;
$el.classList.remove('dn');
formData.roomStays[0].selectedRatePlan = id;
if (offers[id].code) {
formData.roomStays[0].ratePlan = offers[id].code;
formData.roomStays[0].ratePlanDescription = offers[id].name;
} else {
formData.roomStays[0].ratePlan = offers[id].name;
}
minAdults = configuredMinAdults;
maxAdults = configuredMaxAdults;
if (formData.roomStays[0].adults.count < minAdults) {
formData.roomStays[0].adults.count = minAdults;
} else if (formData.roomStays[0].adults.count > maxAdults) {
formData.roomStays[0].adults.count = maxAdults;
}
if (datePicker && offers[id].timespans) {
const timespan = offers[id].timespans[0];
let startsAt = new Date(timespan.startsAt);
if (new Date() > startsAt) {
startsAt = new Date();
}
datePicker.setEndDate(timespan.endsAt);
datePicker.setStartDate(startsAt);
datePicker.trigger('select');
}
shouldScrollToForm && typeof scrollToForm === 'function' && scrollToForm();
}
})
">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="ratePlan">Offerta</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<select class="relative w-full h-full bg-transparent pl-2 pr-4" name="ratePlan" id="ratePlan" x-model="formData.roomStays[0].selectedRatePlan" x-data="{
get sortedOffers() {
const offersArray = [];
for (const [key, value] of Object.entries(offers)) {
offersArray.push({ ...value });
}
return offersArray.sort((a, b) => a.name.localeCompare(b.name));
}
}" @change="
target = $event.target;
offerId = target.options[target.selectedIndex].value;
if (!offerId) {
formData.roomStays[0].ratePlan = null;
formData.roomStays[0].ratePlanDescription = null;
} else if (offers[offerId].code) {
formData.roomStays[0].ratePlan = offers[offerId].code;
formData.roomStays[0].ratePlanDescription = offers[offerId].name;
} else {
formData.roomStays[0].ratePlan = offers[offerId].name;
}
">
<option value="">Nessuna offerta</option>
<template x-for="offer in sortedOffers">
<option :value="offer.id" x-text="offer.name"></option>
</template>
</select>
</div>
</div>
</template>
<div class="mb-8 dn" x-init="
$nextTick(() => {
selectOffer = function(id, shouldScrollToForm = true) {
selectedLastMinuteOffer = null;
$el.classList.remove('dn');
formData.roomStays[0].selectedRatePlan = id;
if (offers[id].code) {
formData.roomStays[0].ratePlan = offers[id].code;
formData.roomStays[0].ratePlanDescription = offers[id].name;
} else {
formData.roomStays[0].ratePlan = offers[id].name;
}
minAdults = configuredMinAdults;
maxAdults = configuredMaxAdults;
if (formData.roomStays[0].adults.count < minAdults) {
formData.roomStays[0].adults.count = minAdults;
} else if (formData.roomStays[0].adults.count > maxAdults) {
formData.roomStays[0].adults.count = maxAdults;
}
if (datePicker && offers[id].timespans) {
const timespan = offers[id].timespans[0];
let startsAt = new Date(timespan.startsAt);
if (new Date() > startsAt) {
startsAt = new Date();
}
datePicker.setEndDate(timespan.endsAt);
datePicker.setStartDate(startsAt);
datePicker.trigger('select');
}
shouldScrollToForm && typeof scrollToForm === 'function' && scrollToForm();
}
})
">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="ratePlan">Offerta</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<select class="relative w-full h-full bg-transparent pl-2 pr-4" name="ratePlan" id="ratePlan" x-model="formData.roomStays[0].selectedRatePlan" x-data="{
get sortedOffers() {
const offersArray = [];
for (const [key, value] of Object.entries(offers)) {
offersArray.push({ ...value });
}
return offersArray.sort((a, b) => a.name.localeCompare(b.name));
}
}" @change="
target = $event.target;
offerId = target.options[target.selectedIndex].value;
if (!offerId) {
formData.roomStays[0].ratePlan = null;
formData.roomStays[0].ratePlanDescription = null;
} else if (offers[offerId].code) {
formData.roomStays[0].ratePlan = offers[offerId].code;
formData.roomStays[0].ratePlanDescription = offers[offerId].name;
} else {
formData.roomStays[0].ratePlan = offers[offerId].name;
}
">
<option value="">Nessuna offerta</option>
<template x-for="offer in sortedOffers">
<option :value="offer.id" x-text="offer.name"></option>
</template>
<option :value="offer.id" x-text="offer.name" value="0868526e-d6fb-4983-b58c-1a6ad1ed483a">Estate & natura</option>
<option :value="offer.id" x-text="offer.name" value="b5aaa020-6089-4e8a-beae-d40b7432db3b">Famiglia & benessere</option>
<option :value="offer.id" x-text="offer.name" value="95e7d521-a501-40f6-b7f3-83c8f259924b">Happy Family</option>
<option :value="offer.id" x-text="offer.name" value="bd9566ca-aba8-48fd-91fc-6411049481b2">Happy Family</option>
<option :value="offer.id" x-text="offer.name" value="4f49012f-9954-4dc4-a3ba-96405a193848">Partenza vacanze -10%</option>
<option :value="offer.id" x-text="offer.name" value="c8e04476-c35c-43d8-9e05-cfdcdaa5029e">Tempo libero per la famiglia</option>
</select>
</div>
</div>
</div>
<div class="lg:w-1/2 lg:pl-20">
<div class="font-semibold mb-6">Contatto</div>
<div class="mb-3">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="title">Titole</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<select class="relative w-full h-full bg-transparent pl-2 pr-4" name="title" id="title" x-model="formData.person.gender">
<option value="" selected="selected">Seleziona titolo</option>
<option value="none">Non specificato</option>
<option value="f">Gentile Signora</option>
<option value="m">Gentile Signor</option>
</select>
</div>
</div>
<div class="h-5"></div>
<div class="mb-3">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="givenName">Nome *</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<input class="relative w-full h-full bg-transparent pl-2 pr-4" id="givenName" name="givenName" x-model="formData.person.givenName">
</div>
<div class="block label-font-style h-5 text-red" x-text="validation.givenName.message"></div>
</div>
<div class="mb-3">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="familyName">Cognome *</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<input class="relative w-full h-full bg-transparent pl-2 pr-4" id="familyName" name="familyName" x-model="formData.person.familyName">
</div>
<div class="block label-font-style h-5 text-red" x-text="validation.familyName.message"></div>
</div>
<div class="mb-3">
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="email">Indirizzo e-mail *</label>
<div class="relative h-12">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<input class="relative w-full h-full bg-transparent pl-2 pr-4" id="email" type="email" name="email" x-model="formData.person.email">
</div>
<div class="block label-font-style h-5 text-red" x-text="validation.email.message"></div>
</div>
<div class="mb-12" x-data="{showAnnotation: false}">
<template x-if="!showAnnotation">
<button type="button" class="flex items-center justify-center px-4 min-h-8 rounded-sm border bg-transparent transition button-font-style md:button-font-style text-button border-button hover:opacity-60" @click="showAnnotation = true">
<svg class="min-w-3" width="12" height="12" viewBox="0 0 12 12" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.20842 0.166748C6.43853 0.166748 6.62508 0.353296 6.62508 0.583415V5.37508H11.4167C11.6469 5.37508 11.8334 5.56163 11.8334 5.79175V6.20842C11.8334 6.43853 11.6469 6.62508 11.4167 6.62508H6.62508V11.4167C6.62508 11.6469 6.43853 11.8334 6.20842 11.8334H5.79175C5.56163 11.8334 5.37508 11.6469 5.37508 11.4167V6.62508H0.583415C0.353296 6.62508 0.166748 6.43853 0.166748 6.20842V5.79175C0.166748 5.56163 0.353296 5.37508 0.583415 5.37508H5.37508V0.583415C5.37508 0.353296 5.56163 0.166748 5.79175 0.166748H6.20842Z">
</path>
</svg>
<span class="ml-2">Aggiungere annotazione</span>
</button>
</template><button type="button" class="flex items-center justify-center px-4 min-h-8 rounded-sm border bg-transparent transition button-font-style md:button-font-style text-button border-button hover:opacity-60"
@click="showAnnotation = true">
<svg class="min-w-3" width="12" height="12" viewBox="0 0 12 12" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.20842 0.166748C6.43853 0.166748 6.62508 0.353296 6.62508 0.583415V5.37508H11.4167C11.6469 5.37508 11.8334 5.56163 11.8334 5.79175V6.20842C11.8334 6.43853 11.6469 6.62508 11.4167 6.62508H6.62508V11.4167C6.62508 11.6469 6.43853 11.8334 6.20842 11.8334H5.79175C5.56163 11.8334 5.37508 11.6469 5.37508 11.4167V6.62508H0.583415C0.353296 6.62508 0.166748 6.43853 0.166748 6.20842V5.79175C0.166748 5.56163 0.353296 5.37508 0.583415 5.37508H5.37508V0.583415C5.37508 0.353296 5.56163 0.166748 5.79175 0.166748H6.20842Z">
</path>
</svg>
<span class="ml-2">Aggiungere annotazione</span>
</button>
<template x-if="showAnnotation">
<div>
<label class="block small-font-style mb-1 opacity-40 md:small-font-style" for="text">Note</label>
<div class="relative">
<div class="absolute top-0 left-0 w-full h-full border border-main rounded-sm opacity-10">
<div class="absolute top-0 left-0 w-full h-full bg-main opacity-50"></div>
</div>
<textarea class="relative block w-full h-25 bg-transparent p-2" type="text" id="text" name="text" x-model="formData.text"></textarea>
</div>
</div>
</template>
</div>
<div class="inline-flex flex-col">
<div class="inline-flex items-center cursor-pointer" type="button" @click="formData.person.newsletter = !formData.person.newsletter">
<div class="flex items-center justify-center w-5 min-w-5 h-5 min-h-5 border border-button rounded-sm transition " :class="{'bg-button' : formData.person.newsletter}">
<svg class="text-button-contrast opacity-0 transition " :class="{'opacity-100' : formData.person.newsletter}" width="10" height="7" viewBox="0 0 10 7" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M8.1161 0.823204C8.31136 0.627942 8.62794 0.627942 8.8232 0.823204L9.17676 1.17676C9.37202 1.37202 9.37202 1.6886 9.17676 1.88386L4.35354 6.70709C4.15827 6.90235 3.84169 6.90235 3.64643 6.70709L0.823204 3.88386C0.627942 3.6886 0.627942 3.37202 0.823204 3.17676L1.17676 2.8232C1.37202 2.62794 1.6886 2.62794 1.88386 2.8232L3.99998 4.93932L8.1161 0.823204Z">
</path>
</svg>
</div>
<div class="ml-4">Vorrei ricevere la newsletter</div>
<input type="hidden" name="newsletter" x-model="formData.person.newsletter" value="false">
</div>
<div class="inline-flex items-center cursor-pointer mt-2" type="button" @click="privacy = !privacy">
<div class="flex items-center justify-center w-5 min-w-5 h-5 min-h-5 border border-button rounded-sm transition" :class="{'bg-button' : privacy}">
<svg class="text-button-contrast opacity-0 transition" :class="{'opacity-100' : privacy}" width="10" height="7" viewBox="0 0 10 7" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M8.1161 0.823204C8.31136 0.627942 8.62794 0.627942 8.8232 0.823204L9.17676 1.17676C9.37202 1.37202 9.37202 1.6886 9.17676 1.88386L4.35354 6.70709C4.15827 6.90235 3.84169 6.90235 3.64643 6.70709L0.823204 3.88386C0.627942 3.6886 0.627942 3.37202 0.823204 3.17676L1.17676 2.8232C1.37202 2.62794 1.6886 2.62794 1.88386 2.8232L3.99998 4.93932L8.1161 0.823204Z">
</path>
</svg>
</div>
<div class="ml-4">Accetto <a class="text-main underline" href="https://www.hotelalpenhof.it/it/privacy/" target="_blank" @click.stop="">l'informativa sulla privacy</a>*</div>
<input type="hidden" name="privacy" x-model="privacy" value="false">
</div>
<label class="label-font-style text-red" x-text="validation.privacy.message"></label>
<input class="relative h-0" tabindex="-1" id="additiveBt" name="additiveBt" type="text" x-model="formData.additiveBt">
</div>
</div>
</div>
<div class="flex flex-col justify-between lg:flex-row">
<div class="lg:w-1/2 lg:pr-20">
<div class="small-font-style opacity-40 md:small-font-style">I campi segnati con * sono obbligatori</div>
</div>
<div class="mt-3 lg:mt-0 lg:w-1/2 lg:pl-20">
<button class="flex items-center justify-center px-7 h-12 button-font-style md:button-font-style text-white bg-cta rounded-sm transition" :disabled="isLoading" x-data="{
get buttonText() {
return this.isLoading ? '' : (this.isBooking ? 'Prenotare adesso' : (this.hasRequestSent ? 'Nuova richiesta' : 'Inviare richiesta'));
}
}">
<div :class="{ 'spinner' : isLoading }" x-text="buttonText">Inviare richiesta</div>
</button>
</div>
</div>
<template x-if="selectedLastMinuteOffer">
<div class="flex flex-col lg:flex-row">
<div class="mt-6 order-1 lg:w-1/2 lg:pr-20">
</div>
<div class="mt-3 lg:order-2 lg:mt-0 lg:w-1/2 lg:pl-20">
<div class="flex mt-3" :class="{ 'dn': !isBooking }">
<div x-data="{
get lastMinuteDiscountedPrice() {
const rateType = selectedLastMinuteOffer.rateType;
const personCount = rateType === 'per_room' ? 1 : formData.roomStays[0].adults.count;
const discountedPrice = new Intl.NumberFormat('it', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(selectedLastMinuteOffer.discountedPrice * personCount);
return discountedPrice + ' €';
}
}" x-text="lastMinuteDiscountedPrice"></div>
<div class="flex opacity-60 ml-4">
<span>invece di</span>
<div class="ml-1" x-data="{
get lastMinutePrice() {
const rateType = selectedLastMinuteOffer.rateType;
const personCount = rateType === 'per_room' ? 1 : formData.roomStays[0].adults.count;
const price = new Intl.NumberFormat('it', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(selectedLastMinuteOffer.price * personCount);
return price + ' €';
}
}" x-text="lastMinutePrice"></div>
</div>
</div>
<div class="button-font-style md:button-font-style mt-6 lg:text-right underline" role="button" x-data="{
get formSwitchText() {
return isBooking ? 'Alle richieste senza impegno' : 'Prenoti ora per approfittarne subito';
}
}" x-text="formSwitchText" @click="isBooking = !isBooking">
</div>
</div>
</div>
</template>
<template x-if="isResendDialog">
<div class="fixed top-0 left-0 flex items-center justify-center w-full h-full text-main bg-dialog-background z-20" @click="isResendDialog = false; isDialogOpen = false;">
<div class="absolute top-0 left-0 w-full h-full overflow-auto md:py-20" x-data="{
isCloseButtonFixed: null,
}" @scroll="isCloseButtonFixed = $refs.dialogContainer.firstElementChild.getBoundingClientRect().top < 0" x-ref="dialogContainer">
<div class="relative w-full bg-ambient mx-auto rounded-sm md:mw-180 lg:mw-220" @click.stop="">
<div class="p-12 sm:p-16 rte">
<h1>Invio altra richiesta?</h1>
<div class="mt-4">La Sua richiesta è stata inoltrata. Vorrebbe inviare un'altra richiesta che contiene le stesse informazioni?</div>
<div class="relative w-full flex mt-8">
<button class="flex items-center justify-center px-4 h-8 rounded-sm border transition bg-transparent button-font-style md:button-font-style text-button border-button hover:bg-button hover:text-button-contrast" type="button"
@click="lastRequestSent = null; isResendDialog = false; this.isDialogOpen = false; submitData();"> Invia di nuovo </button>
<button class="flex items-center justify-center px-4 h-8 ml-2 rounded-sm border transition bg-transparent button-font-style md:button-font-style text-button border-button hover:bg-button hover:text-button-contrast" type="button"
@click="isResendDialog = false; this.isDialogOpen = false;"> Annulla </button>
</div>
</div>
<div class="absolute flex justify-end w-full top-6 mx-auto px-6 z-10 pointer-events-none md:mw-180 lg:mw-220 lg:top-8 lg:px-8" :class="{
'fixed' : isCloseButtonFixed,
'absolute' : !isCloseButtonFixed
}">
<button type="button" class="relative flex items-center justify-center w-10 h-10 bg-transparent pointer-events-all text-main transition hover:opacity-40" @click="isResendDialog = false; isDialogOpen = false;">
<div class="absolute top-0 left-0 w-full h-full rounded-sm transition bg-ambient opacity-60"></div>
<div class="absolute top-0 left-0 w-full h-full rounded-sm bg-main opacity-05 transition"></div>
<svg class="relative" width="12" height="12" viewBox="0 0 12 12" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
d="M7.05783 6.0001L11.8308 10.7731C12.0261 10.9683 12.0261 11.2849 11.8308 11.4802L11.4772 11.8337C11.282 12.029 10.9654 12.029 10.7701 11.8337L5.99717 7.06076L1.2242 11.8337C1.02893 12.029 0.712352 12.029 0.51709 11.8337L0.163536 11.4802C-0.0317257 11.2849 -0.0317257 10.9683 0.163536 10.7731L4.93651 6.0001L0.163536 1.22713C-0.0317257 1.03186 -0.0317257 0.715282 0.163536 0.520019L0.51709 0.166466C0.712352 -0.028796 1.02893 -0.028796 1.2242 0.166466L5.99717 4.93944L10.7701 0.166466C10.9654 -0.028796 11.282 -0.028796 11.4772 0.166466L11.8308 0.520019C12.0261 0.715282 12.0261 1.03186 11.8308 1.22713L7.05783 6.0001Z">
</path>
</svg>
</button>
</div>
</div>
</div>
</div>
</template>
</form>
Text Content
Questo sito si serve dei cookie per migliorare l’esperienza utente. Inoltre, con il consenso dell’utente, vengono usati cookie posti da servizi di terzi per personalizzare gli annunci. Non acconsentoAcconsento <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1061313900916157&ev=PageView&noscript=1"/> FAMILY HOTEL ALPENHOF A RASUN-ANTERSELVA Offriamo la vacanza perfetta per la famiglia in Val Pusteria, Alto Adige. Da noi ce n'è per tutti i gusti, sia in estate che in inverno. Per i più piccoli, per i medi e naturalmente per i grandi. Galleria Apri la galleria Mostra immagini 1 / 7 TEMPO IN FAMIGLIA AVVENTURE RELAX MOMENTI DI PIACERE 5 / 5 Ambiente molto familiare. Personale molto gentile e disponibile per qualsiasi richiesta. Ottima cucina con prodotti locali di alta qualità. — Nicoletta - Marzo 2024 su Tripadvisor 5 / 5 È un hotel bellissimo, ottimo per cucina, pulizia e servizio. La spa è divisa in due parti: una per le famiglie con 2 piscine e la sauna, l’altra con un idromassaggio da sogno e sauna solo per adulti. — Michela - Marzo 2024 su Tripadvisor 5 / 5 Un vero family hotel dotato di tutti i comfort! Personale gentile e professionale sempre pronto a soddisfare ogni esigenza. Ci piacerebbe ritornare! — Sami - Febbraio 2024 su Tripadvisor 1 / 3 9.1 / 10 Aggiornato il 15.04.2024 4.8 / 5 Aggiornato il 15.04.2024 6 / 6 Aggiornato il 15.04.2024 IL PARADISO DELLE VACANZE IN FAMIGLIA Vivere la splendida natura altoatesina, sperimentare tante emozionanti avventure e trascorrere del tempo con la famiglia. È possibile superare una vacanza all'Alpenhof? Vacanza per grandi e piccini Vacanza per grandi e piccini Relax Principesse e cavalieri Avventure estive Esperienze invernali Vacanza per grandi e piccini Relax Principesse e cavalieri Avventure estive Esperienze invernali Hotel per famiglie Perfetto per tutta la famiglia: i bambini si godono il tempo libero nel centro di cura per bambini, mentre i genitori si rilassano nella spa. A tavola Il viaggio culinario inizia con la colazione a buffet, si ferma allo spuntino del pranzo e a quello del pomeriggio e si conclude con una cena di 5 portate. Programma settimanale Nel nostro programma settimanale troverete escursioni varie e attività emozionanti. Piscina indoor e outdoor Vi aspettano ben 60 m² di divertimento balneare, di cui 20 m² all'aperto, con getti, lettini e pavimento massaggianti. Già sudato oggi? La sauna rende felici. Che sia nella sauna finlandese, nella Kids e Family Sauna o nella sauna di fieno e pietre. Per mamma e papà Con i nostri trattamenti e massaggi potete dimenticare per un attimo la vita quotidiana e rilassarvi. Vasca per bambini Lo scivolo nella piscina per bambini offre ai più piccoli un puro divertimento balneare. Tempo libero dai genitori! Da noi i bambini si sentono particolarmente a casa: in gruppi adatti alla loro età e ben seguiti, l'avventura in vacanza può iniziare. Mini Club Ai vostri posti, preparatevi, giocate: i nostri piccoli ospiti (dai 3-5 anni) sono in buone mani nel Mini Club. Maxi Club Nel Maxi Club gli adolescenti non solo possono restare indisturbati ma possono anche praticare sport e rilassarsi. Investigatori della natura Numerose ed emozionanti avventure attendono i nostri detectives della natura: arrampicata, pesca, lettura di tracce e molto altro. Baby Club Bla-blare e gattonare: Nel nostro Baby Club i bambini vengono accuditi con molta pazienza e attenzione. Esperienze di trekking Nei dintorni dell'Hotel Alpenhof ci sono sentieri escursionistici per famiglie di ogni tipo. Un tour alla scoperta di foreste naturali e mondi animali. Mountainbike & Bici Un casco, due ruote e molte piste ciclabili di tutti i livelli vi attendono nella natura della valle. Quando si parte? Attivo all'aperto Dal tiro con l'arco al golf: nella nostra zona si trova tutto ciò che serve per una perfetta vacanza attiva con il bambino. Sci e Snowboard A Plan de Corones tutti troveranno la pista giusta: che si tratti di coniglietti da sci più esperti che di principianti sulla neve. Sci di fondo Quasi 60 chilometri di piste da sci di fondo per scivolare sulla neve scintillante, fino a far bruciare le cosce. Divertimento sulla slitta Fate un'escursione invernale in montagna e godetevi una pausa al sole prima di scendere con lo slittino. Hotel per famiglie Perfetto per tutta la famiglia: i bambini si godono il tempo libero nel centro di cura per bambini, mentre i genitori si rilassano nella spa. A tavola Il viaggio culinario inizia con la colazione a buffet, si ferma allo spuntino del pranzo e a quello del pomeriggio e si conclude con una cena di 5 portate. Programma settimanale Nel nostro programma settimanale troverete escursioni varie e attività emozionanti. Piscina indoor e outdoor Vi aspettano ben 60 m² di divertimento balneare, di cui 20 m² all'aperto, con getti, lettini e pavimento massaggianti. Già sudato oggi? La sauna rende felici. Che sia nella sauna finlandese, nella Kids e Family Sauna o nella sauna di fieno e pietre. Per mamma e papà Con i nostri trattamenti e massaggi potete dimenticare per un attimo la vita quotidiana e rilassarvi. Vasca per bambini Lo scivolo nella piscina per bambini offre ai più piccoli un puro divertimento balneare. Tempo libero dai genitori! Da noi i bambini si sentono particolarmente a casa: in gruppi adatti alla loro età e ben seguiti, l'avventura in vacanza può iniziare. Mini Club Ai vostri posti, preparatevi, giocate: i nostri piccoli ospiti (dai 3-5 anni) sono in buone mani nel Mini Club. Maxi Club Nel Maxi Club gli adolescenti non solo possono restare indisturbati ma possono anche praticare sport e rilassarsi. Investigatori della natura Numerose ed emozionanti avventure attendono i nostri detectives della natura: arrampicata, pesca, lettura di tracce e molto altro. Baby Club Bla-blare e gattonare: Nel nostro Baby Club i bambini vengono accuditi con molta pazienza e attenzione. Esperienze di trekking Nei dintorni dell'Hotel Alpenhof ci sono sentieri escursionistici per famiglie di ogni tipo. Un tour alla scoperta di foreste naturali e mondi animali. Mountainbike & Bici Un casco, due ruote e molte piste ciclabili di tutti i livelli vi attendono nella natura della valle. Quando si parte? Attivo all'aperto Dal tiro con l'arco al golf: nella nostra zona si trova tutto ciò che serve per una perfetta vacanza attiva con il bambino. Sci e Snowboard A Plan de Corones tutti troveranno la pista giusta: che si tratti di coniglietti da sci più esperti che di principianti sulla neve. Sci di fondo Quasi 60 chilometri di piste da sci di fondo per scivolare sulla neve scintillante, fino a far bruciare le cosce. Divertimento sulla slitta Fate un'escursione invernale in montagna e godetevi una pausa al sole prima di scendere con lo slittino. RICHIEDETE ORA LA VOSTRA VACANZA Richiesta non impegnativa Il miglior prezzo garantito DORMIRE & SOGNARE Sentirsi riposati la mattina e quasi riuscire a toccare le montagne con un dito. È così che vi svegliate ogni giorno all'Alpenhof. Rilassati e in forma. da 165,00 € Family Suite 55 m² per 4 - 6 persone Dettagli Richiesta da 150,00 € Suite con balcone 40-50 m² per 2 - 4 persone Dettagli Richiesta da 140,00 € Suite senza balcone 40-50 m² per 2 - 5 persone Dettagli Richiesta da 130,00 € Superior 35-40 m² per 2 - 4 persone Dettagli Richiesta da 120,00 € Comfort 28 m² per 2 - 3 persone Dettagli Richiesta +-1 mostra più camere Dimensione Numero di persone ARREDAMENTO RICHIESTA NON IMPEGNATIVA Richiedete la camera Il miglior prezzo garantito TIFOSI DEL RISPARMIO: ATTENZIONE! Vi proponiamo le giuste offerte per tutta la famiglia con risparmi incredibili. Date uno sguardo alle nostre offerte e trovate la vacanza perfetta per la vostra famiglia! da 822,00 € Happy Family 7 notti 30 apr 2024 - 17 mag 2024 vari periodi disponibili Dettagli Richiesta da 399,00 € Tempo libero per la famiglia 3 notti 30 apr 2024 - 29 giu 2024 vari periodi disponibili Dettagli Richiesta da 959,00 € Famiglia & benessere 7 notti 30 apr 2024 - 29 giu 2024 vari periodi disponibili Dettagli Richiesta da 572,00 € Happy Family 5 notti 30 apr 2024 - 17 mag 2024 vari periodi disponibili Dettagli Richiesta da 739,00 € Partenza vacanze -10% 5 notti 18 mag 2024 - 01 giu 2024 Dettagli Richiesta da 1.211,00 € Estate & natura 7 notti 29 giu 2024 - 08 sep 2024 Dettagli Richiesta +0 mostra più offerte OFFERTA Disponibile nei seguenti periodi - Numero di pernottamenti SERVIZI INCLUSI RICHIESTA NON IMPEGNATIVA Richiedete l'offerta Il miglior prezzo garantito OFFERTA PARTENZA VACANZE -10% DA 739,00 € A PERSONA 1 / 1 Disponibile nei seguenti periodi - - 18 mag 2024 - 01 giu 2024 Mostra panoramica mensile Numero di pernottamenti Numero di pernottamenti 5 notti Risparmiate il 10% per l'inizio delle vacanze! SERVIZI INCLUSI * Trattamento all inclusive (escluso bevande alcoliche e caffè) * Accesso gratuito a centro benessere e piscina * Tutti i giorni animazione per bambini e ragazzi da 3 a 16 anni * Su richiesta assistenza bebeé (da 6 mesi) * Un regalo per i bambini * Utilizzo gratuito di tutti i mezzi pubblici dell'Alto Adige * Noleggio gratuito di zaini, bastoncini per il nordic walking, cartine escursionistiche, bici, … RICHIESTA NON IMPEGNATIVA Richiedete l'offerta Il miglior prezzo garantito BUONO A SAPERSI ALL INCLUSIVE CULINARIA * Prima colazione a buffet ricca e genuina con prodotti locali di stagione e di alta qualità * Piatti caldi a mezzogiorno per i bambini * Ricco buffet di spuntini a pranzo per gli adulti * Buffet pomeridiano di torte squisite fatte in casa * Tutti i giorni menu gourmet di 4 o 5 portate con prodotti del nostro maso accompagnati da un buffet di insalate e di formaggi * Cucina per allergici e prodotti senza glutine di Dr. Schär * Ricco menu per bambini * Preparazione al momento di pappe per i neonati * Bevande analcoliche alla fontana di Pino * Cena di gala con musica live una volta alla settimana * Pasto dei bambini sotto la sorveglianza di un assistente FAMIGLIA * Pacchetto baby composto da un lettino da campeggio, grata di protezione, scaldabiberon, bollitore, bagnetto per bambini, secchio mangiapannolini, fasciatoio, vasino, riduttore per WC, sgabello da bagno, zaino portabimbo, seggiolone, passeggino, baby phone * Noleggio bici con seggiolino per bambino (vi preghiamo di portare i caschetti da casa) * Programma di animazione per i bambini con bricolage, disegno, truccabimbi, varie giornate a tema, per andare alla scoperta della flora e fauna altoatesina, escursione notturna, tiro con l’arco e molto altro ancora… * Fattoria di nostra proprietà con coniglietti, capre nane, maiali e pony * Palestra con attrezzi moderni Technogym e vista panoramica sul paesaggio alpino * Accappatoi per tutta la famiglia, asciugamani, ciabatte da bagno in tutte le misure * Holiday Pass – utilizzo gratuito di treni e autobus in tutto l’Alto Adige ALTRO * Servizio navetta dall'aeroporto di Bolzano CHECK-IN E CHECK-OUT * Le camere sono disponibili dalle ore 13:00 in poi. * Il giorno di partenza siete pregati di liberare la vostra camera entro le ore 10:00. POLITICA DI CANCELLAZIONE Costi di cancellazioni se non è stata stipulata la polizza annullamento viaggio dell`Alpenhof Dolomit Family: * fino a 30 giorni prima dell’arrivo: la caparra viene trattenuta a titolo di penale * da 29 a 3 giorni prima dell’arrivo: 70% dell’importo totale * fino a 2 giorni prima dell’arrivo: 100% dell’importo totale In caso di arrivo ritardato e/o partenza anticipata, mettiamo in conto il 100% di tutte le notti prenotate. Tutti i servizi non usufruiti, specialmente i pasti, non verranno rimborsati. ANIMALI BENVENUTI * Il vostro amico a quattro zampe deve assolutamente partecipare alla vacanza in famiglia! * Il prezzo giornaliero per il vostro animale domestico è di 15,00 €. * Confidiamo nella vostra comprensione che gli animali non sono ammessi nelle sale ristorante, sale giochi e centri benessere. PREZZI I nostri prezzi sono calcolati per persona e giorno di permanenza - esclusa imposta di soggiorno. Il prezzo comprende un ricco pacchetto vacanze all inclusive: * I prezzi per i bambini sono validi a partire da 2 ospiti paganti il prezzo pieno * Camera doppia uso singola: supplemento 70% * Animali domestici: 15,00 € a notte (senza cibo) * Late check out: prezzo giornaliero MENO 50% * Imposta di soggiorno: 2,50 € a persona/notte, a partire da 14 anni Altre domande? Basta inviarci una richiesta senza impegno, risponderemo volentieri a qualsiasi domanda. Richiesta preventivo PRENOTARE DIRETTAMENTE ONLINE * Veloce e comodo * Il miglior prezzo garantito Prenotare ora RICHIESTA PREVENTIVO PRENOTARE ONLINE * Vacanza in famiglia All inclusive * Programma di animazione per bambini * Mondo balneare per grandi e piccini Cari ospiti! Desideriamo informarvi che ci prendiamo una pausa dal 07/04/2024 al 30/04/2024 e di conseguenza la nostra azienda alberghiera rimane chiusa. Non vediamo l'ora di rivedervi dopo il suddetto periodo. Compila tutti i campi obbligatori per effettuare la prenotazione. Selezionare giorno d'arrivo e di partenza Giorno d'arrivo mar 30/04/2024 Giorno di partenza mar 07/05/2024 7 notti Dati di viaggio Adulti 2 Adulti Bambini 0 Bambini Età bambini Seleziona età Bambini 0 Bambini Età bambini Seleziona età Camera Nessuna preferenza Camera Nessuna preferenza ComfortFamily SuiteSuite con balconeSuite senza balconeSuperior Offerta Nessuna offerta Offerta Nessuna offerta Estate & naturaFamiglia & benessereHappy FamilyHappy FamilyPartenza vacanze -10%Tempo libero per la famiglia Contatto Titole Seleziona titolo Non specificato Gentile Signora Gentile Signor Nome * Cognome * Indirizzo e-mail * Aggiungere annotazione Aggiungere annotazione Note Vorrei ricevere la newsletter Accetto l'informativa sulla privacy* I campi segnati con * sono obbligatori Inviare richiesta invece di INVIO ALTRA RICHIESTA? La Sua richiesta è stata inoltrata. Vorrebbe inviare un'altra richiesta che contiene le stesse informazioni? Invia di nuovo Annulla Il miglior prezzo garantito! “100 % perfetto!” — Nicoletta - Marzo 2024 su Tripadvisor Richiesta non impegnativa da € 120,- a persona - All inclusive Il miglior prezzo garantito! Siamo lieti del vostro interesse e vi invieremo al più presto la nostra migliore offerta per la vostra vacanza presso l’hotel Alpenhof. Naturalmente siamo a vostra disposizione per qualsiasi ulteriore informazione, al numero +39 0474 496 451 o all'indirizzo e-mail info@hotelalpenhof.it. Nella speranza di potervi dare presto il benvenuto, Cordiali saluti, il team dell’hotel Alpenhof. ERRORE! Durante l'invio dei dati è apparso un errore. Si prega di riprovare. it de it en Cookie Privacy Editoriale INFORMAZIONI SULL’USO DEI COOKIE Informazioni dettagliate sull’elaborazione di dati personali e sulla protezione dei dati sono reperibili nella nostra informativa sulla privacy. COSA SONO I COOKIE? I cookie sono righe di testo inviati dal sito web visitato al proprio browser. Consentono al sito di memorizzare informazioni sull’ultima visita sul sito come ad esempio la lingua preferita o altre impostazioni. I cookie possono essere suddivisi prevalentemente in due gruppi: Cookie tecnici: Questi cookie servono a memorizzare dati necessari per agevolare la navigazione o per fornire i servizi richiesti dall'utente come ad esempio la navigazione o il login. Senza questi cookie una parte del sito potrebbe non funzionare correttamente. Cookie di profilazione: Questi cookie vengono usati per tracciare la navigazione dell'utente su internet e creare profili su interessi, abitudini, scelte, ecc. Con questi cookie è possibile mostrare messaggi pubblicitari o prodotti in linea con i dati raccolti. COME UTILIZZIAMO I COOKIE? Noi utilizziamo cookie per migliorare l'esperienza utente. Inoltre utilizziamo servizi di terzi per tracciare la navigazione dell'utente sul nostro sito web e per registrare i contenuti per i quali si sta interessando. Anche questi servizi memorizzano cookie sul dispositivo dell'utente. Inoltre utilizziamo cookie per il remarketing. In questo caso Facebook e Google vengono notificati sul fatto che un utente abbia visitato il nostro sito. Ciò serve a fornire agli utenti del nostro sito e delle nostre landingpage dei messaggi pubblicitari adatti ai loro interessi sulla piattaforma pubblicitaria di Google e nei Social Network Facebook e Instagram. COME SI POSSONO DISABILITARE I COOKIE? I cookie per il remarketing possono essere disabilitati in ogni momento visitando questa pagina e rifiutando l’utilizzo dei cookie tramite il link nel banner. Inoltre è possibile cambiare le impostazioni del browser per far si che i cookie non vengano più salvati o per ricevere una notifica e poter decidere se abilitare i cookie nei singoli casi. In più la European Interactive Digital Advertising Alliance offre la possibilità di disattivare cookie non tecnici posti da servizi di terzi sul seguente sito: www.youronlinechoices.eu La disattivazione dei cookie può compromettere la funzionalità del nostro sito.