@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/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
- 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_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, 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, SpacerComponent, SpinnerComponent, StandardsPdfCardComponent, StatisticsCardComponent, StatusComponent, StepperComponent, TabComponent, TableComponent, TagComponent, TagSelectComponent, TestimonialComponent, TextFormFieldComponent, ThemeService, ToggleComponent, ToolbarBarComponent, TooltipComponent, TooltipDirective, TourComponent, TranscriptLineComponent, TypographyComponent, UserWithEmailComponent, VerifyChecklistComponent, VideoPlayerComponent, VideoUploadBarComponent, VirtualTableComponent, addClass, announceToScreenReader, appHeaderLabels, appSidebarLabels, appSidebarMenu, appSidebarRoles, capitalize, 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 };
9061
- 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, 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, 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, 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 };
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 };