import { A as dateFnsLocale, B as RentalCopyTable, C as I18nProviderProps, D as SharedCopyOverrides, E as SharedCopy, F as DatesCopy, H as CardCopyTable, I as GuestsCopy, L as RegionCopy, M as resolveCopy, N as resolveShared, O as SharedCopyTable, P as useI18n, R as SheetCopy, S as I18nProvider, T as SHARED_COPY, V as CardCopy, _ as CopyLocale, a as RentalCardProps, b as DEFAULT_VOICE, c as FIELD_PARTS, d as HeadingLevel, f as HeadingTag, g as CommonCopy, h as SITE_EVENT_PREFIX, i as RentalCardParts, j as fill, k as Voice, l as FieldPart, m as PrimitivePart, n as RentalCard, o as Breakpoint, p as PRIMITIVE_PARTS, r as RentalCardOptions, s as ExternalLoad, t as RENTAL_CARD_PARTS, u as GlyphMode, v as CopyTable, w as Locale$1, x as I18n, y as DEFAULT_LOCALE, z as RentalCopy } from "./RentalCard-CBH3jXNk.js"; import * as React$1 from "react"; import { BookableFrom, CampaignLabelSource, CheckoutActions, CheckoutFlowOptions, CheckoutMessages, CheckoutState, ContactFieldSpec, ContactFormActions, ContactFormMessages, ContactFormOptions, ContactFormState, ContactLink, CountryCode, CountryGroups, DayPrices, DistanceKind, ExternalSearchLink, Favorites, FavoritesState, FlexibleStay, Glyph, GuestForm, GuestFormOptions, GuestFormState, GuestOptions, HistoryPort, LegalDocument, Locale, OfferWindow, OptionalGuestField, PolicyChoiceMode, PreviewStrategy, QuoteFlow, QuoteFlowOptions, QuoteFlowState, RentalAddressMode, RentalDetail, RentalFactsMap, RentalIndexEntry, ResolvedFilters, ReviewSummary, RichBlock, RoomKind, RouteTemplate, SdkMode, SdkSetup, SearchContract, SearchField, SearchForm, SearchFormOptions, SearchFormState, SearchResultItem, SearchScope, SearchState, SearchStore, ShowcaseGroup, SortKey, Template, ValidationMessages, WebsiteSdk, WhenEmpty, WhenUnavailable } from "@v-office/website-headless"; //#region src/lib/sdk.d.ts /** The page-shared instance for (setup, mode), claimed on the getter's first call (in an effect or a * handler) and released on unmount or when the setup changes. A StrictMode remount keeps the instance * (the registry disposes only when no claim returns within the same task). */ type UseSdk = (setup: SdkSetup, mode?: SdkMode) => () => WebsiteSdk; /** Same, with the SDK imported on the getter's first call (a dynamic import): a page whose only SDK use * is a submit (the contact form) ships no SDK code until someone sends. A failed load is retried on the * next call. */ type UseLazySdk = (setup: SdkSetup, mode?: SdkMode) => () => Promise; /** See {@link UseSdk}. */ export declare const useSdk: UseSdk; /** See {@link UseLazySdk}. */ export declare const useLazySdk: UseLazySdk; //#endregion //#region src/lib/consent.d.ts /** The window event the site's consent host dispatches when categories are granted or revoked. */ export declare const CONSENT_EVENT: "voffice:consent"; /** The event detail: which categories changed, and how. */ type ConsentEventDetail = { readonly type: "granted" | "revoked"; readonly categories: readonly string[]; }; /** The attribute on holding the granted categories, space-separated, for components that mount * after the grant (``). */ export declare const CONSENT_GRANTED_ATTRIBUTE: "data-consent-granted"; /** True once `category` is granted: read from CONSENT_GRANTED_ATTRIBUTE after mount, then from each * CONSENT_EVENT naming it. False on the server and in the hydrating render. A revocation turns it back * to false; what that means for content already loaded is the component's decision (a built map stays, * only future loads stop). */ type UseConsent = (category: string) => boolean; /** See {@link UseConsent}. */ export declare const useConsent: UseConsent; //#endregion //#region src/lib/fill-parts.d.ts /** Which tokens render emphasised. */ interface FillPartsOptions { /** Token names whose value renders in ``. Default none. */ readonly emphasise?: readonly K[]; } /** Replace `{name}` tokens like `fill()`; an unknown token stays visible ("{nights}"). Returns the text * runs and one `` per emphasised token, keyed for a list. */ type FillParts = (template: Template, values: Readonly>, options?: FillPartsOptions>) => React$1.ReactNode[]; /** See {@link FillParts}. */ export declare const fillParts: FillParts; //#endregion //#region src/lib/useEnhance.d.ts /** What an engine returns: a dispose function, or a handle with `dispose` (`bindStrip`, `bindLayer`). */ type EnhanceBinding = (() => void) | { readonly dispose: () => void; }; /** Bind `bind` to the returned ref's element once it is in the page, and dispose it on unmount. The * binding follows the committed element: a root that appears later (a component that rendered `null` * first) is bound then, a replaced root is re-bound, a removed one is disposed. A change in `deps` * re-binds too (dispose first). `bind` is read with the deps, like an effect body. */ type UseEnhance = (bind: (element: E) => EnhanceBinding, deps: readonly unknown[]) => React$1.RefObject; /** See {@link UseEnhance}. */ export declare const useEnhance: UseEnhance; //#endregion //#region src/lib/useFavorites.d.ts /** One Merkliste's state and its store. */ interface FavoritesBinding { /** The saved ids; empty on the server and in the hydrating render (storage is browser-only). */ readonly state: FavoritesState; /** The page's shared store after mount (`favorites?.toggle(id)`); null on the server, before mount * and without a key. A heart inside a link calls `event.preventDefault()` before toggling, so the * layout binder leaves the click to it. */ readonly favorites: Favorites | null; } /** The Merkliste under `storageKey` (`favoritesStorageKey(namespace)`, the site's `FAVORITES_KEY`). * `null` = this component draws no saved state: its hearts are left to the layout binder. Another tab's * change arrives through the `storage` event. */ type UseFavorites = (storageKey: string | null) => FavoritesBinding; /** See {@link UseFavorites}. */ export declare const useFavorites: UseFavorites; //#endregion //#region src/lib/glyphs.d.ts /** Props of a headless `Glyph` drawn as an icon. */ interface GlyphIconProps { /** The glyph to draw. */ glyph: Glyph; /** Sizing and colour; the icon is 1em square in `currentColor` unless a class says otherwise. */ className?: string; } /** The icon for `glyph`, `aria-hidden`, carrying `data-part="glyph"` and `data-glyph=""` so a site * can restyle (or hide) one glyph everywhere. */ type GlyphIconComponent = (props: GlyphIconProps) => React.JSX.Element; /** See {@link GlyphIconComponent}. */ export declare const GlyphIcon: GlyphIconComponent; //#endregion //#region src/rich-text/RichText.d.ts /** RichText's props: sanitized blocks and how their headings nest. */ interface RichTextProps { /** The sanitized blocks (`RichBlock[]` from headless). */ blocks: readonly RichBlock[]; /** The level the document's level-2 headings render at; its level-3 and level-4 headings follow one * and two below (capped at 6). "none" renders every heading as a `

` (a block inside a section * whose heading the page already drew). Default 2. */ headingLevel?: HeadingLevel | "none"; /** "section" (default): the document's first heading is one of its sections. "title": a first block * that is a heading is the page's title and renders one level above `headingLevel` (an h1 at the * default; `data-level="1"`), for a legal document that opens with its own title (headless clamps * every document heading to level 2–4, so the title cannot be told apart otherwise). */ firstHeading?: "section" | "title"; /** firstHeading "title": the title drawn as that heading (same level, `data-level="1"`) when the * first block is NOT a heading, so the page still gets its h1 (`LegalDocument.title` is the natural * value). Ignored when the document opens with a heading, and under "section". Default none (no * title is drawn). */ title?: string; /** On the root. */ className?: string; } /** The part vocabulary (the type of `RICH_TEXT_PARTS`, declared below), a flat array (the * vocabularies grouped per block or step, RENTAL_DETAIL_PARTS and BOOKING_PARTS, are objects keyed by * name). Renaming or removing one is a major. A heading carries `data-level` (the document's own, * 2–4; 1 for the title under `firstHeading="title"`). */ type RichTextParts = typeof RICH_TEXT_PARTS; /** `

` with the blocks, or null for no blocks. External links (an http(s) * URL) open in a new tab with `rel="noopener noreferrer"`; site-relative, mailto and tel links do not. */ type RichTextComponent = (props: RichTextProps) => React.JSX.Element | null; export declare const RICH_TEXT_PARTS: readonly ["rich-text", "rich-text-heading", "rich-text-paragraph", "rich-text-list", "rich-text-list-item", "rich-text-link", "rich-text-rule"]; /** See {@link RichTextComponent}. */ export declare const RichText: RichTextComponent; //#endregion //#region src/contact/copy.d.ts /** The form's copy. It extends the headless messages, so the merged copy is handed to the store as is. */ interface ContactFormCopy extends ContactFormMessages { /** The PMS subject when the page sets none ("Kontaktanfrage"); set `subject` per form instead. */ defaultSubject: string; /** Default "Bitte wählen". */ salutationPlaceholder: string; /** Default "Frau". */ salutationFemale: string; /** Default "Herr". */ salutationMale: string; /** Default "Keine Angabe". */ salutationUnspecified: string; /** The two country groups: the featured codes, then the whole register. */ countryFeaturedLabel: string; /** Default "Weitere Länder". */ countryAllLabel: string; /** A select extra with nothing chosen yet. */ selectPlaceholder: string; /** Default "Anreise". */ periodFromLabel: string; /** Default "Abreise". */ periodToLabel: string; /** The "dates are flexible" checkbox of a period extra with `allowFlexible`. */ periodFlexibleLabel: string; /** Default "Nachricht senden". */ submitIdle: string; /** Default "Wird gesendet". */ submitBusy: string; /** Default "Danke, die Nachricht ist angekommen.". */ successHeading: string; /** Default "Wir melden uns zurück.". */ successBody: string; /** Default "Weitere Nachricht schreiben". */ sendAnother: string; /** The form's accessible name. */ formAriaLabel: string; /** The privacy notice, split around the link so a voice or a language can move the punctuation. */ privacyNoticeText: string; /** Default "Datenschutzhinweisen". */ privacyLinkLabel: string; /** Default ".". */ privacyNoticeSuffix: string; } /** The type of `DEFAULT_CONTACT_COPY` (declared below). */ type ContactFormCopyTable = CopyTable; export declare const DEFAULT_CONTACT_COPY: ContactFormCopyTable; //#endregion //#region src/contact/ContactForm.d.ts /** ContactForm's props. Serializable (an island). */ interface ContactFormProps { /** The site's SDK setup. The SDK is imported and claimed on the first submit, not at hydration, so a * contact page ships no SDK code up front. */ sdk: SdkSetup; /** REQUIRED, no default: named in the send-failure line. A default would print one agency's inbox on * another's site. `null` = no publishable inbox; the failure line drops its "write to …" half. */ supportEmail: string | null; /** `countryOptions({ locale, featured })` from headless, computed at build time. */ countries: CountryGroups; /** Default "de-DE". Decides the copy, the date format of message lines and the language of the * SDK's validation messages. */ locale?: Locale; /** How German copy addresses the reader. Default "neutral". */ voice?: Voice; /** Recorded on the request in the PMS (≤ 200 characters). Default `copy.defaultSubject`. A wrong * subject only shows in the agency's inbox, so set it per form ("Anfrage Eigentümer"). */ subject?: string; /** The field list in render order. Default `DEFAULT_CONTACT_FIELDS` (salutation, forename, surname, * email, phone, country, message). */ fields?: readonly ContactFieldSpec[]; /** The starting "Land": a code, or "detect" from the visitor's browser languages after hydration * (only while the field is still empty). A `defaultValue` on the `country` spec wins. Default * "detect". */ defaultCountry?: CountryCode | "detect"; /** The site's privacy page. When set, a NOTICE above the submit links to it in a new tab (typed input * survives). Set it only once the page resolves; a link to a missing page is worse than no line. * Default null (no line). */ privacyHref?: string | null; /** The level of the success panel's heading; "none" renders it as a `

`. Default 2. */ headingLevel?: HeadingLevel | "none"; /** Any subset of the strings; wins over the voice. */ copy?: Partial; /** Overrides of the shared strings (`common.optionalSuffix`, `common.newTabHint`). */ shared?: SharedCopyOverrides; /** On the root (the form, or the success panel that replaces it). */ className?: string; } /** The form. The submit is disabled until hydration (no pre-hydration GET of personal data into * logs); a sent request dispatches `voffice:contact` `{ type: "sent", subject }` on window. */ type ContactFormComponent = (props: ContactFormProps) => React$1.JSX.Element; /** See {@link ContactFormComponent}. */ declare const ContactForm: ContactFormComponent; //#endregion //#region src/contact/useContactForm.d.ts /** The store's options plus the site's SDK setup. The SDK is imported and claimed on the first submit * (`useLazySdk`). `fields`, `initialValues` and `today` are read on mount only; `messages`, `locale`, * `subject` and `supportEmail` follow the props (compared by value, so an inline object is fine). */ type UseContactFormOptions = ContactFormOptions & { readonly sdk: SdkSetup; }; /** The form's state and its actions. A successful `form.submit` dispatches `CONTACT_EVENT` * (`voffice:contact`, `{ type: "sent", subject }`, never a field value) on window. */ interface ContactFormBinding { /** The form's state, re-rendered on every change. */ readonly state: ContactFormState; /** `setValue`, `blur`, `submit`, `reset`, `update`, `dispose`; stable for the form's lifetime. */ readonly form: ContactFormActions; } /** The contact form of one mounted component (a site's own form UI over the package's rules). */ type UseContactForm = (options: UseContactFormOptions) => ContactFormBinding; /** See {@link UseContactForm}. */ export declare const useContactForm: UseContactForm; //#endregion //#region src/contact/parts.d.ts /** The parts (the type of `CONTACT_PARTS`, declared below), in render order: * contact-form (the `

