@smartsoft001-mobilems/creators-shell-angular 0.0.0-stage → 2.121.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.
@@ -0,0 +1,826 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Creator, ICreatorRelated, CreatorDictValue, ICreatorTag } from '@smartsoft001-mobilems/creators-domain';
3
+ import { ICreatorsQueryDto } from '@smartsoft001-mobilems/creators-shell-dtos';
4
+ import { MsObject } from '@smartsoft001-mobilems/objects-domain';
5
+ import * as _angular_core from '@angular/core';
6
+ import { Signal, WritableSignal } from '@angular/core';
7
+ import { ICrudFilter } from '@smartsoft001/crud-shell-angular';
8
+ import { ISeoMetadata, ICatalog, ICatalogOptions, ICatalogFacade } from '@smartsoft001-mobilems/angular';
9
+
10
+ declare const CREATORS_ALPHABET: readonly ["A", "Ą", "B", "C", "Ć", "D", "E", "Ę", "F", "G", "H", "I", "J", "K", "L", "Ł", "M", "N", "Ń", "O", "Ó", "P", "Q", "R", "S", "Ś", "T", "U", "V", "W", "X", "Y", "Z", "Ź", "Ż", "#"];
11
+ type CreatorsLetter = (typeof CREATORS_ALPHABET)[number];
12
+ /**
13
+ * `sw=` prefixes queried for the `#` bucket (the API has no "not a letter" filter).
14
+ *
15
+ * `"` and `„` are deliberately absent: the API treats them as a wildcard and
16
+ * returns every creator (all 8 pages). The foreign initials (`Č`, `Š`, `Ž`) are
17
+ * the ones present in the data today; `sw` is diacritic-sensitive, so a new one
18
+ * only needs to be appended here. Prefixes without matches answer 404 and give `[]`.
19
+ */
20
+ declare const CREATORS_HASH_PREFIXES: readonly string[];
21
+ /** Index letter of a name; anything outside the polish alphabet lands in `#`. */
22
+ declare function creatorsLetterOf(name: string): CreatorsLetter;
23
+ /**
24
+ * Two-character group prefix ("Ab"); a single character when the second one is
25
+ * not a letter. A foreign second letter joins its base group ("Béraud" is "Be").
26
+ */
27
+ declare function creatorsPrefixOf(name: string): string;
28
+ interface ICreatorsPrefixGroup {
29
+ prefix: string;
30
+ items: Creator[];
31
+ }
32
+ /** Creators grouped by `creatorsPrefixOf`, groups and items in polish alphabetical order. */
33
+ declare function groupCreatorsByPrefix(items: readonly Creator[]): ICreatorsPrefixGroup[];
34
+ /**
35
+ * API prefix (`GET dictionary/Creator/prefixes/{letter}` gives `AB`, `BÉ`, `A.`)
36
+ * in the form the index shows it: `Ab`.
37
+ */
38
+ declare function creatorsDisplayPrefix(raw: string): string;
39
+ /**
40
+ * Index group of a creator, for links back to the index: the first two
41
+ * characters as the API lists them (`Ab`, `Bé`, `A.`), or the local `#` group.
42
+ */
43
+ declare function creatorsIndexPrefixOf(name: string): string;
44
+ /**
45
+ * The prefix of `prefixes` the address names (`?prefiks=`, `#Ab`), case
46
+ * ignored. Diacritics count: the API keeps `Be` and `Bé` apart.
47
+ */
48
+ declare function creatorsFindPrefix(raw: string | null, prefixes: readonly string[]): string | null;
49
+ /** `?litera=` query param to index letter; invalid or missing falls back to `A`. */
50
+ declare function parseCreatorsLetter(raw: string | null): CreatorsLetter;
51
+ /**
52
+ * DOM id of a prefix group. Hex code points keep `[`, `'` etc. selector-safe.
53
+ * `base` is the museum's own anchor prefix (sztuki uses `artysci`).
54
+ */
55
+ declare function creatorsPrefixAnchor(prefix: string, base?: string): string;
56
+ type CreatorsFragmentTarget = {
57
+ anchor: string;
58
+ } | {
59
+ letter: CreatorsLetter;
60
+ };
61
+ /**
62
+ * `#fragment` from the address to where the index should go: a group anchor
63
+ * (as written), a group prefix (`#Ba`), or a letter (`#B`), which switches
64
+ * `?litera=` first and then lands on that letter's first group.
65
+ */
66
+ declare function resolveCreatorsFragment(fragment: string, letter: CreatorsLetter, groups: readonly {
67
+ prefix: string;
68
+ anchor: string;
69
+ }[]): CreatorsFragmentTarget | null;
70
+
71
+ interface ICreatorsPage {
72
+ items: Creator[];
73
+ total: number;
74
+ pages: number;
75
+ }
76
+ interface ICreatorWorksPage {
77
+ items: MsObject[];
78
+ total: number;
79
+ }
80
+ declare class CreatorsService {
81
+ private readonly creatorsServiceHttp;
82
+ private readonly creatorsServiceConfig;
83
+ /** The `#` bucket, loaded once per `apiUrl` for its prefixes and its groups. */
84
+ private creatorsServiceHashCache;
85
+ getPage(query: ICreatorsQueryDto): Observable<ICreatorsPage>;
86
+ /** Every page at `maxPerPage=500`, in page order. */
87
+ getAll(query?: Omit<ICreatorsQueryDto, 'page' | 'maxPerPage'>): Observable<Creator[]>;
88
+ /**
89
+ * Creators on one index letter. `#` has no API filter, so it merges the
90
+ * `CREATORS_HASH_PREFIXES` searches (deduped by id). The result is re-checked with
91
+ * `creatorsLetterOf`, because `sw` also matches beyond the letter. `q` and the birth
92
+ * range go to every call.
93
+ */
94
+ getByLetter(letter: CreatorsLetter, query?: Pick<ICreatorsQueryDto, 'q' | 'birthFrom' | 'birthTo'>): Observable<Creator[]>;
95
+ /**
96
+ * Two-letter groups of an index letter (MOB-1959): the API lists them (`AB`,
97
+ * `BÉ`, `A.`), the index shows them as `Ab`. The `#` bucket has no API prefixes,
98
+ * so its groups come from the loaded entries. The prefixes endpoint and
99
+ * `lastNameSw` exist on the staging API; check the museum's API before use.
100
+ */
101
+ getPrefixes(letter: CreatorsLetter): Observable<string[]>;
102
+ /**
103
+ * Creators of one index group: every page of `lastNameSw`, in polish order.
104
+ * `#` filters its loaded entries.
105
+ */
106
+ getByIndexPrefix(letter: CreatorsLetter, prefix: string): Observable<Creator[]>;
107
+ /**
108
+ * The creator profile `creator/{id}` (MOB-1972: life years, editorial biography, portrait, lead artwork, tags and
109
+ * related lists). An API host without it answers 404, so the dictionary entry `dictionary/Creator/{id}` is read
110
+ * then. `null` when both answer 404.
111
+ */
112
+ getById(id: string | number): Observable<Creator | null>;
113
+ /** First works of a creator (`filter[creators][]`), `limit` per page; page 1 by default. */
114
+ getWorks(id: string | number, limit?: number, page?: number): Observable<ICreatorWorksPage>;
115
+ /** First page of a related list of `creator/{id}` (MOB-1963); no request for an empty one. */
116
+ getRelated(related: ICreatorRelated | null | undefined, limit: number): Observable<ICreatorWorksPage>;
117
+ /**
118
+ * `getByLetter('#')` shared by the prefixes and the groups. It is kept per `apiUrl`
119
+ * (another API loads it again); a failure is not kept.
120
+ */
121
+ private creatorsServiceGetHashCreators;
122
+ private creatorsServiceGetOne;
123
+ private creatorsServiceGetObjects;
124
+ private creatorsServiceGetRaw;
125
+ private creatorsServiceNormalise;
126
+ /** First occurrence wins: the `#` prefixes can return the same creator twice. */
127
+ private creatorsServiceUniqueById;
128
+ /** The API sends `id` as a JSON number in the list and the detail; the entity keys on a string. */
129
+ private creatorsServiceNormaliseOne;
130
+ /** The API answers 404 (`NO_RESULTS_FOR_GIVEN_QUERY`, `RECORD_NOT_FOUND`) for no data. */
131
+ private creatorsServiceOnNotFound;
132
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorsService, never>;
133
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CreatorsService>;
134
+ }
135
+
136
+ /**
137
+ * List/search url of the Creator dictionary. An empty `q=` or `sw=` empties the list (404), so blank
138
+ * values are omitted. The birth range is the only working date filter and needs `YYYY-MM-DD`.
139
+ */
140
+ declare function creatorsListUrl(apiUrl: string, query: ICreatorsQueryDto): string;
141
+ /** Works (objects) of one creator; `authors[].id` of an object is the Creator id. */
142
+ declare function creatorWorksUrl(apiUrl: string, id: string | number, page?: number, limit?: number): string;
143
+ /** Two-letter groups of an index letter (lower-case, encoded), e.g. `prefixes/b`. */
144
+ declare function creatorsPrefixesUrl(apiUrl: string, letter: string): string;
145
+ /** The creator profile (MOB-1972). Only some API hosts have it; the others answer 404. */
146
+ declare function creatorProfileUrl(apiUrl: string, id: string | number): string;
147
+ /** The Creator dictionary entry: every API host has it. */
148
+ declare function creatorDictionaryUrl(apiUrl: string, id: string | number): string;
149
+ /**
150
+ * First page of a related list of `creator/{id}` (`/api/search/Object/page/{page}?filter[…]`) with `maxPerPage`;
151
+ * `null` for a list without a path or results (no request needed).
152
+ */
153
+ declare function creatorRelatedUrl(apiUrl: string, related: ICreatorRelated | null | undefined, limit: number): string | null;
154
+
155
+ /** Label of a dictionary value: an entry gives its name, text and numbers are shown as they are. */
156
+ declare function creatorDictLabel(value: CreatorDictValue | null | undefined): string;
157
+ /**
158
+ * "Kobro, Katarzyna" gives "Katarzyna Kobro". Only with exactly one comma:
159
+ * other forms (groups, pseudonyms) stay as they are.
160
+ */
161
+ declare function creatorDisplayName(name: string | null | undefined): string;
162
+ /**
163
+ * Life years only: "1898.1.26 - 1951.2.26" gives "1898–1951". Without a period
164
+ * they come from `dateFrom`/`dateTo`. A period given as a dictionary id has no dates.
165
+ */
166
+ declare function creatorLifeYears(item: Pick<Creator, 'period' | 'dateFrom' | 'dateTo'>): string | undefined;
167
+ /** A name from the CMS can be HTML with entities: plain text, spaces collapsed. */
168
+ declare function creatorPlainName(name: string | null | undefined): string;
169
+ /** A biography as one line of text. `MuseumSeoService` decodes entities and truncates. */
170
+ declare function creatorPlainText(html: string | null | undefined): string;
171
+ /**
172
+ * Roles to show: `roleName`, else the name of a `role` object or a textual
173
+ * `role` string, then the additional roles. A numeric or id-like `role` (`366`,
174
+ * `'366'`) is never shown.
175
+ * Trimmed, empty ones dropped, deduped case-insensitively.
176
+ */
177
+ declare function creatorRoles(creator: Pick<Creator, 'role' | 'roleName' | 'additionalRoles'> | null | undefined): string[];
178
+ /** URL slug of the creator: the display name without markup. */
179
+ declare function creatorSlug(creator: Pick<Creator, 'name'>): string;
180
+ /** Router commands to the details page: `[path, id, slug]`, or `[path, id]` for an empty slug. */
181
+ declare function creatorDetailsCommands(path: string, creator: Pick<Creator, 'id' | 'name'>): string[];
182
+ /**
183
+ * Years under the name (museum-artists `artistYears`, MOB-1972): "1898 – 1951". The years of the full dates
184
+ * (`birthDate`/`deathDate`) first, then the ready `lifeYears`, then `birthYear`/`deathYear`, then the years in the
185
+ * period; `''` without any.
186
+ */
187
+ declare function creatorYears(creator: Pick<Creator, 'period' | 'lifeYears' | 'birthDate' | 'deathDate' | 'birthYear' | 'deathYear'>): string;
188
+ /**
189
+ * The biography html to show (museum-artists `artistBiography`): `editorialBiography`, then `biography`, then
190
+ * `description`, trimmed. A field that only looks filled (`<p>&nbsp;</p>`, Word's `<!--[if gte mso 9]>` blocks) is
191
+ * skipped; `''` without any.
192
+ */
193
+ declare function creatorBiography(creator: Pick<Creator, 'editorialBiography' | 'biography' | 'description'> | null | undefined): string;
194
+ /** Whether the biography is longer than the folded view (600 characters of text). */
195
+ declare function creatorIsLongBiography(html: string | null | undefined): boolean;
196
+ /** The start of the biography for the folded view: plain text, cut at a word, with an ellipsis. */
197
+ declare function creatorBiographyExcerpt(html: string | null | undefined): string;
198
+
199
+ /**
200
+ * Group letter of a name: diacritics folded (NFD), only letters and digits
201
+ * kept, the first one upper-cased. `Ł` has no decomposition, so it stays its
202
+ * own letter. No letter or digit gives `#`.
203
+ */
204
+ declare function creatorNfdLetter(name: string | null | undefined): string;
205
+ interface ICreatorsLetterGroup {
206
+ letter: string;
207
+ items: Creator[];
208
+ }
209
+ /**
210
+ * Groups A-Z (reversed for `desc`), items A-Z inside a group either way. Both
211
+ * sorts use the Polish locale, so `Ł` follows `L` (Ossolineum's code-point sort
212
+ * puts it after `Z`).
213
+ */
214
+ declare function groupCreatorsByLetter(items: readonly Creator[], desc?: boolean): ICreatorsLetterGroup[];
215
+
216
+ /** Value of the creators filter form. Years are kept as typed, `''` is unset. */
217
+ interface ICreatorsFilterValue {
218
+ phrase: string;
219
+ birthFrom: string;
220
+ birthTo: string;
221
+ }
222
+ declare const EMPTY_CREATORS_FILTER: ICreatorsFilterValue;
223
+ /** `?filter=` of the creators page: the phrase and the birth range as full dates. */
224
+ declare function creatorsFilterQueryParams(value: ICreatorsFilterValue): {
225
+ filter?: string;
226
+ };
227
+ /** Reads a parsed `?filter=` back into the form value. */
228
+ declare function creatorsFilterValueOf(filter: Pick<ICrudFilter, 'query' | 'searchText'> | null | undefined): ICreatorsFilterValue;
229
+ declare function hasCreatorsFilter(value: ICreatorsFilterValue): boolean;
230
+ /** A birth year as the API takes it: 1-4 digits, from 1 to 9999. */
231
+ declare function isCreatorsBirthYear(year: string): boolean;
232
+ /** False for a year that is not `isCreatorsBirthYear`, or a range with `from` after `to`. */
233
+ declare function isCreatorsBirthRangeValid(value: ICreatorsFilterValue): boolean;
234
+
235
+ /** SEO translation keys of a creators list page. */
236
+ interface ICreatorsListSeo {
237
+ titleKey: string;
238
+ descriptionKey: string;
239
+ /** Default `'MODEL.mainTitle'`. */
240
+ siteNameKey?: string;
241
+ url?: string;
242
+ }
243
+ /**
244
+ * List meta of a creators page, one format for the index and the filtered view of the same page:
245
+ * `capitalize(t(titleKey)) - capitalize(t(siteNameKey))`, `t(descriptionKey)`, `type: 'website'`
246
+ * and `url` only when it is set.
247
+ */
248
+ declare function creatorsListSeoMetadata(seo: ICreatorsListSeo, t: (key: string) => string): ISeoMetadata;
249
+
250
+ /** A creator as the list context keeps it: the id as a string. */
251
+ interface ICreatorRef {
252
+ id: string;
253
+ name?: string | null;
254
+ }
255
+ interface ICreatorNeighbours {
256
+ prev: ICreatorRef | null;
257
+ next: ICreatorRef | null;
258
+ }
259
+ /**
260
+ * The shown order of the last creators list (an index group or a catalog page). The details page
261
+ * reads prev/next from it; a deep link or SSR has no context and gets none.
262
+ */
263
+ declare class CreatorsListContext {
264
+ private readonly creatorsListContextItems;
265
+ readonly items: Signal<readonly ICreatorRef[]>;
266
+ /** The shown order of a list; ids are stringified (the list API sends numbers). */
267
+ set(items: readonly Pick<Creator, 'id' | 'name'>[]): void;
268
+ clear(): void;
269
+ /** Prev/next of a creator, compared as strings; none for an id outside the list. */
270
+ neighbours(id: string | number | null | undefined): ICreatorNeighbours;
271
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorsListContext, never>;
272
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CreatorsListContext>;
273
+ }
274
+
275
+ /** Page size 24, sorted by name A-Z, no letter and no filter. */
276
+ declare const CREATORS_CATALOG_DEFAULTS: ICrudFilter;
277
+ /**
278
+ * The catalog filter as a `CreatorsService.getPage` query: page and size, the phrase (`q`), the
279
+ * letter (query key `sw`), the birth range (query key `dateFrom`, `>=`/`<=`) and the name sort.
280
+ * A blank phrase or letter and an invalid birth bound are left out.
281
+ */
282
+ declare function creatorsFilterToQuery(filter: ICrudFilter | null | undefined): ICreatorsQueryDto;
283
+ interface ICreatorsFacade extends ICatalogFacade {
284
+ readonly list: Signal<Creator[]>;
285
+ /** The filter `list` was loaded with (`filter` is the requested one); `null` before the first load. */
286
+ readonly loadedFilter: Signal<ICrudFilter | null>;
287
+ }
288
+ /**
289
+ * A signal facade over `CreatorsService.getPage` for `createCatalog` (not an NgRx CRUD slice).
290
+ * A newer read cancels the older one. Call in an injection context.
291
+ */
292
+ declare function createCreatorsFacade(): ICreatorsFacade;
293
+ interface ICreatorsCatalogOptions extends Omit<ICatalogOptions, 'facade' | 'readGuard' | 'defaults'> {
294
+ /** Default `CREATORS_CATALOG_DEFAULTS`. */
295
+ defaults?: ICrudFilter;
296
+ }
297
+ interface ICreatorsCatalog extends ICatalog {
298
+ /** The loaded page, as the API sorted it. */
299
+ readonly list: Signal<Creator[]>;
300
+ /** The page grouped by NFD letter; groups reversed when it was loaded with `name-desc`. */
301
+ readonly groups: Signal<ICreatorsLetterGroup[]>;
302
+ /** The requested direction (updates at once; `groups` follows when the page loads). */
303
+ readonly sortDesc: Signal<boolean>;
304
+ /** The letter (query key `sw`), `null` without one. */
305
+ readonly startsWith: Signal<string | null>;
306
+ /** Sets the letter, or drops it for `null`/blank. */
307
+ setStartsWith(letter: string | null): void;
308
+ /** The phrase and birth range of the filter, as the form shows them. */
309
+ readonly filterValue: Signal<ICreatorsFilterValue>;
310
+ /**
311
+ * The current filter with the phrase and the birth range of `value`, first page; other query keys (the letter) are
312
+ * kept, invalid years dropped. `CreatorsCatalogBaseComponent.applyFilter` navigates to it.
313
+ */
314
+ filterFor(value: ICreatorsFilterValue): ICrudFilter;
315
+ /** One read of `filterFor(value)` in place (the url keeps its `?filter=`). */
316
+ applyFilter(value: ICreatorsFilterValue): void;
317
+ }
318
+ /**
319
+ * The filtered creators list (`/artysci?filter=…`) on `createCatalog`, with the creators facade and
320
+ * no read guard (a foreign `CrudConfig` in the injector cannot stall it). After each load it writes
321
+ * the shown order into `CreatorsListContext`. Call in an injection context.
322
+ */
323
+ declare function createCreatorsCatalog(options: ICreatorsCatalogOptions): ICreatorsCatalog;
324
+
325
+ /** `?litera=` of the index. A constant: the letter stream is a field-initialized `toSignal`. */
326
+ declare const CREATORS_INDEX_LETTER_PARAM = "litera";
327
+ /** `?prefiks=`: the two-letter group of the letter the index shows (MOB-1959). */
328
+ declare const CREATORS_INDEX_PREFIX_PARAM = "prefiks";
329
+ /**
330
+ * The index view (museum-artists MOB-1959): the letter's two-letter groups
331
+ * (`prefixes`), the group shown (`prefix`, `?prefiks=` or the first one) and its creators.
332
+ */
333
+ interface ICreatorsIndexState {
334
+ status: 'loading' | 'error' | 'success';
335
+ prefixes: string[];
336
+ prefix: string | null;
337
+ items: Creator[];
338
+ }
339
+ /** A group of the letter with its DOM anchor; only the shown group carries items. */
340
+ interface ICreatorsIndexGroup extends ICreatorsPrefixGroup {
341
+ anchor: string;
342
+ }
343
+ /**
344
+ * Logic of the creators letter index (museum-artists' `/artysci` at MOB-1959): `?litera=` picks the
345
+ * letter, `?prefiks=` its group, the address `#fragment` (`#B`, `#Ba`, an anchor) is followed once
346
+ * the group has loaded, and the mobile jump-to panel's choice is scrolled to and focused.
347
+ *
348
+ * The museum writes the HTML: a `#filtersButton` element (the focus goes back to it when the
349
+ * panel closes), a `[id]="group.anchor"` `tabindex="-1"` section for the shown group, and the
350
+ * jump-to panel bound to `changeLetter`, `selectPrefix` and `closeFilters`.
351
+ */
352
+ declare abstract class CreatorsIndexBaseComponent {
353
+ /** Anchor prefix of the groups (`tworcy-42-61`); sztuki uses `'artysci'`. Read lazily. */
354
+ protected readonly creatorsIndexAnchorBase: string;
355
+ /** SEO keys (Ossolineum's by default). Read once, after the subclass initialisers. */
356
+ protected readonly creatorsIndexSeo: ICreatorsListSeo;
357
+ private readonly creatorsIndexRoute;
358
+ private readonly creatorsIndexRouter;
359
+ private readonly creatorsIndexInjector;
360
+ private readonly creatorsIndexLocation;
361
+ private readonly creatorsIndexDocument;
362
+ private readonly creatorsIndexScroller;
363
+ private readonly creatorsIndexIsBrowser;
364
+ private readonly creatorsIndexService;
365
+ private readonly creatorsIndexListContext;
366
+ private readonly creatorsIndexSeoService;
367
+ private readonly creatorsIndexTranslate;
368
+ private readonly creatorsIndexRetry$;
369
+ /** Group picked in the jump-to panel, scrolled to once it has loaded. */
370
+ private readonly creatorsIndexPendingAnchor;
371
+ /** Last `#fragment` already scrolled to, so data reloads do not jump again. */
372
+ private creatorsIndexHandledFragment;
373
+ readonly alphabet: readonly ["A", "Ą", "B", "C", "Ć", "D", "E", "Ę", "F", "G", "H", "I", "J", "K", "L", "Ł", "M", "N", "Ń", "O", "Ó", "P", "Q", "R", "S", "Ś", "T", "U", "V", "W", "X", "Y", "Z", "Ź", "Ż", "#"];
374
+ private readonly creatorsIndexRouteState$;
375
+ readonly letter: Signal<CreatorsLetter>;
376
+ /**
377
+ * `?filter=` is present: the catalog results view owns the page and the index stays idle. The template switches
378
+ * between the index and the results view on it.
379
+ */
380
+ readonly filtered: Signal<boolean>;
381
+ private readonly creatorsIndexPrefixParam$;
382
+ private readonly creatorsIndexPrefixes$;
383
+ readonly state: Signal<ICreatorsIndexState>;
384
+ readonly groups: Signal<ICreatorsIndexGroup[]>;
385
+ readonly prefixes: Signal<string[]>;
386
+ readonly activePrefix: Signal<string | null>;
387
+ readonly activeAnchor: Signal<string | null>;
388
+ private readonly creatorsIndexFragment;
389
+ readonly filtersOpen: WritableSignal<boolean>;
390
+ /** The museum's `#filtersButton` (template ref contract). */
391
+ private readonly creatorsIndexFiltersButton;
392
+ constructor();
393
+ back(): void;
394
+ /** Scrolls to a group and moves focus to it (the router only scrolls). Browser only. */
395
+ jumpTo(anchor: string): void;
396
+ openFilters(): void;
397
+ changeLetter(letter: CreatorsLetter): void;
398
+ /** The panel's group: loaded through `?prefiks=`, then scrolled to. */
399
+ selectPrefix(prefix: string): void;
400
+ /**
401
+ * Focus moves after the next render, once the panel is gone: to the picked group once it has
402
+ * loaded, or back to the filters button (Safari does not focus a button on click).
403
+ */
404
+ closeFilters(): void;
405
+ retry(): void;
406
+ private creatorsIndexFocusFiltersButton;
407
+ private creatorsIndexApplySeo;
408
+ private creatorsIndexLoad;
409
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorsIndexBaseComponent, never>;
410
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CreatorsIndexBaseComponent, never, never, {}, {}, never, never, true, never>;
411
+ }
412
+
413
+ /**
414
+ * Logic of the mobile "go to" panel of the creators index (museum-artists'
415
+ * `index-filters-mobile`, MOB-1949/1959). The choice is a draft until `apply()`:
416
+ * another letter emits `letterChange`, a prefix of the current letter emits
417
+ * `prefixSelect`. Every way out (close, backdrop, Escape, apply) emits `closed`;
418
+ * the host removes the panel and moves the focus on.
419
+ *
420
+ * Escape is bound here (`host`), so a subclass must not bind it again.
421
+ */
422
+ declare abstract class CreatorsJumpToBaseComponent {
423
+ /**
424
+ * The header the card opens under; the first element found wins. Read after the
425
+ * first render, so an override counts.
426
+ */
427
+ protected readonly creatorsJumpToHeaderSelectors: readonly string[];
428
+ private readonly creatorsJumpToDocument;
429
+ readonly letters: _angular_core.InputSignal<readonly ("A" | "Ą" | "B" | "C" | "Ć" | "D" | "E" | "Ę" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "Ł" | "M" | "N" | "Ń" | "O" | "Ó" | "P" | "Q" | "R" | "S" | "Ś" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "Ź" | "Ż" | "#")[]>;
430
+ readonly activeLetter: _angular_core.InputSignal<"A" | "Ą" | "B" | "C" | "Ć" | "D" | "E" | "Ę" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "Ł" | "M" | "N" | "Ń" | "O" | "Ó" | "P" | "Q" | "R" | "S" | "Ś" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "Ź" | "Ż" | "#">;
431
+ /** Prefix groups of the loaded (active) letter. */
432
+ readonly prefixes: _angular_core.InputSignal<readonly string[]>;
433
+ /** Prefix the index currently shows, pre-selected. */
434
+ readonly activePrefix: _angular_core.InputSignal<string>;
435
+ readonly letterChange: _angular_core.OutputEmitterRef<"A" | "Ą" | "B" | "C" | "Ć" | "D" | "E" | "Ę" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "Ł" | "M" | "N" | "Ń" | "O" | "Ó" | "P" | "Q" | "R" | "S" | "Ś" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "Ź" | "Ż" | "#">;
436
+ readonly prefixSelect: _angular_core.OutputEmitterRef<string>;
437
+ readonly closed: _angular_core.OutputEmitterRef<void>;
438
+ readonly selectedLetter: _angular_core.WritableSignal<"A" | "Ą" | "B" | "C" | "Ć" | "D" | "E" | "Ę" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "Ł" | "M" | "N" | "Ń" | "O" | "Ó" | "P" | "Q" | "R" | "S" | "Ś" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "Ź" | "Ż" | "#">;
439
+ readonly selectedPrefix: _angular_core.WritableSignal<string>;
440
+ /** The card's top edge: the header's bottom edge, measured once the panel is rendered. */
441
+ readonly topOffset: _angular_core.WritableSignal<number>;
442
+ constructor();
443
+ selectLetter(letter: CreatorsLetter): void;
444
+ apply(): void;
445
+ close(): void;
446
+ private creatorsJumpToMeasureHeader;
447
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorsJumpToBaseComponent, never>;
448
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CreatorsJumpToBaseComponent, never, never, { "letters": { "alias": "letters"; "required": true; "isSignal": true; }; "activeLetter": { "alias": "activeLetter"; "required": true; "isSignal": true; }; "prefixes": { "alias": "prefixes"; "required": false; "isSignal": true; }; "activePrefix": { "alias": "activePrefix"; "required": false; "isSignal": true; }; }, { "letterChange": "letterChange"; "prefixSelect": "prefixSelect"; "closed": "closed"; }, never, never, true, never>;
449
+ }
450
+
451
+ interface ICreatorsCatalogPageOptions extends ICreatorsCatalogOptions {
452
+ /** Applied on creation, skipped in a search tab. */
453
+ seo?: ICreatorsListSeo;
454
+ }
455
+ /**
456
+ * Base of the filtered creators list (`/artysci?filter=…`) on `createCreatorsCatalog`: first read,
457
+ * persistence, sort/size/page, the letter, the phrase and the birth range come from `catalog`;
458
+ * the page keeps its template. The url is the source of truth for the filter: `applyFilter` navigates
459
+ * to `?filter=` (the catalog reads it), `clearAllFilters` goes back to the index (`listPath`).
460
+ *
461
+ * ```ts
462
+ * export class ResultsComponent extends CreatorsCatalogBaseComponent {
463
+ * constructor() {
464
+ * super({ persistKey: 'ARTISTS', listPath: '/artysci', seo: { titleKey: 'PAGE_TITLES.artists', descriptionKey: 'ARTISTS.metaDescription' } });
465
+ * }
466
+ * }
467
+ * ```
468
+ *
469
+ * A `#listContainer` element in the template is scrolled to after a page change from the bottom
470
+ * pagination (`bottomPageChange`), in the browser only.
471
+ */
472
+ declare abstract class CreatorsCatalogBaseComponent {
473
+ protected readonly catalog: ICreatorsCatalog;
474
+ private readonly creatorsCatalogPageTranslate;
475
+ private readonly creatorsCatalogPageRouter;
476
+ private readonly creatorsCatalogPageListPath;
477
+ private readonly creatorsCatalogPageSeoService;
478
+ private readonly creatorsCatalogPageIsBrowser;
479
+ private readonly creatorsCatalogPageListContainer;
480
+ private creatorsCatalogPageScrollAfterLoad;
481
+ /** The phrase or a birth bound is set. */
482
+ readonly hasActiveFilters: Signal<boolean>;
483
+ protected constructor(options: ICreatorsCatalogPageOptions);
484
+ pageChange(page: number): void;
485
+ bottomPageChange(page: number): void;
486
+ onLimitChange(limit: number | string): void;
487
+ sortChange(key: 'name-asc' | 'name-desc'): void;
488
+ onSearch(phrase: string): void;
489
+ /** The letter (`sw`); `null` or blank drops it. */
490
+ setStartsWith(letter: string | null): void;
491
+ /**
492
+ * Navigates to `listPath?filter=…` with the phrase and the birth range (the letter, the sort and the size kept);
493
+ * the catalog reads the new `?filter=`. Without any filter the url has no `?filter=`, so the index shows.
494
+ */
495
+ applyFilter(value: ICreatorsFilterValue): void;
496
+ retryLoad(): void;
497
+ /** Back to the index: `listPath` without parameters. */
498
+ clearAllFilters(): void;
499
+ /**
500
+ * The index's list meta (`creatorsListSeoMetadata`), not in a search tab: the canonical url of
501
+ * the list must not point at a phrase url.
502
+ */
503
+ private creatorsCatalogPageApplySeo;
504
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorsCatalogBaseComponent, never>;
505
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CreatorsCatalogBaseComponent, never, never, {}, {}, never, never, true, never>;
506
+ }
507
+
508
+ /**
509
+ * Logic of the creators filters modal: a draft of the phrase and the birth range, started from
510
+ * `value` (and again on each new `value`), applied with `apply()`. Escape closes it (bound by the
511
+ * base; a subclass must not bind it again). The museum writes the HTML.
512
+ */
513
+ declare abstract class CreatorsFiltersBaseComponent {
514
+ /** The applied filter (`catalog.filterValue()`). */
515
+ readonly value: _angular_core.InputSignal<ICreatorsFilterValue>;
516
+ readonly phrase: WritableSignal<string>;
517
+ readonly birthFrom: WritableSignal<string>;
518
+ readonly birthTo: WritableSignal<string>;
519
+ /** A year that the API does not take, or `from` after `to`. */
520
+ readonly rangeInvalid: Signal<boolean>;
521
+ readonly applied: _angular_core.OutputEmitterRef<ICreatorsFilterValue>;
522
+ readonly closed: _angular_core.OutputEmitterRef<void>;
523
+ /** Emits the trimmed draft, then `closed`; nothing while `rangeInvalid`. */
524
+ apply(): void;
525
+ /** Clears the draft; the applied filter stays until `apply()`. */
526
+ reset(): void;
527
+ close(): void;
528
+ private creatorsFiltersDraft;
529
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorsFiltersBaseComponent, never>;
530
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CreatorsFiltersBaseComponent, never, never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "applied": "applied"; "closed": "closed"; }, never, never, true, never>;
531
+ }
532
+
533
+ /**
534
+ * Logic of a creator list card: display name, life years, roles, image with the placeholder and
535
+ * the details link. The museum writes the HTML.
536
+ */
537
+ declare abstract class CreatorCardBaseComponent {
538
+ /** Details path (`/tworcy/:id/:slug`); sztuki uses `'/artysci'`. Read lazily. */
539
+ protected readonly creatorCardPath: string;
540
+ /** Image when the creator has none. Read lazily. */
541
+ protected readonly creatorCardPlaceholder: string;
542
+ private readonly creatorCardFileUrl;
543
+ readonly item: _angular_core.InputSignal<Creator>;
544
+ /** "Kobro, Katarzyna" gives "Katarzyna Kobro" (markup dropped). */
545
+ readonly displayName: Signal<string>;
546
+ /** "1898–1951"; `''` without an item or years. */
547
+ readonly lifeYears: Signal<string>;
548
+ /** Roles, comma separated. */
549
+ readonly roles: Signal<string>;
550
+ /** A string `image` as is, an `MsFile` through `FileUrlService`, else `extraData.image`, else the placeholder. */
551
+ readonly imageSrc: Signal<string>;
552
+ /** Router commands to the details page; `[]` without an item. */
553
+ readonly link: Signal<string[]>;
554
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorCardBaseComponent, never>;
555
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CreatorCardBaseComponent, never, never, { "item": { "alias": "item"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
556
+ }
557
+
558
+ /** Four rows of three, like the works category view. */
559
+ declare const CREATORS_SEARCH_LIMIT = 12;
560
+ declare const CREATORS_SEARCH_PAGE_SIZES: readonly number[];
561
+ interface ICreatorsSearchState {
562
+ status: 'loading' | 'error' | 'success';
563
+ items: Creator[];
564
+ total: number;
565
+ }
566
+ /**
567
+ * Logic of the "creators" category of the site search (`/wyszukaj/:text/artysci`): the phrase of
568
+ * the route, the page and the page size, the loaded page and the list context. The view (layout,
569
+ * toolbar, cards, pagination) stays in the museum.
570
+ *
571
+ * The request depends on the phrase, the page and the limit only. A `#results` template ref is
572
+ * scrolled to after a page change from the bottom pagination (`changePage(page, true)`), in the
573
+ * browser only.
574
+ */
575
+ declare abstract class CreatorsSearchListBaseComponent {
576
+ private readonly creatorsSearchListRoute;
577
+ private readonly creatorsSearchListService;
578
+ private readonly creatorsSearchListContext;
579
+ private readonly creatorsSearchListIsBrowser;
580
+ private readonly creatorsSearchListResults;
581
+ private readonly creatorsSearchListRetry$;
582
+ private creatorsSearchListScrollAfterLoad;
583
+ readonly pageSizes: number[];
584
+ /**
585
+ * The phrase from `wyszukaj/:text`. The category route is lazy and has no component, so `:text`
586
+ * is not on `route.parent`: the params of the whole path are merged.
587
+ */
588
+ readonly text: _angular_core.Signal<string>;
589
+ readonly limit: _angular_core.WritableSignal<number>;
590
+ /** 1-based; a new phrase or page size goes back to the first page. */
591
+ readonly page: _angular_core.WritableSignal<number>;
592
+ private readonly creatorsSearchListRequest;
593
+ readonly state: _angular_core.Signal<ICreatorsSearchState>;
594
+ readonly totalCount: _angular_core.Signal<number>;
595
+ readonly items: _angular_core.Signal<Creator[]>;
596
+ constructor();
597
+ /** `scrollToResults`: the change came from the bottom pagination, below the list. */
598
+ changePage(page: number, scrollToResults?: boolean): void;
599
+ changeLimit(limit: number): void;
600
+ retry(): void;
601
+ private creatorsSearchListLoad;
602
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorsSearchListBaseComponent, never>;
603
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CreatorsSearchListBaseComponent, never, never, {}, {}, never, never, true, never>;
604
+ }
605
+
606
+ interface ICreatorDetailsState {
607
+ status: 'loading' | 'error' | 'not-found' | 'success';
608
+ creator: Creator | null;
609
+ }
610
+ interface ICreatorDetailRow {
611
+ labelKey: string;
612
+ value: string;
613
+ }
614
+ interface ICreatorActivityPlace {
615
+ years: string;
616
+ places: string;
617
+ }
618
+ interface ICreatorAuthorityLink {
619
+ label: string;
620
+ url: string;
621
+ }
622
+ interface ICreatorGalleryImage {
623
+ src: string;
624
+ alt: string;
625
+ title?: string;
626
+ }
627
+ /** Translation keys of the details page: row labels, the SEO title parts and the museum-artists page texts. */
628
+ interface ICreatorDetailsKeys {
629
+ period: string;
630
+ birth: string;
631
+ death: string;
632
+ /** The section between the name and the site name in the title; `null` leaves it out. */
633
+ sectionKey: string | null;
634
+ siteNameKey: string;
635
+ notFoundKey: string;
636
+ /** The biography entry of the contents (`toc`). */
637
+ biographyToc: string;
638
+ /** Read out after `share()` copied the link. */
639
+ shareCopied: string;
640
+ }
641
+ /** Ossolineum's keys for the rows and the title; museum-artists' for the contents and the share (Ossolineum has neither). */
642
+ declare const CREATOR_DETAILS_KEYS: ICreatorDetailsKeys;
643
+ /** A related list of the page: the works of the creator, or a related list of `creator/{id}`. */
644
+ type CreatorRelatedKey = 'works' | 'exhibitions' | 'archives' | 'msBooks';
645
+ /** One related strip: its list, `#anchor`, heading key, cards per page and how many to load. */
646
+ interface ICreatorRelatedStripConfig {
647
+ key: CreatorRelatedKey;
648
+ anchor: string;
649
+ labelKey: string;
650
+ pageSize: number;
651
+ limit: number;
652
+ }
653
+ /** museum-artists' strips (MOB-1963), in the order of the UX board. */
654
+ declare const CREATOR_RELATED_STRIPS: readonly ICreatorRelatedStripConfig[];
655
+ /** "Show all" of a strip: router commands and the query of the full list. */
656
+ interface ICreatorRelatedStripLink {
657
+ commands: unknown[];
658
+ queryParams?: Record<string, string>;
659
+ }
660
+ /** A strip ready to show: `count` is the API total, `items` the loaded first page. */
661
+ interface ICreatorRelatedStrip<TItem = MsObject> {
662
+ key: CreatorRelatedKey;
663
+ anchor: string;
664
+ labelKey: string;
665
+ pageSize: number;
666
+ count: number;
667
+ items: TItem[];
668
+ showAll: ICreatorRelatedStripLink | null;
669
+ }
670
+ /** An entry of the page contents: the `#anchor` of a part and its heading key. */
671
+ interface ICreatorTocEntry {
672
+ anchor: string;
673
+ labelKey: string;
674
+ }
675
+ /**
676
+ * Logic of a creator details page (museum-artists' `ItemComponent`, MOB-1972/1963, and Ossolineum's sections): the
677
+ * creator of the `:id` param (`creator/{id}`, else the dictionary entry), its detail rows, years, biography (folded
678
+ * when long), portrait, lead artwork, tags, activity places, bibliography, authority links, gallery, the related
679
+ * strips (works, exhibitions, archives, MS books) and the contents, prev/next from `CreatorsListContext`, the way back
680
+ * to the index, share, the scroll to the address fragment and the SEO (also during SSR, via
681
+ * `MuseumSeoService.applyForSsr`). The museum writes the HTML.
682
+ */
683
+ declare abstract class CreatorDetailsBaseComponent<TRelatedItem = MsObject> {
684
+ /** Details path (`/tworcy/:id/:slug`); sztuki uses `'/artysci'`. Starts with `/`. Read lazily. */
685
+ protected readonly creatorDetailsPath: string;
686
+ /** Row labels, SEO title keys and the page texts. Read lazily. */
687
+ protected readonly creatorDetailsKeys: ICreatorDetailsKeys;
688
+ /** The related strips and their limits; the `works` entry also sets `works()`. Read lazily. */
689
+ protected readonly creatorDetailsRelatedStrips: readonly ICreatorRelatedStripConfig[];
690
+ /** `#anchor` of the biography in the contents. Read lazily. */
691
+ protected readonly creatorDetailsBiographyAnchor: string;
692
+ /** The objects catalog that "show all" of the works opens. Read lazily. */
693
+ protected readonly creatorDetailsObjectsPath: string;
694
+ private readonly creatorDetailsRoute;
695
+ private readonly creatorDetailsService;
696
+ private readonly creatorDetailsContext;
697
+ private readonly creatorDetailsFileUrl;
698
+ private readonly creatorDetailsSeo;
699
+ private readonly creatorDetailsTranslate;
700
+ private readonly creatorDetailsDocument;
701
+ private readonly creatorDetailsScroller;
702
+ private readonly creatorDetailsInjector;
703
+ private readonly creatorDetailsIsBrowser;
704
+ private readonly creatorDetailsRetry$;
705
+ private readonly creatorDetailsRelatedRequest$;
706
+ private readonly creatorDetailsRelated;
707
+ private readonly creatorDetailsFragment;
708
+ /** `id#fragment` already scrolled to: later data does not jump again. */
709
+ private creatorDetailsHandledFragment;
710
+ private creatorDetailsStopFragmentScroll;
711
+ readonly state: Signal<ICreatorDetailsState>;
712
+ readonly creator: Signal<Creator | null>;
713
+ /** museum-artists' name of `creator`. */
714
+ readonly artist: Signal<Creator | null>;
715
+ /** The name without markup. */
716
+ readonly plainName: Signal<string>;
717
+ /** "Kobro, Katarzyna" gives "Katarzyna Kobro", as in the page heading. */
718
+ readonly name: Signal<string>;
719
+ /** Years under the name (`creatorYears`), `''` without dates. */
720
+ readonly years: Signal<string>;
721
+ /** Roles, comma separated; a numeric role id is never shown. */
722
+ readonly roles: Signal<string>;
723
+ /** Period, birth and death (museum-artists' order), empty values dropped. */
724
+ readonly details: Signal<ICreatorDetailRow[]>;
725
+ /**
726
+ * The editorial biography, else the biography, else the description html, trimmed (`creatorBiography`); a field
727
+ * that only looks filled (`<p>&nbsp;</p>`, Word's MSO blocks) is skipped; `''` without any.
728
+ */
729
+ readonly biography: Signal<string>;
730
+ /** A biography longer than the folded view (about six lines). */
731
+ readonly foldable: Signal<boolean>;
732
+ /** Plain-text start of the biography for the folded view. */
733
+ readonly excerpt: Signal<string>;
734
+ /** The folded biography is unfolded; folded again for another biography. */
735
+ readonly expanded: _angular_core.WritableSignal<boolean>;
736
+ /** Portrait (`photo`): a ready `url`, else a MUZA file; `null` without one. */
737
+ readonly portrait: Signal<ICreatorGalleryImage | null>;
738
+ /** Lead artwork (`artworkFrame`), as `portrait`. */
739
+ readonly leadImage: Signal<ICreatorGalleryImage | null>;
740
+ /** Tags with a name. */
741
+ readonly tags: Signal<ICreatorTag[]>;
742
+ /**
743
+ * Per activity period: `from-to` years and the location names, entries with neither dropped. As in
744
+ * Ossolineum, `[]` when no period has locations; otherwise every period, years-only ones too.
745
+ */
746
+ readonly activityPlaces: Signal<ICreatorActivityPlace[]>;
747
+ /** Bibliography entries as plain text (`text`, else `html`), empty ones dropped. */
748
+ readonly bibliography: Signal<string[]>;
749
+ /** `identifier [base]` links of the authority files; only `http(s)://` URLs. */
750
+ readonly authorityLinks: Signal<ICreatorAuthorityLink[]>;
751
+ /** Signature objects, else one image of the creator, else `[]`. */
752
+ readonly gallery: Signal<ICreatorGalleryImage[]>;
753
+ /** The first works of the creator (its id only, no list filter), from the `works` strip entry. */
754
+ readonly works: Signal<MsObject[]>;
755
+ readonly worksTotal: Signal<number>;
756
+ /** Also `true` while the creator loads: the related lists are requested once it has loaded. */
757
+ readonly worksLoading: Signal<boolean>;
758
+ /** `?filter=` of the objects list with this creator, for the "all works" link. */
759
+ readonly worksListQueryParams: Signal<{
760
+ filter: string;
761
+ } | null>;
762
+ /**
763
+ * The related strips with results, in the configured order (an empty strip is left out, with its contents
764
+ * entry); `[]` while they load. Each item goes through `creatorDetailsRelatedItem`.
765
+ */
766
+ readonly strips: Signal<ICreatorRelatedStrip<TRelatedItem>[]>;
767
+ /** The contents: the biography and the strips the page has. */
768
+ readonly toc: Signal<ICreatorTocEntry[]>;
769
+ /** Read out after `share()` copied the link. */
770
+ readonly shareStatus: _angular_core.WritableSignal<string>;
771
+ /** Prev/next from the last shown list; none for a deep link, SSR or a creator outside it. */
772
+ readonly neighbours: Signal<ICreatorNeighbours>;
773
+ readonly prevCommands: Signal<string[] | null>;
774
+ readonly nextCommands: Signal<string[] | null>;
775
+ /** `[path, id, slug]` of the loaded creator; `[]` without one. */
776
+ readonly canonicalCommands: Signal<string[]>;
777
+ /** The index letter of the creator; `''` without one. */
778
+ readonly backLetter: Signal<string>;
779
+ /** The two-letter group of the creator in the index (MOB-1959); `''` without one. */
780
+ readonly backPrefix: Signal<string>;
781
+ /** The index opens on the creator's letter and two-letter group (MOB-1959). */
782
+ readonly backQueryParams: Signal<Record<string, string>>;
783
+ /** Ossolineum's section accordions; both open at first. */
784
+ readonly biographyOpen: _angular_core.WritableSignal<boolean>;
785
+ readonly bibliographyOpen: _angular_core.WritableSignal<boolean>;
786
+ constructor();
787
+ retry(): void;
788
+ /** Unfolds or folds the long biography (museum-artists' "rozwiń tekst"). */
789
+ toggleBiography(): void;
790
+ /** Opens or closes Ossolineum's biography accordion. */
791
+ toggleBiographyOpen(): void;
792
+ toggleBibliography(): void;
793
+ /** The system share, else the link to the clipboard (announced in `shareStatus`). Browser only. */
794
+ share(): Promise<void>;
795
+ /** A strip item as the museum shows it (sztuki: a result card); the object itself by default. */
796
+ protected creatorDetailsRelatedItem(item: MsObject, key: CreatorRelatedKey): TRelatedItem;
797
+ /**
798
+ * The `<title>` of a creator: `plainName - t(sectionKey) - t(siteNameKey)` (the section left out for a `null`
799
+ * `sectionKey`). Override to keep another format; sztuki keeps `name() - t('museumName')`. Called lazily, for the
800
+ * page and on the server.
801
+ */
802
+ protected creatorDetailsSeoTitle(creator: Creator): string;
803
+ private creatorDetailsLoad;
804
+ /**
805
+ * Runs from the effect, after construction, so the strip overrides are in place. A list that fails is empty;
806
+ * the rest of the page stays.
807
+ */
808
+ private creatorDetailsLoadRelated;
809
+ /**
810
+ * Scrolls to the anchor and holds it there for a moment: the lead artwork and the strips may still change the
811
+ * height above it. The user's own scroll ends the corrections. Runs after render, in the browser only.
812
+ */
813
+ private creatorDetailsScrollToFragment;
814
+ /** `creator/{id}` gives a ready `url`; a MUZA file (`filePath`) goes through `FileUrlService`. */
815
+ private creatorDetailsImageOf;
816
+ private creatorDetailsGalleryOf;
817
+ /** `creatorDetailsSeoTitle`, the plain biography (`creatorBiography`), the first image, the canonical. */
818
+ private creatorDetailsSeoOf;
819
+ private creatorDetailsFetchSsrSeo;
820
+ private creatorDetailsT;
821
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CreatorDetailsBaseComponent<any>, never>;
822
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CreatorDetailsBaseComponent<any>, never, never, {}, {}, never, never, true, never>;
823
+ }
824
+
825
+ export { CREATORS_ALPHABET, CREATORS_CATALOG_DEFAULTS, CREATORS_HASH_PREFIXES, CREATORS_INDEX_LETTER_PARAM, CREATORS_INDEX_PREFIX_PARAM, CREATORS_SEARCH_LIMIT, CREATORS_SEARCH_PAGE_SIZES, CREATOR_DETAILS_KEYS, CREATOR_RELATED_STRIPS, CreatorCardBaseComponent, CreatorDetailsBaseComponent, CreatorsCatalogBaseComponent, CreatorsFiltersBaseComponent, CreatorsIndexBaseComponent, CreatorsJumpToBaseComponent, CreatorsListContext, CreatorsSearchListBaseComponent, CreatorsService, EMPTY_CREATORS_FILTER, createCreatorsCatalog, createCreatorsFacade, creatorBiography, creatorBiographyExcerpt, creatorDetailsCommands, creatorDictLabel, creatorDictionaryUrl, creatorDisplayName, creatorIsLongBiography, creatorLifeYears, creatorNfdLetter, creatorPlainName, creatorPlainText, creatorProfileUrl, creatorRelatedUrl, creatorRoles, creatorSlug, creatorWorksUrl, creatorYears, creatorsDisplayPrefix, creatorsFilterQueryParams, creatorsFilterToQuery, creatorsFilterValueOf, creatorsFindPrefix, creatorsIndexPrefixOf, creatorsLetterOf, creatorsListSeoMetadata, creatorsListUrl, creatorsPrefixAnchor, creatorsPrefixOf, creatorsPrefixesUrl, groupCreatorsByLetter, groupCreatorsByPrefix, hasCreatorsFilter, isCreatorsBirthRangeValid, isCreatorsBirthYear, parseCreatorsLetter, resolveCreatorsFragment };
826
+ export type { CreatorRelatedKey, CreatorsFragmentTarget, CreatorsLetter, ICreatorActivityPlace, ICreatorAuthorityLink, ICreatorDetailRow, ICreatorDetailsKeys, ICreatorDetailsState, ICreatorGalleryImage, ICreatorNeighbours, ICreatorRef, ICreatorRelatedStrip, ICreatorRelatedStripConfig, ICreatorRelatedStripLink, ICreatorTocEntry, ICreatorWorksPage, ICreatorsCatalog, ICreatorsCatalogOptions, ICreatorsCatalogPageOptions, ICreatorsFacade, ICreatorsFilterValue, ICreatorsIndexGroup, ICreatorsIndexState, ICreatorsLetterGroup, ICreatorsListSeo, ICreatorsPage, ICreatorsPrefixGroup, ICreatorsSearchState };