@media-quest/engine 0.0.40 → 0.0.41

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.
@@ -180,6 +180,8 @@ declare namespace DCss {
180
180
  readonly value: number;
181
181
  }
182
182
  type LengthString = `${number}px` | `${number}%`;
183
+ const isPx: (unit?: LengthUnit | false | undefined | null) => unit is Px;
184
+ const isPercent: (unit?: LengthUnit | false | undefined | null) => unit is Percent;
183
185
  interface Percent {
184
186
  readonly _unit: "percent";
185
187
  readonly value: number;
@@ -247,6 +249,7 @@ interface DStyle {
247
249
  declare namespace DStyle {
248
250
  const normalize: <T extends HTMLElement>(el: T) => T;
249
251
  const applyStyles: <T extends HTMLElement>(el: T, style: Partial<DStyle>, scale: number) => T;
252
+ const clone: <T extends Partial<DStyle>>(style: T) => T;
250
253
  }
251
254
 
252
255
  declare class ScaleService {
@@ -370,6 +373,7 @@ declare abstract class DElement<T extends HTMLElement> {
370
373
  updateState(state: TaskStateDiff): void;
371
374
  setState(state: TaskState): void;
372
375
  private handleStateChanges;
376
+ getComputedStyle(): CSSStyleDeclaration;
373
377
  abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;
374
378
  protected updateStyles(style: Partial<DStyle>): void;
375
379
  }
@@ -503,6 +507,7 @@ declare class SchemaEngine implements ISchemaEngine {
503
507
  message: string;
504
508
  }) => void): void;
505
509
  setLogger(logger: EngineLogger): void;
510
+ getComputedStylesOfCurrentPage(): false | CSSStyleDeclaration[];
506
511
  }
507
512
 
508
513
  interface SolveResult<S, F> {
@@ -100,9 +100,6 @@ var DUtil;
100
100
  if (typeof obj !== "object") {
101
101
  return false;
102
102
  }
103
- if (obj === null) {
104
- return false;
105
- }
106
103
  return true;
107
104
  };
108
105
  DUtil2.isBool = (obj) => typeof obj === "boolean";
@@ -558,6 +555,20 @@ var Scale;
558
555
  // src/Delement/css.ts
559
556
  var DCss;
560
557
  ((DCss2) => {
558
+ DCss2.isPx = (unit) => {
559
+ if (typeof unit === "number")
560
+ return false;
561
+ if (!unit)
562
+ return false;
563
+ return unit._unit === "px";
564
+ };
565
+ DCss2.isPercent = (unit) => {
566
+ if (typeof unit === "number")
567
+ return false;
568
+ if (!unit)
569
+ return false;
570
+ return unit._unit === "percent";
571
+ };
561
572
  DCss2.toString = (unit, scale) => {
562
573
  const _mapped = typeof unit === "number" ? { _unit: "percent", value: unit } : unit;
563
574
  return _toString(_mapped, scale);
@@ -607,6 +618,7 @@ var DStyle;
607
618
  s.right = "";
608
619
  s.flex = "none";
609
620
  s.boxShadow = "";
621
+ s.fontFamily = "'Inter', sans-serif";
610
622
  s.fontSize = "12px";
611
623
  s.lineHeight = "1";
612
624
  s.textAlign = "center";
@@ -820,6 +832,9 @@ var DStyle;
820
832
  }
821
833
  return el;
822
834
  };
835
+ DStyle2.clone = (style) => {
836
+ return JSON.parse(JSON.stringify(style));
837
+ };
823
838
  })(DStyle || (DStyle = {}));
824
839
 
825
840
  // src/common/DTimestamp.ts
@@ -990,6 +1005,17 @@ var DElement = class {
990
1005
  this.setStyle(whenVideoEndedAndMuted);
991
1006
  }
992
1007
  }
1008
+ // private normalize() {
1009
+ // this.el.style.padding = "0";
1010
+ // this.el.style.margin = "0";
1011
+ // this.el.style.position = "absolute";
1012
+ // this.el.style.boxSizing = "border-box";
1013
+ // }
1014
+ getComputedStyle() {
1015
+ const el = this.el;
1016
+ const isConnected = this.el.isConnected;
1017
+ return window.getComputedStyle(this.el);
1018
+ }
993
1019
  updateStyles(style) {
994
1020
  this.currStyle = Object.assign(this.currStyle, style);
995
1021
  DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);
@@ -1334,6 +1360,11 @@ var Page = class {
1334
1360
  element.updateState(diff);
1335
1361
  });
1336
1362
  }
1363
+ getComputedStyles() {
1364
+ return this.elements.map((e) => {
1365
+ return e.getComputedStyle();
1366
+ });
1367
+ }
1337
1368
  };
1338
1369
 
1339
1370
  // src/page/task.ts
@@ -1717,6 +1748,9 @@ var SchemaEngine = class {
1717
1748
  setLogger(logger) {
1718
1749
  this.logger = logger;
1719
1750
  }
1751
+ getComputedStylesOfCurrentPage() {
1752
+ return this.currentPage ? this.currentPage.getComputedStyles() : false;
1753
+ }
1720
1754
  };
1721
1755
  // Annotate the CommonJS export names for ESM import in node:
