@panelwave/player 1.0.1 → 1.1.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/README.md +31 -5
- package/fesm2022/panelwave-player.mjs +465 -139
- package/fesm2022/panelwave-player.mjs.map +1 -1
- package/index.d.ts +181 -22
- package/package.json +1 -1
- package/src/assets/i18n/de.json +26 -1
- package/src/assets/i18n/en.json +26 -1
package/index.d.ts
CHANGED
|
@@ -1603,6 +1603,31 @@ interface ExtraImage {
|
|
|
1603
1603
|
interface Paywall {
|
|
1604
1604
|
/** Array of paywall rules */
|
|
1605
1605
|
rules?: PaywallRule[];
|
|
1606
|
+
/**
|
|
1607
|
+
* Display info for the products / subscription tiers the rules reference by
|
|
1608
|
+
* id (format 1.6) — labels, descriptions and prices of the Buy / Subscribe
|
|
1609
|
+
* options (optional)
|
|
1610
|
+
*/
|
|
1611
|
+
products?: PaywallProduct[];
|
|
1612
|
+
}
|
|
1613
|
+
/**
|
|
1614
|
+
* One product or subscription tier from the host's catalogue (format 1.6).
|
|
1615
|
+
* Informational: the rules decide what unlocks what.
|
|
1616
|
+
*/
|
|
1617
|
+
interface PaywallProduct {
|
|
1618
|
+
/** Id referenced by requiredProductIds / requireEntitlement / subscriptionTiers */
|
|
1619
|
+
id: string;
|
|
1620
|
+
/** Localized product name (optional) */
|
|
1621
|
+
name?: LocalizedString;
|
|
1622
|
+
/** Localized product description (optional) */
|
|
1623
|
+
description?: LocalizedString;
|
|
1624
|
+
/** Display price (optional) */
|
|
1625
|
+
price?: {
|
|
1626
|
+
amount: number;
|
|
1627
|
+
currency: string;
|
|
1628
|
+
};
|
|
1629
|
+
/** One-time purchase or subscription tier (optional, informational) */
|
|
1630
|
+
type?: 'purchase' | 'subscription';
|
|
1606
1631
|
}
|
|
1607
1632
|
/**
|
|
1608
1633
|
* Paywall rule
|
|
@@ -1628,7 +1653,7 @@ interface PaywallRule {
|
|
|
1628
1653
|
entitlementType?: string;
|
|
1629
1654
|
/** Tiers that satisfy a subscription rule; empty/absent = any tier (optional) */
|
|
1630
1655
|
subscriptionTiers?: string[];
|
|
1631
|
-
/** Products that
|
|
1656
|
+
/** Products that unlock a purchase rule, any one suffices (format 1.6); absent = requireEntitlement key / any purchase (optional) */
|
|
1632
1657
|
requiredProductIds?: string[];
|
|
1633
1658
|
/** Embedded price for display in the paywall overlay (CMS) (optional) */
|
|
1634
1659
|
price?: {
|
|
@@ -2189,6 +2214,21 @@ interface PaywallGate {
|
|
|
2189
2214
|
reason: string;
|
|
2190
2215
|
/** Preview information (optional) */
|
|
2191
2216
|
preview?: PreviewInfo;
|
|
2217
|
+
/** Id of the manifest paywall rule that raised the gate (optional) */
|
|
2218
|
+
ruleId?: string;
|
|
2219
|
+
/**
|
|
2220
|
+
* Machine-readable lock reason (optional): `subscription_required`,
|
|
2221
|
+
* `purchase_required`, `age_verification_required` or
|
|
2222
|
+
* `entitlement_required`. The overlay translates it; `reason` stays the
|
|
2223
|
+
* English sentence for hosts.
|
|
2224
|
+
*/
|
|
2225
|
+
lockReason?: string;
|
|
2226
|
+
/**
|
|
2227
|
+
* What the reader can buy to pass the gate, derived from the rule
|
|
2228
|
+
* (product ids / subscription tiers, name, price). The built-in overlay
|
|
2229
|
+
* renders them as Buy / Subscribe buttons.
|
|
2230
|
+
*/
|
|
2231
|
+
options?: PurchaseInfo[];
|
|
2192
2232
|
}
|
|
2193
2233
|
/**
|
|
2194
2234
|
* Preview information for gated content
|
|
@@ -2209,8 +2249,8 @@ interface PurchaseInfo {
|
|
|
2209
2249
|
productId: string;
|
|
2210
2250
|
/** Product name */
|
|
2211
2251
|
name: string;
|
|
2212
|
-
/** Price with currency */
|
|
2213
|
-
price
|
|
2252
|
+
/** Price with currency (optional: not every rule carries one) */
|
|
2253
|
+
price?: {
|
|
2214
2254
|
amount: number;
|
|
2215
2255
|
currency: string;
|
|
2216
2256
|
};
|
|
@@ -4154,12 +4194,22 @@ declare class TrackingService {
|
|
|
4154
4194
|
* free preview.
|
|
4155
4195
|
* - Panel-scoped rules gate exactly their `targetPanelIds` — preview does NOT
|
|
4156
4196
|
* override an explicit panel gate.
|
|
4197
|
+
* - Chapter-scoped rules gate only the panels of their chapter(s) (`refId`);
|
|
4198
|
+
* their free preview counts panels WITHIN that chapter. They take
|
|
4199
|
+
* precedence over a work gate for those panels.
|
|
4200
|
+
* - Extras-scoped rules never gate panels — they gate the extras block named
|
|
4201
|
+
* by `refId` (see `isExtraLocked`).
|
|
4157
4202
|
* - A gated panel unlocks when the gating rule's requirement is satisfied by
|
|
4158
4203
|
* the reader's entitlement snapshot.
|
|
4159
4204
|
*/
|
|
4160
4205
|
|
|
4161
4206
|
type EvaluatorEntitlementType = 'free' | 'subscription' | 'purchase' | 'age_gate';
|
|
4162
|
-
|
|
4207
|
+
/**
|
|
4208
|
+
* `global` is NOT in the schema's scope enum (work | chapter | panel |
|
|
4209
|
+
* extras). It is still accepted as an alias of `work` so old manifests and
|
|
4210
|
+
* CMS-internal rules keep gating; nothing in the player emits it.
|
|
4211
|
+
*/
|
|
4212
|
+
type EvaluatorScope = 'global' | 'work' | 'chapter' | 'panel' | 'extras';
|
|
4163
4213
|
/** The rule shape the evaluator needs (a superset of the manifest rule). */
|
|
4164
4214
|
interface EvaluatorRule {
|
|
4165
4215
|
id: string;
|
|
@@ -4170,12 +4220,28 @@ interface EvaluatorRule {
|
|
|
4170
4220
|
subscriptionTiers?: string[];
|
|
4171
4221
|
/** Products that satisfy a purchase rule; empty/absent = any purchase. */
|
|
4172
4222
|
requiredProductIds?: string[];
|
|
4173
|
-
/**
|
|
4223
|
+
/**
|
|
4224
|
+
* Minimum age. For an `age_gate` rule it is the whole requirement (default
|
|
4225
|
+
* 18); on any other rule it is an extra check ON TOP OF the entitlement
|
|
4226
|
+
* (schema `ageGate`): the reader needs both.
|
|
4227
|
+
*/
|
|
4174
4228
|
minimumAge?: number;
|
|
4175
4229
|
/** Free-preview length for work/global rules (panels in reading order). */
|
|
4176
4230
|
previewPanelCount?: number;
|
|
4177
4231
|
/** Panels gated by a panel-scoped rule. */
|
|
4178
4232
|
targetPanelIds?: string[];
|
|
4233
|
+
/** Chapters (chapter scope) or extras blocks (extras scope) the rule gates — the manifest's `refId`. */
|
|
4234
|
+
targetIds?: string[];
|
|
4235
|
+
/** Reader-facing rule name and description (CMS), for purchase options. */
|
|
4236
|
+
name?: string;
|
|
4237
|
+
description?: string;
|
|
4238
|
+
/** Display price (CMS). */
|
|
4239
|
+
price?: {
|
|
4240
|
+
amount: number;
|
|
4241
|
+
currency: string;
|
|
4242
|
+
};
|
|
4243
|
+
/** The manifest's raw `requireEntitlement` key. */
|
|
4244
|
+
entitlementKey?: string;
|
|
4179
4245
|
}
|
|
4180
4246
|
/** What the reader "has" — the shape payments produce and the player consumes. */
|
|
4181
4247
|
interface EntitlementSnapshot {
|
|
@@ -4189,6 +4255,10 @@ interface EntitlementSnapshot {
|
|
|
4189
4255
|
interface PanelRef {
|
|
4190
4256
|
id: string;
|
|
4191
4257
|
index: number;
|
|
4258
|
+
/** Chapter the panel belongs to (enables chapter-scoped rules). */
|
|
4259
|
+
chapterId?: string;
|
|
4260
|
+
/** Reading-order index within its chapter (chapter-rule preview counting). */
|
|
4261
|
+
chapterIndex?: number;
|
|
4192
4262
|
}
|
|
4193
4263
|
type LockReason = 'subscription_required' | 'purchase_required' | 'age_verification_required' | null;
|
|
4194
4264
|
interface AccessDecision {
|
|
@@ -4201,7 +4271,10 @@ interface AccessDecision {
|
|
|
4201
4271
|
/** True when access exists only because the panel is inside the free preview. */
|
|
4202
4272
|
preview: boolean;
|
|
4203
4273
|
}
|
|
4204
|
-
/**
|
|
4274
|
+
/**
|
|
4275
|
+
* Does the reader's snapshot satisfy this rule's requirement? A rule with a
|
|
4276
|
+
* `minimumAge` needs the age AND its entitlement.
|
|
4277
|
+
*/
|
|
4205
4278
|
declare function satisfiesRule(rule: EvaluatorRule, entitlement: EntitlementSnapshot): boolean;
|
|
4206
4279
|
/** The active work/global rule (first one wins — mirrors the CMS content map). */
|
|
4207
4280
|
declare function findWorkGateRule(rules: EvaluatorRule[]): EvaluatorRule | null;
|
|
@@ -4209,6 +4282,8 @@ declare function findWorkGateRule(rules: EvaluatorRule[]): EvaluatorRule | null;
|
|
|
4209
4282
|
* Evaluate one panel against the rules for a given reader snapshot.
|
|
4210
4283
|
*/
|
|
4211
4284
|
declare function evaluatePanelAccess(rules: EvaluatorRule[], entitlement: EntitlementSnapshot, panel: PanelRef): AccessDecision;
|
|
4285
|
+
/** Is the extras block `extraId` locked by an extras-scoped rule? */
|
|
4286
|
+
declare function isExtraLocked(rules: EvaluatorRule[], entitlement: EntitlementSnapshot, extraId: string): boolean;
|
|
4212
4287
|
/** Evaluate a whole work (panels in reading order). */
|
|
4213
4288
|
declare function evaluateWorkAccess(rules: EvaluatorRule[], entitlement: EntitlementSnapshot, panels: PanelRef[]): AccessDecision[];
|
|
4214
4289
|
/** A snapshot with no entitlements — what an anonymous first-time reader has. */
|
|
@@ -4222,12 +4297,19 @@ declare const ANONYMOUS_READER: EntitlementSnapshot;
|
|
|
4222
4297
|
* `minimumAge` written by the CMS exporter. Prefer the CMS names and fall
|
|
4223
4298
|
* back to the originals, so a manifest from either era gates identically.
|
|
4224
4299
|
*
|
|
4225
|
-
*
|
|
4226
|
-
*
|
|
4300
|
+
* `ageGate` / `minimumAge` is an age check ON TOP OF the entitlement (schema
|
|
4301
|
+
* semantics). Only a rule that declares no entitlement at all but names an
|
|
4302
|
+
* age becomes a pure age gate; a custom marker plus an age stays a purchase
|
|
4303
|
+
* (or subscription) gate that also requires the age.
|
|
4227
4304
|
*/
|
|
4228
4305
|
declare function fromManifestRule(rule: PaywallRule, index: number): EvaluatorRule;
|
|
4229
4306
|
/** Normalise every rule in a manifest. Returns [] when the work has no paywall. */
|
|
4230
4307
|
declare function rulesFromManifest(manifest: PanelWaveManifest | null): EvaluatorRule[];
|
|
4308
|
+
/** Chapter id and within-chapter index per panel id (chapter-rule previews). */
|
|
4309
|
+
declare function chapterOrderFromManifest(manifest: PanelWaveManifest | null): Map<string, {
|
|
4310
|
+
chapterId: string;
|
|
4311
|
+
chapterIndex: number;
|
|
4312
|
+
}>;
|
|
4231
4313
|
/**
|
|
4232
4314
|
* Global reading order for preview counting: chapters in array order, and
|
|
4233
4315
|
* within a chapter the panel declaration order.
|
|
@@ -4262,11 +4344,15 @@ declare function toEntitlementStatus(decision: AccessDecision, entitlement: Enti
|
|
|
4262
4344
|
declare class PaywallService {
|
|
4263
4345
|
private rules;
|
|
4264
4346
|
private readingOrder;
|
|
4347
|
+
private chapterOrder;
|
|
4265
4348
|
private manifest;
|
|
4349
|
+
private products;
|
|
4266
4350
|
private snapshotSubject;
|
|
4267
4351
|
readonly snapshot$: Observable<EntitlementSnapshot>;
|
|
4268
4352
|
/** Load the rules and reading order from a manifest. Safe to call repeatedly. */
|
|
4269
4353
|
setManifest(manifest: PanelWaveManifest | null): void;
|
|
4354
|
+
/** `paywall.products` by id (format 1.6); the first entry wins on duplicate ids. */
|
|
4355
|
+
static productsFromManifest(manifest: PanelWaveManifest | null): Map<string, PaywallProduct>;
|
|
4270
4356
|
/** Replace what the reader owns (after sign-in, or a completed purchase). */
|
|
4271
4357
|
setSnapshot(snapshot: EntitlementSnapshot | null | undefined): void;
|
|
4272
4358
|
getSnapshot(): EntitlementSnapshot;
|
|
@@ -4282,16 +4368,34 @@ declare class PaywallService {
|
|
|
4282
4368
|
* must not be handed out as a free sample.
|
|
4283
4369
|
*/
|
|
4284
4370
|
evaluate(panelId: string): AccessDecision;
|
|
4371
|
+
/** Is this extras block locked by an extras-scoped rule the reader does not satisfy? */
|
|
4372
|
+
isExtraLocked(extraId: string): boolean;
|
|
4285
4373
|
/** Convenience: may the reader open this panel? */
|
|
4286
4374
|
canAccess(panelId: string): boolean;
|
|
4287
4375
|
/**
|
|
4288
4376
|
* Describe the gate blocking a panel, or null when it is not gated.
|
|
4289
4377
|
* The shape is the player's existing `PaywallGate`, so the overlay needs
|
|
4290
|
-
* no changes to render it.
|
|
4378
|
+
* no changes to render it. `locale` picks the language of product names
|
|
4379
|
+
* and descriptions from `paywall.products` (fallback: the work's default
|
|
4380
|
+
* locale).
|
|
4291
4381
|
*/
|
|
4292
|
-
gateFor(panelId: string): PaywallGate | null;
|
|
4382
|
+
gateFor(panelId: string, locale?: LocaleCode): PaywallGate | null;
|
|
4383
|
+
/**
|
|
4384
|
+
* What the reader can buy to pass a rule: one option per required product
|
|
4385
|
+
* (purchase) or per subscription tier (subscription). Without explicit
|
|
4386
|
+
* ids, the rule's `requireEntitlement` key names the product, else the
|
|
4387
|
+
* rule id. Age gates and free rules offer nothing to buy.
|
|
4388
|
+
*
|
|
4389
|
+
* Labels (format 1.6): an option whose id has an entry in
|
|
4390
|
+
* `paywall.products` takes that entry's localized name, description and
|
|
4391
|
+
* price. Otherwise it falls back to the rule's name (a single option) or
|
|
4392
|
+
* the bare id (several options), and to the rule's description and price.
|
|
4393
|
+
*/
|
|
4394
|
+
static purchaseOptions(rule: EvaluatorRule, products?: ReadonlyMap<string, PaywallProduct>, locale?: LocaleCode, fallbackLocale?: LocaleCode): PurchaseInfo[];
|
|
4293
4395
|
/** The rule that gates a panel, for callers that need its price or name. */
|
|
4294
4396
|
ruleFor(panelId: string): EvaluatorRule | null;
|
|
4397
|
+
/** The work's default locale (product-label fallback). */
|
|
4398
|
+
private get defaultLocale();
|
|
4295
4399
|
/** Reset to a manifest-less, entitlement-less state. */
|
|
4296
4400
|
clear(): void;
|
|
4297
4401
|
/**
|
|
@@ -5345,9 +5449,10 @@ declare class PaywallOverlayComponent {
|
|
|
5345
5449
|
*/
|
|
5346
5450
|
getMessage(): string;
|
|
5347
5451
|
/**
|
|
5348
|
-
* Handle purchase option selection
|
|
5452
|
+
* Handle purchase option selection: `purchase` carries the product id,
|
|
5453
|
+
* `action` is 'subscribe' for a subscription option, else 'purchase'.
|
|
5349
5454
|
*/
|
|
5350
|
-
onPurchaseOption(
|
|
5455
|
+
onPurchaseOption(option: PurchaseInfo): void;
|
|
5351
5456
|
/**
|
|
5352
5457
|
* Handle login action
|
|
5353
5458
|
*/
|
|
@@ -5444,6 +5549,8 @@ interface AgeVerificationResult {
|
|
|
5444
5549
|
* Modal overlay for age verification
|
|
5445
5550
|
*/
|
|
5446
5551
|
declare class AgeGateComponent {
|
|
5552
|
+
/** Optional: the gate is a public component and works (in English) without ngx-translate. */
|
|
5553
|
+
private readonly translate;
|
|
5447
5554
|
/**
|
|
5448
5555
|
* Visibility state
|
|
5449
5556
|
*/
|
|
@@ -5490,6 +5597,8 @@ declare class AgeGateComponent {
|
|
|
5490
5597
|
* Get warning message
|
|
5491
5598
|
*/
|
|
5492
5599
|
getWarningMessage(): string;
|
|
5600
|
+
/** Translate an `age_gate.*` UI string (English fallback). */
|
|
5601
|
+
t(key: string, params?: Record<string, unknown>): string;
|
|
5493
5602
|
/**
|
|
5494
5603
|
* Handle verification submit
|
|
5495
5604
|
*/
|
|
@@ -5506,8 +5615,9 @@ declare class AgeGateComponent {
|
|
|
5506
5615
|
* Calculate age from birth date
|
|
5507
5616
|
*/
|
|
5508
5617
|
private calculateAge;
|
|
5618
|
+
private monthCache?;
|
|
5509
5619
|
/**
|
|
5510
|
-
*
|
|
5620
|
+
* Month options, named in the current locale (Intl; cached per locale).
|
|
5511
5621
|
*/
|
|
5512
5622
|
getMonthOptions(): {
|
|
5513
5623
|
value: string;
|
|
@@ -5537,12 +5647,18 @@ declare class AgeGateComponent {
|
|
|
5537
5647
|
interface BranchChoice {
|
|
5538
5648
|
/** The graph edge this choice traverses. */
|
|
5539
5649
|
edge: Edge;
|
|
5540
|
-
/**
|
|
5650
|
+
/**
|
|
5651
|
+
* Reader-facing label (edge label → target panel title). Empty: the
|
|
5652
|
+
* chooser shows a translated "Option N".
|
|
5653
|
+
*/
|
|
5541
5654
|
label: string;
|
|
5542
5655
|
/** Position in the offered list (0-based), stable for tracking. */
|
|
5543
5656
|
index: number;
|
|
5544
5657
|
}
|
|
5545
5658
|
declare class BranchChooserComponent {
|
|
5659
|
+
private readonly translate;
|
|
5660
|
+
/** Translate a `branch_chooser.*` UI string (English fallback). */
|
|
5661
|
+
t(key: string, params?: Record<string, unknown>): string;
|
|
5546
5662
|
/** Visible state */
|
|
5547
5663
|
visible: boolean;
|
|
5548
5664
|
/** Current locale (labels are already resolved by the shell). */
|
|
@@ -5582,7 +5698,7 @@ interface EntitlementAdapter {
|
|
|
5582
5698
|
* Player Shell Component
|
|
5583
5699
|
* Main orchestrator for the PanelWave player
|
|
5584
5700
|
*/
|
|
5585
|
-
declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
5701
|
+
declare class PlayerShellComponent implements OnInit, OnChanges, OnDestroy {
|
|
5586
5702
|
/**
|
|
5587
5703
|
* Manifest to load
|
|
5588
5704
|
*/
|
|
@@ -5614,12 +5730,16 @@ declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
|
5614
5730
|
/** Bearer token identifying the reader to `entitlementEndpoint`. */
|
|
5615
5731
|
readerToken?: string;
|
|
5616
5732
|
/**
|
|
5617
|
-
* Emitted when a reader acts on the paywall overlay
|
|
5618
|
-
*
|
|
5733
|
+
* Emitted when a reader acts on the paywall overlay: `purchase` /
|
|
5734
|
+
* `subscribe` (with the chosen option's `productId` — a product id or a
|
|
5735
|
+
* subscription tier), `login` or `dismiss`. The host owns checkout — the
|
|
5736
|
+
* player never talks to a payment provider itself; call
|
|
5737
|
+
* `refreshEntitlements()` (or pass a new `entitlementSnapshot`) afterwards.
|
|
5619
5738
|
*/
|
|
5620
5739
|
paywallAction: EventEmitter<{
|
|
5621
5740
|
action: PaywallAction;
|
|
5622
5741
|
gate: PaywallGate;
|
|
5742
|
+
productId?: string;
|
|
5623
5743
|
}>;
|
|
5624
5744
|
/**
|
|
5625
5745
|
* Emitted after the reader answers an `age_gate` rule's overlay (verified or
|
|
@@ -5802,6 +5922,8 @@ declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
|
5802
5922
|
*/
|
|
5803
5923
|
paywallGate: PaywallGate | null;
|
|
5804
5924
|
paywallVisible: boolean;
|
|
5925
|
+
/** Product id / tier of the overlay option the reader just picked. */
|
|
5926
|
+
paywallProductId?: string;
|
|
5805
5927
|
/** Adapter built from `entitlementEndpoint`, when the host supplied one. */
|
|
5806
5928
|
private httpEntitlement?;
|
|
5807
5929
|
/**
|
|
@@ -5978,10 +6100,30 @@ declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
|
5978
6100
|
private readonly translationService;
|
|
5979
6101
|
private readonly canvasCamera;
|
|
5980
6102
|
private readonly paywallService;
|
|
6103
|
+
/** ngOnInit ran: later input changes are live updates, not initial values. */
|
|
6104
|
+
private initialized;
|
|
6105
|
+
/** The state subscriptions are set up once per instance, not per (re)load. */
|
|
6106
|
+
private stateSubscribed;
|
|
5981
6107
|
/**
|
|
5982
6108
|
* Initialize component
|
|
5983
6109
|
*/
|
|
5984
6110
|
ngOnInit(): void;
|
|
6111
|
+
/**
|
|
6112
|
+
* Inputs changed after init. The first round (before ngOnInit) is skipped:
|
|
6113
|
+
* ngOnInit reads every input itself, so nothing loads twice.
|
|
6114
|
+
*/
|
|
6115
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
6116
|
+
/**
|
|
6117
|
+
* Reload the work from the current `manifest` / `manifestUrl` inputs
|
|
6118
|
+
* (also the error screen's Retry). Story state of the previous load —
|
|
6119
|
+
* position, variables except persistent ones, open overlays, autoplay —
|
|
6120
|
+
* is reset; the analytics session of the previous work is closed.
|
|
6121
|
+
*/
|
|
6122
|
+
reload(): Promise<void>;
|
|
6123
|
+
/** Content locale + GUI language follow `locale`. */
|
|
6124
|
+
private applyLocale;
|
|
6125
|
+
/** Apply a changed `viewModeOverride` to the running view. */
|
|
6126
|
+
private applyViewModeOverride;
|
|
5985
6127
|
/**
|
|
5986
6128
|
* Cleanup on destroy
|
|
5987
6129
|
*/
|
|
@@ -6069,8 +6211,11 @@ declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
|
6069
6211
|
* @param transition - Optional transition to render for this panel change
|
|
6070
6212
|
* (already resolved against the outputPresets default). Omitted for
|
|
6071
6213
|
* non-adjacent jumps (TOC, initial load), which swap instantly.
|
|
6214
|
+
* @param mutations - Variable mutations of the traversed edge. Applied only
|
|
6215
|
+
* once the navigation is allowed (after the paywall / age gate), so a
|
|
6216
|
+
* blocked attempt never changes story state.
|
|
6072
6217
|
*/
|
|
6073
|
-
navigateToPanel(chapterId: string, panelId: string, transition?: Transition, cameraMove?: CameraMove): Promise<void>;
|
|
6218
|
+
navigateToPanel(chapterId: string, panelId: string, transition?: Transition, cameraMove?: CameraMove, mutations?: Mutation[]): Promise<void>;
|
|
6074
6219
|
/**
|
|
6075
6220
|
* Rebuild the flat variable context handed to the viewport/canvas for
|
|
6076
6221
|
* hotspot visibleIf evaluation. New object identity per call so OnPush
|
|
@@ -6176,6 +6321,8 @@ declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
|
6176
6321
|
* Toolbar event handlers
|
|
6177
6322
|
*/
|
|
6178
6323
|
onToggleView(): void;
|
|
6324
|
+
/** Land the canvas camera on the current panel (entering canvas view). */
|
|
6325
|
+
private jumpCameraToCurrentPanel;
|
|
6179
6326
|
/**
|
|
6180
6327
|
* Tap on a placed panel in canvas view. Traverses the matching out-edge of
|
|
6181
6328
|
* the current panel when its condition passes (the graph still gates
|
|
@@ -6184,6 +6331,12 @@ declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
|
6184
6331
|
* state.
|
|
6185
6332
|
*/
|
|
6186
6333
|
onCanvasPanelTap(panelId: string): void;
|
|
6334
|
+
/**
|
|
6335
|
+
* The manifest actually loaded — from `manifest` or fetched via
|
|
6336
|
+
* `manifestUrl`. Everything that lists the work (ToC, thumbnails) binds to
|
|
6337
|
+
* this, never to the `manifest` input, which is unset for URL loading.
|
|
6338
|
+
*/
|
|
6339
|
+
get loadedManifest(): PanelWaveManifest | undefined;
|
|
6187
6340
|
/** Balloon defaults for the canvas stage (same source as the viewport). */
|
|
6188
6341
|
get manifestBalloonConfig(): BalloonConfig | null;
|
|
6189
6342
|
/** Manifest characters for speech-bubble styling in canvas view. */
|
|
@@ -6452,9 +6605,15 @@ declare class PlayerShellComponent implements OnInit, OnDestroy {
|
|
|
6452
6605
|
private restoreSocialState;
|
|
6453
6606
|
/** `bookmarked` is true only while the reader is ON the bookmarked panel. */
|
|
6454
6607
|
private syncBookmarkFlag;
|
|
6455
|
-
/**
|
|
6608
|
+
/**
|
|
6609
|
+
* At least two paths out of the current panel are open right now (edge
|
|
6610
|
+
* conditions evaluated exactly like the chooser does) — the toolbar shows
|
|
6611
|
+
* "Choices". A closed conditional edge does not count.
|
|
6612
|
+
*/
|
|
6456
6613
|
get hasBranchesAhead(): boolean;
|
|
6457
|
-
/** Outgoing edges whose conditions pass right now
|
|
6614
|
+
/** Outgoing edges of the current panel whose conditions pass right now. */
|
|
6615
|
+
private openEdges;
|
|
6616
|
+
/** Open outgoing edges with reader-facing labels. */
|
|
6458
6617
|
private computeBranchChoices;
|
|
6459
6618
|
private branchLabel;
|
|
6460
6619
|
private localizedText;
|
|
@@ -7185,5 +7344,5 @@ declare class PlayerComponent {
|
|
|
7185
7344
|
static ɵcmp: i0.ɵɵComponentDeclaration<PlayerComponent, "pw-player", never, {}, {}, never, never, true, never>;
|
|
7186
7345
|
}
|
|
7187
7346
|
|
|
7188
|
-
export { ANONYMOUS_READER, ActionModalComponent, AgeGateComponent, AudioEngineService, BranchChooserComponent, CANVAS_PANEL_BUDGET, CanvasCameraService, CanvasStageComponent, ComicBalloon, DEFAULT_BALLOON_CONFIG, DEFAULT_STALL_TIMEOUT_MS, DEFAULT_VIDEO_MUTED, DEFAULT_VIDEO_PLAY_MODE, DEFAULT_VIDEO_START_MODE, EntitlementError, EntitlementService, ExportService, FlowEngineService, HotspotActionService, HotspotsOverlayComponent, HttpEntitlementAdapter, ImageCacheService, ManifestService, MockEntitlementAdapter, NullEntitlementAdapter, PANEL_AUDIO_LEAVE_FADE_MS, PanelAudioService, PaywallOverlayComponent, PaywallService, PlayerComponent, PlayerEvent, PlayerService, PlayerShellComponent, PlayerStateService, PluginHostService, PluginSandboxComponent, PreloadService, PwIconComponent, RESERVED_NAMESPACES, SpeechBubblesComponent, TrackingService, TranslationService, UserGestureService, VISIBILITY_THRESHOLD, VariableStoreService, VideoControllerService, VideoLayerComponent, VideoSequencerService, VisibilityService, applyVariantOverrides, balloonConfigToRenderOptions, balloonConfigToTailOptions, busForRole, createBalloon, evaluatePanelAccess, evaluateWorkAccess, findWorkGateRule, fromManifestRule, mergeBalloonConfig, readingOrderFromManifest, resolveMuted, resolvePanelVariant, resolvePanels, resolvePlayMode, resolveStartMode, resolveVideoConfig, rulesFromManifest, satisfiesRule, selectVariant, toEntitlementStatus };
|
|
7189
|
-
export type { AccessDecision, AgeVerificationResult, 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, Panel, PanelAudioRole, PanelAudioTrack, PanelChangeEvent, PanelPartial, PanelPlacement, PanelRef, PanelVariant, PanelWaveManifest, PanelwaveHeader, Paywall, PaywallAction, PaywallEvent, PaywallGate$1 as PaywallGate, PaywallRule, PlaybackState, PlayerError, PlayerErrorCode, PlayerEventData, PlayerOptions, PlayerPreferences, PlayerState, PlayerStatistics, PluginInstance$1 as PluginInstance, PluginLayer, PreferenceVariables, PreloadItem, PreloadPriority, PreloadSettings, PreloadStatus$1 as PreloadStatus, PreviewInfo, PurchaseInfo, ReadingProgress, ResolvedPanel, ResolvedPanelAudio, 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 };
|
|
7347
|
+
export { ANONYMOUS_READER, ActionModalComponent, AgeGateComponent, AudioEngineService, BranchChooserComponent, CANVAS_PANEL_BUDGET, CanvasCameraService, CanvasStageComponent, ComicBalloon, DEFAULT_BALLOON_CONFIG, DEFAULT_STALL_TIMEOUT_MS, DEFAULT_VIDEO_MUTED, DEFAULT_VIDEO_PLAY_MODE, DEFAULT_VIDEO_START_MODE, EntitlementError, EntitlementService, ExportService, FlowEngineService, HotspotActionService, HotspotsOverlayComponent, HttpEntitlementAdapter, ImageCacheService, ManifestService, MockEntitlementAdapter, NullEntitlementAdapter, PANEL_AUDIO_LEAVE_FADE_MS, PanelAudioService, PaywallOverlayComponent, PaywallService, PlayerComponent, PlayerEvent, PlayerService, PlayerShellComponent, PlayerStateService, PluginHostService, PluginSandboxComponent, PreloadService, PwIconComponent, RESERVED_NAMESPACES, SpeechBubblesComponent, TrackingService, TranslationService, UserGestureService, VISIBILITY_THRESHOLD, VariableStoreService, VideoControllerService, VideoLayerComponent, VideoSequencerService, VisibilityService, applyVariantOverrides, balloonConfigToRenderOptions, balloonConfigToTailOptions, busForRole, chapterOrderFromManifest, createBalloon, evaluatePanelAccess, evaluateWorkAccess, findWorkGateRule, fromManifestRule, isExtraLocked, mergeBalloonConfig, readingOrderFromManifest, resolveMuted, resolvePanelVariant, resolvePanels, resolvePlayMode, resolveStartMode, resolveVideoConfig, rulesFromManifest, satisfiesRule, selectVariant, toEntitlementStatus };
|
|
7348
|
+
export type { AccessDecision, AgeVerificationResult, 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, Panel, PanelAudioRole, PanelAudioTrack, PanelChangeEvent, PanelPartial, PanelPlacement, PanelRef, PanelVariant, PanelWaveManifest, PanelwaveHeader, Paywall, PaywallAction, PaywallEvent, PaywallGate$1 as PaywallGate, PaywallProduct, PaywallRule, PlaybackState, PlayerError, PlayerErrorCode, PlayerEventData, PlayerOptions, PlayerPreferences, PlayerState, PlayerStatistics, PluginInstance$1 as PluginInstance, PluginLayer, PreferenceVariables, PreloadItem, PreloadPriority, PreloadSettings, PreloadStatus$1 as PreloadStatus, PreviewInfo, PurchaseInfo, ReadingProgress, ResolvedPanel, ResolvedPanelAudio, 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 };
|
package/package.json
CHANGED
package/src/assets/i18n/de.json
CHANGED
|
@@ -180,7 +180,11 @@
|
|
|
180
180
|
"sign_in": "Anmelden, um fortzufahren",
|
|
181
181
|
"go_back": "Zurück",
|
|
182
182
|
"maybe_later": "Vielleicht später",
|
|
183
|
-
"secure_payment": "Sichere Zahlungsabwicklung"
|
|
183
|
+
"secure_payment": "Sichere Zahlungsabwicklung",
|
|
184
|
+
"reason_subscription_required": "Dieser Teil der Geschichte ist im Abo enthalten.",
|
|
185
|
+
"reason_purchase_required": "Dieser Teil der Geschichte ist käuflich erhältlich.",
|
|
186
|
+
"reason_age_verification_required": "Dieser Inhalt ist altersbeschränkt. Bestätige dein Alter, um fortzufahren.",
|
|
187
|
+
"reason_entitlement_required": "Für diesen Inhalt ist eine Berechtigung erforderlich."
|
|
184
188
|
},
|
|
185
189
|
"loading": {
|
|
186
190
|
"text": "PanelWave wird geladen..."
|
|
@@ -191,5 +195,26 @@
|
|
|
191
195
|
},
|
|
192
196
|
"common": {
|
|
193
197
|
"esc": "Esc"
|
|
198
|
+
},
|
|
199
|
+
"age_gate": {
|
|
200
|
+
"title": "Altersprüfung erforderlich",
|
|
201
|
+
"close": "Schließen",
|
|
202
|
+
"warning": "Dieser Inhalt ist nur für Personen ab {{age}} Jahren freigegeben.",
|
|
203
|
+
"prompt": "Bitte gib dein Geburtsdatum ein:",
|
|
204
|
+
"month": "Monat",
|
|
205
|
+
"day": "Tag",
|
|
206
|
+
"year": "Jahr",
|
|
207
|
+
"verify": "Alter bestätigen",
|
|
208
|
+
"privacy": "Deine Angaben sind privat und werden nicht gespeichert.",
|
|
209
|
+
"error_incomplete": "Bitte gib dein vollständiges Geburtsdatum ein.",
|
|
210
|
+
"error_month": "Bitte gib einen gültigen Monat ein (1-12).",
|
|
211
|
+
"error_day": "Bitte gib einen gültigen Tag ein (1-{{max}}).",
|
|
212
|
+
"error_year": "Bitte gib ein gültiges Jahr ein (1900-{{max}}).",
|
|
213
|
+
"error_too_young": "Du musst mindestens {{age}} Jahre alt sein, um diesen Inhalt zu sehen."
|
|
214
|
+
},
|
|
215
|
+
"branch_chooser": {
|
|
216
|
+
"title": "Wähle deinen Weg",
|
|
217
|
+
"close": "Schließen",
|
|
218
|
+
"option": "Option {{n}}"
|
|
194
219
|
}
|
|
195
220
|
}
|
package/src/assets/i18n/en.json
CHANGED
|
@@ -180,7 +180,11 @@
|
|
|
180
180
|
"sign_in": "Sign In to Continue",
|
|
181
181
|
"go_back": "Go Back",
|
|
182
182
|
"maybe_later": "Maybe Later",
|
|
183
|
-
"secure_payment": "Secure payment processing"
|
|
183
|
+
"secure_payment": "Secure payment processing",
|
|
184
|
+
"reason_subscription_required": "This part of the story is included with a subscription.",
|
|
185
|
+
"reason_purchase_required": "This part of the story is available to buy.",
|
|
186
|
+
"reason_age_verification_required": "This content is age-restricted. Confirm your age to continue.",
|
|
187
|
+
"reason_entitlement_required": "This content requires an entitlement to access."
|
|
184
188
|
},
|
|
185
189
|
"loading": {
|
|
186
190
|
"text": "Loading PanelWave..."
|
|
@@ -191,5 +195,26 @@
|
|
|
191
195
|
},
|
|
192
196
|
"common": {
|
|
193
197
|
"esc": "Esc"
|
|
198
|
+
},
|
|
199
|
+
"age_gate": {
|
|
200
|
+
"title": "Age Verification Required",
|
|
201
|
+
"close": "Close",
|
|
202
|
+
"warning": "This content is restricted to users {{age}} years of age or older.",
|
|
203
|
+
"prompt": "Please enter your birth date:",
|
|
204
|
+
"month": "Month",
|
|
205
|
+
"day": "Day",
|
|
206
|
+
"year": "Year",
|
|
207
|
+
"verify": "Verify Age",
|
|
208
|
+
"privacy": "Your information is private and will not be stored.",
|
|
209
|
+
"error_incomplete": "Please enter your complete birth date.",
|
|
210
|
+
"error_month": "Please enter a valid month (1-12).",
|
|
211
|
+
"error_day": "Please enter a valid day (1-{{max}}).",
|
|
212
|
+
"error_year": "Please enter a valid year (1900-{{max}}).",
|
|
213
|
+
"error_too_young": "You must be at least {{age}} years old to access this content."
|
|
214
|
+
},
|
|
215
|
+
"branch_chooser": {
|
|
216
|
+
"title": "Choose your path",
|
|
217
|
+
"close": "Close",
|
|
218
|
+
"option": "Option {{n}}"
|
|
194
219
|
}
|
|
195
220
|
}
|