export { C as CurrencyDisplay, F as FormattedSalaryRange, J as JobBreadcrumb, N as NumberNotation, S as SalaryTimeframeInput, a as SalaryTimeframeValue, b as buildJobBreadcrumbs, f as formatSalaryRange, c as formatSalaryStat, d as formatSalaryStatRange, n as normalizeWebsiteUrl } from './breadcrumbs-CFcCjuG7.mjs'; import { C as CustomFieldDefinition } from './board-q0svBKW3.mjs'; import { C as CustomFieldValues } from './jobs-CfrxlDMU.mjs'; import './_spec-EgN7VmAI.mjs'; /** * Date display helpers in the board language (required leading parameter, * ) — transcribed from the hosted board's `date-labels.ts` and * tested against the hosted behavior. * * Job cards and the job-detail header render the RELATIVE form * (`formatPublishedRelativeDate` — "5 days ago"); the absolute medium date * (`formatDate`) is what hosted uses for blog metadata and detail facts. * * Invalid locales return `null` rather than English unit abbreviations * (`5d` / `5mo`) or a sign-stripped digit string. Past vs future is kept * (negative → past) so RTF can own the word. */ /** * Absolute medium date in the board language, UTC-pinned — e.g. * "Jun 24, 2026" (`en`) / "24.06.2026"-style per locale. What hosted uses * for blog metadata and detail facts; job CARDS use the relative form. * Returns `null` for missing/unparseable input. */ declare function formatDate(locale: string, value: string | number | null): string | null; /** * Relative published label — "5 days ago" (en) / "vor 5 Tagen" (de) — the * form the hosted board renders on job cards and the job-detail header. * Under one minute uses `Intl.RelativeTimeFormat` with `numeric: 'auto'` so * the board language owns "now" / "jetzt" / "maintenant". `referenceNowMs` * exists for deterministic tests. */ declare function formatPublishedRelativeDate(locale: string, value: string | number | null, referenceNowMs?: number): string | null; /** * Month-year label, e.g. "Jun 2023" — transcribed from the hosted board's * `formatMonthYear`. * * - Date-only inputs (`YYYY-MM`, `YYYY-MM-DD`) get a UTC midnight pin * (`T00:00:00.000Z`) so the UTC formatter below keeps the same calendar * month. Local midnight + `timeZone: 'UTC'` would shift western zones * back a day (e.g. Jun 1 AEST → May 31 UTC). * - Full ISO timestamps are formatted with `timeZone: 'UTC'` (same pin as * `formatDate`) so a UTC midnight never renders as the previous month * under America/Los_Angeles. * - Missing or unparseable input returns `null`, matching `formatDate` — * never the English literal `"Invalid Date"`. */ declare function formatMonthYear(locale: string, dateStr: string | null | undefined): string | null; /** * ISO 3166-1 alpha-2 country lexicon — the `country` slice of the remote- * permit taxonomy (`GET /v1/taxonomies/remote-permits`), published so a * picker on any surface offers exactly the set the API accepts. Mirrors the * platform's canonical `COUNTRIES` dataset (`world-countries` minus `KP`, * plus `XK`/Kosovo); an parity test asserts the mirror cannot * drift. Codes only — display names localize at render via * `countryOptions(language)`. */ declare const COUNTRY_CODES: readonly ["AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", "WS", "XK", "YE", "YT", "ZA", "ZM", "ZW"]; type IsoCountryCode = (typeof COUNTRY_CODES)[number]; interface CountryOption { code: IsoCountryCode; name: string; } /** * The complete country option list, display-named in the BOARD language * and sorted by that language's * collation — the shape a country picker renders. Falls back to the bare * code when the runtime cannot name a region. When the board language is * invalid or unsupported (`normalizeLocale` → `null`), returns ISO codes * as names sorted by code — never host-default English names/collation. */ declare function countryOptions(language: string): CountryOption[]; /** * Resolve a job's opaque `customFieldValues` into ordered, display-ready * entries for the "Additional details" section, matching the hosted board's * display behavior. Pure. Iterates the *definitions* (from board * context) in config order, so display order is operator-controlled, orphan * values (deleted definitions) are never inspected, and empty values drop per * field. Select values resolve their stored option KEY to the current label * (rename-safe); an option with no current match is dropped. Booleans and * numbers stay raw (discriminated `kind`) — the render layer formats them * with the board locale (`Intl.NumberFormat`, Yes/No chrome). Pre-stringifying * numbers would ship `kind: 'text'` and foreclose locale-aware formatting. * * Multi-select stays an array of resolved labels (`kind: 'multi_select'`). * Pre-joining with `Intl.ListFormat` would ship `kind: 'text'` and foreclose * locale-aware **list** formatting (short style, disjunction, separate chips) * for the same reason numbers must not be pre-stringified. The application * joins when it wants a sentence: * `new Intl.ListFormat(language, { style: 'long', type: 'conjunction' }).format(values)`. * * `language` remains the required leading parameter ( call-site * pattern / signature stability). It is not read here — multi-select no * longer joins in the SDK — but callers already pass `board.context().language` * and removing it would be a delete from the published surface. */ type CustomFieldDisplayEntry = { key: string; label: string; kind: 'text'; value: string; } | { key: string; label: string; kind: 'boolean'; value: boolean; } | { key: string; label: string; kind: 'number'; value: number; } | { key: string; label: string; kind: 'multi_select'; values: string[]; }; declare function resolveCustomFieldDisplay(language: string, definitions: CustomFieldDefinition[] | undefined, values: CustomFieldValues | undefined): CustomFieldDisplayEntry[]; export { COUNTRY_CODES, type CountryOption, type CustomFieldDisplayEntry, type IsoCountryCode, countryOptions, formatDate, formatMonthYear, formatPublishedRelativeDate, resolveCustomFieldDisplay };