@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/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 };