import * as React from "react"; import { CardModelOptions, CardSource, FactKind, Glyph, Locale, Locale as Locale$1, Template, fillTemplate as fill } from "@v-office/website-headless"; //#region src/card/shared-copy.d.ts /** The card strings. `{count}`, `{name}`, `{n}`, `{label}`, `{distance}`, `{rating}`, `{scale}`, * `{period}`, `{price}`, `{current}` are the tokens; an unknown token stays visible. */ interface CardCopy { /** Facts, singular and plural (`{count}`). */ 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">; /** A stated distance on the card: `{label}` and `{distance}` ("Strand 300 m"). */ distance: Template<"distance" | "label">; /** `{count}` reviews beside the score. */ reviewsOne: Template<"count">; /** Default "{count} Bewertungen". */ reviewsMany: Template<"count">; /** The score's accessible name: `{rating}` of `{scale}`. */ rating: Template<"rating" | "scale">; /** A photo the feed gives no alt text: `{name}` and its 1-based `{n}`. */ imageAlt: Template<"n" | "name">; /** Default "Vorheriges Bild". */ previousImage: string; /** Default "Nächstes Bild". */ nextImage: string; /** The dots' accessible name, repainted by the strip engine: `{count}` photos, `{current}` shown. */ imagesLabel: Template<"count" | "current">; /** "View {name}": a link's accessible name where a card offers one besides its title (the map popup). */ view: Template<"name">; /** The text CTA (`cta: "text"`). */ cta: string; /** The heart's accessible name (`{name}`); its pressed state says whether it is saved. */ save: Template<"name">; /** A remove action's accessible name (`{name}`), where a surface offers one apart from the heart. */ unsave: Template<"name">; /** The status chip: an offer, or an alternative window on an exact search. */ statusOffer: string; /** Default "Alternativer Zeitraum". */ statusAlternative: string; /** One alternative window (`{period}`), linked. */ freeInPeriod: Template<"period">; /** Several windows (`{count}`), opening the results' chooser. */ periodsMore: Template<"count">; /** `{count}` nights of the priced stay. */ nightOne: Template<"count">; /** Default "{count} Nächte". */ nightMany: Template<"count">; /** The window a night-range price was found in (`{period}`). */ inWindow: Template<"period">; /** Screen-reader words around the struck and the current price (`{price}`). */ priceBefore: Template<"price">; /** Default "jetzt {price}". */ priceNow: Template<"price">; /** `cta: "pick-dates"`: the link to the site's date picker. */ selectDates: string; } /** The type of `CARD_COPY` (declared below): German (neutral) and English, no voice overlays. */ type CardCopyTable = CopyTable; //#endregion //#region src/rental/shared-copy.d.ts /** The shared rental strings. `{token}` templates are filled with `fill`. */ interface RentalCopy { /** The place a distance is measured to, per `DistanceKind` ("Strand"). */ distanceBeach: string; /** Default "Meer". */ distanceSea: string; /** Default "See". */ distanceLake: string; /** Default "Zentrum". */ distanceCity: string; /** Default "Skilift". */ distanceSki: string; /** Default "Golfplatz". */ distanceGolf: string; /** Default "Bahnhof". */ distanceTrainStation: string; /** Default "Fähre". */ distanceFerry: string; /** Default "Flughafen". */ distanceAirport: string; /** Default "Einkaufen". */ distanceShopping: string; /** Default "Restaurant". */ distanceRestaurant: string; /** Default "Haltestelle". */ distancePublicTransport: string; /** The statement that replaces the number below ADJACENT_BELOW_M, per kind ("Direkt am Strand"; * the city's is "Zentrale Lage"). */ adjacentBeach: string; /** Default "Direkt am Meer". */ adjacentSea: string; /** Default "Direkt am See". */ adjacentLake: string; /** Default "Zentrale Lage". */ adjacentCity: string; /** Default "Direkt am Skilift". */ adjacentSki: string; /** Default "Direkt am Golfplatz". */ adjacentGolf: string; /** Default "Direkt am Bahnhof". */ adjacentTrainStation: string; /** Default "Direkt an der Fähre". */ adjacentFerry: string; /** Default "Direkt am Flughafen". */ adjacentAirport: string; /** Default "Einkaufen direkt nebenan". */ adjacentShopping: string; /** Default "Restaurant direkt nebenan". */ adjacentRestaurant: string; /** Default "Haltestelle direkt nebenan". */ adjacentPublicTransport: string; /** A stated distance: `{label}` (the kind's label) and `{distance}` ("Strand 300 m"). */ distance: Template<"distance" | "label">; /** Below 1 km: `{m}` metres, formatted in the locale. */ meters: Template<"m">; /** From 1 km: `{km}` kilometres, one decimal at most, formatted in the locale. */ kilometers: Template<"km">; /** The pets flag, in dog-specific words (a fleet ruling: never the generic "Haustiere"). */ pets: string; /** `{count}` reviews, singular and plural. */ reviewsOne: Template<"count">; /** Default "{count} Bewertungen". */ reviewsMany: Template<"count">; /** A reviewer the feed does not name. */ guest: string; } /** The type of `RENTAL_COPY` (declared below): German (neutral) and English, no voice overlays * (no string here addresses the reader). */ type RentalCopyTable = CopyTable; //#endregion //#region src/search/shared-copy.d.ts /** The date picker's strings (calendar, ± chips, night range, flexible half). `{token}` templates. */ interface DatesCopy { /** Tab for exact dates ("Datum"). */ modeExact: string; /** Tab for the flexible half ("Flexibel"). */ modeFlexible: string; /** Accessible name of the tab row. */ modeAria: string; /** The ± 0 chip ("Genaue Reisedaten"). */ exactDates: string; /** A ± chip of one day; `{days}`. */ plusMinusDay: Template<"days">; /** A ± chip of several days; `{days}`. */ plusMinusDays: Template<"days">; /** One night; `{count}` (hover badge, summaries). */ nightOne: Template<"count">; /** Several nights; `{count}`. */ nightMany: Template<"count">; /** A night range inside a window; `{min}`, `{max}` ("3–7 Nächte"). */ nightRange: Template<"max" | "min">; /** Label of the shortest-stay select of the night-range row. */ rangeMin: string; /** Label of the longest-stay select of the night-range row. */ rangeMax: string; /** Stay chip: a weekend. */ stayWeekend: string; /** Stay chip: a week. */ stayWeek: string; /** Stay chip: a month. */ stayMonth: string; /** The weekend stay in a summary. */ stayWeekendShort: string; /** The week stay in a summary. */ stayWeekShort: string; /** The month stay in a summary. */ stayMonthShort: string; /** Heading above the stay chips. */ howLong: string; /** Heading above the month strip. */ whenTravel: string; /** Accessible name of the calendar grid. */ calendarAria: string; /** Appended to a past day's accessible name ("vergangen"). */ pastDay: string; /** Why a departure day is disabled; `{nights}` is the minimum stay. */ minStay: Template<"nights">; } /** The guest picker's strings (rows, ages, summaries). `{token}` templates. */ interface GuestsCopy { /** One guest in a summary; `{count}`. Adults and children count as guests. */ guestOne: Template<"count">; /** Several guests; `{count}`. */ guestMany: Template<"count">; /** Adults row label. */ adults: string; /** Adults row hint ("Ab 18 Jahren"). */ adultsHint: string; /** Children row label. */ children: string; /** Children row hint; `{min}`, `{max}` from the child-age band. */ childrenHint: Template<"max" | "min">; /** Visible label of child n's age select; `{n}`. */ childN: Template<"n">; /** Accessible name of child n's age select; `{n}`. */ childAgeLabel: Template<"n">; /** The age select's empty choice ("Alter"). */ agePlaceholder: string; /** One age option; `{age}`. */ ageYears: Template<"age">; /** Babies row label. */ babies: string; /** Babies row hint; `{min}` is the youngest child age. */ babiesHint: Template<"min">; /** One baby in a summary; `{count}`. */ babyOne: Template<"count">; /** Several babies; `{count}`. */ babyMany: Template<"count">; /** Dog stepper label ("Hunde"; the agency rule: dogs, never "Haustiere"). */ pets: string; /** Dog toggle label ("Hund"). */ pet: string; /** One dog in a summary; `{count}`. */ petOne: Template<"count">; /** Several dogs; `{count}`. */ petMany: Template<"count">; /** Accessible name of the dog toggle. */ travelWithPet: string; /** Stepper button; `{label}` is the row label. */ decrease: Template<"label">; /** Stepper button; `{label}`. */ increase: Template<"label">; /** Shown while a child has no age and the surface asks for it. */ agesMissing: string; } /** The region picker's strings that are not the bar's own labels. */ interface RegionCopy { /** Accessible text of an option's rental count of one; `{count}`. */ countOne: Template<"count">; /** Accessible text of an option's rental count; `{count}`. */ countMany: Template<"count">; } /** The mobile sheet's strings that are not the bar's own labels. */ interface SheetCopy { /** The step indicator; `{current}`, `{total}`. */ stepOf: Template<"current" | "total">; } //#endregion //#region src/lib/i18n.d.ts /** The locales the package carries copy for: the SDK's `Locale`, every one of them complete. */ type CopyLocale = Locale$1; /** How German copy addresses the reader. Neutral addresses nobody ("Bitte Vornamen eingeben."); `du` and * `sie` overlay only the keys where an address reads naturally. English ignores it. */ type Voice = "neutral" | "du" | "sie"; /** The voice a component speaks when the site sets none. */ declare const DEFAULT_VOICE: Voice; /** The locale a component renders when the site sets none. */ declare const DEFAULT_LOCALE: Locale$1; /** A component's copy: a complete table per locale plus the German voice overlays (only the keys that * differ from neutral). Values are strings or string arrays, so a table serializes into an island. */ interface CopyTable { /** The complete German table (neutral voice). */ readonly "de-DE": T; /** The complete English table. */ readonly "en-US": T; /** The German voice overlays: only the keys that differ from neutral. */ readonly voices: { readonly du: Partial; readonly sie: Partial; }; } /** The table for `locale`, the voice overlay on top (German only), the site's overrides last. */ type ResolveCopy = (table: CopyTable, locale: Locale$1, voice: Voice, overrides?: Partial) => T; /** Strings no single unit owns: dialog chrome, loading and retry lines, field suffixes. */ interface CommonCopy { /** A dialog's or sheet's close button ("Schließen"). */ close: string; /** Back one step in a stepped dialog ("Zurück"). */ back: string; /** On to the next step ("Weiter"). */ next: string; /** Apply a dialog's choice ("Übernehmen"). */ apply: string; /** Reset a choice ("Zurücksetzen"). */ reset: string; /** A pending action or a loading region ("Wird geladen …"). */ loading: string; /** Retry a failed request ("Erneut versuchen"). */ retry: string; /** Appended to an optional field's label ("(optional)"). */ optionalSuffix: string; /** Read after a link that opens a new tab ("(öffnet in neuem Tab)"). */ newTabHint: string; } /** The groups shared by pickers and cards. Each group's interface and table belong to the unit named. */ interface SharedCopy { /** The date picker and stay summaries (search/shared-copy.ts). */ dates: DatesCopy; /** The guest panel and party summaries (search/shared-copy.ts). */ guests: GuestsCopy; /** The region picker (search/shared-copy.ts). */ region: RegionCopy; /** The mobile sheets (search/shared-copy.ts). */ sheet: SheetCopy; /** Every rental card (card/shared-copy.ts). */ card: CardCopy; /** Distance and fact labels the card and the rental blocks share (rental/shared-copy.ts). */ rental: RentalCopy; /** Strings no unit owns (this file). */ common: CommonCopy; } /** A site's overrides of the shared strings, one level deep (`{ guests: { pets: "Haustiere" } }`). */ type SharedCopyOverrides = { readonly [K in keyof SharedCopy]?: Partial; }; /** The shared tables as one `CopyTable`; a voice overlay is partial per group (each group's own overlay). */ interface SharedCopyTable { /** Every group in German (neutral voice). */ readonly "de-DE": SharedCopy; /** Every group in English. */ readonly "en-US": SharedCopy; /** The German voice overlays per group. */ readonly voices: { readonly du: SharedCopyOverrides; readonly sie: SharedCopyOverrides; }; } /** Every shared group resolved for one locale and voice, the site's overrides per group on top. */ type ResolveShared = (locale: Locale$1, voice: Voice, overrides?: SharedCopyOverrides) => SharedCopy; /** The calendar grids' locale (everything else formats with `Intl`): react-day-picker's, which is the * date-fns locale plus the translated navigation and day labels (a bare date-fns locale leaves the * month buttons in English). */ type DateFnsLocale = (locale: Locale$1) => import("date-fns").Locale; /** What a surface's parts read through `useI18n()`. */ interface I18n { /** The surface's locale. */ readonly locale: Locale$1; /** The surface's German voice. */ readonly voice: Voice; /** The shared groups, resolved with the site's overrides. */ readonly shared: SharedCopy; } /** Props of {@link I18nProvider}. */ interface I18nProviderProps { /** The surface's locale. */ locale: Locale$1; /** The surface's German voice. */ voice: Voice; /** The site's shared overrides (the surface's `shared` prop). */ shared?: SharedCopyOverrides; /** The surface's tree. */ children: React.ReactNode; } /** Every surface wraps its tree in this once; the shared pickers and cards inside read from it. */ type I18nProviderComponent = (props: I18nProviderProps) => React.ReactElement; /** The surrounding surface's locale, voice and shared copy; the defaults (de-DE, neutral) outside any * provider, so a part rendered on its own (a `RentalCard` in a site's own grid) still reads complete copy. */ type UseI18n = () => I18n; /** See {@link ResolveCopy}. */ declare const resolveCopy: ResolveCopy; /** Every shared group, assembled from the units' tables (the tables stay the units'). */ declare const SHARED_COPY: SharedCopyTable; /** See {@link ResolveShared}. */ declare const resolveShared: ResolveShared; /** See {@link DateFnsLocale}. */ declare const dateFnsLocale: DateFnsLocale; /** See {@link I18nProviderComponent}. */ declare const I18nProvider: I18nProviderComponent; /** See {@link UseI18n}. */ declare const useI18n: UseI18n; //#endregion //#region src/lib/conventions.d.ts /** The level a component's own heading renders at. A page decides its outline (a result count may be the * page's h1; card titles are not headings), so every heading prop is `headingLevel?: HeadingLevel | * "none"`, where "none" renders no heading element (the text stays, in a `