`, `data-busy` while sending) · contact-group (a heading over the fields that * follow) · contact-actions (the footer column: privacy, status, submit) · contact-privacy (the notice * line) · contact-privacy-link · contact-status (the failure line, role=alert) · contact-submit * (disabled until hydrated, `data-busy`) · contact-success (the panel replacing the form, role=status) * · contact-success-heading · contact-success-body · contact-send-another. */ type ContactParts = typeof CONTACT_PARTS; /** One contact part. */ type ContactPart = ContactParts[number]; export declare const CONTACT_PARTS: readonly ["contact-form", "contact-group", "contact-actions", "contact-privacy", "contact-privacy-link", "contact-status", "contact-submit", "contact-success", "contact-success-heading", "contact-success-body", "contact-send-another"]; //#endregion //#region src/results/SearchFilters.d.ts /** Props of SearchFilters. */ interface SearchFiltersProps { /** The page's store. Default "search". */ storeKey?: string; /** Default "de-DE". */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** "pills" (default): toggle pills and steppers. "list": check rows for booleans and facets, * selects for minimums ("Beliebig / ab N"). */ panel?: "pills" | "list"; /** Live counts beside every option the build's facts can count. Default false. */ counts?: boolean; /** An option whose live count is 0 (a facet value, a facts flag): "disable" (default; kept, * not clickable, with its reason), "drop" (not shown) or "show". A selected option always * shows, so it can be undone. */ whenEmpty?: WhenEmpty; /** A square icon trigger whose label shows from md only (beside a search bar). Default false. */ compact?: boolean; /** Overrides of the filters' words. */ copy?: Partial; /** Overrides of the shared strings (`common.close`). */ shared?: SharedCopyOverrides; /** On the trigger. */ className?: string; } /** The trigger's and the panel's words. */ interface SearchFiltersCopy { /** The trigger's label. */ trigger: string; /** The panel's title. */ title: string; /** Clears the working selection. */ reset: string; /** Applies a selection with no filter in it. */ apply: string; /** Applies `{count}` filters. */ applyCount: Template<"count">; /** A minimum at "no minimum". */ any: string; /** A minimum's value: `{count}`. */ minimum: Template<"count">; /** A stepper's minus; `{label}` is the filter. */ decrease: Template<"label">; /** A stepper's plus; `{label}` is the filter. */ increase: Template<"label">; /** The dogs entry (dog-specific, never "Haustiere"). */ petsOne: string; /** A live count beside an option: `{count}`. */ optionCount: Template<"count">; /** Why an option is disabled (it matches nothing right now). */ optionEmpty: string; } /** The filters' default copy. */ type SearchFiltersCopyTable = CopyTable; /** The trigger and its panel, or null while the page offers no filter control. */ type SearchFiltersComponent = (props: SearchFiltersProps) => React$1.JSX.Element | null; /** See {@link SearchFiltersCopyTable}. */ export declare const DEFAULT_SEARCH_FILTERS_COPY: SearchFiltersCopyTable; export declare const SearchFilters: SearchFiltersComponent; //#endregion //#region src/search/copy.d.ts /** SearchBar's own strings. German defaults address nobody. */ interface SearchBarCopy { /** The search form's accessible name. */ ariaLabel: string; /** Region field label ("Wohin"). */ regionLabel: string; /** Region field value while nothing is chosen. A prompt, never an invented place. */ regionPlaceholder: string; /** The "all" head of a single-select region list. */ regionAll: string; /** Clears every chosen region. */ regionClear: string; /** Accessible name of the region list. */ regionListLabel: string; /** Dates field label ("Wann"). */ datesLabel: string; /** Dates field value while nothing is picked. */ datesPlaceholder: string; /** Guests field label ("Wer"). */ guestsLabel: string; /** Guests field value while nothing is chosen. A prompt, never a number that is not set. */ guestsPlaceholder: string; /** Dog field label (the "pets" field). */ petsLabel: string; /** Dog field value without a dog. */ petsPlaceholder: string; /** The submit button. */ submit: string; /** Shown in the guest panel when a child without an age stops the submit. */ agesMissing: string; /** The not-bookable-yet notice; `{date}` is the first day, month or year bookable online, as * `dates.bookable.precision` names it ("1. März 2027", "März 2027", "2027"). An override's * `{contact}` places `bookable.contact` inline there instead of on its own line. */ deferredNotice: Template<"date" | "contact">; /** The mobile trigger's text (and accessible name). */ sheetTrigger: string; /** Accessible text of the mobile trigger's skeleton. */ sheetLoading: string; /** Sheet step title: region. */ stepRegion: string; /** Sheet step title: dates. */ stepDates: string; /** Sheet step title: guests. */ stepGuests: string; /** Sheet step title: dog. */ stepPets: string; /** On to the next step (the sheet's one stable Weiter/Suchen button). Back, close and apply are * `shared.common`. */ next: string; /** Clears every choice of the bar. */ reset: string; /** Stepped flow: clears the dates. */ clearDates: string; /** Stepped flow: closes and restores what was chosen before the panel opened. */ cancel: string; /** Stepped flow: closes and keeps the choice. */ save: string; /** Title of the dates panel (stepped flow, dialog). */ datesTitle: string; /** Title of the guests panel (stepped flow, dialog). */ guestsTitle: string; } /** RentalJump's strings. */ interface RentalJumpCopy { /** The input's label. */ label: string; /** The input's placeholder. */ placeholder: string; /** No rental matches the query. */ empty: string; /** More matches than shown; `{count}` is the number not shown. */ more: Template<"count">; /** While the index loads. */ loading: string; /** The index could not be loaded (the next focus retries). */ failed: string; } /** The SearchBar's default copy. */ type SearchBarCopyTable = CopyTable; /** The RentalJump's default copy. */ type RentalJumpCopyTable = CopyTable; /** See {@link SearchBarCopyTable}. */ export declare const DEFAULT_SEARCH_BAR_COPY: SearchBarCopyTable; /** See {@link RentalJumpCopyTable}. */ export declare const DEFAULT_RENTAL_JUMP_COPY: RentalJumpCopyTable; //#endregion //#region src/search/RentalJump.d.ts /** Where the entries come from: inline (a bar on a search page, up to a few hundred), or the URL of the site's * static index fetched on first focus (a nav on every page: inline markup would repeat the index per page). */ type RentalJumpSource = { rentals: readonly RentalIndexEntry[]; } | { url: string; }; /** Props of {@link RentalJump}. */ interface RentalJumpProps { /** The entries (headless `rentalIndexEntries` at build time, with the site's own hrefs). */ source: RentalJumpSource; /** Default "de-DE". */ locale?: Locale; /** Default "neutral". */ voice?: Voice; /** Hits shown. Default 8. */ limit?: number; /** Site overrides of the strings. */ copy?: Partial; /** On the root. */ className?: string; } /** The combobox: `rental-jump` (root with label and input), `rental-jump-list` (the popup: listbox and status * line), `rental-jump-option`. */ type RentalJumpComponent = (props: RentalJumpProps) => React$1.JSX.Element; /** See {@link RentalJumpComponent}. */ export declare const RentalJump: RentalJumpComponent; //#endregion //#region src/search/SearchBar.d.ts /** "hero": an entry bar (stacked label over value, no skeleton). "search": the bar on the page whose URL it * mirrors (glyph + label/value, skeletons until the URL is read). */ type SearchBarVariant = "hero" | "search"; /** One region a guest can pick. The list, its order, labels, counts and groups are the site's data. */ interface RegionOption { /** Written to `?region=` and matched against the site's rental → region map. */ value: string; /** Shown instead of the value (a feed value with a display name). */ label?: string; /** Rentals in the region, shown after the label. */ count?: number; /** Options with the same group render under one heading, in first-seen order. */ group?: string; } /** The date picker's options. */ interface SearchBarDates { /** ± chips in days. Default [0, 1, 2, 3, 7, 14]; [] or [0] hides the chip row. On v9 only with nightRangeSearch. */ flexSteps?: readonly number[]; /** Default all three; [] removes the flexible tab (v10 only anyway). */ flexibleStays?: readonly FlexibleStay[]; /** Render the Min./Max. Nächte row. Default false. Presentation only: whether the backend prices * a min/max window is the contract's `nightRangeSearch`. */ nightRangeRow?: boolean; /** Shortest pickable stay in nights; closer departure days are disabled with the reason. Default 1. */ minStayNights?: number; /** Not bookable online yet: floors the picker at `from`; the notice (with `contact`) shows while today < * `noticeUntil ?? from`. The same object as Quote `bookable` (which does NOT floor). */ bookable?: BookableFrom; } /** The guest picker's options: the site's one GuestOptions (limits, child-age band, default adults — the * same object Quote and Booking take) plus the bar's own. The dog control follows `limits.pets`: 0 no dogs, * 1 a yes/no toggle, more a stepper (default 4). It sits inside the guest panel, or is its own field when * `fields` lists "pets" ("pets" with `limits.pets: 0` is a spec error and throws). */ interface SearchBarGuests extends GuestOptions { /** The closed field shows the default party ("2 Gäste") instead of the prompt. Default false. */ showDefault?: boolean; /** Default "required": a child without an age stops the submit and opens the guest panel. */ childAges?: "required" | "optional"; } /** The embedded rental-name combobox: RentalJump's own props (source, limit, copy) without what the bar * supplies (locale, voice). */ type SearchBarRentalJump = Omit; /** The embedded compact filter trigger of the page's search store: SearchFilters' own props (storeKey * default "search", panel default "pills", counts default false, whenEmpty default "disable", copy) * without what the bar supplies (locale, voice, compact) — pass the results' header filter options, so * the two panels on one page agree. */ type SearchBarFilters = Omit; /** The search bar below `collapseBelow`: "steps" one trigger opening a sheet that walks the fields with one * stable Weiter/Suchen button; "scroll" the same trigger opening one scrolling sheet with every field and one * submit; "inline" no sheet, the fields stack in place. */ type SearchBarMobile = "steps" | "scroll" | "inline"; /** Props of {@link SearchBar}. Every prop is serializable (islands). */ interface SearchBarProps { /** The search route the GET form lands on. Required (no route default exists). May carry a #fragment. */ action: string; /** The site's ONE search contract: which PMS answers (decides how a period is spelled), whether it * prices a min/maxNights window, its legacy URL aliases. The same object SearchResults and * OfferCampaignFilter take. Required. */ contract: SearchContract; /** Default "de-DE". */ locale?: Locale; /** Default "neutral". */ voice?: Voice; /** Field order. Default ["region", "dates", "guests"]; "region" renders only with regions. */ fields?: readonly SearchField[]; /** Empty or absent: no region field (a `?region=` scope still rides along). */ regions?: readonly RegionOption[]; /** Default "multi" (OR). "single" leads with `copy.regionAll`. */ regionSelect?: "multi" | "single"; /** The date picker's options. */ dates?: SearchBarDates; /** The guest picker's options. */ guests?: SearchBarGuests; /** A landing page's starting search as a query string (applied when the URL owns none of the bar's keys). */ preset?: string; /** Default "hero". */ variant?: SearchBarVariant; /** Leading field glyphs. Default: "default" for "search", "none" for "hero". */ glyphs?: Exclude; /** Desktop panel frame: "popover" (default) at its anchor, "dialog" centred, "auto" a dialog when the room * beside the anchor is less than the panel needs. */ panel?: "popover" | "dialog" | "auto"; /** Which way a popover opens; it never flips. Default "bottom"; "top" for a bar low in a tall hero or docked * at the bottom of the screen. */ panelSide?: "bottom" | "top"; /** What a popover is anchored to and as wide as. Default "field"; "bar" the whole bar. */ panelAnchor?: "field" | "bar"; /** Default "fields": each field opens on its own. "stepped": a titled panel per field whose footer walks to * the next one and ends in the submit ("Datum löschen · Abbrechen · Weiter" … "Zurück · Speichern · Suchen"; * Abbrechen restores what was chosen before the panel opened). */ flow?: "fields" | "stepped"; /** Below `collapseBelow`: "steps" (default) one trigger opening a sheet that walks the fields with one stable * Weiter/Suchen button; "scroll" the same trigger opening one scrolling sheet with every field and one submit; * "inline" no sheet, the fields stack in place. The month picker's grid or strip look is CSS. */ mobile?: SearchBarMobile; /** Default "md". */ collapseBelow?: Breakpoint; /** The rental-name combobox after the fields (desktop). */ rentalJump?: SearchBarRentalJump; /** The compact filter trigger after the fields (desktop). */ filters?: SearchBarFilters; /** Site overrides of the bar's strings. */ copy?: Partial; /** Site overrides of the pickers' shared strings (dates, guests, region, sheet). */ shared?: SharedCopyOverrides; /** On the root. */ className?: string; } /** The search bar (`search-bar` root; parts in SEARCH_BAR_PARTS). */ type SearchBarComponent = (props: SearchBarProps) => React$1.JSX.Element; /** See {@link SearchBarComponent}. */ declare const SearchBar: SearchBarComponent; //#endregion //#region src/search/useSearchForm.d.ts /** The form and its current state. */ interface SearchFormBinding { /** The current state (re-renders on every change). */ readonly state: SearchFormState; /** The store: call its actions (and `form.dates` / `form.guests` actions). */ readonly form: SearchForm; } /** One store per mount; `load(location.search)` after hydration and again on Back/Forward (`popstate`), so * the bar shows the query the page shows; a new store when the options change by value (an inline * `regions={[]}` cannot loop), so the form runs exactly the options passed, and a prop removed falls back * to its default (the store's own `update` merges a patch); the new store reads the URL again, a choice * not yet submitted is dropped; `dispose` on unmount and on replacement. Throws like `createSearchForm` on a spec error. A * native submit passes `location.search` to `form.submit` (SearchBar does), so what the page changed in * place since load rides along. */ type UseSearchForm = (options: SearchFormOptions) => SearchFormBinding; /** See {@link UseSearchForm}. */ export declare const useSearchForm: UseSearchForm; //#endregion //#region src/search/parts.d.ts /** Every part the SearchBar renders (its pickers included). */ type SearchBarParts = typeof SEARCH_BAR_PARTS; /** One SearchBar part. */ type SearchBarPart = SearchBarParts[number]; /** Every part the RentalJump renders: the root (wrapping label and input), the list, an option. */ type RentalJumpParts = typeof RENTAL_JUMP_PARTS; /** See {@link SearchBarParts}. */ export declare const SEARCH_BAR_PARTS: readonly ["search-bar", "search-form", "search-field", "search-field-label", "search-field-value", "search-field-icon", "search-submit", "search-panel", "search-panel-header", "search-panel-footer", "search-panel-action", "date-deferred-notice", "date-mode-tabs", "calendar", "calendar-day", "calendar-nights-badge", "date-flex-steps", "date-flex-step", "date-night-range", "date-flexible-stays", "date-month-strip", "date-month", "guest-row", "guest-stepper", "child-age", "ages-missing", "region-option", "region-group", "region-clear", "search-sheet-trigger", "search-sheet", "search-sheet-step", "search-sheet-footer"]; /** See {@link RentalJumpParts}. */ export declare const RENTAL_JUMP_PARTS: readonly ["rental-jump", "rental-jump-list", "rental-jump-option"]; //#endregion //#region src/results/copy.d.ts /** The strings SearchResults and PrerenderedResults render. `{token}` templates; plurals are * `xOne` / `xMany` pairs. */ interface SearchResultsCopy { /** Screen-reader text of the loading skeleton. */ loading: string; /** The periods dialog's title. */ periodsTitle: string; /** The line under it; `{name}` is the rental's name. */ periodsIntro: Template<"name">; /** A window's link ("Auswählen", never "buchen": it opens the rental, it books nothing). */ periodsChoose: string; /** The dialog's way to the rental without dates (its close button is `shared.common.close`). */ periodsOtherDates: string; /** Above the list when every result of an exact search is an alternative. */ alternativesNotice: string; /** The heading of the alternatives section (`alternatives.placement: "section"`). */ alternativesSection: string; /** The section's intro when some rentals are free on the searched dates. */ alternativesSectionSome: string; /** The section's intro when none is. */ alternativesSectionAll: string; /** The render window's button; `{count}` cards are not rendered yet. */ loadMore: Template<"count">; /** The failed search's heading. */ errorTitle: string; /** The line under it (the retry button is `shared.common.retry`). */ errorBody: string; /** Nothing matched. */ emptyTitle: string; /** What found nothing; `{parts}` is the list of the parts below. */ emptyFor: Template<"parts">; /** Part of `{parts}`: one guest. */ partGuestOne: string; /** Part of `{parts}`: `{count}` guests. */ partGuestMany: Template<"count">; /** Part of `{parts}`: the period. */ partDates: string; /** Part of `{parts}`: a dog. */ partPets: string; /** Part of `{parts}`: one filter. */ partFilterOne: string; /** Part of `{parts}`: `{count}` filters. */ partFilterMany: Template<"count">; /** What usually helps. */ emptyHint: string; /** Relaxation: the same search without its filters. */ relaxFilters: string; /** Relaxation: without the dog. */ relaxPets: string; /** Relaxation: without dates. */ relaxDates: string; /** Relaxation: for `{count}` guests. */ relaxGuests: Template<"count">; /** The page without any query. */ emptyReset: string; /** Favourites page, nothing saved. */ favoritesEmptyTitle: string; /** How to save a rental. */ favoritesEmptyBody: string; /** Favourites page: the link to the search (`scope.browseHref`). */ favoritesBrowse: string; /** Favourites page: saved rentals exist, none matches the search. */ favoritesNoneMatch: string; /** Every saved rental again (the page without its query). */ favoritesReset: string; /** Offers page: nothing reduced in this period (normal for much of the year). */ offersEmptyTitle: string; /** The line under it. */ offersEmptyBody: string; /** Offers page: the link to the search (`scope.browseHref`). */ offersBrowse: string; /** A fixed set (theme, category, landing page) matched nothing. */ idsEmpty: string; /** The map moved every result out of view. */ viewportEmpty: string; } /** The default copy, German and English with German voice overlays. */ type SearchResultsCopyTable = CopyTable; /** See {@link SearchResultsCopyTable}. */ export declare const DEFAULT_SEARCH_RESULTS_COPY: SearchResultsCopyTable; //#endregion //#region src/results/SearchCount.d.ts /** Props of SearchCount. */ interface SearchCountProps { /** The page's store. Default "search". */ storeKey?: string; /** Default "de-DE". */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** The element: "p" (default); "h1"/"h2" when the count IS the page heading; "span" inside a * heading the page writes ("{count} Ferienwohnungen in …"). */ as?: "p" | "h1" | "h2" | "span"; /** e.g. `countMany: "{count} Ferienwohnungen"` on a landing page. */ copy?: Partial; /** On the root (`search-count`). */ className?: string; } /** The count's words. */ interface SearchCountCopy { /** `{count}` = 1. */ countOne: Template<"count">; /** `{count}` ≠ 1. */ countMany: Template<"count">; /** Appended on a favourites page. */ favoritesSuffix: string; /** Appended on an offers page. */ offersSuffix: string; /** Screen-reader text of the skeleton. */ loading: string; } /** The count's default copy. */ type SearchCountCopyTable = CopyTable; /** The count, or null on an error or empty outcome. Server-renders the skeleton. */ type SearchCountComponent = (props: SearchCountProps) => React$1.JSX.Element | null; /** See {@link SearchCountCopyTable}. */ export declare const DEFAULT_SEARCH_COUNT_COPY: SearchCountCopyTable; export declare const SearchCount: SearchCountComponent; //#endregion //#region src/results/SearchFilterChips.d.ts /** Props of SearchFilterChips. */ interface SearchFilterChipsProps { /** The page's store. Default "search". */ storeKey?: string; /** Default "de-DE". */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** e.g. `facetChip: "Ort: {value}"`, `petsOne: "Hund willkommen"`. */ copy?: Partial; /** On the root (`search-filter-chips`). */ className?: string; } /** The chips' words (shared with SearchQuickFilters). */ interface SearchFilterChipsCopy { /** The chip group's accessible name. */ chipsLabel: string; /** A minimum: `{count}`, `{label}`. */ minimumChip: Template<"count" | "label">; /** One facet value: `{label}` (the facet), `{value}` (the option). */ facetChip: Template<"label" | "value">; /** An implicit `?region=` scope (no curated region facet): `{value}`, the URL value verbatim. */ regionChip: Template<"value">; /** An implicit `?property=` scope (no curated property facet): `{value}`, the property id as the * URL carries it (curate a hidden `property` facet to chip its name). */ propertyChip: Template<"value">; /** Dogs, one (dog-specific, never "Haustiere": the filter is a dog filter). */ petsOne: string; /** Dogs, `{count}` > 1 (a bare "Hunde willkommen" would under-report a 3-dog search). */ petsMany: Template<"count">; /** A chip's remove action; `{label}` is the chip's text. */ remove: Template<"label">; /** Removes every filter. */ clearAll: string; } /** The chips' default copy. */ type SearchFilterChipsCopyTable = CopyTable; /** The chip row over the page's store, or null without applied filters. */ type SearchFilterChipsComponent = (props: SearchFilterChipsProps) => React$1.JSX.Element | null; /** See {@link SearchFilterChipsCopyTable}. */ export declare const DEFAULT_SEARCH_FILTER_CHIPS_COPY: SearchFilterChipsCopyTable; export declare const SearchFilterChips: SearchFilterChipsComponent; //#endregion //#region src/results/SearchSort.d.ts /** Props of SearchSort. */ interface SearchSortProps { /** The page's store. Default "search". */ storeKey?: string; /** Default "de-DE". */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** The orderings offered, in order (the same list as SearchResults `sortOptions`). Default * DEFAULT_SORT_OPTIONS. A sort in the URL that the list does not offer is still honoured and * shown, so the control never claims an order the list is not in. */ sortOptions?: readonly SortKey[]; /** Overrides, e.g. `sortTrigger: "Sortieren"` as the label while the default order is on. */ copy?: Partial; /** On the root (`search-sort`). */ className?: string; } /** The control's words: one label per SortKey (flat: copy values are strings). */ interface SearchSortCopy { /** The trigger's text while the default order is on. */ sortTrigger: string; /** The control's accessible name. */ sortLabel: string; /** "recommended": the backend's order. */ sortRecommended: string; /** "price-asc". */ sortPriceAsc: string; /** "price-desc". */ sortPriceDesc: string; /** "rating" (from the build's facts). */ sortRating: string; /** "area-desc". */ sortAreaDesc: string; /** "area-asc". */ sortAreaAsc: string; /** "guests". */ sortGuests: string; /** "bedrooms". */ sortBedrooms: string; /** "random" (seeded once per page view). */ sortRandom: string; } /** The control's default copy. */ type SearchSortCopyTable = CopyTable; /** The sort control, or null while it has nothing to offer. */ type SearchSortComponent = (props: SearchSortProps) => React$1.JSX.Element | null; /** See {@link SearchSortCopyTable}. */ export declare const DEFAULT_SEARCH_SORT_COPY: SearchSortCopyTable; export declare const SearchSort: SearchSortComponent; //#endregion //#region src/results/TrailingTile.d.ts /** How the `trailingTile` slot behaves. When `link` is set, every `[data-trailing-href]` anchor inside * the tile gets `href = externalSearchHref(link, search, contract)` on each search change (the partner * sees the guest's dates and party); without `link` the tile renders verbatim. */ interface TrailingTileOptions { /** The partner search its `[data-trailing-href]` anchors carry. */ link?: ExternalSearchLink; /** Also render it, centred, on the empty outcome. Default true. */ showOnEmpty?: boolean; } //#endregion //#region src/results/SearchResults.d.ts /** How non-exact results present (only an exact start+end search has "alternatives": on a window * or flexible search they ARE the answer). */ interface AlternativesOptions { /** "chooser" (default): a card with several windows opens one dialog listing every window * with its price ("Auswählen"); one window is a direct link. "first": only the best window. */ periods?: "first" | "chooser"; /** "inline" (default): alternatives in the grid with the card's badge. "section": a divided * section with its own heading after the exact matches, no badge. */ placement?: "inline" | "section"; /** The notice above the list when every result is an alternative ("inline"). Default true. */ notice?: boolean; } /** The render window: every result is in memory, only the DOM is windowed. */ interface PagingOptions { /** Cards per step. Default 24 (a multiple of 1, 2, 3 and 4 columns). */ size?: number; /** "scroll" (default): the next step renders a viewport ahead, with a visible "load more" * button as the fallback (reader modes, keyboard jumps). "button": the button only. */ more?: "scroll" | "button"; } /** A header part's own options: its props without what SearchResults supplies (store, locale, voice). */ type HeaderPart

= Omit; /** Which built-in parts render above the list, and how. Each is `true` (default: the part with its own * defaults), its options (the same props it takes standalone: `copy`, `panel`, …) or `false`; a page that * places a part elsewhere turns it off and mounts SearchCount, SearchSort, SearchFilters or * SearchFilterChips itself. */ interface HeaderOptions { /** SearchCount (with the page's scope suffix). */ count?: boolean | HeaderPart; /** SearchSort over `sortOptions`. */ sort?: boolean | Omit, "sortOptions">; /** The SearchFilters trigger (only with `filters`): panel "pills", counts false, whenEmpty "disable". */ filters?: boolean | HeaderPart; /** SearchFilterChips (only with `filters`). */ chips?: boolean | HeaderPart; } /** The empty state's ways out. */ interface EmptyOptions { /** One link per cause ("without filters", "without dog", "without dates", "for 2 guests"). * Default true. */ relaxations?: boolean; /** The site's own routes out (an enquiry page, a phone, a mail), under the relaxations. No * default: every value is somebody's real contact. */ actions?: readonly ContactLink[]; } /** Props of SearchResults. */ interface SearchResultsProps { /** The SDK setup (src/data/sdk.ts); the page shares one instance per setup. */ sdk: SdkSetup; /** Default "de-DE". */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** The store's name on the page; satellites use the same. Default "search". */ storeKey?: string; /** The site's ONE search contract (backend, `nightRangeSearch`, `aliases`): the same object * SearchBar and OfferCampaignFilter take. Required. */ contract: SearchContract; /** Required route template ({slug} | {id}) for rentals the facts give no href. */ rentalHref: RouteTemplate; /** The resolved curation (`resolveFilters` at build). Absent: no filter UI, and only period and * occupancy reach the SDK. */ filters?: ResolvedFilters; /** Build-time facts by rental id, or the URL of a JSON file holding them. */ facts?: RentalFactsMap | { url: string; }; /** Never list a rental the facts do not know. Default false. */ requireFacts?: boolean; /** The page's narrowing; with `favorites` or `offers`, `browseHref` is the search their empty * states link to. */ scope?: SearchScope & { browseHref?: string; }; /** Binds the hearts and the favourites scope; keep the existing `-merkliste` key. */ favoritesKey?: string; /** Query applied when the URL carries none (a landing page). */ preset?: string; /** Orderings offered, in order. Default DEFAULT_SORT_OPTIONS; any known URL value is honoured. */ sortOptions?: readonly SortKey[]; /** The site's one CARD object. */ card?: RentalCardOptions; /** `sizes` of the card photos, from the page's geometry. Default "(min-width: 48rem) 50vw, 100vw". */ imageSizes?: string; /** How non-exact results present (exact-date searches). */ alternatives?: AlternativesOptions; /** Default { size: 24, more: "scroll" }; false renders every card. */ paging?: PagingOptions | false; /** "complete" (default): nothing shows until every page is in. "first-page": the first page * shows at once; the count and the outcome wait for the rest. */ reveal?: "complete" | "first-page"; /** Default every part on; false renders no header. */ header?: HeaderOptions | false; /** The empty state's ways out. */ empty?: EmptyOptions; /** "in-place" (default): filters, chips and ways out update the URL (push) and the list without * a page load. "navigate": they load the new URL (pages whose static parts read it at load). */ applyMode?: "in-place" | "navigate"; /** The page server-rendered PrerenderedResults beside this island: it stays while the search * runs, goes in the frame the results paint, and its order is kept on the bare URL. Default false. */ prerendered?: boolean; /** The mode the page's SDK runs in, passed to `useSdk` and the store alike: "all-rentals-at-once" * (≤ 100 rentals priced in one call) or "default". Default "default". */ sdkMode?: SdkMode; /** Overrides of the results' words (the header parts take theirs in `header`). */ copy?: Partial; /** Overrides of the cards' shared words. */ shared?: SharedCopyOverrides; /** Slot (an Astro named slot, static HTML): a site tile after the last card (a partner portal, an * enquiry tile); not counted, no data-result-card. */ trailingTile?: React$1.ReactNode; /** How `trailingTile` behaves: its partner links, and whether it shows on the empty state. */ trailing?: TrailingTileOptions; /** On the root (`search-results`). */ className?: string; } /** The results surface. Server-renders its skeleton; searches after hydration. */ type SearchResultsComponent = (props: SearchResultsProps) => React$1.JSX.Element; declare const SearchResults: SearchResultsComponent; //#endregion //#region src/results/SearchQuickFilters.d.ts /** Props of SearchQuickFilters. */ interface SearchQuickFiltersProps { /** The page's store. Default "search". */ storeKey?: string; /** Default "de-DE". */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** The shortlist, strip order; booleans of the page's resolved filters only (a one-tap chip * cannot state a minimum). Keys the filters do not resolve drop out. */ keys: readonly string[]; /** "mobile" (default): below md only. "always": at every width (the strip is the only filter UI). */ at?: "mobile" | "always"; /** Prepend applied filters that have no slot. Default true; false only where a chip row on the * same screen already shows every applied filter. */ prependActive?: boolean; /** Offer the dogs chip as the strip's first slot. Default false (offer it only where the * portfolio takes dogs); an active dog search always shows. */ pets?: boolean; /** The chip words (shared with SearchFilterChips). */ copy?: Partial; /** On the root (`search-quick-filters`). */ className?: string; } /** The strip, or null before the store exists and without anything to show. */ type SearchQuickFiltersComponent = (props: SearchQuickFiltersProps) => React$1.JSX.Element | null; export declare const SearchQuickFilters: SearchQuickFiltersComponent; //#endregion //#region src/results/OfferCampaignFilter.d.ts /** Props of OfferCampaignFilter. */ interface OfferCampaignFilterProps { /** The page's store. Default "search". */ storeKey?: string; /** Default "de-DE"; also the language of the periods. */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** `findOfferWindows` at build; [] leaves only the campaigns of the loaded results. */ windows: readonly OfferWindow[]; /** The offers page route the links carry. */ action: string; /** The site's ONE search contract (the object SearchResults and SearchBar take). */ contract: SearchContract; /** Overrides of the row's words. */ copy?: Partial; /** On the root (`offer-campaigns`). */ className?: string; } /** The row's words. */ interface OfferCampaignFilterCopy { /** The word before the row ("Angebot:"). */ legend: string; /** The chip group's accessible name. */ ariaLabel: string; /** A link chip's whole text (also its accessible name): `{campaign}`, `{period}`. */ periodTemplate: Template<"campaign" | "period">; /** Announced after a guest picks a campaign: `{label}`, `{count}` (listed rentals). */ announceSelected: Template<"count" | "label">; /** Announced after a guest clears it: `{count}`. */ announceCleared: Template<"count">; } /** The row's default copy. */ type OfferCampaignFilterCopyTable = CopyTable; /** The campaign row over the page's store; nothing while loading or without a campaign. */ type OfferCampaignFilterComponent = (props: OfferCampaignFilterProps) => React$1.JSX.Element | null; /** See {@link OfferCampaignFilterCopyTable}. */ export declare const DEFAULT_OFFER_CAMPAIGN_FILTER_COPY: OfferCampaignFilterCopyTable; export declare const OfferCampaignFilter: OfferCampaignFilterComponent; //#endregion //#region src/results/PrerenderedResults.d.ts /** Props of PrerenderedResults. */ interface PrerenderedResultsProps { /** `catalogueResultItem(…)` over the catalogue, in `compareUndatedSearchOrder` or the page's * own order (the island keeps it on the bare URL). */ items: readonly SearchResultItem[]; /** Default "de-DE". */ locale?: Locale$1; /** Default "neutral". */ voice?: Voice; /** The site's one CARD object (the island's). */ card?: RentalCardOptions; /** The island's facts. */ facts?: RentalFactsMap; /** The island's `imageSizes`. */ imageSizes?: string; /** Slot: the same tile as the island's `trailingTile`; its links render without search values (the * island fills them once it replaces this listing). */ trailingTile?: React.ReactNode; /** The island's copy, accepted so a page passes one object to both; the listing renders no * words of its own (the cards' come from `shared`). */ copy?: Partial; /** The cards' shared copy, as on the island. */ shared?: SharedCopyOverrides; /** On the `[data-prerendered-results]` wrapper. */ className?: string; } /** Server-only, no hooks; the same card markup as the island. */ type PrerenderedResultsComponent = (props: PrerenderedResultsProps) => React.JSX.Element; export declare const PrerenderedResults: PrerenderedResultsComponent; //#endregion //#region src/results/useSearchStore.d.ts /** The store's name when a page does not choose one; SearchResults and every satellite default to it. * A site's own `acquireSearchStore` (headless) passes it so the package satellites attach. */ export declare const DEFAULT_STORE_KEY = "search"; /** What the binding hands a component once the store exists. */ interface SearchStoreBinding { /** The current snapshot (re-rendered on every change). */ readonly state: SearchState; /** The actions (setSearch, setSort, applyFilters, …). */ readonly store: SearchStore; } /** The store under `key` (default "search") and its state; null until a SearchResults (or a * site's own `acquireSearchStore`) on the page has created it, and on the server. Never creates * a store and never searches by itself. */ type UseSearchStore = (key?: string) => SearchStoreBinding | null; export declare const useSearchStore: UseSearchStore; //#endregion //#region src/results/browserHistory.d.ts /** The page URL's query: `read` is `location.search`, `write` is `pushState` ("push": Back undoes * the guest's choice) or `replaceState` ("replace": a sort, a sanitised query, a preset; the * router's history state is kept), `subscribe` follows Back/Forward (`popstate`). The path and * the hash stay as they are. */ type BrowserHistory = () => HistoryPort; export declare const browserHistory: BrowserHistory; //#endregion //#region src/results/parts.d.ts /** The results' parts, in reading order of the page. */ type SearchResultsParts = typeof SEARCH_RESULTS_PARTS; /** One results part. */ type SearchResultsPart = SearchResultsParts[number]; /** See {@link SearchResultsParts}. State rides on attributes, never on the part name: * `data-search-scope` and `data-state` on the root, `data-search-outcome` + `data-outcome-scope` * on the outcome, `data-kind` on outcome links ("relaxation" | "reset" | "browse"), filter options * and chips, `data-selected` / `aria-pressed` on toggles, `data-busy` on the grid. */ export declare const SEARCH_RESULTS_PARTS: readonly ["search-results", "search-results-header", "search-count", "search-sort", "search-filters-trigger", "search-filters-badge", "search-filters-panel", "search-filters-group", "search-filters-group-title", "search-filters-option", "search-filters-minimum", "search-filters-reset", "search-filters-apply", "search-filter-chips", "search-filter-chip", "search-filter-chips-clear", "search-quick-filters", "search-quick-filter", "search-alternatives-notice", "search-alternatives-section", "search-alternatives-heading", "search-alternatives-intro", "search-results-grid", "search-skeleton", "search-load-more", "search-results-trailing", "search-viewport-empty", "search-outcome", "search-outcome-title", "search-outcome-body", "search-outcome-relaxations", "search-outcome-link", "search-outcome-actions", "search-outcome-action", "search-outcome-retry", "search-periods-dialog", "search-periods-intro", "search-period-row", "search-period-price", "search-period-choose", "search-periods-other", "offer-campaigns", "offer-campaigns-legend", "offer-campaign"]; //#endregion //#region src/showcase/Showcase.d.ts /** The showcase's own strings (the cards read SharedCopy.card). */ interface ShowcaseCopy { /** The accessible name of the group switch. */ groupsLabel: string; /** The row's arrows. */ prev: string; /** The carousel's next button ("Nächste Unterkünfte"). */ next: string; /** The trailing tile of a row without its own href (links `moreHref`); `{label}` = the row's label. */ moreAll: Template<"count" | "label">; /** The trailing tile of a scoped row (its own href); `{count}` = the row's total, `{label}` = the * row's label ("Alle {count} {label} ansehen"). */ moreCount: Template<"count" | "label">; } /** The type of `DEFAULT_SHOWCASE_COPY` (declared below): German (neutral) and English. */ type ShowcaseCopyTable = CopyTable; /** One showcase. Every prop is serializable (islands). */ interface ShowcaseProps { /** Default "de-DE"; decides the default copy of the showcase and its cards. */ locale?: Locale; /** German address. Default "neutral". */ voice?: Voice; /** From buildShowcaseGroups / selectRentals at build. One group: no tabs; none: renders nothing * (the site's editorial frame hides itself with the same `groups.length` check). A group's * `blurb` renders in `showcase-blurb` under the tabs while that group shows. */ groups: readonly ShowcaseGroup[]; /** "carousel" (default) or "grid". */ layout?: "carousel" | "grid"; /** With layout "grid": below this width the carousel shows, from it the grid. Absent: the grid * at every width. */ gridFrom?: Breakpoint; /** Grid columns at the widest step (1 / 2 / columns). Default 3. */ columns?: 2 | 3 | 4; /** Carousel arrows above the row (default), below it, or none. */ arrows?: "top" | "bottom" | "none"; /** The carousel wraps at both ends. Default false. */ loop?: boolean; /** A trailing tile to the group's href (else `moreHref`) with its total. Default false; no tile * without an href. */ moreTile?: boolean; /** Where an unscoped row's tile links. No default (routes are the site's). */ moreHref?: string; /** Per group id, the tile's text instead of `copy.moreCount` / `copy.moreAll` for that row, with * the same `{count}` and `{label}` (`{ dogs: "{count} Unterkünfte für Sie und Ihren Hund" }`). * Default none. */ moreLabels?: Readonly>>; /** Fair rotation: `visible` tiles per row, a new window every `minutes`; every tile stays in the * markup (hidden). Needs the island (a client directive). Default false (off). */ rotate?: { visible: number; minutes: number; } | false; /** The site's one card object (the same SearchResults takes). */ card?: RentalCardOptions; /** `sizes` of the card photos: must follow `--showcase-item-width` or the grid column. Default * the card's, "(min-width: 37rem) 30rem, 82vw" (the default carousel item). */ imageSizes?: string; /** Binds the hearts to the site's Merkliste once hydrated; absent = the layout's enhance() * binder (`favoritesStorageKey(namespace)`, the same key everywhere). */ favoritesKey?: string; /** Site overrides of the showcase's strings. */ copy?: Partial; /** Overrides of the card strings (SharedCopy.card, SharedCopy.rental). */ shared?: SharedCopyOverrides; /** On the root (`showcase`). */ className?: string; } /** The type of `SHOWCASE_PARTS` (declared below), a flat array (the vocabularies grouped per block or * step, RENTAL_DETAIL_PARTS and BOOKING_PARTS, are objects keyed by name). The row itself carries * the headless strip parts (`strip`, `strip-track`, `strip-prev`, `strip-next`), the cards * RENTAL_CARD_PARTS. State: `data-layout`, `data-grid-from`, `data-columns`, `data-arrows` on the * root, `aria-pressed` on a tab, `hidden` on a rotated-out item and on the rows of the other * groups. */ type ShowcaseParts = typeof SHOWCASE_PARTS; type ShowcaseComponent = (props: ShowcaseProps) => React$1.JSX.Element | null; export declare const SHOWCASE_PARTS: readonly ["showcase", "showcase-tabs", "showcase-tab", "showcase-blurb", "showcase-item", "showcase-more"]; export declare const DEFAULT_SHOWCASE_COPY: ShowcaseCopyTable; /** See {@link ShowcaseComponent}. */ declare const Showcase: ShowcaseComponent; //#endregion //#region src/rental/block.d.ts /** Props every rental block takes. */ interface RentalBlockProps { /** The model from `adaptRental` / `loadRentalCatalogue`. */ rental: RentalDetail; /** SDK locale; decides the default copy and number formats. Default "de-DE". */ locale?: Locale; /** How German copy addresses the reader. Default "neutral". */ voice?: Voice; /** Overrides of SharedCopy (the rental group: distance labels, "Hunde willkommen", review counts). */ shared?: SharedCopyOverrides; /** Extra class on the block's root. */ className?: string; } //#endregion //#region src/rental/RentalHeading.d.ts /** The eyebrow templates; `copy` overrides them per site ("{type} auf {town}"). */ interface RentalHeadingCopy { /** The eyebrow with the feed's rental type: `{type}` and `{town}`. */ typeAndTown: Template<"town" | "type">; /** The eyebrow with the town alone: `{town}`. */ townOnly: Template<"town">; } /** The type of `DEFAULT_RENTAL_HEADING_COPY` (declared below). */ type RentalHeadingCopyTable = CopyTable; /** The eyebrow, the required address decision and the heading level. */ interface RentalHeadingProps extends RentalBlockProps { /** The line above the name: "type-and-town" (default; the town alone when the feed states no * type, the type alone when it states no town), "town", "town-with-pin" (with a location * glyph), "none". */ eyebrow?: "type-and-town" | "town" | "town-with-pin" | "none"; /** A site-composed eyebrow (a floor, an object number); overrides `eyebrow`. */ eyebrowText?: string; /** REQUIRED, no default (throws at render, like RentalMap): the address line under the name. * Pass the site's one ADDRESS constant (the same as RentalMap's), or "none" for no address line. * "street" without a stated street prints the town. */ address: RentalAddressMode | "none"; /** h1 (default) or h2 where the page already has its h1. */ headingLevel?: 1 | 2; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Server-renderable, no hooks. Throws headless `RentalAddressModeError` when `address` is missing or * not a mode (the build fails instead of a page publishing a decision nobody made), like RentalMap. */ type RentalHeadingComponent = (props: RentalHeadingProps) => React$1.JSX.Element; export declare const DEFAULT_RENTAL_HEADING_COPY: RentalHeadingCopyTable; /** See {@link RentalHeadingComponent}. */ export declare const RentalHeading: RentalHeadingComponent; //#endregion //#region src/rental/RatingBadge.d.ts /** The badge's strings (the review count reads SharedCopy.rental). */ interface RatingBadgeCopy { /** The visible figure: `{score}` (a site may write "{score}/5"). */ score: Template<"score">; /** The accessible statement of the score: `{score}` of `{scale}`. */ label: Template<"scale" | "score">; } /** The type of `DEFAULT_RATING_BADGE_COPY` (declared below). */ type RatingBadgeCopyTable = CopyTable; /** One part of a guest rating a badge can state: the score, the PMS's own grade, the review count. The * same vocabulary on RatingBadge `show` and RentalFactList `rating`. */ type RatingPart = "score" | "grade" | "count"; /** A review summary and what of it the badge states. Not a block: it takes the summary, not the rental. */ interface RatingBadgeProps { /** The PMS aggregate (`rental.reviews.summary`). */ summary: ReviewSummary; /** Default "de-DE"; decides number formats and the default copy. */ locale?: Locale; /** German address. Default "neutral". */ voice?: Voice; /** What the badge states, in this order. Default ["score", "count"]; "grade" adds the PMS's grade * (only where the feed states one). */ show?: readonly RatingPart[]; /** A link (the reviews section); absent: a plain chip. */ href?: string; /** Site overrides of the badge's strings. */ copy?: Partial; /** Overrides of SharedCopy.rental (the review count wording). */ shared?: SharedCopyOverrides; /** Extra class on the badge. */ className?: string; } /** Server-renderable, no hooks. */ type RatingBadgeComponent = (props: RatingBadgeProps) => React$1.JSX.Element; export declare const DEFAULT_RATING_BADGE_COPY: RatingBadgeCopyTable; /** See {@link RatingBadgeComponent}. */ export declare const RatingBadge: RatingBadgeComponent; //#endregion //#region src/rental/RentalFactList.d.ts /** One fact. "type" is the feed's rental type verbatim; "pets" is the `petsAllowed` flag in * dog-specific words (SharedCopy.rental.pets). */ type FactKey = "type" | "guests" | "bedrooms" | "bathrooms" | "area" | "distance" | "pets"; /** A site-derived fact (an owner-created custom attribute): its label verbatim and, optionally, the * glyph it draws instead of the check (`"pin"` for which beach, `"jetty"` for a view of ships). */ interface ExtraFact { /** The fact's text, verbatim. */ label: string; /** A glyph of the vocabulary (headless `Glyph`). Default "check". */ glyph?: Glyph; } /** The fact list's strings (distance and dog wording are SharedCopy.rental). */ interface RentalFactListCopy { /** `{count}`, singular and plural. German bathrooms stay "Badezimmer" in both (the fact-check * gate matches `^(\d+) Badezimmer$`). */ guestOne: Template<"count">; /** Default "{count} Gäste". */ guestMany: Template<"count">; /** Default "{count} Schlafzimmer". */ bedroomOne: Template<"count">; /** Default "{count} Schlafzimmer". */ bedroomMany: Template<"count">; /** Default "{count} Badezimmer". */ bathroomOne: Template<"count">; /** Default "{count} Badezimmer". */ bathroomMany: Template<"count">; /** `{count}` m². */ area: Template<"count">; /** The list's accessible name. */ listLabel: string; } /** The type of `DEFAULT_RENTAL_FACT_LIST_COPY` (declared below). */ type RentalFactListCopyTable = CopyTable; /** Which facts in which order, how they draw, and the optional rating chip. */ interface RentalFactListProps extends RentalBlockProps { /** Which facts, in this order. Default ["guests", "bedrooms", "area", "bathrooms", "distance", * "pets"]. An "extra" entry places `extraFacts` there (e.g. between "distance" and "pets"); * without one they follow the listed facts. */ facts?: readonly (FactKey | "extra")[]; /** How the row draws: "pills" (default), "counters" (glyph and figure between hairlines) or * "inline" (one text line, middot-separated; no glyphs, whatever `glyphs` says). */ layout?: "pills" | "counters" | "inline"; /** A glyph before each fact: "none", "default" (users, bed, bath, ruler, the distance kind's, paw, * house; an extra fact's own glyph, else a check; default) or "mapped" (`glyphMap` over the * defaults). */ glyphs?: GlyphMode; /** Per-fact glyph overrides for "mapped". */ glyphMap?: Partial>; /** Kinds the distance fact may state, by priority (never the nearest). Default WATER_KINDS; * [] = no distance fact. */ distanceKinds?: readonly DistanceKind[]; /** Site-derived facts (owner-created custom attributes): a label, verbatim, or an `ExtraFact` with * its glyph. Placed where `facts` lists "extra", else after the listed facts. */ extraFacts?: readonly (string | ExtraFact)[]; /** A rating chip at the end stating these parts, in order (RatingBadge `show`), e.g. ["score", * "count"] or ["score", "grade", "count"]; "none" (default) draws none. */ rating?: readonly RatingPart[] | "none"; /** Where the rating chip links. Default "#reviews". */ ratingHref?: string; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null when the rental states none of the listed facts. Server-rendered, no hooks. Each item is a * `rental-fact` with `data-kind`: its `FactKey`, "extra" for an extra fact, "rating" for the * rating chip. */ type RentalFactListComponent = (props: RentalFactListProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_FACT_LIST_COPY: RentalFactListCopyTable; /** See {@link RentalFactListComponent}. */ export declare const RentalFactList: RentalFactListComponent; //#endregion //#region src/rental/RentalActions.d.ts /** One action. "rating" self-hides without a review summary. */ type ActionKey = "rating" | "map" | "favorite" | "share"; /** The row's strings (the overlay buttons of RentalGallery read the same table). */ interface RentalActionsCopy { /** The heart's visible label, unsaved and saved. */ save: string; /** Default "Gemerkt". */ saved: string; /** The heart's accessible name (`{name}`), and the saved heart's tooltip. */ saveLabel: Template<"name">; /** Default "{name} von der Merkliste entfernen". */ removeLabel: Template<"name">; /** The share button, and its confirmation after a copy. */ share: string; /** Default "Link kopiert". */ shared: string; /** The map link. */ map: string; } /** The type of `DEFAULT_RENTAL_ACTIONS_COPY` (declared below). */ type RentalActionsCopyTable = CopyTable; /** Which actions, in which order and look, and where they point. */ interface RentalActionsProps extends RentalBlockProps { /** Which actions, in this order. Default ["rating", "favorite", "share"]. */ items?: readonly ActionKey[]; /** "bar": the rating left, the actions right, full width (default); "pills": labelled pills in a * row; "icons": icon buttons (labels kept for screen readers), for a place over a photo. */ layout?: "bar" | "pills" | "icons"; /** Canonical origin of the shared link (the site's configured origin). Default: the page's. */ shareOrigin?: string; /** Where the rating links. Default "#reviews". */ ratingHref?: string; /** Where the map link points. Default "#map". */ mapHref?: string; /** The Merkliste key (`favoritesStorageKey(namespace)`) for an island; absent = the layout's * enhance() binder paints the heart. */ favoritesKey?: string; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null when no listed action renders. Server-renderable. */ type RentalActionsComponent = (props: RentalActionsProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_ACTIONS_COPY: RentalActionsCopyTable; /** See {@link RentalActionsComponent}. */ export declare const RentalActions: RentalActionsComponent; //#endregion //#region src/rental/RentalGallery.d.ts /** The gallery's strings; `copy` overrides them per site (shallow, over the locale's table). */ interface RentalGalleryCopy { /** The mosaic's last tile: `{count}` photos. */ showAll: Template<"count">; /** A mosaic tile's accessible name: `{count}` photos. */ openGallery: Template<"count">; /** A strip or grid photo's accessible name: photo `{n}` of `{count}`. */ openPhoto: Template<"count" | "n">; /** Default "Vorheriges Bild". */ previous: string; /** Default "Nächstes Bild". */ next: string; /** The grid's and the viewer's title: `{name}` is the rental's. */ gridTitle: Template<"name">; /** The floor-plan button and dialog, one or several. */ floorplanOne: string; /** Default "Grundrisse". */ floorplanMany: string; /** A photo with a PMS caption (`{caption}`, `{name}`), and one without (`{name}`, `{n}`). */ imageAlt: Template<"caption" | "name">; /** Default "{name}, Bild {n}". */ imageAltFallback: Template<"n" | "name">; /** The swipe strip's position for screen readers (`{count}`, `{current}`; repainted by the engine). */ stripLabel: Template<"count" | "current">; /** The visible position pill (`{current} / {count}`). */ counter: Template<"count" | "current">; } /** The type of `DEFAULT_RENTAL_GALLERY_COPY` (declared below). */ type RentalGalleryCopyTable = CopyTable; /** A pre-load box: the shape the feed mostly delivers, so a lazy image keeps its frame before its bytes. */ interface ImageBox { /** Pixels. */ width: number; /** Pixels. */ height: number; } /** Where a `sizes` value applies. */ type GallerySurface = "strip" | "cover" | "tile" | "grid" | "viewer" | "floorplan"; /** The mosaic, what it opens, the viewer, the floor plans and the overlay buttons. */ interface RentalGalleryProps extends RentalBlockProps { /** The mosaic: the cover beside a 2×2 of four photos (default) or beside two stacked ones. */ mosaic?: "cover+4" | "cover+2"; /** The width from which the mosaic replaces the swipe strip. Default "xl" (a tablet swipes). */ mosaicFrom?: Breakpoint; /** What a mosaic tile opens: the all-photos grid, then the viewer from a photo there (default); or * the viewer straight away. */ browse?: "grid" | "viewer"; /** The surface behind the fullscreen viewer. Default "dark". */ viewerTone?: "dark" | "light"; /** Floor plans: their own button and dialog, paged when several (default); or also at the end of * the viewer, after the photos. */ floorplans?: "separate" | "viewer-tail"; /** Save and share over the photos, for the widths where no RentalActions shows them — never at a * width where both would: "none" (default), "always", or `{ below }` a breakpoint. Their words are * RentalActions' default copy. */ overlayActions?: "none" | "always" | { readonly below: Breakpoint; }; /** Canonical origin of the overlay's shared link. Default: the page's. */ shareOrigin?: string; /** The Merkliste key for the overlay's heart in an island; absent = the layout binder paints it. */ favoritesKey?: string; /** The viewer image's pre-load box. Default 1440 × 1080. */ viewerBox?: ImageBox; /** The floor plan's pre-load box. Default `viewerBox`. */ floorplanBox?: ImageBox; /** `sizes` per surface, for a container whose width differs from the default geometry (a full-width * gallery). */ sizes?: Partial>; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null for a rental without photos. The first photo is fetched once: the strip's and the cover's * copies are ``s whose other-width source is a 1×1 data URI. Grid, viewer and floor-plan * photos are lazy (a hidden lazy image is not fetched). The dialog ids (`gallery`, `gallery-viewer`, * `floorplan`) are the URL hashes while open: one gallery per page. */ type RentalGalleryComponent = (props: RentalGalleryProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_GALLERY_COPY: RentalGalleryCopyTable; /** See {@link RentalGalleryComponent}. */ export declare const RentalGallery: RentalGalleryComponent; //#endregion //#region src/rental/RentalDescription.d.ts /** The block's own strings; `copy` overrides them per site (shallow, over the locale's table). */ interface RentalDescriptionCopy { /** The section heading (when `headingLevel` draws one) and the dialog's title. */ heading: string; /** The control that shows the rest, and (inline) the one that folds it again. */ more: string; /** Default "Weniger anzeigen". */ less: string; /** The dialog's accessible name: `{name}` is the rental's (its close button is `shared.common.close`). */ dialogLabel: Template<"name">; } /** The type of `DEFAULT_RENTAL_DESCRIPTION_COPY` (declared below). */ type RentalDescriptionCopyTable = CopyTable; /** Where the preview ends, where the rest is read, and the heading. */ interface RentalDescriptionProps extends RentalBlockProps { /** Where the visible part ends. Default `{ by: "sentences" }` (budget 320, never under 160). */ preview?: PreviewStrategy; /** Where the rest is read: a dialog that repeats the preview at its head (default), or in place. */ more?: "dialog" | "inline"; /** Set the first paragraph as the lead (`data-emphasise-first`; CSS sets the size). Default false. */ emphasiseFirst?: boolean; /** Show the PMS intro (the short description) above the text. Default false. */ intro?: boolean; /** The PMS headline as the heading text when the feed states one (never a placeholder); needs a * heading (`headingLevel`). Default false. */ headline?: boolean; /** Default "none": the description introduces itself. */ headingLevel?: HeadingLevel | "none"; /** The section's id (and the dialog's `-full`, its URL hash while open). Default "description". */ id?: string; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null without description text. Server-rendered; the dialog and the inline reveal are bound by the * layout's enhance() (and by the block itself once hydrated). */ type RentalDescriptionComponent = (props: RentalDescriptionProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_DESCRIPTION_COPY: RentalDescriptionCopyTable; /** See {@link RentalDescriptionComponent}. */ export declare const RentalDescription: RentalDescriptionComponent; //#endregion //#region src/rental/RentalAmenities.d.ts /** The block's own strings; `copy` overrides them per site (shallow, over the locale's table). */ interface RentalAmenitiesCopy { /** Default "Ausstattung". */ heading: string; /** The opener: `{count}` = every item of the catalogue. */ showAll: Template<"count">; /** The dialog's title and accessible name (its close button is `shared.common.close`). */ dialogTitle: string; } /** The type of `DEFAULT_RENTAL_AMENITIES_COPY` (declared below). */ type RentalAmenitiesCopyTable = CopyTable; /** What the amenity preview shows and how its rows and the dialog draw. */ interface RentalAmenitiesProps extends RentalBlockProps { /** Preview rows above the button. Each key has its default: `from` "highlights" (the ranked * highlights) or "categories" (a cross-section of the PMS categories); `count` 8, 0 = the button * only. */ preview?: { from?: "highlights" | "categories"; count?: number; }; /** Facts leading the preview when the rental states them (the water distance, "Hunde willkommen"). * Default []. */ lead?: readonly ("distance" | "pets")[]; /** A glyph before each item: "none", "default" (a check before every item; default) or "mapped" * (`AMENITY_GLYPHS` + `glyphMap` by PMS label, a check where neither names one). */ glyphs?: GlyphMode; /** A glyph on each category heading in the dialog: "none" (default) or "mapped" (where the label * map, `AMENITY_GLYPHS` + `glyphMap`, names one). */ groupGlyphs?: Exclude; /** Extra or replacing entries of the label map (PMS label → glyph). */ glyphMap?: Readonly>; /** Default 2. */ headingLevel?: HeadingLevel | "none"; /** The section's id (and the dialog's `-all`, its URL hash while open). Default "amenities". */ id?: string; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null when the rental states no amenity and no highlight. Each row, in the preview and in the * dialog, is a `rental-amenity` with `data-kind`: "highlight" (a PMS amenity label), "distance" or * "pets" (a leading fact). */ type RentalAmenitiesComponent = (props: RentalAmenitiesProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_AMENITIES_COPY: RentalAmenitiesCopyTable; /** See {@link RentalAmenitiesComponent}. */ export declare const RentalAmenities: RentalAmenitiesComponent; //#endregion //#region src/rental/glyphs.d.ts /** The type of `AMENITY_GLYPHS` (declared below): PMS amenity labels and category labels, as the * SDK writes them in de-DE and en-US, to a glyph. Used by `RentalAmenities glyphs="mapped"` and * `groupGlyphs`; extended or replaced per site through `glyphMap`. */ type AmenityGlyphs = Readonly>; /** Measured against the SDK's own label tables (Rental.attributes.*, RentalAttributes.*.label, * RentalAttributesCategory.*.label). Views share `view`: the label names the water, the glyph only * says "a view". */ export declare const AMENITY_GLYPHS: AmenityGlyphs; //#endregion //#region src/rental/RentalRooms.d.ts /** The block's own strings; `copy` overrides them per site ("{n}. {room}"). */ interface RentalRoomsCopy { /** Default "Zimmer & Räume". */ heading: string; /** A repeated room type: `{room}` and its 1-based `{n}` ("Schlafzimmer 2"). */ ordinal: Template<"n" | "room">; /** A bed with its type: `{kind}` and `{type}` ("Doppelbett (Boxspringbett)"). */ bed: Template<"kind" | "type">; /** A run of identical beds: `{count}` and `{bed}` ("2× Einzelbett"). */ bedCount: Template<"bed" | "count">; /** The heading over `extras`. */ extrasHeading: string; } /** The type of `DEFAULT_RENTAL_ROOMS_COPY` (declared below). */ type RentalRoomsCopyTable = CopyTable; /** The type of `DEFAULT_ROOM_ATTRIBUTE_SHORT` (declared below): a sample of PMS room-attribute * shortenings ("Verdunkelungsmöglichkeiten" → "Verdunkelung"), not a catalogue. */ type RoomAttributeShort = Readonly>; /** Which rooms, how beds and glyphs draw, site extras and the heading. */ interface RentalRoomsProps extends RentalBlockProps { /** Every room the feed states (default), or only the rooms with beds. */ rooms?: "all" | "with-beds"; /** Beds as one line per room (default) or as a list, each bed with its own attributes. */ beds?: "line" | "list"; /** Bed types not printed beside the kind (the PMS default type, say). Default []. */ hideBedTypes?: readonly string[]; /** A glyph per room: "none", "default" (bed, bath, sofa, kitchen, else a house — never a bed for an * unknown room; default) or "mapped" (`glyphMap` over the defaults). */ glyphs?: GlyphMode; /** Per-room-kind glyph overrides for "mapped". */ glyphMap?: Partial>; /** Further sleeping places the site derived, listed after the rooms under `extrasHeading`. */ extras?: readonly string[]; /** Room-attribute shortenings (shortens, never renames). Default `DEFAULT_ROOM_ATTRIBUTE_SHORT`; * a site's map replaces it. */ attributeShort?: RoomAttributeShort; /** Default 2; room names render one level below. */ headingLevel?: HeadingLevel | "none"; /** The section's id. Default "rooms". */ id?: string; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null when no listed room and no extra is stated. Server-rendered, no hooks. Each shown attribute * carries the gate marker `data-room-attr` with its text (the room-measuring tool counts them). */ type RentalRoomsComponent = (props: RentalRoomsProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_ROOMS_COPY: RentalRoomsCopyTable; /** The shapes are PMS conventions (": "), so another tenant is likelier to meet them * than not; an unmapped attribute shows in full. */ export declare const DEFAULT_ROOM_ATTRIBUTE_SHORT: RoomAttributeShort; /** See {@link RentalRoomsComponent}. */ export declare const RentalRooms: RentalRoomsComponent; //#endregion //#region src/rental/RentalReviews.d.ts /** The block's own strings (review counts and "Gast" are SharedCopy.rental). */ interface RentalReviewsCopy { /** The section heading: `{reviews}` ("12 Bewertungen"), `{score}`, `{scale}`. */ heading: Template<"reviews" | "score" | "scale">; /** Under the grade: `{reviews}` ("aus 12 Bewertungen"). */ from: Template<"reviews">; /** Reveals further reviews (list layouts). */ more: string; /** A long review's toggle, shown only when the text overflows its clamp. */ readMore: string; /** Default "Weniger anzeigen". */ readLess: string; } /** The type of `DEFAULT_RENTAL_REVIEWS_COPY` (declared below). */ type RentalReviewsCopyTable = CopyTable; /** The type of `DEFAULT_CRITERION_SHORT` (declared below): a sample of PMS criterion shortenings * ("Sauberkeit der Unterkunft" → "Sauberkeit"), so two-column bars keep one line. */ type CriterionShort = Readonly>; /** A part of the rating summary beside the score and the count. */ type ReviewSummaryPart = "grade" | "criteria"; /** How many reviews show, the layout, which parts of the summary, and the heading. */ interface RentalReviewsProps extends RentalBlockProps { /** Reviews shown before "more". Default 1. */ initial?: number; /** Reviews each "more" reveals. Default: all that remain. */ step?: number; /** "adaptive": a swipe row below md, a list with "more" from md (default); "carousel" at every * width; "list" at every width. */ layout?: "adaptive" | "carousel" | "list"; /** The review texts. false shows the summary only (feeds whose texts are survey answers). Default true. */ texts?: boolean; /** The summary's parts beside the score and the count: "grade" (the PMS's verbal grade) and * "criteria" (per-criterion bars; nothing when the feed states none). Default both. */ summary?: readonly ReviewSummaryPart[]; /** Lines before "Mehr anzeigen" on a long review; the toggle shows only on overflow. Default 10. */ clampLines?: number; /** Criterion shortenings (shortens, never renames). Default `DEFAULT_CRITERION_SHORT`; a site's map * replaces it. */ criterionShort?: CriterionShort; /** Default 2. */ headingLevel?: HeadingLevel | "none"; /** The section's id (the rating links point here). Default "reviews". */ id?: string; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null without a review summary. Server-rendered; the reveal, the swipe row and the clamps are bound * by the layout's enhance() (and by the block itself once hydrated). */ type RentalReviewsComponent = (props: RentalReviewsProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_REVIEWS_COPY: RentalReviewsCopyTable; /** Shortens, never renames: an unmapped criterion shows in full (long rather than missing). */ export declare const DEFAULT_CRITERION_SHORT: CriterionShort; /** See {@link RentalReviewsComponent}. */ export declare const RentalReviews: RentalReviewsComponent; //#endregion //#region src/rental/RentalProperty.d.ts /** The block's own strings; `copy` overrides them per site. */ interface RentalPropertyCopy { /** Default "Über die Anlage". */ heading: string; /** The link to the property's own page (`href`). */ link: string; } /** The type of `DEFAULT_RENTAL_PROPERTY_COPY` (declared below). */ type RentalPropertyCopyTable = CopyTable; /** Open or collapsed, the link to the property and the heading. */ interface RentalPropertyProps extends RentalBlockProps { /** Open (default) or collapsed behind its heading (a native `

