@panelwave/player 1.3.0 → 1.6.0

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
@@ -401,10 +401,12 @@ interface BalloonConfig {
401
401
  balloonType: BalloonType;
402
402
  /** 0-1 (0=rectangle, 1=ellipse) */
403
403
  cornerRadius: number;
404
- /** Pixels */
404
+ /** Authored width in px — the floor; with textFit 'grow' the body grows for longer text */
405
405
  maxWidth: number;
406
- /** Pixels */
406
+ /** Authored height in px — the floor; with textFit 'grow' the body grows for longer text */
407
407
  maxHeight: number;
408
+ /** grow (default): the balloon grows when the text needs more room; fixed: keeps the authored size (schema 1.8.0) */
409
+ textFit?: 'grow' | 'fixed';
408
410
  /** CSS font-family */
409
411
  fontFamily: string;
410
412
  /** Pixels */
@@ -1431,8 +1433,14 @@ interface SequenceAudioTrack {
1431
1433
  muted?: boolean;
1432
1434
  /** Optional explicit panel range start */
1433
1435
  startPanelId?: string;
1434
- /** Optional explicit panel range end */
1436
+ /** Optional explicit panel range end (span 'work': may be in a later chapter) */
1435
1437
  endPanelId?: string;
1438
+ /**
1439
+ * How long the track lasts, as authored (format 1.8.0, additive; default
1440
+ * 'custom'): 'page' / 'chapter' = that panel range, 'work' = keeps playing
1441
+ * across chapter boundaries until endPanelId (else the last panel).
1442
+ */
1443
+ span?: 'custom' | 'page' | 'chapter' | 'work';
1436
1444
  }
1437
1445
  /**
1438
1446
  * Chapter containing panels and navigation graph
@@ -3230,6 +3238,8 @@ interface AudioTrack {
3230
3238
  volume?: number;
3231
3239
  fadeIn?: number;
3232
3240
  fadeOut?: number;
3241
+ /** Playback speed (0.25-4; 1 = as recorded). */
3242
+ playbackRate?: number;
3233
3243
  }
3234
3244
  /**
3235
3245
  * Playback state
@@ -3302,9 +3312,9 @@ declare class AudioEngineService {
3302
3312
  */
3303
3313
  resumeContext(): Promise<void>;
3304
3314
  /**
3305
- * Play audio track
3315
+ * Play audio track, optionally from `offsetSeconds` into the file.
3306
3316
  */
3307
- play(track: AudioTrack): Promise<void>;
3317
+ play(track: AudioTrack, offsetSeconds?: number): Promise<void>;
3308
3318
  /**
3309
3319
  * Stop audio track
3310
3320
  */
@@ -3419,6 +3429,119 @@ declare class AudioEngineService {
3419
3429
  static ɵprov: i0.ɵɵInjectableDeclaration<AudioEngineService>;
3420
3430
  }
3421
3431
 
