@pecb-ui/components 1.1.15 → 1.1.18
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/data-display/index.d.ts +1 -1
- package/fesm2022/pecb-ui-components-data-display.mjs +2 -2
- package/fesm2022/pecb-ui-components-data-display.mjs.map +1 -1
- package/fesm2022/pecb-ui-components.mjs +1248 -2
- package/fesm2022/pecb-ui-components.mjs.map +1 -1
- package/index.d.ts +618 -3
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { ElementRef, ChangeDetectorRef, TemplateRef, Type, OnDestroy, AfterViewInit, QueryList, OnInit, OnChanges } from '@angular/core';
|
|
3
3
|
import * as _angular_platform_browser from '@angular/platform-browser';
|
|
4
|
-
import { SafeHtml, DomSanitizer } from '@angular/platform-browser';
|
|
4
|
+
import { SafeHtml, DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
|
|
5
5
|
import { ScrollStrategy, ConnectedPosition } from '@angular/cdk/overlay';
|
|
6
6
|
import { ControlValueAccessor } from '@angular/forms';
|
|
7
7
|
import * as _pecb_ui_components from '@pecb-ui/components';
|
|
@@ -4693,6 +4693,511 @@ declare class CoursePlayerComponent {
|
|
|
4693
4693
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoursePlayerComponent, "pecb-course-player", never, { "modules": { "alias": "modules"; "required": false; "isSignal": true; }; "transcript": { "alias": "transcript"; "required": false; "isSignal": true; }; "activeLessonId": { "alias": "activeLessonId"; "required": false; "isSignal": true; }; "playing": { "alias": "playing"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "panelTab": { "alias": "panelTab"; "required": false; "isSignal": true; }; "poster": { "alias": "poster"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; "tracks": { "alias": "tracks"; "required": false; "isSignal": true; }; "stageLabel": { "alias": "stageLabel"; "required": false; "isSignal": true; }; "watermark": { "alias": "watermark"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; "preload": { "alias": "preload"; "required": false; "isSignal": true; }; "crossOrigin": { "alias": "crossOrigin"; "required": false; "isSignal": true; }; "seekStep": { "alias": "seekStep"; "required": false; "isSignal": true; }; "videoLabels": { "alias": "videoLabels"; "required": false; "isSignal": true; }; "autoPlayOnSelect": { "alias": "autoPlayOnSelect"; "required": false; "isSignal": true; }; "showLessonTitle": { "alias": "showLessonTitle"; "required": false; "isSignal": true; }; "panelPosition": { "alias": "panelPosition"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "accent": { "alias": "accent"; "required": false; "isSignal": true; }; "showTabs": { "alias": "showTabs"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "showProgress": { "alias": "showProgress"; "required": false; "isSignal": true; }; "soloSingleLessonModules": { "alias": "soloSingleLessonModules"; "required": false; "isSignal": true; }; "panelLabels": { "alias": "panelLabels"; "required": false; "isSignal": true; }; }, { "activeLessonId": "activeLessonIdChange"; "playing": "playingChange"; "currentTime": "currentTimeChange"; "panelTab": "panelTabChange"; "lessonSelect": "lessonSelect"; "lessonEnded": "lessonEnded"; "timeUpdate": "timeUpdate"; "certificateClick": "certificateClick"; "playerError": "playerError"; }, never, never, true, never>;
|
|
4694
4694
|
}
|
|
4695
4695
|
|
|
4696
|
+
/** One entry of the day switcher (mock `.sl-day` pills). */
|
|
4697
|
+
interface SlideViewerDay {
|
|
4698
|
+
/** Stable identifier handed back by `dayChange` / `activeDayId`. */
|
|
4699
|
+
id: string | number;
|
|
4700
|
+
/** Pill text, e.g. `Day 1`. */
|
|
4701
|
+
label: string;
|
|
4702
|
+
/** Free-form data for a custom day template. */
|
|
4703
|
+
meta?: Record<string, unknown>;
|
|
4704
|
+
}
|
|
4705
|
+
/**
|
|
4706
|
+
* One slide. The viewer only needs an image per slide — how the image is produced
|
|
4707
|
+
* (rendered from a PDF, exported from PowerPoint, served by a CDN) is up to the
|
|
4708
|
+
* consumer, which keeps the element free of any PDF dependency.
|
|
4709
|
+
*/
|
|
4710
|
+
interface SlideViewerSlide {
|
|
4711
|
+
/** Identifier, echoed in events and used for selection. Defaults to the 1-based index. */
|
|
4712
|
+
id?: string | number;
|
|
4713
|
+
/**
|
|
4714
|
+
* Large image shown on the stage. When missing the stage shows `thumbnail` and emits
|
|
4715
|
+
* `fullImageRequest` so the host can render it lazily.
|
|
4716
|
+
*/
|
|
4717
|
+
image?: string;
|
|
4718
|
+
/**
|
|
4719
|
+
* Small image shown in the sidebar. Falls back to `image`. While missing (a deck that
|
|
4720
|
+
* publishes every page first and renders thumbnails later) the tile shows a shimmer.
|
|
4721
|
+
*/
|
|
4722
|
+
thumbnail?: string;
|
|
4723
|
+
/** Accessible / searchable title. Defaults to `{slide} {n}` from the labels. */
|
|
4724
|
+
title?: string;
|
|
4725
|
+
/** Extracted text used by the keyword search (not rendered). */
|
|
4726
|
+
text?: string;
|
|
4727
|
+
/** Skipped by navigation while `skipHidden` is on; still listed in the sidebar (dimmed). */
|
|
4728
|
+
hidden?: boolean;
|
|
4729
|
+
/** Free-form data the consumer wants to carry along (templates receive it). */
|
|
4730
|
+
meta?: Record<string, unknown>;
|
|
4731
|
+
}
|
|
4732
|
+
/** Built-in tool buttons of the top bar, in the order they render. */
|
|
4733
|
+
type SlideViewerTool = 'notes' | 'feedback' | 'courseFiles' | 'downloadSlides';
|
|
4734
|
+
/** Where the thumbnail sidebar sits. */
|
|
4735
|
+
type SlideViewerSidebarPosition = 'end' | 'start' | 'none';
|
|
4736
|
+
/** Keyboard actions the viewer handles on its region. */
|
|
4737
|
+
type SlideViewerKeyAction = 'next' | 'previous' | 'first' | 'last' | 'fullscreen' | 'search' | 'zoomIn' | 'zoomOut' | 'zoomReset';
|
|
4738
|
+
/** Keys per action. Override any subset via the `keyMap` input; an empty array disables the action. */
|
|
4739
|
+
type SlideViewerKeyMap = Record<SlideViewerKeyAction, readonly string[]>;
|
|
4740
|
+
declare const DEFAULT_SLIDE_VIEWER_KEY_MAP: SlideViewerKeyMap;
|
|
4741
|
+
/** Payload of the `tool` output. */
|
|
4742
|
+
interface SlideViewerToolEvent {
|
|
4743
|
+
tool: SlideViewerTool;
|
|
4744
|
+
/** Slide shown when the tool was pressed (1-based). */
|
|
4745
|
+
page: number;
|
|
4746
|
+
}
|
|
4747
|
+
/** Payload of `slideChange`. */
|
|
4748
|
+
interface SlideViewerPageEvent {
|
|
4749
|
+
/** 1-based slide number. */
|
|
4750
|
+
page: number;
|
|
4751
|
+
total: number;
|
|
4752
|
+
slide: SlideViewerSlide | null;
|
|
4753
|
+
/** What triggered the change. */
|
|
4754
|
+
source: 'nav' | 'input' | 'thumbnail' | 'keyboard' | 'wheel' | 'day' | 'api';
|
|
4755
|
+
}
|
|
4756
|
+
/** Payload of `searchChange`. */
|
|
4757
|
+
interface SlideViewerSearchEvent {
|
|
4758
|
+
term: string;
|
|
4759
|
+
/** 1-based slide numbers that match (all slides when the term is empty). */
|
|
4760
|
+
matches: number[];
|
|
4761
|
+
}
|
|
4762
|
+
/** Payload of `slideMove` (drag & drop reorder in the sidebar). */
|
|
4763
|
+
interface SlideViewerMoveEvent {
|
|
4764
|
+
/** 1-based position the slide was dragged from. */
|
|
4765
|
+
from: number;
|
|
4766
|
+
/** 1-based position it was dropped at. */
|
|
4767
|
+
to: number;
|
|
4768
|
+
slide: SlideViewerSlide;
|
|
4769
|
+
}
|
|
4770
|
+
/** Context handed to a `pecbSlideViewerThumbnail` template. */
|
|
4771
|
+
interface SlideViewerThumbnailContext {
|
|
4772
|
+
$implicit: SlideViewerSlide;
|
|
4773
|
+
/** 1-based slide number. */
|
|
4774
|
+
index: number;
|
|
4775
|
+
active: boolean;
|
|
4776
|
+
selected: boolean;
|
|
4777
|
+
}
|
|
4778
|
+
/** Context handed to a `pecbSlideViewerDay` template. */
|
|
4779
|
+
interface SlideViewerDayContext {
|
|
4780
|
+
$implicit: SlideViewerDay;
|
|
4781
|
+
active: boolean;
|
|
4782
|
+
}
|
|
4783
|
+
/**
|
|
4784
|
+
* All user-visible strings. Override any subset via the `labels` input to
|
|
4785
|
+
* translate the viewer. `{n}` / `{total}` are substituted where noted.
|
|
4786
|
+
*/
|
|
4787
|
+
interface SlideViewerLabels {
|
|
4788
|
+
/** Region name for assistive tech. */
|
|
4789
|
+
viewer: string;
|
|
4790
|
+
/** Default slide title — `{n}` is the slide number. */
|
|
4791
|
+
slide: string;
|
|
4792
|
+
/** Separator text before the total, e.g. `/`. */
|
|
4793
|
+
of: string;
|
|
4794
|
+
/** Aria-label of the slide-number input. */
|
|
4795
|
+
slideNumber: string;
|
|
4796
|
+
first: string;
|
|
4797
|
+
previous: string;
|
|
4798
|
+
next: string;
|
|
4799
|
+
last: string;
|
|
4800
|
+
enterFullscreen: string;
|
|
4801
|
+
exitFullscreen: string;
|
|
4802
|
+
zoomIn: string;
|
|
4803
|
+
zoomOut: string;
|
|
4804
|
+
zoomReset: string;
|
|
4805
|
+
/** Note panel header. */
|
|
4806
|
+
note: string;
|
|
4807
|
+
days: string;
|
|
4808
|
+
thumbnails: string;
|
|
4809
|
+
searchPlaceholder: string;
|
|
4810
|
+
/** Shown while a keyword filters the list — `{n}` matches, `{total}` slides. */
|
|
4811
|
+
searchResults: string;
|
|
4812
|
+
noResults: string;
|
|
4813
|
+
loading: string;
|
|
4814
|
+
/** Aria-label of a tile checkbox in selection mode — `{n}` is the slide number. */
|
|
4815
|
+
selectSlide: string;
|
|
4816
|
+
/** Aria description of a draggable tile. */
|
|
4817
|
+
dragHint: string;
|
|
4818
|
+
/** Badge on a hidden slide's tile. */
|
|
4819
|
+
hidden: string;
|
|
4820
|
+
/** Stage message when there are no slides (and nothing is loading). */
|
|
4821
|
+
emptyTitle: string;
|
|
4822
|
+
emptyHint: string;
|
|
4823
|
+
/** Stage message while `error` is set. */
|
|
4824
|
+
errorTitle: string;
|
|
4825
|
+
errorHint: string;
|
|
4826
|
+
/** Retry button in the error state. */
|
|
4827
|
+
retry: string;
|
|
4828
|
+
/** Screen-reader announcement on slide change — `{n}` current, `{total}` count. */
|
|
4829
|
+
slideAnnouncement: string;
|
|
4830
|
+
/** Shown on the shimmering stage while `loadingProgress` is known — `{percent}` 0–100. */
|
|
4831
|
+
loadingProgress: string;
|
|
4832
|
+
notes: string;
|
|
4833
|
+
feedback: string;
|
|
4834
|
+
courseFiles: string;
|
|
4835
|
+
downloadSlides: string;
|
|
4836
|
+
/** Tooltip of the disabled download button. */
|
|
4837
|
+
downloadUnavailable: string;
|
|
4838
|
+
}
|
|
4839
|
+
declare const DEFAULT_SLIDE_VIEWER_LABELS: SlideViewerLabels;
|
|
4840
|
+
/** Default set and order of the top-bar tools. */
|
|
4841
|
+
declare const DEFAULT_SLIDE_VIEWER_TOOLS: readonly SlideViewerTool[];
|
|
4842
|
+
/** Zoom steps offered by the stage (1 = fit). */
|
|
4843
|
+
declare const DEFAULT_SLIDE_VIEWER_ZOOM_STEPS: readonly number[];
|
|
4844
|
+
/** Clamp a 1-based page into `[1, total]` (`1` when there are no slides). */
|
|
4845
|
+
declare function clampSlidePage(page: number, total: number): number;
|
|
4846
|
+
/**
|
|
4847
|
+
* Custom content rendered over each sidebar tile (badges, checkmarks, a drag handle…).
|
|
4848
|
+
* ```html
|
|
4849
|
+
* <ng-template pecbSlideViewerThumbnail let-slide let-n="index">
|
|
4850
|
+
* @if (slide.meta?.hasNotes) { <span class="badge">Notes</span> }
|
|
4851
|
+
* </ng-template>
|
|
4852
|
+
* ```
|
|
4853
|
+
*/
|
|
4854
|
+
declare class SlideViewerThumbnailDirective {
|
|
4855
|
+
readonly templateRef: TemplateRef<any>;
|
|
4856
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideViewerThumbnailDirective, never>;
|
|
4857
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SlideViewerThumbnailDirective, "ng-template[pecbSlideViewerThumbnail]", never, {}, {}, never, never, true, never>;
|
|
4858
|
+
}
|
|
4859
|
+
/**
|
|
4860
|
+
* Custom content of each day pill (status dot, counter…). The pill itself stays.
|
|
4861
|
+
* ```html
|
|
4862
|
+
* <ng-template pecbSlideViewerDay let-day let-active="active">{{ day.label }} · {{ day.meta?.count }}</ng-template>
|
|
4863
|
+
* ```
|
|
4864
|
+
*/
|
|
4865
|
+
declare class SlideViewerDayDirective {
|
|
4866
|
+
readonly templateRef: TemplateRef<any>;
|
|
4867
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideViewerDayDirective, never>;
|
|
4868
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SlideViewerDayDirective, "ng-template[pecbSlideViewerDay]", never, {}, {}, never, never, true, never>;
|
|
4869
|
+
}
|
|
4870
|
+
/**
|
|
4871
|
+
* PECB course slide viewer.
|
|
4872
|
+
*
|
|
4873
|
+
* Reproduces the "Open course" slide view of the PECB Profile redesign: a top
|
|
4874
|
+
* bar with day pills and tool buttons, a 16:10 stage, a navigation bar
|
|
4875
|
+
* (first / previous / next / last, slide-number input, projected version
|
|
4876
|
+
* select, zoom, fullscreen), a collapsible per-slide note and a sticky sidebar
|
|
4877
|
+
* with keyword search and thumbnails.
|
|
4878
|
+
*
|
|
4879
|
+
* The element is purely presentational: it receives days, slide images and a
|
|
4880
|
+
* note, keeps the current page / search / zoom / fullscreen / selection state
|
|
4881
|
+
* and emits every intent (`dayChange`, `slideChange`, `tool`, `slideMove`, …)
|
|
4882
|
+
* so the host app owns data, dialogs and persistence. No PDF library is
|
|
4883
|
+
* involved — feed it images; leave `image` out and answer `fullImageRequest`
|
|
4884
|
+
* to render large images lazily.
|
|
4885
|
+
*
|
|
4886
|
+
* Empty / broken decks: with no slides and nothing loading the stage shows `emptyTitle`
|
|
4887
|
+
* / `emptyHint`; with `error` set it shows `errorTitle` / `errorHint` and a retry button
|
|
4888
|
+
* (`retry` output). Both messages can be replaced through the `pecbSlideViewerEmpty` slot.
|
|
4889
|
+
*
|
|
4890
|
+
* Slots: `pecbSlideViewerToolsStart` / `pecbSlideViewerTools` (tool bar),
|
|
4891
|
+
* `pecbSlideViewerVersion` (navigation bar, right), `pecbSlideViewerStage`
|
|
4892
|
+
* (overlay on the stage), `pecbSlideViewerNote` (inside the note panel),
|
|
4893
|
+
* `pecbSlideViewerBelow` (under the stage column), `pecbSlideViewerSidebarHeader`
|
|
4894
|
+
* / `pecbSlideViewerSidebarFooter` (sidebar). Templates: `pecbSlideViewerThumbnail`,
|
|
4895
|
+
* `pecbSlideViewerDay`.
|
|
4896
|
+
*
|
|
4897
|
+
* @example
|
|
4898
|
+
* ```html
|
|
4899
|
+
* <pecb-slide-viewer
|
|
4900
|
+
* [days]="days" [(activeDayId)]="dayId" (dayChange)="loadDay($event)"
|
|
4901
|
+
* [slides]="slides" [(page)]="page" [note]="noteHtml"
|
|
4902
|
+
* (fullImageRequest)="renderFull($event)"
|
|
4903
|
+
* (tool)="onTool($event)" (slideChange)="track($event)">
|
|
4904
|
+
* <pecb-dropdown pecbSlideViewerVersion [options]="versions" [(ngModel)]="version" />
|
|
4905
|
+
* </pecb-slide-viewer>
|
|
4906
|
+
* ```
|
|
4907
|
+
*
|
|
4908
|
+
* Theming — override the CSS custom properties on the host:
|
|
4909
|
+
* ```css
|
|
4910
|
+
* pecb-slide-viewer { --pecb-slide-sidebar-width: 300px; --pecb-slide-active: #a11e29; }
|
|
4911
|
+
* ```
|
|
4912
|
+
*/
|
|
4913
|
+
declare class SlideViewerComponent {
|
|
4914
|
+
private readonly platformId;
|
|
4915
|
+
private readonly zone;
|
|
4916
|
+
private readonly destroyRef;
|
|
4917
|
+
private readonly isBrowser;
|
|
4918
|
+
/** Unique id used to wire ARIA relationships inside the template. */
|
|
4919
|
+
readonly uid: string;
|
|
4920
|
+
private readonly rootRef;
|
|
4921
|
+
private readonly stageRef;
|
|
4922
|
+
private readonly thumbsRef;
|
|
4923
|
+
private readonly searchRef;
|
|
4924
|
+
readonly thumbnailTemplate: _angular_core.Signal<SlideViewerThumbnailDirective | undefined>;
|
|
4925
|
+
readonly dayTemplate: _angular_core.Signal<SlideViewerDayDirective | undefined>;
|
|
4926
|
+
/** Day pills. The switcher is hidden when empty. */
|
|
4927
|
+
days: _angular_core.InputSignal<SlideViewerDay[]>;
|
|
4928
|
+
/** Slides of the active day, in order. */
|
|
4929
|
+
slides: _angular_core.InputSignal<SlideViewerSlide[]>;
|
|
4930
|
+
/**
|
|
4931
|
+
* Note for the current slide — an HTML string (sanitized by Angular) or a `SafeHtml`
|
|
4932
|
+
* the host already trusts. The panel is hidden when empty unless `showNote` is set
|
|
4933
|
+
* (e.g. when the note body is projected through `pecbSlideViewerNote`).
|
|
4934
|
+
*/
|
|
4935
|
+
note: _angular_core.InputSignal<string | SafeHtml | null | undefined>;
|
|
4936
|
+
/** Force the note panel on/off; `undefined` shows it whenever `note` has content. */
|
|
4937
|
+
showNote: _angular_core.InputSignal<boolean | undefined>;
|
|
4938
|
+
/** Slides are being prepared: the stage shows a veil and the list its skeletons. */
|
|
4939
|
+
loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4940
|
+
/** Download / preparation progress, 0–100, shown on the stage while loading. `null` hides it. */
|
|
4941
|
+
loadingProgress: _angular_core.InputSignal<number | null>;
|
|
4942
|
+
/**
|
|
4943
|
+
* The slides could not be produced (missing / broken file): the stage shows the error
|
|
4944
|
+
* message and a retry button (`retry` output) instead of the slides.
|
|
4945
|
+
*/
|
|
4946
|
+
error: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4947
|
+
/** Which built-in tool buttons render, in this order. */
|
|
4948
|
+
tools: _angular_core.InputSignal<readonly SlideViewerTool[]>;
|
|
4949
|
+
/** Enables the "Download Slides" tool. When false it renders disabled with a tooltip. @default true */
|
|
4950
|
+
canDownloadSlides: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4951
|
+
/** CSS `aspect-ratio` of the stage. @default '16 / 10' */
|
|
4952
|
+
stageAspectRatio: _angular_core.InputSignal<string>;
|
|
4953
|
+
/** Where the thumbnail sidebar sits. @default 'end' */
|
|
4954
|
+
sidebarPosition: _angular_core.InputSignal<SlideViewerSidebarPosition>;
|
|
4955
|
+
/** Show the thumbnail sidebar (shorthand for `sidebarPosition="none"`). @default true */
|
|
4956
|
+
showThumbnails: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4957
|
+
/** Show the keyword search above the thumbnails. @default true */
|
|
4958
|
+
showSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4959
|
+
/** Show the slide-number input. @default true */
|
|
4960
|
+
showSlideInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4961
|
+
/** Show the fullscreen button. @default true */
|
|
4962
|
+
showFullscreen: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4963
|
+
/** Show the zoom buttons and allow zooming the stage. @default false */
|
|
4964
|
+
zoomable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4965
|
+
/** Zoom levels cycled by the zoom buttons / keys (1 = fit). */
|
|
4966
|
+
zoomSteps: _angular_core.InputSignal<readonly number[]>;
|
|
4967
|
+
/** Navigation skips slides flagged `hidden`. @default false */
|
|
4968
|
+
skipHidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4969
|
+
/** Tiles get a checkbox and `selectedIds` tracks the selection. @default false */
|
|
4970
|
+
selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4971
|
+
/** Tiles can be dragged to a new position; the host receives `slideMove`. @default false */
|
|
4972
|
+
reorderable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4973
|
+
/**
|
|
4974
|
+
* Above this many slides the sidebar is virtualised: only the tiles in view (plus
|
|
4975
|
+
* `overscan` on each side) exist in the DOM, a spacer keeps the scroll height. Built
|
|
4976
|
+
* for decks of several hundred slides. @default 40
|
|
4977
|
+
*/
|
|
4978
|
+
virtualizeAbove: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
4979
|
+
/** Tiles rendered beyond the visible window on each side. @default 6 */
|
|
4980
|
+
overscan: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
4981
|
+
/**
|
|
4982
|
+
* How many neighbours on each side of the current slide are requested
|
|
4983
|
+
* (`fullImageRequest`) and decoded ahead so arrows feel instant. @default 1
|
|
4984
|
+
*/
|
|
4985
|
+
prefetch: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
4986
|
+
/** Horizontal swipe on the stage moves slides (touch / pen). @default true */
|
|
4987
|
+
swipe: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4988
|
+
/** Handle keyboard shortcuts on the region. @default true */
|
|
4989
|
+
keyboard: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4990
|
+
/** Partial override of the keyboard shortcuts (see `DEFAULT_SLIDE_VIEWER_KEY_MAP`). */
|
|
4991
|
+
keyMap: _angular_core.InputSignal<Partial<SlideViewerKeyMap>>;
|
|
4992
|
+
/** Milliseconds the keyword search waits after typing. @default 250 */
|
|
4993
|
+
searchDebounce: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
4994
|
+
/** Partial override of the user-visible strings (i18n). */
|
|
4995
|
+
labels: _angular_core.InputSignal<Partial<SlideViewerLabels>>;
|
|
4996
|
+
/** Selected day. `null` selects nothing. */
|
|
4997
|
+
activeDayId: _angular_core.ModelSignal<string | number | null>;
|
|
4998
|
+
/** Current slide, 1-based. Clamped to the slide count. */
|
|
4999
|
+
page: _angular_core.ModelSignal<number>;
|
|
5000
|
+
/** Keyword filtering the thumbnails. */
|
|
5001
|
+
searchTerm: _angular_core.ModelSignal<string>;
|
|
5002
|
+
/** Whether the note panel is expanded. */
|
|
5003
|
+
noteOpen: _angular_core.ModelSignal<boolean>;
|
|
5004
|
+
/** Stage zoom factor (1 = fit). Only applied while `zoomable`. */
|
|
5005
|
+
zoom: _angular_core.ModelSignal<number>;
|
|
5006
|
+
/** Ids of the selected slides (selection mode). */
|
|
5007
|
+
selectedIds: _angular_core.ModelSignal<(string | number)[]>;
|
|
5008
|
+
/** A day pill was chosen. */
|
|
5009
|
+
dayChange: _angular_core.OutputEmitterRef<SlideViewerDay>;
|
|
5010
|
+
/** The current slide changed (any source), with the slide and what moved it. */
|
|
5011
|
+
slideChange: _angular_core.OutputEmitterRef<SlideViewerPageEvent>;
|
|
5012
|
+
/** A tool button was pressed. */
|
|
5013
|
+
tool: _angular_core.OutputEmitterRef<SlideViewerToolEvent>;
|
|
5014
|
+
/** The stage entered / left fullscreen. */
|
|
5015
|
+
fullscreenChange: _angular_core.OutputEmitterRef<boolean>;
|
|
5016
|
+
/** The keyword or its matches changed. */
|
|
5017
|
+
searchChange: _angular_core.OutputEmitterRef<SlideViewerSearchEvent>;
|
|
5018
|
+
/** The stage needs the full image of a page that only has a thumbnail (1-based). Emitted once per page. */
|
|
5019
|
+
fullImageRequest: _angular_core.OutputEmitterRef<number>;
|
|
5020
|
+
/** A tile was dropped at a new position (reorder mode). The host reorders `slides`. */
|
|
5021
|
+
slideMove: _angular_core.OutputEmitterRef<SlideViewerMoveEvent>;
|
|
5022
|
+
/** "Try again" pressed in the error state. */
|
|
5023
|
+
retry: _angular_core.OutputEmitterRef<void>;
|
|
5024
|
+
readonly isFullscreen: _angular_core.WritableSignal<boolean>;
|
|
5025
|
+
/** Stage image for the current page has finished loading. */
|
|
5026
|
+
readonly stageImageLoaded: _angular_core.WritableSignal<boolean>;
|
|
5027
|
+
/**
|
|
5028
|
+
* Source currently painted on the stage. It lags behind `stageSrc` while the next
|
|
5029
|
+
* image is decoded off screen, so a page change or a thumbnail→full-image upgrade
|
|
5030
|
+
* never blanks the stage (no blink, no spinner over a picture that is already there).
|
|
5031
|
+
*/
|
|
5032
|
+
readonly displayedSrc: _angular_core.WritableSignal<string | null>;
|
|
5033
|
+
/** A newer image than the displayed one is being decoded. */
|
|
5034
|
+
readonly stageBusy: _angular_core.WritableSignal<boolean>;
|
|
5035
|
+
/** Text in the number input while the user edits it (null = mirror `page`). */
|
|
5036
|
+
readonly pageDraft: _angular_core.WritableSignal<string | null>;
|
|
5037
|
+
/** Virtualised sidebar: index range (into `matches`) of the tiles in the DOM. */
|
|
5038
|
+
readonly windowRange: _angular_core.WritableSignal<{
|
|
5039
|
+
start: number;
|
|
5040
|
+
end: number;
|
|
5041
|
+
}>;
|
|
5042
|
+
/** Measured height of one tile incl. its gap, in px (a sensible guess until measured). */
|
|
5043
|
+
readonly tileStride: _angular_core.WritableSignal<number>;
|
|
5044
|
+
/** Announced to assistive tech on slide change. */
|
|
5045
|
+
readonly announcement: _angular_core.WritableSignal<string>;
|
|
5046
|
+
/** Tile currently dragged (1-based) and the drop target it hovers. */
|
|
5047
|
+
readonly dragFrom: _angular_core.WritableSignal<number | null>;
|
|
5048
|
+
readonly dragOver: _angular_core.WritableSignal<number | null>;
|
|
5049
|
+
private searchTimer;
|
|
5050
|
+
private lastEmittedPage;
|
|
5051
|
+
private lastStageSrc;
|
|
5052
|
+
private stageLoadToken;
|
|
5053
|
+
private requestedFullImages;
|
|
5054
|
+
private lastSlidesRef;
|
|
5055
|
+
private pendingSource;
|
|
5056
|
+
/** Decoded neighbour images kept warm (bounded so 700-slide decks don't pile up). */
|
|
5057
|
+
private readonly decodeCache;
|
|
5058
|
+
private scrollListener;
|
|
5059
|
+
private resizeObserver;
|
|
5060
|
+
private scrollRaf;
|
|
5061
|
+
private swipeStart;
|
|
5062
|
+
readonly text: _angular_core.Signal<SlideViewerLabels>;
|
|
5063
|
+
readonly keys: _angular_core.Signal<SlideViewerKeyMap>;
|
|
5064
|
+
readonly total: _angular_core.Signal<number>;
|
|
5065
|
+
/** `page` clamped into the current slide range. */
|
|
5066
|
+
readonly currentPage: _angular_core.Signal<number>;
|
|
5067
|
+
readonly currentSlide: _angular_core.Signal<SlideViewerSlide | null>;
|
|
5068
|
+
/** Stage image: full image, else the thumbnail while the full one is being produced. */
|
|
5069
|
+
readonly stageSrc: _angular_core.Signal<string | null>;
|
|
5070
|
+
/** The stage is showing a thumbnail in place of a missing full image. */
|
|
5071
|
+
readonly stageIsFallback: _angular_core.Signal<boolean>;
|
|
5072
|
+
readonly progressText: _angular_core.Signal<string>;
|
|
5073
|
+
/** Spinner veil: only while nothing is painted yet (first image) or the deck loads. */
|
|
5074
|
+
readonly stageVeil: _angular_core.Signal<boolean>;
|
|
5075
|
+
/** Skeleton shimmer on the stage: something is coming and nothing is painted yet. */
|
|
5076
|
+
readonly stageSkeleton: _angular_core.Signal<boolean>;
|
|
5077
|
+
/** Nothing to show and nothing on the way: the stage explains it. */
|
|
5078
|
+
readonly isEmpty: _angular_core.Signal<boolean>;
|
|
5079
|
+
readonly isFirst: _angular_core.Signal<boolean>;
|
|
5080
|
+
readonly isLast: _angular_core.Signal<boolean>;
|
|
5081
|
+
readonly navDisabled: _angular_core.Signal<boolean>;
|
|
5082
|
+
readonly pageInputValue: _angular_core.Signal<string>;
|
|
5083
|
+
/** The word before the number input ("Slide"), derived from the `slide` label. */
|
|
5084
|
+
readonly slideWord: _angular_core.Signal<string>;
|
|
5085
|
+
readonly hasNote: _angular_core.Signal<boolean>;
|
|
5086
|
+
readonly showDays: _angular_core.Signal<boolean>;
|
|
5087
|
+
readonly sidebar: _angular_core.Signal<SlideViewerSidebarPosition>;
|
|
5088
|
+
readonly showDownloadTool: _angular_core.Signal<boolean>;
|
|
5089
|
+
readonly zoomLevel: _angular_core.Signal<number>;
|
|
5090
|
+
readonly isZoomed: _angular_core.Signal<boolean>;
|
|
5091
|
+
readonly zoomPercent: _angular_core.Signal<number>;
|
|
5092
|
+
/** Virtualisation only kicks in for long decks. */
|
|
5093
|
+
readonly windowed: _angular_core.Signal<boolean>;
|
|
5094
|
+
/** Tiles to render: everything, or the current window of `matches` when virtualised. */
|
|
5095
|
+
readonly visibleTiles: _angular_core.Signal<number[]>;
|
|
5096
|
+
/** Spacer heights (px) above / below the rendered window. */
|
|
5097
|
+
readonly spacerTop: _angular_core.Signal<number>;
|
|
5098
|
+
readonly spacerBottom: _angular_core.Signal<number>;
|
|
5099
|
+
readonly selectedSet: _angular_core.Signal<Set<string | number>>;
|
|
5100
|
+
/** 1-based numbers of the slides matching the keyword (all when empty). */
|
|
5101
|
+
readonly matches: _angular_core.Signal<number[]>;
|
|
5102
|
+
readonly matchSet: _angular_core.Signal<Set<number>>;
|
|
5103
|
+
readonly isSearching: _angular_core.Signal<boolean>;
|
|
5104
|
+
readonly searchSummary: _angular_core.Signal<string>;
|
|
5105
|
+
/** Skeleton rows drawn in the sidebar while loading. */
|
|
5106
|
+
readonly skeletonRows: number[];
|
|
5107
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
5108
|
+
constructor();
|
|
5109
|
+
/** Go to a 1-based slide (clamped). Hidden slides are stepped over while `skipHidden`. */
|
|
5110
|
+
goTo(page: number, source?: SlideViewerPageEvent['source']): void;
|
|
5111
|
+
first(source?: SlideViewerPageEvent['source']): void;
|
|
5112
|
+
previous(source?: SlideViewerPageEvent['source']): void;
|
|
5113
|
+
next(source?: SlideViewerPageEvent['source']): void;
|
|
5114
|
+
last(source?: SlideViewerPageEvent['source']): void;
|
|
5115
|
+
/** Select a day: emits `dayChange`, resets the page and clears the search. */
|
|
5116
|
+
selectDay(day: SlideViewerDay): void;
|
|
5117
|
+
/** Press a built-in tool. The disabled download tool is ignored. */
|
|
5118
|
+
pressTool(tool: SlideViewerTool): void;
|
|
5119
|
+
toggleNote(): void;
|
|
5120
|
+
/** "Try again" in the error state. */
|
|
5121
|
+
requestRetry(): void;
|
|
5122
|
+
/** Enter / exit fullscreen on the stage. */
|
|
5123
|
+
toggleFullscreen(): Promise<void>;
|
|
5124
|
+
/** Next zoom step (wraps back to fit after the last one). */
|
|
5125
|
+
zoomIn(): void;
|
|
5126
|
+
zoomOut(): void;
|
|
5127
|
+
zoomReset(): void;
|
|
5128
|
+
/** Clear the keyword filter. */
|
|
5129
|
+
clearSearch(): void;
|
|
5130
|
+
/** Move keyboard focus to the search field. */
|
|
5131
|
+
focusSearch(): void;
|
|
5132
|
+
/** Toggle a slide in the selection (selection mode). */
|
|
5133
|
+
toggleSelected(slide: SlideViewerSlide, n: number): void;
|
|
5134
|
+
/** Select every (matching) slide, or clear the selection. */
|
|
5135
|
+
selectAll(selected?: boolean): void;
|
|
5136
|
+
onStageImageLoad(): void;
|
|
5137
|
+
onStageImageError(): void;
|
|
5138
|
+
onPageInput(event: Event): void;
|
|
5139
|
+
onPageCommit(event: Event): void;
|
|
5140
|
+
onPageInputKeydown(event: KeyboardEvent): void;
|
|
5141
|
+
onSearchInput(event: Event): void;
|
|
5142
|
+
onSearchKeydown(event: KeyboardEvent): void;
|
|
5143
|
+
onThumbnailClick(page: number): void;
|
|
5144
|
+
onTileCheckbox(event: Event, slide: SlideViewerSlide, n: number): void;
|
|
5145
|
+
/** Touch / pen swipe on the stage (not while zoomed: then the finger pans). */
|
|
5146
|
+
onStagePointerDown(event: PointerEvent): void;
|
|
5147
|
+
onStagePointerUp(event: PointerEvent): void;
|
|
5148
|
+
onStagePointerCancel(): void;
|
|
5149
|
+
/** Mouse wheel over the stage: zooms with Ctrl/⌘ while zoomable, navigates in fullscreen. */
|
|
5150
|
+
onStageWheel(event: WheelEvent): void;
|
|
5151
|
+
/** Keyboard shortcuts on the viewer region (see `keyMap`). */
|
|
5152
|
+
onRootKeydown(event: KeyboardEvent): void;
|
|
5153
|
+
onDocumentFullscreenChange(): void;
|
|
5154
|
+
onTileDragStart(event: DragEvent, n: number): void;
|
|
5155
|
+
onTileDragOver(event: DragEvent, n: number): void;
|
|
5156
|
+
onTileDrop(event: DragEvent, n: number): void;
|
|
5157
|
+
onTileDragEnd(): void;
|
|
5158
|
+
/** Accessible title of a slide (`title`, else `{slide} {n}`). */
|
|
5159
|
+
slideTitle(slide: SlideViewerSlide | null, n: number): string;
|
|
5160
|
+
slideId(slide: SlideViewerSlide, n: number): string | number;
|
|
5161
|
+
thumbnailSrc(slide: SlideViewerSlide): string | null;
|
|
5162
|
+
/** A tile whose thumbnail is still being produced (big decks publish pages first). */
|
|
5163
|
+
tilePending(slide: SlideViewerSlide): boolean;
|
|
5164
|
+
isSelected(slide: SlideViewerSlide, n: number): boolean;
|
|
5165
|
+
selectLabel(n: number): string;
|
|
5166
|
+
thumbnailContext(slide: SlideViewerSlide, n: number): SlideViewerThumbnailContext;
|
|
5167
|
+
dayContext(day: SlideViewerDay): SlideViewerDayContext;
|
|
5168
|
+
private isHidden;
|
|
5169
|
+
private nextVisible;
|
|
5170
|
+
private previousVisible;
|
|
5171
|
+
private actionForKey;
|
|
5172
|
+
private slideMatches;
|
|
5173
|
+
private format;
|
|
5174
|
+
/**
|
|
5175
|
+
* Show the current page in the number field again. Written to the DOM directly:
|
|
5176
|
+
* a number input sanitises junk to `''`, and the `[value]` binding would not
|
|
5177
|
+
* re-apply an unchanged `'20'` on top of it.
|
|
5178
|
+
*/
|
|
5179
|
+
private resetPageInput;
|
|
5180
|
+
private scrollActiveThumbnailIntoView;
|
|
5181
|
+
private attachSidebarListeners;
|
|
5182
|
+
private detachSidebarListeners;
|
|
5183
|
+
/** Coalesce scroll / resize / data changes into one window computation per frame. */
|
|
5184
|
+
private scheduleWindowUpdate;
|
|
5185
|
+
private updateWindow;
|
|
5186
|
+
/** Tile height incl. the list gap, measured from the first rendered tile. */
|
|
5187
|
+
private measureTile;
|
|
5188
|
+
/** Decode an image off screen so a later swap paints instantly. Bounded to 8 entries. */
|
|
5189
|
+
private warmDecode;
|
|
5190
|
+
/**
|
|
5191
|
+
* Paint `src` on the stage once it is decoded. While decoding, the previous image
|
|
5192
|
+
* stays on screen (`stageBusy` marks the transition); the first image, with nothing
|
|
5193
|
+
* to keep, shows the veil instead.
|
|
5194
|
+
*/
|
|
5195
|
+
private showStageSource;
|
|
5196
|
+
private clearSearchTimer;
|
|
5197
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SlideViewerComponent, never>;
|
|
5198
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SlideViewerComponent, "pecb-slide-viewer", never, { "days": { "alias": "days"; "required": false; "isSignal": true; }; "slides": { "alias": "slides"; "required": false; "isSignal": true; }; "note": { "alias": "note"; "required": false; "isSignal": true; }; "showNote": { "alias": "showNote"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingProgress": { "alias": "loadingProgress"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "tools": { "alias": "tools"; "required": false; "isSignal": true; }; "canDownloadSlides": { "alias": "canDownloadSlides"; "required": false; "isSignal": true; }; "stageAspectRatio": { "alias": "stageAspectRatio"; "required": false; "isSignal": true; }; "sidebarPosition": { "alias": "sidebarPosition"; "required": false; "isSignal": true; }; "showThumbnails": { "alias": "showThumbnails"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "showSlideInput": { "alias": "showSlideInput"; "required": false; "isSignal": true; }; "showFullscreen": { "alias": "showFullscreen"; "required": false; "isSignal": true; }; "zoomable": { "alias": "zoomable"; "required": false; "isSignal": true; }; "zoomSteps": { "alias": "zoomSteps"; "required": false; "isSignal": true; }; "skipHidden": { "alias": "skipHidden"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "virtualizeAbove": { "alias": "virtualizeAbove"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "prefetch": { "alias": "prefetch"; "required": false; "isSignal": true; }; "swipe": { "alias": "swipe"; "required": false; "isSignal": true; }; "keyboard": { "alias": "keyboard"; "required": false; "isSignal": true; }; "keyMap": { "alias": "keyMap"; "required": false; "isSignal": true; }; "searchDebounce": { "alias": "searchDebounce"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "activeDayId": { "alias": "activeDayId"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "searchTerm": { "alias": "searchTerm"; "required": false; "isSignal": true; }; "noteOpen": { "alias": "noteOpen"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; }, { "activeDayId": "activeDayIdChange"; "page": "pageChange"; "searchTerm": "searchTermChange"; "noteOpen": "noteOpenChange"; "zoom": "zoomChange"; "selectedIds": "selectedIdsChange"; "dayChange": "dayChange"; "slideChange": "slideChange"; "tool": "tool"; "fullscreenChange": "fullscreenChange"; "searchChange": "searchChange"; "fullImageRequest": "fullImageRequest"; "slideMove": "slideMove"; "retry": "retry"; }, ["thumbnailTemplate", "dayTemplate"], ["[pecbSlideViewerToolsStart]", "[pecbSlideViewerTools]", "[pecbSlideViewerEmpty]", "[pecbSlideViewerStage]", "[pecbSlideViewerVersion]", "[pecbSlideViewerNote]", "[pecbSlideViewerBelow]", "[pecbSlideViewerSidebarHeader]", "[pecbSlideViewerSidebarFooter]"], true, never>;
|
|
5199
|
+
}
|
|
5200
|
+
|
|
4696
5201
|
/**
|
|
4697
5202
|
* Notification types supported by the service
|
|
4698
5203
|
*/
|
|
@@ -9057,5 +9562,115 @@ declare class CourseTileComponent {
|
|
|
9057
9562
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CourseTileComponent, "pecb-course-tile", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconSrc": { "alias": "iconSrc"; "required": false; "isSignal": true; }; "iconSvg": { "alias": "iconSvg"; "required": false; "isSignal": true; }; "category": { "alias": "category"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "meta": { "alias": "meta"; "required": false; "isSignal": true; }; "ctaLabel": { "alias": "ctaLabel"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "target": { "alias": "target"; "required": false; "isSignal": true; }; }, { "cardClick": "cardClick"; }, never, never, true, never>;
|
|
9058
9563
|
}
|
|
9059
9564
|
|
|
9060
|
-
|
|
9061
|
-
|
|
9565
|
+
/** Tone of a timeline event — drives the dot and chip colors. */
|
|
9566
|
+
type TimelineTone = 'success' | 'info' | 'warning' | 'error' | 'neutral';
|
|
9567
|
+
/** One event on the timeline (e.g. a certificate history entry). */
|
|
9568
|
+
interface TimelineItem {
|
|
9569
|
+
/** Identifier emitted by (actionClick) when the item's action is clicked */
|
|
9570
|
+
id: string | number;
|
|
9571
|
+
/** Event title (e.g. "Certificate issued") */
|
|
9572
|
+
title: string;
|
|
9573
|
+
/** Formatted date line under the title */
|
|
9574
|
+
date?: string;
|
|
9575
|
+
/** Longer description paragraph */
|
|
9576
|
+
description?: string;
|
|
9577
|
+
/** Colors the dot and chip; defaults to 'neutral' */
|
|
9578
|
+
tone?: TimelineTone;
|
|
9579
|
+
/** Small status chip next to the title (e.g. "Active", "Paid") */
|
|
9580
|
+
chipLabel?: string;
|
|
9581
|
+
/** Renders an action link under the description (e.g. "View certificate") */
|
|
9582
|
+
actionLabel?: string;
|
|
9583
|
+
}
|
|
9584
|
+
/**
|
|
9585
|
+
* Vertical event timeline — a colored dot per event on a connector rail,
|
|
9586
|
+
* with a title, status chip, date, description and an optional action link.
|
|
9587
|
+
* Used for the certificate history page.
|
|
9588
|
+
*
|
|
9589
|
+
* @example
|
|
9590
|
+
* <pecb-timeline [items]="items" (actionClick)="onItemAction($event)" />
|
|
9591
|
+
*/
|
|
9592
|
+
declare class TimelineComponent {
|
|
9593
|
+
/** Events to render, in display order (typically newest first) */
|
|
9594
|
+
items: _angular_core.InputSignal<TimelineItem[]>;
|
|
9595
|
+
/** Emitted with the item's id when its action link is clicked */
|
|
9596
|
+
actionClick: _angular_core.OutputEmitterRef<string | number>;
|
|
9597
|
+
tone(item: TimelineItem): TimelineTone;
|
|
9598
|
+
onAction(item: TimelineItem): void;
|
|
9599
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimelineComponent, never>;
|
|
9600
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimelineComponent, "pecb-timeline", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, { "actionClick": "actionClick"; }, never, never, true, never>;
|
|
9601
|
+
}
|
|
9602
|
+
|
|
9603
|
+
/** Visual style of a preview-card action button. */
|
|
9604
|
+
type PreviewCardActionVariant = 'primary' | 'ghost' | 'accent';
|
|
9605
|
+
/** Color of the small status chip next to the title. */
|
|
9606
|
+
type PreviewCardChipStatus = 'success' | 'info' | 'warning' | 'error' | 'default';
|
|
9607
|
+
/** One action button on a preview card. */
|
|
9608
|
+
interface PreviewCardAction {
|
|
9609
|
+
/** Identifier emitted by (actionClick) when the button is clicked */
|
|
9610
|
+
id: string;
|
|
9611
|
+
/** Button label */
|
|
9612
|
+
label: string;
|
|
9613
|
+
/** 'primary' (dark), 'ghost' (outlined) or 'accent' (brand red); defaults to 'primary' */
|
|
9614
|
+
variant?: PreviewCardActionVariant;
|
|
9615
|
+
/** Raw SVG string rendered before the label (use stroke="currentColor") */
|
|
9616
|
+
icon?: string;
|
|
9617
|
+
/** Shows a spinner in place of the icon and disables the button */
|
|
9618
|
+
loading?: boolean;
|
|
9619
|
+
/** Disables the button (kept visible so the layout never collapses) */
|
|
9620
|
+
disabled?: boolean;
|
|
9621
|
+
}
|
|
9622
|
+
/**
|
|
9623
|
+
* Media preview card — a fixed-size media panel (live iframe embed or image)
|
|
9624
|
+
* beside a title, optional status chip, description and a row of action
|
|
9625
|
+
* buttons. Used for the certificate and digital-badge cards on the
|
|
9626
|
+
* certification details page.
|
|
9627
|
+
*
|
|
9628
|
+
* The media panel shows [embedSrc] in a non-interactive iframe when set
|
|
9629
|
+
* (e.g. a PDF preview URL), otherwise the [imageSrc] image.
|
|
9630
|
+
*
|
|
9631
|
+
* @example
|
|
9632
|
+
* <pecb-preview-card
|
|
9633
|
+
* [embedSrc]="certificatePreviewUrl"
|
|
9634
|
+
* imageSrc="assets/images/certificate.png"
|
|
9635
|
+
* title="Certificate"
|
|
9636
|
+
* description="Your official PECB certificate."
|
|
9637
|
+
* [actions]="actions"
|
|
9638
|
+
* (actionClick)="onAction($event)"
|
|
9639
|
+
* />
|
|
9640
|
+
*/
|
|
9641
|
+
declare class PreviewCardComponent {
|
|
9642
|
+
private sanitizer;
|
|
9643
|
+
/** URL rendered in a non-interactive iframe (e.g. a PDF preview); falls back to [imageSrc] when empty */
|
|
9644
|
+
embedSrc: _angular_core.InputSignal<string>;
|
|
9645
|
+
/** Image shown in the media panel when [embedSrc] is empty */
|
|
9646
|
+
imageSrc: _angular_core.InputSignal<string>;
|
|
9647
|
+
/** Alt text for the media panel */
|
|
9648
|
+
imageAlt: _angular_core.InputSignal<string>;
|
|
9649
|
+
/** Dims the image (grayscale) — e.g. an unclaimed badge */
|
|
9650
|
+
imageDimmed: _angular_core.InputSignal<boolean>;
|
|
9651
|
+
/** Card title (required) */
|
|
9652
|
+
title: _angular_core.InputSignal<string>;
|
|
9653
|
+
/** Small status chip next to the title; hidden when empty */
|
|
9654
|
+
chipLabel: _angular_core.InputSignal<string>;
|
|
9655
|
+
/** Chip color theme */
|
|
9656
|
+
chipStatus: _angular_core.InputSignal<PreviewCardChipStatus>;
|
|
9657
|
+
/** Description paragraph under the title; hidden when empty */
|
|
9658
|
+
description: _angular_core.InputSignal<string>;
|
|
9659
|
+
/** Action buttons rendered under the description */
|
|
9660
|
+
actions: _angular_core.InputSignal<PreviewCardAction[]>;
|
|
9661
|
+
/** Emitted with the action's id when one of the buttons is clicked */
|
|
9662
|
+
actionClick: _angular_core.OutputEmitterRef<string>;
|
|
9663
|
+
safeEmbedSrc: _angular_core.Signal<SafeResourceUrl | null>;
|
|
9664
|
+
/** Actions paired with their sanitized icon SVG for the template */
|
|
9665
|
+
resolvedActions: _angular_core.Signal<{
|
|
9666
|
+
action: PreviewCardAction;
|
|
9667
|
+
safeIcon: SafeHtml | null;
|
|
9668
|
+
}[]>;
|
|
9669
|
+
actionClasses(action: PreviewCardAction): string;
|
|
9670
|
+
onAction(action: PreviewCardAction): void;
|
|
9671
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PreviewCardComponent, never>;
|
|
9672
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PreviewCardComponent, "pecb-preview-card", never, { "embedSrc": { "alias": "embedSrc"; "required": false; "isSignal": true; }; "imageSrc": { "alias": "imageSrc"; "required": false; "isSignal": true; }; "imageAlt": { "alias": "imageAlt"; "required": false; "isSignal": true; }; "imageDimmed": { "alias": "imageDimmed"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "chipLabel": { "alias": "chipLabel"; "required": false; "isSignal": true; }; "chipStatus": { "alias": "chipStatus"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; }, { "actionClick": "actionClick"; }, never, never, true, never>;
|
|
9673
|
+
}
|
|
9674
|
+
|
|
9675
|
+
export { APP_HEADER_TRANSLATIONS, APP_SHELL_LOCALES, APP_SIDEBAR_MENU_ICONS, APP_SIDEBAR_MENU_TRANSLATIONS, APP_SIDEBAR_TRANSLATIONS, AccordionItemComponent, AccordionSmallComponent, ActionItemComponent, AddButtonComponent, AdminHeaderComponent, AdminHeaderFieldTemplateDirective, AffixComponent, AlertComponent, AnchorComponent, AppHeaderComponent, AppSidebarComponent, ApplicationStatusBarComponent, AuditorStatusComponent, AuthorDateTimeComponent, BackToTopComponent, BadgeComponent, BlurDirective, BottomSheetComponent, BreadcrumbsComponent, ButtonComponent, ButtonGroupComponent, ButtonGroupItemComponent, CancelUpdateButtonsComponent, CardBodyComponent, CardComponent, CardFooterComponent, CardHeaderComponent, CertificateUploadBarComponent, CheckDeleteIconComponent, CheckboxComponent, CheckboxDisplayComponent, CodeInputComponent, CodeSnippetComponent, ColorPaletteComponent, ConfirmationComponent, ContentTypeTagComponent, CourseContentPanelComponent, CoursePlayerComponent, CourseTileComponent, CredentialCardComponent, DEFAULT_APP_HEADER_LABELS, DEFAULT_APP_SIDEBAR_LABELS, DEFAULT_APP_SIDEBAR_LANGUAGES, DEFAULT_APP_SIDEBAR_MENU, DEFAULT_APP_SIDEBAR_ROLES, DEFAULT_COURSE_CONTENT_PANEL_LABELS, DEFAULT_LANGUAGES, DEFAULT_SLIDE_VIEWER_KEY_MAP, DEFAULT_SLIDE_VIEWER_LABELS, DEFAULT_SLIDE_VIEWER_TOOLS, DEFAULT_SLIDE_VIEWER_ZOOM_STEPS, DEFAULT_VIDEO_PLAYER_LABELS, DEFAULT_VIDEO_PLAYER_RATES, DashboardGridComponent, DatepickerComponent, DividerComponent, DropdownComponent, EMPTY_STATE_MAX_BUTTONS, EditButtonComponent, EditCoverPhotoComponent, EmptyStateComponent, ExpandableRowTableComponent, FileUploadComponent, FilterColumnsComponent, FloatButtonComponent, FloatButtonItemComponent, FormSectionCardComponent, FullscreenModalComponent, FullscreenModalContentDirective, FullscreenModalFooterDirective, FullscreenModalHeaderDirective, GeneralComponent, GridComponent, GridItemComponent, HeaderActionsComponent, HeaderComponent, HeaderDividerComponent, HeaderLanguageComponent, HeaderSearchComponent, HeaderUserComponent, HierarchicalTableComponent, HorizontalStepsComponent, HubCardComponent, HubCardGridComponent, IconComponent, IconRegistry, IconTagComponent, InformationBoxComponent, InputComponent, LanguageDropdownComponent, LinkButtonComponent, ListItemComponent, LoadingService, MediaComponent, MessageBubbleComponent, MessageItemComponent, MetricsCardComponent, MiniIconButtonComponent, NoResultsComponent, NoteSidebarItemComponent, NotesPanelComponent, NotificationService, NotificationStatusLinkComponent, OutlinedFieldComponent, PECB_COLOR_PALETTE, PECB_CUSTOM_ICONS, PECB_FONT_STYLES, PECB_ICONS, PECB_TYPE_SCALE, PaginationComponent, PaymentPlanCardComponent, PaymentScheduleCardComponent, PaymentSummaryComponent, PeriodPaymentModalComponent, PreviewCardComponent, PriceMethodComponent, ProfileComponent, ProfileElementsCardComponent, ProfileGroupComponent, ProgressArcComponent, ProgressBarComponent, ProgressCircleComponent, ProjectLayoutComponent, QuantitySelectorComponent, QuestionTypeTagComponent, RadioComponent, RadioDisplayComponent, RatingNumberComponent, ReasonForReturnComponent, RequestSentByComponent, RequestStatusBarComponent, ResultPageComponent, RightModalComponent, RightModalContentDirective, RightModalFooterDirective, RightModalHeaderDirective, ShadowDirective, SidebarComponent, SkeletonComponent, SlidePointsComponent, SlideViewerComponent, SlideViewerDayDirective, SlideViewerThumbnailDirective, SpacerComponent, SpinnerComponent, StandardsPdfCardComponent, StatisticsCardComponent, StatusComponent, StepperComponent, TabComponent, TableComponent, TagComponent, TagSelectComponent, TestimonialComponent, TextFormFieldComponent, ThemeService, TimelineComponent, ToggleComponent, ToolbarBarComponent, TooltipComponent, TooltipDirective, TourComponent, TranscriptLineComponent, TypographyComponent, UserWithEmailComponent, VerifyChecklistComponent, VideoPlayerComponent, VideoUploadBarComponent, VirtualTableComponent, addClass, announceToScreenReader, appHeaderLabels, appSidebarLabels, appSidebarMenu, appSidebarRoles, capitalize, clampSlidePage, closestElement, copyToClipboard, courseModuleStats, courseProgress, createAuthError, createAuthorizationError, createConfigError, createError, createNetworkError, createValidationError, disableBodyScroll, escapeHtml, findCourseLesson, findCourseModule, formatCount, formatCourseDuration, formatCourseTime, formatErrorForLog, formatErrorMessage, formatVideoTime, generateLinkedIds, generateUniqueId, getAriaCurrent, getButtonAriaAttributes, getComputedStyleValue, getDialogAriaAttributes, getFocusableElements, getInitials, getInputAriaAttributes, getOptionAriaAttributes, getProgressAriaAttributes, getScrollParent, getTabAriaAttributes, getVisuallyHiddenStyles, handleError, hasClass, isBlank, isBrowser, isElementVisible, isNotBlank, isPecbError, isRecoverableError, matchesSelector, parseLessonPartTitle, pluralize, prefersHighContrast, prefersReducedMotion, registerErrorHandler, removeClass, resolveAppShellLocale, resolveLessonStatus, scrollIntoView, slugify, stripHtml, toCamelCase, toKebabCase, toPascalCase, toSnakeCase, toggleClass, trapFocus, truncate, tryAsync, trySync, wrapError };
|
|
9676
|
+
export type { AccordionVariant, ActionItemPriority, AddButtonVariant, AdminHeaderAction, AdminHeaderActionType, AdminHeaderBadgeVariant, AdminHeaderField, AdminHeaderFieldType, AdminHeaderMetadata, AdminHeaderMetadataType, AdminHeaderProfile, AffixPosition, AlertType, AlertVariant, Alignment, AnchorDirection, AnchorItem, AnchorLevel, AnimationTiming, AppHeaderAction, AppHeaderChip, AppHeaderChipTone, AppHeaderLabels, AppHeaderNotification, AppShellLocale, AppShellTranslations, AppSidebarLabels, AppSidebarMenuItem, AppSidebarMenuOption, AppSidebarMenuOptionChange, AppSidebarMenuStrings, AppSidebarNavGroup, AppSidebarNavItem, AppSidebarProduct, AppSidebarRouterLink, AppSidebarUser, AppStatusColor, AriaAttributes, AriaLive, AriaRole, AuditorStatusType, BadgeSize, BadgeStatus, BadgeVariant, BlurSize, BreadcrumbItem, BreadcrumbSeparator, Breakpoint, ButtonGroupIconMode, ButtonGroupItemPosition, ButtonIconStyle, ButtonSize, ButtonVariant, CalendarDay, Callback, CardElevation, CardRadius, CardRole, CheckDeleteType, CheckboxDisplayState, CheckboxLabelPosition, ClosableWithHooks, CodeInputDirection, CodeInputState, CodeSnippetTheme, CodeSnippetVariant, ColorPaletteGroup, ColorPaletteItem, ColorVariant, Colorable, ColumnOption, ComponentSize, ConfirmationIconType, ContentStyle, ContentTagDisplay, ContentTagType, CourseContentPanelAccent, CourseContentPanelDensity, CourseContentPanelLabels, CourseContentPanelLayout, CourseContentPanelTab, CourseLesson, CourseLessonRunView, CourseLessonStatus, CourseLessonType, CourseLessonView, CourseModule, CourseModuleStats, CourseModuleView, CoursePlayerPanelPosition, CourseProgressStats, CourseTimelineRow, CourseTranscriptCue, CourseTranscriptRow, CredentialCardAction, CredentialCardMetaRow, CredentialCardProgress, CredentialCardTone, CustomIconName, DashboardGridGap, DashboardGridLayout, DatepickerSize, Direction, Disableable, DividerType, DropdownOption, DropdownSize, EditButtonVariant, ElevationLevel, EmptyStateButton, EmptyStateIconTheme, ErrorCategory, ErrorHandler, ErrorOptions, ErrorSeverity, EventHandler, ExpandableRowColumn, ExpandableRowPageEvent, ExpandableRowProgressConfig, ExtendedColorVariant, FieldItem, FieldStyle, FileUploadEvent, FileUploadState, FileUploadVariant, FilterColumnsActiveTab, FilterColumnsApplyEvent, FilterField, FilterFieldType, FilterState, FloatButtonAction, FloatButtonPosition, Focusable, FormControlBase, GridAlign, GridColumns, GridGap, GridItemSpan, GridPadding, GridVerticalAlign, HeaderActionButton, HeaderLanguageOption, HeaderSearchCategory, HeaderSearchType, HierarchicalTableAction, HierarchicalTableColumn, HierarchicalTablePageEvent, HubCardSize, IconColor, IconName, IconShape, IconSize, IconTagType, InformationBoxVariant, InputSize, InputType, LanguageDisplayMode, LanguageOption, LinkButtonType, Loadable, LoadingState, MarkedDate, MediaGroup, MediaItem, MediaSize, MediaType, MenuItem, MessageBubbleType, MessageDirection, MessageItemStatus, MetricsCardBadgeStatus, MetricsCardIconBg, MetricsCardOrientation, MetricsCardType, MetricsCardVariation, MiniIconAction, NonNullableProps, NoteGroup, NoteItem, NoteSidebarPosition, NoteSidebarState, Notification, NotificationConfig, NotificationPosition, NotificationStatusType, NotificationType, OptionalProps, Orientation, OverlayComponent, PageChangeEvent, PaginationSize, PaginationState, PaginationVariant, PaymentScheduleCardAction, PaymentScheduleCardMeta, PaymentScheduleCardPeriod, PaymentScheduleCardTone, PaymentSummaryRow, PdfCardVariant, PecbError, PecbTableColumn, PecbTableColumnComponent, PecbTableColumnType, PeriodPaymentModalPeriod, Position, PreviewCardAction, PreviewCardActionVariant, PreviewCardChipStatus, ProfileBadge, ProfileGroupItem, ProfileGroupSize, ProfileIndicator, ProfileSize, ProfileType, ProgressArcSize, ProgressBarSize, ProgressCircleSize, ProgressType, QuestionTagDisplay, QuestionTagType, QuizType, RadioDisplayState, RadioLabelPosition, RadioVariant, RadiusScale, RatingStyle, RequestStatusIconType, RequireProps, ResultPageAction, ResultPageIcon, RibbonColor, RightModalSize, SearchMode, SelectableItem, ShadowHardSize, ShadowSize, ShadowSoftSize, ShadowType, SidebarMenuItem, SidebarSection, Size, Sizeable, SkeletonShape, SkeletonSize, SkeletonType, SlideViewerDay, SlideViewerDayContext, SlideViewerKeyAction, SlideViewerKeyMap, SlideViewerLabels, SlideViewerMoveEvent, SlideViewerPageEvent, SlideViewerSearchEvent, SlideViewerSidebarPosition, SlideViewerSlide, SlideViewerThumbnailContext, SlideViewerTool, SlideViewerToolEvent, SortState, SpacerSize, SpacingScale, StateVariant, StatisticsIconColor, StatusColor, StatusSize, StatusType, StatusVariant, StepItem, StepOrder, StepState, StepperDirection, StepperSize, StepperTailStyle, StepperType, TabItem, TabSize, TabStyle, TableAction, TableColumn, TableRowActionEvent, TableSelectionEvent, TableSize, TableSortEvent, TableStatusConfig, TableUserConfig, TableVariant, TagAction, TagSelectOption, TagStyle, Templatable, TestimonialData, TestimonialVariant, TextFormFieldType, ThemeConfig, ThemeMode, ThemeVariables, TimelineItem, TimelineTone, ToggleLabelPosition, ToggleSize, ToolbarButton, ToolbarTab, ToolbarVariant, TooltipPointerPosition, TooltipTheme, TourIndicatorType, TourPlacement, TourStep, TourType, TranscriptLineState, TreeNode, TypographyScaleEntry, TypographyStyleEntry, UploadedFile, Validatable, ValidationError, ValidationState, VerifyChecklistItem, VerifyItemStatus, VideoPlayerError, VideoPlayerLabels, VideoPlayerPreload, VideoPlayerSource, VideoPlayerTimeEvent, VideoPlayerTrack, VirtualTableColumn, VirtualTablePageEvent, VirtualTableProgressConfig };
|