`). */ type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6; /** The element a heading level renders as. */ type HeadingTag = `h${HeadingLevel}`; /** When a component may load third-party content (map tiles): * - "near": when it comes within a screen of the viewport; * - "click": a placeholder with a load button; nothing reaches the third party before the click; * - "consent": the same placeholder, which also loads by itself once the site's consent manager grants * the component's category (`useConsent`, lib/consent.ts). * Package UI makes no other third-party request (no hotlinked glyphs, fonts or images). */ type ExternalLoad = "near" | "click" | "consent"; /** The package's compiled breakpoints: Tailwind's defaults, fixed at build time (md 48rem, lg 64rem, * xl 80rem). A `Breakpoint` prop lives beside the variant it qualifies (`gridFrom`, `collapseBelow`), * never inside a variant value. A site whose own breakpoints differ picks the nearest value. */ type Breakpoint = "md" | "lg" | "xl"; /** "Draw a glyph before each item": none · default (the block's own glyph per item kind; a check for * amenities) · mapped (per item from the block's glyph map, the default glyph where the map has none). */ type GlyphMode = "none" | "default" | "mapped"; /** Every window event a surface dispatches is named `voffice:` with a `type` discriminant in * its detail, and the detail never carries personal data. Islands cannot take callbacks, so a site * forwards these events to its (consented) analytics. */ declare const SITE_EVENT_PREFIX: "voffice:"; /** Generic parts of a form field, scoped by the surface's root part * (`[data-part=contact-form] [data-part=field-label]`). A flat array, like every vocabulary but the * grouped RENTAL_DETAIL_PARTS and BOOKING_PARTS (objects keyed by name). */ declare const FIELD_PARTS: readonly ["field", "field-label", "field-optional", "field-control", "field-hint", "field-error"]; /** One generic field part. */ type FieldPart = (typeof FIELD_PARTS)[number]; /** The parts the shared primitives render on every surface (scoped by the surface's root part): * the drawer's and the dialog's chrome, the select, the stepper, the popover's positioner, the * skeleton, a glyph and an emphasised token. Renaming one is a major, as for any vocabulary. A flat * array. */ declare const PRIMITIVE_PARTS: readonly ["drawer-header", "drawer-title", "drawer-close", "drawer-body", "drawer-footer", "dialog-header", "dialog-title", "dialog-close", "select", "select-list", "select-chevron", "stepper", "stepper-decrease", "stepper-increase", "stepper-value", "popover-positioner", "skeleton", "glyph", "emphasis"]; /** One primitive part. */ type PrimitivePart = (typeof PRIMITIVE_PARTS)[number]; //#endregion //#region src/card/RentalCard.d.ts /** The site's ONE card object. Extends the model options (facts, distance, pills, badges, * maxImages, priceCents, offer) with how the card draws them. Every key is optional. */ interface RentalCardOptions extends CardModelOptions { /** "inline" (one row, default), "columns" (a two-column grid), "pills" (the facts open the * pill row — two sites show area and bedrooms as pills). */ factStyle?: "inline" | "columns" | "pills"; /** A glyph before each fact: "none" (default; inline facts are separated by middots), * "default" (users / bed / bath / ruler / the distance kind's; no middots), "mapped" (the * defaults overridden by `factGlyphMap`). */ factGlyphs?: GlyphMode; /** Per-fact glyph overrides for "mapped" (and "default": an entry here wins). */ factGlyphMap?: Partial>; /** "badge" (score + review count, default), "star" ("★ 4,9 (12)"), "none" (a ruling against * rating display). An absent rating never renders either way. */ rating?: "badge" | "star" | "none"; /** Where the rating sits: the footer (default) or beside the title. */ ratingAt?: "footer" | "title"; /** The heart: in the location row (default), on the photo, or none (no Merkliste on the site). */ favorite?: "inline" | "photo" | "none"; /** "raised" (default), "outlined" (a hairline, no shadow), "plain" (no surface; the image keeps * its radius). CSS reads it from `data-surface`. */ surface?: "raised" | "outlined" | "plain"; /** The photo strip wraps at both ends. Default false. */ imageLoop?: boolean; /** The name's heading level. Default "none" (a `

