import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-T7gQ0ciz.mjs'; import { e as JsonLdObject } from './breadcrumbs-CFcCjuG7.mjs'; export { A as ALL_COUNTRY_CODES, B as BreadcrumbItemInput, g as FaqItem, J as JobBreadcrumb, h as JsonLdBoard, N as NumberNotation, i as SENIORITY_ORDER, j as SalaryFaqEntry, k as SalaryJsonLdOptions, l as SalaryOccupationListOptions, b as buildJobBreadcrumbs, m as buildSalaryFaq, o as companyCategorySalaryJsonLd, p as companySalaryJsonLd, q as createBreadcrumbJsonLd, r as createJobPostingJsonLd, s as crossAxisSalaryJsonLd, t as faqJsonLd, c as formatSalaryStat, d as formatSalaryStatRange, u as itemListJsonLd, v as locationSalaryJsonLd, n as normalizeWebsiteUrl, w as skillSalaryJsonLd, x as sortBySeniority, y as titleSalaryJsonLd } from './breadcrumbs-CFcCjuG7.mjs'; import './_spec-EgN7VmAI.mjs'; import './board-q0svBKW3.mjs'; import './jobs-CfrxlDMU.mjs'; /** * Blog structured data on the `@cavuno/board` wire types, transcribed from * the hosted board's builders (the hosted board implementation: * `createArticleJsonLd` + `createAuthorProfilePageJsonLd`) and tested * against them . * * JSON-LD structure is locale-neutral — no board-language parameter; every * display string is a wire value (or caller copy) passed through. */ /** * The post fields the Article builder reads — the detail `PublicBlogPost` * satisfies this. */ type ArticleJsonLdPost = Pick; /** * `Article` (+ author/publisher) for a blog post — mirrors the hosted * Article JSON-LD. * * `image` follows the hosted precedence: the post's cover (feature) image * first, then `ogImageUrl` — pass your page's OG image URL (hosted passes * its generated `/blog/:slug/og` card; OG generation itself is app-owned * per ). */ declare function createBlogArticleJsonLd({ post, boardName, permalink, ogImageUrl, }: { post: ArticleJsonLdPost; boardName: string; permalink: string; /** Fallback image when the post has no cover, e.g. your generated OG card URL. */ ogImageUrl?: string | null; }): JsonLdObject; /** * `ProfilePage` for a blog author page — the hosted shape: a `Person` main * entity (id-anchored at `#profile`, social links normalized into `sameAs`), * the author's recent posts as `hasPart` Articles, and a WriteAction * `InteractionCounter` for the post count. * * Returns `null` when the author has no name. `hasPart` URLs assume the * `/blog/:slug` post route (the hosted and starter convention). */ declare function createAuthorProfileJsonLd({ author, canonical, description, origin, posts, totalPosts, }: { author: BlogAuthorEmbed; /** Absolute canonical URL of the author page. */ canonical: string; /** Author blurb — hosted passes the bio (or its templated hero copy). */ description: string; /** Site origin for `hasPart` post URLs; `null` omits the posts. */ origin: string | null; /** The author's recent posts (newest first) — the builder keeps the first 5. */ posts: Pick[]; totalPosts: number; }): JsonLdObject | null; interface ListingHeadOptions { /** * Fully composed document title — application owns counters, particles, * word order, and separators (e.g. `1,225 Jobs | Acme`, `1.225 Jobs | Acme`, * `1,225件の求人 | 求人ボード`). The SDK does not join count/heading/board. */ title: string; origin: string; /** Absolute path of THIS page, for canonical / og:url, e.g. `/jobs/robotik`. */ path: string; /** * Meta description — fully owned by the application. Pass a sentence from * the board's copy source (page config, message catalog, template). The SDK * does not invent or case-fold this string. */ description: string; } /** * Meta/link descriptors for a jobs-listing page — caller-supplied title and * meta description, Open Graph, and ``. Framework-neutral: * map `meta`/`links` into your head manager. * * **Why `title` and `description` are both accepted composed:** a function * that takes a finished description but still composes its own title from * count/heading/boardName is incoherent — both are display sentences whose * arrangement is locale-dependent (Japanese counters, RTL order, …). */ declare function listingHead(options: ListingHeadOptions): { meta: ({ title: string; name?: undefined; content?: undefined; property?: undefined; } | { name: string; content: string; title?: undefined; property?: undefined; } | { property: string; content: string; title?: undefined; name?: undefined; })[]; links: { rel: string; href: string; }[]; }; interface JobLink { slug: string; company: { slug: string; } | null; } /** * `BreadcrumbList` (+ `ItemList` of the visible jobs) JSON-LD for a listing * page, mirroring the structural JSON-LD the hosted board emits. The rich * category set (`Occupation`/`FAQPage`/`MonetaryAmountDistribution`) lives * in `./salary` — feed it the salary detail reads. * * Empty / single-crumb trails omit `BreadcrumbList` (same min-2 rule as * `createBreadcrumbJsonLd` — an empty `itemListElement` is invalid structured * data). Job URLs go through `jobDetailPath` — `/jobs/{slug}` is always a * listing route, never a job detail; company-less jobs are dropped from the * ItemList rather than linked to an invalid path. */ declare function listingJsonLd(options: { origin: string; /** Breadcrumb trail; the current (last) page omits `path` → no `item` (schema.org). */ breadcrumbs: Array<{ name: string; path?: string; }>; jobs?: JobLink[]; }): JsonLdObject[]; export { type ArticleJsonLdPost, JsonLdObject, type ListingHeadOptions, createAuthorProfileJsonLd, createBlogArticleJsonLd, listingHead, listingJsonLd };