1722
1756
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\r\nexport * from \"./engine/SchemaEngine\";\r\nexport * from \"./engine/SchemaDto\";\r\nexport * from \"./engine/page-que-ruleengine-action\";\r\nexport * from \"./rules/rule\";\r\nexport * from \"./rules/fact\";\r\nexport * from \"./rules/rule-engine\";\r\nexport * from \"./rules/condition\";\r\nexport * from \"./utils/DUtil\";\r\n// export * from \"./utils/ID\";\r\n\r\nexport * from \"./events/mq-events\";\r\n\r\n// ELEMENTS\r\nexport * from \"./Delement/css\";\r\nexport * from \"./Delement/DStyle\";\r\nexport * from \"./Delement/DImg\";\r\nexport * from \"./Delement/DText\";\r\nexport * from \"./Delement/DButton\";\r\nexport * from \"./Delement/Ddiv\";\r\nexport * from \"./Delement/button-click-action\";\r\nexport * from \"./Delement/DElement\";\r\nexport * from \"./Delement/DElement.dto\";\r\nexport { PageDto } from \"./page/Page\";\r\nexport * from \"./page/task\";\r\n","import { Fact } from \"../rules/fact\";\r\nimport { PageResult } from \"../page/page-result\";\r\n\r\nexport class HistoryQue {\r\n private history: PageResult[] = [];\r\n\r\n getFacts(): Array<Fact> {\r\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\r\n // const facts = answers.map((a) => a.fact);\r\n // TODO FIND LATEST FACT (answer) if have multiple.\r\n return answers;\r\n }\r\n\r\n addToHistory(result: PageResult) {\r\n this.history.push(result);\r\n }\r\n}\r\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (obj === null) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\r\n\r\nexport class NextQue {\r\n private originalOrder: ReadonlyArray<string> = [];\r\n private allPages: PageDto[] = [];\r\n private excludedTags = new Set<string>();\r\n private excludedByPageId = new Set<string>();\r\n private remaining: PageDto[] = [];\r\n constructor(pages: PageDto[] = []) {\r\n this.resetQue(pages);\r\n }\r\n\r\n /**\r\n * Will reset que with the new pages.\r\n * @param pages\r\n */\r\n resetQue(pages: PageDto[]) {\r\n this.allPages = [...pages];\r\n this.remaining = [...pages];\r\n this.excludedTags = new Set();\r\n this.excludedByPageId = new Set();\r\n this.originalOrder = this.allPages.map((p) => p.id);\r\n }\r\n\r\n pop(): PageDto | false {\r\n const next = this.remaining.shift();\r\n // TODO CLONE??\r\n return next ?? false;\r\n }\r\n\r\n peek(): PageDto | false {\r\n const next = this.remaining[0];\r\n return next ?? false;\r\n }\r\n\r\n jumpToPageById(pageId: string): boolean {\r\n const index = this.remaining.findIndex((p) => p.id === pageId);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.remaining = this.remaining.slice(index);\r\n return true;\r\n }\r\n\r\n removeByTag(tag: string | string[]) {\r\n if (Array.isArray(tag)) {\r\n tag.forEach((tag) => {\r\n this.excludedTags.add(tag);\r\n });\r\n } else {\r\n this.excludedTags.add(tag);\r\n }\r\n this.filterRemaining();\r\n }\r\n\r\n /**\r\n * Will not be included\r\n * @param pages\r\n */\r\n insertAsNextByForce(pages: PageDto[]) {\r\n this.remaining.unshift(...pages);\r\n }\r\n\r\n removeByPageId(pageId: string | string[]) {\r\n if (Array.isArray(pageId)) {\r\n pageId.forEach((id) => {\r\n this.excludedByPageId.add(id);\r\n });\r\n } else {\r\n this.excludedByPageId.add(pageId);\r\n }\r\n this.filterRemaining();\r\n // this.excludedByPageId.add(pageId);\r\n }\r\n\r\n private filterRemaining() {\r\n this.remaining = this.remaining.filter((p) => {\r\n const tags = p.tags ?? [];\r\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\r\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\r\n return isIncludedByPageId && isIncluededByTag;\r\n });\r\n }\r\n get isEmpty(): boolean {\r\n return this.remaining.length === 0;\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get size(): number {\r\n return this.remaining.length;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get pageCount(): number {\r\n return this.originalOrder.length;\r\n }\r\n}\r\n","import { HistoryQue } from \"./history-que\";\r\nimport { RuleEngine } from \"../rules/rule-engine\";\r\nimport { NextQue } from \"./next-que\";\r\nimport { SchemaDto } from \"./SchemaDto\";\r\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\r\nimport { PageDto } from \"../page/Page\";\r\nimport { PageResult } from \"../page/page-result\";\r\nimport { Fact } from \"../rules/fact\";\r\nimport { MqEvent } from \"../events/mq-events\";\r\n\r\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\r\nexport class DPlayer {\r\n private readonly eventLog: Array<MqEvent> = [];\r\n private history = new HistoryQue();\r\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\r\n private nextQue = new NextQue();\r\n private data: DPlayerData;\r\n private readonly predefinedFacts: ReadonlyArray<Fact>;\r\n\r\n constructor(data: DPlayerData) {\r\n this.data = data;\r\n const pages = data.pages ?? [];\r\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\r\n this.nextQue.resetQue(pages);\r\n }\r\n\r\n saveEvent(event: MqEvent) {\r\n this.eventLog.push(event);\r\n }\r\n\r\n saveHistory(pageHistory: PageResult) {\r\n // console.log(\"SAVE HISTORY\", pageHistory);\r\n this.history.addToHistory(pageHistory);\r\n this.eventLog.push(...pageHistory.eventLog);\r\n // Evaluate rules\r\n const userGeneratedFact = this.history.getFacts();\r\n const predefinedFacts = this.predefinedFacts;\r\n const facts = [...userGeneratedFact, ...predefinedFacts];\r\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\r\n\r\n const matchingRules = result.matching;\r\n const actions = matchingRules.map((r) => r.actionList).flat(1);\r\n // Execute actions\r\n actions.forEach((a) => {\r\n // console.log(a.payload);\r\n switch (a.kind) {\r\n case \"jumpToPage\":\r\n this.nextQue.jumpToPageById(a.pageId);\r\n break;\r\n case \"excludeByPageId\":\r\n this.nextQue.removeByPageId(a.pageIds);\r\n break;\r\n case \"excludeByTag\":\r\n this.nextQue.removeByTag(a.tagIds);\r\n break;\r\n default:\r\n console.log(\"UNKNOWN ACTION\", a);\r\n const check: never = a;\r\n }\r\n });\r\n }\r\n\r\n getResults() {\r\n const pagesLeft = this.nextQue.size;\r\n const answerFacts = this.history.getFacts();\r\n const predefinedFacts = this.predefinedFacts;\r\n const eventLog = [...this.eventLog];\r\n // console.log(answerFacts);\r\n return { answerFacts, predefinedFacts, eventLog, pagesLeft };\r\n }\r\n\r\n insertSequence(sequenceId: string) {\r\n this.insertSequenceById(sequenceId);\r\n }\r\n\r\n getNextPage(): PageDto | false {\r\n const next = this.nextQue.pop();\r\n return next ?? false;\r\n }\r\n\r\n private insertSequenceById(id: string) {\r\n const seq = this.data.pageSequences?.find((s) => s.id === id);\r\n if (seq) {\r\n this.nextQue.insertAsNextByForce([...seq.pages]);\r\n } else {\r\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\r\n // LOG INVALID COMMAND.\r\n }\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get pagesLeft(): number {\r\n return this.nextQue.pageCount;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get totalPageCount(): number {\r\n return this.data.pages.length;\r\n }\r\n}\r\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\r\n\r\nexport namespace DCss {\r\n export interface Px {\r\n readonly _unit: \"px\";\r\n readonly value: number;\r\n }\r\n\r\n export type LengthString = `${number}px` | `${number}%`;\r\n export interface Percent {\r\n readonly _unit: \"percent\";\r\n readonly value: number;\r\n }\r\n\r\n export type LengthUnit = Px | Percent | number;\r\n\r\n /**\r\n * Will scale to 3% of baseScale\r\n * @param unit\r\n * @param scale\r\n */\r\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\r\n const _mapped: Percent | Px =\r\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\r\n return _toString(_mapped, scale);\r\n };\r\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\r\n const clampedScale = Math.max(scale, 0.03);\r\n if (unit._unit === \"px\") {\r\n if (unit.value < 0.1) {\r\n return \"0px\";\r\n }\r\n\r\n const rounded = Math.round(unit.value * clampedScale);\r\n const clamped = Math.max(rounded, 1);\r\n return (clamped + \"px\") as LengthString;\r\n }\r\n return (unit.value + \"%\") as LengthString;\r\n };\r\n\r\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\r\n if (typeof unit === \"number\") {\r\n return true;\r\n }\r\n\r\n if (!unit) {\r\n return false;\r\n }\r\n\r\n const unitKey: keyof DCss.Px = \"_unit\";\r\n const valueKey: keyof DCss.Px = \"value\";\r\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\r\n const hasValueKey = DUtil.hasKey(unit, valueKey);\r\n return hasUnitKey && hasValueKey;\r\n };\r\n}\r\n","import { DCss } from \"./css\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport type PStyle = Partial<DStyle>;\r\nexport interface DStyle {\r\n opacity: number;\r\n backgroundColor: string;\r\n visibility: \"visible\" | \"hidden\";\r\n cursor:\r\n | \"pointer\"\r\n | \"help\"\r\n | \"copy\"\r\n | \"wait\"\r\n | \"not-allowed\"\r\n | \"context-menu\"\r\n | \"move\"\r\n | \"grabbing\"\r\n | \"grab\"\r\n | \"zoom-in\"\r\n | \"zoom-out\"\r\n | \"none\"\r\n | \"auto\"\r\n | \"default\";\r\n\r\n zIndex: number;\r\n // POSITION\r\n h: number;\r\n w: number;\r\n x: number;\r\n y: number;\r\n height: DCss.LengthUnit;\r\n maxHeight: DCss.LengthUnit;\r\n minHeight: DCss.LengthUnit;\r\n width: DCss.LengthUnit;\r\n maxWidth: DCss.LengthUnit;\r\n minWidth: DCss.LengthUnit;\r\n bottom: DCss.LengthUnit;\r\n top: DCss.LengthUnit;\r\n left: DCss.LengthUnit;\r\n right: DCss.LengthUnit;\r\n boxShadow: string;\r\n\r\n // BORDERS\r\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\r\n borderRadius: DCss.Px | DCss.Percent;\r\n borderWidth: DCss.Px;\r\n borderColor: string;\r\n\r\n margin: DCss.Px | DCss.Percent;\r\n padding: DCss.Px | DCss.Percent;\r\n paddingLeft: DCss.Px | DCss.Percent;\r\n paddingRight: DCss.Px | DCss.Percent;\r\n paddingTop: DCss.Px | DCss.Percent;\r\n paddingBottom: DCss.Px | DCss.Percent;\r\n\r\n // Translate\r\n transform: string;\r\n translate: string;\r\n\r\n // TEXT\r\n fontSize: DCss.Px;\r\n textColor: string;\r\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\r\n textAlign: \"right\" | \"left\" | \"center\";\r\n letterSpacing: DCss.Px;\r\n lineHeight: number;\r\n\r\n // LAYOUT & POSITIONING OVERRIDE\r\n position: \"absolute\" | \"relative\";\r\n flex: string;\r\n display: \"flex\" | \"block\";\r\n flexDirection: \"row\" | \"colum\";\r\n flexWrap: \"nowrap\" | \"wrap\";\r\n justifyContent:\r\n | \"flex-start\"\r\n | \"flex-end\"\r\n | \"center\"\r\n | \"space-around\"\r\n | \"space-evenly\"\r\n | \"space-between\";\r\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\r\n gap: DCss.Px;\r\n alignContent:\r\n | \"stretch\"\r\n | \"center\"\r\n | \"flex-start\"\r\n | \"flex-end\"\r\n | \"space-around\"\r\n | \"space-evenly\"\r\n | \"space-between\";\r\n}\r\n\r\nexport namespace DStyle {\r\n // import isNumber = DUtil.isNumber;\r\n import isLengthUnit = DCss.isLengthUnit;\r\n export const normalize = <T extends HTMLElement>(el: T): T => {\r\n const s = el.style;\r\n s.position = \"absolute\";\r\n s.boxSizing = \"border-box\";\r\n s.padding = \"0px\";\r\n s.margin = \"0px\";\r\n\r\n s.height = \"\";\r\n s.width = \"fit-content\";\r\n\r\n s.bottom = \"\";\r\n s.top = \"\";\r\n s.left = \"\";\r\n s.right = \"\";\r\n s.flex = \"none\";\r\n\r\n s.boxShadow = \"\";\r\n s.fontSize = \"12px\";\r\n s.lineHeight = \"1\";\r\n s.textAlign = \"center\";\r\n s.textDecoration = \"none\";\r\n s.boxShadow = \"\";\r\n s.boxSizing = \"border-box\";\r\n s.fontWeight = \"500\";\r\n s.borderStyle = \"\";\r\n s.borderRadius = \"\";\r\n s.borderWidth = \"\";\r\n s.borderWidth = \"0px\";\r\n s.borderColor = \"black\";\r\n s.backgroundColor = \"\";\r\n s.border = \"\";\r\n s.borderStyle = \"none\";\r\n s.outline = \"\";\r\n s.wordSpacing = \"\";\r\n s.userSelect = \"none\";\r\n s.textShadow = \"\";\r\n return el;\r\n };\r\n\r\n export const applyStyles = <T extends HTMLElement>(\r\n el: T,\r\n style: Partial<DStyle>,\r\n scale: number,\r\n ): T => {\r\n const { isNumber, isString } = DUtil;\r\n // const scalePx = DCss.toStringCre(this.scale);\r\n const {\r\n x,\r\n y,\r\n left,\r\n right,\r\n top,\r\n bottom,\r\n backgroundColor,\r\n borderColor,\r\n borderWidth,\r\n borderRadius,\r\n borderStyle,\r\n w,\r\n opacity,\r\n cursor,\r\n fontSize,\r\n fontWeight,\r\n lineHeight,\r\n textColor,\r\n textAlign,\r\n translate,\r\n flex,\r\n margin,\r\n padding,\r\n letterSpacing,\r\n h,\r\n height,\r\n width,\r\n transform,\r\n visibility,\r\n justifyContent,\r\n alignContent,\r\n flexWrap,\r\n display,\r\n flexDirection,\r\n alignItems,\r\n position,\r\n paddingLeft,\r\n paddingTop,\r\n paddingRight,\r\n paddingBottom,\r\n gap,\r\n\r\n zIndex,\r\n //\r\n boxShadow,\r\n minWidth,\r\n maxWidth,\r\n minHeight,\r\n maxHeight,\r\n } = style;\r\n\r\n if (isNumber(zIndex)) {\r\n el.style.zIndex = \"\" + zIndex;\r\n }\r\n if (isString(flex)) {\r\n el.style.flex = flex;\r\n }\r\n\r\n if (DCss.isLengthUnit(minWidth)) {\r\n el.style.minWidth = DCss.toString(minWidth, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(maxWidth)) {\r\n el.style.maxWidth = DCss.toString(maxWidth, scale);\r\n }\r\n\r\n if (typeof lineHeight === \"number\") {\r\n el.style.lineHeight = \"\" + lineHeight;\r\n }\r\n\r\n if (DCss.isLengthUnit(minHeight)) {\r\n el.style.minHeight = DCss.toString(minHeight, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(maxHeight)) {\r\n el.style.maxHeight = DCss.toString(maxHeight, scale);\r\n }\r\n\r\n if (boxShadow) {\r\n el.style.boxShadow = boxShadow;\r\n }\r\n\r\n if (gap) {\r\n el.style.gap = DCss.toString(gap, scale);\r\n }\r\n\r\n if (paddingLeft) {\r\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\r\n }\r\n\r\n if (paddingRight) {\r\n el.style.paddingRight = DCss.toString(paddingRight, scale);\r\n }\r\n\r\n if (paddingTop) {\r\n el.style.paddingTop = DCss.toString(paddingTop, scale);\r\n }\r\n\r\n if (paddingBottom) {\r\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\r\n }\r\n\r\n if (position) {\r\n el.style.position = position;\r\n }\r\n if (justifyContent) {\r\n el.style.justifyContent = justifyContent;\r\n }\r\n\r\n if (alignContent) {\r\n el.style.alignContent = alignContent;\r\n }\r\n if (flexWrap) {\r\n el.style.flexWrap = flexWrap;\r\n }\r\n if (display) {\r\n el.style.display = display;\r\n }\r\n if (flexDirection) {\r\n el.style.flexDirection = flexDirection;\r\n }\r\n if (alignItems) {\r\n el.style.alignItems = alignItems;\r\n }\r\n\r\n // this.el.style.fontWeight = '900';\r\n if (backgroundColor) {\r\n el.style.backgroundColor = backgroundColor;\r\n }\r\n\r\n if (cursor) {\r\n el.style.cursor = cursor;\r\n }\r\n\r\n if (transform) {\r\n el.style.transform = transform;\r\n }\r\n\r\n if (textColor) {\r\n el.style.color = textColor;\r\n }\r\n if (textAlign) {\r\n el.style.textAlign = textAlign;\r\n }\r\n\r\n if (borderColor) {\r\n el.style.borderColor = borderColor;\r\n }\r\n\r\n if (borderWidth) {\r\n el.style.borderWidth = DCss.toString(borderWidth, scale);\r\n }\r\n\r\n if (fontWeight) {\r\n el.style.fontWeight = fontWeight + \"\";\r\n }\r\n\r\n if (borderStyle) {\r\n el.style.borderStyle = borderStyle;\r\n }\r\n\r\n if (fontSize) {\r\n el.style.fontSize = DCss.toString(fontSize, scale);\r\n }\r\n\r\n if (DUtil.isNumber(x)) {\r\n el.style.left = x + \"%\";\r\n }\r\n\r\n if (DUtil.isNumber(y)) {\r\n el.style.bottom = y + \"%\";\r\n }\r\n\r\n if (DCss.isLengthUnit(height)) {\r\n el.style.height = DCss.toString(height, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(width)) {\r\n el.style.width = DCss.toString(width, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(left)) {\r\n el.style.left = DCss.toString(left, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(right)) {\r\n el.style.right = DCss.toString(right, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(bottom)) {\r\n el.style.bottom = DCss.toString(bottom, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(top)) {\r\n el.style.top = DCss.toString(top, scale);\r\n }\r\n\r\n if (DUtil.isNumber(h)) {\r\n el.style.height = DCss.toString(h, scale);\r\n }\r\n\r\n if (isNumber(w)) {\r\n el.style.width = DCss.toString(w, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(borderRadius)) {\r\n el.style.borderRadius = DCss.toString(borderRadius, scale);\r\n }\r\n\r\n if (letterSpacing) {\r\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\r\n }\r\n\r\n if (margin) {\r\n el.style.margin = DCss.toString(margin, scale);\r\n }\r\n\r\n if (padding) {\r\n el.style.padding = DCss.toString(padding, scale);\r\n }\r\n\r\n if (isNumber(opacity)) {\r\n el.style.opacity = opacity + \"\";\r\n }\r\n\r\n if (visibility) {\r\n el.style.visibility = visibility;\r\n }\r\n return el;\r\n };\r\n\r\n // const propNames = new Set(...ElementKeyNames);\r\n // export const validKey = (keyName: string) => propNames.has(keyName);\r\n}\r\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\r\nimport diff = DTimestamp.diff;\r\n\r\nexport type TaskState = {\r\n audioIsPlaying: boolean;\r\n isGifMode: boolean;\r\n videoPlayState:\r\n | \"playing\"\r\n | \"paused\"\r\n | \"ended\"\r\n | \"playing-and-muted\"\r\n | \"paused-and-muted\"\r\n | \"ended-and-muted\";\r\n blockFormInput: boolean;\r\n blockResponseButton: boolean;\r\n blockAudio: boolean;\r\n blockVideo: boolean;\r\n};\r\n\r\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\r\nexport const TaskState = {\r\n eq: (a: TaskState, b: TaskState) => {\r\n return (\r\n a.audioIsPlaying === b.audioIsPlaying &&\r\n a.isGifMode === b.isGifMode &&\r\n a.videoPlayState === b.videoPlayState &&\r\n a.blockFormInput === b.blockFormInput &&\r\n a.blockResponseButton === b.blockResponseButton &&\r\n a.blockAudio === b.blockAudio &&\r\n a.blockVideo === b.blockVideo\r\n );\r\n },\r\n\r\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\r\n if (prev === false) {\r\n return curr as TaskStateDiff;\r\n }\r\n\r\n const diff = {} as TaskStateDiff;\r\n\r\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\r\n diff.audioIsPlaying = curr.audioIsPlaying;\r\n }\r\n if (curr.isGifMode !== prev.isGifMode) {\r\n diff.isGifMode = curr.isGifMode;\r\n }\r\n if (curr.videoPlayState !== prev.videoPlayState) {\r\n diff.videoPlayState = curr.videoPlayState;\r\n }\r\n\r\n if (curr.blockFormInput !== prev.blockFormInput) {\r\n diff.blockFormInput = curr.blockFormInput;\r\n }\r\n if (curr.blockResponseButton !== prev.blockResponseButton) {\r\n diff.blockResponseButton = curr.blockResponseButton;\r\n }\r\n if (curr.blockAudio !== prev.blockAudio) {\r\n diff.blockAudio = curr.blockAudio;\r\n }\r\n if (curr.blockVideo !== prev.blockVideo) {\r\n diff.blockVideo = curr.blockVideo;\r\n }\r\n return diff;\r\n },\r\n};\r\n","import { DStyle, PStyle } from \"./DStyle\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\r\n\r\nexport interface DElementBaseDto {\r\n readonly style: PStyle;\r\n readonly onMouseEnter?: PStyle;\r\n readonly onMouseLeave?: PStyle;\r\n readonly onMouseDown?: PStyle;\r\n readonly onMouseUp?: PStyle;\r\n readonly innerText?: string;\r\n\r\n // ACTIONS HANDLERS\r\n readonly onClick?: ButtonClickAction;\r\n\r\n // VIDEO STATED\r\n readonly whenVideoPaused?: PStyle;\r\n readonly whenVideoPausedAndMuted?: PStyle;\r\n readonly whenVideoEnded?: PStyle;\r\n readonly whenVideoEndedAndMuted?: PStyle;\r\n readonly whenVideoPlaying?: PStyle;\r\n readonly whenVideoPlayingAndMuted?: PStyle;\r\n\r\n readonly whenAudioPlaying?: PStyle;\r\n readonly whenAudioPaused?: PStyle;\r\n readonly whenAudioBlocked?: PStyle;\r\n readonly whenVideoBlocked?: PStyle;\r\n readonly whenAudioUnblocked?: PStyle;\r\n readonly whenVideoUnblocked?: PStyle;\r\n readonly whenResponseBlocked?: PStyle;\r\n readonly whenResponseUnblocked?: PStyle;\r\n readonly whenFormInputBlocked?: PStyle;\r\n readonly whenFormInputUnblocked?: PStyle;\r\n}\r\n\r\nconst isFalse = (bool?: boolean): bool is false => bool === false;\r\nconst isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\nexport abstract class DElement<T extends HTMLElement> {\r\n private prevState: TaskState | false = false;\r\n\r\n protected currStyle: Partial<DStyle> = {\r\n fontSize: { _unit: \"px\", value: 100 },\r\n fontWeight: 500,\r\n textColor: \"black\",\r\n opacity: 1,\r\n };\r\n\r\n protected constructor(\r\n protected readonly el: T,\r\n protected readonly dto: DElementBaseDto,\r\n protected readonly scale: ScaleService,\r\n ) {\r\n if (dto.innerText) {\r\n this.el.innerText = dto.innerText;\r\n }\r\n this.setStyle = this.setStyle.bind(this);\r\n // this.normalize = this.normalize.bind(this);\r\n this.appendYourself = this.appendYourself.bind(this);\r\n this.updateStyles = this.updateStyles.bind(this);\r\n const { onMouseEnter, onMouseLeave } = dto;\r\n\r\n if (onMouseEnter) {\r\n this.el.onmouseenter = () => {\r\n this.setStyle(onMouseEnter);\r\n };\r\n }\r\n if (onMouseLeave) {\r\n this.el.onmouseleave = () => {\r\n this.setStyle(onMouseLeave);\r\n };\r\n }\r\n\r\n DStyle.normalize(this.el);\r\n\r\n if (dto) {\r\n this.updateStyles(dto?.style);\r\n }\r\n }\r\n\r\n /**\r\n * This method is called when the element is clicked.\r\n * This method shall be overridden by the pageClass.\r\n * @param style\r\n */\r\n setStyle(style: PStyle) {\r\n this.updateStyles(style);\r\n }\r\n\r\n getElementByDangerousReference() {\r\n return this.el;\r\n }\r\n\r\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\r\n parent.append(this.el);\r\n // console.log(parent);\r\n }\r\n\r\n updateState(state: TaskStateDiff) {\r\n this.handleStateChanges(state);\r\n }\r\n\r\n setState(state: TaskState) {\r\n const prev = this.prevState;\r\n const diff = TaskState.getDiff(state, prev);\r\n this.prevState = state;\r\n if (Object.keys(diff).length > 0) {\r\n this.handleStateChanges(diff);\r\n }\r\n }\r\n\r\n private handleStateChanges(diff: TaskStateDiff) {\r\n const {\r\n audioIsPlaying,\r\n videoPlayState,\r\n blockAudio,\r\n blockVideo,\r\n blockResponseButton,\r\n blockFormInput,\r\n isGifMode,\r\n } = diff;\r\n const {\r\n whenAudioPaused,\r\n whenVideoPaused,\r\n whenAudioPlaying,\r\n whenFormInputBlocked,\r\n whenResponseBlocked,\r\n\r\n whenVideoPlaying,\r\n whenVideoEnded,\r\n\r\n whenAudioBlocked,\r\n whenVideoBlocked,\r\n whenAudioUnblocked,\r\n whenVideoUnblocked,\r\n whenResponseUnblocked,\r\n whenFormInputUnblocked,\r\n whenVideoPausedAndMuted,\r\n whenVideoEndedAndMuted,\r\n whenVideoPlayingAndMuted,\r\n } = this.dto;\r\n\r\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\r\n this.setStyle(whenAudioPlaying);\r\n }\r\n\r\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\r\n this.setStyle(whenAudioPaused);\r\n }\r\n\r\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\r\n this.setStyle(whenVideoPlaying);\r\n }\r\n\r\n if (videoPlayState === \"paused\" && whenVideoPaused) {\r\n this.setStyle(whenVideoPaused);\r\n }\r\n\r\n if (videoPlayState === \"ended\" && whenVideoEnded) {\r\n this.setStyle(whenVideoEnded);\r\n }\r\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\r\n this.setStyle(whenVideoPlayingAndMuted);\r\n }\r\n\r\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\r\n this.setStyle(whenVideoPausedAndMuted);\r\n }\r\n\r\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\r\n this.setStyle(whenVideoEndedAndMuted);\r\n }\r\n }\r\n\r\n // private normalize() {\r\n // this.el.style.padding = \"0\";\r\n // this.el.style.margin = \"0\";\r\n // this.el.style.position = \"absolute\";\r\n // this.el.style.boxSizing = \"border-box\";\r\n // }\r\n\r\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\r\n\r\n protected updateStyles(style: Partial<DStyle>) {\r\n this.currStyle = Object.assign(this.currStyle, style);\r\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\r\n window.getComputedStyle(this.el);\r\n }\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { DText, DTextDto } from \"./DText\";\r\nimport { DImg, DImgDto } from \"./DImg\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { DButton, DButtonDto } from \"./DButton\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DDivDto extends DElementBaseDto {\r\n readonly _tag: \"div\";\r\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\r\n}\r\n\r\nexport class DDiv extends DElement<HTMLDivElement> {\r\n private readonly TAG = \"[ DDiv ]: \";\r\n protected readonly defaultStyle = { x: 22, y: 4 };\r\n private children: Array<DText | DImg | DButton> = [];\r\n\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\r\n this.el.onclick = () => {\r\n const action = this.dto.onClick;\r\n if (action) {\r\n clickHandler(action);\r\n }\r\n };\r\n this.children.forEach((child) => {\r\n child.registerClickHandler(clickHandler);\r\n });\r\n }\r\n\r\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\r\n const d = document.createElement(\"div\");\r\n super(d, dto, scale);\r\n this.children = children;\r\n\r\n this.children.forEach((child) => {\r\n child.appendYourself(this.el);\r\n });\r\n }\r\n protected whenConstructed() {\r\n this.children.forEach((child) => {\r\n console.log(child);\r\n });\r\n }\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { DTimestamp } from \"../common/DTimestamp\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DImgDto extends DElementBaseDto {\r\n readonly _tag: \"img\";\r\n // readonly id: string;\r\n readonly url: string;\r\n}\r\n\r\nexport class DImg extends DElement<HTMLImageElement> {\r\n private static IMAGE_COUNT = 0;\r\n private readonly imageCount: number;\r\n readonly TAG: string;\r\n readonly TIMING_TAG: string;\r\n private readonly loadStart: DTimestamp;\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\r\n this.el.onclick = () => {\r\n const action = this.dto.onClick;\r\n if (action) {\r\n clickHandler(action);\r\n }\r\n };\r\n }\r\n\r\n constructor(\r\n protected readonly dto: DImgDto,\r\n readonly scaleService: ScaleService,\r\n ) {\r\n super(document.createElement(\"img\"), dto, scaleService);\r\n DImg.IMAGE_COUNT += 1;\r\n this.imageCount = DImg.IMAGE_COUNT;\r\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\r\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\r\n this.el.loading = \"eager\";\r\n this.el.style.position = \"absolute\";\r\n this.setStyle(dto.style);\r\n\r\n this.loadStart = DTimestamp.now();\r\n this.el.onload = () => {};\r\n this.el.onerror = () => {};\r\n this.el.src = dto.url;\r\n console.time(this.TIMING_TAG);\r\n }\r\n\r\n log(): void {}\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DTextDto extends DElementBaseDto {\r\n readonly _tag: \"p\";\r\n readonly innerText: string;\r\n}\r\n\r\nexport class DText extends DElement<HTMLParagraphElement> {\r\n constructor(dto: DTextDto, scale: ScaleService) {\r\n super(document.createElement(\"p\"), dto, scale);\r\n }\r\n\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\r\n this.el.onclick = () => {\r\n const onClick = this.dto.onClick;\r\n if (onClick) {\r\n clickHandler(onClick);\r\n }\r\n };\r\n }\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DButtonDto extends DElementBaseDto {\r\n readonly _tag: \"button\";\r\n}\r\n\r\nexport class DButton extends DElement<HTMLButtonElement> {\r\n private readonly TAG = \"[ DDiv ]: \";\r\n protected readonly defaultStyle = { x: 40, y: 40 };\r\n\r\n constructor(dto: DButtonDto, scale: ScaleService) {\r\n const d = document.createElement(\"button\");\r\n super(d, dto, scale);\r\n }\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\r\n this.el.onclick = () => {\r\n const action = this.dto.onClick;\r\n if (action) {\r\n clickHandler(action);\r\n }\r\n };\r\n }\r\n}\r\n","import { DElement } from \"./DElement\";\r\nimport { DDiv, DDivDto } from \"./Ddiv\";\r\nimport { DImg } from \"./DImg\";\r\nimport { DText } from \"./DText\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { DElementDto } from \"./DElement.dto\";\r\nimport { DButton } from \"./DButton\";\r\n\r\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\r\n switch (dto._tag) {\r\n case \"div\":\r\n const childEls = createChildrenForDiv(dto, scale);\r\n return new DDiv(dto, scale, childEls);\r\n case \"img\":\r\n return new DImg(dto, scale);\r\n case \"p\":\r\n return new DText(dto, scale);\r\n case \"button\":\r\n return new DButton(dto, scale);\r\n default:\r\n const check: never = dto;\r\n throw new Error(\"Unknown dto given to the createDElement function.\");\r\n // TODO LOGGING or create any HTML-ELEMENT??\r\n }\r\n};\r\n\r\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\r\n const childDto = dto.children;\r\n const childEls: Array<DImg | DText | DButton> = [];\r\n childDto.forEach((dto) => {\r\n switch (dto._tag) {\r\n case \"p\":\r\n const newText = new DText(dto, scale);\r\n childEls.push(newText);\r\n break;\r\n case \"img\":\r\n const newImage = new DImg(dto, scale);\r\n childEls.push(newImage);\r\n break;\r\n case \"button\":\r\n const newButton = new DButton(dto, scale);\r\n childEls.push(newButton);\r\n break;\r\n default:\r\n const check: never = dto;\r\n }\r\n });\r\n return childEls;\r\n};\r\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\r\nimport { Fact } from \"../rules/fact\";\r\n\r\nexport type ButtonClickAction =\r\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\r\n | { kind: \"pause-audio\"; vibrateMs?: number }\r\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\r\n | { kind: \"mute-video\"; vibrateMs?: number }\r\n | { kind: \"un-mute-video\"; vibrateMs?: number }\r\n | { kind: \"pause-video\"; vibrateMs?: number }\r\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\r\n | { kind: \"next-page\"; vibrateMs?: number }\r\n | { kind: \"submit-form\"; vibrateMs?: number };\r\n\r\n// export type ButtonClickAction = _ButtonClickAction & ;\r\nexport const ButtonClickAction = {\r\n describe: (a: ButtonClickAction): string => {\r\n switch (a.kind) {\r\n case \"next-page\":\r\n return \"go to next page\";\r\n case \"play-video\":\r\n return \"VideoId = \" + a.task.videoId;\r\n case \"play-audio\":\r\n return \"AudioId = \" + a.task.audioId;\r\n case \"pause-video\":\r\n return \"\";\r\n case \"pause-audio\":\r\n return \"\";\r\n case \"submit-fact\":\r\n return a.fact.label + \" = \" + a.fact.value;\r\n case \"submit-form\":\r\n return \"\";\r\n case \"mute-video\":\r\n return \"mute-video\";\r\n case \"un-mute-video\":\r\n return \"un-mute-video\";\r\n default:\r\n const _exhaustiveCheck: never = a;\r\n return \"\";\r\n }\r\n },\r\n};\r\n","import { DTimestamp } from \"../common/DTimestamp\";\r\n\r\ninterface _MqEvent<K extends string, P extends object> {\r\n readonly kind: K;\r\n readonly timestamp: DTimestamp;\r\n readonly payload: P;\r\n}\r\n\r\nexport type MqEventEngineStart = _MqEvent<\r\n \"engine-start\",\r\n {\r\n readonly schemaId: string;\r\n readonly schemaPrefix: string;\r\n }\r\n>;\r\nexport interface MqEventPageEnter\r\n extends _MqEvent<\"page-enter\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\nexport interface MqEventPageLeave\r\n extends _MqEvent<\"page-leave\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\n\r\nexport type MqEventUserClicked = _MqEvent<\r\n \"user-clicked\",\r\n { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }\r\n>;\r\n\r\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\r\n\r\nexport const MqEvent = {\r\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\r\n return {\r\n kind: \"engine-start\",\r\n timestamp: DTimestamp.now(),\r\n payload: { schemaId, schemaPrefix },\r\n };\r\n },\r\n pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {\r\n return {\r\n kind: \"page-enter\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {\r\n return {\r\n kind: \"page-leave\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n userClicked(data: {\r\n pageId: string;\r\n pagePrefix: string;\r\n action: string;\r\n descriptions: string;\r\n }): MqEventUserClicked {\r\n const { pageId, pagePrefix, action, descriptions } = data;\r\n return {\r\n kind: \"user-clicked\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix, action, descriptions },\r\n };\r\n },\r\n} as const;\r\n","import { DElement } from \"../Delement/DElement\";\r\nimport { TaskManager } from \"./task-manager\";\r\nimport { createDElement } from \"../Delement/element-factory\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { Task } from \"./task\";\r\nimport { PStyle } from \"../Delement/DStyle\";\r\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\r\nimport { DElementDto } from \"../Delement/DElement.dto\";\r\nimport { Fact } from \"../rules/fact\";\r\nimport { DTimestamp } from \"../common/DTimestamp\";\r\nimport { PageResult } from \"./page-result\";\r\nimport { TaskState } from \"./task-state\";\r\nimport { MqEvent } from \"../events/mq-events\";\r\n\r\nexport interface VideoPlayerDto {\r\n playUrl: string;\r\n style?: PStyle;\r\n}\r\n\r\nexport interface PageDto {\r\n readonly id: string;\r\n readonly prefix: string;\r\n readonly tags: string[];\r\n background: string;\r\n elements: Array<DElementDto>;\r\n videoPlayer?: VideoPlayerDto;\r\n initialTasks: Array<Task>;\r\n}\r\n\r\nexport const PageDto = {\r\n createDummy: (id: number): PageDto => {\r\n return {\r\n id: \"id\" + id,\r\n prefix: \"prefix\" + id,\r\n tags: [],\r\n background: \"white\",\r\n elements: [\r\n {\r\n _tag: \"div\",\r\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\r\n children: [],\r\n innerText: \"Next btn \" + id,\r\n },\r\n ],\r\n\r\n initialTasks: [],\r\n };\r\n },\r\n};\r\n\r\nexport class Page {\r\n private readonly TAG = \"[ DPage ]: \";\r\n private elements: DElement<HTMLElement>[] = [];\r\n // private elements: PageComponent[] = [];\r\n // private layoutComponents: PageLayoutComponent[] = [];\r\n private pageEntered: DTimestamp = DTimestamp.now();\r\n private previousState: TaskState | false = false;\r\n private eventLog = new Array<MqEvent>();\r\n\r\n constructor(\r\n private readonly dto: PageDto,\r\n private readonly taskManager: TaskManager,\r\n private readonly scaleService: ScaleService,\r\n private readonly onCompleted: (result: PageResult) => void,\r\n ) {\r\n dto.elements.forEach((el) => {\r\n const element = createDElement(el, scaleService);\r\n // if (element instanceof DDiv) {\r\n // }\r\n element.registerClickHandler((action) => {\r\n this.handleButtonAction(action);\r\n });\r\n\r\n this.elements.push(element);\r\n\r\n // if(element.)\r\n // element= (action) => {\r\n // console.log(\"TODO ONCLICK \");\r\n // this.handleButtonAction(action);\r\n // };\r\n // this.elements.push(element);\r\n });\r\n\r\n if (dto.videoPlayer) {\r\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\r\n if (dto.videoPlayer.style) {\r\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\r\n }\r\n }\r\n\r\n if (dto.initialTasks.length) {\r\n this.taskManager.autoPlaySequence(dto.initialTasks);\r\n }\r\n }\r\n\r\n private createPageResult(facts: Fact[]): PageResult {\r\n const pageExited = DTimestamp.now();\r\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\r\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);\r\n this.eventLog.push(pageExit);\r\n const eventLog = [...this.eventLog];\r\n return {\r\n pagePrefix: this.dto.prefix,\r\n pageId: this.dto.id,\r\n eventLog,\r\n pageTime,\r\n collectedFacts: facts,\r\n };\r\n }\r\n private handleButtonAction(a: ButtonClickAction) {\r\n const event = MqEvent.userClicked({\r\n pageId: this.dto.id,\r\n pagePrefix: this.dto.prefix,\r\n action: a.kind,\r\n descriptions: ButtonClickAction.describe(a),\r\n });\r\n this.eventLog.push(event);\r\n navigator.vibrate(200);\r\n const { vibrateMs } = a;\r\n if (vibrateMs) {\r\n navigator.vibrate(vibrateMs);\r\n }\r\n\r\n switch (a.kind) {\r\n case \"next-page\":\r\n const nextPageResult = this.createPageResult([]);\r\n this.onCompleted(nextPageResult);\r\n break;\r\n case \"play-video\":\r\n this.taskManager.execute(a.task);\r\n break;\r\n case \"play-audio\":\r\n this.taskManager.execute(a.task);\r\n break;\r\n case \"pause-video\":\r\n this.taskManager.pauseVideo();\r\n break;\r\n case \"pause-audio\":\r\n this.taskManager.pauseAudio();\r\n break;\r\n case \"mute-video\":\r\n this.taskManager.muteVideo();\r\n break;\r\n case \"un-mute-video\":\r\n this.taskManager.unMuteVideo();\r\n break;\r\n case \"submit-fact\":\r\n const submitFactResult = this.createPageResult([a.fact]);\r\n this.onCompleted(submitFactResult);\r\n break;\r\n case \"submit-form\":\r\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\r\n const submitFormResult = this.createPageResult([]);\r\n this.onCompleted(submitFormResult);\r\n break;\r\n default:\r\n const _exhaustiveCheck: never = a;\r\n console.log(_exhaustiveCheck);\r\n }\r\n }\r\n\r\n appendYourself(parent: HTMLElement) {\r\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);\r\n this.pageEntered = DTimestamp.now();\r\n this.eventLog.push(pageEnterEvent);\r\n this.elements.forEach((el) => {\r\n el.appendYourself(parent);\r\n });\r\n\r\n // this.components.forEach((comp) => {\r\n // comp.appendToParent(parent);\r\n // });\r\n // this.layoutComponents.forEach((comp) => {\r\n // comp.appendToParent(parent);\r\n // });\r\n }\r\n\r\n destroy() {\r\n this.taskManager.clear();\r\n }\r\n\r\n tick() {\r\n const prev = this.previousState;\r\n const curr = this.taskManager.getState();\r\n const diff = TaskState.getDiff(curr, prev);\r\n this.elements.forEach((element) => {\r\n element.updateState(diff);\r\n });\r\n }\r\n}\r\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\r\nimport { Task } from \"./task\";\r\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { TaskState } from \"./task-state\";\r\n\r\nexport class TaskManager {\r\n private readonly TAG = \"[TaskManager]: \";\r\n private readonly videoElement = document.createElement(\"video\");\r\n private readonly audioElement = document.createElement(\"audio\");\r\n private readonly showConsoleLogs = false;\r\n private readonly defaultVideoStyles: PStyle = {\r\n height: 50,\r\n width: 100,\r\n top: 0,\r\n left: 0,\r\n };\r\n private videoStyles: PStyle;\r\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\r\n private taskList: Array<Task> = [];\r\n private delayRef: number | false = false;\r\n\r\n clear() {\r\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\r\n if (typeof this.delayRef === \"number\") {\r\n window.clearTimeout(this.delayRef);\r\n }\r\n\r\n this.pauseVideo();\r\n this.pauseAudio();\r\n this.videoElement.removeAttribute(\"src\");\r\n this.videoElement.load();\r\n this.audioElement.removeAttribute(\"src\");\r\n this.audioElement.load();\r\n this.taskList = [];\r\n this.runningTask = false;\r\n this.hideVideo();\r\n }\r\n\r\n getState(): TaskState {\r\n const c = this.runningTask;\r\n const isGifMode = this.videoElement.loop;\r\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\r\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\r\n const blockResponseButton = c && c.task.blockResponseButton;\r\n const blockAudio = c && c.task.blockAudio;\r\n const blockVideo = c && c.task.blockVideo;\r\n const blockFormInput = c && c.task.blockFormInput;\r\n const videoIsMuted = this.videoElement.muted;\r\n\r\n const videoIsAtTheEnd = this.videoElement.ended;\r\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\r\n\r\n if (videoIsPlaying) {\r\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\r\n }\r\n if (videoIsAtTheEnd) {\r\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\r\n }\r\n\r\n return {\r\n audioIsPlaying,\r\n videoPlayState,\r\n isGifMode,\r\n blockFormInput,\r\n blockResponseButton,\r\n blockAudio,\r\n blockVideo,\r\n };\r\n }\r\n\r\n constructor(\r\n private readonly mediaLayer: HTMLDivElement,\r\n private readonly scale: ScaleService,\r\n private readonly onError: (error: string) => void,\r\n ) {\r\n this.hideVideo();\r\n this.mediaLayer.appendChild(this.videoElement);\r\n this.mediaLayer.appendChild(this.audioElement);\r\n this.videoStyles = this.defaultVideoStyles;\r\n DStyle.normalize(this.videoElement);\r\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\r\n\r\n this.videoElement.onended = () => {\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n } else {\r\n this.runningTask = false;\r\n }\r\n };\r\n this.videoElement.onerror = (e) => {\r\n if (this.videoElement.src !== \"\") {\r\n onError(\"Error playing video: \" + this.videoElement.src);\r\n }\r\n };\r\n\r\n this.audioElement.onended = () => {\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n } else {\r\n this.runningTask = false;\r\n }\r\n };\r\n }\r\n\r\n execute(task: Task): boolean {\r\n // console.log(\"EXECUTE TASK\" + task.kind);\r\n const curr = this.runningTask;\r\n // TODO Background-task should be handeled as its own kind or something.\r\n let isBackgroundTask = false;\r\n\r\n // Check if we should remove the current task.\r\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\r\n this.pauseAudio();\r\n this.pauseVideo();\r\n this.runningTask = false;\r\n }\r\n\r\n if (!curr) {\r\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\r\n } else if (Task.notEq(curr.task, task)) {\r\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\r\n }\r\n\r\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\r\n this.taskList = [];\r\n }\r\n\r\n // STARTING PLAY VIDEO\r\n if (task.kind === \"play-video-task\") {\r\n this.showVideo();\r\n // this.pauseAudio()\r\n this.loadVideo(task.url);\r\n if (task.loop) {\r\n this.videoElement.loop = true;\r\n isBackgroundTask = true;\r\n } else {\r\n this.videoElement.loop = false;\r\n }\r\n\r\n try {\r\n this.videoElement.play();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n // STARTING PLAY AUDIO\r\n if (task.kind === \"play-audio-task\") {\r\n if (!this.videoElement.loop) {\r\n this.pauseVideo();\r\n }\r\n if (task.url !== this.audioElement.src) {\r\n this.audioElement.src = task.url;\r\n }\r\n this.audioElement.play();\r\n }\r\n\r\n if (task.kind === \"delay-task\") {\r\n if (typeof this.delayRef === \"number\") {\r\n window.clearTimeout(this.delayRef);\r\n }\r\n this.delayRef = window.setTimeout(() => {\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n } else {\r\n this.runningTask = false;\r\n }\r\n }, task.duration);\r\n }\r\n\r\n if (isBackgroundTask) {\r\n const startNextTask = this.getNextTask();\r\n if (startNextTask) {\r\n this.execute(startNextTask);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n setVideoStyles(styles: PStyle) {\r\n this.videoStyles = { ...styles };\r\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\r\n }\r\n\r\n autoPlaySequence(tasks: Task[]) {\r\n this.taskList = [...tasks];\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n if (next.kind === \"play-video-task\" && next.loop) {\r\n this.videoElement.loop = true;\r\n }\r\n }\r\n }\r\n\r\n loadVideo(url: string) {\r\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\r\n if (this.videoElement.src !== url) {\r\n this.videoElement.src = url;\r\n }\r\n this.showVideo();\r\n }\r\n\r\n private playVideoElement() {\r\n this.videoElement\r\n .play()\r\n .then(() => {})\r\n .catch((e) => {\r\n console.log(e);\r\n this.onError(\"Error playing video.\");\r\n });\r\n }\r\n\r\n private showVideo() {\r\n this.videoElement.style.display = \"block\";\r\n }\r\n\r\n private hideVideo() {\r\n this.videoElement.style.display = \"none\";\r\n }\r\n\r\n pauseVideo() {\r\n try {\r\n if (!this.videoElement.loop) {\r\n this.videoElement.pause();\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n this.onError(\"Error pausing video.\");\r\n }\r\n }\r\n\r\n pauseAudio() {\r\n try {\r\n if (!this.audioElement.loop) {\r\n this.audioElement.pause();\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n this.onError(\"Error pausing audio.\");\r\n }\r\n }\r\n\r\n private getNextTask(): Task | false {\r\n // console.log(\"Getting next task.\");\r\n // console.log(this.taskList);\r\n const first = this.taskList.shift();\r\n return first ?? false;\r\n }\r\n\r\n muteVideo() {\r\n this.videoElement.muted = true;\r\n }\r\n\r\n unMuteVideo() {\r\n this.videoElement.muted = false;\r\n }\r\n}\r\n","import { SchemaDto } from \"./SchemaDto\";\r\nimport { DPlayer } from \"./dplayer\";\r\nimport { ScaleService } from \"./scale\";\r\nimport { Page } from \"../page/Page\";\r\nimport { TaskManager } from \"../page/task-manager\";\r\nimport { PageResult } from \"../page/page-result\";\r\nimport { SchemaResult } from \"./SchemaResult\";\r\nexport interface EngineLogger {\r\n info(message: string): void;\r\n error(message: string): void;\r\n warn(message: string): void;\r\n}\r\n\r\nconst voidLogger: EngineLogger = {\r\n info: (message: string) => {},\r\n error: (message: string) => {},\r\n warn: (message: string) => {},\r\n};\r\n\r\nexport interface ISchemaEngine {\r\n onProgress(handler: (result: SchemaResult) => void): void;\r\n onFatalError(handler: (error: { message: string }) => void): void;\r\n setLogger(logger: EngineLogger): void;\r\n}\r\n\r\nexport class SchemaEngine implements ISchemaEngine {\r\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\r\n private readonly scale: ScaleService;\r\n private readonly hostElement: HTMLDivElement;\r\n private readonly taskManager: TaskManager;\r\n private logger: EngineLogger = voidLogger;\r\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\r\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\r\n private player: DPlayer;\r\n private currentPage: Page | false = false;\r\n private readonly tickerRef: number | false = false;\r\n constructor(\r\n hostEl: HTMLDivElement,\r\n private readonly height: number,\r\n private readonly width: number,\r\n private readonly schema: SchemaDto,\r\n ) {\r\n this.tickerRef = window.setInterval(() => {\r\n if (this.currentPage) {\r\n this.currentPage.tick();\r\n }\r\n }, 100);\r\n this.hostElement = hostEl;\r\n this.hostElement.appendChild(this.mediaLayer);\r\n this.hostElement.appendChild(this.uiLayer);\r\n this.scale = new ScaleService({\r\n baseHeight: schema.baseHeight,\r\n baseWidth: schema.baseWidth,\r\n containerWidth: this.width,\r\n containerHeight: this.height,\r\n });\r\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\r\n this.player = new DPlayer(this.schema);\r\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\r\n console.log(error);\r\n });\r\n\r\n this.styleSelf();\r\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\r\n this.nextPage();\r\n }\r\n\r\n private handlePageCompleted(result: PageResult) {\r\n // 1 Save data from last page\r\n this.player.saveHistory(result);\r\n\r\n // 2 Emit progress\r\n const currentResults = this.player.getResults();\r\n const a: SchemaResult = {\r\n schemaId: this.schema.id,\r\n pagesLeft: currentResults.pagesLeft,\r\n predefinedFacts: currentResults.predefinedFacts,\r\n eventLog: currentResults.eventLog,\r\n answers: currentResults.answerFacts,\r\n };\r\n if (this._onProgress) {\r\n this._onProgress(a);\r\n }\r\n\r\n // 3. Next page\r\n this.nextPage();\r\n }\r\n\r\n private styleSelf() {\r\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\r\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\r\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\r\n this.hostElement.style.position = \"relative\";\r\n // this.hostElement.style.overflow = \"hidden\";\r\n const makeStatic = (div: HTMLDivElement) => {\r\n div.style.height = \"0px\";\r\n div.style.width = \"0px\";\r\n div.style.position = \"static\";\r\n };\r\n\r\n makeStatic(this.uiLayer);\r\n this.uiLayer.style.zIndex = \"10\";\r\n this.mediaLayer.style.zIndex = \"8\";\r\n makeStatic(this.mediaLayer);\r\n }\r\n\r\n private nextPage() {\r\n const nextPage = this.player.getNextPage();\r\n if (this.currentPage) {\r\n this.currentPage.destroy();\r\n this.uiLayer.innerHTML = \"\";\r\n }\r\n\r\n // console.log(nextPage);\r\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\r\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\r\n }\r\n\r\n if (!nextPage) {\r\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\r\n this.player = new DPlayer(this.schema);\r\n if (this.player.pagesLeft > 0) {\r\n this.nextPage();\r\n }\r\n return false;\r\n }\r\n\r\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\r\n this.handlePageCompleted(result);\r\n });\r\n this.currentPage = newPage;\r\n newPage.appendYourself(this.uiLayer);\r\n return true;\r\n }\r\n\r\n destroy() {\r\n if (this.currentPage) {\r\n this.currentPage.destroy();\r\n this.uiLayer.innerHTML = \"\";\r\n }\r\n }\r\n\r\n private _onProgress: ((result: SchemaResult) => void) | false = false;\r\n onProgress(handler: (result: SchemaResult) => void) {\r\n this._onProgress = handler;\r\n }\r\n\r\n private _onFatalError: ((error: { message: string }) => void) | false = false;\r\n onFatalError(handler: (error: { message: string }) => void): void {\r\n this._onFatalError = handler;\r\n }\r\n setLogger(logger: EngineLogger) {\r\n this.logger = logger;\r\n }\r\n}\r\n"],"mappings":"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","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
1
+ {"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\r\nexport * from \"./engine/SchemaEngine\";\r\nexport * from \"./engine/SchemaDto\";\r\nexport * from \"./engine/page-que-ruleengine-action\";\r\nexport * from \"./rules/rule\";\r\nexport * from \"./rules/fact\";\r\nexport * from \"./rules/rule-engine\";\r\nexport * from \"./rules/condition\";\r\nexport * from \"./utils/DUtil\";\r\n// export * from \"./utils/ID\";\r\n\r\nexport * from \"./events/mq-events\";\r\n\r\n// ELEMENTS\r\nexport * from \"./Delement/css\";\r\nexport * from \"./Delement/DStyle\";\r\nexport * from \"./Delement/DImg\";\r\nexport * from \"./Delement/DText\";\r\nexport * from \"./Delement/DButton\";\r\nexport * from \"./Delement/Ddiv\";\r\nexport * from \"./Delement/button-click-action\";\r\nexport * from \"./Delement/DElement\";\r\nexport * from \"./Delement/DElement.dto\";\r\nexport { PageDto } from \"./page/Page\";\r\nexport * from \"./page/task\";\r\n","import { Fact } from \"../rules/fact\";\r\nimport { PageResult } from \"../page/page-result\";\r\n\r\nexport class HistoryQue {\r\n private history: PageResult[] = [];\r\n\r\n getFacts(): Array<Fact> {\r\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\r\n // const facts = answers.map((a) => a.fact);\r\n // TODO FIND LATEST FACT (answer) if have multiple.\r\n return answers;\r\n }\r\n\r\n addToHistory(result: PageResult) {\r\n this.history.push(result);\r\n }\r\n}\r\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n\r\n\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\r\n\r\nexport class NextQue {\r\n private originalOrder: ReadonlyArray<string> = [];\r\n private allPages: PageDto[] = [];\r\n private excludedTags = new Set<string>();\r\n private excludedByPageId = new Set<string>();\r\n private remaining: PageDto[] = [];\r\n constructor(pages: PageDto[] = []) {\r\n this.resetQue(pages);\r\n }\r\n\r\n /**\r\n * Will reset que with the new pages.\r\n * @param pages\r\n */\r\n resetQue(pages: PageDto[]) {\r\n this.allPages = [...pages];\r\n this.remaining = [...pages];\r\n this.excludedTags = new Set();\r\n this.excludedByPageId = new Set();\r\n this.originalOrder = this.allPages.map((p) => p.id);\r\n }\r\n\r\n pop(): PageDto | false {\r\n const next = this.remaining.shift();\r\n // TODO CLONE??\r\n return next ?? false;\r\n }\r\n\r\n peek(): PageDto | false {\r\n const next = this.remaining[0];\r\n return next ?? false;\r\n }\r\n\r\n jumpToPageById(pageId: string): boolean {\r\n const index = this.remaining.findIndex((p) => p.id === pageId);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.remaining = this.remaining.slice(index);\r\n return true;\r\n }\r\n\r\n removeByTag(tag: string | string[]) {\r\n if (Array.isArray(tag)) {\r\n tag.forEach((tag) => {\r\n this.excludedTags.add(tag);\r\n });\r\n } else {\r\n this.excludedTags.add(tag);\r\n }\r\n this.filterRemaining();\r\n }\r\n\r\n /**\r\n * Will not be included\r\n * @param pages\r\n */\r\n insertAsNextByForce(pages: PageDto[]) {\r\n this.remaining.unshift(...pages);\r\n }\r\n\r\n removeByPageId(pageId: string | string[]) {\r\n if (Array.isArray(pageId)) {\r\n pageId.forEach((id) => {\r\n this.excludedByPageId.add(id);\r\n });\r\n } else {\r\n this.excludedByPageId.add(pageId);\r\n }\r\n this.filterRemaining();\r\n // this.excludedByPageId.add(pageId);\r\n }\r\n\r\n private filterRemaining() {\r\n this.remaining = this.remaining.filter((p) => {\r\n const tags = p.tags ?? [];\r\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\r\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\r\n return isIncludedByPageId && isIncluededByTag;\r\n });\r\n }\r\n get isEmpty(): boolean {\r\n return this.remaining.length === 0;\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get size(): number {\r\n return this.remaining.length;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get pageCount(): number {\r\n return this.originalOrder.length;\r\n }\r\n}\r\n","import { HistoryQue } from \"./history-que\";\r\nimport { RuleEngine } from \"../rules/rule-engine\";\r\nimport { NextQue } from \"./next-que\";\r\nimport { SchemaDto } from \"./SchemaDto\";\r\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\r\nimport { PageDto } from \"../page/Page\";\r\nimport { PageResult } from \"../page/page-result\";\r\nimport { Fact } from \"../rules/fact\";\r\nimport { MqEvent } from \"../events/mq-events\";\r\n\r\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\r\nexport class DPlayer {\r\n private readonly eventLog: Array<MqEvent> = [];\r\n private history = new HistoryQue();\r\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\r\n private nextQue = new NextQue();\r\n private data: DPlayerData;\r\n private readonly predefinedFacts: ReadonlyArray<Fact>;\r\n\r\n constructor(data: DPlayerData) {\r\n this.data = data;\r\n const pages = data.pages ?? [];\r\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\r\n this.nextQue.resetQue(pages);\r\n }\r\n\r\n saveEvent(event: MqEvent) {\r\n this.eventLog.push(event);\r\n }\r\n\r\n saveHistory(pageHistory: PageResult) {\r\n // console.log(\"SAVE HISTORY\", pageHistory);\r\n this.history.addToHistory(pageHistory);\r\n this.eventLog.push(...pageHistory.eventLog);\r\n // Evaluate rules\r\n const userGeneratedFact = this.history.getFacts();\r\n const predefinedFacts = this.predefinedFacts;\r\n const facts = [...userGeneratedFact, ...predefinedFacts];\r\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\r\n\r\n const matchingRules = result.matching;\r\n const actions = matchingRules.map((r) => r.actionList).flat(1);\r\n // Execute actions\r\n actions.forEach((a) => {\r\n // console.log(a.payload);\r\n switch (a.kind) {\r\n case \"jumpToPage\":\r\n this.nextQue.jumpToPageById(a.pageId);\r\n break;\r\n case \"excludeByPageId\":\r\n this.nextQue.removeByPageId(a.pageIds);\r\n break;\r\n case \"excludeByTag\":\r\n this.nextQue.removeByTag(a.tagIds);\r\n break;\r\n default:\r\n console.log(\"UNKNOWN ACTION\", a);\r\n const check: never = a;\r\n }\r\n });\r\n }\r\n\r\n getResults() {\r\n const pagesLeft = this.nextQue.size;\r\n const answerFacts = this.history.getFacts();\r\n const predefinedFacts = this.predefinedFacts;\r\n const eventLog = [...this.eventLog];\r\n // console.log(answerFacts);\r\n return { answerFacts, predefinedFacts, eventLog, pagesLeft };\r\n }\r\n\r\n insertSequence(sequenceId: string) {\r\n this.insertSequenceById(sequenceId);\r\n }\r\n\r\n getNextPage(): PageDto | false {\r\n const next = this.nextQue.pop();\r\n return next ?? false;\r\n }\r\n\r\n private insertSequenceById(id: string) {\r\n const seq = this.data.pageSequences?.find((s) => s.id === id);\r\n if (seq) {\r\n this.nextQue.insertAsNextByForce([...seq.pages]);\r\n } else {\r\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\r\n // LOG INVALID COMMAND.\r\n }\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get pagesLeft(): number {\r\n return this.nextQue.pageCount;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get totalPageCount(): number {\r\n return this.data.pages.length;\r\n }\r\n}\r\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\r\n\r\nexport namespace DCss {\r\n export interface Px {\r\n readonly _unit: \"px\";\r\n readonly value: number;\r\n }\r\n\r\n\r\n export type LengthString = `${number}px` | `${number}%`;\r\n export const isPx = (unit?: LengthUnit | false | undefined | null): unit is Px => {\r\n if(typeof unit === \"number\") return false;\r\n if(!unit) return false;\r\n return (unit._unit === \"px\");\r\n }\r\n export const isPercent = (unit?: LengthUnit | false | undefined | null): unit is Percent => {\r\n if(typeof unit === \"number\") return false;\r\n if(!unit) return false;\r\n return (unit._unit === \"percent\");\r\n }\r\n\r\n\r\n export interface Percent {\r\n readonly _unit: \"percent\";\r\n readonly value: number;\r\n }\r\n\r\n export type LengthUnit = Px | Percent | number;\r\n\r\n /**\r\n * Will scale to 3% of baseScale\r\n * @param unit\r\n * @param scale\r\n */\r\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\r\n const _mapped: Percent | Px =\r\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\r\n return _toString(_mapped, scale);\r\n };\r\n\r\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\r\n const clampedScale = Math.max(scale, 0.03);\r\n if (unit._unit === \"px\") {\r\n if (unit.value < 0.1) {\r\n return \"0px\";\r\n }\r\n\r\n const rounded = Math.round(unit.value * clampedScale);\r\n const clamped = Math.max(rounded, 1);\r\n return (clamped + \"px\") as LengthString;\r\n }\r\n return (unit.value + \"%\") as LengthString;\r\n };\r\n\r\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\r\n if (typeof unit === \"number\") {\r\n return true;\r\n }\r\n\r\n if (!unit) {\r\n return false;\r\n }\r\n\r\n const unitKey: keyof DCss.Px = \"_unit\";\r\n const valueKey: keyof DCss.Px = \"value\";\r\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\r\n const hasValueKey = DUtil.hasKey(unit, valueKey);\r\n return hasUnitKey && hasValueKey;\r\n };\r\n}\r\n","import { DCss } from \"./css\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport type PStyle = Partial<DStyle>;\r\nexport interface DStyle {\r\n opacity: number;\r\n backgroundColor: string;\r\n visibility: \"visible\" | \"hidden\";\r\n cursor:\r\n | \"pointer\"\r\n | \"help\"\r\n | \"copy\"\r\n | \"wait\"\r\n | \"not-allowed\"\r\n | \"context-menu\"\r\n | \"move\"\r\n | \"grabbing\"\r\n | \"grab\"\r\n | \"zoom-in\"\r\n | \"zoom-out\"\r\n | \"none\"\r\n | \"auto\"\r\n | \"default\";\r\n\r\n zIndex: number;\r\n // POSITION\r\n h: number;\r\n w: number;\r\n x: number;\r\n y: number;\r\n height: DCss.LengthUnit;\r\n maxHeight: DCss.LengthUnit;\r\n minHeight: DCss.LengthUnit;\r\n width: DCss.LengthUnit;\r\n maxWidth: DCss.LengthUnit;\r\n minWidth: DCss.LengthUnit;\r\n bottom: DCss.LengthUnit;\r\n top: DCss.LengthUnit;\r\n left: DCss.LengthUnit;\r\n right: DCss.LengthUnit;\r\n boxShadow: string;\r\n\r\n // BORDERS\r\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\r\n borderRadius: DCss.Px | DCss.Percent;\r\n borderWidth: DCss.Px;\r\n borderColor: string;\r\n\r\n margin: DCss.Px | DCss.Percent;\r\n padding: DCss.Px | DCss.Percent;\r\n paddingLeft: DCss.Px | DCss.Percent;\r\n paddingRight: DCss.Px | DCss.Percent;\r\n paddingTop: DCss.Px | DCss.Percent;\r\n paddingBottom: DCss.Px | DCss.Percent;\r\n\r\n // Translate\r\n transform: string;\r\n translate: string;\r\n\r\n // TEXT\r\n fontSize: DCss.Px;\r\n textColor: string;\r\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\r\n textAlign: \"right\" | \"left\" | \"center\";\r\n letterSpacing: DCss.Px;\r\n lineHeight: number;\r\n\r\n // LAYOUT & POSITIONING OVERRIDE\r\n position: \"absolute\" | \"relative\";\r\n flex: string;\r\n display: \"flex\" | \"block\";\r\n flexDirection: \"row\" | \"colum\";\r\n flexWrap: \"nowrap\" | \"wrap\";\r\n justifyContent:\r\n | \"flex-start\"\r\n | \"flex-end\"\r\n | \"center\"\r\n | \"space-around\"\r\n | \"space-evenly\"\r\n | \"space-between\";\r\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\r\n gap: DCss.Px;\r\n alignContent:\r\n | \"stretch\"\r\n | \"center\"\r\n | \"flex-start\"\r\n | \"flex-end\"\r\n | \"space-around\"\r\n | \"space-evenly\"\r\n | \"space-between\";\r\n}\r\n\r\nexport namespace DStyle {\r\n // import isNumber = DUtil.isNumber;\r\n import isLengthUnit = DCss.isLengthUnit;\r\n // export const isP\r\n export const normalize = <T extends HTMLElement>(el: T): T => {\r\n const s = el.style;\r\n s.position = \"absolute\";\r\n s.boxSizing = \"border-box\";\r\n s.padding = \"0px\";\r\n s.margin = \"0px\";\r\n\r\n s.height = \"\";\r\n s.width = \"fit-content\";\r\n\r\n s.bottom = \"\";\r\n s.top = \"\";\r\n s.left = \"\";\r\n s.right = \"\";\r\n s.flex = \"none\";\r\n\r\n s.boxShadow = \"\";\r\n s.fontFamily = \"'Inter', sans-serif\"\r\n s.fontSize = \"12px\";\r\n s.lineHeight = \"1\";\r\n s.textAlign = \"center\";\r\n s.textDecoration = \"none\";\r\n s.boxShadow = \"\";\r\n s.boxSizing = \"border-box\";\r\n s.fontWeight = \"500\";\r\n s.borderStyle = \"\";\r\n s.borderRadius = \"\";\r\n s.borderWidth = \"\";\r\n s.borderWidth = \"0px\";\r\n s.borderColor = \"black\";\r\n s.backgroundColor = \"\";\r\n s.border = \"\";\r\n s.borderStyle = \"none\";\r\n s.outline = \"\";\r\n s.wordSpacing = \"\";\r\n s.userSelect = \"none\";\r\n s.textShadow = \"\";\r\n return el;\r\n };\r\n\r\n export const applyStyles = <T extends HTMLElement>(\r\n el: T,\r\n style: Partial<DStyle>,\r\n scale: number,\r\n ): T => {\r\n const { isNumber, isString } = DUtil;\r\n // const scalePx = DCss.toStringCre(this.scale);\r\n const {\r\n x,\r\n y,\r\n left,\r\n right,\r\n top,\r\n bottom,\r\n backgroundColor,\r\n borderColor,\r\n borderWidth,\r\n borderRadius,\r\n borderStyle,\r\n w,\r\n opacity,\r\n cursor,\r\n fontSize,\r\n fontWeight,\r\n lineHeight,\r\n textColor,\r\n textAlign,\r\n translate,\r\n flex,\r\n margin,\r\n padding,\r\n letterSpacing,\r\n h,\r\n height,\r\n width,\r\n transform,\r\n visibility,\r\n justifyContent,\r\n alignContent,\r\n flexWrap,\r\n display,\r\n flexDirection,\r\n alignItems,\r\n position,\r\n paddingLeft,\r\n paddingTop,\r\n paddingRight,\r\n paddingBottom,\r\n gap,\r\n\r\n zIndex,\r\n //\r\n boxShadow,\r\n minWidth,\r\n maxWidth,\r\n minHeight,\r\n maxHeight,\r\n } = style;\r\n\r\n if (isNumber(zIndex)) {\r\n el.style.zIndex = \"\" + zIndex;\r\n }\r\n if (isString(flex)) {\r\n el.style.flex = flex;\r\n }\r\n\r\n if (DCss.isLengthUnit(minWidth)) {\r\n el.style.minWidth = DCss.toString(minWidth, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(maxWidth)) {\r\n el.style.maxWidth = DCss.toString(maxWidth, scale);\r\n }\r\n\r\n if (typeof lineHeight === \"number\") {\r\n el.style.lineHeight = \"\" + lineHeight;\r\n }\r\n\r\n if (DCss.isLengthUnit(minHeight)) {\r\n el.style.minHeight = DCss.toString(minHeight, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(maxHeight)) {\r\n el.style.maxHeight = DCss.toString(maxHeight, scale);\r\n }\r\n\r\n if (boxShadow) {\r\n el.style.boxShadow = boxShadow;\r\n }\r\n\r\n if (gap) {\r\n el.style.gap = DCss.toString(gap, scale);\r\n }\r\n\r\n if (paddingLeft) {\r\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\r\n }\r\n\r\n if (paddingRight) {\r\n el.style.paddingRight = DCss.toString(paddingRight, scale);\r\n }\r\n\r\n if (paddingTop) {\r\n el.style.paddingTop = DCss.toString(paddingTop, scale);\r\n }\r\n\r\n if (paddingBottom) {\r\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\r\n }\r\n\r\n if (position) {\r\n el.style.position = position;\r\n }\r\n if (justifyContent) {\r\n el.style.justifyContent = justifyContent;\r\n }\r\n\r\n if (alignContent) {\r\n el.style.alignContent = alignContent;\r\n }\r\n if (flexWrap) {\r\n el.style.flexWrap = flexWrap;\r\n }\r\n if (display) {\r\n el.style.display = display;\r\n }\r\n if (flexDirection) {\r\n el.style.flexDirection = flexDirection;\r\n }\r\n if (alignItems) {\r\n el.style.alignItems = alignItems;\r\n }\r\n\r\n // this.el.style.fontWeight = '900';\r\n if (backgroundColor) {\r\n el.style.backgroundColor = backgroundColor;\r\n }\r\n\r\n if (cursor) {\r\n el.style.cursor = cursor;\r\n }\r\n\r\n if (transform) {\r\n el.style.transform = transform;\r\n }\r\n\r\n if (textColor) {\r\n el.style.color = textColor;\r\n }\r\n if (textAlign) {\r\n el.style.textAlign = textAlign;\r\n }\r\n\r\n if (borderColor) {\r\n el.style.borderColor = borderColor;\r\n }\r\n\r\n if (borderWidth) {\r\n el.style.borderWidth = DCss.toString(borderWidth, scale);\r\n }\r\n\r\n if (fontWeight) {\r\n el.style.fontWeight = fontWeight + \"\";\r\n }\r\n\r\n if (borderStyle) {\r\n el.style.borderStyle = borderStyle;\r\n }\r\n\r\n if (fontSize) {\r\n el.style.fontSize = DCss.toString(fontSize, scale);\r\n }\r\n\r\n if (DUtil.isNumber(x)) {\r\n el.style.left = x + \"%\";\r\n }\r\n\r\n if (DUtil.isNumber(y)) {\r\n el.style.bottom = y + \"%\";\r\n }\r\n\r\n if (DCss.isLengthUnit(height)) {\r\n el.style.height = DCss.toString(height, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(width)) {\r\n el.style.width = DCss.toString(width, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(left)) {\r\n el.style.left = DCss.toString(left, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(right)) {\r\n el.style.right = DCss.toString(right, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(bottom)) {\r\n el.style.bottom = DCss.toString(bottom, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(top)) {\r\n el.style.top = DCss.toString(top, scale);\r\n }\r\n\r\n if (DUtil.isNumber(h)) {\r\n el.style.height = DCss.toString(h, scale);\r\n }\r\n\r\n if (isNumber(w)) {\r\n el.style.width = DCss.toString(w, scale);\r\n }\r\n\r\n if (DCss.isLengthUnit(borderRadius)) {\r\n el.style.borderRadius = DCss.toString(borderRadius, scale);\r\n }\r\n\r\n if (letterSpacing) {\r\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\r\n }\r\n\r\n if (margin) {\r\n el.style.margin = DCss.toString(margin, scale);\r\n }\r\n\r\n if (padding) {\r\n el.style.padding = DCss.toString(padding, scale);\r\n }\r\n\r\n if (isNumber(opacity)) {\r\n el.style.opacity = opacity + \"\";\r\n }\r\n\r\n if (visibility) {\r\n el.style.visibility = visibility;\r\n }\r\n return el;\r\n };\r\n\r\n export const clone = <T extends PStyle>(style: T): T => {\r\n return JSON.parse(JSON.stringify(style));\r\n }\r\n\r\n // const propNames = new Set(...ElementKeyNames);\r\n // export const validKey = (keyName: string) => propNames.has(keyName);\r\n}\r\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\r\nimport diff = DTimestamp.diff;\r\n\r\nexport type TaskState = {\r\n audioIsPlaying: boolean;\r\n isGifMode: boolean;\r\n videoPlayState:\r\n | \"playing\"\r\n | \"paused\"\r\n | \"ended\"\r\n | \"playing-and-muted\"\r\n | \"paused-and-muted\"\r\n | \"ended-and-muted\";\r\n blockFormInput: boolean;\r\n blockResponseButton: boolean;\r\n blockAudio: boolean;\r\n blockVideo: boolean;\r\n};\r\n\r\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\r\nexport const TaskState = {\r\n eq: (a: TaskState, b: TaskState) => {\r\n return (\r\n a.audioIsPlaying === b.audioIsPlaying &&\r\n a.isGifMode === b.isGifMode &&\r\n a.videoPlayState === b.videoPlayState &&\r\n a.blockFormInput === b.blockFormInput &&\r\n a.blockResponseButton === b.blockResponseButton &&\r\n a.blockAudio === b.blockAudio &&\r\n a.blockVideo === b.blockVideo\r\n );\r\n },\r\n\r\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\r\n if (prev === false) {\r\n return curr as TaskStateDiff;\r\n }\r\n\r\n const diff = {} as TaskStateDiff;\r\n\r\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\r\n diff.audioIsPlaying = curr.audioIsPlaying;\r\n }\r\n if (curr.isGifMode !== prev.isGifMode) {\r\n diff.isGifMode = curr.isGifMode;\r\n }\r\n if (curr.videoPlayState !== prev.videoPlayState) {\r\n diff.videoPlayState = curr.videoPlayState;\r\n }\r\n\r\n if (curr.blockFormInput !== prev.blockFormInput) {\r\n diff.blockFormInput = curr.blockFormInput;\r\n }\r\n if (curr.blockResponseButton !== prev.blockResponseButton) {\r\n diff.blockResponseButton = curr.blockResponseButton;\r\n }\r\n if (curr.blockAudio !== prev.blockAudio) {\r\n diff.blockAudio = curr.blockAudio;\r\n }\r\n if (curr.blockVideo !== prev.blockVideo) {\r\n diff.blockVideo = curr.blockVideo;\r\n }\r\n return diff;\r\n },\r\n};\r\n","import { DStyle, PStyle } from \"./DStyle\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\r\n\r\nexport interface DElementBaseDto {\r\n readonly style: PStyle;\r\n readonly onMouseEnter?: PStyle;\r\n readonly onMouseLeave?: PStyle;\r\n readonly onMouseDown?: PStyle;\r\n readonly onMouseUp?: PStyle;\r\n readonly innerText?: string;\r\n\r\n // ACTIONS HANDLERS\r\n readonly onClick?: ButtonClickAction;\r\n\r\n // VIDEO STATED\r\n readonly whenVideoPaused?: PStyle;\r\n readonly whenVideoPausedAndMuted?: PStyle;\r\n readonly whenVideoEnded?: PStyle;\r\n readonly whenVideoEndedAndMuted?: PStyle;\r\n readonly whenVideoPlaying?: PStyle;\r\n readonly whenVideoPlayingAndMuted?: PStyle;\r\n\r\n readonly whenAudioPlaying?: PStyle;\r\n readonly whenAudioPaused?: PStyle;\r\n readonly whenAudioBlocked?: PStyle;\r\n readonly whenVideoBlocked?: PStyle;\r\n readonly whenAudioUnblocked?: PStyle;\r\n readonly whenVideoUnblocked?: PStyle;\r\n readonly whenResponseBlocked?: PStyle;\r\n readonly whenResponseUnblocked?: PStyle;\r\n readonly whenFormInputBlocked?: PStyle;\r\n readonly whenFormInputUnblocked?: PStyle;\r\n}\r\n\r\nconst isFalse = (bool?: boolean): bool is false => bool === false;\r\nconst isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\nexport abstract class DElement<T extends HTMLElement> {\r\n private prevState: TaskState | false = false;\r\n\r\n protected currStyle: Partial<DStyle> = {\r\n fontSize: { _unit: \"px\", value: 100 },\r\n fontWeight: 500,\r\n textColor: \"black\",\r\n opacity: 1,\r\n };\r\n\r\n protected constructor(\r\n protected readonly el: T,\r\n protected readonly dto: DElementBaseDto,\r\n protected readonly scale: ScaleService,\r\n ) {\r\n if (dto.innerText) {\r\n this.el.innerText = dto.innerText;\r\n }\r\n this.setStyle = this.setStyle.bind(this);\r\n // this.normalize = this.normalize.bind(this);\r\n this.appendYourself = this.appendYourself.bind(this);\r\n this.updateStyles = this.updateStyles.bind(this);\r\n const { onMouseEnter, onMouseLeave } = dto;\r\n\r\n if (onMouseEnter) {\r\n this.el.onmouseenter = () => {\r\n this.setStyle(onMouseEnter);\r\n };\r\n }\r\n if (onMouseLeave) {\r\n this.el.onmouseleave = () => {\r\n this.setStyle(onMouseLeave);\r\n };\r\n }\r\n\r\n DStyle.normalize(this.el);\r\n\r\n if (dto) {\r\n this.updateStyles(dto?.style);\r\n }\r\n }\r\n\r\n /**\r\n * This method is called when the element is clicked.\r\n * This method shall be overridden by the pageClass.\r\n * @param style\r\n */\r\n setStyle(style: PStyle) {\r\n this.updateStyles(style);\r\n }\r\n\r\n getElementByDangerousReference() {\r\n return this.el;\r\n }\r\n\r\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\r\n parent.append(this.el);\r\n // console.log(parent);\r\n }\r\n\r\n updateState(state: TaskStateDiff) {\r\n this.handleStateChanges(state);\r\n }\r\n\r\n setState(state: TaskState) {\r\n const prev = this.prevState;\r\n const diff = TaskState.getDiff(state, prev);\r\n this.prevState = state;\r\n if (Object.keys(diff).length > 0) {\r\n this.handleStateChanges(diff);\r\n }\r\n }\r\n\r\n private handleStateChanges(diff: TaskStateDiff) {\r\n const {\r\n audioIsPlaying,\r\n videoPlayState,\r\n blockAudio,\r\n blockVideo,\r\n blockResponseButton,\r\n blockFormInput,\r\n isGifMode,\r\n } = diff;\r\n const {\r\n whenAudioPaused,\r\n whenVideoPaused,\r\n whenAudioPlaying,\r\n whenFormInputBlocked,\r\n whenResponseBlocked,\r\n\r\n whenVideoPlaying,\r\n whenVideoEnded,\r\n\r\n whenAudioBlocked,\r\n whenVideoBlocked,\r\n whenAudioUnblocked,\r\n whenVideoUnblocked,\r\n whenResponseUnblocked,\r\n whenFormInputUnblocked,\r\n whenVideoPausedAndMuted,\r\n whenVideoEndedAndMuted,\r\n whenVideoPlayingAndMuted,\r\n } = this.dto;\r\n\r\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\r\n this.setStyle(whenAudioPlaying);\r\n }\r\n\r\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\r\n this.setStyle(whenAudioPaused);\r\n }\r\n\r\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\r\n this.setStyle(whenVideoPlaying);\r\n }\r\n\r\n if (videoPlayState === \"paused\" && whenVideoPaused) {\r\n this.setStyle(whenVideoPaused);\r\n }\r\n\r\n if (videoPlayState === \"ended\" && whenVideoEnded) {\r\n this.setStyle(whenVideoEnded);\r\n }\r\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\r\n this.setStyle(whenVideoPlayingAndMuted);\r\n }\r\n\r\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\r\n this.setStyle(whenVideoPausedAndMuted);\r\n }\r\n\r\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\r\n this.setStyle(whenVideoEndedAndMuted);\r\n }\r\n }\r\n\r\n // private normalize() {\r\n // this.el.style.padding = \"0\";\r\n // this.el.style.margin = \"0\";\r\n // this.el.style.position = \"absolute\";\r\n // this.el.style.boxSizing = \"border-box\";\r\n // }\r\n\r\n getComputedStyle() {\r\n const el = this.el;\r\n const isConnected = this.el.isConnected;\r\n\r\n return window.getComputedStyle(this.el);\r\n\r\n }\r\n\r\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\r\n\r\n protected updateStyles(style: Partial<DStyle>) {\r\n this.currStyle = Object.assign(this.currStyle, style);\r\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\r\n window.getComputedStyle(this.el);\r\n }\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { DText, DTextDto } from \"./DText\";\r\nimport { DImg, DImgDto } from \"./DImg\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { DButton, DButtonDto } from \"./DButton\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DDivDto extends DElementBaseDto {\r\n readonly _tag: \"div\";\r\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\r\n}\r\n\r\nexport class DDiv extends DElement<HTMLDivElement> {\r\n private readonly TAG = \"[ DDiv ]: \";\r\n protected readonly defaultStyle = { x: 22, y: 4 };\r\n private children: Array<DText | DImg | DButton> = [];\r\n\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\r\n this.el.onclick = () => {\r\n const action = this.dto.onClick;\r\n if (action) {\r\n clickHandler(action);\r\n }\r\n };\r\n this.children.forEach((child) => {\r\n child.registerClickHandler(clickHandler);\r\n });\r\n }\r\n\r\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\r\n const d = document.createElement(\"div\");\r\n super(d, dto, scale);\r\n this.children = children;\r\n\r\n this.children.forEach((child) => {\r\n child.appendYourself(this.el);\r\n });\r\n }\r\n protected whenConstructed() {\r\n this.children.forEach((child) => {\r\n console.log(child);\r\n });\r\n }\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { DTimestamp } from \"../common/DTimestamp\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DImgDto extends DElementBaseDto {\r\n readonly _tag: \"img\";\r\n // readonly id: string;\r\n readonly url: string;\r\n}\r\n\r\nexport class DImg extends DElement<HTMLImageElement> {\r\n private static IMAGE_COUNT = 0;\r\n private readonly imageCount: number;\r\n readonly TAG: string;\r\n readonly TIMING_TAG: string;\r\n private readonly loadStart: DTimestamp;\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\r\n this.el.onclick = () => {\r\n const action = this.dto.onClick;\r\n if (action) {\r\n clickHandler(action);\r\n }\r\n };\r\n }\r\n\r\n constructor(\r\n protected readonly dto: DImgDto,\r\n readonly scaleService: ScaleService,\r\n ) {\r\n super(document.createElement(\"img\"), dto, scaleService);\r\n DImg.IMAGE_COUNT += 1;\r\n this.imageCount = DImg.IMAGE_COUNT;\r\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\r\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\r\n this.el.loading = \"eager\";\r\n this.el.style.position = \"absolute\";\r\n this.setStyle(dto.style);\r\n\r\n this.loadStart = DTimestamp.now();\r\n this.el.onload = () => {};\r\n this.el.onerror = () => {};\r\n this.el.src = dto.url;\r\n console.time(this.TIMING_TAG);\r\n }\r\n\r\n log(): void {}\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DTextDto extends DElementBaseDto {\r\n readonly _tag: \"p\";\r\n readonly innerText: string;\r\n}\r\n\r\nexport class DText extends DElement<HTMLParagraphElement> {\r\n constructor(dto: DTextDto, scale: ScaleService) {\r\n super(document.createElement(\"p\"), dto, scale);\r\n }\r\n\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\r\n this.el.onclick = () => {\r\n const onClick = this.dto.onClick;\r\n if (onClick) {\r\n clickHandler(onClick);\r\n }\r\n };\r\n }\r\n}\r\n","import { DElement, DElementBaseDto } from \"./DElement\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { ButtonClickAction } from \"./button-click-action\";\r\n\r\nexport interface DButtonDto extends DElementBaseDto {\r\n readonly _tag: \"button\";\r\n}\r\n\r\nexport class DButton extends DElement<HTMLButtonElement> {\r\n private readonly TAG = \"[ DDiv ]: \";\r\n protected readonly defaultStyle = { x: 40, y: 40 };\r\n\r\n constructor(dto: DButtonDto, scale: ScaleService) {\r\n const d = document.createElement(\"button\");\r\n super(d, dto, scale);\r\n }\r\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\r\n this.el.onclick = () => {\r\n const action = this.dto.onClick;\r\n if (action) {\r\n clickHandler(action);\r\n }\r\n };\r\n }\r\n}\r\n","import { DElement } from \"./DElement\";\r\nimport { DDiv, DDivDto } from \"./Ddiv\";\r\nimport { DImg } from \"./DImg\";\r\nimport { DText } from \"./DText\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { DElementDto } from \"./DElement.dto\";\r\nimport { DButton } from \"./DButton\";\r\n\r\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\r\n switch (dto._tag) {\r\n case \"div\":\r\n const childEls = createChildrenForDiv(dto, scale);\r\n return new DDiv(dto, scale, childEls);\r\n case \"img\":\r\n return new DImg(dto, scale);\r\n case \"p\":\r\n return new DText(dto, scale);\r\n case \"button\":\r\n return new DButton(dto, scale);\r\n default:\r\n const check: never = dto;\r\n throw new Error(\"Unknown dto given to the createDElement function.\");\r\n // TODO LOGGING or create any HTML-ELEMENT??\r\n }\r\n};\r\n\r\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\r\n const childDto = dto.children;\r\n const childEls: Array<DImg | DText | DButton> = [];\r\n childDto.forEach((dto) => {\r\n switch (dto._tag) {\r\n case \"p\":\r\n const newText = new DText(dto, scale);\r\n childEls.push(newText);\r\n break;\r\n case \"img\":\r\n const newImage = new DImg(dto, scale);\r\n childEls.push(newImage);\r\n break;\r\n case \"button\":\r\n const newButton = new DButton(dto, scale);\r\n childEls.push(newButton);\r\n break;\r\n default:\r\n const check: never = dto;\r\n }\r\n });\r\n return childEls;\r\n};\r\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\r\nimport { Fact } from \"../rules/fact\";\r\n\r\nexport type ButtonClickAction =\r\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\r\n | { kind: \"pause-audio\"; vibrateMs?: number }\r\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\r\n | { kind: \"mute-video\"; vibrateMs?: number }\r\n | { kind: \"un-mute-video\"; vibrateMs?: number }\r\n | { kind: \"pause-video\"; vibrateMs?: number }\r\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\r\n | { kind: \"next-page\"; vibrateMs?: number }\r\n | { kind: \"submit-form\"; vibrateMs?: number };\r\n\r\n// export type ButtonClickAction = _ButtonClickAction & ;\r\nexport const ButtonClickAction = {\r\n describe: (a: ButtonClickAction): string => {\r\n switch (a.kind) {\r\n case \"next-page\":\r\n return \"go to next page\";\r\n case \"play-video\":\r\n return \"VideoId = \" + a.task.videoId;\r\n case \"play-audio\":\r\n return \"AudioId = \" + a.task.audioId;\r\n case \"pause-video\":\r\n return \"\";\r\n case \"pause-audio\":\r\n return \"\";\r\n case \"submit-fact\":\r\n return a.fact.label + \" = \" + a.fact.value;\r\n case \"submit-form\":\r\n return \"\";\r\n case \"mute-video\":\r\n return \"mute-video\";\r\n case \"un-mute-video\":\r\n return \"un-mute-video\";\r\n default:\r\n const _exhaustiveCheck: never = a;\r\n return \"\";\r\n }\r\n },\r\n};\r\n","import { DTimestamp } from \"../common/DTimestamp\";\r\n\r\ninterface _MqEvent<K extends string, P extends object> {\r\n readonly kind: K;\r\n readonly timestamp: DTimestamp;\r\n readonly payload: P;\r\n}\r\n\r\nexport type MqEventEngineStart = _MqEvent<\r\n \"engine-start\",\r\n {\r\n readonly schemaId: string;\r\n readonly schemaPrefix: string;\r\n }\r\n>;\r\nexport interface MqEventPageEnter\r\n extends _MqEvent<\"page-enter\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\nexport interface MqEventPageLeave\r\n extends _MqEvent<\"page-leave\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\n\r\nexport type MqEventUserClicked = _MqEvent<\r\n \"user-clicked\",\r\n { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }\r\n>;\r\n\r\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\r\n\r\nexport const MqEvent = {\r\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\r\n return {\r\n kind: \"engine-start\",\r\n timestamp: DTimestamp.now(),\r\n payload: { schemaId, schemaPrefix },\r\n };\r\n },\r\n pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {\r\n return {\r\n kind: \"page-enter\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {\r\n return {\r\n kind: \"page-leave\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n userClicked(data: {\r\n pageId: string;\r\n pagePrefix: string;\r\n action: string;\r\n descriptions: string;\r\n }): MqEventUserClicked {\r\n const { pageId, pagePrefix, action, descriptions } = data;\r\n return {\r\n kind: \"user-clicked\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix, action, descriptions },\r\n };\r\n },\r\n} as const;\r\n","import { DElement } from \"../Delement/DElement\";\r\nimport { TaskManager } from \"./task-manager\";\r\nimport { createDElement } from \"../Delement/element-factory\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { Task } from \"./task\";\r\nimport { PStyle } from \"../Delement/DStyle\";\r\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\r\nimport { DElementDto } from \"../Delement/DElement.dto\";\r\nimport { Fact } from \"../rules/fact\";\r\nimport { DTimestamp } from \"../common/DTimestamp\";\r\nimport { PageResult } from \"./page-result\";\r\nimport { TaskState } from \"./task-state\";\r\nimport { MqEvent } from \"../events/mq-events\";\r\n\r\nexport interface VideoPlayerDto {\r\n playUrl: string;\r\n style?: PStyle;\r\n}\r\n\r\nexport interface PageDto {\r\n readonly id: string;\r\n readonly prefix: string;\r\n readonly tags: string[];\r\n background: string;\r\n elements: Array<DElementDto>;\r\n videoPlayer?: VideoPlayerDto;\r\n initialTasks: Array<Task>;\r\n}\r\n\r\nexport const PageDto = {\r\n createDummy: (id: number): PageDto => {\r\n return {\r\n id: \"id\" + id,\r\n prefix: \"prefix\" + id,\r\n tags: [],\r\n background: \"white\",\r\n elements: [\r\n {\r\n _tag: \"div\",\r\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\r\n children: [],\r\n innerText: \"Next btn \" + id,\r\n },\r\n ],\r\n\r\n initialTasks: [],\r\n };\r\n },\r\n};\r\n\r\nexport class Page {\r\n private readonly TAG = \"[ DPage ]: \";\r\n private elements: DElement<HTMLElement>[] = [];\r\n // private elements: PageComponent[] = [];\r\n // private layoutComponents: PageLayoutComponent[] = [];\r\n private pageEntered: DTimestamp = DTimestamp.now();\r\n private previousState: TaskState | false = false;\r\n private eventLog = new Array<MqEvent>();\r\n\r\n constructor(\r\n private readonly dto: PageDto,\r\n private readonly taskManager: TaskManager,\r\n private readonly scaleService: ScaleService,\r\n private readonly onCompleted: (result: PageResult) => void,\r\n ) {\r\n dto.elements.forEach((el) => {\r\n const element = createDElement(el, scaleService);\r\n // if (element instanceof DDiv) {\r\n // }\r\n element.registerClickHandler((action) => {\r\n this.handleButtonAction(action);\r\n });\r\n\r\n this.elements.push(element);\r\n\r\n // if(element.)\r\n // element= (action) => {\r\n // console.log(\"TODO ONCLICK \");\r\n // this.handleButtonAction(action);\r\n // };\r\n // this.elements.push(element);\r\n });\r\n\r\n if (dto.videoPlayer) {\r\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\r\n if (dto.videoPlayer.style) {\r\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\r\n }\r\n }\r\n\r\n if (dto.initialTasks.length) {\r\n this.taskManager.autoPlaySequence(dto.initialTasks);\r\n }\r\n }\r\n\r\n private createPageResult(facts: Fact[]): PageResult {\r\n const pageExited = DTimestamp.now();\r\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\r\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);\r\n this.eventLog.push(pageExit);\r\n const eventLog = [...this.eventLog];\r\n return {\r\n pagePrefix: this.dto.prefix,\r\n pageId: this.dto.id,\r\n eventLog,\r\n pageTime,\r\n collectedFacts: facts,\r\n };\r\n }\r\n private handleButtonAction(a: ButtonClickAction) {\r\n const event = MqEvent.userClicked({\r\n pageId: this.dto.id,\r\n pagePrefix: this.dto.prefix,\r\n action: a.kind,\r\n descriptions: ButtonClickAction.describe(a),\r\n });\r\n this.eventLog.push(event);\r\n navigator.vibrate(200);\r\n const { vibrateMs } = a;\r\n if (vibrateMs) {\r\n navigator.vibrate(vibrateMs);\r\n }\r\n\r\n switch (a.kind) {\r\n case \"next-page\":\r\n const nextPageResult = this.createPageResult([]);\r\n this.onCompleted(nextPageResult);\r\n break;\r\n case \"play-video\":\r\n this.taskManager.execute(a.task);\r\n break;\r\n case \"play-audio\":\r\n this.taskManager.execute(a.task);\r\n break;\r\n case \"pause-video\":\r\n this.taskManager.pauseVideo();\r\n break;\r\n case \"pause-audio\":\r\n this.taskManager.pauseAudio();\r\n break;\r\n case \"mute-video\":\r\n this.taskManager.muteVideo();\r\n break;\r\n case \"un-mute-video\":\r\n this.taskManager.unMuteVideo();\r\n break;\r\n case \"submit-fact\":\r\n const submitFactResult = this.createPageResult([a.fact]);\r\n this.onCompleted(submitFactResult);\r\n break;\r\n case \"submit-form\":\r\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\r\n const submitFormResult = this.createPageResult([]);\r\n this.onCompleted(submitFormResult);\r\n break;\r\n default:\r\n const _exhaustiveCheck: never = a;\r\n console.log(_exhaustiveCheck);\r\n }\r\n }\r\n\r\n appendYourself(parent: HTMLElement) {\r\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);\r\n this.pageEntered = DTimestamp.now();\r\n this.eventLog.push(pageEnterEvent);\r\n this.elements.forEach((el) => {\r\n el.appendYourself(parent);\r\n });\r\n\r\n\r\n // this.components.forEach((comp) => {\r\n // comp.appendToParent(parent);\r\n // });\r\n // this.layoutComponents.forEach((comp) => {\r\n // comp.appendToParent(parent);\r\n // });\r\n }\r\n\r\n destroy() {\r\n this.taskManager.clear();\r\n }\r\n\r\n tick() {\r\n const prev = this.previousState;\r\n const curr = this.taskManager.getState();\r\n const diff = TaskState.getDiff(curr, prev);\r\n this.elements.forEach((element) => {\r\n element.updateState(diff);\r\n });\r\n }\r\n\r\n getComputedStyles() {\r\n return this.elements.map(e => {\r\n return e.getComputedStyle();\r\n })\r\n }\r\n}\r\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\r\nimport { Task } from \"./task\";\r\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\r\nimport { ScaleService } from \"../engine/scale\";\r\nimport { TaskState } from \"./task-state\";\r\n\r\nexport class TaskManager {\r\n private readonly TAG = \"[TaskManager]: \";\r\n private readonly videoElement = document.createElement(\"video\");\r\n private readonly audioElement = document.createElement(\"audio\");\r\n private readonly showConsoleLogs = false;\r\n private readonly defaultVideoStyles: PStyle = {\r\n height: 50,\r\n width: 100,\r\n top: 0,\r\n left: 0,\r\n };\r\n private videoStyles: PStyle;\r\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\r\n private taskList: Array<Task> = [];\r\n private delayRef: number | false = false;\r\n\r\n clear() {\r\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\r\n if (typeof this.delayRef === \"number\") {\r\n window.clearTimeout(this.delayRef);\r\n }\r\n\r\n this.pauseVideo();\r\n this.pauseAudio();\r\n this.videoElement.removeAttribute(\"src\");\r\n this.videoElement.load();\r\n this.audioElement.removeAttribute(\"src\");\r\n this.audioElement.load();\r\n this.taskList = [];\r\n this.runningTask = false;\r\n this.hideVideo();\r\n }\r\n\r\n getState(): TaskState {\r\n const c = this.runningTask;\r\n const isGifMode = this.videoElement.loop;\r\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\r\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\r\n const blockResponseButton = c && c.task.blockResponseButton;\r\n const blockAudio = c && c.task.blockAudio;\r\n const blockVideo = c && c.task.blockVideo;\r\n const blockFormInput = c && c.task.blockFormInput;\r\n const videoIsMuted = this.videoElement.muted;\r\n\r\n const videoIsAtTheEnd = this.videoElement.ended;\r\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\r\n\r\n if (videoIsPlaying) {\r\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\r\n }\r\n if (videoIsAtTheEnd) {\r\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\r\n }\r\n\r\n return {\r\n audioIsPlaying,\r\n videoPlayState,\r\n isGifMode,\r\n blockFormInput,\r\n blockResponseButton,\r\n blockAudio,\r\n blockVideo,\r\n };\r\n }\r\n\r\n constructor(\r\n private readonly mediaLayer: HTMLDivElement,\r\n private readonly scale: ScaleService,\r\n private readonly onError: (error: string) => void,\r\n ) {\r\n this.hideVideo();\r\n this.mediaLayer.appendChild(this.videoElement);\r\n this.mediaLayer.appendChild(this.audioElement);\r\n this.videoStyles = this.defaultVideoStyles;\r\n DStyle.normalize(this.videoElement);\r\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\r\n\r\n this.videoElement.onended = () => {\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n } else {\r\n this.runningTask = false;\r\n }\r\n };\r\n this.videoElement.onerror = (e) => {\r\n if (this.videoElement.src !== \"\") {\r\n onError(\"Error playing video: \" + this.videoElement.src);\r\n }\r\n };\r\n\r\n this.audioElement.onended = () => {\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n } else {\r\n this.runningTask = false;\r\n }\r\n };\r\n }\r\n\r\n execute(task: Task): boolean {\r\n // console.log(\"EXECUTE TASK\" + task.kind);\r\n const curr = this.runningTask;\r\n // TODO Background-task should be handeled as its own kind or something.\r\n let isBackgroundTask = false;\r\n\r\n // Check if we should remove the current task.\r\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\r\n this.pauseAudio();\r\n this.pauseVideo();\r\n this.runningTask = false;\r\n }\r\n\r\n if (!curr) {\r\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\r\n } else if (Task.notEq(curr.task, task)) {\r\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\r\n }\r\n\r\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\r\n this.taskList = [];\r\n }\r\n\r\n // STARTING PLAY VIDEO\r\n if (task.kind === \"play-video-task\") {\r\n this.showVideo();\r\n // this.pauseAudio()\r\n this.loadVideo(task.url);\r\n if (task.loop) {\r\n this.videoElement.loop = true;\r\n isBackgroundTask = true;\r\n } else {\r\n this.videoElement.loop = false;\r\n }\r\n\r\n try {\r\n this.videoElement.play();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n // STARTING PLAY AUDIO\r\n if (task.kind === \"play-audio-task\") {\r\n if (!this.videoElement.loop) {\r\n this.pauseVideo();\r\n }\r\n if (task.url !== this.audioElement.src) {\r\n this.audioElement.src = task.url;\r\n }\r\n this.audioElement.play();\r\n }\r\n\r\n if (task.kind === \"delay-task\") {\r\n if (typeof this.delayRef === \"number\") {\r\n window.clearTimeout(this.delayRef);\r\n }\r\n this.delayRef = window.setTimeout(() => {\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n } else {\r\n this.runningTask = false;\r\n }\r\n }, task.duration);\r\n }\r\n\r\n if (isBackgroundTask) {\r\n const startNextTask = this.getNextTask();\r\n if (startNextTask) {\r\n this.execute(startNextTask);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n setVideoStyles(styles: PStyle) {\r\n this.videoStyles = { ...styles };\r\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\r\n }\r\n\r\n autoPlaySequence(tasks: Task[]) {\r\n this.taskList = [...tasks];\r\n const next = this.getNextTask();\r\n if (next) {\r\n this.execute(next);\r\n if (next.kind === \"play-video-task\" && next.loop) {\r\n this.videoElement.loop = true;\r\n }\r\n }\r\n }\r\n\r\n loadVideo(url: string) {\r\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\r\n if (this.videoElement.src !== url) {\r\n this.videoElement.src = url;\r\n }\r\n this.showVideo();\r\n }\r\n\r\n private playVideoElement() {\r\n this.videoElement\r\n .play()\r\n .then(() => {})\r\n .catch((e) => {\r\n console.log(e);\r\n this.onError(\"Error playing video.\");\r\n });\r\n }\r\n\r\n private showVideo() {\r\n this.videoElement.style.display = \"block\";\r\n }\r\n\r\n private hideVideo() {\r\n this.videoElement.style.display = \"none\";\r\n }\r\n\r\n pauseVideo() {\r\n try {\r\n if (!this.videoElement.loop) {\r\n this.videoElement.pause();\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n this.onError(\"Error pausing video.\");\r\n }\r\n }\r\n\r\n pauseAudio() {\r\n try {\r\n if (!this.audioElement.loop) {\r\n this.audioElement.pause();\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n this.onError(\"Error pausing audio.\");\r\n }\r\n }\r\n\r\n private getNextTask(): Task | false {\r\n // console.log(\"Getting next task.\");\r\n // console.log(this.taskList);\r\n const first = this.taskList.shift();\r\n return first ?? false;\r\n }\r\n\r\n muteVideo() {\r\n this.videoElement.muted = true;\r\n }\r\n\r\n unMuteVideo() {\r\n this.videoElement.muted = false;\r\n }\r\n}\r\n","import { SchemaDto } from \"./SchemaDto\";\r\nimport { DPlayer } from \"./dplayer\";\r\nimport { ScaleService } from \"./scale\";\r\nimport { Page } from \"../page/Page\";\r\nimport { TaskManager } from \"../page/task-manager\";\r\nimport { PageResult } from \"../page/page-result\";\r\nimport { SchemaResult } from \"./SchemaResult\";\r\nexport interface EngineLogger {\r\n info(message: string): void;\r\n error(message: string): void;\r\n warn(message: string): void;\r\n}\r\n\r\nconst voidLogger: EngineLogger = {\r\n info: (message: string) => {},\r\n error: (message: string) => {},\r\n warn: (message: string) => {},\r\n};\r\n\r\nexport interface ISchemaEngine {\r\n onProgress(handler: (result: SchemaResult) => void): void;\r\n onFatalError(handler: (error: { message: string }) => void): void;\r\n setLogger(logger: EngineLogger): void;\r\n}\r\n\r\nexport class SchemaEngine implements ISchemaEngine {\r\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\r\n private readonly scale: ScaleService;\r\n private readonly hostElement: HTMLDivElement;\r\n private readonly taskManager: TaskManager;\r\n private logger: EngineLogger = voidLogger;\r\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\r\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\r\n private player: DPlayer;\r\n private currentPage: Page | false = false;\r\n private readonly tickerRef: number | false = false;\r\n constructor(\r\n hostEl: HTMLDivElement,\r\n private readonly height: number,\r\n private readonly width: number,\r\n private readonly schema: SchemaDto,\r\n ) {\r\n this.tickerRef = window.setInterval(() => {\r\n if (this.currentPage) {\r\n this.currentPage.tick();\r\n }\r\n }, 100);\r\n this.hostElement = hostEl;\r\n this.hostElement.appendChild(this.mediaLayer);\r\n this.hostElement.appendChild(this.uiLayer);\r\n this.scale = new ScaleService({\r\n baseHeight: schema.baseHeight,\r\n baseWidth: schema.baseWidth,\r\n containerWidth: this.width,\r\n containerHeight: this.height,\r\n });\r\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\r\n this.player = new DPlayer(this.schema);\r\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\r\n console.log(error);\r\n });\r\n\r\n this.styleSelf();\r\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\r\n this.nextPage();\r\n }\r\n\r\n private handlePageCompleted(result: PageResult) {\r\n // 1 Save data from last page\r\n this.player.saveHistory(result);\r\n\r\n // 2 Emit progress\r\n const currentResults = this.player.getResults();\r\n const a: SchemaResult = {\r\n schemaId: this.schema.id,\r\n pagesLeft: currentResults.pagesLeft,\r\n predefinedFacts: currentResults.predefinedFacts,\r\n eventLog: currentResults.eventLog,\r\n answers: currentResults.answerFacts,\r\n };\r\n if (this._onProgress) {\r\n this._onProgress(a);\r\n }\r\n\r\n // 3. Next page\r\n this.nextPage();\r\n }\r\n\r\n private styleSelf() {\r\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\r\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\r\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\r\n this.hostElement.style.position = \"relative\";\r\n // this.hostElement.style.overflow = \"hidden\";\r\n const makeStatic = (div: HTMLDivElement) => {\r\n div.style.height = \"0px\";\r\n div.style.width = \"0px\";\r\n div.style.position = \"static\";\r\n };\r\n\r\n makeStatic(this.uiLayer);\r\n this.uiLayer.style.zIndex = \"10\";\r\n this.mediaLayer.style.zIndex = \"8\";\r\n makeStatic(this.mediaLayer);\r\n }\r\n\r\n private nextPage() {\r\n const nextPage = this.player.getNextPage();\r\n if (this.currentPage) {\r\n this.currentPage.destroy();\r\n this.uiLayer.innerHTML = \"\";\r\n }\r\n\r\n // console.log(nextPage);\r\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\r\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\r\n }\r\n\r\n if (!nextPage) {\r\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\r\n this.player = new DPlayer(this.schema);\r\n if (this.player.pagesLeft > 0) {\r\n this.nextPage();\r\n }\r\n return false;\r\n }\r\n\r\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\r\n this.handlePageCompleted(result);\r\n });\r\n this.currentPage = newPage;\r\n newPage.appendYourself(this.uiLayer);\r\n return true;\r\n }\r\n\r\n destroy() {\r\n if (this.currentPage) {\r\n this.currentPage.destroy();\r\n this.uiLayer.innerHTML = \"\";\r\n }\r\n }\r\n\r\n private _onProgress: ((result: SchemaResult) => void) | false = false;\r\n onProgress(handler: (result: SchemaResult) => void) {\r\n this._onProgress = handler;\r\n }\r\n\r\n private _onFatalError: ((error: { message: string }) => void) | false = false;\r\n onFatalError(handler: (error: { message: string }) => void): void {\r\n this._onFatalError = handler;\r\n }\r\n setLogger(logger: EngineLogger) {\r\n this.logger = logger;\r\n }\r\n\r\n getComputedStylesOfCurrentPage() {\r\n return this.currentPage ? this.currentPage.getComputedStyles(): false;\r\n }\r\n}\r\n"],"mappings":"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","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@media-quest/engine",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "description": "Rendering engine for media-quest schemas.",
5
5
  "main": "dist/public-api.js",