3432
+ /**
3433
+ * Sequence Audio Service
3434
+ *
3435
+ * Plays a work's timeline audio (`chapters[].sequenceAudioTracks` — music,
3436
+ * ambience, voiceover beds) while the reader moves through the panels:
3437
+ *
3438
+ * - entering a panel starts every track that covers it, at the right offset
3439
+ * (a jump into the middle of a scene picks the music up where it is);
3440
+ * - a track keeps playing while the reader stays inside its range, so
3441
+ * music does not restart on every panel; leaving the range fades it out
3442
+ * (its `fadeOut`, else 250 ms);
3443
+ * - a track that starts or ends inside a panel is delayed / stopped there;
3444
+ * - `span: 'work'` tracks continue across chapter boundaries.
3445
+ *
3446
+ * Placement follows the CMS timeline (see sequence-audio-timeline.ts). Roles
3447
+ * map onto the engine buses, so the reader's Audio / SFX / Speech toggles
3448
+ * apply. Tracks refused by the autoplay policy are retried on the first
3449
+ * user gesture.
3450
+ */
3451
+
3452
+ /** Fade when a track ends because the reader left its range (unless it has its own fadeOut). */
3453
+ declare const SEQUENCE_AUDIO_LEAVE_FADE_MS = 250;
3454
+ declare class SequenceAudioService implements OnDestroy {
3455
+ private readonly engine;
3456
+ private readonly manifestService;
3457
+ private readonly gesture;
3458
+ /** Tracks the current panel wants, by engine id. */
3459
+ private desired;
3460
+ /** Refused by the autoplay policy; retried on the first gesture. */
3461
+ private blocked;
3462
+ private warned;
3463
+ private layoutCache?;
3464
+ private readonly gestureSub;
3465
+ constructor();
3466
+ ngOnDestroy(): void;
3467
+ /**
3468
+ * Follow the reader: call on every panel change (and when the page format
3469
+ * changes). `panelId` undefined = silence (cover, locked panel, teardown).
3470
+ */
3471
+ syncPanel(panelId: string | undefined, format: string | null): void;
3472
+ /** Stop everything this service started. */
3473
+ stopAll(): void;
3474
+ /** Engine ids of the tracks the current panel wants (started, pending or blocked). */
3475
+ getDesiredTrackIds(): string[];
3476
+ private layout;
3477
+ private schedule;
3478
+ /** Stop the track inside this panel when its range ends here. */
3479
+ private armStop;
3480
+ private start;
3481
+ private release;
3482
+ private leaveFade;
3483
+ private onUserGesture;
3484
+ private isAutoplayRefusal;
3485
+ private warnOnce;
3486
+ static ɵfac: i0.ɵɵFactoryDeclaration<SequenceAudioService, never>;
3487
+ static ɵprov: i0.ɵɵInjectableDeclaration<SequenceAudioService>;
3488
+ }
3489
+
3490
+ /**
3491
+ * Timeline (sequence) audio placement for the reader — the same model as the
3492
+ * CMS editor's timeline: the work is one line of panels (chapters in order →
3493
+ * the active format's pages → reading order), each panel lasting its
3494
+ * `durationMs` (else the work's seconds-per-panel, else 5 s).
3495
+ *
3496
+ * A chapter's `sequenceAudioTracks` sit on that line relative to their
3497
+ * chapter's start. `span` (format 1.8.0): 'page' / 'chapter' tracks cover
3498
+ * their startPanelId..endPanelId range; a 'work' track keeps playing across
3499
+ * chapter boundaries until endPanelId (else the work's last panel); every
3500
+ * other track ends with its chapter.
3501
+ *
3502
+ * The reader does not follow a clock, so the timeline is used per panel:
3503
+ * entering a panel tells which tracks cover it, from which offset, and
3504
+ * whether one starts or ends inside it (`cuesForPanel`).
3505
+ */
3506
+
3507
+ interface TimelineEntry {
3508
+ panelId: string;
3509
+ chapterId: string;
3510
+ startMs: number;
3511
+ endMs: number;
3512
+ }
3513
+ interface WorkTimeline {
3514
+ entries: TimelineEntry[];
3515
+ byPanel: Map<string, TimelineEntry>;
3516
+ chapters: Map<string, {
3517
+ startMs: number;
3518
+ endMs: number;
3519
+ }>;
3520
+ endMs: number;
3521
+ }
3522
+ interface TrackRange {
3523
+ track: SequenceAudioTrack;
3524
+ chapterId: string;
3525
+ startMs: number;
3526
+ endMs: number;
3527
+ }
3528
+ /** What to do with a track when the reader enters a panel. */
3529
+ interface PanelCue {
3530
+ range: TrackRange;
3531
+ /** The track starts this long after the panel is entered (0 = at once). */
3532
+ delayMs: number;
3533
+ /** Timeline position inside the track when it starts (ms). */
3534
+ offsetMs: number;
3535
+ /** The track ends inside this panel, this long after entering it. */
3536
+ stopAfterMs?: number;
3537
+ }
3538
+ /** The work's panel line for a page format (null = every page). */
3539
+ declare function buildWorkTimeline(manifest: PanelWaveManifest | null | undefined, format: string | null, defaultPanelMs?: number): WorkTimeline;
3540
+ /** Where each (format-matching, unmuted) timeline track sits on the work line. */
3541
+ declare function resolveTrackRanges(manifest: PanelWaveManifest | null | undefined, timeline: WorkTimeline, format: string | null): TrackRange[];
3542
+ /** The tracks that sound while the reader is on `entry`'s panel. */
3543
+ declare function cuesForPanel(ranges: readonly TrackRange[], entry: TimelineEntry): PanelCue[];
3544
+
3422
3545
  /**
3423
3546
  * Panel Audio Service
3424
3547
  *
@@ -3495,12 +3618,6 @@ declare class PanelAudioService implements OnDestroy {
3495
3618
  private isAutoplayRefusal;
3496
3619
  private resolve;
3497
3620
  private resolveTrack;
3498
- /**
3499
- * First variant the browser reports it can play; otherwise the first one
3500
- * (the element will surface the real error).
3501
- */
3502
- private pickVariant;
3503
- private createProbe;
3504
3621
  private clampGain;