`; no script). */ layout?: "open" | "collapsed"; /** The property's own page; absent = no link. */ href?: string; /** Default 2. */ headingLevel?: HeadingLevel | "none"; /** The section's id. Default "property". */ id?: string; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** Null when the rental belongs to no property or the property states no text. Server-rendered, no * hooks. */ type RentalPropertyComponent = (props: RentalPropertyProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_PROPERTY_COPY: RentalPropertyCopyTable; /** See {@link RentalPropertyComponent}. */ export declare const RentalProperty: RentalPropertyComponent; //#endregion //#region src/rental/RentalDistances.d.ts /** The block's own string (the labels and adjacency statements are SharedCopy.rental). */ interface RentalDistancesCopy { /** Default "Entfernungen". */ heading: string; } /** The type of `DEFAULT_RENTAL_DISTANCES_COPY` (declared below). */ type RentalDistancesCopyTable = CopyTable; /** Which distances in which order, the layout, the glyphs and the heading. */ interface RentalDistancesProps extends RentalBlockProps { /** Order and allowlist (a mountain site lists city, lake, ski and drops the sea). Default every * stated kind, in DistanceKind order. */ kinds?: readonly DistanceKind[]; /** "list" (a `
`, default) or "inline" (one middot row). */ layout?: "list" | "inline"; /** A glyph before each distance: none (default), the kind's own, or `glyphMap` over it. */ glyphs?: GlyphMode; /** Per-kind glyph overrides for "mapped". */ glyphMap?: Partial>; /** Default 3. */ headingLevel?: HeadingLevel | "none"; /** Site overrides of the block's strings (shallow, over the locale's table and voice). */ copy?: Partial; } /** A `
` of `rental.distances`: label `SharedCopy.rental.distance`, value in m or km; * below ADJACENT_BELOW_M the adjacency statement `SharedCopy.rental.adjacent` ("Direkt am * Strand", "Zentrale Lage") stands alone. Renders nothing when no listed kind is stated. */ type RentalDistancesComponent = (props: RentalDistancesProps) => React$1.JSX.Element | null; export declare const DEFAULT_RENTAL_DISTANCES_COPY: RentalDistancesCopyTable; /** See {@link RentalDistancesComponent}. */ export declare const RentalDistances: RentalDistancesComponent; //#endregion //#region src/rental/parts.d.ts /** The type of `RENTAL_DETAIL_PARTS` (declared below), by block: * - dialog chrome shared by the blocks' layers: `rental-layer-header`, `rental-layer-title`; * - RentalHeading: `rental-heading`, `rental-eyebrow`, `rental-title`, `rental-address`; * - RentalFactList: `rental-facts`, `rental-fact`; * - RentalActions: `rental-actions`, `rental-action` (the map link), `rental-action-label`; * - RatingBadge: `rating-badge`, `rating-badge-score`, `rating-badge-grade`, `rating-badge-count`; * - RentalGallery (beside the engine's parts): `rental-gallery-mosaic`, `rental-gallery-photo` (a photo * in the all-photos grid), `rental-gallery-slide` (a viewer or floor-plan frame), `rental-gallery-actions`; * - RentalDescription: `rental-description`, `rental-description-heading`, `rental-description-intro`, * `rental-description-preview`, `rental-description-full`, `rental-description-more`; * - RentalAmenities: `rental-amenities`, `rental-amenities-heading`, `rental-amenity-list`, * `rental-amenity`, `rental-amenities-all`, `rental-amenity-group`, `rental-amenity-group-heading`; * - RentalRooms: `rental-rooms`, `rental-rooms-heading`, `rental-room-list`, `rental-room`, * `rental-room-name`, `rental-room-description`, `rental-room-beds`, `rental-room-bed`, * `rental-room-attributes`, `rental-room-extras`, `rental-room-extras-heading`; * - RentalReviews: `rental-reviews`, `rental-reviews-heading`, `rental-review-summary`, * `rental-review-score`, `rental-review-grade`, `rental-review-count`, * `rental-review-criteria`, `rental-review-criterion`, `rental-review-criterion-label`, * `rental-review-criterion-value`, `rental-review-bar`, `rental-review-list`, `rental-review`, * `rental-review-title`, `rental-review-author`, `rental-review-read-more`, `rental-review-read-less`, * `rental-reviews-more`; * - RentalProperty: `rental-property`, `rental-property-heading`, `rental-property-name`, * `rental-property-highlights`, `rental-property-link`; * - RentalDistances: `rental-distances`, `rental-distances-heading`, `rental-distance`, * `rental-distance-label`, `rental-distance-value`. */ type RentalDetailParts = typeof RENTAL_DETAIL_PARTS; /** One block style part. */ type RentalDetailPart = RentalDetailParts[keyof RentalDetailParts]; export declare const RENTAL_DETAIL_PARTS: { readonly layerHeader: "rental-layer-header"; readonly layerTitle: "rental-layer-title"; readonly heading: "rental-heading"; readonly eyebrow: "rental-eyebrow"; readonly title: "rental-title"; readonly address: "rental-address"; readonly facts: "rental-facts"; readonly fact: "rental-fact"; readonly actions: "rental-actions"; readonly action: "rental-action"; readonly actionLabel: "rental-action-label"; readonly ratingBadge: "rating-badge"; readonly ratingBadgeScore: "rating-badge-score"; readonly ratingBadgeGrade: "rating-badge-grade"; readonly ratingBadgeCount: "rating-badge-count"; readonly galleryMosaic: "rental-gallery-mosaic"; readonly galleryPhoto: "rental-gallery-photo"; readonly gallerySlide: "rental-gallery-slide"; readonly galleryActions: "rental-gallery-actions"; readonly description: "rental-description"; readonly descriptionHeading: "rental-description-heading"; readonly descriptionIntro: "rental-description-intro"; readonly descriptionPreview: "rental-description-preview"; readonly descriptionFull: "rental-description-full"; readonly descriptionMore: "rental-description-more"; readonly amenities: "rental-amenities"; readonly amenitiesHeading: "rental-amenities-heading"; readonly amenityList: "rental-amenity-list"; readonly amenity: "rental-amenity"; readonly amenitiesAll: "rental-amenities-all"; readonly amenityGroup: "rental-amenity-group"; readonly amenityGroupHeading: "rental-amenity-group-heading"; readonly rooms: "rental-rooms"; readonly roomsHeading: "rental-rooms-heading"; readonly roomList: "rental-room-list"; readonly room: "rental-room"; readonly roomName: "rental-room-name"; readonly roomDescription: "rental-room-description"; readonly roomBeds: "rental-room-beds"; readonly roomBed: "rental-room-bed"; readonly roomAttributes: "rental-room-attributes"; readonly roomExtras: "rental-room-extras"; readonly roomExtrasHeading: "rental-room-extras-heading"; readonly reviews: "rental-reviews"; readonly reviewsHeading: "rental-reviews-heading"; readonly reviewSummary: "rental-review-summary"; readonly reviewScore: "rental-review-score"; readonly reviewGrade: "rental-review-grade"; readonly reviewCount: "rental-review-count"; readonly reviewCriteria: "rental-review-criteria"; readonly reviewCriterion: "rental-review-criterion"; readonly reviewCriterionLabel: "rental-review-criterion-label"; readonly reviewCriterionValue: "rental-review-criterion-value"; readonly reviewBar: "rental-review-bar"; readonly reviewList: "rental-review-list"; readonly review: "rental-review"; readonly reviewTitle: "rental-review-title"; readonly reviewAuthor: "rental-review-author"; readonly reviewReadMore: "rental-review-read-more"; readonly reviewReadLess: "rental-review-read-less"; readonly reviewsMore: "rental-reviews-more"; readonly property: "rental-property"; readonly propertyHeading: "rental-property-heading"; readonly propertyName: "rental-property-name"; readonly propertyHighlights: "rental-property-highlights"; readonly propertyLink: "rental-property-link"; readonly distances: "rental-distances"; readonly distancesHeading: "rental-distances-heading"; readonly distance: "rental-distance"; readonly distanceLabel: "rental-distance-label"; readonly distanceValue: "rental-distance-value"; }; //#endregion //#region src/quote/copy.d.ts /** Quote's own strings. Shared picker strings (nights, guest words, close) come from `SharedCopy`. */ interface QuoteCopy { /** The CTA with no stay picked: opens the calendar. */ checkAvailability: string; /** The CTA on a priced stay: the checkout link. */ continueToBooking: string; /** The CTA while a child has no age (the age prices the stay): opens the guest picker. */ completeAges: string; /** The CTA on an unavailable stay or a rate fault: opens the calendar. */ changeDates: string; /** Shown when the PMS refuses a stay without stating a reason. */ unavailable: string; /** The quote request failed in transport. */ quoteLoadFailed: string; /** The days are free but the PMS rate setup cannot be resolved: never "not available", and never * the SDK's reason (which reads like a booked week). */ rateFault: string; /** The arrival map failed: never an empty calendar that looks fully booked. */ calendarLoadFailed: string; /** Under the calendar when the site sets `minStayNights`; `{nights}` = "2 Nächte". */ minStayHint: Template<"nights">; /** The not-bookable-online-yet notice above the calendar; `{date}` = the first bookable day, month * or year, as `bookable.precision` names it ("1. März 2027", "März 2027", "2027"). An override's * `{contact}` places `bookable.contact` inline there instead of on its own line. */ bookableFromNotice: Template<"date" | "contact">; /** `{date}` = the first arrivable day after the refused start (`whenUnavailable: "next-arrival"`). */ nextArrival: Template<"date">; /** The button that takes the next arrival. */ takeNextArrival: string; /** The secondary "option booking" link (checkout with `kind=option`). */ optionAction: string; /** The secondary enquiry link. */ enquiryAction: string; /** Screen-reader words before the struck PMS pre-modifier total. */ regularPriceLabel: string; /** Screen-reader words before the total in the struck-total display. */ offerPriceLabel: string; /** Heading of the terms block when the rate is chosen in the checkout. */ policyTermsTitle: string; /** The bar's chevron (aria-label). */ showBookingDetails: string; /** The label of the stay total. */ totalLabel: string; /** The date field's placeholder and the calendar panel's title. */ datesLabel: string; /** The guest field's placeholder and the guest panel's title. */ guestsLabel: string; /** Closes a panel, keeping the choice. */ apply: string; /** Clears the chosen dates (the calendar footer's reset button, aria-label). */ reset: string; } /** Policy strings, shared with Booking (the rate rows must read the same on both pages). */ interface PolicyCopy { /** Heading over the rate choice; it names what is picked (a rate, each row with its price). */ title: string; /** The fieldset legend (screen readers). */ chooseLabel: string; /** `{date}` renders emphasised: the free-cancellation deadline. */ freeCancellationLine: Template<"date">; /** One refund rule; `{days}` `{dayUnit}` `{refund}`. */ ruleLine: Template<"dayUnit" | "days" | "refund">; /** `{markup}`; only on a row without its own real total. */ markupLine: Template<"markup">; /** `{fee}`: a separate cancellation charge. */ processingFee: Template<"fee">; /** The day unit for 1. */ dayOne: string; /** The day unit otherwise. */ dayMany: string; /** Screen-reader words before a row's total. */ totalLabel: string; /** Title of a PMS built-in rate that still refunds in full (replaces the built-in's own name). */ refundableLabel: string; /** Title of a PMS built-in rate whose refund window has closed for this stay. */ expiredLabel: string; /** Title of a PMS built-in rate that is neither (never the built-in's own name). */ standardLabel: string; /** Replaces the terms once the refund window closed; `{days}` `{dayUnit}` name the lapsed deadline. */ expiredLine: Template<"days" | "dayUnit">; } /** The occupancy calendar's strings. */ interface AvailabilityCalendarCopy { /** Legend: a day the PMS lists as not bookable. */ legendBooked: string; /** Legend: a day a stay can start on (a button). */ legendArrival: string; /** Legend: a free day on which no stay can start. */ legendNoArrival: string; /** An optional line under the grid; empty by default (a site's invitation to call is its own copy). */ note: string; } /** The type of `DEFAULT_QUOTE_COPY` (declared below). */ type QuoteCopyTable = CopyTable; /** The type of `DEFAULT_POLICY_COPY` (declared below). */ type PolicyCopyTable = CopyTable; /** The type of `DEFAULT_AVAILABILITY_CALENDAR_COPY` (declared below). */ type AvailabilityCalendarCopyTable = CopyTable; /** Quote's German and English defaults with the du/Sie overlays. */ export declare const DEFAULT_QUOTE_COPY: QuoteCopyTable; /** The policy rows' defaults; impersonal in every voice, so no overlay. */ export declare const DEFAULT_POLICY_COPY: PolicyCopyTable; /** The occupancy calendar's defaults; the legend addresses nobody. */ export declare const DEFAULT_AVAILABILITY_CALENDAR_COPY: AvailabilityCalendarCopyTable; //#endregion //#region src/quote/PriceSummary.d.ts /** How the breakdown sits under the total. * "folded" (default): the total in a native
, the lines behind it — it opens before * hydration and Ctrl-F opens it; six rows otherwise push the CTA out of a sidebar. * "open": the lines listed, then the total. "none": the total only (the lines belong to the checkout). */ type PriceBreakdownMode = "folded" | "open" | "none"; /** How a PMS discount (v10 modifiers) shows. v9 quotes carry none, so it is inert there. * "rows" (default): each modifier is its own uncoloured deduction row under the gross line, so the * column adds up; no struck price ("a struck 'was' price restates the saving as the one figure a guest * cannot check by adding"). "struck-total": the PMS's own `totalBeforeModifiers` struck before the * total, the modifier labels as chips above, the modifier rows annotating the net lines — a legal * stance a site takes on purpose. Never a figure the package derived. */ type DiscountDisplay = "rows" | "struck-total"; //#endregion //#region src/quote/useQuoteFlow.d.ts /** What the quote needs about the rental, from the page's build-time data. */ interface QuoteRental { /** PMS id; keys the shared flow across islands. */ id: string; /** Catalogue sleeping capacity; caps the steppers where availability states none (v9). */ maxGuests?: number; /** false: no dog can be added (a handed-over one can be lowered). Undefined = not known. */ petsAllowed?: boolean; } /** How an island takes part in its rental's flow. * "widget" (Quote, or a site's own widget): its settings rule the flow — applied with `configure` when * another island created the flow first — and it reads the URL handover once and mirrors the state back * with `replaceState`. * "satellite" (AvailabilityCalendar, a gallery offer pill): joins the flow and changes none of that; it * creates the flow with the defaults when it mounts first, and the widget re-applies its own. */ type QuoteFlowRole = "widget" | "satellite"; /** The flow's options as a component passes them: the SDK setup and the rental instead of an instance * and an id. The rate-fault report is the binding's (QUOTE_EVENT + a console line). */ interface UseQuoteFlowOptions extends Omit { /** The site's SDK setup; the flow claims the page's shared instance on its first request. */ sdk: SdkSetup; /** The rental; a new rental needs a new island. */ rental: QuoteRental; /** Default "widget". A satellite's widget settings (guests, policyChoice, …) are ignored. */ role?: QuoteFlowRole; } /** The flow and its current state. */ interface QuoteFlowBinding { /** The flow's state, re-rendered on every change. */ state: QuoteFlowState; /** The flow's actions (`selectDay`, `setParty`, `choosePolicy`, `pickArrival`, …). */ flow: QuoteFlow; } /** Acquires the shared flow for `rental.id` after hydration and starts it; a widget applies its settings * to a flow another island created, hydrates it from the URL once and mirrors it to the URL. Dispatches * QUOTE_EVENT ({ type: "rate-fault" }) once per stay; releases on unmount. The server and the first * client render read an unresolved state (no SDK, no window). */ type UseQuoteFlow = (options: UseQuoteFlowOptions) => QuoteFlowBinding; /** See {@link UseQuoteFlow}. */ export declare const useQuoteFlow: UseQuoteFlow; //#endregion //#region src/quote/Quote.d.ts /** A secondary link under the CTA. "option": a non-binding reservation — the checkout with `kind=option` * (Booking must accept it: `allowOption`), only on a priced stay. "enquiry": the site's enquiry page, * with the stay in the query when one is picked. */ type QuoteSecondaryAction = { kind: "option"; } | { kind: "enquiry"; href: string; }; /** Quote's props. Every one is serializable (islands). */ interface QuoteProps { /** The site's SDK setup; one instance per page is shared by every island. */ sdk: SdkSetup; /** PMS strings, formats and default copy. Default "de-DE". */ locale?: Locale; /** How German copy addresses the guest. Default "neutral". */ voice?: Voice; /** The rental (id, catalogue capacity, pets flag). */ rental: QuoteRental; /** "card" (default): the sidebar card, the calendar in a centred dialog, the guests in a popover. * "bar": the bottom bar, fixed to the viewport by the package (full width with one top border, or * `barLayout`; above the page and below the package's dialogs and sheets); pickers open as bottom * sheets; the closed bar states the total. The page keeps room for it below its footer. */ variant?: "card" | "bar"; /** variant "bar": it shows below this breakpoint and is hidden from it, where the page shows the * card. Default "lg"; the bar island's `client:media` names the same width * (`(max-width: 63.98rem)` for "lg"). */ barBelow?: Breakpoint; /** variant "bar": "full" (default) spans the viewport with one top border; "floating" is that bar * below md and, from md, a centred card (at most 40rem wide, the card radius, a border all round, * the `--shadow-card` axis) lifted 1rem off the bottom edge. With `barBelow="md"` the bar never * floats. */ barLayout?: "full" | "floating"; /** This rental's checkout route ("/buchen/"). Required, no default (a route is a fact about the * site); `null` is the deliberate enquiry-only page: the CTA and the "option" action render no link. */ checkoutHref: string | null; /** The site's one GuestOptions (shared with SearchBar and Booking): limits (adults 20 for a 20-person * house; `pets: 1` draws the dogs as a yes/no switch), childAge, defaultAdults. */ guests?: GuestOptions; /** How calendar cells state the nightly price. Default "rounded"; "none" for a no-per-night-prices * ruling (pass the site's one DAY_PRICES to Quote, AvailabilityCalendar and Booking). */ dayPrices?: DayPrices; /** Default "folded". */ breakdown?: PriceBreakdownMode; /** Default "rows"; inert on v9. */ discountDisplay?: DiscountDisplay; /** Where the rate is chosen. Default "rental-page"; must equal Booking's. */ policyChoice?: PolicyChoiceMode; /** The site's minimum stay in nights on top of the PMS; shows a hint under the calendar. */ minStayNights?: number; /** Not bookable online yet: the notice (with `contact`, e.g. a `tel:` link) above the calendar while * today < `noticeUntil ?? from`, and the opening month; does NOT floor the calendar (the PMS * availability stays the arbiter). The same object as SearchBar `dates.bookable`. */ bookable?: BookableFrom; /** One line under the CTA, only once priced AND the quote carries no policy (v9). Ships empty: a * cancellation promise is the agency's claim to keep. */ cancellationNote?: string; /** Default "none". */ campaignLabels?: CampaignLabelSource; /** What an unavailable stay offers beyond the PMS's reason: "none" (default) or "next-arrival" (the * first arrivable day after the refused start, one click to take it). */ whenUnavailable?: WhenUnavailable; /** Shown under unavailable / rate-fault / error outcomes, never on a priced stay (the * not-yet-bookable notice takes its own link: `bookable.contact`). */ contact?: ContactLink; /** A secondary link under the CTA. Default none. */ secondaryAction?: QuoteSecondaryAction; /** Overrides of Quote's own strings. */ copy?: Partial; /** Overrides of the rate rows' strings; pass Booking the same object (`policyCopy`), so the rows read * the same on both pages. */ policyCopy?: Partial; /** Overrides of the picker strings shared with SearchBar (dates, guests, common). */ shared?: SharedCopyOverrides; /** On the root (`quote`). */ className?: string; } /** The widget. Root `quote` (data-variant, data-outcome; the bar also `data-below`, `data-layout` and * `data-mobile-bookbar`). A rate * fault dispatches QUOTE_EVENT ({ type: "rate-fault" }) once per stay; a console line is always * written. */ type QuoteComponent = (props: QuoteProps) => React$1.JSX.Element; /** See {@link QuoteComponent}. */ declare const Quote: QuoteComponent; //#endregion //#region src/quote/AvailabilityCalendar.d.ts /** The occupancy calendar's props (serializable). */ interface AvailabilityCalendarProps { /** The site's SDK setup (the same as Quote's: the page shares one instance). */ sdk: SdkSetup; /** Default "de-DE". */ locale?: Locale; /** Default "neutral". */ voice?: Voice; /** The rental (the same object as Quote's). */ rental: QuoteRental; /** Months side by side on wide screens; one below md. Default 2. */ months?: 1 | 2; /** Default "none": an occupancy calendar (both sites that built one show no prices). A site with a * per-night ruling passes its one DAY_PRICES. */ dayPrices?: DayPrices; /** "quote" (default): an arrival click seeds the widget · "none": display only (no buttons). */ onArrival?: "quote" | "none"; /** Overrides of the legend and note. */ copy?: Partial; /** Overrides of the shared picker strings. */ shared?: SharedCopyOverrides; /** On the root (`availability-calendar`). */ className?: string; } /** `availability-calendar` (data-state = the arrival map's loading/ready/error) with the months * (`quote-calendar` data-phase="arrival") and `availability-legend`. It always shows the ARRIVAL view * (booked · arrival possible · no arrival), also while the widget picks a departure. On a failed map * it renders no grid: an empty grid reads as fully booked. */ type AvailabilityCalendarComponent = (props: AvailabilityCalendarProps) => React$1.JSX.Element; /** See {@link AvailabilityCalendarComponent}. */ export declare const AvailabilityCalendar: AvailabilityCalendarComponent; //#endregion //#region src/quote/parts.d.ts /** Every part the quote area renders (the type of `QUOTE_PARTS`, declared below): * quote (root: data-variant, data-outcome; the bar also data-below, data-layout and * `data-mobile-bookbar`) · quote-field (data-field, data-filled, data-loading) · quote-field-icon · * quote-dates-panel · quote-guests-panel · quote-panel-action (data-kind="reset|apply") · * quote-calendar (data-phase) · quote-day (data-day, data-selected, data-preview) · quote-day-price · * quote-day-tooltip · quote-nights-badge · quote-calendar-footer · quote-min-stay · * quote-bookable-from (the sentence and the contact link below it or at its `{contact}`, as * SearchBar's date-deferred-notice) · quote-policy-choice · quote-policy-option (data-selected, * data-available) · quote-policy-terms (data-terms) · quote-deadline-note · quote-price * (data-breakdown, data-display) · quote-offer-chip (data-source) · quote-total · quote-struck-total · * quote-line (data-line) · quote-status (data-outcome) · quote-contact · quote-next-arrival · * quote-cta (data-cta) · quote-secondary (data-kind) · quote-cancellation-note · quote-bar-toggle * (aria-expanded) · quote-bar-total (keeps `data-bookbar-total`) · availability-calendar · * availability-legend (items carry data-kind). */ type QuoteParts = typeof QUOTE_PARTS; /** One quote part. */ type QuotePart = QuoteParts[number]; /** See {@link QuoteParts}. */ export declare const QUOTE_PARTS: readonly ["quote", "quote-field", "quote-field-icon", "quote-dates-panel", "quote-guests-panel", "quote-panel-action", "quote-calendar", "quote-day", "quote-day-price", "quote-day-tooltip", "quote-nights-badge", "quote-calendar-footer", "quote-min-stay", "quote-bookable-from", "quote-policy-choice", "quote-policy-option", "quote-policy-terms", "quote-deadline-note", "quote-price", "quote-offer-chip", "quote-total", "quote-struck-total", "quote-line", "quote-status", "quote-contact", "quote-next-arrival", "quote-cta", "quote-secondary", "quote-cancellation-note", "quote-bar-toggle", "quote-bar-total", "availability-calendar", "availability-legend"]; //#endregion //#region src/booking/copy.d.ts /** Every checkout string; satisfies the headless ValidationMessages and CheckoutMessages. */ interface CheckoutCopy extends ValidationMessages, CheckoutMessages { /** Default "Erwachsener". */ adultOne: Template<"count">; /** Default "Erwachsene". */ adultMany: Template<"count">; /** Default "Kind". */ childOne: Template<"count">; /** Default "Kinder". */ childMany: Template<"count">; /** Default "Baby". */ babyOne: Template<"count">; /** Default "Babys". */ babyMany: Template<"count">; /** Default "Hund". */ petOne: Template<"count">; /** Default "Hunde". */ petMany: Template<"count">; /** Default "Nacht". */ nightOne: Template<"count">; /** Default "Nächte". */ nightMany: Template<"count">; /** Default "Tag". */ dayOne: string; /** Default "Tage". */ dayMany: string; /** The party row's label ("Gäste"; a site that lets to workers says "Personen"). */ guestsLabel: string; /** Default "Zeitraum". */ stayLabel: string; /** Default "Reisezeitraum ändern". */ editStayLabel: string; /** Default "Gäste ändern". */ editGuestsLabel: string; /** Closes the guest editor (the steppers apply live; this is the way out). */ dialogDone: string; /** Default "Vorheriges Bild". */ galleryPrevLabel: string; /** Default "Nächstes Bild". */ galleryNextLabel: string; /** The photo strip's dots label; tokens `{current}`, `{count}`. */ galleryDotLabel: Template<"count" | "current">; /** Default "Gesamtpreis". */ totalLabel: string; /** The PMS's pre-modifier total in `discountDisplay: "struck-total"`. */ regularPriceLabel: string; /** Default "Angebotspreis". */ offerPriceLabel: string; /** Live-region text while a re-quote runs. */ priceUpdating: string; /** Live-region text once priced; tokens `{total}`, `{detail}`. */ totalAnnouncement: Template<"detail" | "total">; /** Fills `{detail}` while an insurance is chosen: the premium is a second figure, never summed; * tokens `{label}`, `{price}`. */ totalAnnouncementInsuranceSuffix: Template<"label" | "price">; /** Default "Extras für den Aufenthalt". */ extrasTitle: string; /** Token `{count}`: the rows still folded away. */ extrasMore: Template<"count">; /** Default "Weniger anzeigen". */ extrasLess: string; /** Token `{service}`. */ extrasDecreaseLabel: Template<"service">; /** Token `{service}`. */ extrasIncreaseLabel: Template<"service">; /** The rate section's heading (`policyChoice: "checkout"`). */ policyTitle: string; /** The rate radios' group label. */ policyChooseLabel: string; /** Under the total when the applied rate refunds in full until a day; token `{date}` (emphasised). */ freeCancellationLine: Template<"date">; /** Default "Reiseversicherung". */ insuranceTitle: string; /** Default "Reiseversicherung wählen". */ insuranceChooseLabel: string; /** Default "Die Versicherungsprämie wird zusätzlich zum Gesamtpreis berechnet.". */ insuranceSurchargeNote: string; /** Before the premium row's product label ("zzgl. "). */ insuranceSurchargePrefix: string; /** Default "Unterlagen zur Versicherung". */ insuranceDocsTitle: string; /** Default "Diese Unterlagen des Versicherers müssen vor dem Abschluss vorliegen.". */ insuranceDocsIntro: string; /** Default "Bitte jede Datei öffnen, sie lässt sich speichern und ausdrucken.". */ insuranceDocsOpenHint: string; /** Default "(PDF, öffnet in neuem Tab)". */ insuranceDocsPdfHint: string; /** Default "(PDF, öffnet in neuem Tab, bereits geöffnet)". */ insuranceDocsPdfHintOpened: string; /** First person: the guest's own declaration, so it carries no address either way. */ insuranceDocsConfirmLabel: string; /** Default "Bitte zuerst alle Unterlagen öffnen, danach ist die Bestätigung möglich.". */ insuranceDocsPendingHint: string; /** Default "Die Prämie der Reiseversicherung wird direkt beim Versicherer bezahlt und is…". */ insurancePaymentNote: string; /** Default "Reiseversicherung bezahlen". */ insurancePayTitle: string; /** Default "Gutscheincode vorhanden?". */ voucherTrigger: string; /** Default "Gutscheincode". */ voucherLabel: string; /** Default "Einlösen". */ voucherSubmit: string; /** Default "Prüfen …". */ voucherChecking: string; /** Default "Entfernen". */ voucherRemove: string; /** Default "Kontaktdaten". */ contactTitle: string; /** Default "Anrede". */ salutationLabel: string; /** The "no answer" choice; also what the closed select shows before one is made. */ salutationNone: string; /** Default "Frau". */ salutationFemale: string; /** Default "Herr". */ salutationMale: string; /** Default "Vorname". */ forenameLabel: string; /** Default "Nachname". */ surnameLabel: string; /** Default "E-Mail". */ emailLabel: string; /** Default "Telefon". */ phoneLabel: string; /** Default "Straße". */ streetLabel: string; /** Default "Nr.". */ houseNumberLabel: string; /** Default "PLZ". */ postalcodeLabel: string; /** Default "Ort". */ cityLabel: string; /** Default "Land". */ countryLabel: string; /** Default "Häufig gewählt". */ countryFeaturedLabel: string; /** Default "Weitere Länder". */ countryOtherLabel: string; /** Default "Anmerkung". */ noteLabel: string; /** Default "z. B. voraussichtliche Ankunftszeit". */ notePlaceholder: string; /** The terms line in five fragments (prefix · terms link · conjunction · privacy link · suffix) that * must read as ONE sentence with a verb: the terms are ACCEPTED, the privacy notice is information * (Art. 13 DSGVO) and is never "accepted". */ termsPrefix: string; /** Default "AGB". */ termsLinkLabel: string; /** Between the two links; it carries its own leading space or punctuation (a comma may follow the * terms link: ", es gelten …"); a space follows it. Default " akzeptiert – es gelten die". */ termsConjunction: string; /** Default "Datenschutzhinweise". */ privacyLinkLabel: string; /** Default ".". */ termsSuffix: string; /** `consents.privacy: "checkbox"`: an acknowledgement, never a consent to processing; token `{link}`. */ privacyAcknowledgeLabel: Template<"link">; /** Shown while a required checkbox is unticked. */ consentRequired: string; /** Default "Für die Reiseversicherung fehlt noch ein Schritt: bitte die". */ insuranceDocsNoticePrefix: string; /** Default "Versicherungsunterlagen". */ insuranceDocsNoticeLinkLabel: string; /** Default "öffnen und bestätigen.". */ insuranceDocsNoticeSuffix: string; /** The age prices the stay, so the booking waits for every child's age. */ childAgesMissingNotice: string; /** Default "Alter angeben". */ childAgesMissingAction: string; /** § 312j Abs. 3 BGB: must stay within `SUBMIT_WORDING.booking`. */ submitLabel: string; /** Default "Buchung wird übermittelt …". */ submitting: string; /** Default "Preis wird aktualisiert …". */ submitPriceUpdating: string; /** One line above the button; empty by default and then not rendered (a contract note). */ submitNote: string; /** Default "Die Buchung konnte nicht übermittelt werden. Bitte noch einmal versuchen. So…". */ submitFailed: string; /** Under the hint row when more than one method is listed. */ paymentNoteChoice: string; /** Under the hint row when exactly one method is listed. */ paymentNoteSingle: string; /** Default "Überweisung". */ paymentMethodTransfer: string; /** Default "Kreditkarte". */ paymentMethodCard: string; /** Default "Debitkarte". */ paymentMethodDebitCard: string; /** Default "PayPal". */ paymentMethodPaypal: string; /** A notice at the top of the form: this reserves without obligation. */ optionHeading: string; /** Must stay within `SUBMIT_WORDING.option`. */ optionSubmitLabel: string; /** Default "Reservierung wird übermittelt …". */ optionSubmitting: string; /** Default "Vielen Dank, die Reservierung ist eingegangen.". */ optionConfirmationHeading: string; /** Token `{bookingNumber}` (emphasised). */ optionConfirmationNumberLine: Template<"bookingNumber">; /** Default "Vielen Dank, die Buchung ist eingegangen.". */ confirmationHeading: string; /** Token `{bookingNumber}` (emphasised). */ confirmationNumberLine: Template<"bookingNumber">; /** Default "Zahlung". */ paymentTitle: string; /** Default "Für die Online-Zahlung geht es weiter zum Zahlungsanbieter.". */ paymentOnlineNote: string; /** Default "oder". */ paymentAlternativeDivider: string; /** Under the entries when alternatives exist; empty by default and then not rendered. */ paymentAlternativeNote: string; /** Default "Weiterleitung …". */ paymentRedirecting: string; /** Default "Die Weiterleitung zur Zahlung hat nicht geklappt. Bitte noch einmal versuchen.". */ paymentRedirectFailed: string; /** Default "Kontoinhaber". */ bankHolderLabel: string; /** Default "IBAN". */ bankIbanLabel: string; /** Default "BIC". */ bankBicLabel: string; /** Default "Kreditinstitut". */ bankInstitutionLabel: string; /** Default "Verwendungszweck". */ bankRemittanceLabel: string; /** Default "Zur Unterkunft". */ fallbackBackLabel: string; /** Default "Für die Buchung fehlt noch der Reisezeitraum. Auf der Unterkunftsseite die D…". */ missingPeriodMessage: string; /** Default "Der Preis konnte gerade nicht geladen werden. Bitte in einem Moment noch ein…". */ quoteLoadFailed: string; } /** The checkout's copy table (`resolveCopy(DEFAULT_CHECKOUT_COPY, locale, voice, copy)`). */ type CheckoutCopyTable = CopyTable; /** Every checkout string, per locale, with the German voice overlays. */ export declare const DEFAULT_CHECKOUT_COPY: CheckoutCopyTable; //#endregion //#region src/booking/Booking.d.ts /** An image of the summary strip (and of the payment-return page). */ interface BookingImage { /** The image URL. */ src: string; /** Responsive candidates, as the site's image pipeline wrote them. */ srcset?: string; /** The alternative text; `""` for a purely decorative image. */ alt: string; } /** The rental being booked, from the page's build-time data: Quote's rental (id, capacity, pets flag) * plus what the summary shows, so the two pages read the same facts in the same shape. */ interface BookingRental extends QuoteRental { /** The rental's name, as the summary and the return page title it. */ name: string; /** Under the name: the town, or any short line the page composes. Absent renders nothing. */ location?: string | undefined; /** The rental page: the fallback cards link back to it with the stay. */ href: string; /** The first five are shown and parked for the return page. */ images?: readonly BookingImage[] | undefined; /** Pre-formatted facts under the name ("3 Schlafzimmer", "85 m²"). Default none. */ facts?: readonly string[] | undefined; } /** One legal document the terms line names. */ interface LegalLink { /** The page it lives on. Required: there is no platform default route. */ href: string; /** For the in-place dialog (`fetchLegalDocuments` at build). Absent or null: a plain link (new tab). */ document?: LegalDocument | null | undefined; } /** The two documents of the terms line. */ interface CheckoutLegal { /** The terms (AGB, Mietbedingungen, Vermittlungsbedingungen): ACCEPTED by booking. */ terms: LegalLink; /** The privacy notice: information (Art. 13 DSGVO), acknowledged, never "accepted". */ privacy: LegalLink; } /** A required checkbox for terms that apply to this rental only. */ interface AdditionalTerms { /** Stable id of the consent ("terms" and "privacy" are taken). */ id: string; /** The checkbox label; `{link}` is replaced by the linked `linkLabel`. */ label: string; /** The linked words inside `label`. */ linkLabel: string; /** The terms' page (opens in a new tab). */ href: string; } /** How a legal text is put before the guest: one notice line, or a required checkbox. */ type ConsentMode = "notice" | "checkbox"; /** How the legal texts are put before the guest. */ interface BookingConsents { /** "notice" (default): the terms line under the total. "checkbox": a required checkbox labelled by * that line. */ terms?: ConsentMode | undefined; /** "notice" (default): the privacy link sits in the terms line. "checkbox": an additional required * acknowledgement ("zur Kenntnis genommen"), never a consent to processing. */ privacy?: ConsentMode | undefined; /** Required checkboxes after the terms. Default none. */ additional?: readonly AdditionalTerms[] | undefined; } /** A way the business is paid, hinted under the order button. */ type PaymentMethod = "transfer" | "card" | "debit-card" | "paypal"; /** Card schemes drawn beside "card" (inline glyphs, no third-party request). */ type CardBrand = "visa" | "mastercard" | "amex"; /** After booking: every payment entry at once, or one open at a time. */ type PaymentLayout = "list" | "disclosure"; /** After booking: entries with their line items, or label, amount and due date only. */ type PaymentBreakdown = "lines" | "amounts"; /** What the order button says about payment, and how the payment entries render after booking. */ interface BookingPayment { /** What the business accepts. REQUIRED, no default: a hint the business does not stand behind is a * false statement under the order button. `[]` draws no hint row. */ methods: readonly PaymentMethod[]; /** Drawn only beside "card". Default none. */ cardBrands?: readonly CardBrand[] | undefined; /** Default "list". "disclosure" opens the full-amount online payment first when there is one. */ layout?: PaymentLayout | undefined; /** Default "lines". Full-amount alternatives never repeat lines (they restate the schedule). */ breakdown?: PaymentBreakdown | undefined; /** The transfer account holder when the PMS sends none (v9 hub): the operator's name per Impressum. */ bankHolderFallback?: string | undefined; } /** Extra presentation for a service, matched by PMS id or label. The SDK's own image and description win. */ interface ServiceMedia { /** An exact PMS service id, or a case-insensitive part of the label. Id rules are tried first, then * label rules in order (list the most specific first). */ match: { id: string; } | { label: string; }; /** Shown when the SDK sends no image for the service. */ image?: BookingImage | undefined; /** Shown under the label when the SDK sends no description. */ description?: string | undefined; } /** The extras as rows, or as a horizontal row of image cards. */ type ExtrasLayout = "list" | "carousel"; /** How the extras (PMS additional services) are presented. */ interface BookingExtras { /** Default "list". */ layout?: ExtrasLayout | undefined; /** "list": rows shown before "Mehr Extras anzeigen (N)". Default all. */ visible?: number | undefined; /** Default none. */ media?: readonly ServiceMedia[] | undefined; /** For a service no rule and no SDK image covers (a brand mark with `alt: ""`). Default none. */ fallbackImage?: BookingImage | undefined; } /** "rail": a sticky summary beside the form (from lg). "stacked": one column, the summary on top and a * sticky bottom bar with the order button (the total and terms still precede it in DOM order). */ type BookingLayout = "rail" | "stacked"; /** Booking's props. Serializable except the two documented slots. */ interface BookingProps { /** The page's SDK setup. */ sdk: SdkSetup; /** PMS language, formats and default copy. Default "de-DE". */ locale?: Locale | undefined; /** German address of the default copy. Default "neutral". */ voice?: Voice | undefined; /** Overrides for any checkout string (flat, shallow). */ copy?: Partial | undefined; /** Overrides of the rate rows' strings (`DEFAULT_POLICY_COPY`), applied last, over the six policy * keys `copy` carries: pass the object Quote's `policyCopy` takes, and the rows read the same on * both pages. */ policyCopy?: Partial | undefined; /** Overrides for the shared picker strings (guest and date editors). */ shared?: SharedCopyOverrides | undefined; /** The rental being booked (the same facts as Quote's `rental`, plus the summary's). */ rental: BookingRental; /** `countryOptions({ locale, featured })` at build. */ countries: CountryGroups; /** The starting Land, as on ContactForm: a code presets it (no detection), "detect" (default) picks * it from the visitor's browser languages after hydration. */ defaultCountry?: CountryCode | "detect" | undefined; /** The Land when detection names none of `countries`, and the dial code of a national phone number * while no Land is chosen. Default "DE". */ fallbackCountry?: CountryCode | undefined; /** The terms and the privacy notice. Required: there is no platform default route. */ legal: CheckoutLegal; /** Where the payment provider returns to (relative): the page that renders `BookingReturn`, never the * checkout itself (a checkout that re-offers the order after a payment invites a second booking). * Required: routes are the site's. */ returnPath: string; /** The payment methods (required) and the payment presentation after booking. */ payment: BookingPayment; /** Default "rail". */ layout?: BookingLayout | undefined; /** Nightly prices in the date editor's calendar; the same value as on Quote. Default "rounded". */ dayPrices?: DayPrices | undefined; /** Default "rows"; inert on v9. */ discountDisplay?: DiscountDisplay | undefined; /** Where the rate is chosen; the same value as on Quote. Default "rental-page": the carried rate is * applied and stated here. "checkout": the offered rates are a picker here. */ policyChoice?: PolicyChoiceMode | undefined; /** The site's minimum stay in nights on top of the PMS rules; the same value as on Quote. The date * editor marks closer departures as restricted and the flow refuses a shorter range. Default none. */ minStayNights?: number | undefined; /** Default: terms and privacy as one notice line, no additional terms. */ consents?: BookingConsents | undefined; /** Fields required on top of the minimum (forename, surname, email, street, postal code, city, * country). Default none. */ requiredFields?: readonly OptionalGuestField[] | undefined; /** How the extras are presented. Default a plain list. */ extras?: BookingExtras | undefined; /** Accept `?kind=option` (Quote's `{ kind: "option" }` secondary action): a non-binding reservation * with its own copy and wording. Default false. */ allowOption?: boolean | undefined; /** The site's one GuestOptions (shared with SearchBar and Quote): guest editor limits (`pets: 1` a * yes/no switch), child-age band, adults when the URL states none. */ guests?: GuestOptions | undefined; /** Slot (an Astro named slot, static HTML): brand content at the top of the summary. */ header?: React$1.ReactNode; /** Slot: brand content under the price in the summary (a trust note). Empty by default. */ summaryFooter?: React$1.ReactNode; /** On the root (`checkout`). */ className?: string | undefined; } /** The booking surface. Dispatches `voffice:checkout` (`CHECKOUT_EVENT`) on window, parks the rental * context for the return page, writes the edited stay into the URL and scrolls to the confirmation. */ type BookingComponent = (props: BookingProps) => React$1.JSX.Element; /** See {@link BookingComponent}. */ declare const Booking: BookingComponent; //#endregion //#region src/booking/useCheckoutFlow.d.ts /** What the binding takes: the flow's options minus what it derives (the rental id, the caps and the * rental context come from `rental`; the handover from the URL; events go to window). */ interface UseCheckoutFlowOptions extends Omit { /** The page's SDK setup (the instance is shared per setup). */ sdk: SdkSetup; /** Identity, capacity and pets flag of the rental being booked. */ rental: BookingRental; /** Accept `?kind=option` (a non-binding reservation; Booking's `allowOption`). Default false. */ allowOption?: boolean | undefined; } /** The flow's state and its actions. */ interface CheckoutFlowBinding { /** The flow's state, re-rendered on every change (the loading state before the flow exists). */ readonly state: CheckoutState; /** The actions: stable for the flow's lifetime, no-ops before it exists. */ readonly flow: CheckoutActions; } /** The checkout flow of one mounted Booking (or a site's own checkout UI). */ type UseCheckoutFlow = (options: UseCheckoutFlowOptions) => CheckoutFlowBinding; /** See {@link UseCheckoutFlow}. */ export declare const useCheckoutFlow: UseCheckoutFlow; //#endregion //#region src/booking/useGuestForm.d.ts /** The form's actions: the store without its store half. */ type GuestFormActions = Omit; /** The form's state and its actions. */ interface GuestFormBinding { /** The form's state, re-rendered on every change. */ readonly state: GuestFormState; /** `set`, `blur`, `submit`, `dispose`; stable for the form's lifetime. */ readonly form: GuestFormActions; } /** The guest-data form of one mounted checkout. Options are read once. */ type UseGuestForm = (options: GuestFormOptions) => GuestFormBinding; /** See {@link UseGuestForm}. */ export declare const useGuestForm: UseGuestForm; //#endregion //#region src/booking/parts.d.ts /** The part vocabulary (the type of `BOOKING_PARTS`). */ type BookingParts = typeof BOOKING_PARTS; /** One value of `BOOKING_PARTS`. */ type BookingPart = BookingParts[keyof BookingParts]; /** Style hooks, grouped by where they render. */ export declare const BOOKING_PARTS: { /** The surface root: `data-layout="rail|stacked"`, `data-booking-kind`, `data-phase`. */ readonly root: "checkout"; /** The rail (layout "rail") or the summary block on top (layout "stacked"). */ readonly summary: "checkout-summary"; /** The `header` slot's wrapper. */ readonly summaryHeader: "checkout-summary-header"; /** The column of sections. */ readonly main: "checkout-main"; /** Layout "stacked" only: the sticky bottom bar holding the order button. */ readonly submitBar: "checkout-submit-bar"; readonly rental: "checkout-rental"; readonly rentalName: "checkout-rental-name"; readonly rentalLocation: "checkout-rental-location"; /** Wraps the photo strip (`ENHANCE_PARTS` strip markup, bound by `bindStrip`). */ readonly rentalImages: "checkout-rental-images"; readonly rentalFacts: "checkout-rental-facts"; /** One summary row: `data-edit="dates|guests"`. */ readonly stay: "checkout-stay"; /** The pencil beside a stay row: `data-edit="dates|guests"`. */ readonly stayEdit: "checkout-stay-edit"; /** The price block (the shared price summary, the premium, the rate terms). */ readonly price: "checkout-price"; /** The applied rate's terms block. */ readonly policyTerms: "checkout-policy-terms"; /** "Bis zum … kostenlos stornierbar." (the date in `emphasis`). */ readonly freeCancellation: "checkout-free-cancellation"; /** The voucher disclosure: `data-state="closed|open|applied"`. */ readonly voucher: "checkout-voucher"; /** "Gutschein einlösen" (opens the input). */ readonly voucherTrigger: "checkout-voucher-trigger"; readonly voucherInput: "checkout-voucher-input"; /** Applies the typed code; disabled while the price is not the shown stay's. */ readonly voucherApply: "checkout-voucher-apply"; /** The applied code's chip. */ readonly voucherCode: "checkout-voucher-code"; readonly voucherRemove: "checkout-voucher-remove"; readonly voucherError: "checkout-voucher-error"; /** The `summaryFooter` slot's wrapper. */ readonly summaryFooter: "checkout-summary-footer"; /** The issue banner under the stay (a re-quote that failed or found the stay unavailable). */ readonly issue: "checkout-issue"; /** The issue's retry (a transport failure only). */ readonly issueRetry: "checkout-issue-retry"; /** `data-section="extras|policy|insurance|contact|submit"`, `data-busy` while a selection prices. */ readonly section: "checkout-section"; readonly sectionHeading: "checkout-section-heading"; /** One extra: `data-available`, `data-count`. */ readonly service: "checkout-service"; readonly serviceMedia: "checkout-service-media"; /** The extra's quantity control (the shared stepper). */ readonly stepper: "checkout-stepper"; /** "Mehr Extras anzeigen (N)" / "Weniger anzeigen". */ readonly extrasToggle: "checkout-extras-toggle"; /** One insurance radio row: `data-selected`. */ readonly insuranceOption: "checkout-insurance-option"; /** The chosen product's document step (the § 7 VVG gate). */ readonly insuranceDocuments: "checkout-insurance-documents"; /** A notice above the order button: `data-notice="option|insurance-documents|child-ages|consents|selection"`. */ readonly notice: "checkout-notice"; /** A consent row (checkbox + label): `data-consent="terms|privacy|"`. */ readonly consentRow: "checkout-consent-row"; /** A link to a legal document (terms, privacy, additional terms). */ readonly legalLink: "checkout-legal-link"; /** The total row directly above the order button (its figure is the legal `checkout-price-total`). */ readonly submitTotal: "checkout-submit-total"; readonly submitNote: "checkout-submit-note"; readonly paymentHints: "checkout-payment-hints"; /** One method or card brand: `data-method="|"`. */ readonly paymentGlyph: "checkout-payment-glyph"; /** The one sentence under the hints ("Die Zahlungsart wird direkt nach der Buchung gewählt."). */ readonly paymentNote: "checkout-payment-note"; readonly submitError: "checkout-submit-error"; /** `data-kind="booking|option"`. */ readonly confirmation: "checkout-confirmation"; readonly confirmationHeading: "checkout-confirmation-heading"; /** The booking-number sentence (the number itself in `emphasis`). */ readonly bookingNumber: "checkout-booking-number"; /** One payment entry: `data-kind="|full_amount"`, `data-open` in the disclosure layout. */ readonly schedule: "checkout-schedule"; /** The disclosure layout's toggle for one entry. */ readonly scheduleToggle: "checkout-schedule-toggle"; /** The "oder" rule between the schedules and the alternatives. */ readonly scheduleDivider: "checkout-schedule-divider"; /** An online payment button: `data-busy` while it redirects. */ readonly paymentOption: "checkout-payment-option"; readonly bankTransfer: "checkout-bank-transfer"; readonly insurancePayment: "checkout-insurance-payment"; /** One insurer's payment link (new tab). */ readonly insurancePayLink: "checkout-insurance-pay-link"; readonly paymentError: "checkout-payment-error"; /** `data-reason="missing-stay|unavailable|error"`. */ readonly fallback: "checkout-fallback"; /** "Erneut versuchen" on a transport failure. */ readonly fallbackRetry: "checkout-fallback-retry"; /** The link back to the rental page (with the stay). */ readonly fallbackBack: "checkout-fallback-back"; readonly skeleton: "checkout-skeleton"; readonly legalDialog: "checkout-legal-dialog"; /** The date or guest editor: `data-edit="dates|guests"`. */ readonly stayDialog: "checkout-stay-dialog"; /** `data-state="loading|booked|returned|none"`, `data-booking-kind`. */ readonly returnRoot: "booking-return"; readonly returnBadge: "booking-return-badge"; readonly returnHeadline: "booking-return-headline"; /** The optional ornamental line (`scriptAccent`, empty by default and then absent). */ readonly returnAccent: "booking-return-accent"; readonly returnIntro: "booking-return-intro"; readonly returnCancelled: "booking-return-cancelled"; /** The optional invitation sentence (empty by default and then absent). */ readonly returnInvitation: "booking-return-invitation"; readonly returnLinks: "booking-return-links"; /** One onward link: `data-kind="primary|rental|secondary|home"`. */ readonly returnLink: "booking-return-link"; /** The booked rental's card (photos, name, facts). */ readonly returnSummary: "booking-return-summary"; readonly returnImages: "booking-return-images"; readonly returnRental: "booking-return-rental"; readonly returnFacts: "booking-return-facts"; /** `data-fact="arrival|nights|departure|guests|number|total"`. */ readonly returnFact: "booking-return-fact"; }; //#endregion //#region src/booking-return/copy.d.ts /** Every string of the payment-return page. */ interface BookingReturnCopy { /** The status badge beside the success tick. */ badgeLabel: string; /** The badge for a non-binding reservation (`kind: "option"`). */ optionBadgeLabel: string; /** Default "Vielen Dank für die Buchung.". */ headline: string; /** Default "Vielen Dank für die Reservierung.". */ optionHeadline: string; /** An ornamental line under the headline in the site's script face. Empty by default: not rendered. */ scriptAccent: string; /** Default "Die Buchung ist bei uns eingegangen. Die Bestätigung mit allen Details folgt…". */ intro: string; /** Default "Die unverbindliche Reservierung ist bei uns eingegangen. Alle Details folgen…". */ optionIntro: string; /** After a cancelled Stripe checkout: the booking stands, only the payment is open. */ paymentCancelledNote: string; /** Default "Anreise". */ arrivalLabel: string; /** Default "Abreise". */ departureLabel: string; /** Default "Gäste". */ guestsLabel: string; /** Default "Gesamtpreis". */ totalLabel: string; /** Default "Buchungsnummer". */ bookingNumberLabel: string; /** Default "Vorheriges Bild". */ galleryPrevLabel: string; /** Default "Nächstes Bild". */ galleryNextLabel: string; /** The photo strip's dots label; tokens `{current}`, `{count}`. */ galleryDotLabel: Template<"count" | "current">; /** The way back to the booked rental (only when the snapshot carries its page). */ rentalLinkLabel: string; /** One sentence before the onward links. Empty by default: not rendered. */ invitation: string; /** Nobody booked in this tab: a typed URL, or tracking parameters only. */ emptyHeadline: string; /** Default "Nach einer abgeschlossenen Buchung steht die Bestätigung hier und kommt zusä…". */ emptyIntro: string; /** Default "Zur Startseite". */ emptyCtaLabel: string; /** Default "Erwachsener". */ adultOne: Template<"count">; /** Default "Erwachsene". */ adultMany: Template<"count">; /** Default "Kind". */ childOne: Template<"count">; /** Default "Kinder". */ childMany: Template<"count">; /** Default "Baby". */ babyOne: Template<"count">; /** Default "Babys". */ babyMany: Template<"count">; /** Default "Hund". */ petOne: Template<"count">; /** Default "Hunde". */ petMany: Template<"count">; /** Default "Nacht". */ nightOne: Template<"count">; /** Default "Nächte". */ nightMany: Template<"count">; /** Joins the party's parts ("2 Erwachsene · 1 Kind"). */ guestSeparator: string; } /** The return page's copy table (`resolveCopy(DEFAULT_BOOKING_RETURN_COPY, locale, voice, copy)`). */ type BookingReturnCopyTable = CopyTable; /** Every return-page string, per locale, with the German voice overlays. */ export declare const DEFAULT_BOOKING_RETURN_COPY: BookingReturnCopyTable; //#endregion //#region src/booking-return/BookingReturn.d.ts /** One onward destination. Every one belongs to one site, so there is no default. */ interface BookingReturnLink { /** The link's text. */ label: string; /** The link's destination. */ href: string; /** The filled call to action. At most one is rendered as primary (the first); none by default, * so the way back to the booked rental stays the strongest element. */ primary?: boolean | undefined; /** Opens in a new tab (with `shared.common.newTabHint`). Default false. */ newTab?: boolean | undefined; } /** BookingReturn's props. Serializable (an island). */ interface BookingReturnProps { /** Default "de-DE". */ locale?: Locale | undefined; /** Default "neutral". */ voice?: Voice | undefined; /** Overrides of the return page's strings. */ copy?: Partial | undefined; /** The onward links after a booking. Default none. */ nextLinks?: readonly BookingReturnLink[] | undefined; /** The "none" state's way out. Default "/". */ homeHref?: string | undefined; /** `sizes` of the photo strip; it must be true (an overstated slot fetches a soft photo). Default * sized to the component's own column. */ imageSizes?: string | undefined; /** Overrides of the shared strings (`common.newTabHint`). */ shared?: SharedCopyOverrides | undefined; /** On the root (`booking-return`). */ className?: string | undefined; } /** Placeholder on the server; the return state after mount. */ type BookingReturnComponent = (props: BookingReturnProps) => React$1.JSX.Element; /** See {@link BookingReturnComponent}. */ export declare const BookingReturn: BookingReturnComponent; //#endregion export { type ActionKey, type AdditionalTerms, type AlternativesOptions, type AmenityGlyphs, type AvailabilityCalendarCopy, type AvailabilityCalendarCopyTable, type AvailabilityCalendarProps, Booking, type BookingConsents, type BookingExtras, type BookingImage, type BookingLayout, type BookingPart, type BookingParts, type BookingPayment, type BookingProps, type BookingRental, type BookingReturnCopy, type BookingReturnCopyTable, type BookingReturnLink, type BookingReturnProps, type Breakpoint, type CardBrand, type CardCopy, type CardCopyTable, type CheckoutCopy, type CheckoutCopyTable, type CheckoutFlowBinding, type CheckoutLegal, type CommonCopy, type ConsentEventDetail, type ConsentMode, ContactForm, type ContactFormBinding, type ContactFormCopy, type ContactFormCopyTable, type ContactFormProps, type ContactPart, type ContactParts, type CopyLocale, type CopyTable, type CriterionShort, DEFAULT_LOCALE, DEFAULT_VOICE, type DatesCopy, type DiscountDisplay, type EmptyOptions, type EnhanceBinding, type ExternalLoad, type ExtraFact, type ExtrasLayout, FIELD_PARTS, type FactKey, type FavoritesBinding, type FieldPart, type FillPartsOptions, type GallerySurface, type GlyphIconProps, type GlyphMode, type GuestFormActions, type GuestFormBinding, type GuestsCopy, type HeaderOptions, type HeaderPart, type HeadingLevel, type HeadingTag, type I18n, I18nProvider, type I18nProviderProps, type ImageBox, type LegalLink, type OfferCampaignFilterCopy, type OfferCampaignFilterCopyTable, type OfferCampaignFilterProps, PRIMITIVE_PARTS, type PagingOptions, type PaymentBreakdown, type PaymentLayout, type PaymentMethod, type PolicyCopy, type PolicyCopyTable, type PrerenderedResultsProps, type PriceBreakdownMode, type PrimitivePart, Quote, type QuoteCopy, type QuoteCopyTable, type QuoteFlowBinding, type QuoteFlowRole, type QuotePart, type QuoteParts, type QuoteProps, type QuoteRental, type QuoteSecondaryAction, RENTAL_CARD_PARTS, type RatingBadgeCopy, type RatingBadgeCopyTable, type RatingBadgeProps, type RatingPart, type RegionCopy, type RegionOption, type RentalActionsCopy, type RentalActionsCopyTable, type RentalActionsProps, type RentalAmenitiesCopy, type RentalAmenitiesCopyTable, type RentalAmenitiesProps, type RentalBlockProps, RentalCard, type RentalCardOptions, type RentalCardParts, type RentalCardProps, type RentalCopy, type RentalCopyTable, type RentalDescriptionCopy, type RentalDescriptionCopyTable, type RentalDescriptionProps, type RentalDetailPart, type RentalDetailParts, type RentalDistancesCopy, type RentalDistancesCopyTable, type RentalDistancesProps, type RentalFactListCopy, type RentalFactListCopyTable, type RentalFactListProps, type RentalGalleryCopy, type RentalGalleryCopyTable, type RentalGalleryProps, type RentalHeadingCopy, type RentalHeadingCopyTable, type RentalHeadingProps, type RentalJumpCopy, type RentalJumpCopyTable, type RentalJumpParts, type RentalJumpProps, type RentalJumpSource, type RentalPropertyCopy, type RentalPropertyCopyTable, type RentalPropertyProps, type RentalReviewsCopy, type RentalReviewsCopyTable, type RentalReviewsProps, type RentalRoomsCopy, type RentalRoomsCopyTable, type RentalRoomsProps, type ReviewSummaryPart, type RichTextParts, type RichTextProps, type RoomAttributeShort, SHARED_COPY, SITE_EVENT_PREFIX, SearchBar, type SearchBarCopy, type SearchBarCopyTable, type SearchBarDates, type SearchBarFilters, type SearchBarGuests, type SearchBarMobile, type SearchBarPart, type SearchBarParts, type SearchBarProps, type SearchBarRentalJump, type SearchBarVariant, type SearchCountCopy, type SearchCountCopyTable, type SearchCountProps, type SearchFilterChipsCopy, type SearchFilterChipsCopyTable, type SearchFilterChipsProps, type SearchFiltersCopy, type SearchFiltersCopyTable, type SearchFiltersProps, type SearchFormBinding, type SearchQuickFiltersProps, SearchResults, type SearchResultsCopy, type SearchResultsCopyTable, type SearchResultsPart, type SearchResultsParts, type SearchResultsProps, type SearchSortCopy, type SearchSortCopyTable, type SearchSortProps, type SearchStoreBinding, type ServiceMedia, type SharedCopy, type SharedCopyOverrides, type SharedCopyTable, type SheetCopy, Showcase, type ShowcaseCopy, type ShowcaseCopyTable, type ShowcaseParts, type ShowcaseProps, type TrailingTileOptions, type UseCheckoutFlowOptions, type UseContactFormOptions, type UseQuoteFlowOptions, type Voice, dateFnsLocale, fill, resolveCopy, resolveShared, useI18n };