6
6
  "types": "dist/public-api.d.ts",
@@ -180,6 +180,14 @@ export abstract class DElement<T extends HTMLElement> {
180
180
  // this.el.style.boxSizing = "border-box";
181
181
  // }
182
182
 
183
+ getComputedStyle() {
184
+ const el = this.el;
185
+ const isConnected = this.el.isConnected;
186
+
187
+ return window.getComputedStyle(this.el);
188
+
189
+ }
190
+
183
191
  abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;
184
192
 
185
193
  protected updateStyles(style: Partial<DStyle>) {
@@ -93,6 +93,7 @@ export interface DStyle {
93
93
  export namespace DStyle {
94
94
  // import isNumber = DUtil.isNumber;
95
95
  import isLengthUnit = DCss.isLengthUnit;
96
+ // export const isP
96
97
  export const normalize = <T extends HTMLElement>(el: T): T => {
97
98
  const s = el.style;
98
99
  s.position = "absolute";
@@ -110,6 +111,7 @@ export namespace DStyle {
110
111
  s.flex = "none";
111
112
 
112
113
  s.boxShadow = "";
114
+ s.fontFamily = "'Inter', sans-serif"
113
115
  s.fontSize = "12px";
114
116
  s.lineHeight = "1";
115
117
  s.textAlign = "center";
@@ -371,6 +373,10 @@ export namespace DStyle {
371
373
  return el;
372
374
  };
373
375
 
376
+ export const clone = <T extends PStyle>(style: T): T => {
377
+ return JSON.parse(JSON.stringify(style));
378
+ }
379
+
374
380
  // const propNames = new Set(...ElementKeyNames);
375
381
  // export const validKey = (keyName: string) => propNames.has(keyName);
376
382
  }
@@ -6,7 +6,20 @@ export namespace DCss {
6
6
  readonly value: number;
7
7
  }
8
8
 
9
+
9
10
  export type LengthString = `${number}px` | `${number}%`;
11
+ export const isPx = (unit?: LengthUnit | false | undefined | null): unit is Px => {
12
+ if(typeof unit === "number") return false;
13
+ if(!unit) return false;
14
+ return (unit._unit === "px");
15
+ }
16
+ export const isPercent = (unit?: LengthUnit | false | undefined | null): unit is Percent => {
17
+ if(typeof unit === "number") return false;
18
+ if(!unit) return false;
19
+ return (unit._unit === "percent");
20
+ }
21
+
22
+
10
23
  export interface Percent {
11
24
  readonly _unit: "percent";
12
25
  readonly value: number;
@@ -24,6 +37,7 @@ export namespace DCss {
24
37
  typeof unit === "number" ? { _unit: "percent", value: unit } : unit;
25
38
  return _toString(_mapped, scale);
26
39
  };
40
+
27
41
  const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {
28
42
  const clampedScale = Math.max(scale, 0.03);
29
43
  if (unit._unit === "px") {
@@ -152,4 +152,8 @@ export class SchemaEngine implements ISchemaEngine {
152
152
  setLogger(logger: EngineLogger) {
153
153
  this.logger = logger;
154
154
  }
155
+
156
+ getComputedStylesOfCurrentPage() {
157
+ return this.currentPage ? this.currentPage.getComputedStyles(): false;
158
+ }
155
159
  }
package/src/page/Page.ts CHANGED
@@ -167,6 +167,7 @@ export class Page {
167
167
  el.appendYourself(parent);
168
168
  });
169
169
 
170
+
170
171
  // this.components.forEach((comp) => {
171
172
  // comp.appendToParent(parent);
172
173
  // });
@@ -187,4 +188,10 @@ export class Page {
187
188
  element.updateState(diff);
188
189
  });
189
190
  }
191
+
192
+ getComputedStyles() {
193
+ return this.elements.map(e => {
194
+ return e.getComputedStyle();
195
+ })
196
+ }
190
197
  }
@@ -65,9 +65,6 @@ export namespace DUtil {
65
65
  return false;
66
66
  }
67
67
 
68
- if (obj === null) {
69
- return false;
70
- }
71
68
  return true;
72
69
  };
73
70
 
@@ -113,4 +110,6 @@ export namespace DUtil {
113
110
  return Math.min(value, lowerLimit);
114
111
  };
115
112
  };
113
+
114
+
116
115
  }