3505
3622
  private warnOnce;
3506
3623
  static ɵfac: i0.ɵɵFactoryDeclaration<PanelAudioService, never>;
@@ -5340,6 +5457,16 @@ declare function balloonConfigToTailOptions(config: BalloonConfig): {
5340
5457
  curveAmount: number;
5341
5458
  } | null;
5342
5459
 
5460
+ /**
5461
+ * How a balloon treats text that needs more room than its authored size
5462
+ * (`maxWidth × maxHeight`, schema 1.8 `BalloonConfig.textFit`):
5463
+ * - `grow` (default): the balloon grows beyond the authored size until the
5464
+ * text fits — proportionally first (the shape keeps its aspect ratio), then
5465
+ * in height; see {@link BALLOON_GROWTH_MAX}.
5466
+ * - `fixed`: the balloon keeps its authored size and the text spills over the
5467
+ * edges (pre-1.8 behaviour); `textOverflows` reports it.
5468
+ */
5469
+ type BalloonTextFit = 'grow' | 'fixed';
5343
5470
  interface BalloonPadding {
5344
5471
  top: number;
5345
5472
  right: number;
@@ -5347,8 +5474,12 @@ interface BalloonPadding {
5347
5474
  left: number;
5348
5475
  }
5349
5476
  interface BalloonOptions {
5477
+ /** Authored width in px; 0 = natural width. With textFit 'grow' the body may become wider. */
5350
5478
  maxWidth: number;
5479
+ /** Authored height in px; 0 = natural height. With textFit 'grow' the body may become taller. */
5351
5480
  maxHeight: number;
5481
+ /** What happens when the text needs more room than the authored size (default 'grow'). */
5482
+ textFit: BalloonTextFit;
5352
5483
  padding: BalloonPadding;
5353
5484
  strokeWidth: number;
5354
5485
  strokeColor: string;
@@ -5390,10 +5521,19 @@ interface CutOptions {
5390
5521
  bottom?: boolean;
5391
5522
  }
5392
5523
  interface BalloonRenderResult {
5524
+ /** Rendered body width (the authored width, or more when the balloon grew). */
5393
5525
  width: number;
5526
+ /** Rendered body height (the authored height, or more when the balloon grew). */
5394
5527
  height: number;
5528
+ /** The authored body size the growth started from (maxWidth/maxHeight, or the natural size for 0). */
5529
+ authoredWidth: number;
5530
+ authoredHeight: number;
5531
+ /** True when the body is larger than the authored size because the text needed more room. */
5532
+ grown: boolean;
5533
+ /** Proportional growth factor applied to the authored size (1 when not grown). */
5534
+ growth: number;
5395
5535
  svg: SVGSVGElement;
5396
- /** True when the text needs more height than a fixed maxHeight allows (it is cut off). */
5536
+ /** True when the text needs more height than the body gives it (textFit 'fixed' only). */
5397
5537
  textOverflows: boolean;
5398
5538
  balloon: ComicBalloon;
5399
5539
  update: (newText?: string, newTailOptions?: TailOptions | null) => BalloonRenderResult;
@@ -6589,6 +6729,7 @@ declare class PlayerShellComponent implements OnInit, OnChanges, AfterViewChecke
6589
6729
  private readonly cdr;
6590
6730
  private readonly audioEngine;
6591
6731
  private readonly panelAudio;
6732
+ private readonly sequenceAudio;
6592
6733
  /**
6593
6734
  * Reading order per panel id (1-based, across chapters), computed once per
6594
6735
  * manifest. Reported as `panelOrder` on panel_view / funnel events and as
@@ -7522,6 +7663,14 @@ declare class SpeechBubblesComponent implements OnChanges, AfterViewInit, OnDest
7522
7663
  * screens (phones) get smaller lettering.
7523
7664
  */
7524
7665
  readingScale: number;
7666
+ /**
7667
+ * Page view: place a tailed balloon by its AUTHORED tail tip (the speaker
7668
+ * on the artwork) instead of centring its body on the stored box, and keep
7669
+ * the tail at its authored length when the MIN_LETTERING_PX floor boosts
7670
+ * the balloon — the CMS editor's page view rule (PanelRenderer), which the
7671
+ * lettered PDF must reproduce. Panel view keeps the centre placement.
7672
+ */
7673
+ anchorTailTip: boolean;
7525
7674
  /**
7526
7675
  * Work-level balloon config defaults (from settings.typography.balloon_config)
7527
7676
  */
@@ -7543,6 +7692,14 @@ declare class SpeechBubblesComponent implements OnChanges, AfterViewInit, OnDest
7543
7692
  }>;
7544
7693
  /** Rendered balloon containers, keyed by bubble ID */
7545
7694
  private renderedBalloons;
7695
+ /**
7696
+ * Font specs ("15px 'Ames Italic', sans-serif") whose loading this overlay
7697
+ * already requested. Web fonts load lazily on first use, so the first
7698
+ * render may have measured with a fallback face while document.fonts.ready
7699
+ * had long resolved (no font was in flight yet). Each new spec is loaded
7700
+ * explicitly and the balloons re-render once it arrives.
7701
+ */
7702
+ private fontsRequested;
7546
7703
  /** ResizeObserver for container size tracking */
7547
7704
  private resizeObserver;
7548
7705
  private initialized;
@@ -7573,12 +7730,18 @@ declare class SpeechBubblesComponent implements OnChanges, AfterViewInit, OnDest
7573
7730
  * Render all speech balloons into the DOM
7574
7731
  */
7575
7732
  renderAllBalloons(): void;
7733
+ /**
7734
+ * Request every font spec the balloons use that was not requested before;
7735
+ * re-render once a face that was not yet available arrives, so balloons
7736
+ * measured with a fallback face are laid out again with the real one.
7737
+ */
7738
+ private ensureFontsLoaded;
7576
7739
  /**
7577
7740
  * Handle bubble click (called from template for any fallback interaction)
7578
7741
  */
7579
7742
  onBubbleClick(bubble: SpeechBubble, event: MouseEvent): void;
7580
7743
  static ɵfac: i0.ɵɵFactoryDeclaration<SpeechBubblesComponent, never>;
7581
- static ɵcmp: i0.ɵɵComponentDeclaration<SpeechBubblesComponent, "pw-speech-bubbles", never, { "bubbles": { "alias": "bubbles"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "containerWidth": { "alias": "containerWidth"; "required": false; }; "containerHeight": { "alias": "containerHeight"; "required": false; }; "readingScale": { "alias": "readingScale"; "required": false; }; "workBalloonConfig": { "alias": "workBalloonConfig"; "required": false; }; "characters": { "alias": "characters"; "required": false; }; }, { "bubbleClick": "bubbleClick"; "bubbleAudioPlay": "bubbleAudioPlay"; }, never, never, true, never>;
7744
+ static ɵcmp: i0.ɵɵComponentDeclaration<SpeechBubblesComponent, "pw-speech-bubbles", never, { "bubbles": { "alias": "bubbles"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "containerWidth": { "alias": "containerWidth"; "required": false; }; "containerHeight": { "alias": "containerHeight"; "required": false; }; "readingScale": { "alias": "readingScale"; "required": false; }; "anchorTailTip": { "alias": "anchorTailTip"; "required": false; }; "workBalloonConfig": { "alias": "workBalloonConfig"; "required": false; }; "characters": { "alias": "characters"; "required": false; }; }, { "bubbleClick": "bubbleClick"; "bubbleAudioPlay": "bubbleAudioPlay"; }, never, never, true, never>;
7582
7745
  }
7583
7746
 
7584
7747
  /**
@@ -7598,6 +7761,11 @@ declare class HotspotsOverlayComponent implements OnChanges {
7598
7761
  * Hotspots of the current panel (manifest shape)
7599
7762
  */
7600
7763
  hotspots: Hotspot[];
7764
+ /**
7765
+ * The panel's speech bubbles: a choice hotspot whose label is already
7766
+ * lettered as a bubble keeps its invisible area under `display: auto`.
7767
+ */
7768
+ bubbles: SpeechBubble[];
7601
7769
  /**
7602
7770
  * Current locale for label resolution
7603
7771
  */
@@ -7687,7 +7855,7 @@ declare class HotspotsOverlayComponent implements OnChanges {
7687
7855
  private centroidOf;
7688
7856
  private clamp01;
7689
7857
  static ɵfac: i0.ɵɵFactoryDeclaration<HotspotsOverlayComponent, never>;
7690
- static ɵcmp: i0.ɵɵComponentDeclaration<HotspotsOverlayComponent, "pw-hotspots-overlay", never, { "hotspots": { "alias": "hotspots"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "containerWidth": { "alias": "containerWidth"; "required": false; }; "containerHeight": { "alias": "containerHeight"; "required": false; }; "context": { "alias": "context"; "required": false; }; "interactive": { "alias": "interactive"; "required": false; }; "showIndicators": { "alias": "showIndicators"; "required": false; }; }, { "hotspotActivate": "hotspotActivate"; }, never, never, true, never>;
7858
+ static ɵcmp: i0.ɵɵComponentDeclaration<HotspotsOverlayComponent, "pw-hotspots-overlay", never, { "hotspots": { "alias": "hotspots"; "required": false; }; "bubbles": { "alias": "bubbles"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "containerWidth": { "alias": "containerWidth"; "required": false; }; "containerHeight": { "alias": "containerHeight"; "required": false; }; "context": { "alias": "context"; "required": false; }; "interactive": { "alias": "interactive"; "required": false; }; "showIndicators": { "alias": "showIndicators"; "required": false; }; }, { "hotspotActivate": "hotspotActivate"; }, never, never, true, never>;
7691
7859
  }
7692
7860
 
7693
7861
  /**
@@ -8089,5 +8257,5 @@ declare class PlayerComponent {
8089
8257
  static ɵcmp: i0.ɵɵComponentDeclaration<PlayerComponent, "pw-player", never, {}, {}, never, never, true, never>;
8090
8258
  }
8091
8259
 
8092
- export { ANONYMOUS_READER, ActionModalComponent, AgeGateComponent, AssetUrlService, AudioEngineService, BranchChooserComponent, CANVAS_PANEL_BUDGET, CanvasCameraService, CanvasStageComponent, ComicBalloon, DEFAULT_BALLOON_CONFIG, DEFAULT_PAGE_BACKGROUND, DEFAULT_STALL_TIMEOUT_MS, DEFAULT_VIDEO_MUTED, DEFAULT_VIDEO_PLAY_MODE, DEFAULT_VIDEO_START_MODE, EntitlementError, EntitlementService, ExportService, FlowEngineService, HotspotActionService, HotspotsOverlayComponent, HttpEntitlementAdapter, ImageCacheService, LOCATION_PARAMS, ManifestService, MockEntitlementAdapter, NullEntitlementAdapter, PANEL_AUDIO_LEAVE_FADE_MS, PanelAudioService, PaywallOverlayComponent, PaywallService, PlayerComponent, PlayerEvent, PlayerService, PlayerShellComponent, PlayerStateService, PluginHostService, PluginSandboxComponent, PreloadService, PwIconComponent, RESERVED_NAMESPACES, SpeechBubblesComponent, THUMBNAIL_WIDTH, TrackingService, TranslationService, UserGestureService, VISIBILITY_THRESHOLD, VariableStoreService, VideoControllerService, VideoLayerComponent, VideoSequencerService, VisibilityService, applyVariantOverrides, balloonConfigToRenderOptions, balloonConfigToTailOptions, busForRole, chapterOrderFromManifest, coverImageSrc, createBalloon, evaluatePanelAccess, evaluateWorkAccess, findWorkGateRule, fromManifestRule, isExtraLocked, isLockedPanel, locationUrl, mergeBalloonConfig, pageAspectRatio, pageFormatOf, pageFormatsOf, pagesForFormat, panelThumbnailSrc, parseLocationSearch, pickPageFormat, rankPageFormats, readingOrderFromManifest, resolveMuted, resolvePageBackground, resolvePanelVariant, resolvePanels, resolvePlayMode, resolveStartMode, resolveVideoConfig, rulesFromManifest, satisfiesRule, screenClassFor, selectVariant, toEntitlementStatus };
8093
- export type { AccessDecision, AgeVerificationResult, AnimatableProperty, AnimationEasing, AnimationKeyframe, AssetBase, AssetCatalogItem, AssetCatalogItemAudio, AssetCatalogItemImage, AssetCatalogItemJson, AssetCatalogItemPluginPayload, AssetCatalogItemSubtitle, AssetCatalogItemVector, AssetCatalogItemVideo, AssetCategory, AssetCommon, AssetRef, AssetReference, AssetVariant, Assets, AudioLayer, AudioRole, AudioTrack, AudioVariant, BalloonConfig, BalloonConfigOverride, BalloonOptions, BalloonRenderResult, BalloonType, Bookmark, BoundingBox, BranchChoice, BubbleStyle, BubbleTail, CameraMove, CameraMovePath, CameraState, CameraZoomProfile, CanvasBackground, CanvasCameraPolicy, CanvasDecoration, CanvasFitMode, CanvasFreeRoam, CanvasLayout, CanvasOverviewPolicy, CanvasPlacement, CanvasRevealMode, Chapter, Character$1 as Character, ContentWarning, Creator, DecisionEvent, DeepLinkTarget, DeviceVariables, Edge, EffectiveVideoConfig, EntitlementAdapter$1 as EntitlementAdapter, EntitlementContext, EntitlementErrorCode, EntitlementSnapshot, EntitlementSnapshotResponse, EntitlementStatus, EntitlementVariables, ErrorEvent$1 as ErrorEvent, EvaluatorEntitlementType, EvaluatorRule, EvaluatorScope, ExtraImage, ExtraItem, Extras, FormatView, Graph, HideBorderConfig, Hotspot, HotspotAction, HotspotCircle, HotspotGoToAction, HotspotOpenExtrasAction, HotspotOpenModalAction, HotspotPluginEventAction, HotspotPolygon, HotspotRect, HotspotSetVariablesAction, HotspotShape, HotspotUiEffect, HttpEntitlementAdapterConfig, ImageLayer, ImageVariant, JsonLogic, JsonLogicExpression, JsonValue, JsonVariant, Layer, LayerKind, LayerViewMode, LocaleCode, LocalizedString, LockReason, Meta, Mutation, MutationOperation, NavigationPath, NodeMetadata, NormalizedPoint, NormalizedRect, OutputFormat, OutputPreset, OverlayState, Page, PageLayout, PageVisual, Panel, PanelAnimations, PanelAudioRole, PanelAudioTrack, PanelChangeEvent, PanelPartial, PanelPlacement, PanelRef, PanelVariant, PanelWaveManifest, PanelwaveHeader, Paywall, PaywallAction, PaywallEvent, PaywallGate$1 as PaywallGate, PaywallProduct, PaywallRule, PlaybackState, PlayerError, PlayerErrorCode, PlayerEventData, PlayerLocation, PlayerOptions, PlayerPanelChangeEvent, PlayerPreferences, PlayerState, PlayerStatistics, PlayerView, PluginInstance$1 as PluginInstance, PluginLayer, PreferenceVariables, PreloadItem, PreloadPriority, PreloadSettings, PreloadStatus$1 as PreloadStatus, PreviewInfo, PurchaseInfo, ReadingProgress, ResolvedPanel, ResolvedPanelAudio, ScreenClass, SequenceAudioTrack, SequencedVideo, SequencedVideoInfo, Settings, SpeechBubble, StagePlacement, SubtitleVariant, TailConfig, TailCurve, TailOptions, TextLayer, TextStyle, Tracking, TrackingConfig$1 as TrackingConfig, TrackingEvent, Transform, Transition, TraversalOptions, TraversalResult, UIDefaults, UISettings, UserInfo, UserVariables, VariableChangeEvent, VariableContext, VariableDefinition, VariableMutation, VariableScope, VariableStore, VariableType, VariableValidationResult, Variables, VariantContext, VectorVariant, VideoEvent, VideoLayer, VideoPlayMode, VideoPoster, VideoStartMode, VideoState, VideoStatus, VideoTrackingPayload, VideoTrigger, VideoVariant, ViewMode, ViewportState, VisibilityChange, WorldPoint, WorldRect };
8260
+ export { ANONYMOUS_READER, ActionModalComponent, AgeGateComponent, AssetUrlService, AudioEngineService, BranchChooserComponent, CANVAS_PANEL_BUDGET, CanvasCameraService, CanvasStageComponent, ComicBalloon, DEFAULT_BALLOON_CONFIG, DEFAULT_PAGE_BACKGROUND, DEFAULT_STALL_TIMEOUT_MS, DEFAULT_VIDEO_MUTED, DEFAULT_VIDEO_PLAY_MODE, DEFAULT_VIDEO_START_MODE, EntitlementError, EntitlementService, ExportService, FlowEngineService, HotspotActionService, HotspotsOverlayComponent, HttpEntitlementAdapter, ImageCacheService, LOCATION_PARAMS, ManifestService, MockEntitlementAdapter, NullEntitlementAdapter, PANEL_AUDIO_LEAVE_FADE_MS, PanelAudioService, PaywallOverlayComponent, PaywallService, PlayerComponent, PlayerEvent, PlayerService, PlayerShellComponent, PlayerStateService, PluginHostService, PluginSandboxComponent, PreloadService, PwIconComponent, RESERVED_NAMESPACES, SEQUENCE_AUDIO_LEAVE_FADE_MS, SequenceAudioService, SpeechBubblesComponent, THUMBNAIL_WIDTH, TrackingService, TranslationService, UserGestureService, VISIBILITY_THRESHOLD, VariableStoreService, VideoControllerService, VideoLayerComponent, VideoSequencerService, VisibilityService, applyVariantOverrides, balloonConfigToRenderOptions, balloonConfigToTailOptions, buildWorkTimeline, busForRole, chapterOrderFromManifest, coverImageSrc, createBalloon, cuesForPanel, evaluatePanelAccess, evaluateWorkAccess, findWorkGateRule, fromManifestRule, isExtraLocked, isLockedPanel, locationUrl, mergeBalloonConfig, pageAspectRatio, pageFormatOf, pageFormatsOf, pagesForFormat, panelThumbnailSrc, parseLocationSearch, pickPageFormat, rankPageFormats, readingOrderFromManifest, resolveMuted, resolvePageBackground, resolvePanelVariant, resolvePanels, resolvePlayMode, resolveStartMode, resolveTrackRanges, resolveVideoConfig, rulesFromManifest, satisfiesRule, screenClassFor, selectVariant, toEntitlementStatus };
8261
+ export type { AccessDecision, AgeVerificationResult, AnimatableProperty, AnimationEasing, AnimationKeyframe, AssetBase, AssetCatalogItem, AssetCatalogItemAudio, AssetCatalogItemImage, AssetCatalogItemJson, AssetCatalogItemPluginPayload, AssetCatalogItemSubtitle, AssetCatalogItemVector, AssetCatalogItemVideo, AssetCategory, AssetCommon, AssetRef, AssetReference, AssetVariant, Assets, AudioLayer, AudioRole, AudioTrack, AudioVariant, BalloonConfig, BalloonConfigOverride, BalloonOptions, BalloonRenderResult, BalloonType, Bookmark, BoundingBox, BranchChoice, BubbleStyle, BubbleTail, CameraMove, CameraMovePath, CameraState, CameraZoomProfile, CanvasBackground, CanvasCameraPolicy, CanvasDecoration, CanvasFitMode, CanvasFreeRoam, CanvasLayout, CanvasOverviewPolicy, CanvasPlacement, CanvasRevealMode, Chapter, Character$1 as Character, ContentWarning, Creator, DecisionEvent, DeepLinkTarget, DeviceVariables, Edge, EffectiveVideoConfig, EntitlementAdapter$1 as EntitlementAdapter, EntitlementContext, EntitlementErrorCode, EntitlementSnapshot, EntitlementSnapshotResponse, EntitlementStatus, EntitlementVariables, ErrorEvent$1 as ErrorEvent, EvaluatorEntitlementType, EvaluatorRule, EvaluatorScope, ExtraImage, ExtraItem, Extras, FormatView, Graph, HideBorderConfig, Hotspot, HotspotAction, HotspotCircle, HotspotGoToAction, HotspotOpenExtrasAction, HotspotOpenModalAction, HotspotPluginEventAction, HotspotPolygon, HotspotRect, HotspotSetVariablesAction, HotspotShape, HotspotUiEffect, HttpEntitlementAdapterConfig, ImageLayer, ImageVariant, JsonLogic, JsonLogicExpression, JsonValue, JsonVariant, Layer, LayerKind, LayerViewMode, LocaleCode, LocalizedString, LockReason, Meta, Mutation, MutationOperation, NavigationPath, NodeMetadata, NormalizedPoint, NormalizedRect, OutputFormat, OutputPreset, OverlayState, Page, PageLayout, PageVisual, Panel, PanelAnimations, PanelAudioRole, PanelAudioTrack, PanelChangeEvent, PanelCue, PanelPartial, PanelPlacement, PanelRef, PanelVariant, PanelWaveManifest, PanelwaveHeader, Paywall, PaywallAction, PaywallEvent, PaywallGate$1 as PaywallGate, PaywallProduct, PaywallRule, PlaybackState, PlayerError, PlayerErrorCode, PlayerEventData, PlayerLocation, PlayerOptions, PlayerPanelChangeEvent, PlayerPreferences, PlayerState, PlayerStatistics, PlayerView, PluginInstance$1 as PluginInstance, PluginLayer, PreferenceVariables, PreloadItem, PreloadPriority, PreloadSettings, PreloadStatus$1 as PreloadStatus, PreviewInfo, PurchaseInfo, ReadingProgress, ResolvedPanel, ResolvedPanelAudio, ScreenClass, SequenceAudioTrack, SequencedVideo, SequencedVideoInfo, Settings, SpeechBubble, StagePlacement, SubtitleVariant, TailConfig, TailCurve, TailOptions, TextLayer, TextStyle, TimelineEntry, TrackRange, Tracking, TrackingConfig$1 as TrackingConfig, TrackingEvent, Transform, Transition, TraversalOptions, TraversalResult, UIDefaults, UISettings, UserInfo, UserVariables, VariableChangeEvent, VariableContext, VariableDefinition, VariableMutation, VariableScope, VariableStore, VariableType, VariableValidationResult, Variables, VariantContext, VectorVariant, VideoEvent, VideoLayer, VideoPlayMode, VideoPoster, VideoStartMode, VideoState, VideoStatus, VideoTrackingPayload, VideoTrigger, VideoVariant, ViewMode, ViewportState, VisibilityChange, WorkTimeline, WorldPoint, WorldRect };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panelwave/player",
3
- "version": "1.3.0",
3
+ "version": "1.6.0",
4
4
  "description": "Open-source Angular library for PanelWave interactive graphic novels",
5
5
  "keywords": [
6
6
  "angular",
@@ -25,9 +25,9 @@ License text: https://openfontlicense.org/open-font-license-official-text/
25
25
 
26
26
  ## Deliberately NOT included
27
27
 
28
- **Ames Pro** (`amespro-*`, by Blambot Comic Fonts) is a **commercial** font and
28
+ **Ames Pro** (`amespro-*`, by Purastik Graphics) is a **commercial** font and
29
29
  is not part of this MIT-licensed package (the files are gitignored). Host
30
- applications that use it must license it from https://blambot.com and provide
30
+ applications that use it must license it (web-font license) from https://www.fontspring.com/fonts/purastik-graphics/ames-pro and provide
31
31
  their own `@font-face` declarations for `'Ames Italic'`, `'Ames Bold Italic'`
32
32
  and `'Ames Regular'`. The player's default font stack falls back to Comic Neue
33
33
  when Ames is unavailable.
@@ -4,7 +4,7 @@
4
4
  * All families here are open-licensed (SIL OFL 1.1, from Google Fonts) and
5
5
  * ship with the @panelwave/player package — see LICENSES.md in this folder.
6
6
  *
7
- * The Ames Pro family (Blambot, commercial) is deliberately NOT included —
7
+ * The Ames Pro family (Purastik Graphics, commercial) is deliberately NOT included —
8
8
  * neither here nor in works exported from the PanelWave CMS. PanelWave's own
9
9
  * players (CMS preview, read.panelwave.org) load it under PanelWave's
10
10
  * license, which covers PanelWave's domains only. Self-hosting a work whose