@pecb-ui/components 1.1.9 → 1.1.11
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/README.md +257 -70
- 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 +2169 -216
- package/fesm2022/pecb-ui-components.mjs.map +1 -1
- package/index.d.ts +906 -45
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import * as _angular_platform_browser from '@angular/platform-browser';
|
|
|
4
4
|
import { SafeHtml, DomSanitizer } from '@angular/platform-browser';
|
|
5
5
|
import { ScrollStrategy, ConnectedPosition } from '@angular/cdk/overlay';
|
|
6
6
|
import { ControlValueAccessor } from '@angular/forms';
|
|
7
|
+
import * as _pecb_ui_components from '@pecb-ui/components';
|
|
7
8
|
import { Observable } from 'rxjs';
|
|
8
9
|
|
|
9
10
|
type ButtonVariant = 'primary' | 'primary-outline' | 'primary-2' | 'primary-2-outline' | 'neutral' | 'neutral-outline' | 'secondary' | 'text' | 'text-muted' | 'text-brand' | 'destructive' | 'destructive-outline';
|
|
@@ -1038,21 +1039,20 @@ declare class RightModalComponent implements OnDestroy {
|
|
|
1038
1039
|
ariaDescribedBy: _angular_core.InputSignal<string | undefined>;
|
|
1039
1040
|
closed: _angular_core.OutputEmitterRef<void>;
|
|
1040
1041
|
opened: _angular_core.OutputEmitterRef<void>;
|
|
1041
|
-
private
|
|
1042
|
-
private
|
|
1043
|
-
private
|
|
1042
|
+
private readonly overlay;
|
|
1043
|
+
private readonly viewContainerRef;
|
|
1044
|
+
private modalTemplate;
|
|
1045
|
+
private overlayRef;
|
|
1046
|
+
private portal;
|
|
1047
|
+
private subscriptions;
|
|
1044
1048
|
private previousActiveElement;
|
|
1045
|
-
private currentlyOpen;
|
|
1046
1049
|
constructor();
|
|
1047
1050
|
ngOnDestroy(): void;
|
|
1048
|
-
get modalClasses(): string[];
|
|
1049
1051
|
get panelClasses(): string[];
|
|
1050
|
-
onBackdropClick(event: MouseEvent): void;
|
|
1051
|
-
onKeydown(event: KeyboardEvent): void;
|
|
1052
1052
|
close(): void;
|
|
1053
|
-
private
|
|
1054
|
-
private
|
|
1055
|
-
private
|
|
1053
|
+
private openOverlay;
|
|
1054
|
+
private closeOverlay;
|
|
1055
|
+
private destroyOverlay;
|
|
1056
1056
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<RightModalComponent, never>;
|
|
1057
1057
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<RightModalComponent, "pecb-right-modal", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "closed": "closed"; "opened": "opened"; }, never, ["[pecbRightModalHeader]", "[pecbRightModalContent]", "*", "[pecbRightModalFooter]"], true, never>;
|
|
1058
1058
|
}
|
|
@@ -1114,7 +1114,7 @@ declare class SidebarComponent {
|
|
|
1114
1114
|
}
|
|
1115
1115
|
|
|
1116
1116
|
type ConfirmationIconType = 'success' | 'warning' | 'error' | 'info';
|
|
1117
|
-
declare class ConfirmationComponent implements OnDestroy
|
|
1117
|
+
declare class ConfirmationComponent implements OnDestroy {
|
|
1118
1118
|
id: _angular_core.InputSignal<string>;
|
|
1119
1119
|
/**
|
|
1120
1120
|
* Whether the dialog is visible. Manages its own state internally —
|
|
@@ -1136,25 +1136,23 @@ declare class ConfirmationComponent implements OnDestroy, AfterViewInit {
|
|
|
1136
1136
|
confirmed: _angular_core.OutputEmitterRef<void>;
|
|
1137
1137
|
cancelled: _angular_core.OutputEmitterRef<void>;
|
|
1138
1138
|
closed: _angular_core.OutputEmitterRef<void>;
|
|
1139
|
-
|
|
1140
|
-
private
|
|
1141
|
-
private
|
|
1139
|
+
private readonly overlay;
|
|
1140
|
+
private readonly viewContainerRef;
|
|
1141
|
+
private dialogTemplate;
|
|
1142
|
+
private overlayRef;
|
|
1143
|
+
private portal;
|
|
1144
|
+
private subscriptions;
|
|
1142
1145
|
private previousActiveElement;
|
|
1143
1146
|
constructor();
|
|
1144
|
-
ngAfterViewInit(): void;
|
|
1145
1147
|
ngOnDestroy(): void;
|
|
1146
|
-
get dialogClasses(): string[];
|
|
1147
1148
|
get iconContainerClass(): string;
|
|
1148
1149
|
get titleId(): string;
|
|
1149
1150
|
get messageId(): string;
|
|
1150
|
-
onBackdropClick(event: MouseEvent): void;
|
|
1151
|
-
onKeydown(event: KeyboardEvent): void;
|
|
1152
1151
|
onConfirm(): void;
|
|
1153
1152
|
onCancel(): void;
|
|
1154
1153
|
close(): void;
|
|
1155
|
-
private
|
|
1156
|
-
private
|
|
1157
|
-
private cleanup;
|
|
1154
|
+
private openOverlay;
|
|
1155
|
+
private destroyOverlay;
|
|
1158
1156
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmationComponent, never>;
|
|
1159
1157
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmationComponent, "pecb-confirmation", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "confirmText": { "alias": "confirmText"; "required": false; "isSignal": true; }; "cancelText": { "alias": "cancelText"; "required": false; "isSignal": true; }; "iconType": { "alias": "iconType"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "confirmed": "confirmed"; "cancelled": "cancelled"; "closed": "closed"; }, never, never, true, never>;
|
|
1160
1158
|
}
|
|
@@ -1399,6 +1397,16 @@ declare class TooltipComponent {
|
|
|
1399
1397
|
primaryCta: _angular_core.InputSignal<string | undefined>;
|
|
1400
1398
|
secondaryCta: _angular_core.InputSignal<string | undefined>;
|
|
1401
1399
|
showClose: _angular_core.InputSignal<boolean>;
|
|
1400
|
+
/**
|
|
1401
|
+
* Optional explicit width of the tooltip box (any CSS length, e.g. '330px',
|
|
1402
|
+
* '20rem'). Leave undefined to size to content.
|
|
1403
|
+
*/
|
|
1404
|
+
width: _angular_core.InputSignal<string | undefined>;
|
|
1405
|
+
/**
|
|
1406
|
+
* Optional explicit height of the tooltip box (any CSS length, e.g. '120px').
|
|
1407
|
+
* Leave undefined to size to content.
|
|
1408
|
+
*/
|
|
1409
|
+
height: _angular_core.InputSignal<string | undefined>;
|
|
1402
1410
|
/**
|
|
1403
1411
|
* Whether the tooltip is visible. Manages its own state internally —
|
|
1404
1412
|
* no consumer binding required. Supports [(visible)] for controlled mode.
|
|
@@ -1418,7 +1426,7 @@ declare class TooltipComponent {
|
|
|
1418
1426
|
get ptrBodyFill(): string;
|
|
1419
1427
|
get hostClasses(): string;
|
|
1420
1428
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipComponent, never>;
|
|
1421
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipComponent, "pecb-tooltip", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "pointerPosition": { "alias": "pointerPosition"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "primaryCta": { "alias": "primaryCta"; "required": false; "isSignal": true; }; "secondaryCta": { "alias": "secondaryCta"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; "closed": "closed"; "primaryCtaClick": "primaryCtaClick"; "secondaryCtaClick": "secondaryCtaClick"; }, never, never, true, never>;
|
|
1429
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TooltipComponent, "pecb-tooltip", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "pointerPosition": { "alias": "pointerPosition"; "required": false; "isSignal": true; }; "theme": { "alias": "theme"; "required": false; "isSignal": true; }; "primaryCta": { "alias": "primaryCta"; "required": false; "isSignal": true; }; "secondaryCta": { "alias": "secondaryCta"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; "closed": "closed"; "primaryCtaClick": "primaryCtaClick"; "secondaryCtaClick": "secondaryCtaClick"; }, never, never, true, never>;
|
|
1422
1430
|
}
|
|
1423
1431
|
|
|
1424
1432
|
declare class TooltipDirective implements OnDestroy {
|
|
@@ -2395,6 +2403,837 @@ declare class MediaComponent {
|
|
|
2395
2403
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MediaComponent, "pecb-media", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "socialStyle": { "alias": "socialStyle"; "required": false; "isSignal": true; }; "flagShape": { "alias": "flagShape"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "defaultAriaLabel": { "alias": "defaultAriaLabel"; "required": false; "isSignal": true; }; "copiedLabel": { "alias": "copiedLabel"; "required": false; "isSignal": true; }; "copyLabel": { "alias": "copyLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2396
2404
|
}
|
|
2397
2405
|
|
|
2406
|
+
/** A single `<source>` entry. Use an array of these for multi-format delivery. */
|
|
2407
|
+
interface VideoPlayerSource {
|
|
2408
|
+
/** Media URL. */
|
|
2409
|
+
src: string;
|
|
2410
|
+
/** MIME type, e.g. `video/mp4` or `application/x-mpegURL`. */
|
|
2411
|
+
type?: string;
|
|
2412
|
+
/** Optional media query (`<source media>`). */
|
|
2413
|
+
media?: string;
|
|
2414
|
+
}
|
|
2415
|
+
/** A text track (`<track>`) — captions, subtitles, chapters… */
|
|
2416
|
+
interface VideoPlayerTrack {
|
|
2417
|
+
/** WebVTT file URL. */
|
|
2418
|
+
src: string;
|
|
2419
|
+
/** BCP-47 language tag, e.g. `en`. */
|
|
2420
|
+
srclang: string;
|
|
2421
|
+
/** Human-readable label shown by the browser / assistive tech. */
|
|
2422
|
+
label?: string;
|
|
2423
|
+
/** @default 'captions' */
|
|
2424
|
+
kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
|
|
2425
|
+
/** Marks this track as the one toggled by the CC button / shown initially. */
|
|
2426
|
+
default?: boolean;
|
|
2427
|
+
}
|
|
2428
|
+
/** `preload` attribute values. */
|
|
2429
|
+
type VideoPlayerPreload = 'none' | 'metadata' | 'auto';
|
|
2430
|
+
/** Payload of `timeUpdate`, `seekEnd` and `loadedMetadata`. */
|
|
2431
|
+
interface VideoPlayerTimeEvent {
|
|
2432
|
+
/** Current playhead position in seconds. */
|
|
2433
|
+
currentTime: number;
|
|
2434
|
+
/** Media duration in seconds (`NaN`/`Infinity` for live streams before metadata). */
|
|
2435
|
+
duration: number;
|
|
2436
|
+
}
|
|
2437
|
+
/** Payload of the `playerError` output. */
|
|
2438
|
+
interface VideoPlayerError {
|
|
2439
|
+
/**
|
|
2440
|
+
* - `media`: the browser failed to load / decode the source (`<video (error)>`).
|
|
2441
|
+
* - `play-rejected`: `video.play()` was rejected (usually an autoplay policy).
|
|
2442
|
+
*/
|
|
2443
|
+
code: 'media' | 'play-rejected';
|
|
2444
|
+
message: string;
|
|
2445
|
+
originalError?: unknown;
|
|
2446
|
+
}
|
|
2447
|
+
/**
|
|
2448
|
+
* All user-visible strings. Override any subset via the `labels` input to
|
|
2449
|
+
* translate the player. `{n}` in `skipBack` is replaced by the seek step.
|
|
2450
|
+
*/
|
|
2451
|
+
interface VideoPlayerLabels {
|
|
2452
|
+
play: string;
|
|
2453
|
+
pause: string;
|
|
2454
|
+
replay: string;
|
|
2455
|
+
skipBack: string;
|
|
2456
|
+
mute: string;
|
|
2457
|
+
unmute: string;
|
|
2458
|
+
volume: string;
|
|
2459
|
+
captionsOn: string;
|
|
2460
|
+
captionsOff: string;
|
|
2461
|
+
settings: string;
|
|
2462
|
+
playbackSpeed: string;
|
|
2463
|
+
normalSpeed: string;
|
|
2464
|
+
enterFullscreen: string;
|
|
2465
|
+
exitFullscreen: string;
|
|
2466
|
+
seek: string;
|
|
2467
|
+
player: string;
|
|
2468
|
+
error: string;
|
|
2469
|
+
}
|
|
2470
|
+
declare const DEFAULT_VIDEO_PLAYER_LABELS: VideoPlayerLabels;
|
|
2471
|
+
/** Default playback-rate menu entries. */
|
|
2472
|
+
declare const DEFAULT_VIDEO_PLAYER_RATES: readonly number[];
|
|
2473
|
+
/**
|
|
2474
|
+
* Formats seconds as `m:ss`, or `h:mm:ss` once the value reaches one hour.
|
|
2475
|
+
* Non-finite / negative input renders as `0:00`.
|
|
2476
|
+
*/
|
|
2477
|
+
declare function formatVideoTime(seconds: number): string;
|
|
2478
|
+
/**
|
|
2479
|
+
* PECB course video player.
|
|
2480
|
+
*
|
|
2481
|
+
* A fully custom-skinned, accessible HTML5 `<video>` wrapper that reproduces
|
|
2482
|
+
* the PECB "Course Player" design: a rounded dark 16:9 stage, poster, brand
|
|
2483
|
+
* watermark + section label, a blurred centre play button and a bottom
|
|
2484
|
+
* control bar (progress, play/pause, rewind, volume, time, captions, speed
|
|
2485
|
+
* settings, fullscreen).
|
|
2486
|
+
*
|
|
2487
|
+
* The player is self-contained (no icon-registry / service dependencies) so it
|
|
2488
|
+
* can be dropped into any Angular 17+ app. It is responsive (container
|
|
2489
|
+
* queries), keyboard operable, touch friendly and honours
|
|
2490
|
+
* `prefers-reduced-motion`.
|
|
2491
|
+
*
|
|
2492
|
+
* @example Minimal
|
|
2493
|
+
* ```html
|
|
2494
|
+
* <pecb-video-player
|
|
2495
|
+
* src="https://cdn.example.com/lesson.mp4"
|
|
2496
|
+
* poster="https://cdn.example.com/lesson.jpg"
|
|
2497
|
+
* label="SECTION 2">
|
|
2498
|
+
* </pecb-video-player>
|
|
2499
|
+
* ```
|
|
2500
|
+
*
|
|
2501
|
+
* @example Two-way bound & driven from outside (e.g. a transcript panel)
|
|
2502
|
+
* ```html
|
|
2503
|
+
* <pecb-video-player
|
|
2504
|
+
* [src]="sources"
|
|
2505
|
+
* [tracks]="captions"
|
|
2506
|
+
* [(currentTime)]="at"
|
|
2507
|
+
* [(playing)]="playing"
|
|
2508
|
+
* (playbackEnded)="onLessonFinished()">
|
|
2509
|
+
* </pecb-video-player>
|
|
2510
|
+
* ```
|
|
2511
|
+
*
|
|
2512
|
+
* Theming — override the CSS custom properties on the host:
|
|
2513
|
+
* ```css
|
|
2514
|
+
* pecb-video-player { --pecb-video-radius: 0; --pecb-video-accent: #a11e29; }
|
|
2515
|
+
* ```
|
|
2516
|
+
*/
|
|
2517
|
+
declare class VideoPlayerComponent {
|
|
2518
|
+
private readonly platformId;
|
|
2519
|
+
private readonly zone;
|
|
2520
|
+
private readonly destroyRef;
|
|
2521
|
+
private readonly isBrowser;
|
|
2522
|
+
/** Unique id used to wire ARIA relationships inside the template. */
|
|
2523
|
+
readonly uid: string;
|
|
2524
|
+
private readonly rootRef;
|
|
2525
|
+
private readonly videoRef;
|
|
2526
|
+
private readonly progressRef;
|
|
2527
|
+
private readonly settingsMenuRef;
|
|
2528
|
+
/** Media URL, or a list of `<source>` candidates. */
|
|
2529
|
+
src: _angular_core.InputSignal<string | VideoPlayerSource[] | undefined>;
|
|
2530
|
+
/** Poster image shown before playback starts. */
|
|
2531
|
+
poster: _angular_core.InputSignal<string | undefined>;
|
|
2532
|
+
/** Text tracks (captions / subtitles). The CC button appears when non-empty. */
|
|
2533
|
+
tracks: _angular_core.InputSignal<VideoPlayerTrack[]>;
|
|
2534
|
+
/** Accessible title of the media, announced as part of the region label. */
|
|
2535
|
+
title: _angular_core.InputSignal<string | undefined>;
|
|
2536
|
+
/** `crossorigin` attribute — required for captions hosted on another origin. */
|
|
2537
|
+
crossOrigin: _angular_core.InputSignal<"anonymous" | "use-credentials" | undefined>;
|
|
2538
|
+
/** @default 'metadata' */
|
|
2539
|
+
preload: _angular_core.InputSignal<VideoPlayerPreload>;
|
|
2540
|
+
/** Attempt to start playback automatically (subject to browser policy). */
|
|
2541
|
+
autoplay: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2542
|
+
/** Restart from the beginning when the media ends. */
|
|
2543
|
+
loop: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2544
|
+
/** Play inline on iOS instead of forcing the native fullscreen player. @default true */
|
|
2545
|
+
playsInline: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2546
|
+
/** Initial playhead position in seconds (applied once metadata is loaded). */
|
|
2547
|
+
startTime: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
2548
|
+
/** Brand watermark in the bottom-left corner. Empty string hides it. @default 'PECB' */
|
|
2549
|
+
watermark: _angular_core.InputSignal<string>;
|
|
2550
|
+
/** Large label in the bottom-right corner, e.g. `SECTION 2`. */
|
|
2551
|
+
label: _angular_core.InputSignal<string | undefined>;
|
|
2552
|
+
/** CSS `aspect-ratio` of the stage. @default '16 / 9' */
|
|
2553
|
+
aspectRatio: _angular_core.InputSignal<string>;
|
|
2554
|
+
/** Show the large centre play/pause button. @default true */
|
|
2555
|
+
showCenterButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2556
|
+
/** Show the rewind button. @default true */
|
|
2557
|
+
showSkipBack: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2558
|
+
/** Show the mute button + volume slider. @default true */
|
|
2559
|
+
showVolume: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2560
|
+
/** Show the elapsed / total time. @default true */
|
|
2561
|
+
showTime: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2562
|
+
/** Force-show/hide the captions button. `undefined` = show only when `tracks` is non-empty. */
|
|
2563
|
+
showCaptions: _angular_core.InputSignal<boolean | undefined>;
|
|
2564
|
+
/** Show the settings (playback speed) button. @default true */
|
|
2565
|
+
showSettings: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2566
|
+
/** Show the fullscreen button. @default true */
|
|
2567
|
+
showFullscreen: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2568
|
+
/** Seconds the rewind button / arrow keys jump. @default 10 */
|
|
2569
|
+
seekStep: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
2570
|
+
/** Playback-rate options listed in the settings menu. */
|
|
2571
|
+
playbackRates: _angular_core.InputSignal<readonly number[]>;
|
|
2572
|
+
/** Partial override of the user-visible strings (i18n). */
|
|
2573
|
+
labels: _angular_core.InputSignal<Partial<VideoPlayerLabels>>;
|
|
2574
|
+
/** Whether the media is playing. Set it to start/stop playback. */
|
|
2575
|
+
playing: _angular_core.ModelSignal<boolean>;
|
|
2576
|
+
/** Playhead position in seconds. Set it to seek. */
|
|
2577
|
+
currentTime: _angular_core.ModelSignal<number>;
|
|
2578
|
+
/** Volume 0–1. */
|
|
2579
|
+
volume: _angular_core.ModelSignal<number>;
|
|
2580
|
+
/** Muted state. */
|
|
2581
|
+
muted: _angular_core.ModelSignal<boolean>;
|
|
2582
|
+
/** Playback rate. */
|
|
2583
|
+
playbackRate: _angular_core.ModelSignal<number>;
|
|
2584
|
+
/** Whether the default text track is displayed. */
|
|
2585
|
+
captionsEnabled: _angular_core.ModelSignal<boolean>;
|
|
2586
|
+
/** Fires on every `timeupdate` (~4×/s while playing). */
|
|
2587
|
+
timeUpdate: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
2588
|
+
/** Duration is known. */
|
|
2589
|
+
loadedMetadata: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
2590
|
+
/** A seek finished. */
|
|
2591
|
+
seekEnd: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
2592
|
+
/** Playback reached the end. */
|
|
2593
|
+
playbackEnded: _angular_core.OutputEmitterRef<void>;
|
|
2594
|
+
/** Player entered / left fullscreen. */
|
|
2595
|
+
fullscreenChange: _angular_core.OutputEmitterRef<boolean>;
|
|
2596
|
+
/** Media failed to load or playback was rejected. */
|
|
2597
|
+
playerError: _angular_core.OutputEmitterRef<VideoPlayerError>;
|
|
2598
|
+
readonly duration: _angular_core.WritableSignal<number>;
|
|
2599
|
+
readonly bufferedEnd: _angular_core.WritableSignal<number>;
|
|
2600
|
+
readonly hasEnded: _angular_core.WritableSignal<boolean>;
|
|
2601
|
+
readonly isBuffering: _angular_core.WritableSignal<boolean>;
|
|
2602
|
+
readonly hasError: _angular_core.WritableSignal<boolean>;
|
|
2603
|
+
readonly isFullscreen: _angular_core.WritableSignal<boolean>;
|
|
2604
|
+
readonly isSeeking: _angular_core.WritableSignal<boolean>;
|
|
2605
|
+
readonly settingsOpen: _angular_core.WritableSignal<boolean>;
|
|
2606
|
+
readonly controlsVisible: _angular_core.WritableSignal<boolean>;
|
|
2607
|
+
readonly hasStarted: _angular_core.WritableSignal<boolean>;
|
|
2608
|
+
private hideTimer;
|
|
2609
|
+
private lastPointerType;
|
|
2610
|
+
private startTimeApplied;
|
|
2611
|
+
private initialLoadDone;
|
|
2612
|
+
private pendingPlay;
|
|
2613
|
+
readonly text: _angular_core.Signal<VideoPlayerLabels>;
|
|
2614
|
+
readonly skipBackLabel: _angular_core.Signal<string>;
|
|
2615
|
+
readonly sourceList: _angular_core.Signal<VideoPlayerSource[]>;
|
|
2616
|
+
/** Single-string src is bound directly so the browser can start fetching ASAP. */
|
|
2617
|
+
readonly singleSrc: _angular_core.Signal<string | undefined>;
|
|
2618
|
+
readonly progressPct: _angular_core.Signal<number>;
|
|
2619
|
+
readonly bufferedPct: _angular_core.Signal<number>;
|
|
2620
|
+
readonly currentTimeLabel: _angular_core.Signal<string>;
|
|
2621
|
+
readonly durationLabel: _angular_core.Signal<string>;
|
|
2622
|
+
readonly captionsButtonVisible: _angular_core.Signal<boolean>;
|
|
2623
|
+
/** Volume as an integer percentage (0 while muted) — drives the slider. */
|
|
2624
|
+
readonly volumePct: _angular_core.Signal<number>;
|
|
2625
|
+
readonly volumeLevel: _angular_core.Signal<"muted" | "low" | "high">;
|
|
2626
|
+
readonly regionLabel: _angular_core.Signal<string>;
|
|
2627
|
+
/** Controls are hidden only while playing and idle. */
|
|
2628
|
+
readonly controlsHidden: _angular_core.Signal<boolean>;
|
|
2629
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
2630
|
+
constructor();
|
|
2631
|
+
/** Start playback. */
|
|
2632
|
+
play(): void;
|
|
2633
|
+
/** Pause playback. */
|
|
2634
|
+
pause(): void;
|
|
2635
|
+
/** Toggle play / pause (replays from the start after the media ended). */
|
|
2636
|
+
togglePlay(): void;
|
|
2637
|
+
/** Seek to an absolute position (seconds, clamped to the duration). */
|
|
2638
|
+
seek(seconds: number): void;
|
|
2639
|
+
/** Seek relative to the current position. */
|
|
2640
|
+
seekBy(deltaSeconds: number): void;
|
|
2641
|
+
/** Rewind by `seekStep` seconds. */
|
|
2642
|
+
skipBack(): void;
|
|
2643
|
+
/** Toggle mute. Unmuting a zero volume restores it to 50 %. */
|
|
2644
|
+
toggleMute(): void;
|
|
2645
|
+
/** Set volume (0–1). A non-zero value also unmutes. */
|
|
2646
|
+
setVolume(value: number): void;
|
|
2647
|
+
/** Set the playback rate and close the settings menu. */
|
|
2648
|
+
setPlaybackRate(rate: number): void;
|
|
2649
|
+
/** Toggle captions on the default text track. */
|
|
2650
|
+
toggleCaptions(): void;
|
|
2651
|
+
/** Enter / exit fullscreen for the whole player (falls back to the native iOS player). */
|
|
2652
|
+
toggleFullscreen(): Promise<void>;
|
|
2653
|
+
/** Open / close the settings (playback speed) menu. */
|
|
2654
|
+
toggleSettings(): void;
|
|
2655
|
+
/** Close the settings menu; optionally move focus back to its trigger. */
|
|
2656
|
+
closeSettings(restoreFocus?: boolean): void;
|
|
2657
|
+
onLoadedMetadata(video: HTMLVideoElement): void;
|
|
2658
|
+
onDurationChange(video: HTMLVideoElement): void;
|
|
2659
|
+
onTimeUpdate(video: HTMLVideoElement): void;
|
|
2660
|
+
onProgress(video: HTMLVideoElement): void;
|
|
2661
|
+
onPlay(): void;
|
|
2662
|
+
onPause(): void;
|
|
2663
|
+
onEnded(): void;
|
|
2664
|
+
onWaiting(): void;
|
|
2665
|
+
onPlaying(): void;
|
|
2666
|
+
onSeeked(video: HTMLVideoElement): void;
|
|
2667
|
+
onVolumeChange(video: HTMLVideoElement): void;
|
|
2668
|
+
onRateChange(video: HTMLVideoElement): void;
|
|
2669
|
+
onMediaError(video: HTMLVideoElement): void;
|
|
2670
|
+
onStagePointerDown(event: PointerEvent): void;
|
|
2671
|
+
/** Click on the video surface: toggles play on mouse; on touch, first reveals the controls. */
|
|
2672
|
+
onStageClick(): void;
|
|
2673
|
+
onStageDoubleClick(): void;
|
|
2674
|
+
/** Keyboard shortcuts on the player region. */
|
|
2675
|
+
onRootKeydown(event: KeyboardEvent): void;
|
|
2676
|
+
onProgressPointerDown(event: PointerEvent): void;
|
|
2677
|
+
onProgressPointerMove(event: PointerEvent): void;
|
|
2678
|
+
onProgressPointerUp(event: PointerEvent): void;
|
|
2679
|
+
onProgressKeydown(event: KeyboardEvent): void;
|
|
2680
|
+
private seekToPointer;
|
|
2681
|
+
onVolumeInput(event: Event): void;
|
|
2682
|
+
onSettingsMenuKeydown(event: KeyboardEvent): void;
|
|
2683
|
+
onRootFocusOut(event: FocusEvent): void;
|
|
2684
|
+
onDocumentFullscreenChange(): void;
|
|
2685
|
+
onDocumentPointerDown(event: PointerEvent): void;
|
|
2686
|
+
/** Show the controls and (if playing) restart the idle timer. */
|
|
2687
|
+
revealControls(reschedule?: boolean): void;
|
|
2688
|
+
private scheduleHide;
|
|
2689
|
+
private clearHideTimer;
|
|
2690
|
+
/**
|
|
2691
|
+
* High-frequency pointer listeners are registered outside the Angular zone so
|
|
2692
|
+
* mouse movement over the stage doesn't trigger change detection; we only
|
|
2693
|
+
* re-enter the zone when the visibility state actually flips.
|
|
2694
|
+
*/
|
|
2695
|
+
private attachIdleListeners;
|
|
2696
|
+
private safePlay;
|
|
2697
|
+
private applyCaptionMode;
|
|
2698
|
+
private resetForNewSource;
|
|
2699
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<VideoPlayerComponent, never>;
|
|
2700
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<VideoPlayerComponent, "pecb-video-player", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "poster": { "alias": "poster"; "required": false; "isSignal": true; }; "tracks": { "alias": "tracks"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "crossOrigin": { "alias": "crossOrigin"; "required": false; "isSignal": true; }; "preload": { "alias": "preload"; "required": false; "isSignal": true; }; "autoplay": { "alias": "autoplay"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "playsInline": { "alias": "playsInline"; "required": false; "isSignal": true; }; "startTime": { "alias": "startTime"; "required": false; "isSignal": true; }; "watermark": { "alias": "watermark"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; "showCenterButton": { "alias": "showCenterButton"; "required": false; "isSignal": true; }; "showSkipBack": { "alias": "showSkipBack"; "required": false; "isSignal": true; }; "showVolume": { "alias": "showVolume"; "required": false; "isSignal": true; }; "showTime": { "alias": "showTime"; "required": false; "isSignal": true; }; "showCaptions": { "alias": "showCaptions"; "required": false; "isSignal": true; }; "showSettings": { "alias": "showSettings"; "required": false; "isSignal": true; }; "showFullscreen": { "alias": "showFullscreen"; "required": false; "isSignal": true; }; "seekStep": { "alias": "seekStep"; "required": false; "isSignal": true; }; "playbackRates": { "alias": "playbackRates"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "playing": { "alias": "playing"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "required": false; "isSignal": true; }; "volume": { "alias": "volume"; "required": false; "isSignal": true; }; "muted": { "alias": "muted"; "required": false; "isSignal": true; }; "playbackRate": { "alias": "playbackRate"; "required": false; "isSignal": true; }; "captionsEnabled": { "alias": "captionsEnabled"; "required": false; "isSignal": true; }; }, { "playing": "playingChange"; "currentTime": "currentTimeChange"; "volume": "volumeChange"; "muted": "mutedChange"; "playbackRate": "playbackRateChange"; "captionsEnabled": "captionsEnabledChange"; "timeUpdate": "timeUpdate"; "loadedMetadata": "loadedMetadata"; "seekEnd": "seekEnd"; "playbackEnded": "playbackEnded"; "fullscreenChange": "fullscreenChange"; "playerError": "playerError"; }, never, ["[pecbVideoOverlay]"], true, never>;
|
|
2701
|
+
}
|
|
2702
|
+
|
|
2703
|
+
/** Kind of course item. @default 'video' */
|
|
2704
|
+
type CourseLessonType = 'video' | 'quiz';
|
|
2705
|
+
/**
|
|
2706
|
+
* Progress state of a lesson.
|
|
2707
|
+
*
|
|
2708
|
+
* - `completed` — finished (green check).
|
|
2709
|
+
* - `playing` — currently playing (accent disc). Only meaningful for the
|
|
2710
|
+
* active lesson; on any other lesson it renders as `started`.
|
|
2711
|
+
* - `started` — partially watched / answered (amber progress ring).
|
|
2712
|
+
* - `available` — not started yet (outlined disc).
|
|
2713
|
+
* - `locked` — not selectable (lock disc, row disabled).
|
|
2714
|
+
*
|
|
2715
|
+
* @default 'available'
|
|
2716
|
+
*/
|
|
2717
|
+
type CourseLessonStatus = 'completed' | 'playing' | 'started' | 'available' | 'locked';
|
|
2718
|
+
/** A single transcript cue. */
|
|
2719
|
+
interface CourseTranscriptCue {
|
|
2720
|
+
/** Cue start, in seconds. */
|
|
2721
|
+
time: number;
|
|
2722
|
+
/** Cue text. */
|
|
2723
|
+
text: string;
|
|
2724
|
+
}
|
|
2725
|
+
/** One lesson (video or quiz) inside a module. */
|
|
2726
|
+
interface CourseLesson {
|
|
2727
|
+
/** Stable unique id — used for selection and `@for` tracking. */
|
|
2728
|
+
id: string;
|
|
2729
|
+
/**
|
|
2730
|
+
* Lesson title. A title of the shape `"Base — Part 3"` makes the panel group
|
|
2731
|
+
* consecutive lessons that share `Base` under one sub-heading, listing them as
|
|
2732
|
+
* `Part 1`, `Part 2`, … on a connected timeline rail (design behaviour).
|
|
2733
|
+
*/
|
|
2734
|
+
title: string;
|
|
2735
|
+
/** @default 'video' */
|
|
2736
|
+
type?: CourseLessonType;
|
|
2737
|
+
/** @default 'available' */
|
|
2738
|
+
status?: CourseLessonStatus;
|
|
2739
|
+
/** Total length of the video, in seconds. */
|
|
2740
|
+
durationSeconds?: number;
|
|
2741
|
+
/** Where playback resumes, in seconds. */
|
|
2742
|
+
resumeSeconds?: number;
|
|
2743
|
+
/** Quiz: number of questions. */
|
|
2744
|
+
questionCount?: number;
|
|
2745
|
+
/** Quiz: how many questions have been answered (drives the `started` ring). */
|
|
2746
|
+
answeredCount?: number;
|
|
2747
|
+
/** Quiz: how many answers were correct (shown once `completed`). */
|
|
2748
|
+
correctCount?: number;
|
|
2749
|
+
/** Video source(s) for this lesson. */
|
|
2750
|
+
src?: string | VideoPlayerSource[];
|
|
2751
|
+
/** Poster image for this lesson. */
|
|
2752
|
+
poster?: string;
|
|
2753
|
+
/** Caption/subtitle tracks for this lesson. */
|
|
2754
|
+
tracks?: VideoPlayerTrack[];
|
|
2755
|
+
/** Large label painted on the video stage, e.g. `SECTION 2`. */
|
|
2756
|
+
stageLabel?: string;
|
|
2757
|
+
/** Transcript cues for this lesson (overrides the panel-level `transcript`). */
|
|
2758
|
+
transcript?: CourseTranscriptCue[];
|
|
2759
|
+
/** Escape hatch for consumer-specific data; never read by the components. */
|
|
2760
|
+
meta?: Record<string, unknown>;
|
|
2761
|
+
}
|
|
2762
|
+
/** A module (a "Section" in the UI) holding one or more lessons. */
|
|
2763
|
+
interface CourseModule {
|
|
2764
|
+
/** Stable unique id. */
|
|
2765
|
+
id: string;
|
|
2766
|
+
/** Module title — shown as the sub-heading of a part-run, and in search. */
|
|
2767
|
+
title: string;
|
|
2768
|
+
lessons: CourseLesson[];
|
|
2769
|
+
}
|
|
2770
|
+
/** Aggregate counters for one module. */
|
|
2771
|
+
interface CourseModuleStats {
|
|
2772
|
+
total: number;
|
|
2773
|
+
done: number;
|
|
2774
|
+
playing: boolean;
|
|
2775
|
+
started: boolean;
|
|
2776
|
+
/** Sum of every lesson duration, in seconds. */
|
|
2777
|
+
durationSeconds: number;
|
|
2778
|
+
/** Completed percentage, 0–100 (rounded). */
|
|
2779
|
+
percent: number;
|
|
2780
|
+
}
|
|
2781
|
+
/** Aggregate counters for a whole course. */
|
|
2782
|
+
interface CourseProgressStats {
|
|
2783
|
+
total: number;
|
|
2784
|
+
done: number;
|
|
2785
|
+
/** Completed percentage, 0–100 (rounded). */
|
|
2786
|
+
percent: number;
|
|
2787
|
+
/** Seconds of video still to watch. */
|
|
2788
|
+
remainingSeconds: number;
|
|
2789
|
+
}
|
|
2790
|
+
/**
|
|
2791
|
+
* Human-readable lesson length: `"9 min"`, `"12 min 4 sec"`, `"1 hr 3 min"`.
|
|
2792
|
+
* Non-finite / negative input renders as `"0 min"`.
|
|
2793
|
+
*/
|
|
2794
|
+
declare function formatCourseDuration(seconds: number | undefined): string;
|
|
2795
|
+
/**
|
|
2796
|
+
* Clock reading: `m:ss`, or `h:mm:ss` from one hour up.
|
|
2797
|
+
* Non-finite / negative input renders as `0:00`.
|
|
2798
|
+
*/
|
|
2799
|
+
declare function formatCourseTime(seconds: number | undefined): string;
|
|
2800
|
+
/**
|
|
2801
|
+
* Splits `"Base — Part 3"` into `{ base: 'Base', part: 'Part 3' }`.
|
|
2802
|
+
* A title without the marker yields `{ base: title, part: null }`.
|
|
2803
|
+
*/
|
|
2804
|
+
declare function parseLessonPartTitle(title: string): {
|
|
2805
|
+
base: string;
|
|
2806
|
+
part: string | null;
|
|
2807
|
+
};
|
|
2808
|
+
/**
|
|
2809
|
+
* Resolves the status actually rendered for a lesson.
|
|
2810
|
+
*
|
|
2811
|
+
* The active video lesson follows live playback (`playing` while the player is
|
|
2812
|
+
* running, otherwise `started` — unless it is already `completed`), and a
|
|
2813
|
+
* `playing` status on any *other* lesson degrades to `started`, so exactly one
|
|
2814
|
+
* row can ever show the "now playing" treatment. `locked` always wins.
|
|
2815
|
+
*/
|
|
2816
|
+
declare function resolveLessonStatus(lesson: CourseLesson, active: boolean, livePlaying: boolean): CourseLessonStatus;
|
|
2817
|
+
/** Counters for one module, computed from already-resolved lesson statuses. */
|
|
2818
|
+
declare function courseModuleStats(module: CourseModule, resolve?: (lesson: CourseLesson) => CourseLessonStatus): CourseModuleStats;
|
|
2819
|
+
/** Counters for a whole course. */
|
|
2820
|
+
declare function courseProgress(modules: readonly CourseModule[], resolve?: (lesson: CourseLesson) => CourseLessonStatus): CourseProgressStats;
|
|
2821
|
+
/** Finds the module a lesson belongs to. */
|
|
2822
|
+
declare function findCourseModule(modules: readonly CourseModule[], lessonId: string | null | undefined): CourseModule | undefined;
|
|
2823
|
+
/** Finds a lesson by id across all modules. */
|
|
2824
|
+
declare function findCourseLesson(modules: readonly CourseModule[], lessonId: string | null | undefined): CourseLesson | undefined;
|
|
2825
|
+
|
|
2826
|
+
/** Which tab the panel shows. */
|
|
2827
|
+
type CourseContentPanelTab = 'content' | 'transcript';
|
|
2828
|
+
/** Grouped accordion (default) or one flat connected timeline. */
|
|
2829
|
+
type CourseContentPanelLayout = 'grouped' | 'timeline';
|
|
2830
|
+
/** Row spacing. */
|
|
2831
|
+
type CourseContentPanelDensity = 'comfortable' | 'compact';
|
|
2832
|
+
/** Colour used for the "now playing" treatment. */
|
|
2833
|
+
type CourseContentPanelAccent = 'charcoal' | 'red';
|
|
2834
|
+
/**
|
|
2835
|
+
* Every user-visible string. Override any subset through `labels`.
|
|
2836
|
+
* `{n}`, `{done}`, `{total}`, `{query}`, `{duration}` are replaced at runtime.
|
|
2837
|
+
*/
|
|
2838
|
+
interface CourseContentPanelLabels {
|
|
2839
|
+
contentTab: string;
|
|
2840
|
+
transcriptTab: string;
|
|
2841
|
+
searchLessons: string;
|
|
2842
|
+
searchTranscript: string;
|
|
2843
|
+
clearSearch: string;
|
|
2844
|
+
quiz: string;
|
|
2845
|
+
questions: string;
|
|
2846
|
+
passed: string;
|
|
2847
|
+
answered: string;
|
|
2848
|
+
resume: string;
|
|
2849
|
+
moduleDone: string;
|
|
2850
|
+
section: string;
|
|
2851
|
+
noLessons: string;
|
|
2852
|
+
noTranscript: string;
|
|
2853
|
+
autoscroll: string;
|
|
2854
|
+
courseProgress: string;
|
|
2855
|
+
courseProgressDetail: string;
|
|
2856
|
+
certificate: string;
|
|
2857
|
+
locked: string;
|
|
2858
|
+
lessonList: string;
|
|
2859
|
+
}
|
|
2860
|
+
declare const DEFAULT_COURSE_CONTENT_PANEL_LABELS: CourseContentPanelLabels;
|
|
2861
|
+
/** Everything one lesson row needs, precomputed so the template stays dumb. */
|
|
2862
|
+
interface CourseLessonView {
|
|
2863
|
+
lesson: CourseLesson;
|
|
2864
|
+
id: string;
|
|
2865
|
+
active: boolean;
|
|
2866
|
+
status: CourseLessonStatus;
|
|
2867
|
+
isQuiz: boolean;
|
|
2868
|
+
isPlaying: boolean;
|
|
2869
|
+
isStarted: boolean;
|
|
2870
|
+
isCompleted: boolean;
|
|
2871
|
+
isLocked: boolean;
|
|
2872
|
+
/** `null` hides the title line (parts run: the quiz row shows only its badge). */
|
|
2873
|
+
displayTitle: string | null;
|
|
2874
|
+
/** Accessible name for the row button — always the full lesson title. */
|
|
2875
|
+
ariaLabel: string;
|
|
2876
|
+
durationLabel: string;
|
|
2877
|
+
questionsLabel: string;
|
|
2878
|
+
quizResultLabel: string | null;
|
|
2879
|
+
timeLabel: string | null;
|
|
2880
|
+
showBar: boolean;
|
|
2881
|
+
barPercent: number;
|
|
2882
|
+
/** Status disc geometry. */
|
|
2883
|
+
discSize: number;
|
|
2884
|
+
discCenter: number;
|
|
2885
|
+
ringRadius: number;
|
|
2886
|
+
ringCircumference: number;
|
|
2887
|
+
ringOffset: number;
|
|
2888
|
+
ringViewBox: string;
|
|
2889
|
+
/** Glyph sizes inside the disc (design values, per density and status). */
|
|
2890
|
+
checkSize: number;
|
|
2891
|
+
pauseSize: number;
|
|
2892
|
+
playIconSize: number;
|
|
2893
|
+
quizIconSize: number;
|
|
2894
|
+
/** Timeline connector below the disc. */
|
|
2895
|
+
connector: boolean;
|
|
2896
|
+
connectorDone: boolean;
|
|
2897
|
+
}
|
|
2898
|
+
/** A run of consecutive lessons that share a base title. */
|
|
2899
|
+
interface CourseLessonRunView {
|
|
2900
|
+
key: string;
|
|
2901
|
+
/** `true` when the run is rendered as a sub-heading + connected rail. */
|
|
2902
|
+
parts: boolean;
|
|
2903
|
+
base: string;
|
|
2904
|
+
lessons: CourseLessonView[];
|
|
2905
|
+
}
|
|
2906
|
+
/** One accordion section. */
|
|
2907
|
+
interface CourseModuleView {
|
|
2908
|
+
module: CourseModule;
|
|
2909
|
+
id: string;
|
|
2910
|
+
/** 1-based position in the *unfiltered* module list (stable while searching). */
|
|
2911
|
+
number: number;
|
|
2912
|
+
title: string;
|
|
2913
|
+
stats: CourseModuleStats;
|
|
2914
|
+
statsLabel: string;
|
|
2915
|
+
durationLabel: string;
|
|
2916
|
+
allDone: boolean;
|
|
2917
|
+
active: boolean;
|
|
2918
|
+
runs: CourseLessonRunView[];
|
|
2919
|
+
/** Single-lesson module rendered as a direct-play row (opt-in). */
|
|
2920
|
+
solo: CourseLessonView | null;
|
|
2921
|
+
}
|
|
2922
|
+
/** A row of the flat timeline layout — either a section divider or a lesson. */
|
|
2923
|
+
interface CourseTimelineRow {
|
|
2924
|
+
key: string;
|
|
2925
|
+
header: {
|
|
2926
|
+
number: number;
|
|
2927
|
+
title: string;
|
|
2928
|
+
stats: CourseModuleStats;
|
|
2929
|
+
} | null;
|
|
2930
|
+
lesson: CourseLessonView | null;
|
|
2931
|
+
}
|
|
2932
|
+
/** One transcript cue row. */
|
|
2933
|
+
interface CourseTranscriptRow {
|
|
2934
|
+
key: string;
|
|
2935
|
+
cue: CourseTranscriptCue;
|
|
2936
|
+
timeLabel: string;
|
|
2937
|
+
current: boolean;
|
|
2938
|
+
/** Text split around the search match so the template can wrap it in `<mark>`. */
|
|
2939
|
+
before: string;
|
|
2940
|
+
match: string;
|
|
2941
|
+
after: string;
|
|
2942
|
+
}
|
|
2943
|
+
/**
|
|
2944
|
+
* PECB course **Content** panel — the sidebar that sits next to the course
|
|
2945
|
+
* video player.
|
|
2946
|
+
*
|
|
2947
|
+
* Reproduces the "Course Player — Content Redesign" panel exactly: the
|
|
2948
|
+
* Content / Transcript tabs, lesson search, the collapsible **Section**
|
|
2949
|
+
* accordion (one section open at a time, auto-opening the section that owns the
|
|
2950
|
+
* active lesson), status discs (completed / now playing / in-progress ring /
|
|
2951
|
+
* not started / locked), quiz rows with badge + score, per-lesson progress bars,
|
|
2952
|
+
* the "Part 1 / Part 2 …" timeline rail for multi-part lessons, an alternative
|
|
2953
|
+
* flat timeline layout, and the searchable transcript with click-to-seek,
|
|
2954
|
+
* live cue highlighting and an autoscroll toggle.
|
|
2955
|
+
*
|
|
2956
|
+
* It is standalone and data-driven — no player dependency — so it can be used
|
|
2957
|
+
* next to `pecb-video-player`, inside `pecb-course-player`, or on its own.
|
|
2958
|
+
*
|
|
2959
|
+
* @example
|
|
2960
|
+
* ```html
|
|
2961
|
+
* <pecb-course-content-panel
|
|
2962
|
+
* [modules]="modules"
|
|
2963
|
+
* [transcript]="cues"
|
|
2964
|
+
* [(activeLessonId)]="lessonId"
|
|
2965
|
+
* [playing]="playing()"
|
|
2966
|
+
* [currentTime]="currentTime()"
|
|
2967
|
+
* (lessonSelect)="openLesson($event)"
|
|
2968
|
+
* (transcriptSeek)="seekTo($event)">
|
|
2969
|
+
* </pecb-course-content-panel>
|
|
2970
|
+
* ```
|
|
2971
|
+
*
|
|
2972
|
+
* Theming — override the CSS custom properties on the host:
|
|
2973
|
+
* ```css
|
|
2974
|
+
* pecb-course-content-panel { --pecb-course-panel-accent: #a11e29; }
|
|
2975
|
+
* ```
|
|
2976
|
+
*/
|
|
2977
|
+
declare class CourseContentPanelComponent {
|
|
2978
|
+
private readonly platformId;
|
|
2979
|
+
private readonly injector;
|
|
2980
|
+
private readonly isBrowser;
|
|
2981
|
+
/** Unique id prefix used to wire ARIA relationships. */
|
|
2982
|
+
readonly uid: string;
|
|
2983
|
+
private readonly transcriptScrollRef;
|
|
2984
|
+
/** Course structure rendered by the Content tab. */
|
|
2985
|
+
modules: _angular_core.InputSignal<CourseModule[]>;
|
|
2986
|
+
/**
|
|
2987
|
+
* Transcript cues for the active lesson. A `transcript` on the active
|
|
2988
|
+
* `CourseLesson` takes precedence over this input.
|
|
2989
|
+
*/
|
|
2990
|
+
transcript: _angular_core.InputSignal<CourseTranscriptCue[]>;
|
|
2991
|
+
/** Currently selected lesson. */
|
|
2992
|
+
activeLessonId: _angular_core.ModelSignal<string | null>;
|
|
2993
|
+
/** Visible tab. */
|
|
2994
|
+
tab: _angular_core.ModelSignal<CourseContentPanelTab>;
|
|
2995
|
+
/**
|
|
2996
|
+
* Id of the expanded section. `null` collapses all of them.
|
|
2997
|
+
* Left `undefined` the panel picks one itself (the active lesson's section,
|
|
2998
|
+
* otherwise the first one).
|
|
2999
|
+
*/
|
|
3000
|
+
openModuleId: _angular_core.ModelSignal<string | null | undefined>;
|
|
3001
|
+
/** Whether the transcript follows playback. */
|
|
3002
|
+
autoscroll: _angular_core.ModelSignal<boolean>;
|
|
3003
|
+
/** Lesson search text (Content tab). */
|
|
3004
|
+
query: _angular_core.ModelSignal<string>;
|
|
3005
|
+
/** Transcript search text. */
|
|
3006
|
+
transcriptQuery: _angular_core.ModelSignal<string>;
|
|
3007
|
+
/** Whether the player is currently playing — drives the "now playing" row. */
|
|
3008
|
+
playing: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3009
|
+
/**
|
|
3010
|
+
* Live playhead position in seconds. Used to highlight the transcript cue and
|
|
3011
|
+
* to draw live progress on the active lesson row; falls back to each lesson's
|
|
3012
|
+
* `resumeSeconds` when omitted.
|
|
3013
|
+
*/
|
|
3014
|
+
currentTime: _angular_core.InputSignal<number | undefined>;
|
|
3015
|
+
/** @default 'grouped' */
|
|
3016
|
+
layout: _angular_core.InputSignal<CourseContentPanelLayout>;
|
|
3017
|
+
/** @default 'comfortable' */
|
|
3018
|
+
density: _angular_core.InputSignal<CourseContentPanelDensity>;
|
|
3019
|
+
/** Colour of the "now playing" treatment. @default 'charcoal' */
|
|
3020
|
+
accent: _angular_core.InputSignal<CourseContentPanelAccent>;
|
|
3021
|
+
/** Show the Content / Transcript tab strip. @default true */
|
|
3022
|
+
showTabs: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3023
|
+
/** Show the lesson search box. @default true */
|
|
3024
|
+
showSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3025
|
+
/** Show the transcript search box. @default true */
|
|
3026
|
+
showTranscriptSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3027
|
+
/** Show the autoscroll footer on the Transcript tab. @default true */
|
|
3028
|
+
showAutoscroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3029
|
+
/** Show the circular course-progress header above the list. @default false */
|
|
3030
|
+
showProgress: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3031
|
+
/** Show the "Certificate" pill inside the progress header. @default true */
|
|
3032
|
+
showCertificate: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3033
|
+
/**
|
|
3034
|
+
* Render a module that holds exactly one lesson as a single direct-play row
|
|
3035
|
+
* instead of a collapsible section. @default false
|
|
3036
|
+
*/
|
|
3037
|
+
soloSingleLessonModules: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3038
|
+
/** Partial override of the user-visible strings (i18n). */
|
|
3039
|
+
labels: _angular_core.InputSignal<Partial<CourseContentPanelLabels>>;
|
|
3040
|
+
/** A lesson row was activated. */
|
|
3041
|
+
lessonSelect: _angular_core.OutputEmitterRef<CourseLesson>;
|
|
3042
|
+
/** A transcript cue was clicked — seek the player to this position (seconds). */
|
|
3043
|
+
transcriptSeek: _angular_core.OutputEmitterRef<number>;
|
|
3044
|
+
/** A section was expanded or collapsed. */
|
|
3045
|
+
moduleToggle: _angular_core.OutputEmitterRef<{
|
|
3046
|
+
module: CourseModule;
|
|
3047
|
+
open: boolean;
|
|
3048
|
+
}>;
|
|
3049
|
+
/** The "Certificate" pill was clicked. */
|
|
3050
|
+
certificateClick: _angular_core.OutputEmitterRef<void>;
|
|
3051
|
+
readonly text: _angular_core.Signal<CourseContentPanelLabels>;
|
|
3052
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
3053
|
+
private readonly compact;
|
|
3054
|
+
/** Resolved status of every lesson, keyed by lesson id. */
|
|
3055
|
+
private readonly statusById;
|
|
3056
|
+
private readonly resolveStatus;
|
|
3057
|
+
/** Modules narrowed by the search box (design: match lesson titles, else module title). */
|
|
3058
|
+
readonly filteredModules: _angular_core.Signal<CourseModule[]>;
|
|
3059
|
+
readonly moduleViews: _angular_core.Signal<CourseModuleView[]>;
|
|
3060
|
+
readonly timelineRows: _angular_core.Signal<CourseTimelineRow[]>;
|
|
3061
|
+
readonly isEmpty: _angular_core.Signal<boolean>;
|
|
3062
|
+
readonly progress: _angular_core.Signal<_pecb_ui_components.CourseProgressStats>;
|
|
3063
|
+
/** Geometry of the 56 px progress ring (design: r = 22, stroke = 5). */
|
|
3064
|
+
readonly progressRing: _angular_core.Signal<{
|
|
3065
|
+
radius: number;
|
|
3066
|
+
circumference: number;
|
|
3067
|
+
offset: number;
|
|
3068
|
+
}>;
|
|
3069
|
+
readonly progressDetail: _angular_core.Signal<string>;
|
|
3070
|
+
/** Cues of the active lesson, falling back to the panel-level `transcript`. */
|
|
3071
|
+
readonly activeCues: _angular_core.Signal<CourseTranscriptCue[]>;
|
|
3072
|
+
/** Index of the cue covering the playhead, or `-1`. */
|
|
3073
|
+
readonly activeCueIndex: _angular_core.Signal<number>;
|
|
3074
|
+
readonly transcriptRows: _angular_core.Signal<CourseTranscriptRow[]>;
|
|
3075
|
+
readonly transcriptEmpty: _angular_core.Signal<boolean>;
|
|
3076
|
+
readonly noLessonsLabel: _angular_core.Signal<string>;
|
|
3077
|
+
readonly noTranscriptLabel: _angular_core.Signal<string>;
|
|
3078
|
+
constructor();
|
|
3079
|
+
/** `"Section 3"` — the `{n}` placeholder resolved against the label set. */
|
|
3080
|
+
sectionLabel(index: number): string;
|
|
3081
|
+
/** Whether a section is expanded. */
|
|
3082
|
+
isModuleOpen(moduleId: string): boolean;
|
|
3083
|
+
/** Expand a section, collapsing the one that was open (single-open accordion). */
|
|
3084
|
+
toggleModule(view: CourseModuleView): void;
|
|
3085
|
+
/** Roving keyboard support between section headers (WAI-ARIA accordion). */
|
|
3086
|
+
onModuleHeaderKeydown(event: KeyboardEvent): void;
|
|
3087
|
+
/** Activate a lesson (ignored when locked). */
|
|
3088
|
+
selectLesson(lesson: CourseLesson): void;
|
|
3089
|
+
/** Seek the player to a transcript cue. */
|
|
3090
|
+
seekToCue(cue: CourseTranscriptCue): void;
|
|
3091
|
+
setTab(tab: CourseContentPanelTab): void;
|
|
3092
|
+
onTabKeydown(event: KeyboardEvent): void;
|
|
3093
|
+
onQueryInput(event: Event): void;
|
|
3094
|
+
onTranscriptQueryInput(event: Event): void;
|
|
3095
|
+
clearTranscriptQuery(): void;
|
|
3096
|
+
toggleAutoscroll(): void;
|
|
3097
|
+
onAutoscrollChange(event: Event): void;
|
|
3098
|
+
/**
|
|
3099
|
+
* Splits a module's lessons into runs of consecutive lessons sharing a base
|
|
3100
|
+
* title. A run of two or more where at least one carries a `— Part n` suffix
|
|
3101
|
+
* renders as a sub-heading plus a connected rail (design behaviour).
|
|
3102
|
+
*/
|
|
3103
|
+
private buildRuns;
|
|
3104
|
+
private buildLessonView;
|
|
3105
|
+
private scrollActiveCueIntoView;
|
|
3106
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CourseContentPanelComponent, never>;
|
|
3107
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<CourseContentPanelComponent, "pecb-course-content-panel", never, { "modules": { "alias": "modules"; "required": false; "isSignal": true; }; "transcript": { "alias": "transcript"; "required": false; "isSignal": true; }; "activeLessonId": { "alias": "activeLessonId"; "required": false; "isSignal": true; }; "tab": { "alias": "tab"; "required": false; "isSignal": true; }; "openModuleId": { "alias": "openModuleId"; "required": false; "isSignal": true; }; "autoscroll": { "alias": "autoscroll"; "required": false; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; "transcriptQuery": { "alias": "transcriptQuery"; "required": false; "isSignal": true; }; "playing": { "alias": "playing"; "required": false; "isSignal": true; }; "currentTime": { "alias": "currentTime"; "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; }; "showTranscriptSearch": { "alias": "showTranscriptSearch"; "required": false; "isSignal": true; }; "showAutoscroll": { "alias": "showAutoscroll"; "required": false; "isSignal": true; }; "showProgress": { "alias": "showProgress"; "required": false; "isSignal": true; }; "showCertificate": { "alias": "showCertificate"; "required": false; "isSignal": true; }; "soloSingleLessonModules": { "alias": "soloSingleLessonModules"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "activeLessonId": "activeLessonIdChange"; "tab": "tabChange"; "openModuleId": "openModuleIdChange"; "autoscroll": "autoscrollChange"; "query": "queryChange"; "transcriptQuery": "transcriptQueryChange"; "lessonSelect": "lessonSelect"; "transcriptSeek": "transcriptSeek"; "moduleToggle": "moduleToggle"; "certificateClick": "certificateClick"; }, never, never, true, never>;
|
|
3108
|
+
}
|
|
3109
|
+
|
|
3110
|
+
/** Which side the content panel sits on. */
|
|
3111
|
+
type CoursePlayerPanelPosition = 'end' | 'start';
|
|
3112
|
+
/**
|
|
3113
|
+
* PECB course player — the video stage with the **Content** sidebar attached,
|
|
3114
|
+
* exactly as laid out in "Course Player — Content Redesign".
|
|
3115
|
+
*
|
|
3116
|
+
* Composes {@link VideoPlayerComponent} and {@link CourseContentPanelComponent}
|
|
3117
|
+
* and wires them together: picking a lesson loads its media and resumes at its
|
|
3118
|
+
* saved position, clicking a transcript cue seeks the video, and the panel
|
|
3119
|
+
* follows playback live (now-playing row, progress bars, transcript highlight).
|
|
3120
|
+
*
|
|
3121
|
+
* The two-column grid collapses to a single stacked column when the space it is
|
|
3122
|
+
* given gets narrow, so the same markup works in a page, a drawer or a phone.
|
|
3123
|
+
*
|
|
3124
|
+
* @example
|
|
3125
|
+
* ```html
|
|
3126
|
+
* <pecb-course-player
|
|
3127
|
+
* [modules]="modules"
|
|
3128
|
+
* [(activeLessonId)]="lessonId"
|
|
3129
|
+
* (lessonSelect)="track($event)"
|
|
3130
|
+
* (lessonEnded)="markComplete($event)">
|
|
3131
|
+
* </pecb-course-player>
|
|
3132
|
+
* ```
|
|
3133
|
+
*
|
|
3134
|
+
* Layout hooks:
|
|
3135
|
+
* ```css
|
|
3136
|
+
* pecb-course-player {
|
|
3137
|
+
* --pecb-course-player-panel-width: 408px;
|
|
3138
|
+
* --pecb-course-player-gap: 20px;
|
|
3139
|
+
* --pecb-course-player-panel-stacked-height: 460px;
|
|
3140
|
+
* }
|
|
3141
|
+
* ```
|
|
3142
|
+
*/
|
|
3143
|
+
declare class CoursePlayerComponent {
|
|
3144
|
+
/** Course structure. */
|
|
3145
|
+
modules: _angular_core.InputSignal<CourseModule[]>;
|
|
3146
|
+
/** Fallback transcript, used when the active lesson has no `transcript`. */
|
|
3147
|
+
transcript: _angular_core.InputSignal<CourseTranscriptCue[]>;
|
|
3148
|
+
/** Selected lesson. */
|
|
3149
|
+
activeLessonId: _angular_core.ModelSignal<string | null>;
|
|
3150
|
+
/** Playback state of the video. */
|
|
3151
|
+
playing: _angular_core.ModelSignal<boolean>;
|
|
3152
|
+
/** Playhead position, in seconds. */
|
|
3153
|
+
currentTime: _angular_core.ModelSignal<number>;
|
|
3154
|
+
/** Which panel tab is showing. */
|
|
3155
|
+
panelTab: _angular_core.ModelSignal<CourseContentPanelTab>;
|
|
3156
|
+
/** Poster used when the active lesson has none. */
|
|
3157
|
+
poster: _angular_core.InputSignal<string | undefined>;
|
|
3158
|
+
/** Media used when the active lesson has no `src` (e.g. a single-video course). */
|
|
3159
|
+
src: _angular_core.InputSignal<string | VideoPlayerSource[] | undefined>;
|
|
3160
|
+
/** Caption tracks used when the active lesson has none. */
|
|
3161
|
+
tracks: _angular_core.InputSignal<VideoPlayerTrack[]>;
|
|
3162
|
+
/** Stage label used when the active lesson has no `stageLabel`. */
|
|
3163
|
+
stageLabel: _angular_core.InputSignal<string | undefined>;
|
|
3164
|
+
/** Brand watermark on the video stage. @default 'PECB' */
|
|
3165
|
+
watermark: _angular_core.InputSignal<string>;
|
|
3166
|
+
/** @default '16 / 9' */
|
|
3167
|
+
aspectRatio: _angular_core.InputSignal<string>;
|
|
3168
|
+
/** @default 'metadata' */
|
|
3169
|
+
preload: _angular_core.InputSignal<VideoPlayerPreload>;
|
|
3170
|
+
/** `crossorigin` for the media element. */
|
|
3171
|
+
crossOrigin: _angular_core.InputSignal<"anonymous" | "use-credentials" | undefined>;
|
|
3172
|
+
/** Seconds the rewind button / arrow keys jump. @default 10 */
|
|
3173
|
+
seekStep: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
3174
|
+
/** i18n overrides for the video player. */
|
|
3175
|
+
videoLabels: _angular_core.InputSignal<Partial<VideoPlayerLabels>>;
|
|
3176
|
+
/** Start playing as soon as a video lesson is picked. @default true */
|
|
3177
|
+
autoPlayOnSelect: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3178
|
+
/** Show the active lesson's title under the video. @default true */
|
|
3179
|
+
showLessonTitle: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3180
|
+
/** Which side the panel sits on. @default 'end' */
|
|
3181
|
+
panelPosition: _angular_core.InputSignal<CoursePlayerPanelPosition>;
|
|
3182
|
+
/** @default 'grouped' */
|
|
3183
|
+
layout: _angular_core.InputSignal<CourseContentPanelLayout>;
|
|
3184
|
+
/** @default 'comfortable' */
|
|
3185
|
+
density: _angular_core.InputSignal<CourseContentPanelDensity>;
|
|
3186
|
+
/** @default 'charcoal' */
|
|
3187
|
+
accent: _angular_core.InputSignal<CourseContentPanelAccent>;
|
|
3188
|
+
/** Show the panel's tab strip. @default true */
|
|
3189
|
+
showTabs: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3190
|
+
/** Show the lesson search box. @default true */
|
|
3191
|
+
showSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3192
|
+
/** Show the circular course-progress header. @default false */
|
|
3193
|
+
showProgress: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3194
|
+
/** Render single-lesson sections as direct-play rows. @default false */
|
|
3195
|
+
soloSingleLessonModules: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3196
|
+
/** i18n overrides for the panel. */
|
|
3197
|
+
panelLabels: _angular_core.InputSignal<Partial<CourseContentPanelLabels>>;
|
|
3198
|
+
/** A lesson row was picked (fires for quizzes too). */
|
|
3199
|
+
lessonSelect: _angular_core.OutputEmitterRef<CourseLesson>;
|
|
3200
|
+
/** The video of a lesson played to the end. */
|
|
3201
|
+
lessonEnded: _angular_core.OutputEmitterRef<CourseLesson>;
|
|
3202
|
+
/** Playhead moved — use it to persist progress. */
|
|
3203
|
+
timeUpdate: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
3204
|
+
/** The panel's "Certificate" pill was clicked. */
|
|
3205
|
+
certificateClick: _angular_core.OutputEmitterRef<void>;
|
|
3206
|
+
/** The media failed to load, or playback was rejected. */
|
|
3207
|
+
playerError: _angular_core.OutputEmitterRef<VideoPlayerError>;
|
|
3208
|
+
/** The lesson currently selected in the panel (may be a quiz). */
|
|
3209
|
+
readonly activeLesson: _angular_core.Signal<CourseLesson | undefined>;
|
|
3210
|
+
/**
|
|
3211
|
+
* Id of the last *video* lesson that was selected. Picking a quiz keeps the
|
|
3212
|
+
* video on the stage (design behaviour) instead of blanking it.
|
|
3213
|
+
*/
|
|
3214
|
+
private readonly videoLessonId;
|
|
3215
|
+
readonly videoLesson: _angular_core.Signal<CourseLesson | undefined>;
|
|
3216
|
+
readonly videoSrc: _angular_core.Signal<string | VideoPlayerSource[] | undefined>;
|
|
3217
|
+
readonly videoPoster: _angular_core.Signal<string | undefined>;
|
|
3218
|
+
readonly videoTracks: _angular_core.Signal<VideoPlayerTrack[]>;
|
|
3219
|
+
readonly videoStageLabel: _angular_core.Signal<string | undefined>;
|
|
3220
|
+
readonly videoTitle: _angular_core.Signal<string | undefined>;
|
|
3221
|
+
readonly lessonTitle: _angular_core.Signal<string>;
|
|
3222
|
+
/** Resume position handed to the player whenever the source changes. */
|
|
3223
|
+
readonly startTime: _angular_core.Signal<number>;
|
|
3224
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
3225
|
+
/** Id of the lesson whose resume position has already been pushed into `currentTime`. */
|
|
3226
|
+
private resumeAppliedFor;
|
|
3227
|
+
constructor();
|
|
3228
|
+
/** Panel → player: load a lesson, resuming where it left off. */
|
|
3229
|
+
onLessonSelect(lesson: CourseLesson): void;
|
|
3230
|
+
/** Panel → player: jump to a transcript cue and keep playing. */
|
|
3231
|
+
onTranscriptSeek(seconds: number): void;
|
|
3232
|
+
onPlaybackEnded(): void;
|
|
3233
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoursePlayerComponent, never>;
|
|
3234
|
+
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>;
|
|
3235
|
+
}
|
|
3236
|
+
|
|
2398
3237
|
/**
|
|
2399
3238
|
* Notification types supported by the service
|
|
2400
3239
|
*/
|
|
@@ -2413,12 +3252,28 @@ interface NotificationConfig {
|
|
|
2413
3252
|
title?: string;
|
|
2414
3253
|
/** Type of notification */
|
|
2415
3254
|
type: NotificationType;
|
|
3255
|
+
/** Visual variant of the underlying `pecb-alert`. Defaults to `'banner'`. */
|
|
3256
|
+
variant?: AlertVariant;
|
|
2416
3257
|
/** Duration in milliseconds (0 for persistent) */
|
|
2417
3258
|
duration?: number;
|
|
2418
3259
|
/** Whether the notification can be dismissed */
|
|
2419
3260
|
dismissible?: boolean;
|
|
2420
3261
|
/** Position on screen */
|
|
2421
3262
|
position?: NotificationPosition;
|
|
3263
|
+
/** Label for the primary action button. Omit for no button. */
|
|
3264
|
+
primaryAction?: string;
|
|
3265
|
+
/** Label for the secondary action button. Omit for no button. */
|
|
3266
|
+
secondaryAction?: string;
|
|
3267
|
+
/**
|
|
3268
|
+
* Called when the primary action button is clicked. By default the toast is
|
|
3269
|
+
* dismissed afterwards; return `false` to keep it open.
|
|
3270
|
+
*/
|
|
3271
|
+
onPrimaryAction?: () => boolean | void;
|
|
3272
|
+
/**
|
|
3273
|
+
* Called when the secondary action button is clicked. By default the toast is
|
|
3274
|
+
* dismissed afterwards; return `false` to keep it open.
|
|
3275
|
+
*/
|
|
3276
|
+
onSecondaryAction?: () => boolean | void;
|
|
2422
3277
|
/** Custom CSS class */
|
|
2423
3278
|
customClass?: string;
|
|
2424
3279
|
/** Unique identifier */
|
|
@@ -2427,17 +3282,17 @@ interface NotificationConfig {
|
|
|
2427
3282
|
/**
|
|
2428
3283
|
* Notification object with all properties
|
|
2429
3284
|
*/
|
|
2430
|
-
interface Notification extends Required<Omit<NotificationConfig, 'title' | 'customClass'>> {
|
|
3285
|
+
interface Notification extends Required<Omit<NotificationConfig, 'title' | 'customClass' | 'variant' | 'primaryAction' | 'secondaryAction' | 'onPrimaryAction' | 'onSecondaryAction'>> {
|
|
2431
3286
|
title?: string;
|
|
2432
3287
|
customClass?: string;
|
|
2433
3288
|
timestamp: Date;
|
|
2434
3289
|
}
|
|
2435
3290
|
/**
|
|
2436
|
-
*
|
|
3291
|
+
* An injectable, Toastr-style notification service.
|
|
2437
3292
|
*
|
|
2438
|
-
*
|
|
2439
|
-
*
|
|
2440
|
-
*
|
|
3293
|
+
* Calling any of the helpers renders a `pecb-alert` toast in a CDK overlay
|
|
3294
|
+
* stack on `<body>` — no template wiring, host component, or module setup is
|
|
3295
|
+
* required. Just inject and call:
|
|
2441
3296
|
*
|
|
2442
3297
|
* @example
|
|
2443
3298
|
* ```typescript
|
|
@@ -2445,14 +3300,11 @@ interface Notification extends Required<Omit<NotificationConfig, 'title' | 'cust
|
|
|
2445
3300
|
*
|
|
2446
3301
|
* @Component({...})
|
|
2447
3302
|
* export class MyComponent {
|
|
2448
|
-
*
|
|
3303
|
+
* private notify = inject(NotificationService);
|
|
2449
3304
|
*
|
|
2450
|
-
*
|
|
2451
|
-
* this.
|
|
2452
|
-
*
|
|
2453
|
-
*
|
|
2454
|
-
* showError(): void {
|
|
2455
|
-
* this.notificationService.error('An error occurred', 'Error Title');
|
|
3305
|
+
* save(): void {
|
|
3306
|
+
* this.notify.success('Saved!');
|
|
3307
|
+
* this.notify.error('Something went wrong', 'Error');
|
|
2456
3308
|
* }
|
|
2457
3309
|
* }
|
|
2458
3310
|
* ```
|
|
@@ -2460,6 +3312,9 @@ interface Notification extends Required<Omit<NotificationConfig, 'title' | 'cust
|
|
|
2460
3312
|
* @publicApi
|
|
2461
3313
|
*/
|
|
2462
3314
|
declare class NotificationService {
|
|
3315
|
+
private readonly overlay;
|
|
3316
|
+
private readonly appRef;
|
|
3317
|
+
private readonly environmentInjector;
|
|
2463
3318
|
private readonly notificationSubject;
|
|
2464
3319
|
private readonly dismissSubject;
|
|
2465
3320
|
private readonly clearSubject;
|
|
@@ -2467,17 +3322,17 @@ declare class NotificationService {
|
|
|
2467
3322
|
private readonly defaultDuration;
|
|
2468
3323
|
/** Default position for notifications */
|
|
2469
3324
|
private readonly defaultPosition;
|
|
2470
|
-
/**
|
|
2471
|
-
|
|
2472
|
-
|
|
3325
|
+
/** Time to keep a toast mounted after dismiss so its leave animation can play. */
|
|
3326
|
+
private readonly leaveAnimationMs;
|
|
3327
|
+
/** One shared overlay (a vertical stack) per on-screen position. */
|
|
3328
|
+
private readonly stacks;
|
|
3329
|
+
/** All live toasts, keyed by their id. */
|
|
3330
|
+
private readonly toasts;
|
|
3331
|
+
/** @deprecated Notifications now render automatically; no need to subscribe. */
|
|
2473
3332
|
get notifications$(): Observable<Notification>;
|
|
2474
|
-
/**
|
|
2475
|
-
* Observable stream of dismissed notification IDs
|
|
2476
|
-
*/
|
|
3333
|
+
/** @deprecated Notifications now render automatically; no need to subscribe. */
|
|
2477
3334
|
get dismiss$(): Observable<string>;
|
|
2478
|
-
/**
|
|
2479
|
-
* Observable stream for clear all events
|
|
2480
|
-
*/
|
|
3335
|
+
/** @deprecated Notifications now render automatically; no need to subscribe. */
|
|
2481
3336
|
get clear$(): Observable<void>;
|
|
2482
3337
|
/**
|
|
2483
3338
|
* Show a success notification
|
|
@@ -2522,6 +3377,12 @@ declare class NotificationService {
|
|
|
2522
3377
|
* Clear all notifications
|
|
2523
3378
|
*/
|
|
2524
3379
|
clearAll(): void;
|
|
3380
|
+
/** Get (or lazily create) the overlay stack for a screen position. */
|
|
3381
|
+
private getStack;
|
|
3382
|
+
/** Play the leave animation, then unmount the toast and tidy up its stack. */
|
|
3383
|
+
private remove;
|
|
3384
|
+
/** Dispose a position's overlay once it holds no more toasts. */
|
|
3385
|
+
private disposeStackIfEmpty;
|
|
2525
3386
|
/**
|
|
2526
3387
|
* Generate a unique notification ID
|
|
2527
3388
|
*/
|
|
@@ -6517,5 +7378,5 @@ declare class TourComponent implements OnInit, OnChanges {
|
|
|
6517
7378
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TourComponent, "pecb-tour", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "indicatorType": { "alias": "indicatorType"; "required": false; "isSignal": true; }; "steps": { "alias": "steps"; "required": false; "isSignal": true; }; "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "previousLabel": { "alias": "previousLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "finishLabel": { "alias": "finishLabel"; "required": false; "isSignal": true; }; "closeAriaLabel": { "alias": "closeAriaLabel"; "required": false; "isSignal": true; }; "initialStep": { "alias": "initialStep"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "closed": "closed"; "previousClicked": "previousClicked"; "nextClicked": "nextClicked"; "finished": "finished"; "stepChanged": "stepChanged"; }, never, never, true, never>;
|
|
6518
7379
|
}
|
|
6519
7380
|
|
|
6520
|
-
export { AccordionItemComponent, AccordionSmallComponent, AddButtonComponent, AdminHeaderComponent, AdminHeaderFieldTemplateDirective, AffixComponent, AlertComponent, AnchorComponent, 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, DEFAULT_LANGUAGES, DashboardGridComponent, DatepickerComponent, DividerComponent, DropdownComponent, EMPTY_STATE_MAX_BUTTONS, EditButtonComponent, EditCoverPhotoComponent, EmptyStateComponent, ExpandableRowTableComponent, FileUploadComponent, FilterColumnsComponent, FloatButtonComponent, FloatButtonItemComponent, FullscreenModalComponent, FullscreenModalContentDirective, FullscreenModalFooterDirective, FullscreenModalHeaderDirective, GeneralComponent, GridComponent, GridItemComponent, HeaderActionsComponent, HeaderComponent, HeaderDividerComponent, HeaderLanguageComponent, HeaderSearchComponent, HeaderUserComponent, HierarchicalTableComponent, HorizontalStepsComponent, IconComponent, IconRegistry, IconTagComponent, InformationBoxComponent, InputComponent, LanguageDropdownComponent, LinkButtonComponent, LoadingService, MediaComponent, MessageBubbleComponent, MessageItemComponent, MetricsCardComponent, MiniIconButtonComponent, NoResultsComponent, NoteSidebarItemComponent, NotesPanelComponent, NotificationService, NotificationStatusLinkComponent, PECB_COLOR_PALETTE, PECB_CUSTOM_ICONS, PECB_FONT_STYLES, PECB_ICONS, PECB_TYPE_SCALE, PaginationComponent, PriceMethodComponent, ProfileComponent, ProfileElementsCardComponent, ProfileGroupComponent, 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, TestimonialComponent, TextFormFieldComponent, ThemeService, ToggleComponent, ToolbarBarComponent, TooltipComponent, TooltipDirective, TourComponent, TranscriptLineComponent, TypographyComponent, UserWithEmailComponent, VerifyChecklistComponent, VideoUploadBarComponent, VirtualTableComponent, addClass, announceToScreenReader, capitalize, closestElement, copyToClipboard, createAuthError, createAuthorizationError, createConfigError, createError, createNetworkError, createValidationError, disableBodyScroll, escapeHtml, formatCount, formatErrorForLog, formatErrorMessage, generateLinkedIds, generateUniqueId, getAriaCurrent, getButtonAriaAttributes, getComputedStyleValue, getDialogAriaAttributes, getFocusableElements, getInitials, getInputAriaAttributes, getOptionAriaAttributes, getProgressAriaAttributes, getScrollParent, getTabAriaAttributes, getVisuallyHiddenStyles, handleError, hasClass, isBlank, isBrowser, isElementVisible, isNotBlank, isPecbError, isRecoverableError, matchesSelector, pluralize, prefersHighContrast, prefersReducedMotion, registerErrorHandler, removeClass, scrollIntoView, slugify, stripHtml, toCamelCase, toKebabCase, toPascalCase, toSnakeCase, toggleClass, trapFocus, truncate, tryAsync, trySync, wrapError };
|
|
6521
|
-
export type { AccordionVariant, AddButtonVariant, AdminHeaderAction, AdminHeaderActionType, AdminHeaderBadgeVariant, AdminHeaderField, AdminHeaderFieldType, AdminHeaderMetadata, AdminHeaderMetadataType, AdminHeaderProfile, AffixPosition, AlertType, AlertVariant, Alignment, AnchorDirection, AnchorItem, AnchorLevel, AnimationTiming, 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, 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, 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, PdfCardVariant, PecbError, PecbTableColumn, PecbTableColumnComponent, PecbTableColumnType, Position, ProfileBadge, ProfileGroupItem, ProfileGroupSize, ProfileIndicator, ProfileSize, ProfileType, 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, 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, VirtualTableColumn, VirtualTablePageEvent, VirtualTableProgressConfig };
|
|
7381
|
+
export { AccordionItemComponent, AccordionSmallComponent, AddButtonComponent, AdminHeaderComponent, AdminHeaderFieldTemplateDirective, AffixComponent, AlertComponent, AnchorComponent, 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, 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, FullscreenModalComponent, FullscreenModalContentDirective, FullscreenModalFooterDirective, FullscreenModalHeaderDirective, GeneralComponent, GridComponent, GridItemComponent, HeaderActionsComponent, HeaderComponent, HeaderDividerComponent, HeaderLanguageComponent, HeaderSearchComponent, HeaderUserComponent, HierarchicalTableComponent, HorizontalStepsComponent, IconComponent, IconRegistry, IconTagComponent, InformationBoxComponent, InputComponent, LanguageDropdownComponent, LinkButtonComponent, LoadingService, MediaComponent, MessageBubbleComponent, MessageItemComponent, MetricsCardComponent, MiniIconButtonComponent, NoResultsComponent, NoteSidebarItemComponent, NotesPanelComponent, NotificationService, NotificationStatusLinkComponent, PECB_COLOR_PALETTE, PECB_CUSTOM_ICONS, PECB_FONT_STYLES, PECB_ICONS, PECB_TYPE_SCALE, PaginationComponent, PriceMethodComponent, ProfileComponent, ProfileElementsCardComponent, ProfileGroupComponent, 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, TestimonialComponent, TextFormFieldComponent, ThemeService, ToggleComponent, ToolbarBarComponent, TooltipComponent, TooltipDirective, TourComponent, TranscriptLineComponent, TypographyComponent, UserWithEmailComponent, VerifyChecklistComponent, VideoPlayerComponent, VideoUploadBarComponent, VirtualTableComponent, addClass, announceToScreenReader, 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, resolveLessonStatus, scrollIntoView, slugify, stripHtml, toCamelCase, toKebabCase, toPascalCase, toSnakeCase, toggleClass, trapFocus, truncate, tryAsync, trySync, wrapError };
|
|
7382
|
+
export type { AccordionVariant, AddButtonVariant, AdminHeaderAction, AdminHeaderActionType, AdminHeaderBadgeVariant, AdminHeaderField, AdminHeaderFieldType, AdminHeaderMetadata, AdminHeaderMetadataType, AdminHeaderProfile, AffixPosition, AlertType, AlertVariant, Alignment, AnchorDirection, AnchorItem, AnchorLevel, AnimationTiming, 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, 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, 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, PdfCardVariant, PecbError, PecbTableColumn, PecbTableColumnComponent, PecbTableColumnType, Position, ProfileBadge, ProfileGroupItem, ProfileGroupSize, ProfileIndicator, ProfileSize, ProfileType, 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, 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 };
|