@pecb-ui/components 1.1.10 → 1.1.12
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 +1847 -9
- package/fesm2022/pecb-ui-components.mjs.map +1 -1
- package/index.d.ts +845 -2
- 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';
|
|
@@ -974,6 +975,7 @@ declare class DropdownComponent implements ControlValueAccessor {
|
|
|
974
975
|
private readonly overlay;
|
|
975
976
|
readonly scrollStrategy: ScrollStrategy;
|
|
976
977
|
searchInput?: ElementRef<HTMLInputElement>;
|
|
978
|
+
triggerEl?: ElementRef<HTMLElement>;
|
|
977
979
|
id: _angular_core.InputSignal<string>;
|
|
978
980
|
label: _angular_core.InputSignal<string | undefined>;
|
|
979
981
|
/** Placeholder shown in the trigger when no option is selected. */
|
|
@@ -999,6 +1001,13 @@ declare class DropdownComponent implements ControlValueAccessor {
|
|
|
999
1001
|
searchQuery: _angular_core.WritableSignal<string>;
|
|
1000
1002
|
selectedValues: _angular_core.WritableSignal<unknown[]>;
|
|
1001
1003
|
focusedIndex: _angular_core.WritableSignal<number>;
|
|
1004
|
+
/**
|
|
1005
|
+
* Width the overlay panel is pinned to, so it lines up edge-to-edge with the
|
|
1006
|
+
* trigger. Measured with `getBoundingClientRect()` rather than `offsetWidth`
|
|
1007
|
+
* because the latter rounds to whole pixels and leaves the panel a hair off in
|
|
1008
|
+
* fluid layouts.
|
|
1009
|
+
*/
|
|
1010
|
+
triggerWidth: _angular_core.WritableSignal<number>;
|
|
1002
1011
|
/** Overlay positions: prefer below the trigger, flip above when there's no room. */
|
|
1003
1012
|
overlayPositions: ConnectedPosition[];
|
|
1004
1013
|
private onChange;
|
|
@@ -1008,6 +1017,9 @@ declare class DropdownComponent implements ControlValueAccessor {
|
|
|
1008
1017
|
get filteredOptions(): DropdownOption[];
|
|
1009
1018
|
get displayText(): string;
|
|
1010
1019
|
clearAll(event: MouseEvent): void;
|
|
1020
|
+
/** Re-measure the trigger so a resize doesn't leave an open panel misaligned. */
|
|
1021
|
+
syncTriggerWidth(): void;
|
|
1022
|
+
private measureTrigger;
|
|
1011
1023
|
toggleDropdown(): void;
|
|
1012
1024
|
selectOption(option: DropdownOption): void;
|
|
1013
1025
|
isSelected(option: DropdownOption): boolean;
|
|
@@ -2402,6 +2414,837 @@ declare class MediaComponent {
|
|
|
2402
2414
|
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>;
|
|
2403
2415
|
}
|
|
2404
2416
|
|
|
2417
|
+
/** A single `<source>` entry. Use an array of these for multi-format delivery. */
|
|
2418
|
+
interface VideoPlayerSource {
|
|
2419
|
+
/** Media URL. */
|
|
2420
|
+
src: string;
|
|
2421
|
+
/** MIME type, e.g. `video/mp4` or `application/x-mpegURL`. */
|
|
2422
|
+
type?: string;
|
|
2423
|
+
/** Optional media query (`<source media>`). */
|
|
2424
|
+
media?: string;
|
|
2425
|
+
}
|
|
2426
|
+
/** A text track (`<track>`) — captions, subtitles, chapters… */
|
|
2427
|
+
interface VideoPlayerTrack {
|
|
2428
|
+
/** WebVTT file URL. */
|
|
2429
|
+
src: string;
|
|
2430
|
+
/** BCP-47 language tag, e.g. `en`. */
|
|
2431
|
+
srclang: string;
|
|
2432
|
+
/** Human-readable label shown by the browser / assistive tech. */
|
|
2433
|
+
label?: string;
|
|
2434
|
+
/** @default 'captions' */
|
|
2435
|
+
kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
|
|
2436
|
+
/** Marks this track as the one toggled by the CC button / shown initially. */
|
|
2437
|
+
default?: boolean;
|
|
2438
|
+
}
|
|
2439
|
+
/** `preload` attribute values. */
|
|
2440
|
+
type VideoPlayerPreload = 'none' | 'metadata' | 'auto';
|
|
2441
|
+
/** Payload of `timeUpdate`, `seekEnd` and `loadedMetadata`. */
|
|
2442
|
+
interface VideoPlayerTimeEvent {
|
|
2443
|
+
/** Current playhead position in seconds. */
|
|
2444
|
+
currentTime: number;
|
|
2445
|
+
/** Media duration in seconds (`NaN`/`Infinity` for live streams before metadata). */
|
|
2446
|
+
duration: number;
|
|
2447
|
+
}
|
|
2448
|
+
/** Payload of the `playerError` output. */
|
|
2449
|
+
interface VideoPlayerError {
|
|
2450
|
+
/**
|
|
2451
|
+
* - `media`: the browser failed to load / decode the source (`<video (error)>`).
|
|
2452
|
+
* - `play-rejected`: `video.play()` was rejected (usually an autoplay policy).
|
|
2453
|
+
*/
|
|
2454
|
+
code: 'media' | 'play-rejected';
|
|
2455
|
+
message: string;
|
|
2456
|
+
originalError?: unknown;
|
|
2457
|
+
}
|
|
2458
|
+
/**
|
|
2459
|
+
* All user-visible strings. Override any subset via the `labels` input to
|
|
2460
|
+
* translate the player. `{n}` in `skipBack` is replaced by the seek step.
|
|
2461
|
+
*/
|
|
2462
|
+
interface VideoPlayerLabels {
|
|
2463
|
+
play: string;
|
|
2464
|
+
pause: string;
|
|
2465
|
+
replay: string;
|
|
2466
|
+
skipBack: string;
|
|
2467
|
+
mute: string;
|
|
2468
|
+
unmute: string;
|
|
2469
|
+
volume: string;
|
|
2470
|
+
captionsOn: string;
|
|
2471
|
+
captionsOff: string;
|
|
2472
|
+
settings: string;
|
|
2473
|
+
playbackSpeed: string;
|
|
2474
|
+
normalSpeed: string;
|
|
2475
|
+
enterFullscreen: string;
|
|
2476
|
+
exitFullscreen: string;
|
|
2477
|
+
seek: string;
|
|
2478
|
+
player: string;
|
|
2479
|
+
error: string;
|
|
2480
|
+
}
|
|
2481
|
+
declare const DEFAULT_VIDEO_PLAYER_LABELS: VideoPlayerLabels;
|
|
2482
|
+
/** Default playback-rate menu entries. */
|
|
2483
|
+
declare const DEFAULT_VIDEO_PLAYER_RATES: readonly number[];
|
|
2484
|
+
/**
|
|
2485
|
+
* Formats seconds as `m:ss`, or `h:mm:ss` once the value reaches one hour.
|
|
2486
|
+
* Non-finite / negative input renders as `0:00`.
|
|
2487
|
+
*/
|
|
2488
|
+
declare function formatVideoTime(seconds: number): string;
|
|
2489
|
+
/**
|
|
2490
|
+
* PECB course video player.
|
|
2491
|
+
*
|
|
2492
|
+
* A fully custom-skinned, accessible HTML5 `<video>` wrapper that reproduces
|
|
2493
|
+
* the PECB "Course Player" design: a rounded dark 16:9 stage, poster, brand
|
|
2494
|
+
* watermark + section label, a blurred centre play button and a bottom
|
|
2495
|
+
* control bar (progress, play/pause, rewind, volume, time, captions, speed
|
|
2496
|
+
* settings, fullscreen).
|
|
2497
|
+
*
|
|
2498
|
+
* The player is self-contained (no icon-registry / service dependencies) so it
|
|
2499
|
+
* can be dropped into any Angular 17+ app. It is responsive (container
|
|
2500
|
+
* queries), keyboard operable, touch friendly and honours
|
|
2501
|
+
* `prefers-reduced-motion`.
|
|
2502
|
+
*
|
|
2503
|
+
* @example Minimal
|
|
2504
|
+
* ```html
|
|
2505
|
+
* <pecb-video-player
|
|
2506
|
+
* src="https://cdn.example.com/lesson.mp4"
|
|
2507
|
+
* poster="https://cdn.example.com/lesson.jpg"
|
|
2508
|
+
* label="SECTION 2">
|
|
2509
|
+
* </pecb-video-player>
|
|
2510
|
+
* ```
|
|
2511
|
+
*
|
|
2512
|
+
* @example Two-way bound & driven from outside (e.g. a transcript panel)
|
|
2513
|
+
* ```html
|
|
2514
|
+
* <pecb-video-player
|
|
2515
|
+
* [src]="sources"
|
|
2516
|
+
* [tracks]="captions"
|
|
2517
|
+
* [(currentTime)]="at"
|
|
2518
|
+
* [(playing)]="playing"
|
|
2519
|
+
* (playbackEnded)="onLessonFinished()">
|
|
2520
|
+
* </pecb-video-player>
|
|
2521
|
+
* ```
|
|
2522
|
+
*
|
|
2523
|
+
* Theming — override the CSS custom properties on the host:
|
|
2524
|
+
* ```css
|
|
2525
|
+
* pecb-video-player { --pecb-video-radius: 0; --pecb-video-accent: #a11e29; }
|
|
2526
|
+
* ```
|
|
2527
|
+
*/
|
|
2528
|
+
declare class VideoPlayerComponent {
|
|
2529
|
+
private readonly platformId;
|
|
2530
|
+
private readonly zone;
|
|
2531
|
+
private readonly destroyRef;
|
|
2532
|
+
private readonly isBrowser;
|
|
2533
|
+
/** Unique id used to wire ARIA relationships inside the template. */
|
|
2534
|
+
readonly uid: string;
|
|
2535
|
+
private readonly rootRef;
|
|
2536
|
+
private readonly videoRef;
|
|
2537
|
+
private readonly progressRef;
|
|
2538
|
+
private readonly settingsMenuRef;
|
|
2539
|
+
/** Media URL, or a list of `<source>` candidates. */
|
|
2540
|
+
src: _angular_core.InputSignal<string | VideoPlayerSource[] | undefined>;
|
|
2541
|
+
/** Poster image shown before playback starts. */
|
|
2542
|
+
poster: _angular_core.InputSignal<string | undefined>;
|
|
2543
|
+
/** Text tracks (captions / subtitles). The CC button appears when non-empty. */
|
|
2544
|
+
tracks: _angular_core.InputSignal<VideoPlayerTrack[]>;
|
|
2545
|
+
/** Accessible title of the media, announced as part of the region label. */
|
|
2546
|
+
title: _angular_core.InputSignal<string | undefined>;
|
|
2547
|
+
/** `crossorigin` attribute — required for captions hosted on another origin. */
|
|
2548
|
+
crossOrigin: _angular_core.InputSignal<"anonymous" | "use-credentials" | undefined>;
|
|
2549
|
+
/** @default 'metadata' */
|
|
2550
|
+
preload: _angular_core.InputSignal<VideoPlayerPreload>;
|
|
2551
|
+
/** Attempt to start playback automatically (subject to browser policy). */
|
|
2552
|
+
autoplay: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2553
|
+
/** Restart from the beginning when the media ends. */
|
|
2554
|
+
loop: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2555
|
+
/** Play inline on iOS instead of forcing the native fullscreen player. @default true */
|
|
2556
|
+
playsInline: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2557
|
+
/** Initial playhead position in seconds (applied once metadata is loaded). */
|
|
2558
|
+
startTime: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
2559
|
+
/** Brand watermark in the bottom-left corner. Empty string hides it. @default 'PECB' */
|
|
2560
|
+
watermark: _angular_core.InputSignal<string>;
|
|
2561
|
+
/** Large label in the bottom-right corner, e.g. `SECTION 2`. */
|
|
2562
|
+
label: _angular_core.InputSignal<string | undefined>;
|
|
2563
|
+
/** CSS `aspect-ratio` of the stage. @default '16 / 9' */
|
|
2564
|
+
aspectRatio: _angular_core.InputSignal<string>;
|
|
2565
|
+
/** Show the large centre play/pause button. @default true */
|
|
2566
|
+
showCenterButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2567
|
+
/** Show the rewind button. @default true */
|
|
2568
|
+
showSkipBack: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2569
|
+
/** Show the mute button + volume slider. @default true */
|
|
2570
|
+
showVolume: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2571
|
+
/** Show the elapsed / total time. @default true */
|
|
2572
|
+
showTime: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2573
|
+
/** Force-show/hide the captions button. `undefined` = show only when `tracks` is non-empty. */
|
|
2574
|
+
showCaptions: _angular_core.InputSignal<boolean | undefined>;
|
|
2575
|
+
/** Show the settings (playback speed) button. @default true */
|
|
2576
|
+
showSettings: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2577
|
+
/** Show the fullscreen button. @default true */
|
|
2578
|
+
showFullscreen: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
2579
|
+
/** Seconds the rewind button / arrow keys jump. @default 10 */
|
|
2580
|
+
seekStep: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
2581
|
+
/** Playback-rate options listed in the settings menu. */
|
|
2582
|
+
playbackRates: _angular_core.InputSignal<readonly number[]>;
|
|
2583
|
+
/** Partial override of the user-visible strings (i18n). */
|
|
2584
|
+
labels: _angular_core.InputSignal<Partial<VideoPlayerLabels>>;
|
|
2585
|
+
/** Whether the media is playing. Set it to start/stop playback. */
|
|
2586
|
+
playing: _angular_core.ModelSignal<boolean>;
|
|
2587
|
+
/** Playhead position in seconds. Set it to seek. */
|
|
2588
|
+
currentTime: _angular_core.ModelSignal<number>;
|
|
2589
|
+
/** Volume 0–1. */
|
|
2590
|
+
volume: _angular_core.ModelSignal<number>;
|
|
2591
|
+
/** Muted state. */
|
|
2592
|
+
muted: _angular_core.ModelSignal<boolean>;
|
|
2593
|
+
/** Playback rate. */
|
|
2594
|
+
playbackRate: _angular_core.ModelSignal<number>;
|
|
2595
|
+
/** Whether the default text track is displayed. */
|
|
2596
|
+
captionsEnabled: _angular_core.ModelSignal<boolean>;
|
|
2597
|
+
/** Fires on every `timeupdate` (~4×/s while playing). */
|
|
2598
|
+
timeUpdate: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
2599
|
+
/** Duration is known. */
|
|
2600
|
+
loadedMetadata: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
2601
|
+
/** A seek finished. */
|
|
2602
|
+
seekEnd: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
2603
|
+
/** Playback reached the end. */
|
|
2604
|
+
playbackEnded: _angular_core.OutputEmitterRef<void>;
|
|
2605
|
+
/** Player entered / left fullscreen. */
|
|
2606
|
+
fullscreenChange: _angular_core.OutputEmitterRef<boolean>;
|
|
2607
|
+
/** Media failed to load or playback was rejected. */
|
|
2608
|
+
playerError: _angular_core.OutputEmitterRef<VideoPlayerError>;
|
|
2609
|
+
readonly duration: _angular_core.WritableSignal<number>;
|
|
2610
|
+
readonly bufferedEnd: _angular_core.WritableSignal<number>;
|
|
2611
|
+
readonly hasEnded: _angular_core.WritableSignal<boolean>;
|
|
2612
|
+
readonly isBuffering: _angular_core.WritableSignal<boolean>;
|
|
2613
|
+
readonly hasError: _angular_core.WritableSignal<boolean>;
|
|
2614
|
+
readonly isFullscreen: _angular_core.WritableSignal<boolean>;
|
|
2615
|
+
readonly isSeeking: _angular_core.WritableSignal<boolean>;
|
|
2616
|
+
readonly settingsOpen: _angular_core.WritableSignal<boolean>;
|
|
2617
|
+
readonly controlsVisible: _angular_core.WritableSignal<boolean>;
|
|
2618
|
+
readonly hasStarted: _angular_core.WritableSignal<boolean>;
|
|
2619
|
+
private hideTimer;
|
|
2620
|
+
private lastPointerType;
|
|
2621
|
+
private startTimeApplied;
|
|
2622
|
+
private initialLoadDone;
|
|
2623
|
+
private pendingPlay;
|
|
2624
|
+
readonly text: _angular_core.Signal<VideoPlayerLabels>;
|
|
2625
|
+
readonly skipBackLabel: _angular_core.Signal<string>;
|
|
2626
|
+
readonly sourceList: _angular_core.Signal<VideoPlayerSource[]>;
|
|
2627
|
+
/** Single-string src is bound directly so the browser can start fetching ASAP. */
|
|
2628
|
+
readonly singleSrc: _angular_core.Signal<string | undefined>;
|
|
2629
|
+
readonly progressPct: _angular_core.Signal<number>;
|
|
2630
|
+
readonly bufferedPct: _angular_core.Signal<number>;
|
|
2631
|
+
readonly currentTimeLabel: _angular_core.Signal<string>;
|
|
2632
|
+
readonly durationLabel: _angular_core.Signal<string>;
|
|
2633
|
+
readonly captionsButtonVisible: _angular_core.Signal<boolean>;
|
|
2634
|
+
/** Volume as an integer percentage (0 while muted) — drives the slider. */
|
|
2635
|
+
readonly volumePct: _angular_core.Signal<number>;
|
|
2636
|
+
readonly volumeLevel: _angular_core.Signal<"muted" | "low" | "high">;
|
|
2637
|
+
readonly regionLabel: _angular_core.Signal<string>;
|
|
2638
|
+
/** Controls are hidden only while playing and idle. */
|
|
2639
|
+
readonly controlsHidden: _angular_core.Signal<boolean>;
|
|
2640
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
2641
|
+
constructor();
|
|
2642
|
+
/** Start playback. */
|
|
2643
|
+
play(): void;
|
|
2644
|
+
/** Pause playback. */
|
|
2645
|
+
pause(): void;
|
|
2646
|
+
/** Toggle play / pause (replays from the start after the media ended). */
|
|
2647
|
+
togglePlay(): void;
|
|
2648
|
+
/** Seek to an absolute position (seconds, clamped to the duration). */
|
|
2649
|
+
seek(seconds: number): void;
|
|
2650
|
+
/** Seek relative to the current position. */
|
|
2651
|
+
seekBy(deltaSeconds: number): void;
|
|
2652
|
+
/** Rewind by `seekStep` seconds. */
|
|
2653
|
+
skipBack(): void;
|
|
2654
|
+
/** Toggle mute. Unmuting a zero volume restores it to 50 %. */
|
|
2655
|
+
toggleMute(): void;
|
|
2656
|
+
/** Set volume (0–1). A non-zero value also unmutes. */
|
|
2657
|
+
setVolume(value: number): void;
|
|
2658
|
+
/** Set the playback rate and close the settings menu. */
|
|
2659
|
+
setPlaybackRate(rate: number): void;
|
|
2660
|
+
/** Toggle captions on the default text track. */
|
|
2661
|
+
toggleCaptions(): void;
|
|
2662
|
+
/** Enter / exit fullscreen for the whole player (falls back to the native iOS player). */
|
|
2663
|
+
toggleFullscreen(): Promise<void>;
|
|
2664
|
+
/** Open / close the settings (playback speed) menu. */
|
|
2665
|
+
toggleSettings(): void;
|
|
2666
|
+
/** Close the settings menu; optionally move focus back to its trigger. */
|
|
2667
|
+
closeSettings(restoreFocus?: boolean): void;
|
|
2668
|
+
onLoadedMetadata(video: HTMLVideoElement): void;
|
|
2669
|
+
onDurationChange(video: HTMLVideoElement): void;
|
|
2670
|
+
onTimeUpdate(video: HTMLVideoElement): void;
|
|
2671
|
+
onProgress(video: HTMLVideoElement): void;
|
|
2672
|
+
onPlay(): void;
|
|
2673
|
+
onPause(): void;
|
|
2674
|
+
onEnded(): void;
|
|
2675
|
+
onWaiting(): void;
|
|
2676
|
+
onPlaying(): void;
|
|
2677
|
+
onSeeked(video: HTMLVideoElement): void;
|
|
2678
|
+
onVolumeChange(video: HTMLVideoElement): void;
|
|
2679
|
+
onRateChange(video: HTMLVideoElement): void;
|
|
2680
|
+
onMediaError(video: HTMLVideoElement): void;
|
|
2681
|
+
onStagePointerDown(event: PointerEvent): void;
|
|
2682
|
+
/** Click on the video surface: toggles play on mouse; on touch, first reveals the controls. */
|
|
2683
|
+
onStageClick(): void;
|
|
2684
|
+
onStageDoubleClick(): void;
|
|
2685
|
+
/** Keyboard shortcuts on the player region. */
|
|
2686
|
+
onRootKeydown(event: KeyboardEvent): void;
|
|
2687
|
+
onProgressPointerDown(event: PointerEvent): void;
|
|
2688
|
+
onProgressPointerMove(event: PointerEvent): void;
|
|
2689
|
+
onProgressPointerUp(event: PointerEvent): void;
|
|
2690
|
+
onProgressKeydown(event: KeyboardEvent): void;
|
|
2691
|
+
private seekToPointer;
|
|
2692
|
+
onVolumeInput(event: Event): void;
|
|
2693
|
+
onSettingsMenuKeydown(event: KeyboardEvent): void;
|
|
2694
|
+
onRootFocusOut(event: FocusEvent): void;
|
|
2695
|
+
onDocumentFullscreenChange(): void;
|
|
2696
|
+
onDocumentPointerDown(event: PointerEvent): void;
|
|
2697
|
+
/** Show the controls and (if playing) restart the idle timer. */
|
|
2698
|
+
revealControls(reschedule?: boolean): void;
|
|
2699
|
+
private scheduleHide;
|
|
2700
|
+
private clearHideTimer;
|
|
2701
|
+
/**
|
|
2702
|
+
* High-frequency pointer listeners are registered outside the Angular zone so
|
|
2703
|
+
* mouse movement over the stage doesn't trigger change detection; we only
|
|
2704
|
+
* re-enter the zone when the visibility state actually flips.
|
|
2705
|
+
*/
|
|
2706
|
+
private attachIdleListeners;
|
|
2707
|
+
private safePlay;
|
|
2708
|
+
private applyCaptionMode;
|
|
2709
|
+
private resetForNewSource;
|
|
2710
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<VideoPlayerComponent, never>;
|
|
2711
|
+
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>;
|
|
2712
|
+
}
|
|
2713
|
+
|
|
2714
|
+
/** Kind of course item. @default 'video' */
|
|
2715
|
+
type CourseLessonType = 'video' | 'quiz';
|
|
2716
|
+
/**
|
|
2717
|
+
* Progress state of a lesson.
|
|
2718
|
+
*
|
|
2719
|
+
* - `completed` — finished (green check).
|
|
2720
|
+
* - `playing` — currently playing (accent disc). Only meaningful for the
|
|
2721
|
+
* active lesson; on any other lesson it renders as `started`.
|
|
2722
|
+
* - `started` — partially watched / answered (amber progress ring).
|
|
2723
|
+
* - `available` — not started yet (outlined disc).
|
|
2724
|
+
* - `locked` — not selectable (lock disc, row disabled).
|
|
2725
|
+
*
|
|
2726
|
+
* @default 'available'
|
|
2727
|
+
*/
|
|
2728
|
+
type CourseLessonStatus = 'completed' | 'playing' | 'started' | 'available' | 'locked';
|
|
2729
|
+
/** A single transcript cue. */
|
|
2730
|
+
interface CourseTranscriptCue {
|
|
2731
|
+
/** Cue start, in seconds. */
|
|
2732
|
+
time: number;
|
|
2733
|
+
/** Cue text. */
|
|
2734
|
+
text: string;
|
|
2735
|
+
}
|
|
2736
|
+
/** One lesson (video or quiz) inside a module. */
|
|
2737
|
+
interface CourseLesson {
|
|
2738
|
+
/** Stable unique id — used for selection and `@for` tracking. */
|
|
2739
|
+
id: string;
|
|
2740
|
+
/**
|
|
2741
|
+
* Lesson title. A title of the shape `"Base — Part 3"` makes the panel group
|
|
2742
|
+
* consecutive lessons that share `Base` under one sub-heading, listing them as
|
|
2743
|
+
* `Part 1`, `Part 2`, … on a connected timeline rail (design behaviour).
|
|
2744
|
+
*/
|
|
2745
|
+
title: string;
|
|
2746
|
+
/** @default 'video' */
|
|
2747
|
+
type?: CourseLessonType;
|
|
2748
|
+
/** @default 'available' */
|
|
2749
|
+
status?: CourseLessonStatus;
|
|
2750
|
+
/** Total length of the video, in seconds. */
|
|
2751
|
+
durationSeconds?: number;
|
|
2752
|
+
/** Where playback resumes, in seconds. */
|
|
2753
|
+
resumeSeconds?: number;
|
|
2754
|
+
/** Quiz: number of questions. */
|
|
2755
|
+
questionCount?: number;
|
|
2756
|
+
/** Quiz: how many questions have been answered (drives the `started` ring). */
|
|
2757
|
+
answeredCount?: number;
|
|
2758
|
+
/** Quiz: how many answers were correct (shown once `completed`). */
|
|
2759
|
+
correctCount?: number;
|
|
2760
|
+
/** Video source(s) for this lesson. */
|
|
2761
|
+
src?: string | VideoPlayerSource[];
|
|
2762
|
+
/** Poster image for this lesson. */
|
|
2763
|
+
poster?: string;
|
|
2764
|
+
/** Caption/subtitle tracks for this lesson. */
|
|
2765
|
+
tracks?: VideoPlayerTrack[];
|
|
2766
|
+
/** Large label painted on the video stage, e.g. `SECTION 2`. */
|
|
2767
|
+
stageLabel?: string;
|
|
2768
|
+
/** Transcript cues for this lesson (overrides the panel-level `transcript`). */
|
|
2769
|
+
transcript?: CourseTranscriptCue[];
|
|
2770
|
+
/** Escape hatch for consumer-specific data; never read by the components. */
|
|
2771
|
+
meta?: Record<string, unknown>;
|
|
2772
|
+
}
|
|
2773
|
+
/** A module (a "Section" in the UI) holding one or more lessons. */
|
|
2774
|
+
interface CourseModule {
|
|
2775
|
+
/** Stable unique id. */
|
|
2776
|
+
id: string;
|
|
2777
|
+
/** Module title — shown as the sub-heading of a part-run, and in search. */
|
|
2778
|
+
title: string;
|
|
2779
|
+
lessons: CourseLesson[];
|
|
2780
|
+
}
|
|
2781
|
+
/** Aggregate counters for one module. */
|
|
2782
|
+
interface CourseModuleStats {
|
|
2783
|
+
total: number;
|
|
2784
|
+
done: number;
|
|
2785
|
+
playing: boolean;
|
|
2786
|
+
started: boolean;
|
|
2787
|
+
/** Sum of every lesson duration, in seconds. */
|
|
2788
|
+
durationSeconds: number;
|
|
2789
|
+
/** Completed percentage, 0–100 (rounded). */
|
|
2790
|
+
percent: number;
|
|
2791
|
+
}
|
|
2792
|
+
/** Aggregate counters for a whole course. */
|
|
2793
|
+
interface CourseProgressStats {
|
|
2794
|
+
total: number;
|
|
2795
|
+
done: number;
|
|
2796
|
+
/** Completed percentage, 0–100 (rounded). */
|
|
2797
|
+
percent: number;
|
|
2798
|
+
/** Seconds of video still to watch. */
|
|
2799
|
+
remainingSeconds: number;
|
|
2800
|
+
}
|
|
2801
|
+
/**
|
|
2802
|
+
* Human-readable lesson length: `"9 min"`, `"12 min 4 sec"`, `"1 hr 3 min"`.
|
|
2803
|
+
* Non-finite / negative input renders as `"0 min"`.
|
|
2804
|
+
*/
|
|
2805
|
+
declare function formatCourseDuration(seconds: number | undefined): string;
|
|
2806
|
+
/**
|
|
2807
|
+
* Clock reading: `m:ss`, or `h:mm:ss` from one hour up.
|
|
2808
|
+
* Non-finite / negative input renders as `0:00`.
|
|
2809
|
+
*/
|
|
2810
|
+
declare function formatCourseTime(seconds: number | undefined): string;
|
|
2811
|
+
/**
|
|
2812
|
+
* Splits `"Base — Part 3"` into `{ base: 'Base', part: 'Part 3' }`.
|
|
2813
|
+
* A title without the marker yields `{ base: title, part: null }`.
|
|
2814
|
+
*/
|
|
2815
|
+
declare function parseLessonPartTitle(title: string): {
|
|
2816
|
+
base: string;
|
|
2817
|
+
part: string | null;
|
|
2818
|
+
};
|
|
2819
|
+
/**
|
|
2820
|
+
* Resolves the status actually rendered for a lesson.
|
|
2821
|
+
*
|
|
2822
|
+
* The active video lesson follows live playback (`playing` while the player is
|
|
2823
|
+
* running, otherwise `started` — unless it is already `completed`), and a
|
|
2824
|
+
* `playing` status on any *other* lesson degrades to `started`, so exactly one
|
|
2825
|
+
* row can ever show the "now playing" treatment. `locked` always wins.
|
|
2826
|
+
*/
|
|
2827
|
+
declare function resolveLessonStatus(lesson: CourseLesson, active: boolean, livePlaying: boolean): CourseLessonStatus;
|
|
2828
|
+
/** Counters for one module, computed from already-resolved lesson statuses. */
|
|
2829
|
+
declare function courseModuleStats(module: CourseModule, resolve?: (lesson: CourseLesson) => CourseLessonStatus): CourseModuleStats;
|
|
2830
|
+
/** Counters for a whole course. */
|
|
2831
|
+
declare function courseProgress(modules: readonly CourseModule[], resolve?: (lesson: CourseLesson) => CourseLessonStatus): CourseProgressStats;
|
|
2832
|
+
/** Finds the module a lesson belongs to. */
|
|
2833
|
+
declare function findCourseModule(modules: readonly CourseModule[], lessonId: string | null | undefined): CourseModule | undefined;
|
|
2834
|
+
/** Finds a lesson by id across all modules. */
|
|
2835
|
+
declare function findCourseLesson(modules: readonly CourseModule[], lessonId: string | null | undefined): CourseLesson | undefined;
|
|
2836
|
+
|
|
2837
|
+
/** Which tab the panel shows. */
|
|
2838
|
+
type CourseContentPanelTab = 'content' | 'transcript';
|
|
2839
|
+
/** Grouped accordion (default) or one flat connected timeline. */
|
|
2840
|
+
type CourseContentPanelLayout = 'grouped' | 'timeline';
|
|
2841
|
+
/** Row spacing. */
|
|
2842
|
+
type CourseContentPanelDensity = 'comfortable' | 'compact';
|
|
2843
|
+
/** Colour used for the "now playing" treatment. */
|
|
2844
|
+
type CourseContentPanelAccent = 'charcoal' | 'red';
|
|
2845
|
+
/**
|
|
2846
|
+
* Every user-visible string. Override any subset through `labels`.
|
|
2847
|
+
* `{n}`, `{done}`, `{total}`, `{query}`, `{duration}` are replaced at runtime.
|
|
2848
|
+
*/
|
|
2849
|
+
interface CourseContentPanelLabels {
|
|
2850
|
+
contentTab: string;
|
|
2851
|
+
transcriptTab: string;
|
|
2852
|
+
searchLessons: string;
|
|
2853
|
+
searchTranscript: string;
|
|
2854
|
+
clearSearch: string;
|
|
2855
|
+
quiz: string;
|
|
2856
|
+
questions: string;
|
|
2857
|
+
passed: string;
|
|
2858
|
+
answered: string;
|
|
2859
|
+
resume: string;
|
|
2860
|
+
moduleDone: string;
|
|
2861
|
+
section: string;
|
|
2862
|
+
noLessons: string;
|
|
2863
|
+
noTranscript: string;
|
|
2864
|
+
autoscroll: string;
|
|
2865
|
+
courseProgress: string;
|
|
2866
|
+
courseProgressDetail: string;
|
|
2867
|
+
certificate: string;
|
|
2868
|
+
locked: string;
|
|
2869
|
+
lessonList: string;
|
|
2870
|
+
}
|
|
2871
|
+
declare const DEFAULT_COURSE_CONTENT_PANEL_LABELS: CourseContentPanelLabels;
|
|
2872
|
+
/** Everything one lesson row needs, precomputed so the template stays dumb. */
|
|
2873
|
+
interface CourseLessonView {
|
|
2874
|
+
lesson: CourseLesson;
|
|
2875
|
+
id: string;
|
|
2876
|
+
active: boolean;
|
|
2877
|
+
status: CourseLessonStatus;
|
|
2878
|
+
isQuiz: boolean;
|
|
2879
|
+
isPlaying: boolean;
|
|
2880
|
+
isStarted: boolean;
|
|
2881
|
+
isCompleted: boolean;
|
|
2882
|
+
isLocked: boolean;
|
|
2883
|
+
/** `null` hides the title line (parts run: the quiz row shows only its badge). */
|
|
2884
|
+
displayTitle: string | null;
|
|
2885
|
+
/** Accessible name for the row button — always the full lesson title. */
|
|
2886
|
+
ariaLabel: string;
|
|
2887
|
+
durationLabel: string;
|
|
2888
|
+
questionsLabel: string;
|
|
2889
|
+
quizResultLabel: string | null;
|
|
2890
|
+
timeLabel: string | null;
|
|
2891
|
+
showBar: boolean;
|
|
2892
|
+
barPercent: number;
|
|
2893
|
+
/** Status disc geometry. */
|
|
2894
|
+
discSize: number;
|
|
2895
|
+
discCenter: number;
|
|
2896
|
+
ringRadius: number;
|
|
2897
|
+
ringCircumference: number;
|
|
2898
|
+
ringOffset: number;
|
|
2899
|
+
ringViewBox: string;
|
|
2900
|
+
/** Glyph sizes inside the disc (design values, per density and status). */
|
|
2901
|
+
checkSize: number;
|
|
2902
|
+
pauseSize: number;
|
|
2903
|
+
playIconSize: number;
|
|
2904
|
+
quizIconSize: number;
|
|
2905
|
+
/** Timeline connector below the disc. */
|
|
2906
|
+
connector: boolean;
|
|
2907
|
+
connectorDone: boolean;
|
|
2908
|
+
}
|
|
2909
|
+
/** A run of consecutive lessons that share a base title. */
|
|
2910
|
+
interface CourseLessonRunView {
|
|
2911
|
+
key: string;
|
|
2912
|
+
/** `true` when the run is rendered as a sub-heading + connected rail. */
|
|
2913
|
+
parts: boolean;
|
|
2914
|
+
base: string;
|
|
2915
|
+
lessons: CourseLessonView[];
|
|
2916
|
+
}
|
|
2917
|
+
/** One accordion section. */
|
|
2918
|
+
interface CourseModuleView {
|
|
2919
|
+
module: CourseModule;
|
|
2920
|
+
id: string;
|
|
2921
|
+
/** 1-based position in the *unfiltered* module list (stable while searching). */
|
|
2922
|
+
number: number;
|
|
2923
|
+
title: string;
|
|
2924
|
+
stats: CourseModuleStats;
|
|
2925
|
+
statsLabel: string;
|
|
2926
|
+
durationLabel: string;
|
|
2927
|
+
allDone: boolean;
|
|
2928
|
+
active: boolean;
|
|
2929
|
+
runs: CourseLessonRunView[];
|
|
2930
|
+
/** Single-lesson module rendered as a direct-play row (opt-in). */
|
|
2931
|
+
solo: CourseLessonView | null;
|
|
2932
|
+
}
|
|
2933
|
+
/** A row of the flat timeline layout — either a section divider or a lesson. */
|
|
2934
|
+
interface CourseTimelineRow {
|
|
2935
|
+
key: string;
|
|
2936
|
+
header: {
|
|
2937
|
+
number: number;
|
|
2938
|
+
title: string;
|
|
2939
|
+
stats: CourseModuleStats;
|
|
2940
|
+
} | null;
|
|
2941
|
+
lesson: CourseLessonView | null;
|
|
2942
|
+
}
|
|
2943
|
+
/** One transcript cue row. */
|
|
2944
|
+
interface CourseTranscriptRow {
|
|
2945
|
+
key: string;
|
|
2946
|
+
cue: CourseTranscriptCue;
|
|
2947
|
+
timeLabel: string;
|
|
2948
|
+
current: boolean;
|
|
2949
|
+
/** Text split around the search match so the template can wrap it in `<mark>`. */
|
|
2950
|
+
before: string;
|
|
2951
|
+
match: string;
|
|
2952
|
+
after: string;
|
|
2953
|
+
}
|
|
2954
|
+
/**
|
|
2955
|
+
* PECB course **Content** panel — the sidebar that sits next to the course
|
|
2956
|
+
* video player.
|
|
2957
|
+
*
|
|
2958
|
+
* Reproduces the "Course Player — Content Redesign" panel exactly: the
|
|
2959
|
+
* Content / Transcript tabs, lesson search, the collapsible **Section**
|
|
2960
|
+
* accordion (one section open at a time, auto-opening the section that owns the
|
|
2961
|
+
* active lesson), status discs (completed / now playing / in-progress ring /
|
|
2962
|
+
* not started / locked), quiz rows with badge + score, per-lesson progress bars,
|
|
2963
|
+
* the "Part 1 / Part 2 …" timeline rail for multi-part lessons, an alternative
|
|
2964
|
+
* flat timeline layout, and the searchable transcript with click-to-seek,
|
|
2965
|
+
* live cue highlighting and an autoscroll toggle.
|
|
2966
|
+
*
|
|
2967
|
+
* It is standalone and data-driven — no player dependency — so it can be used
|
|
2968
|
+
* next to `pecb-video-player`, inside `pecb-course-player`, or on its own.
|
|
2969
|
+
*
|
|
2970
|
+
* @example
|
|
2971
|
+
* ```html
|
|
2972
|
+
* <pecb-course-content-panel
|
|
2973
|
+
* [modules]="modules"
|
|
2974
|
+
* [transcript]="cues"
|
|
2975
|
+
* [(activeLessonId)]="lessonId"
|
|
2976
|
+
* [playing]="playing()"
|
|
2977
|
+
* [currentTime]="currentTime()"
|
|
2978
|
+
* (lessonSelect)="openLesson($event)"
|
|
2979
|
+
* (transcriptSeek)="seekTo($event)">
|
|
2980
|
+
* </pecb-course-content-panel>
|
|
2981
|
+
* ```
|
|
2982
|
+
*
|
|
2983
|
+
* Theming — override the CSS custom properties on the host:
|
|
2984
|
+
* ```css
|
|
2985
|
+
* pecb-course-content-panel { --pecb-course-panel-accent: #a11e29; }
|
|
2986
|
+
* ```
|
|
2987
|
+
*/
|
|
2988
|
+
declare class CourseContentPanelComponent {
|
|
2989
|
+
private readonly platformId;
|
|
2990
|
+
private readonly injector;
|
|
2991
|
+
private readonly isBrowser;
|
|
2992
|
+
/** Unique id prefix used to wire ARIA relationships. */
|
|
2993
|
+
readonly uid: string;
|
|
2994
|
+
private readonly transcriptScrollRef;
|
|
2995
|
+
/** Course structure rendered by the Content tab. */
|
|
2996
|
+
modules: _angular_core.InputSignal<CourseModule[]>;
|
|
2997
|
+
/**
|
|
2998
|
+
* Transcript cues for the active lesson. A `transcript` on the active
|
|
2999
|
+
* `CourseLesson` takes precedence over this input.
|
|
3000
|
+
*/
|
|
3001
|
+
transcript: _angular_core.InputSignal<CourseTranscriptCue[]>;
|
|
3002
|
+
/** Currently selected lesson. */
|
|
3003
|
+
activeLessonId: _angular_core.ModelSignal<string | null>;
|
|
3004
|
+
/** Visible tab. */
|
|
3005
|
+
tab: _angular_core.ModelSignal<CourseContentPanelTab>;
|
|
3006
|
+
/**
|
|
3007
|
+
* Id of the expanded section. `null` collapses all of them.
|
|
3008
|
+
* Left `undefined` the panel picks one itself (the active lesson's section,
|
|
3009
|
+
* otherwise the first one).
|
|
3010
|
+
*/
|
|
3011
|
+
openModuleId: _angular_core.ModelSignal<string | null | undefined>;
|
|
3012
|
+
/** Whether the transcript follows playback. */
|
|
3013
|
+
autoscroll: _angular_core.ModelSignal<boolean>;
|
|
3014
|
+
/** Lesson search text (Content tab). */
|
|
3015
|
+
query: _angular_core.ModelSignal<string>;
|
|
3016
|
+
/** Transcript search text. */
|
|
3017
|
+
transcriptQuery: _angular_core.ModelSignal<string>;
|
|
3018
|
+
/** Whether the player is currently playing — drives the "now playing" row. */
|
|
3019
|
+
playing: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3020
|
+
/**
|
|
3021
|
+
* Live playhead position in seconds. Used to highlight the transcript cue and
|
|
3022
|
+
* to draw live progress on the active lesson row; falls back to each lesson's
|
|
3023
|
+
* `resumeSeconds` when omitted.
|
|
3024
|
+
*/
|
|
3025
|
+
currentTime: _angular_core.InputSignal<number | undefined>;
|
|
3026
|
+
/** @default 'grouped' */
|
|
3027
|
+
layout: _angular_core.InputSignal<CourseContentPanelLayout>;
|
|
3028
|
+
/** @default 'comfortable' */
|
|
3029
|
+
density: _angular_core.InputSignal<CourseContentPanelDensity>;
|
|
3030
|
+
/** Colour of the "now playing" treatment. @default 'charcoal' */
|
|
3031
|
+
accent: _angular_core.InputSignal<CourseContentPanelAccent>;
|
|
3032
|
+
/** Show the Content / Transcript tab strip. @default true */
|
|
3033
|
+
showTabs: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3034
|
+
/** Show the lesson search box. @default true */
|
|
3035
|
+
showSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3036
|
+
/** Show the transcript search box. @default true */
|
|
3037
|
+
showTranscriptSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3038
|
+
/** Show the autoscroll footer on the Transcript tab. @default true */
|
|
3039
|
+
showAutoscroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3040
|
+
/** Show the circular course-progress header above the list. @default false */
|
|
3041
|
+
showProgress: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3042
|
+
/** Show the "Certificate" pill inside the progress header. @default true */
|
|
3043
|
+
showCertificate: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3044
|
+
/**
|
|
3045
|
+
* Render a module that holds exactly one lesson as a single direct-play row
|
|
3046
|
+
* instead of a collapsible section. @default false
|
|
3047
|
+
*/
|
|
3048
|
+
soloSingleLessonModules: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3049
|
+
/** Partial override of the user-visible strings (i18n). */
|
|
3050
|
+
labels: _angular_core.InputSignal<Partial<CourseContentPanelLabels>>;
|
|
3051
|
+
/** A lesson row was activated. */
|
|
3052
|
+
lessonSelect: _angular_core.OutputEmitterRef<CourseLesson>;
|
|
3053
|
+
/** A transcript cue was clicked — seek the player to this position (seconds). */
|
|
3054
|
+
transcriptSeek: _angular_core.OutputEmitterRef<number>;
|
|
3055
|
+
/** A section was expanded or collapsed. */
|
|
3056
|
+
moduleToggle: _angular_core.OutputEmitterRef<{
|
|
3057
|
+
module: CourseModule;
|
|
3058
|
+
open: boolean;
|
|
3059
|
+
}>;
|
|
3060
|
+
/** The "Certificate" pill was clicked. */
|
|
3061
|
+
certificateClick: _angular_core.OutputEmitterRef<void>;
|
|
3062
|
+
readonly text: _angular_core.Signal<CourseContentPanelLabels>;
|
|
3063
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
3064
|
+
private readonly compact;
|
|
3065
|
+
/** Resolved status of every lesson, keyed by lesson id. */
|
|
3066
|
+
private readonly statusById;
|
|
3067
|
+
private readonly resolveStatus;
|
|
3068
|
+
/** Modules narrowed by the search box (design: match lesson titles, else module title). */
|
|
3069
|
+
readonly filteredModules: _angular_core.Signal<CourseModule[]>;
|
|
3070
|
+
readonly moduleViews: _angular_core.Signal<CourseModuleView[]>;
|
|
3071
|
+
readonly timelineRows: _angular_core.Signal<CourseTimelineRow[]>;
|
|
3072
|
+
readonly isEmpty: _angular_core.Signal<boolean>;
|
|
3073
|
+
readonly progress: _angular_core.Signal<_pecb_ui_components.CourseProgressStats>;
|
|
3074
|
+
/** Geometry of the 56 px progress ring (design: r = 22, stroke = 5). */
|
|
3075
|
+
readonly progressRing: _angular_core.Signal<{
|
|
3076
|
+
radius: number;
|
|
3077
|
+
circumference: number;
|
|
3078
|
+
offset: number;
|
|
3079
|
+
}>;
|
|
3080
|
+
readonly progressDetail: _angular_core.Signal<string>;
|
|
3081
|
+
/** Cues of the active lesson, falling back to the panel-level `transcript`. */
|
|
3082
|
+
readonly activeCues: _angular_core.Signal<CourseTranscriptCue[]>;
|
|
3083
|
+
/** Index of the cue covering the playhead, or `-1`. */
|
|
3084
|
+
readonly activeCueIndex: _angular_core.Signal<number>;
|
|
3085
|
+
readonly transcriptRows: _angular_core.Signal<CourseTranscriptRow[]>;
|
|
3086
|
+
readonly transcriptEmpty: _angular_core.Signal<boolean>;
|
|
3087
|
+
readonly noLessonsLabel: _angular_core.Signal<string>;
|
|
3088
|
+
readonly noTranscriptLabel: _angular_core.Signal<string>;
|
|
3089
|
+
constructor();
|
|
3090
|
+
/** `"Section 3"` — the `{n}` placeholder resolved against the label set. */
|
|
3091
|
+
sectionLabel(index: number): string;
|
|
3092
|
+
/** Whether a section is expanded. */
|
|
3093
|
+
isModuleOpen(moduleId: string): boolean;
|
|
3094
|
+
/** Expand a section, collapsing the one that was open (single-open accordion). */
|
|
3095
|
+
toggleModule(view: CourseModuleView): void;
|
|
3096
|
+
/** Roving keyboard support between section headers (WAI-ARIA accordion). */
|
|
3097
|
+
onModuleHeaderKeydown(event: KeyboardEvent): void;
|
|
3098
|
+
/** Activate a lesson (ignored when locked). */
|
|
3099
|
+
selectLesson(lesson: CourseLesson): void;
|
|
3100
|
+
/** Seek the player to a transcript cue. */
|
|
3101
|
+
seekToCue(cue: CourseTranscriptCue): void;
|
|
3102
|
+
setTab(tab: CourseContentPanelTab): void;
|
|
3103
|
+
onTabKeydown(event: KeyboardEvent): void;
|
|
3104
|
+
onQueryInput(event: Event): void;
|
|
3105
|
+
onTranscriptQueryInput(event: Event): void;
|
|
3106
|
+
clearTranscriptQuery(): void;
|
|
3107
|
+
toggleAutoscroll(): void;
|
|
3108
|
+
onAutoscrollChange(event: Event): void;
|
|
3109
|
+
/**
|
|
3110
|
+
* Splits a module's lessons into runs of consecutive lessons sharing a base
|
|
3111
|
+
* title. A run of two or more where at least one carries a `— Part n` suffix
|
|
3112
|
+
* renders as a sub-heading plus a connected rail (design behaviour).
|
|
3113
|
+
*/
|
|
3114
|
+
private buildRuns;
|
|
3115
|
+
private buildLessonView;
|
|
3116
|
+
private scrollActiveCueIntoView;
|
|
3117
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CourseContentPanelComponent, never>;
|
|
3118
|
+
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>;
|
|
3119
|
+
}
|
|
3120
|
+
|
|
3121
|
+
/** Which side the content panel sits on. */
|
|
3122
|
+
type CoursePlayerPanelPosition = 'end' | 'start';
|
|
3123
|
+
/**
|
|
3124
|
+
* PECB course player — the video stage with the **Content** sidebar attached,
|
|
3125
|
+
* exactly as laid out in "Course Player — Content Redesign".
|
|
3126
|
+
*
|
|
3127
|
+
* Composes {@link VideoPlayerComponent} and {@link CourseContentPanelComponent}
|
|
3128
|
+
* and wires them together: picking a lesson loads its media and resumes at its
|
|
3129
|
+
* saved position, clicking a transcript cue seeks the video, and the panel
|
|
3130
|
+
* follows playback live (now-playing row, progress bars, transcript highlight).
|
|
3131
|
+
*
|
|
3132
|
+
* The two-column grid collapses to a single stacked column when the space it is
|
|
3133
|
+
* given gets narrow, so the same markup works in a page, a drawer or a phone.
|
|
3134
|
+
*
|
|
3135
|
+
* @example
|
|
3136
|
+
* ```html
|
|
3137
|
+
* <pecb-course-player
|
|
3138
|
+
* [modules]="modules"
|
|
3139
|
+
* [(activeLessonId)]="lessonId"
|
|
3140
|
+
* (lessonSelect)="track($event)"
|
|
3141
|
+
* (lessonEnded)="markComplete($event)">
|
|
3142
|
+
* </pecb-course-player>
|
|
3143
|
+
* ```
|
|
3144
|
+
*
|
|
3145
|
+
* Layout hooks:
|
|
3146
|
+
* ```css
|
|
3147
|
+
* pecb-course-player {
|
|
3148
|
+
* --pecb-course-player-panel-width: 408px;
|
|
3149
|
+
* --pecb-course-player-gap: 20px;
|
|
3150
|
+
* --pecb-course-player-panel-stacked-height: 460px;
|
|
3151
|
+
* }
|
|
3152
|
+
* ```
|
|
3153
|
+
*/
|
|
3154
|
+
declare class CoursePlayerComponent {
|
|
3155
|
+
/** Course structure. */
|
|
3156
|
+
modules: _angular_core.InputSignal<CourseModule[]>;
|
|
3157
|
+
/** Fallback transcript, used when the active lesson has no `transcript`. */
|
|
3158
|
+
transcript: _angular_core.InputSignal<CourseTranscriptCue[]>;
|
|
3159
|
+
/** Selected lesson. */
|
|
3160
|
+
activeLessonId: _angular_core.ModelSignal<string | null>;
|
|
3161
|
+
/** Playback state of the video. */
|
|
3162
|
+
playing: _angular_core.ModelSignal<boolean>;
|
|
3163
|
+
/** Playhead position, in seconds. */
|
|
3164
|
+
currentTime: _angular_core.ModelSignal<number>;
|
|
3165
|
+
/** Which panel tab is showing. */
|
|
3166
|
+
panelTab: _angular_core.ModelSignal<CourseContentPanelTab>;
|
|
3167
|
+
/** Poster used when the active lesson has none. */
|
|
3168
|
+
poster: _angular_core.InputSignal<string | undefined>;
|
|
3169
|
+
/** Media used when the active lesson has no `src` (e.g. a single-video course). */
|
|
3170
|
+
src: _angular_core.InputSignal<string | VideoPlayerSource[] | undefined>;
|
|
3171
|
+
/** Caption tracks used when the active lesson has none. */
|
|
3172
|
+
tracks: _angular_core.InputSignal<VideoPlayerTrack[]>;
|
|
3173
|
+
/** Stage label used when the active lesson has no `stageLabel`. */
|
|
3174
|
+
stageLabel: _angular_core.InputSignal<string | undefined>;
|
|
3175
|
+
/** Brand watermark on the video stage. @default 'PECB' */
|
|
3176
|
+
watermark: _angular_core.InputSignal<string>;
|
|
3177
|
+
/** @default '16 / 9' */
|
|
3178
|
+
aspectRatio: _angular_core.InputSignal<string>;
|
|
3179
|
+
/** @default 'metadata' */
|
|
3180
|
+
preload: _angular_core.InputSignal<VideoPlayerPreload>;
|
|
3181
|
+
/** `crossorigin` for the media element. */
|
|
3182
|
+
crossOrigin: _angular_core.InputSignal<"anonymous" | "use-credentials" | undefined>;
|
|
3183
|
+
/** Seconds the rewind button / arrow keys jump. @default 10 */
|
|
3184
|
+
seekStep: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
3185
|
+
/** i18n overrides for the video player. */
|
|
3186
|
+
videoLabels: _angular_core.InputSignal<Partial<VideoPlayerLabels>>;
|
|
3187
|
+
/** Start playing as soon as a video lesson is picked. @default true */
|
|
3188
|
+
autoPlayOnSelect: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3189
|
+
/** Show the active lesson's title under the video. @default true */
|
|
3190
|
+
showLessonTitle: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3191
|
+
/** Which side the panel sits on. @default 'end' */
|
|
3192
|
+
panelPosition: _angular_core.InputSignal<CoursePlayerPanelPosition>;
|
|
3193
|
+
/** @default 'grouped' */
|
|
3194
|
+
layout: _angular_core.InputSignal<CourseContentPanelLayout>;
|
|
3195
|
+
/** @default 'comfortable' */
|
|
3196
|
+
density: _angular_core.InputSignal<CourseContentPanelDensity>;
|
|
3197
|
+
/** @default 'charcoal' */
|
|
3198
|
+
accent: _angular_core.InputSignal<CourseContentPanelAccent>;
|
|
3199
|
+
/** Show the panel's tab strip. @default true */
|
|
3200
|
+
showTabs: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3201
|
+
/** Show the lesson search box. @default true */
|
|
3202
|
+
showSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3203
|
+
/** Show the circular course-progress header. @default false */
|
|
3204
|
+
showProgress: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3205
|
+
/** Render single-lesson sections as direct-play rows. @default false */
|
|
3206
|
+
soloSingleLessonModules: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
3207
|
+
/** i18n overrides for the panel. */
|
|
3208
|
+
panelLabels: _angular_core.InputSignal<Partial<CourseContentPanelLabels>>;
|
|
3209
|
+
/** A lesson row was picked (fires for quizzes too). */
|
|
3210
|
+
lessonSelect: _angular_core.OutputEmitterRef<CourseLesson>;
|
|
3211
|
+
/** The video of a lesson played to the end. */
|
|
3212
|
+
lessonEnded: _angular_core.OutputEmitterRef<CourseLesson>;
|
|
3213
|
+
/** Playhead moved — use it to persist progress. */
|
|
3214
|
+
timeUpdate: _angular_core.OutputEmitterRef<VideoPlayerTimeEvent>;
|
|
3215
|
+
/** The panel's "Certificate" pill was clicked. */
|
|
3216
|
+
certificateClick: _angular_core.OutputEmitterRef<void>;
|
|
3217
|
+
/** The media failed to load, or playback was rejected. */
|
|
3218
|
+
playerError: _angular_core.OutputEmitterRef<VideoPlayerError>;
|
|
3219
|
+
/** The lesson currently selected in the panel (may be a quiz). */
|
|
3220
|
+
readonly activeLesson: _angular_core.Signal<CourseLesson | undefined>;
|
|
3221
|
+
/**
|
|
3222
|
+
* Id of the last *video* lesson that was selected. Picking a quiz keeps the
|
|
3223
|
+
* video on the stage (design behaviour) instead of blanking it.
|
|
3224
|
+
*/
|
|
3225
|
+
private readonly videoLessonId;
|
|
3226
|
+
readonly videoLesson: _angular_core.Signal<CourseLesson | undefined>;
|
|
3227
|
+
readonly videoSrc: _angular_core.Signal<string | VideoPlayerSource[] | undefined>;
|
|
3228
|
+
readonly videoPoster: _angular_core.Signal<string | undefined>;
|
|
3229
|
+
readonly videoTracks: _angular_core.Signal<VideoPlayerTrack[]>;
|
|
3230
|
+
readonly videoStageLabel: _angular_core.Signal<string | undefined>;
|
|
3231
|
+
readonly videoTitle: _angular_core.Signal<string | undefined>;
|
|
3232
|
+
readonly lessonTitle: _angular_core.Signal<string>;
|
|
3233
|
+
/** Resume position handed to the player whenever the source changes. */
|
|
3234
|
+
readonly startTime: _angular_core.Signal<number>;
|
|
3235
|
+
readonly hostClasses: _angular_core.Signal<string>;
|
|
3236
|
+
/** Id of the lesson whose resume position has already been pushed into `currentTime`. */
|
|
3237
|
+
private resumeAppliedFor;
|
|
3238
|
+
constructor();
|
|
3239
|
+
/** Panel → player: load a lesson, resuming where it left off. */
|
|
3240
|
+
onLessonSelect(lesson: CourseLesson): void;
|
|
3241
|
+
/** Panel → player: jump to a transcript cue and keep playing. */
|
|
3242
|
+
onTranscriptSeek(seconds: number): void;
|
|
3243
|
+
onPlaybackEnded(): void;
|
|
3244
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoursePlayerComponent, never>;
|
|
3245
|
+
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>;
|
|
3246
|
+
}
|
|
3247
|
+
|
|
2405
3248
|
/**
|
|
2406
3249
|
* Notification types supported by the service
|
|
2407
3250
|
*/
|
|
@@ -6546,5 +7389,5 @@ declare class TourComponent implements OnInit, OnChanges {
|
|
|
6546
7389
|
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>;
|
|
6547
7390
|
}
|
|
6548
7391
|
|
|
6549
|
-
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 };
|
|
6550
|
-
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 };
|
|
7392
|
+
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 };
|
|
7393
|
+
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 };
|