@cavuno/board 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,30 @@
3
3
  This changelog records changes that affect Board API compatibility, exported
4
4
  types, runtime behavior, or supported integration patterns.
5
5
 
6
+ ## 4.2.0 — 2026-08-06
7
+
8
+ - **Board logo + favicon pack on `board.context()`**: public board context now
9
+ includes `icons` next to `logoUrl` — absolute CDN URLs (or `null`) for
10
+ `ico`, `svg`, `appleTouch`, `icon192`, `icon512`, and `iconMaskable512`.
11
+ Derived from the operator logo (Settings → General upload / logo generator).
12
+ Brand identity, not SEO infra — `board.seo()` stays ads/IndexNow/GSV/
13
+ canonical/manifest.name only. Map `icons` into root-layout favicon `<link>`
14
+ tags. Operators set the logo in Cavuno; the API resolves the pack.
15
+ - **Card `summary` on jobs, companies, and talent**: list/card models gain a
16
+ server-derived plain-text `summary: string | null` — HTML stripped, entities
17
+ decoded, cut at a sentence boundary (or word boundary with `…`). The API does
18
+ the data cleaning; consumers decide how much of the string to show.
19
+ - `PublicJobCard.summary` — denormalized at write time on
20
+ `publicJobCardDocs` (backfill migration
21
+ `jobs/migrations:backfillPublicJobCardSummary`). Independent of the
22
+ existing `?fields=+description` opt-in, which keeps working as before.
23
+ - `CompanyPublic.summary` — derived from `description` at serialization for
24
+ list, search, and similar. Detail still ships the full HTML body.
25
+ - `TalentDirectoryEntry.summary` — derived from `bio` at serialization.
26
+ - **Deprecations** (still returned; prefer `summary` for card teasers):
27
+ - `CompanyPublic.description` on list/search/similar
28
+ - `TalentDirectoryEntry.bio`
29
+
6
30
  ## 4.1.0 — 2026-08-06
7
31
 
