A dark, editorial Bootstrap 6 homepage template for a beauty salon called Maison Velour: arched photo hero, tabbed price list with a service basket, artists, review carousel, online booking with an inline calendar, and gift cards.
How it works
The page root .mv-page carries data-bs-theme="dark" and re-maps the Bootstrap 6 primary role (--bs-primary-bg, --bs-primary-contrast, --bs-control-checked-bg) to blush pink.
- Navbar:
navbar lg:navbar-expandwith a<dialog class="drawer drawer-end">on mobile. The script syncsaria-expandedand closes it after a link. - Hero: a large serif headline, three arched
.mv-archphotos and a rotating.mv-sealbadge.[data-mv-open]shows today's status, worked out from theHOURSarray inscript.js. - Services & prices:
nav nav-underlinetabs switch four.tab-paneprice lists. Each.mv-rowhas a round.mv-addtoggle witharia-pressed,data-mv-nameanddata-mv-price..mv-basketshows the count and total. - Reviews: a Bootstrap 6
carouselof quotes. - Booking: the chosen services appear as dismissible
chipelements. The day comes from an inline Datepicker created in script withnew Datepicker(calEl, { inline: true, ... }). It allows the next 90 days and disables closed weekdays viavcpOptions.disableWeekdays. A Combobox picks the artist andbtn-checkradios pick the time. Submit validates everything, simulates the request and shows#mv-toast. - Gift cards: a
.form-rangewith a$value bubble updates the.mv-card-preview. "Send as a gift" opens#mv-gift-dialog, a<dialog class="dialog">with its own validated form.
Customization
- Change
--mv-blush,--mv-goldand--mv-bgon.mv-pageinstyle.css, together with the--bs-primary-*overrides beside them. - Edit
HOURSinscript.js. Days set tonullare shown as closed and disabled in the calendar. - Add services as new
.mv-rowitems. Each.mv-addneedsdata-mv-nameanddata-mv-price. Removearia-pressed="true"from "Cut & finish" if the basket should start empty. - Restyle the calendar with the
--bs-datepicker-*variables on#mv-calendar. Bootstrap replaces the element's classes, so target the id. - Replace the
setTimeoutin the booking handler withfetch()calls to your backend. - The photos come from Unsplash. Replace them with your own salon, team and client images.
Accessibility
A skip link jumps to #mv-main. Tabs use role="tab" with aria-selected, and each .mv-add has a descriptive aria-label. The basket total is announced through aria-live, and time slots sit in a fieldset with a legend. The dialog has aria-labelledby, and focus is shown with a gold outline. The marquee ribbon and the rotating seal stop under prefers-reduced-motion.
Bootstrap 6 notes
Built on Bootstrap 6.0.0-alpha.1 (alpha APIs can still change). btn-solid theme-primary replaces btn-primary, the navbar opens a Drawer instead of navbar-collapse, and Modal is now the native <dialog class="dialog">. Datepicker, Combobox, Range and Chips are new in Bootstrap 6. The carousel now uses CSS scroll-snap with carousel-icon-prev/-next, and data-bs-validate replaces needs-validation. The selected artist stays after the form resets, because Combobox has no reset method yet.