`: a card name is a label in a list, not a * section of the page outline). */ headingLevel?: Exclude | "none"; /** The footer affordance when no price shows: "arrow" (default on showcase cards), "text" * (`cta` copy), "pick-dates" (a link to `pickDatesHref`), "none" (default on result cards). * The name is always the stretched link. */ cta?: "arrow" | "text" | "pick-dates" | "none"; /** Where "pick-dates" links. Default "#search". */ pickDatesHref?: string; /** Result cards: the stay total (default) or no price (a ruling). No per-night option: the * search states no honest nightly price. */ price?: "total" | "hidden"; /** The struck original above the total (default) or inline before it. CSS reads it from * `data-original`. */ originalPrice?: "above" | "inline"; } /** One card. Every prop is serializable (islands). */ interface RentalCardProps { /** The one card input (`cardSource` at build; a live result merged with its facts). */ source: CardSource; /** The site's one card object (`src/data/card.ts`). */ options?: RentalCardOptions; /** "showcase" (default) or "result": a result card carries `data-result-card={id}`, the status * chip, the alternative windows and the price block; a showcase card never prices. */ variant?: "showcase" | "result"; /** Gates the "alternative period" chip (true only for an exact start + end search). Default * false: no chip (SearchResults passes the search's own). */ exactSearch?: boolean; /** Result variant on the favourites page: the card is animating out (`data-state="leaving"`; * the package CSS fades it, reduced motion removes it at once). */ leaving?: boolean; /** `sizes` of the photos; follows the slot the page gives the card. Default * "(min-width: 37rem) 30rem, 82vw" (the default showcase slide). */ imageSizes?: string; /** Standalone use only: inside a surface the surface's locale, voice and shared copy apply. Any * of these three makes the card resolve its own copy (from the package tables, not the * surrounding surface's overrides). */ locale?: Locale; /** German address (standalone use only, like `locale`). */ voice?: Voice; /** Overrides of SharedCopy.card / .rental (standalone use only, like `locale`). */ shared?: SharedCopyOverrides; /** On the root (`rental-card`). */ className?: string; } /** The type of `RENTAL_CARD_PARTS` (declared below): every `data-part` the card renders, each * present only when its data is; a flat array (the vocabularies grouped per block or step, * RENTAL_DETAIL_PARTS and BOOKING_PARTS, are objects keyed by name). State is an attribute: * `data-variant`, `data-surface`, `data-status` and `data-state="leaving"` on the root, `data-kind` * on facts, pills, the status chip and the CTA, `data-position` on the heart, `data-style` on facts * and rating. */ type RentalCardParts = typeof RENTAL_CARD_PARTS; /** Renders the card; server-renderable. Keeps the kit hooks (`.card-images`, `data-img-*`, * `data-dots`, `data-fav`, `data-fav-id`, `data-result-card` on result cards) because site scripts * and the blueprints gates read them. Hearts are painted by the favourites binder (the layout's * enhance() or a surface's `favoritesKey`). */ type RentalCardComponent = (props: RentalCardProps) => React.JSX.Element; declare const RENTAL_CARD_PARTS: readonly ["rental-card", "rental-card-media", "rental-card-image", "rental-card-prev", "rental-card-next", "rental-card-dots", "rental-card-status", "rental-card-badges", "rental-card-badge", "rental-card-favorite", "rental-card-location", "rental-card-title", "rental-card-link", "rental-card-blurb", "rental-card-facts", "rental-card-fact", "rental-card-pills", "rental-card-pill", "rental-card-period", "rental-card-periods", "rental-card-footer", "rental-card-rating", "rental-card-reviews", "rental-card-cta", "rental-card-price", "rental-card-price-original", "rental-card-price-total", "rental-card-nights", "rental-card-stay", "rental-card-offers"]; /** See {@link RentalCardComponent}. */ declare const RentalCard: RentalCardComponent; //#endregion export { dateFnsLocale as A, RentalCopyTable as B, I18nProviderProps as C, SharedCopyOverrides as D, SharedCopy as E, DatesCopy as F, CardCopyTable as H, GuestsCopy as I, RegionCopy as L, resolveCopy as M, resolveShared as N, SharedCopyTable as O, useI18n as P, SheetCopy as R, I18nProvider as S, SHARED_COPY as T, CardCopy as V, CopyLocale as _, RentalCardProps as a, DEFAULT_VOICE as b, FIELD_PARTS as c, HeadingLevel as d, HeadingTag as f, CommonCopy as g, SITE_EVENT_PREFIX as h, RentalCardParts as i, fill as j, Voice as k, FieldPart as l, PrimitivePart as m, RentalCard as n, Breakpoint as o, PRIMITIVE_PARTS as p, RentalCardOptions as r, ExternalLoad as s, RENTAL_CARD_PARTS as t, GlyphMode as u, CopyTable as v, Locale$1 as w, I18n as x, DEFAULT_LOCALE as y, RentalCopy as z };