<section class="org-vacancy-hero flex flex-col md:grid md:grid-cols-2 md:gap-x-8 h-screen">
<div class="vacancy-hero-left">
<div class="md:pl-8 flex flex-col items-center justify-center h-full">
<div class="lg:w-2/3 xl:w-2/3">
<h1 class="atm-heading ">Schoonmaker ouderenzorg Gulpen Vloeren</h1>
<div class="atm-paragraph text-md">Gulpen • Ouderenzorg • 30 uur • € 11,83 - € 13,50 per uur</div>
<div class="vacancy-hero-content-buttons">
<a class="atm-button atm-button-primary button-md no-icon ">
<div class="button-content-wrapper">
<span class="button-content">
<span>Solliciteer direct</span>
<i class="atm-icon fal fa-arrow-right "></i>
</span>
</div>
<span class="button-triangle"></span>
</a>
</div>
</div>
</div>
</div>
<div class="vacancy-right">
<svg class="block md:hidden absolute top-0 left-0 w-full" viewBox="0 0 1416 242" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M124 241.5L0 121.748V0H1415.5C870.7 151.786 327.5 224.203 124 242Z" fill="white" />
</svg>
<picture class="atm-image ">
<img class="" src="https://picsum.photos/id/250/768/432" alt="">
</picture>
<svg class="absolute bottom-0" viewBox="0 0 400 184" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M400 75.5C234.707 101.9 64.753 36.1667 0 0V184H400.5V75.5Z" fill="white" />
</svg>
</div>
</section>
<section class="org-vacancy-hero flex flex-col md:grid md:grid-cols-2 md:gap-x-8 h-screen">
<div class="vacancy-hero-left">
<div class="md:pl-8 flex flex-col items-center justify-center h-full">
<div class="lg:w-2/3 xl:w-2/3">
{{#if heading}}
{{ render '@heading' heading }}
{{/if}}
{{#if paragraph}}
{{render '@paragraph' paragraph merge=true}}
{{/if}}
<div class="vacancy-hero-content-buttons">
{{#each buttonsPrimary}}
{{render '@button-primary' this merge=true}}
{{/each}}
{{#each buttonsSecondary}}
<div class="py-4">
{{render '@button-secondary' this merge=true}}
</div>
{{/each}}
</div>
</div>
</div>
</div>
<div class="vacancy-right">
<svg class="block md:hidden absolute top-0 left-0 w-full" viewBox="0 0 1416 242" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M124 241.5L0 121.748V0H1415.5C870.7 151.786 327.5 224.203 124 242Z" fill="white" />
</svg>
{{ render "@image" image }}
<svg class="absolute bottom-0" viewBox="0 0 400 184" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M400 75.5C234.707 101.9 64.753 36.1667 0 0V184H400.5V75.5Z" fill="white" />
</svg>
</div>
</section>
{
"heading": {
"text": "Schoonmaker ouderenzorg Gulpen Vloeren",
"tag": "h1"
},
"paragraph": {
"text": "Gulpen • Ouderenzorg • 30 uur • € 11,83 - € 13,50 per uur"
},
"buttonsPrimary": [
{
"text": "Solliciteer direct"
}
],
"buttonsSecondary": [],
"image": {
"src": "https://picsum.photos/id/250/768/432"
}
}
.org-vacancy-hero {
.vacancy-hero-left {
@apply pt-12;
@media (max-width: theme('screens.md')) {
@apply vebego-container;
}
/* Add padding to the column so it aligns with .vebego-container */
@screen md {
padding-left: calc((100vw - theme('screens.md')) / 2);
}
@screen lg {
padding-left: calc((100vw - theme('screens.lg')) / 2);
}
@screen xl {
padding-left: calc((100vw - theme('screens.xl')) / 2);
}
@screen 2xl {
padding-left: calc((100vw - theme('screens.2xl')) / 2);
}
.atm-heading {
@apply text-h2;
}
.atm-paragraph {
@apply text-secondary-col-1;
}
.vacancy-hero-content-buttons {
@apply flex items-center mt-6 flex-wrap;
}
}
.vacancy-right {
@apply relative flex-grow;
.atm-image {
@apply h-full;
img {
@apply h-full w-full object-cover;
}
}
}
}
.org-vacancy-organism-hero {
@apply relative;
.atm-image {
@apply w-full;
img {
@apply w-full h-full object-cover;
}
}
.atm-video {
@apply relative h-full w-full p-0;
video {
@apply absolute h-full w-full object-cover top-0 left-0;
}
}
&.fullwidth {
@apply lg:m-0 mb-0 p-0 min-h-[90vh] h-[90vh];
}
.hero-wrapper {
@apply overflow-hidden;
@apply absolute top-0 left-0 z-10 h-full w-full flex flex-col-reverse md:flex-row;
.hero-path-mask {
@apply h-full absolute top-1/2 -translate-y-1/2 w-[201%] -left-full md:-left-1/2 md:w-[151%] lg:left-0 lg:w-[101%] lg:h-[90%] lg:top-0 lg:translate-y-0;
}
}
.vacancy-hero-content {
@apply z-50 absolute -translate-x-1/2 translate-y-1/2 bottom-0 left-1/2 w-full;
.mobile-category-dropdown {
@apply hidden absolute top-full left-0 right-0 mb-2 bg-white rounded-xl shadow-lg z-50;
@apply overflow-hidden;
&.is-open {
@apply block;
}
.atm-form-radiobutton {
@apply m-0 gap-0 block;
.form-radiobutton {
@apply hidden;
}
.atm-form-label {
@apply text-md font-normal block py-4 px-4 text-black cursor-pointer bg-white m-0;
@apply transition-colors duration-150;
@apply border-b border-gray-200;
&:hover {
@apply bg-gray-100;
}
}
.form-radiobutton:checked + .atm-form-label {
@apply bg-primary text-white;
}
}
.atm-form-radiobutton:last-child .atm-form-label {
@apply border-b-0;
}
}
.input-wrapper {
@apply flex p-2 md:py-4 md:px-3 w-full z-10;
box-shadow: 0 -4px 16px -15px rgba(0, 0, 0, 0.35);
.category-toggle-btn {
@apply min-w-[3rem];
@apply flex md:hidden items-center justify-center;
@apply bg-primary text-white rounded-l-xl;
&:active {
@apply scale-95;
}
i {
@apply text-lg;
}
}
/* Add padding to inputs when category button is visible */
&:has(.category-toggle-btn) {
.atm-form-input:first-of-type input {
@apply pl-16;
}
}
.input-container {
@apply relative flex w-full;
.location-btn {
@apply absolute right-2 md:right-6 top-1/2 -translate-y-1/2 h-10 w-10;
.atm-button-primary {
@apply h-10 w-10 bg-white text-black text-md;
.button-content-wrapper {
@apply h-10;
}
}
}
}
}
.search-btn {
@apply rounded-none rounded-r-full md:rounded-l-none px-6 py-2;
.search-btn-text {
@apply hidden md:block;
}
.button-content-wrapper {
@apply gap-3;
}
}
}
}
.autocomplete-dropdown {
@apply absolute top-full right-0 md:left-0 w-full text-left;
@apply bg-white rounded-3xl shadow-[0_4px_6px_-2px_rgba(0,0,0,0.1)] text-black;
@apply z-50 max-h-64 overflow-y-auto;
transition: all 0.2s ease-in-out;
list-style: none;
padding: 0;
.autocomplete-item {
@apply px-6 py-4 cursor-pointer;
@apply transition-colors duration-150;
&:hover {
@apply bg-gray-100;
}
}
}
document.addEventListener('DOMContentLoaded', function () {
const nameInputs = [
document.getElementById('vacancy-homepage-search-name'),
...document.querySelectorAll('.vn input'),
].filter(Boolean);
const locationInputs = [
document.getElementById('vacancy-homepage-search-location'),
...document.querySelectorAll('.vl input'),
document.querySelector('.location-input-wrapper input'),
].filter(Boolean);
const websiteId = document.body.dataset.websiteId;
if (nameInputs.length === 0 && locationInputs.length === 0) {
return;
}
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
function createAutocompleteDropdown(inputElement) {
const dropdown = document.createElement('div');
dropdown.className = 'autocomplete-dropdown hidden';
const parent = inputElement.closest('.atm-form-input');
if (parent) {
parent.style.position = 'relative';
parent.appendChild(dropdown);
}
return dropdown;
}
function showSuggestions(inputElement, dropdown, suggestions) {
if (!suggestions || suggestions.length === 0) {
dropdown.classList.add('hidden');
return;
}
dropdown.innerHTML = '';
suggestions.forEach((suggestion) => {
const item = document.createElement('div');
item.className = 'autocomplete-item';
item.tabIndex = 0;
item.textContent = suggestion;
item.addEventListener('click', () => {
inputElement.value = suggestion;
inputElement.classList.add('filled');
dropdown.classList.add('hidden');
});
item.addEventListener('keydown', (e) => {
if (e.key === 'Enter') {
inputElement.value = suggestion;
inputElement.classList.add('filled');
dropdown.classList.add('hidden');
}
});
dropdown.appendChild(item);
});
dropdown.classList.remove('hidden');
}
nameInputs.forEach((nameInput) => {
const nameDropdown = createAutocompleteDropdown(nameInput);
const fetchVacancies = debounce(async (query) => {
if (query.length < 2) {
nameDropdown.classList.add('hidden');
return;
}
try {
const url = `/umbraco/surface/AutocompleteSurface/GetVacancies?query=${encodeURIComponent(
query
)}&websiteId=${websiteId}`;
const response = await fetch(url);
if (!response.ok) {
nameDropdown.classList.add('hidden');
return;
}
const suggestions = await response.json();
showSuggestions(nameInput, nameDropdown, suggestions);
} catch (error) {
nameDropdown.classList.add('hidden');
}
}, 1000);
nameInput.addEventListener('input', (e) => {
fetchVacancies(e.target.value);
});
nameInput.addEventListener('focus', (e) => {
if (e.target.value.length >= 2) {
fetchVacancies(e.target.value);
}
});
document.addEventListener('click', (e) => {
if (
!nameInput.contains(e.target) &&
!nameDropdown.contains(e.target)
) {
nameDropdown.classList.add('hidden');
}
});
});
locationInputs.forEach((locationInput) => {
const locationDropdown = createAutocompleteDropdown(locationInput);
const fetchPlaces = debounce(async (query) => {
if (query.length < 2) {
locationDropdown.classList.add('hidden');
return;
}
try {
const url = `/umbraco/surface/AutocompleteSurface/GetPlaces?textInput=${encodeURIComponent(
query
)}`;
const response = await fetch(url);
if (!response.ok) {
locationDropdown.classList.add('hidden');
return;
}
const suggestions = await response.json();
if (Array.isArray(suggestions) && suggestions.length > 0) {
showSuggestions(
locationInput,
locationDropdown,
suggestions
);
} else {
locationDropdown.classList.add('hidden');
}
} catch (error) {
locationDropdown.classList.add('hidden');
}
}, 1000);
locationInput.addEventListener('input', (e) => {
fetchPlaces(e.target.value);
});
locationInput.addEventListener('focus', (e) => {
if (e.target.value.length >= 2) {
fetchPlaces(e.target.value);
}
});
document.addEventListener('click', (e) => {
if (
!locationInput.contains(e.target) &&
!locationDropdown.contains(e.target)
) {
locationDropdown.classList.add('hidden');
}
});
});
// Category toggle button functionality for mobile
const categoryToggleBtn = document.querySelector('[data-category-toggle]');
if (categoryToggleBtn) {
const mobileDropdown = document.querySelector(
'[data-mobile-category-dropdown]'
);
if (mobileDropdown) {
// Toggle dropdown on button click
categoryToggleBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
mobileDropdown.classList.toggle('is-open');
});
// Close dropdown when clicking outside
document.addEventListener('click', (e) => {
if (
!mobileDropdown.contains(e.target) &&
!categoryToggleBtn.contains(e.target)
) {
mobileDropdown.classList.remove('is-open');
}
});
// Close dropdown after selecting a category
const radioButtons = mobileDropdown.querySelectorAll(
'input[type="radio"]'
);
radioButtons.forEach((radio) => {
radio.addEventListener('change', () => {
setTimeout(() => {
mobileDropdown.classList.remove('is-open');
}, 200);
});
});
}
}
// Location button functionality
const locationButtons = document.querySelectorAll(
'.location-btn .atm-button-primary, .location-btn button'
);
locationButtons.forEach((btn) => {
btn.addEventListener('click', function (e) {
e.preventDefault();
if (!navigator.geolocation) {
alert('Geolocation wordt niet ondersteund door uw browser');
return;
}
// Find the location input - look for the closest location input in the form
const form = btn.closest('form');
const locationInput = form
? form.querySelector(
'#vacancy-homepage-search-location, .vl input, .location-input-wrapper input'
)
: null;
if (!locationInput) {
console.error('Location input not found');
return;
}
btn.disabled = true;
navigator.geolocation.getCurrentPosition(
function (position) {
const lat = position.coords.latitude;
const lon = position.coords.longitude;
// Gebruik reverse geocoding API (Nominatim) om adres te krijgen
fetch(
`https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lon}`
)
.then((response) => response.json())
.then((data) => {
const address = data.address;
let locationParts = [];
// Straat en huisnummer
if (address.road) {
let street = address.road;
if (address.house_number) {
street += ' ' + address.house_number;
}
locationParts.push(street);
}
// Postcode en plaats
let cityPart = '';
if (address.postcode) {
cityPart = address.postcode;
}
if (
address.city ||
address.town ||
address.village
) {
const city =
address.city ||
address.town ||
address.village;
cityPart = cityPart
? cityPart + ' ' + city
: city;
}
if (cityPart) {
locationParts.push(cityPart);
}
const locationString = locationParts.join(', ');
locationInput.value = locationString;
locationInput.classList.add('filled');
locationInput.dispatchEvent(
new Event('input', { bubbles: true })
);
btn.disabled = false;
})
.catch(function (error) {
console.error('Fout bij ophalen adres:', error);
locationInput.value =
lat.toFixed(6) + ', ' + lon.toFixed(6);
locationInput.classList.add('filled');
btn.disabled = false;
});
},
function (error) {
let errorMsg = 'Kon locatie niet ophalen';
switch (error.code) {
case error.PERMISSION_DENIED:
errorMsg = 'Toegang tot locatie geweigerd';
break;
case error.POSITION_UNAVAILABLE:
errorMsg = 'Locatie informatie niet beschikbaar';
break;
case error.TIMEOUT:
errorMsg = 'Timeout bij ophalen locatie';
break;
}
alert(errorMsg);
btn.disabled = false;
}
);
});
});
});
No notes defined.