@cavuno/board 3.1.0 → 4.0.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.
Files changed (77) hide show
  1. package/CHANGELOG.md +421 -0
  2. package/README.md +6 -2
  3. package/dist/{_spec-nkWAraS0.d.mts → _spec-GVe6WAfT.d.mts} +68 -59
  4. package/dist/{_spec-nkWAraS0.d.ts → _spec-GVe6WAfT.d.ts} +68 -59
  5. package/dist/bin.mjs +7 -2
  6. package/dist/blog-BsmKizpd.d.ts +29 -0
  7. package/dist/blog-Cf64mI8A.d.mts +29 -0
  8. package/dist/{salaries-BahBpxWT.d.ts → board-DUhgiacm.d.ts} +17 -29
  9. package/dist/{salaries-ChSqDBAM.d.mts → board-GGWJ4coe.d.mts} +17 -29
  10. package/dist/breadcrumbs-DFKr0HzU.d.mts +372 -0
  11. package/dist/breadcrumbs-DiccJhk4.d.ts +372 -0
  12. package/dist/chunk-2ETP5UH4.mjs +271 -0
  13. package/dist/chunk-BGKNXG4H.mjs +146 -0
  14. package/dist/chunk-DLSO6XXY.mjs +33 -0
  15. package/dist/chunk-T2KC6XGV.mjs +1060 -0
  16. package/dist/chunk-YEAQ3JEI.mjs +853 -0
  17. package/dist/doctor.js +1 -1
  18. package/dist/doctor.mjs +1 -1
  19. package/dist/filters.d.mts +25 -20
  20. package/dist/filters.d.ts +25 -20
  21. package/dist/filters.js +3 -692
  22. package/dist/filters.mjs +3 -690
  23. package/dist/format.d.mts +57 -230
  24. package/dist/format.d.ts +57 -230
  25. package/dist/format.js +355 -927
  26. package/dist/format.mjs +213 -931
  27. package/dist/go.js +11 -1
  28. package/dist/go.mjs +4 -29
  29. package/dist/index.d.mts +23 -75
  30. package/dist/index.d.ts +23 -75
  31. package/dist/index.js +11 -36
  32. package/dist/index.mjs +32 -313
  33. package/dist/{jobs-lVvKCBCU.d.mts → jobs-BuLpV8iy.d.mts} +4 -4
  34. package/dist/{jobs-BiEvL9d7.d.ts → jobs-QrbXOYB9.d.ts} +4 -4
  35. package/dist/paths.d.mts +89 -1
  36. package/dist/paths.d.ts +89 -1
  37. package/dist/paths.js +62 -14
  38. package/dist/paths.mjs +29 -78
  39. package/dist/route-contract.js +23 -13
  40. package/dist/route-contract.mjs +30 -1079
  41. package/dist/{search-CCyFWPi3.d.mts → search-Cr4noJJZ.d.mts} +14 -3
  42. package/dist/{search-CyRvVMUp.d.ts → search-DdsniXQv.d.ts} +14 -3
  43. package/dist/seo.d.mts +33 -189
  44. package/dist/seo.d.ts +33 -189
  45. package/dist/seo.js +197 -718
  46. package/dist/seo.mjs +44 -1417
  47. package/dist/server.d.mts +5 -5
  48. package/dist/server.d.ts +5 -5
  49. package/dist/server.mjs +5 -31
  50. package/dist/sitemap.d.mts +5 -5
  51. package/dist/sitemap.d.ts +5 -5
  52. package/dist/sitemap.js +25 -14
  53. package/dist/sitemap.mjs +22 -97
  54. package/dist/skills.js +1 -1
  55. package/dist/skills.mjs +1 -1
  56. package/dist/suggest.d.mts +2 -2
  57. package/dist/suggest.d.ts +2 -2
  58. package/dist/suggest.js +17 -3
  59. package/dist/suggest.mjs +17 -3
  60. package/dist/well-known.js +23 -13
  61. package/dist/well-known.mjs +4 -421
  62. package/package.json +5 -4
  63. package/skills/cavuno-board-applications/SKILL.md +4 -1
  64. package/skills/cavuno-board-filters/SKILL.md +11 -12
  65. package/skills/cavuno-board-format/SKILL.md +68 -56
  66. package/skills/cavuno-board-i18n/SKILL.md +102 -21
  67. package/skills/cavuno-board-search-suggestions/SKILL.md +8 -3
  68. package/skills/cavuno-board-seo/BLOG.md +4 -1
  69. package/skills/cavuno-board-seo/JOB_AND_BREADCRUMBS.md +5 -2
  70. package/skills/cavuno-board-seo/LISTING.md +35 -12
  71. package/skills/cavuno-board-seo/SALARY.md +83 -18
  72. package/skills/cavuno-board-seo/SKILL.md +3 -2
  73. package/skills/manifest.json +3 -3
  74. package/dist/board-NE98PlwN.d.ts +0 -16
  75. package/dist/board-muu8BI8P.d.mts +0 -16
  76. package/dist/ui-copy-CCkz6CVF.d.mts +0 -230
  77. package/dist/ui-copy-CCkz6CVF.d.ts +0 -230