8
32
  - **Salary null-clears on job PATCH** (operator `PATCH /v1/jobs/:id` and
@@ -438,7 +438,12 @@ interface components {
438
438
  website: string | null;
439
439
  /** @description URL of the company logo, or `null` if no logo is set. */
440
440
  logoUrl: string | null;
441
- /** @description Long-form description of the company, or `null` if not set. */
441
+ /** @description Plain-text card teaser: the operator-authored company summary when set, otherwise a derived teaser from the long-form description (HTML stripped, first sentence / word-boundary cut). `null` when neither yields anything. Prefer this over `description` for list/card renders. */
442
+ summary: string | null;
443
+ /**
444
+ * @deprecated
445
+ * @description Long-form description of the company (HTML), or `null` if not set. **Deprecated on list/search/similar responses** — prefer `summary` for card teasers. Still the full prose for detail pages (`GET …/companies/{slug}`).
446
+ */
442
447
  description: string | null;
443
448
  /** @description Total number of public-facing jobs at this company. Currently mirrors `publishedJobCount`. */
444
449
  jobCount: number;
@@ -868,7 +873,7 @@ interface components {
868
873
  */
869
874
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
870
875
  /**
871
- * @description Whether the role is on-site, hybrid, or fully remote.
876
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
872
877
  * @enum {string}
873
878
  */
874
879
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1113,7 +1118,7 @@ interface components {
1113
1118
  */
1114
1119
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
1115
1120
  /**
1116
- * @description Whether the role is on-site, hybrid, or fully remote.
1121
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
1117
1122
  * @enum {string}
1118
1123
  */
1119
1124
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1665,7 +1670,17 @@ interface components {
1665
1670
  name: string;
1666
1671
  /** @description Board language (ISO code); defaults to "en". */
1667
1672
  language: string;
1673
+ /** @description Absolute URL for the board logo, or null when unset. Operators set this under Settings → General (upload or logo generator); the website builder can manage it too. */
1668
1674
  logoUrl: string | null;
1675
+ /** @description Absolute URLs for the favicon / app-icon pack derived from the board logo (null when a variant is unset). Brand identity next to `logoUrl` — build `<link rel="icon">` tags and the web-manifest icon list from these. Not SEO infra (`board.seo()`). */
1676
+ icons: {
1677
+ ico: string | null;
1678
+ svg: string | null;
1679
+ appleTouch: string | null;
1680
+ icon192: string | null;
1681
+ icon512: string | null;
1682
+ iconMaskable512: string | null;
1683
+ };
1669
1684
  /** @description Active custom-domain hostname, or null. */
1670
1685
  primaryDomain: string | null;
1671
1686
  /** @description Whitelabel toggle (default `true`). Render the "Powered by Cavuno" badge unless `false`. */
@@ -1941,6 +1956,8 @@ interface components {
1941
1956
  salaryCurrency: string | null;
1942
1957
  salaryTimeframe: string | null;
1943
1958
  isFeatured: boolean;
1959
+ /** @description Plain-text card teaser derived from the job description (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Always present — independent of the `?fields=+description` opt-in for the long-form HTML body. Prefer this over requesting `+description` for list/card renders. */
1960
+ summary: string | null;
1944
1961
  locationLabel: string | null;
1945
1962
  /** @description Embedded company summary, or `null` if none is attached. */
1946
1963
  company: {
@@ -2403,6 +2420,12 @@ interface components {
2403
2420
  headline: string | null;
2404
2421
  location: string | null;
2405
2422
  avatarUrl: string | null;
2423
+ /** @description Plain-text card teaser derived from `bio` (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Prefer this over `bio` for directory/card renders; cards still lead with `headline` when present. */
2424
+ summary: string | null;
2425
+ /**
2426
+ * @deprecated
2427
+ * @description Long-form candidate bio. **Deprecated on directory entries** — prefer `summary` for card teasers. Still the full prose on the talent profile detail (`GET …/talent/{handle}`).
2428
+ */
2406
2429
  bio: string | null;
2407
2430
  jobSearchStatus: string | null;
2408
2431
  skills: string[];
@@ -438,7 +438,12 @@ interface components {
438
438
  website: string | null;
439
439
  /** @description URL of the company logo, or `null` if no logo is set. */
440
440
  logoUrl: string | null;
441
- /** @description Long-form description of the company, or `null` if not set. */
441
+ /** @description Plain-text card teaser: the operator-authored company summary when set, otherwise a derived teaser from the long-form description (HTML stripped, first sentence / word-boundary cut). `null` when neither yields anything. Prefer this over `description` for list/card renders. */
442
+ summary: string | null;
443
+ /**
444
+ * @deprecated
445
+ * @description Long-form description of the company (HTML), or `null` if not set. **Deprecated on list/search/similar responses** — prefer `summary` for card teasers. Still the full prose for detail pages (`GET …/companies/{slug}`).
446
+ */
442
447
  description: string | null;
443
448
  /** @description Total number of public-facing jobs at this company. Currently mirrors `publishedJobCount`. */
444
449
  jobCount: number;
@@ -868,7 +873,7 @@ interface components {
868
873
  */
869
874
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
870
875
  /**
871
- * @description Whether the role is on-site, hybrid, or fully remote.
876
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
872
877
  * @enum {string}
873
878
  */
874
879
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1113,7 +1118,7 @@ interface components {
1113
1118
  */
1114
1119
  employmentType?: "full_time" | "part_time" | "contract" | "internship" | "temporary" | "volunteer" | "other";
1115
1120
  /**
1116
- * @description Whether the role is on-site, hybrid, or fully remote.
1121
+ * @description Whether the role is on-site, hybrid, or fully remote. **Never valid on its own:** `on_site` and `hybrid` require at least one `officeLocations` entry, and `remote` requires `remotePermits` (use `[{"type":"worldwide","value":"worldwide"}]` for anywhere; `remoteTimezones` then auto-derives on POST). Sending it alone returns `400`.
1117
1122
  * @enum {string}
1118
1123
  */
1119
1124
  remoteOption?: "on_site" | "hybrid" | "remote";
@@ -1665,7 +1670,17 @@ interface components {
1665
1670
  name: string;
1666
1671
  /** @description Board language (ISO code); defaults to "en". */
1667
1672
  language: string;
1673
+ /** @description Absolute URL for the board logo, or null when unset. Operators set this under Settings → General (upload or logo generator); the website builder can manage it too. */
1668
1674
  logoUrl: string | null;
1675
+ /** @description Absolute URLs for the favicon / app-icon pack derived from the board logo (null when a variant is unset). Brand identity next to `logoUrl` — build `<link rel="icon">` tags and the web-manifest icon list from these. Not SEO infra (`board.seo()`). */
1676
+ icons: {
1677
+ ico: string | null;
1678
+ svg: string | null;
1679
+ appleTouch: string | null;
1680
+ icon192: string | null;
1681
+ icon512: string | null;
1682
+ iconMaskable512: string | null;
1683
+ };
1669
1684
  /** @description Active custom-domain hostname, or null. */
1670
1685
  primaryDomain: string | null;
1671
1686
  /** @description Whitelabel toggle (default `true`). Render the "Powered by Cavuno" badge unless `false`. */
@@ -1941,6 +1956,8 @@ interface components {
1941
1956
  salaryCurrency: string | null;
1942
1957
  salaryTimeframe: string | null;
1943
1958
  isFeatured: boolean;
1959
+ /** @description Plain-text card teaser derived from the job description (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Always present — independent of the `?fields=+description` opt-in for the long-form HTML body. Prefer this over requesting `+description` for list/card renders. */
1960
+ summary: string | null;
1944
1961
  locationLabel: string | null;
1945
1962
  /** @description Embedded company summary, or `null` if none is attached. */
1946
1963
  company: {
@@ -2403,6 +2420,12 @@ interface components {
2403
2420
  headline: string | null;
2404
2421
  location: string | null;
2405
2422
  avatarUrl: string | null;
2423
+ /** @description Plain-text card teaser derived from `bio` (HTML stripped, first sentence / word-boundary cut). `null` when there is nothing honest to show. Prefer this over `bio` for directory/card renders; cards still lead with `headline` when present. */
2424
+ summary: string | null;
2425
+ /**
2426
+ * @deprecated
2427
+ * @description Long-form candidate bio. **Deprecated on directory entries** — prefer `summary` for card teasers. Still the full prose on the talent profile detail (`GET …/talent/{handle}`).
2428
+ */
2406
2429
  bio: string | null;
2407
2430
  jobSearchStatus: string | null;
2408
2431
  skills: string[];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.js';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.mjs';
2
2
 
3
3
  /** Author shape embedded on posts (no `object` discriminator). */
4
4
  type BlogAuthorEmbed = Schemas['PublicBlogAuthorEmbed'];
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-BbLJfz1z.js';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.js';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-B8DNWEir.js';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -1,5 +1,5 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
2
- import { L as ListEnvelope, m as RelatedSearch } from './jobs-BX6d_sdd.mjs';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.mjs';
2
+ import { L as ListEnvelope, m as RelatedSearch } from './jobs-aTp9uC3a.mjs';
3
3
 
4
4
  type PublicCompany = Schemas['CompanyPublic'];
5
5
  /** A market (sector) a company operates in — name + its source slug. */
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BTEZ0uiI.js';
2
- import { P as PublicJob } from './jobs-BbLJfz1z.js';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-4vXzYDL3.js';
2
+ import { P as PublicJob } from './jobs-B8DNWEir.js';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -1,5 +1,5 @@
1
- import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-BF3Qao6J.mjs';
2
- import { P as PublicJob } from './jobs-BX6d_sdd.mjs';
1
+ import { P as PublicBoard, a as CompanyCategorySalary, b as CompanySalary, L as LocationSalaryDetail, S as SkillSalaryDetail, T as TitleSalaryDetail } from './board-CvBkK7my.mjs';
2
+ import { P as PublicJob } from './jobs-aTp9uC3a.mjs';
3
3
 
4
4
  /**
5
5
  * Wire enum for `salaryTimeframe`. Defined here (not re-exported from any
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BX6d_sdd.mjs';
2
- import './_spec-BZDv2dc5.mjs';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-aTp9uC3a.mjs';
2
+ import './_spec-BnoxU-iR.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/filters` — the canonical listing-filter vocabulary and URL
package/dist/filters.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-BbLJfz1z.js';
2
- import './_spec-BZDv2dc5.js';
1
+ import { J as JobSort, E as EmploymentType, R as RemoteOption, S as Seniority } from './jobs-B8DNWEir.js';
2
+ import './_spec-BnoxU-iR.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/filters` — the canonical listing-filter vocabulary and URL
package/dist/format.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- 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-icxRVydh.mjs';
2
- import { C as CustomFieldDefinition } from './board-BF3Qao6J.mjs';
3
- import { C as CustomFieldValues } from './jobs-BX6d_sdd.mjs';
4
- import './_spec-BZDv2dc5.mjs';
1
+ 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-Cz1sFqtV.mjs';
2
+ import { C as CustomFieldDefinition } from './board-CvBkK7my.mjs';
3
+ import { C as CustomFieldValues } from './jobs-aTp9uC3a.mjs';
4
+ import './_spec-BnoxU-iR.mjs';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/format.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- 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-SGaWth6C.js';
2
- import { C as CustomFieldDefinition } from './board-BTEZ0uiI.js';
3
- import { C as CustomFieldValues } from './jobs-BbLJfz1z.js';
4
- import './_spec-BZDv2dc5.js';
1
+ 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-Blf_rsux.js';
2
+ import { C as CustomFieldDefinition } from './board-4vXzYDL3.js';
3
+ import { C as CustomFieldValues } from './jobs-B8DNWEir.js';
4
+ import './_spec-BnoxU-iR.js';
5
5
 
6
6
  /**
7
7
  * Date display helpers in the board language (required leading parameter,
package/dist/index.d.mts CHANGED
@@ -1,12 +1,12 @@
1
- import { S as Schemas, c as components } from './_spec-BZDv2dc5.mjs';
2
- import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-OKrdAHv8.mjs';
3
- export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-OKrdAHv8.mjs';
4
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-BF3Qao6J.mjs';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-BF3Qao6J.mjs';
6
- import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-BX6d_sdd.mjs';
7
- export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-BX6d_sdd.mjs';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DyDvyQrI.mjs';
9
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-DyDvyQrI.mjs';
1
+ import { S as Schemas, c as components } from './_spec-BnoxU-iR.mjs';
2
+ import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-Cs7d8y1k.mjs';
3
+ export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-Cs7d8y1k.mjs';
4
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-CvBkK7my.mjs';
5
+ export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-CvBkK7my.mjs';
6
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-aTp9uC3a.mjs';
7
+ export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-aTp9uC3a.mjs';
8
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-DoAOCg-d.mjs';
9
+ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-DoAOCg-d.mjs';
10
10
 
11
11
  /**
12
12
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.1.0";
145
+ declare const SDK_VERSION = "4.2.0";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
@@ -679,10 +679,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
679
679
  */
680
680
  client: BoardClient;
681
681
  /**
682
- * Board context — identity, language, features, and analytics.
682
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
683
+ * features, and analytics.
683
684
  *
684
685
  * @example
685
- * const { name, language } = await board.context();
686
+ * const { name, language, logoUrl, icons } = await board.context();
686
687
  */
687
688
  context(options?: FetchOptions): Promise<{
688
689
  object: "public_board";
@@ -691,6 +692,14 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
691
692
  name: string;
692
693
  language: string;
693
694
  logoUrl: string | null;
695
+ icons: {
696
+ ico: string | null;
697
+ svg: string | null;
698
+ appleTouch: string | null;
699
+ icon192: string | null;
700
+ icon512: string | null;
701
+ iconMaskable512: string | null;
702
+ };
694
703
  primaryDomain: string | null;
695
704
  showCavunoBranding: boolean;
696
705
  features: {
@@ -726,9 +735,9 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
726
735
  };
727
736
  }>;
728
737
  /**
729
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
730
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
731
- * `indexnow-key.txt` from it.
738
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
739
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
740
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
732
741
  *
733
742
  * @example
734
743
  * const { adsTxt, canonicalBase } = await board.seo();
@@ -821,6 +830,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
821
830
  salaryCurrency: string | null;
822
831
  salaryTimeframe: string | null;
823
832
  isFeatured: boolean;
833
+ summary: string | null;
824
834
  locationLabel: string | null;
825
835
  company: {
826
836
  slug: string;
@@ -920,6 +930,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
920
930
  salaryCurrency: string | null;
921
931
  salaryTimeframe: string | null;
922
932
  isFeatured: boolean;
933
+ summary: string | null;
923
934
  locationLabel: string | null;
924
935
  company: {
925
936
  slug: string;
@@ -949,6 +960,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
949
960
  slug: string;
950
961
  website: string | null;
951
962
  logoUrl: string | null;
963
+ summary: string | null;
952
964
  description: string | null;
953
965
  jobCount: number;
954
966
  publishedJobCount: number;
@@ -963,6 +975,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
963
975
  slug: string;
964
976
  website: string | null;
965
977
  logoUrl: string | null;
978
+ summary: string | null;
966
979
  description: string | null;
967
980
  jobCount: number;
968
981
  publishedJobCount: number;
@@ -976,6 +989,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
976
989
  slug: string;
977
990
  website: string | null;
978
991
  logoUrl: string | null;
992
+ summary: string | null;
979
993
  description: string | null;
980
994
  jobCount: number;
981
995
  publishedJobCount: number;
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import { S as Schemas, c as components } from './_spec-BZDv2dc5.js';
2
- import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-7B-mVRNA.js';
3
- export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-7B-mVRNA.js';
4
- import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-BTEZ0uiI.js';
5
- export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-BTEZ0uiI.js';
6
- import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-BbLJfz1z.js';
7
- export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-BbLJfz1z.js';
8
- import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-BHx6iH3Z.js';
9
- export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-BHx6iH3Z.js';
1
+ import { S as Schemas, c as components } from './_spec-BnoxU-iR.js';
2
+ import { F as FetchOptions, S as StorageMode, B as BoardRequest, A as Awaitable, L as Logger, a as BoardClient, b as SearchSuggestQuery } from './search-Cskh-neW.js';
3
+ export { c as ACCESS_TOKEN_KEY, d as BOARD_ACCESS_GRANT_KEY, C as CompanySuggestion, e as CustomStorage, M as MarketSuggestion, R as REFRESH_TOKEN_KEY, f as SearchSuggestType, g as SuggestResult, h as SuggestionItem, T as TermSuggestion } from './search-Cskh-neW.js';
4
+ import { c as CompaniesListQuery, d as CompanyListEnvelope, e as CompaniesSearchBody, f as CompanyJobsListQuery, g as CompanySimilarQuery, h as CompanyMarketsListQuery, i as SalaryDetailQuery } from './board-4vXzYDL3.js';
5
+ export { a as CompanyCategorySalary, j as CompanyMarket, k as CompanyMarketRef, b as CompanySalary, C as CustomFieldDefinition, l as CustomFieldOption, m as CustomFieldType, L as LocationSalaryDetail, n as LocationSkillsIndex, o as LocationTitlesIndex, P as PublicBoard, p as PublicBoardAnalytics, q as PublicBoardFeatures, r as PublicCompany, s as PublicCompanyDetail, t as SalaryCompany, u as SalaryLocation, v as SalarySkill, w as SalaryTitle, x as SkillLocationSalary, y as SkillLocationsIndex, S as SkillSalaryDetail, z as TitleLocationSalary, A as TitleLocationsIndex, T as TitleSalaryDetail } from './board-4vXzYDL3.js';
6
+ import { R as RemoteOption, E as EmploymentType, S as Seniority, L as ListEnvelope, a as JobsListQuery, b as JobCardListEnvelope, c as JobsSearchBody, d as JobCardSearchEnvelope, e as JobsSimilarQuery, f as SearchEnvelope } from './jobs-B8DNWEir.js';
7
+ export { g as CustomFieldValue, C as CustomFieldValues, h as EducationRequirement, i as JobCatalogPagination, j as JobCompany, J as JobSort, O as OfficeLocation, k as OffsetPagination, P as PublicJob, l as PublicJobCard, m as RelatedSearch, n as RemotePermit, o as RemoteTimezone, p as StorefrontPagination } from './jobs-B8DNWEir.js';
8
+ import { a as BlogPostsListQuery, b as BlogSimilarQuery, c as BlogSearchBody } from './blog-D-PYhejB.js';
9
+ export { B as BlogAuthorEmbed, d as BlogTagEmbed, e as PublicBlogAdjacentPosts, f as PublicBlogAuthor, g as PublicBlogPost, P as PublicBlogPostSummary, h as PublicBlogTag } from './blog-D-PYhejB.js';
10
10
 
11
11
  /**
12
12
  * Well-known `<domain>_<snake_reason>` codes the Board API sends, grouped by
@@ -142,7 +142,7 @@ declare function paginate<Q extends Record<string, unknown>, P extends PageShape
142
142
  * constant because the package is platform-neutral and cannot read
143
143
  * package.json at runtime.
144
144
  */
145
- declare const SDK_VERSION = "4.1.0";
145
+ declare const SDK_VERSION = "4.2.0";
146
146
 
147
147
  type SavedJob = Schemas['SavedJob'];
148
148
  type SavedJobsListQuery = {
@@ -679,10 +679,11 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
679
679
  */
680
680
  client: BoardClient;
681
681
  /**
682
- * Board context — identity, language, features, and analytics.
682
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
683
+ * features, and analytics.
683
684
  *
684
685
  * @example
685
- * const { name, language } = await board.context();
686
+ * const { name, language, logoUrl, icons } = await board.context();
686
687
  */
687
688
  context(options?: FetchOptions): Promise<{
688
689
  object: "public_board";
@@ -691,6 +692,14 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
691
692
  name: string;
692
693
  language: string;
693
694
  logoUrl: string | null;
695
+ icons: {
696
+ ico: string | null;
697
+ svg: string | null;
698
+ appleTouch: string | null;
699
+ icon192: string | null;
700
+ icon512: string | null;
701
+ iconMaskable512: string | null;
702
+ };
694
703
  primaryDomain: string | null;
695
704
  showCavunoBranding: boolean;
696
705
  features: {
@@ -726,9 +735,9 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
726
735
  };
727
736
  }>;
728
737
  /**
729
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
730
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
731
- * `indexnow-key.txt` from it.
738
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
739
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
740
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
732
741
  *
733
742
  * @example
734
743
  * const { adsTxt, canonicalBase } = await board.seo();
@@ -821,6 +830,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
821
830
  salaryCurrency: string | null;
822
831
  salaryTimeframe: string | null;
823
832
  isFeatured: boolean;
833
+ summary: string | null;
824
834
  locationLabel: string | null;
825
835
  company: {
826
836
  slug: string;
@@ -920,6 +930,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
920
930
  salaryCurrency: string | null;
921
931
  salaryTimeframe: string | null;
922
932
  isFeatured: boolean;
933
+ summary: string | null;
923
934
  locationLabel: string | null;
924
935
  company: {
925
936
  slug: string;
@@ -949,6 +960,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
949
960
  slug: string;
950
961
  website: string | null;
951
962
  logoUrl: string | null;
963
+ summary: string | null;
952
964
  description: string | null;
953
965
  jobCount: number;
954
966
  publishedJobCount: number;
@@ -963,6 +975,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
963
975
  slug: string;
964
976
  website: string | null;
965
977
  logoUrl: string | null;
978
+ summary: string | null;
966
979
  description: string | null;
967
980
  jobCount: number;
968
981
  publishedJobCount: number;
@@ -976,6 +989,7 @@ declare function createBoardClient(options: CreateBoardClientOptions): {
976
989
  slug: string;
977
990
  website: string | null;
978
991
  logoUrl: string | null;
992
+ summary: string | null;
979
993
  description: string | null;
980
994
  jobCount: number;
981
995
  publishedJobCount: number;
package/dist/index.js CHANGED
@@ -312,7 +312,7 @@ async function clearSession(storage) {
312
312
  }
313
313
 
314
314
  // src/version.ts
315
- var SDK_VERSION = "4.1.0";
315
+ var SDK_VERSION = "4.2.0";
316
316
 
317
317
  // src/client.ts
318
318
  function isRawBody(body) {
@@ -2840,18 +2840,19 @@ function createBoardClient(options) {
2840
2840
  */
2841
2841
  client,
2842
2842
  /**
2843
- * Board context — identity, language, features, and analytics.
2843
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
2844
+ * features, and analytics.
2844
2845
  *
2845
2846
  * @example
2846
- * const { name, language } = await board.context();
2847
+ * const { name, language, logoUrl, icons } = await board.context();
2847
2848
  */
2848
2849
  context(options2) {
2849
2850
  return client.fetch("", options2);
2850
2851
  },
2851
2852
  /**
2852
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
2853
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
2854
- * `indexnow-key.txt` from it.
2853
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
2854
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
2855
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
2855
2856
  *
2856
2857
  * @example
2857
2858
  * const { adsTxt, canonicalBase } = await board.seo();
package/dist/index.mjs CHANGED
@@ -39,7 +39,7 @@ function toSearchParams(query) {
39
39
  }
40
40
 
41
41
  // src/version.ts
42
- var SDK_VERSION = "4.1.0";
42
+ var SDK_VERSION = "4.2.0";
43
43
 
44
44
  // src/client.ts
45
45
  function isRawBody(body) {
@@ -2537,18 +2537,19 @@ function createBoardClient(options) {
2537
2537
  */
2538
2538
  client,
2539
2539
  /**
2540
- * Board context — identity, language, features, and analytics.
2540
+ * Board context — identity, brand (`logoUrl` + favicon `icons`), language,
2541
+ * features, and analytics.
2541
2542
  *
2542
2543
  * @example
2543
- * const { name, language } = await board.context();
2544
+ * const { name, language, logoUrl, icons } = await board.context();
2544
2545
  */
2545
2546
  context(options2) {
2546
2547
  return client.fetch("", options2);
2547
2548
  },
2548
2549
  /**
2549
- * Board SEO infra — `ads.txt`, IndexNow key, Google site-verification, and
2550
- * the canonical base URL. Rebuild `robots.txt` / `ads.txt` /
2551
- * `indexnow-key.txt` from it.
2550
+ * Board SEO infra tokens — `ads.txt`, IndexNow key, Google site-verification,
2551
+ * canonical base URL, and `manifest.name`. Favicon / app-icon URLs are
2552
+ * brand identity on `board.context()` (`logoUrl` + `icons`).
2552
2553
  *
2553
2554
  * @example
2554
2555
  * const { adsTxt, canonicalBase } = await board.seo();
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.js';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.mjs';
2
2
 
3
3
  /**
4
4
  * Optional pagination metadata returned by Board API list operations.
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.mjs';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.mjs';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { S as Schemas } from './_spec-BZDv2dc5.js';
1
+ import { S as Schemas } from './_spec-BnoxU-iR.js';
2
2
 
3
3
  type Awaitable<T> = T | Promise<T>;
4
4
  /**
package/dist/seo.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DyDvyQrI.mjs';
2
- import { e as JsonLdObject } from './breadcrumbs-icxRVydh.mjs';
3
- 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-icxRVydh.mjs';
4
- import './_spec-BZDv2dc5.mjs';
5
- import './board-BF3Qao6J.mjs';
6
- import './jobs-BX6d_sdd.mjs';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-DoAOCg-d.mjs';
2
+ import { e as JsonLdObject } from './breadcrumbs-Cz1sFqtV.mjs';
3
+ 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-Cz1sFqtV.mjs';
4
+ import './_spec-BnoxU-iR.mjs';
5
+ import './board-CvBkK7my.mjs';
6
+ import './jobs-aTp9uC3a.mjs';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/seo.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-BHx6iH3Z.js';
2
- import { e as JsonLdObject } from './breadcrumbs-SGaWth6C.js';
3
- 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-SGaWth6C.js';
4
- import './_spec-BZDv2dc5.js';
5
- import './board-BTEZ0uiI.js';
6
- import './jobs-BbLJfz1z.js';
1
+ import { P as PublicBlogPostSummary, B as BlogAuthorEmbed } from './blog-D-PYhejB.js';
2
+ import { e as JsonLdObject } from './breadcrumbs-Blf_rsux.js';
3
+ 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-Blf_rsux.js';
4
+ import './_spec-BnoxU-iR.js';
5
+ import './board-4vXzYDL3.js';
6
+ import './jobs-B8DNWEir.js';
7
7
 
8
8
  /**
9
9
  * Blog structured data on the `@cavuno/board` wire types, transcribed from
package/dist/server.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-BZDv2dc5.mjs';
3
- import './search-OKrdAHv8.mjs';
4
- import './board-BF3Qao6J.mjs';
5
- import './jobs-BX6d_sdd.mjs';
6
- import './blog-DyDvyQrI.mjs';
2
+ import './_spec-BnoxU-iR.mjs';
3
+ import './search-Cs7d8y1k.mjs';
4
+ import './board-CvBkK7my.mjs';
5
+ import './jobs-aTp9uC3a.mjs';
6
+ import './blog-DoAOCg-d.mjs';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
package/dist/server.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-BZDv2dc5.js';
3
- import './search-7B-mVRNA.js';
4
- import './board-BTEZ0uiI.js';
5
- import './jobs-BbLJfz1z.js';
6
- import './blog-BHx6iH3Z.js';
2
+ import './_spec-BnoxU-iR.js';
3
+ import './search-Cskh-neW.js';
4
+ import './board-4vXzYDL3.js';
5
+ import './jobs-B8DNWEir.js';
6
+ import './blog-D-PYhejB.js';
7
7
 
8
8
  /**
9
9
  * Session cookie codec — pure (no framework imports, no node imports) so it
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.mjs';
2
- import './_spec-BZDv2dc5.mjs';
3
- import './search-OKrdAHv8.mjs';
4
- import './board-BF3Qao6J.mjs';
5
- import './jobs-BX6d_sdd.mjs';
6
- import './blog-DyDvyQrI.mjs';
2
+ import './_spec-BnoxU-iR.mjs';
3
+ import './search-Cs7d8y1k.mjs';
4
+ import './board-CvBkK7my.mjs';
5
+ import './jobs-aTp9uC3a.mjs';
6
+ import './blog-DoAOCg-d.mjs';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
package/dist/sitemap.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BoardSdk } from './index.js';
2
- import './_spec-BZDv2dc5.js';
3
- import './search-7B-mVRNA.js';
4
- import './board-BTEZ0uiI.js';
5
- import './jobs-BbLJfz1z.js';
6
- import './blog-BHx6iH3Z.js';
2
+ import './_spec-BnoxU-iR.js';
3
+ import './search-Cskh-neW.js';
4
+ import './board-4vXzYDL3.js';
5
+ import './jobs-B8DNWEir.js';
6
+ import './blog-D-PYhejB.js';
7
7
 
8
8
  /**
9
9
  * Sitemap primitives — the pure XML + bucket-filename logic behind a board
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-OKrdAHv8.mjs';
2
- import './_spec-BZDv2dc5.mjs';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cs7d8y1k.mjs';
2
+ import './_spec-BnoxU-iR.mjs';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/dist/suggest.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-7B-mVRNA.js';
2
- import './_spec-BZDv2dc5.js';
1
+ import { h as SuggestionItem, b as SearchSuggestQuery, F as FetchOptions, g as SuggestResult } from './search-Cskh-neW.js';
2
+ import './_spec-BnoxU-iR.js';
3
3
 
4
4
  /**
5
5
  * `@cavuno/board/suggest` — framework-agnostic headless search-suggest
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavuno/board",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "Build custom job boards and careers pages with Cavuno’s TypeScript SDK.",
5
5
  "keywords": [
6
6
  "api-client",
@@ -19,6 +19,18 @@ Read the matching reference completely before implementing that page:
19
19
 
20
20
  For a page that combines branches, read every matching reference.
21
21
 
22
+ ## Favicons and board logo
23
+
24
+ Brand identity — not SEO builders. Read them from `board.context()`:
25
+
26
+ ```ts
27
+ const { logoUrl, icons } = await board.context();
28
+ // logoUrl — board logo
29
+ // icons.ico / .svg / .appleTouch / .icon192 / .icon512 / .iconMaskable512
30
+ ```
31
+
32
+ `board.seo()` is infra tokens only (ads, IndexNow, verification, canonical base, optional `manifest.name`).
33
+
22
34
  Sitemaps and robots.txt use `cavuno-board-sitemap`. The host app owns OG-image
23
35
  generation and its route map. `listingHead` receives app-owned title and
24
36
  meta description copy; the SDK never composes those sentences or joins
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.1.0",
2
+ "version": "4.2.0",
3
3
  "skills": [
4
4
  {
5
5
  "name": "cavuno-board-account",