Merged in feat/SW-1890-New-Breakfast-Component (pull request #1666)
Feat/SW-1890 New Breakfast Component Design * refactor(SW-1890): Replace BreakfastChoiceCard with RadioCard component and update styles - Removed BreakfastChoiceCard component and its associated styles. - extemded RadioCard component to additional UI. - Updated breakfast.module.css to adjust container width. - Added new properties for subtitleSecondary and description in RadioCard. - Updated translations for breakfast-related messages in en.json. * feat(SW-1890): Add hover state to RadioCard * chore(SW1890): Update translation for breakfast cost message to clarify age range * chore(SW-1890): Updated breakfast cost display to use formatPrice utility * fix(SW-1890): Set fixed size for CoffeeIcon component * fix(SW-1890): Add missing translations for breakfast-related messages * feat(SW-1890): Introduce new breakfast icons and update Breakfast component - Replaced CoffeeIcon with BreakfastBuffetIcon and NoBreakfastBuffetIcon in the Breakfast component. - Added new BreakfastBuffetIcon and NoBreakfastBuffetIcon components to the design system. - Updated imports in the Breakfast component to reflect the new icons. Approved-by: Christian Andolf
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
.ancillaryChoiceCard:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
import { useFormContext } from "react-hook-form"
|
||||
|
||||
import { AncillaryCard } from "@/components/TempDesignSystem/AncillaryCard"
|
||||
|
||||
import styles from "./ancillaryChoiceCard.module.css"
|
||||
|
||||
import type { BreakfastChoiceCardProps } from "@/types/components/ancillaryCard"
|
||||
|
||||
export default function BreakfastChoiceCard({
|
||||
name,
|
||||
id,
|
||||
value,
|
||||
ancillary,
|
||||
}: BreakfastChoiceCardProps) {
|
||||
const { register, setValue } = useFormContext()
|
||||
|
||||
function onLabelClick(event: React.MouseEvent) {
|
||||
// Preventing click event on label elements firing twice: https://github.com/facebook/react/issues/14295
|
||||
event.preventDefault()
|
||||
setValue(name, value)
|
||||
}
|
||||
return (
|
||||
<label
|
||||
onClick={onLabelClick}
|
||||
tabIndex={0}
|
||||
className={styles.ancillaryChoiceCard}
|
||||
>
|
||||
<AncillaryCard ancillary={ancillary} />
|
||||
<input
|
||||
{...register(name)}
|
||||
aria-hidden
|
||||
id={id || name}
|
||||
hidden
|
||||
type="radio"
|
||||
value={value}
|
||||
/>
|
||||
</label>
|
||||
)
|
||||
}
|
||||
@@ -8,5 +8,5 @@
|
||||
display: grid;
|
||||
gap: var(--Spacing-x2);
|
||||
grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
|
||||
width: min(600px, 100%);
|
||||
width: min(700px, 100%);
|
||||
}
|
||||
|
||||
@@ -5,11 +5,17 @@ import { useCallback, useEffect } from "react"
|
||||
import { FormProvider, useForm } from "react-hook-form"
|
||||
import { useIntl } from "react-intl"
|
||||
|
||||
import {
|
||||
BreakfastBuffetIcon,
|
||||
NoBreakfastBuffetIcon,
|
||||
} from "@scandic-hotels/design-system/Icons"
|
||||
|
||||
import { useEnterDetailsStore } from "@/stores/enter-details"
|
||||
|
||||
import BreakfastChoiceCard from "@/components/HotelReservation/EnterDetails/Breakfast/BreakfastChoiceCard"
|
||||
import RadioCard from "@/components/TempDesignSystem/Form/RadioCard"
|
||||
import Body from "@/components/TempDesignSystem/Text/Body"
|
||||
import { useRoomContext } from "@/contexts/Details/Room"
|
||||
import { formatPrice } from "@/utils/numberFormatting"
|
||||
|
||||
import { breakfastFormSchema } from "./schema"
|
||||
|
||||
@@ -26,6 +32,9 @@ export default function Breakfast() {
|
||||
room,
|
||||
} = useRoomContext()
|
||||
|
||||
const hasChildrenInRoom = !!room.childrenInRoom?.length
|
||||
const totalPriceForNoBreakfast = 0
|
||||
|
||||
const breakfastSelection = room?.breakfast
|
||||
? room.breakfast.code
|
||||
: room?.breakfast === false
|
||||
@@ -64,7 +73,7 @@ export default function Breakfast() {
|
||||
return (
|
||||
<FormProvider {...methods}>
|
||||
<div className={styles.container}>
|
||||
{room.childrenInRoom?.length ? (
|
||||
{hasChildrenInRoom ? (
|
||||
<Body>
|
||||
{intl.formatMessage({
|
||||
id: "Children's breakfast is always free as part of the adult's breakfast.",
|
||||
@@ -73,42 +82,45 @@ export default function Breakfast() {
|
||||
) : null}
|
||||
<form className={styles.form} onSubmit={methods.handleSubmit(onSubmit)}>
|
||||
{packages?.map((pkg) => (
|
||||
<BreakfastChoiceCard
|
||||
<RadioCard
|
||||
key={pkg.code}
|
||||
name="breakfast"
|
||||
ancillary={{
|
||||
title: intl.formatMessage({ id: "Breakfast buffet" }),
|
||||
price: {
|
||||
total: pkg.localPrice.price,
|
||||
currency: pkg.localPrice.currency,
|
||||
included:
|
||||
pkg.code === BreakfastPackageEnum.FREE_MEMBER_BREAKFAST,
|
||||
text: intl.formatMessage({ id: "/night per adult" }),
|
||||
},
|
||||
description: intl.formatMessage({
|
||||
id: "All our breakfast buffets offer gluten free, vegan, and allergy-friendly options.",
|
||||
}),
|
||||
imageUrl: "/_static/img/enter-details/breakfast.png", // TODO: Add dynamic image
|
||||
}}
|
||||
value={pkg.code}
|
||||
id={pkg.code}
|
||||
Icon={BreakfastBuffetIcon}
|
||||
title={intl.formatMessage({ id: "Breakfast buffet" })}
|
||||
subtitle={
|
||||
pkg.code === BreakfastPackageEnum.FREE_MEMBER_BREAKFAST
|
||||
? intl.formatMessage({ id: "Included" })
|
||||
: `+ ${formatPrice(intl, pkg.localPrice.price, pkg.localPrice.currency ?? "")}`
|
||||
}
|
||||
subtitleSecondary={intl.formatMessage({ id: "Per adult/night" })}
|
||||
description={
|
||||
hasChildrenInRoom
|
||||
? intl.formatMessage({
|
||||
id: "Free for kids aged 12 and under.",
|
||||
})
|
||||
: undefined
|
||||
}
|
||||
descriptionSecondary={intl.formatMessage({
|
||||
id: "Includes vegan, gluten-free, and other allergy-friendly options.",
|
||||
})}
|
||||
/>
|
||||
))}
|
||||
<BreakfastChoiceCard
|
||||
<RadioCard
|
||||
name="breakfast"
|
||||
ancillary={{
|
||||
title: intl.formatMessage({ id: "No breakfast" }),
|
||||
price: {
|
||||
total: 0,
|
||||
currency: packages?.[0].localPrice.currency ?? "",
|
||||
},
|
||||
description: intl.formatMessage({
|
||||
id: "You can always change your mind later and add breakfast at the hotel.",
|
||||
}),
|
||||
imageUrl: "/_static/img/enter-details/breakfast.png", // TODO: Add dynamic image
|
||||
imageOpacity: 0.1,
|
||||
}}
|
||||
value="false"
|
||||
Icon={NoBreakfastBuffetIcon}
|
||||
title={intl.formatMessage({ id: "No breakfast" })}
|
||||
subtitle={`+ ${formatPrice(intl, totalPriceForNoBreakfast, packages?.[0].localPrice.currency ?? "")}`}
|
||||
descriptionSecondary={
|
||||
hasChildrenInRoom
|
||||
? intl.formatMessage({
|
||||
id: "Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.",
|
||||
})
|
||||
: intl.formatMessage({
|
||||
id: "Breakfast can be added after booking for an additional fee.",
|
||||
})
|
||||
}
|
||||
/>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -6,6 +6,8 @@ import { useFormContext } from "react-hook-form"
|
||||
import { MaterialIcon } from "@scandic-hotels/design-system/Icons"
|
||||
import { Typography } from "@scandic-hotels/design-system/Typography"
|
||||
|
||||
import Divider from "@/components/TempDesignSystem/Divider"
|
||||
|
||||
import styles from "./radioCard.module.css"
|
||||
|
||||
import type { RadioCardProps } from "./types"
|
||||
@@ -15,10 +17,13 @@ export default function RadioCard({
|
||||
iconHeight = 32,
|
||||
id,
|
||||
name,
|
||||
subtitle,
|
||||
title,
|
||||
subtitleSecondary,
|
||||
subtitle,
|
||||
value,
|
||||
disabled = false,
|
||||
description,
|
||||
descriptionSecondary,
|
||||
}: RadioCardProps) {
|
||||
const { register, setValue } = useFormContext()
|
||||
|
||||
@@ -52,9 +57,44 @@ export default function RadioCard({
|
||||
<Typography variant="Body/Paragraph/mdBold" className={styles.title}>
|
||||
<p>{title}</p>
|
||||
</Typography>
|
||||
{subtitleSecondary ? (
|
||||
<Typography
|
||||
variant="Body/Supporting text (caption)/smRegular"
|
||||
className={styles.subtitleSecondary}
|
||||
>
|
||||
<p>{subtitleSecondary}</p>
|
||||
</Typography>
|
||||
) : null}
|
||||
<Typography variant="Body/Paragraph/mdBold" className={styles.subtitle}>
|
||||
<p>{subtitle}</p>
|
||||
</Typography>
|
||||
|
||||
{description || descriptionSecondary ? (
|
||||
<Divider
|
||||
className={styles.divider}
|
||||
variant="horizontal"
|
||||
color="subtle"
|
||||
/>
|
||||
) : null}
|
||||
|
||||
{description ? (
|
||||
<Typography
|
||||
variant="Body/Supporting text (caption)/smRegular"
|
||||
className={styles.description}
|
||||
>
|
||||
<p>{description}</p>
|
||||
</Typography>
|
||||
) : null}
|
||||
|
||||
{descriptionSecondary ? (
|
||||
<Typography
|
||||
variant="Body/Supporting text (caption)/smRegular"
|
||||
className={styles.descriptionSecondary}
|
||||
>
|
||||
<p>{descriptionSecondary}</p>
|
||||
</Typography>
|
||||
) : null}
|
||||
|
||||
<input
|
||||
{...register(name)}
|
||||
aria-hidden
|
||||
|
||||
@@ -3,12 +3,22 @@
|
||||
cursor: pointer;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
grid-template-areas: "icon icon" "title subtitle";
|
||||
grid-auto-rows: min-content;
|
||||
grid-template-areas:
|
||||
"icon subtitleSecondary"
|
||||
"title subtitle";
|
||||
border-radius: var(--Corner-radius-md);
|
||||
border: 1px solid var(--Border-Intense);
|
||||
background: var(--Surface-Primary-Default);
|
||||
padding: var(--Space-x2) var(--Space-x3);
|
||||
gap: var(--Space-x1);
|
||||
transition:
|
||||
background 0.2s ease,
|
||||
border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.label:hover:not(.disabled) {
|
||||
background: var(--Surface-Primary-Hover);
|
||||
}
|
||||
|
||||
.label.disabled {
|
||||
@@ -44,12 +54,34 @@
|
||||
grid-area: icon;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
grid-area: subtitle;
|
||||
color: var(--Text-Default);
|
||||
}
|
||||
|
||||
.title {
|
||||
grid-area: title;
|
||||
color: var(--Text-Default);
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
grid-area: subtitle;
|
||||
color: var(--Text-Default);
|
||||
justify-self: end;
|
||||
}
|
||||
|
||||
.subtitleSecondary {
|
||||
grid-area: subtitleSecondary;
|
||||
place-self: end;
|
||||
color: var(--Text-Default);
|
||||
}
|
||||
|
||||
.divider {
|
||||
grid-column: 1 / -1;
|
||||
margin: var(--Space-x1) 0;
|
||||
}
|
||||
|
||||
.description {
|
||||
grid-column: 1 / -1;
|
||||
color: var(--Text-Default);
|
||||
}
|
||||
|
||||
.descriptionSecondary {
|
||||
grid-column: 1 / -1;
|
||||
color: var(--Text-Secondary);
|
||||
}
|
||||
|
||||
@@ -5,8 +5,11 @@ export interface RadioCardProps
|
||||
Icon?: (props: IconProps) => JSX.Element
|
||||
iconHeight?: number
|
||||
name: string
|
||||
subtitle?: React.ReactNode
|
||||
subtitle: React.ReactNode
|
||||
subtitleSecondary?: React.ReactNode
|
||||
title: React.ReactNode
|
||||
value?: string
|
||||
disabled?: boolean
|
||||
description?: React.ReactNode
|
||||
descriptionSecondary?: React.ReactNode
|
||||
}
|
||||
|
||||
@@ -132,6 +132,8 @@
|
||||
"Breakfast ({totalChildren, plural, one {# child} other {# children}}) x {totalBreakfasts}": "Morgenmad ({totalChildren, plural, one {# barn} other {# børn}}) x {totalBreakfasts}",
|
||||
"Breakfast Restaurant": "Breakfast Restaurant",
|
||||
"Breakfast buffet": "Morgenbuffet",
|
||||
"Breakfast can be added after booking for an additional fee.": "Morgenmad kan tilføjes efter booking for en ekstra omkostning.",
|
||||
"Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.": "Morgenmad kan tilføjes efter booking for en ekstra omkostning for voksne og børn fra 4 år.",
|
||||
"Breakfast can only be added for the entire duration of the stay and for all guests.": "Morgenmad kan kun tilføjes for hele opholdets varighed og for alle gæster.",
|
||||
"Breakfast charge": "Morgenmadsgebyr",
|
||||
"Breakfast deal can be purchased at the hotel.": "Morgenmad kan købes på hotellet.",
|
||||
@@ -312,6 +314,7 @@
|
||||
"Former Scandic Hotel": "Tidligere Scandic Hotel",
|
||||
"Free": "Gratis",
|
||||
"Free cancellation": "Gratis afbestilling",
|
||||
"Free for kids aged 12 and under.": "Gratis for børn under 12 år.",
|
||||
"Free parking": "Gratis parkering",
|
||||
"Free rebooking": "Gratis ombooking",
|
||||
"Free until": "Free until",
|
||||
@@ -394,6 +397,7 @@
|
||||
"In order to view your booking, please log in.": "Log ind for at se din reservation.",
|
||||
"Incl. VAT": "Inkl. moms",
|
||||
"Included": "Inkluderet",
|
||||
"Includes vegan, gluten-free, and other allergy-friendly options.": "Inkluderer veganske, glutenfrie og andre allergivenlige muligheder.",
|
||||
"Indoor pool": "Indendørs pool",
|
||||
"Indoor windows and excellent lighting": "Indoor windows and excellent lighting",
|
||||
"Indoor windows facing the hotel": "Indoor windows facing the hotel",
|
||||
@@ -595,6 +599,7 @@
|
||||
"Payment received": "Payment received",
|
||||
"Payment status": "Payment status",
|
||||
"Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.": "Betaling vil ske ved check-in. Kortet vil kun blive brugt til at garantere tillægget i tilfælde af en no-show.",
|
||||
"Per adult/night": "Pr. voksen/nat",
|
||||
"Per night from": "Per nat fra",
|
||||
"Pet room": "Kæledyrsrum",
|
||||
"Pet room charge including VAT": "Gebyr for kæledyrsværelse inkl. moms",
|
||||
|
||||
@@ -133,6 +133,8 @@
|
||||
"Breakfast ({totalChildren, plural, one {# child} other {# children}}) x {totalBreakfasts}": "Frühstück ({totalChildren, plural, one {# kind} other {# kinder}}) x {totalBreakfasts}",
|
||||
"Breakfast Restaurant": "Breakfast Restaurant",
|
||||
"Breakfast buffet": "Frühstücksbuffet",
|
||||
"Breakfast can be added after booking for an additional fee.": "Frühstück kann nach der Buchung für einen Aufpreis hinzugefügt werden.",
|
||||
"Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.": "Frühstück kann nach der Buchung für einen Aufpreis für Erwachsene und Kinder ab 4 Jahren hinzugefügt werden.",
|
||||
"Breakfast can only be added for the entire duration of the stay and for all guests.": "Frühstück kann nur für die gesamte Aufenthaltsdauer und für alle Gäste hinzugefügt werden.",
|
||||
"Breakfast charge": "Frühstücksgebühr",
|
||||
"Breakfast deal can be purchased at the hotel.": "Frühstücksangebot kann im Hotel gekauft werden.",
|
||||
@@ -313,6 +315,7 @@
|
||||
"Former Scandic Hotel": "Ehemaliges Scandic Hotel",
|
||||
"Free": "Kostenlos",
|
||||
"Free cancellation": "Kostenlose Stornierung",
|
||||
"Free for kids aged 12 and under.": "Kostenlos für Kinder bis 12 Jahre.",
|
||||
"Free parking": "Kostenloses Parken",
|
||||
"Free rebooking": "Kostenlose Umbuchung",
|
||||
"Free until": "Free until",
|
||||
@@ -395,6 +398,7 @@
|
||||
"In order to view your booking, please log in.": "Um Ihre Buchung einzusehen, loggen Sie sich bitte ein.",
|
||||
"Incl. VAT": "Inkl. MwSt.",
|
||||
"Included": "Iinklusive",
|
||||
"Includes vegan, gluten-free, and other allergy-friendly options.": "Enthält vegane, glutenfreie und andere allergiefreundliche Optionen.",
|
||||
"Indoor pool": "Innenpool",
|
||||
"Indoor windows and excellent lighting": "Indoor windows and excellent lighting",
|
||||
"Indoor windows facing the hotel": "Indoor windows facing the hotel",
|
||||
@@ -594,6 +598,7 @@
|
||||
"Payment received": "Payment received",
|
||||
"Payment status": "Payment status",
|
||||
"Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.": "Die Zahlung erfolgt beim Check-in. Die Karte wird nur zur Garantie der Nebenkosten im Falle eines No-Shows verwendet.",
|
||||
"Per adult/night": "Pro Erwachsenem/Nacht",
|
||||
"Per night from": "Pro Nacht ab",
|
||||
"Pet room": "Haustierzimmer",
|
||||
"Pet room charge including VAT": "Haustierzimmergebühr inkl. MwSt.",
|
||||
|
||||
@@ -132,6 +132,9 @@
|
||||
"Breakfast Restaurant": "Breakfast Restaurant",
|
||||
"Breakfast buffet": "Breakfast buffet",
|
||||
"Breakfast can only be added for the entire duration of the stay and for all guests.": "Breakfast can only be added for the entire duration of the stay and for all guests.",
|
||||
"Breakfast can be added after booking for an additional fee.": "Breakfast can be added after booking for an additional fee.",
|
||||
"Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.": "Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.",
|
||||
"Breakfast can only be added for the entire duration of the stay
and for all guests.": "Breakfast can only be added for the entire duration of the stay
and for all guests.",
|
||||
"Breakfast charge": "Breakfast charge",
|
||||
"Breakfast deal can be purchased at the hotel.": "Breakfast deal can be purchased at the hotel.",
|
||||
"Breakfast excluded": "Breakfast excluded",
|
||||
@@ -311,6 +314,7 @@
|
||||
"Former Scandic Hotel": "Former Scandic Hotel",
|
||||
"Free": "Free",
|
||||
"Free cancellation": "Free cancellation",
|
||||
"Free for kids aged 12 and under.": "Free for kids aged 12 and under.",
|
||||
"Free parking": "Free parking",
|
||||
"Free rebooking": "Free rebooking",
|
||||
"Free until": "Free until",
|
||||
@@ -393,6 +397,7 @@
|
||||
"In order to view your booking, please log in.": "In order to view your booking, please log in.",
|
||||
"Incl. VAT": "Incl. VAT",
|
||||
"Included": "Included",
|
||||
"Includes vegan, gluten-free, and other allergy-friendly options.": "Includes vegan, gluten-free, and other allergy-friendly options.",
|
||||
"Indoor pool": "Indoor pool",
|
||||
"Indoor windows and excellent lighting": "Indoor windows and excellent lighting",
|
||||
"Indoor windows facing the hotel": "Indoor windows facing the hotel",
|
||||
@@ -593,6 +598,7 @@
|
||||
"Payment received": "Payment received",
|
||||
"Payment status": "Payment status",
|
||||
"Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.": "Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.",
|
||||
"Per adult/night": "Per adult/night",
|
||||
"Per night from": "Per night from",
|
||||
"Pet room": "Pet room",
|
||||
"Pet room charge including VAT": "Pet room charge including VAT",
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
"Breakfast ({totalChildren, plural, one {# child} other {# children}}) x {totalBreakfasts}": "Aamiainen ({totalChildren, plural, one {# lapsi} other {# lasta}}) x {totalBreakfasts}",
|
||||
"Breakfast Restaurant": "Breakfast Restaurant",
|
||||
"Breakfast buffet": "Aamiaisbuffet",
|
||||
"Breakfast can be added after booking for an additional fee.": "Aamiaista voi lisätä varauksen jälkeen lisämaksulla.",
|
||||
"Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.": "Aamiaista voi lisätä varauksen jälkeen lisämaksulla aikuisille ja 4-vuotiaille ja sitä vanhemmille lapsille.",
|
||||
"Breakfast can only be added for the entire duration of the stay and for all guests.": "Aamiainen voidaan lisätä vain koko oleskelun ajaksi ja kaikille asiakkaille.",
|
||||
"Breakfast charge": "Aamiaismaksu",
|
||||
"Breakfast deal can be purchased at the hotel.": "Aamiaisdeali voidaan ostaa hotellissa.",
|
||||
@@ -312,6 +314,7 @@
|
||||
"Former Scandic Hotel": "Entinen Scandic-hotelli",
|
||||
"Free": "Ilmainen",
|
||||
"Free cancellation": "Ilmainen peruutus",
|
||||
"Free for kids aged 12 and under.": "Ilmainen alle 12-vuotiaille lapsille.",
|
||||
"Free parking": "Ilmainen pysäköinti",
|
||||
"Free rebooking": "Ilmainen uudelleenvaraus",
|
||||
"Free until": "Free until",
|
||||
@@ -394,6 +397,7 @@
|
||||
"In order to view your booking, please log in.": "Nähdäksesi varauksesi, ole hyvä ja kirjaudu sisään.",
|
||||
"Incl. VAT": "Sis. ALV",
|
||||
"Included": "Sisälly hintaan",
|
||||
"Includes vegan, gluten-free, and other allergy-friendly options.": "Sisältää vegaanisia, gluteenittomia ja muita allergiaystävällisiä vaihtoehtoja.",
|
||||
"Indoor pool": "Sisäuima-allas",
|
||||
"Indoor windows and excellent lighting": "Indoor windows and excellent lighting",
|
||||
"Indoor windows facing the hotel": "Indoor windows facing the hotel",
|
||||
@@ -593,6 +597,7 @@
|
||||
"Payment received": "Payment received",
|
||||
"Payment status": "Payment status",
|
||||
"Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.": "Maksu suoritetaan sisäänkirjautumisen yhteydessä. Korttia käytetään vain lisäpalvelun varmistamiseen, jos varausmyyntiä ei tapahdu.",
|
||||
"Per adult/night": "Aikuista kohden/yö",
|
||||
"Per night from": "Per yö alkaen",
|
||||
"Pet room": "Lemmikkihuone",
|
||||
"Pet room charge including VAT": "Lemmikkihuoneen maksu sis. ALV",
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
"Breakfast ({totalChildren, plural, one {# child} other {# children}}) x {totalBreakfasts}": "Frokost ({totalChildren, plural, one {# barn} other {# barn}}) x {totalBreakfasts}",
|
||||
"Breakfast Restaurant": "Breakfast Restaurant",
|
||||
"Breakfast buffet": "Breakfast buffet",
|
||||
"Breakfast can be added after booking for an additional fee.": "Frokost kan legges til etter bestilling for en ekstra kostnad.",
|
||||
"Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.": "Frokost kan legges til etter bestilling for en ekstra kostnad for voksne og barn fra 4 år.",
|
||||
"Breakfast can only be added for the entire duration of the stay and for all guests.": "Frokost kan bare legges til for hele oppholdets varighet og for alle gjester.",
|
||||
"Breakfast charge": "Pris for frokost",
|
||||
"Breakfast deal can be purchased at the hotel.": "Frokostdeal kan kjøpes på hotellet.",
|
||||
@@ -311,6 +313,7 @@
|
||||
"Former Scandic Hotel": "Tidligere Scandic-hotell",
|
||||
"Free": "Gratis",
|
||||
"Free cancellation": "Gratis avbestilling",
|
||||
"Free for kids aged 12 and under.": "Gratis for barn under 12 år.",
|
||||
"Free parking": "Gratis parkering",
|
||||
"Free rebooking": "Gratis ombooking",
|
||||
"Free until": "Free until",
|
||||
@@ -393,6 +396,7 @@
|
||||
"In order to view your booking, please log in.": "For å se bestillingen din, vennligst logg inn.",
|
||||
"Incl. VAT": "Inkl. MVA",
|
||||
"Included": "Inkludert",
|
||||
"Includes vegan, gluten-free, and other allergy-friendly options.": "Inkluderer veganske, glutenfrie og andre allergivennlige alternativer.",
|
||||
"Indoor pool": "Innendørs basseng",
|
||||
"Indoor windows and excellent lighting": "Indoor windows and excellent lighting",
|
||||
"Indoor windows facing the hotel": "Indoor windows facing the hotel",
|
||||
@@ -592,6 +596,7 @@
|
||||
"Payment received": "Payment received",
|
||||
"Payment status": "Payment status",
|
||||
"Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.": "Betaling vil skje ved innsjekking. Kortet vil kun bli brukt til å garantere tillegget i tilfelle av en no-show.",
|
||||
"Per adult/night": "Per voksen/natt",
|
||||
"Per night from": "Per nat fra",
|
||||
"Pet room": "Kjæledyrsrom",
|
||||
"Pet room charge including VAT": "Kjæledyrromsgebyr inkl. MVA",
|
||||
|
||||
@@ -131,6 +131,8 @@
|
||||
"Breakfast ({totalChildren, plural, one {# child} other {# children}}) x {totalBreakfasts}": "Frukost ({totalChildren, plural, one {# barn} other {# barn}}) x {totalBreakfasts}",
|
||||
"Breakfast Restaurant": "Breakfast Restaurant",
|
||||
"Breakfast buffet": "Frukostbuffé",
|
||||
"Breakfast can be added after booking for an additional fee.": "Frukost kan läggas till efter bokning för en extra kostnad.",
|
||||
"Breakfast can be added after booking for an extra cost for adults and kids ages 4 and up.": "Frukost kan läggas till efter bokning för en extra kostnad för vuxna och barn från 4 år.",
|
||||
"Breakfast can only be added for the entire duration of the stay and for all guests.": "Frukost kan endast läggas till för hela vistelsens varaktighet och för alla gäster.",
|
||||
"Breakfast charge": "Frukostpris",
|
||||
"Breakfast deal can be purchased at the hotel.": "Frukostdeal kan köpas på hotellet.",
|
||||
@@ -311,6 +313,7 @@
|
||||
"Former Scandic Hotel": "Tidigare Scandichotell",
|
||||
"Free": "Gratis",
|
||||
"Free cancellation": "Fri avbokning",
|
||||
"Free for kids aged 12 and under.": "Gratis för barn under 12 år.",
|
||||
"Free parking": "Gratis parkering",
|
||||
"Free rebooking": "Fri ombokning",
|
||||
"Free until": "Free until",
|
||||
@@ -393,6 +396,7 @@
|
||||
"In order to view your booking, please log in.": "För att se din bokning, vänligen logga in.",
|
||||
"Incl. VAT": "Inkl. moms",
|
||||
"Included": "Inkluderad",
|
||||
"Includes vegan, gluten-free, and other allergy-friendly options.": "Inkluderar veganska, glutenfria och andra allergivänliga alternativ.",
|
||||
"Indoor pool": "Inomhuspool",
|
||||
"Indoor windows and excellent lighting": "Fönster inomhus och utmärkt belysning",
|
||||
"Indoor windows facing the hotel": "Inomhusfönster mot hotellet",
|
||||
@@ -592,6 +596,7 @@
|
||||
"Payment received": "Payment received",
|
||||
"Payment status": "Payment status",
|
||||
"Payment will be made on check-in. The card will be only used to guarantee the ancillary in case of no-show.": "Betalning kommer att ske vid incheckning. Kortet kommer endast att användas för att garantera tillägget i händelse av no-show.",
|
||||
"Per adult/night": "Per vuxen/natt",
|
||||
"Per night from": "Per natt från",
|
||||
"Pet room": "Husdjursrum",
|
||||
"Pet room charge including VAT": "Avgift för husdjursrum inkl. moms",
|
||||
|
||||
@@ -14,12 +14,6 @@ export interface AncillaryCardProps {
|
||||
}
|
||||
}
|
||||
|
||||
export interface BreakfastChoiceCardProps extends AncillaryCardProps {
|
||||
name: string
|
||||
id?: string
|
||||
value: string
|
||||
}
|
||||
|
||||
export interface AncillaryChoiceCardProps extends AncillaryCardProps {
|
||||
name: string
|
||||
id?: string
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
import type { IllustrationProps } from '../icon'
|
||||
|
||||
export default function BreakfastBuffetIcon(props: IllustrationProps) {
|
||||
return (
|
||||
<svg
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
{...props}
|
||||
>
|
||||
<path
|
||||
d="M13.2976 4.76596C13.8499 4.76596 14.2976 4.31824 14.2976 3.76596V1C14.2976 0.447715 13.8499 0 13.2976 0H13.2551C12.7028 0 12.2551 0.447715 12.2551 0.999999V3.76596C12.2551 4.31824 12.7028 4.76596 13.2551 4.76596H13.2976Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M6.48987 6.1277C7.04216 6.1277 7.48987 5.67998 7.48987 5.1277V2.36174C7.48987 1.80946 7.04216 1.36174 6.48987 1.36174H6.44736C5.89508 1.36174 5.44736 1.80946 5.44736 2.36174V5.1277C5.44736 5.67998 5.89508 6.1277 6.44736 6.1277H6.48987Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M20.1053 1.36174C20.6576 1.36174 21.1053 1.80946 21.1053 2.36174V5.1277C21.1053 5.67998 20.6576 6.1277 20.1053 6.1277H20.0628C19.5105 6.1277 19.0628 5.67998 19.0628 5.1277V2.36174C19.0628 1.80946 19.5105 1.36174 20.0628 1.36174H20.1053Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M32 9.53195V16C32 18.0619 30.3173 19.7447 28.2554 19.7447H25.5476C23.5603 24.5575 18.8358 27.9149 13.2763 27.9149C5.90393 27.9149 0 22.0108 0 14.6383V9.53192L32 9.53195ZM26.5526 14.6383V11.5745H29.9575V16C29.9575 16.9339 29.1892 17.7022 28.2554 17.7022H26.2025C26.4316 16.7197 26.5526 15.694 26.5526 14.6383ZM2.04251 11.5745V14.6383C2.04251 20.8828 7.03197 25.8723 13.2763 25.8723C19.5207 25.8723 24.5101 20.8828 24.5101 14.6383V11.5745H2.04251Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M25.5526 32C26.1049 32 26.5526 31.5523 26.5526 31V30.9574C26.5526 30.4052 26.1049 29.9574 25.5526 29.9574H1C0.447715 29.9574 0 30.4052 0 30.9574V31C0 31.5523 0.447716 32 1 32H25.5526Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
import type { IllustrationProps } from '../icon'
|
||||
|
||||
export default function NoBreakfastBuffetIcon(props: IllustrationProps) {
|
||||
return (
|
||||
<svg
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
{...props}
|
||||
>
|
||||
<path
|
||||
d="M5.70019 9.53193L0 9.53192V14.6383C0 22.0108 5.90393 27.9149 13.2763 27.9149C16.3282 27.9149 19.1284 26.9032 21.3623 25.1944L19.9028 23.7349C18.0501 25.0813 15.7627 25.8723 13.2763 25.8723C7.03197 25.8723 2.04251 20.8828 2.04251 14.6383V11.5745H7.74269L5.70019 9.53193Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M23.6996 18.8659C24.2227 17.5634 24.5101 16.137 24.5101 14.6383V11.5745H16.4083L14.3658 9.53194L32 9.53195V16C32 18.0619 30.3173 19.7447 28.2554 19.7447H25.5476C25.454 19.9714 25.3543 20.195 25.2487 20.415L23.6996 18.8659ZM26.5526 14.6383V11.5745H29.9575V16C29.9575 16.9339 29.1892 17.7022 28.2554 17.7022H26.2025C26.4316 16.7197 26.5526 15.694 26.5526 14.6383Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M7.48987 2.65583V2.38302C7.48987 1.81898 7.03264 1.36174 6.46862 1.36174C6.38467 1.36174 6.30309 1.37187 6.22504 1.39097L7.48987 2.65583Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M13.2763 4.76596C13.8403 4.76596 14.2976 4.30872 14.2976 3.74468V1.02128C14.2976 0.457241 13.8403 0 13.2763 0C12.7123 0 12.2551 0.45724 12.2551 1.02128V3.74468C12.2551 4.30872 12.7123 4.76596 13.2763 4.76596Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M21.1053 2.38302C21.1053 1.81898 20.648 1.36174 20.084 1.36174C19.52 1.36174 19.0628 1.81898 19.0628 2.38302V5.10642C19.0628 5.67046 19.52 6.1277 20.084 6.1277C20.648 6.1277 21.1053 5.67046 21.1053 5.10642V2.38302Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M26.5526 30.9787C26.5526 31.5428 26.0954 32 25.5314 32H1.02126C0.457232 32 0 31.5428 0 30.9787C0 30.4147 0.457232 29.9574 1.02126 29.9574H25.5314C26.0954 29.9574 26.5526 30.4147 26.5526 30.9787Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
<path
|
||||
d="M1.61773 2.55264C1.2189 2.15381 1.2189 1.50717 1.61773 1.10834C2.01655 0.709508 2.66318 0.709508 3.062 1.10834L30.5032 28.5501C30.902 28.9489 30.902 29.5956 30.5032 29.9944C30.1044 30.3932 29.4577 30.3932 29.0589 29.9944L1.61773 2.55264Z"
|
||||
fill="#26201E"
|
||||
/>
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
@@ -36,6 +36,8 @@ export { default as BedSofaIcon } from './Illustrations/BedSofa'
|
||||
export { default as BedSofaExtraIcon } from './Illustrations/BedSofaExtra'
|
||||
export { default as BedTwinIcon } from './Illustrations/BedTwin'
|
||||
export { default as BedWallExtraIcon } from './Illustrations/BedWallExtra'
|
||||
export { default as BreakfastBuffetIcon } from './Illustrations/BreakfastBuffet'
|
||||
export { default as NoBreakfastBuffetIcon } from './Illustrations/NoBreakfastBuffet'
|
||||
export { default as CoinIcon } from './Illustrations/Coin'
|
||||
export { default as CroissantCoffeeEggIcon } from './Illustrations/CroissantCoffeeEgg'
|
||||
export { default as CutleryOneIcon } from './Illustrations/CutleryOne'
|
||||
|
||||
Reference in New Issue
Block a user