@@ -1,16 +0,0 @@
1
- import { S as Schemas } from './_spec-nkWAraS0.js';
2
-
3
- type PublicBoard = Schemas['PublicBoardContext'];
4
- type PublicBoardFeatures = PublicBoard['features'];
5
- type PublicBoardAnalytics = PublicBoard['analytics'];
6
- /**
7
- * An operator-defined custom job-field definition. Board-wide;
8
- * use it to render and localize a job's opaque `customFieldValues` (resolve
9
- * option `key`s → labels, honour field `type` and display order). Shared with
10
- * the Operator API's custom-field surface (one canonical schema).
11
- */
12
- type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
13
- type CustomFieldType = CustomFieldDefinition['type'];
14
- type CustomFieldOption = Schemas['CustomFieldOption'];
15
-
16
- export type { CustomFieldDefinition as C, PublicBoard as P, CustomFieldOption as a, CustomFieldType as b, PublicBoardAnalytics as c, PublicBoardFeatures as d };
@@ -1,16 +0,0 @@
1
- import { S as Schemas } from './_spec-nkWAraS0.mjs';
2
-
3
- type PublicBoard = Schemas['PublicBoardContext'];
4
- type PublicBoardFeatures = PublicBoard['features'];
5
- type PublicBoardAnalytics = PublicBoard['analytics'];
6
- /**
7
- * An operator-defined custom job-field definition. Board-wide;
8
- * use it to render and localize a job's opaque `customFieldValues` (resolve
9
- * option `key`s → labels, honour field `type` and display order). Shared with
10
- * the Operator API's custom-field surface (one canonical schema).
11
- */
12
- type CustomFieldDefinition = Schemas['CustomFieldDefinition'];
13
- type CustomFieldType = CustomFieldDefinition['type'];
14
- type CustomFieldOption = Schemas['CustomFieldOption'];
15
-
16
- export type { CustomFieldDefinition as C, PublicBoard as P, CustomFieldOption as a, CustomFieldType as b, PublicBoardAnalytics as c, PublicBoardFeatures as d };
@@ -1,230 +0,0 @@
1
- /**
2
- * The board-chrome copy CATALOG — every user-visible string the
3
- * registry blocks (and the starter's public routes) render, as a typed
4
- * record per board language, beside the salary lexicon it patterns after:
5
- * plain strings plus functions-per-key where counts/interpolation demand it.
6
- * No i18n runtime, no provider — pure and RSC-safe.
7
- *
8
- * Resolution order (mirrors the hosted `BoardLabels` semantics exactly):
9
- * catalog floor (this file) ⊕ API-served operator overrides
10
- * (`board.context().labels`, the stored `jobBoardSettings.config.*Labels`
11
- * records) ⊕ per-board generated-code overrides. `uiCopy(language, labels)`
12
- * performs the first two; overrides use the hosted `nestedStr` rule — an
13
- * absent, non-string, or blank value never wins.
14
- *
15
- * Languages: `en` is the SOURCE — byte-identical to what the registry
16
- * blocks rendered before the catalog existed (en boards do not change), and
17
- * to the hosted defaults for the route-level groups (nav/footer/breadcrumbs/
18
- * pagination/blog). `de` is transcribed from startup-insider's stored
19
- * operator overrides (prod, 2026-07-03) with native fills in the same
20
- * informal register for the keys the golden tenant left at English defaults;
21
- * board-brand-specific values (e.g. its "© … GmbH" copyright) stay operator
22
- * data, not catalog floor. `fr` is a fresh set with no golden board behind
23
- * it — the abstraction-prover. Unseeded languages fall back to `en`.
24
- *
25
- * Override-key alignment: within each group, keys that have a hosted stored
26
- * counterpart carry the hosted key NAME (e.g. `featuredLabel`,
27
- * `keywordPlaceholder`), so applying a stored override record is a plain
28
- * same-key merge — no mapping table to drift. Keys with no hosted
29
- * counterpart yet are new names in the same style; they become overridable
30
- * the day hosted stores them.
31
- */
32
- /**
33
- * The public-surfaces label groups (stored `jobBoardSettings.config` group
34
- * names) that ride the v1 board context as the `labels` bag. CANONICAL —
35
- * the API's server-side allowlist must list the same names.
36
- */
37
- declare const PUBLIC_LABEL_GROUPS: readonly ["jobCardLabels", "navLabels", "breadcrumbsLabels", "footerLabels", "entityLabels", "jobSearchLabels", "globalPaginationLabels", "blogSharedLabels", "salaryLabels"];
38
- /**
39
- * The operator-override bag as served by `GET /v1/boards/:identifier`
40
- * (`labels`): the stored `jobBoardSettings.config` label records, verbatim,
41
- * keyed by their config group names. Boards without overrides serve `{}`.
42
- */
43
- type BoardLabelOverrides = Partial<Record<(typeof PUBLIC_LABEL_GROUPS)[number], Record<string, string>>>;
44
- interface JobCardCopy {
45
- featuredLabel: string;
46
- aiRankedLabel: string;
47
- sortNewestLabel: string;
48
- sortSalaryHighLabel: string;
49
- }
50
- interface JobSearchCopy {
51
- headingJobs: string;
52
- keywordLabel: string;
53
- keywordPlaceholder: string;
54
- locationLabel: string;
55
- locationPlaceholder: string;
56
- workplacePlaceholder: string;
57
- anyWorkplaceLabel: string;
58
- typePlaceholder: string;
59
- anyTypeLabel: string;
60
- sortPlaceholder: string;
61
- loadMoreLabel: string;
62
- noJobsMatchText: string;
63
- }
64
- interface JobDetailCopy {
65
- categoriesHeading: string;
66
- skillsHeading: string;
67
- additionalDetailsHeading: string;
68
- customFieldYesLabel: string;
69
- customFieldNoLabel: string;
70
- locationsLabel: string;
71
- workPermitsLabel: string;
72
- timezonesLabel: string;
73
- educationLabel: string;
74
- experienceLabel: string;
75
- worldwideLabel: string;
76
- noExperienceRequiredLabel: string;
77
- /** Fact-row value for a minimum-experience requirement, e.g. `3+ years`. */
78
- experienceYears(years: number): string;
79
- /** Header timestamp line, receives the already-formatted relative date. */
80
- posted(published: string): string;
81
- noDescriptionText: string;
82
- viewCompanyProfileLabel: string;
83
- similarJobsHeading: string;
84
- breadcrumbAriaLabel: string;
85
- }
86
- interface ApplyCopy {
87
- applyButtonText: string;
88
- applyingLabel: string;
89
- applyOnEmployerSiteLabel: string;
90
- signInToApplyLabel: string;
91
- verifyEmailToApplyLabel: string;
92
- appliedViewApplicationsLabel: string;
93
- applicationSubmitError: string;
94
- }
95
- interface AlertsCopy {
96
- jobAlertTitle: string;
97
- jobAlertEmailPlaceholder: string;
98
- jobAlertButtonText: string;
99
- subscribingLabel: string;
100
- jobAlertSuccessToast: string;
101
- jobAlertErrorToast: string;
102
- sectionAriaLabel: string;
103
- emailAriaLabel: string;
104
- submitAriaLabel: string;
105
- }
106
- interface CopyLinkCopy {
107
- copyLinkLabel: string;
108
- copiedLabel: string;
109
- ariaLabel: string;
110
- }
111
- interface SalaryCopy {
112
- /** Headline over the average range — hosted `comparisonHeadlineAverage`. */
113
- comparisonHeadlineAverage: string;
114
- perYearSuffix: string;
115
- comparisonPercentile25Label: string;
116
- medianLabel: string;
117
- comparisonPercentile75Label: string;
118
- basedOnLabel: string;
119
- seniorityTableHeaderLevel: string;
120
- seniorityTableHeaderAvg: string;
121
- boardBaselineLabel: string;
122
- /** Diff column header of the seniority table — hosted `seniorityTableHeaderDiff`. */
123
- seniorityTableHeaderDiff: string;
124
- faqHeading: string;
125
- }
126
- interface NavCopy {
127
- home: string;
128
- companies: string;
129
- pricing: string;
130
- talent: string;
131
- post: string;
132
- blog: string;
133
- }
134
- interface FooterCopy {
135
- forCandidatesHeading: string;
136
- forCompaniesHeading: string;
137
- resourcesHeading: string;
138
- aboutHeading: string;
139
- websiteLabel: string;
140
- aboutLabel: string;
141
- contactLabel: string;
142
- locationsLabel: string;
143
- salariesLabel: string;
144
- sitemapLabel: string;
145
- termsOfServiceLabel: string;
146
- privacyPolicyLabel: string;
147
- cookiePolicyLabel: string;
148
- impressumLabel: string;
149
- allRightsReservedText: string;
150
- /** Template, supports `{{year}}` and `{{board_name}}`. */
151
- copyrightPrefix: string;
152
- poweredByText: string;
153
- /** Template, supports `{{board_name}}`. */
154
- defaultDescription: string;
155
- }
156
- interface BreadcrumbsCopy {
157
- home: string;
158
- jobs: string;
159
- locations: string;
160
- salaries: string;
161
- companies: string;
162
- skills: string;
163
- titles: string;
164
- blog: string;
165
- post: string;
166
- pricing: string;
167
- about: string;
168
- impressum: string;
169
- termsOfService: string;
170
- privacyPolicy: string;
171
- cookiePolicy: string;
172
- talent: string;
173
- }
174
- interface PaginationCopy {
175
- ariaLabel: string;
176
- previousLabel: string;
177
- nextLabel: string;
178
- }
179
- interface BlogCopy {
180
- bylineLabel: string;
181
- readingTimeLabel: string;
182
- searchLabel: string;
183
- searchPlaceholder: string;
184
- clearButtonLabel: string;
185
- tagFilterLabel: string;
186
- tagFilterAllLabel: string;
187
- emptyTitle: string;
188
- emptyDescription: string;
189
- emptyResetLabel: string;
190
- }
191
- /**
192
- * Entity nouns for count lines (`{count} {jobs}`). Lowercase in `en` —
193
- * the registry blocks' existing inline form — where the hosted defaults
194
- * capitalize; German capitalizes its nouns either way.
195
- */
196
- interface EntityCopy {
197
- jobSingular: string;
198
- jobPlural: string;
199
- companySingular: string;
200
- companyPlural: string;
201
- }
202
- interface UiCopy {
203
- jobCard: JobCardCopy;
204
- jobSearch: JobSearchCopy;
205
- jobDetail: JobDetailCopy;
206
- apply: ApplyCopy;
207
- alerts: AlertsCopy;
208
- copyLink: CopyLinkCopy;
209
- salary: SalaryCopy;
210
- nav: NavCopy;
211
- footer: FooterCopy;
212
- breadcrumbs: BreadcrumbsCopy;
213
- pagination: PaginationCopy;
214
- blog: BlogCopy;
215
- entity: EntityCopy;
216
- }
217
- /**
218
- * Resolve the chrome copy for a board language ⊕ its operator overrides
219
- * (`board.context().labels`). Unseeded languages fall back to the English
220
- * source. Pure and RSC-safe — call it wherever the `language` prop already
221
- * flows.
222
- *
223
- * @example
224
- * uiCopy('de').jobCard.featuredLabel; // "Hervorgehoben"
225
- * uiCopy('de', board.labels).jobCard.featuredLabel; // "Top Job" (override)
226
- * uiCopy('xx').jobCard.featuredLabel; // "Featured" (fallback)
227
- */
228
- declare function uiCopy(language: string | undefined, labels?: BoardLabelOverrides): UiCopy;
229
-
230
- export { type AlertsCopy as A, type BoardLabelOverrides as B, type CopyLinkCopy as C, type EntityCopy as E, type FooterCopy as F, type JobCardCopy as J, type NavCopy as N, PUBLIC_LABEL_GROUPS as P, type SalaryCopy as S, type UiCopy as U, type ApplyCopy as a, type BlogCopy as b, type BreadcrumbsCopy as c, type JobDetailCopy as d, type JobSearchCopy as e, type PaginationCopy as f, uiCopy as u };
@@ -1,230 +0,0 @@
1
- /**
2
- * The board-chrome copy CATALOG — every user-visible string the
3
- * registry blocks (and the starter's public routes) render, as a typed
4
- * record per board language, beside the salary lexicon it patterns after:
5
- * plain strings plus functions-per-key where counts/interpolation demand it.
6
- * No i18n runtime, no provider — pure and RSC-safe.
7
- *
8
- * Resolution order (mirrors the hosted `BoardLabels` semantics exactly):
9
- * catalog floor (this file) ⊕ API-served operator overrides
10
- * (`board.context().labels`, the stored `jobBoardSettings.config.*Labels`
11
- * records) ⊕ per-board generated-code overrides. `uiCopy(language, labels)`
12
- * performs the first two; overrides use the hosted `nestedStr` rule — an
13
- * absent, non-string, or blank value never wins.
14
- *
15
- * Languages: `en` is the SOURCE — byte-identical to what the registry
16
- * blocks rendered before the catalog existed (en boards do not change), and
17
- * to the hosted defaults for the route-level groups (nav/footer/breadcrumbs/
18
- * pagination/blog). `de` is transcribed from startup-insider's stored
19
- * operator overrides (prod, 2026-07-03) with native fills in the same
20
- * informal register for the keys the golden tenant left at English defaults;
21
- * board-brand-specific values (e.g. its "© … GmbH" copyright) stay operator
22
- * data, not catalog floor. `fr` is a fresh set with no golden board behind
23
- * it — the abstraction-prover. Unseeded languages fall back to `en`.
24
- *
25
- * Override-key alignment: within each group, keys that have a hosted stored
26
- * counterpart carry the hosted key NAME (e.g. `featuredLabel`,
27
- * `keywordPlaceholder`), so applying a stored override record is a plain
28
- * same-key merge — no mapping table to drift. Keys with no hosted
29
- * counterpart yet are new names in the same style; they become overridable
30
- * the day hosted stores them.
31
- */
32
- /**
33
- * The public-surfaces label groups (stored `jobBoardSettings.config` group
34
- * names) that ride the v1 board context as the `labels` bag. CANONICAL —
35
- * the API's server-side allowlist must list the same names.
36
- */
37
- declare const PUBLIC_LABEL_GROUPS: readonly ["jobCardLabels", "navLabels", "breadcrumbsLabels", "footerLabels", "entityLabels", "jobSearchLabels", "globalPaginationLabels", "blogSharedLabels", "salaryLabels"];
38
- /**
39
- * The operator-override bag as served by `GET /v1/boards/:identifier`
40
- * (`labels`): the stored `jobBoardSettings.config` label records, verbatim,
41
- * keyed by their config group names. Boards without overrides serve `{}`.
42
- */
43
- type BoardLabelOverrides = Partial<Record<(typeof PUBLIC_LABEL_GROUPS)[number], Record<string, string>>>;
44
- interface JobCardCopy {
45
- featuredLabel: string;
46
- aiRankedLabel: string;
47
- sortNewestLabel: string;
48
- sortSalaryHighLabel: string;
49
- }
50
- interface JobSearchCopy {
51
- headingJobs: string;
52
- keywordLabel: string;
53
- keywordPlaceholder: string;
54
- locationLabel: string;
55
- locationPlaceholder: string;
56
- workplacePlaceholder: string;
57
- anyWorkplaceLabel: string;
58
- typePlaceholder: string;
59
- anyTypeLabel: string;
60
- sortPlaceholder: string;
61
- loadMoreLabel: string;
62
- noJobsMatchText: string;
63
- }
64
- interface JobDetailCopy {
65
- categoriesHeading: string;
66
- skillsHeading: string;
67
- additionalDetailsHeading: string;
68
- customFieldYesLabel: string;
69
- customFieldNoLabel: string;
70
- locationsLabel: string;
71
- workPermitsLabel: string;
72
- timezonesLabel: string;
73
- educationLabel: string;
74
- experienceLabel: string;
75
- worldwideLabel: string;
76
- noExperienceRequiredLabel: string;
77
- /** Fact-row value for a minimum-experience requirement, e.g. `3+ years`. */
78
- experienceYears(years: number): string;
79
- /** Header timestamp line, receives the already-formatted relative date. */
80
- posted(published: string): string;
81
- noDescriptionText: string;
82
- viewCompanyProfileLabel: string;
83
- similarJobsHeading: string;
84
- breadcrumbAriaLabel: string;
85
- }
86
- interface ApplyCopy {
87
- applyButtonText: string;
88
- applyingLabel: string;
89
- applyOnEmployerSiteLabel: string;
90
- signInToApplyLabel: string;
91
- verifyEmailToApplyLabel: string;
92
- appliedViewApplicationsLabel: string;
93
- applicationSubmitError: string;
94
- }
95
- interface AlertsCopy {
96
- jobAlertTitle: string;
97
- jobAlertEmailPlaceholder: string;
98
- jobAlertButtonText: string;
99
- subscribingLabel: string;
100
- jobAlertSuccessToast: string;
101
- jobAlertErrorToast: string;
102
- sectionAriaLabel: string;
103
- emailAriaLabel: string;
104
- submitAriaLabel: string;
105
- }
106
- interface CopyLinkCopy {
107
- copyLinkLabel: string;
108
- copiedLabel: string;
109
- ariaLabel: string;
110
- }
111
- interface SalaryCopy {
112
- /** Headline over the average range — hosted `comparisonHeadlineAverage`. */
113
- comparisonHeadlineAverage: string;
114
- perYearSuffix: string;
115
- comparisonPercentile25Label: string;
116
- medianLabel: string;
117
- comparisonPercentile75Label: string;
118
- basedOnLabel: string;
119
- seniorityTableHeaderLevel: string;
120
- seniorityTableHeaderAvg: string;
121
- boardBaselineLabel: string;
122
- /** Diff column header of the seniority table — hosted `seniorityTableHeaderDiff`. */
123
- seniorityTableHeaderDiff: string;
124
- faqHeading: string;
125
- }
126
- interface NavCopy {
127
- home: string;
128
- companies: string;
129
- pricing: string;
130
- talent: string;
131
- post: string;
132
- blog: string;
133
- }
134
- interface FooterCopy {
135
- forCandidatesHeading: string;
136
- forCompaniesHeading: string;
137
- resourcesHeading: string;
138
- aboutHeading: string;
139
- websiteLabel: string;
140
- aboutLabel: string;
141
- contactLabel: string;
142
- locationsLabel: string;
143
- salariesLabel: string;
144
- sitemapLabel: string;
145
- termsOfServiceLabel: string;
146
- privacyPolicyLabel: string;
147
- cookiePolicyLabel: string;
148
- impressumLabel: string;
149
- allRightsReservedText: string;
150
- /** Template, supports `{{year}}` and `{{board_name}}`. */
151
- copyrightPrefix: string;
152
- poweredByText: string;
153
- /** Template, supports `{{board_name}}`. */
154
- defaultDescription: string;
155
- }
156
- interface BreadcrumbsCopy {
157
- home: string;
158
- jobs: string;
159
- locations: string;
160
- salaries: string;
161
- companies: string;
162
- skills: string;
163
- titles: string;
164
- blog: string;
165
- post: string;
166
- pricing: string;
167
- about: string;
168
- impressum: string;
169
- termsOfService: string;
170
- privacyPolicy: string;
171
- cookiePolicy: string;
172
- talent: string;
173
- }
174
- interface PaginationCopy {
175
- ariaLabel: string;
176
- previousLabel: string;
177
- nextLabel: string;
178
- }
179
- interface BlogCopy {
180
- bylineLabel: string;
181
- readingTimeLabel: string;
182
- searchLabel: string;
183
- searchPlaceholder: string;
184
- clearButtonLabel: string;
185
- tagFilterLabel: string;
186
- tagFilterAllLabel: string;
187
- emptyTitle: string;
188
- emptyDescription: string;
189
- emptyResetLabel: string;
190
- }
191
- /**
192
- * Entity nouns for count lines (`{count} {jobs}`). Lowercase in `en` —
193
- * the registry blocks' existing inline form — where the hosted defaults
194
- * capitalize; German capitalizes its nouns either way.
195
- */
196
- interface EntityCopy {
197
- jobSingular: string;
198
- jobPlural: string;
199
- companySingular: string;
200
- companyPlural: string;
201
- }
202
- interface UiCopy {
203
- jobCard: JobCardCopy;
204
- jobSearch: JobSearchCopy;
205
- jobDetail: JobDetailCopy;
206
- apply: ApplyCopy;
207
- alerts: AlertsCopy;
208
- copyLink: CopyLinkCopy;
209
- salary: SalaryCopy;
210
- nav: NavCopy;
211
- footer: FooterCopy;
212
- breadcrumbs: BreadcrumbsCopy;
213
- pagination: PaginationCopy;
214
- blog: BlogCopy;
215
- entity: EntityCopy;
216
- }
217
- /**
218
- * Resolve the chrome copy for a board language ⊕ its operator overrides
219
- * (`board.context().labels`). Unseeded languages fall back to the English
220
- * source. Pure and RSC-safe — call it wherever the `language` prop already
221
- * flows.
222
- *
223
- * @example
224
- * uiCopy('de').jobCard.featuredLabel; // "Hervorgehoben"
225
- * uiCopy('de', board.labels).jobCard.featuredLabel; // "Top Job" (override)
226
- * uiCopy('xx').jobCard.featuredLabel; // "Featured" (fallback)
227
- */
228
- declare function uiCopy(language: string | undefined, labels?: BoardLabelOverrides): UiCopy;
229
-
230
- export { type AlertsCopy as A, type BoardLabelOverrides as B, type CopyLinkCopy as C, type EntityCopy as E, type FooterCopy as F, type JobCardCopy as J, type NavCopy as N, PUBLIC_LABEL_GROUPS as P, type SalaryCopy as S, type UiCopy as U, type ApplyCopy as a, type BlogCopy as b, type BreadcrumbsCopy as c, type JobDetailCopy as d, type JobSearchCopy as e, type PaginationCopy as f, uiCopy as u };