@pie-element/multiple-choice 13.3.5-ng.0 → 13.3.6

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.
Files changed (133) hide show
  1. package/CHANGELOG.json +1972 -0
  2. package/CHANGELOG.md +2778 -0
  3. package/LICENSE.md +5 -0
  4. package/PRINT.md +35 -0
  5. package/README.md +56 -0
  6. package/choice.png +0 -0
  7. package/configure/CHANGELOG.json +1387 -0
  8. package/configure/CHANGELOG.md +2114 -0
  9. package/configure/lib/__tests__/root.test.js +279 -0
  10. package/configure/lib/defaults.js +203 -0
  11. package/configure/lib/defaults.js.map +1 -0
  12. package/configure/lib/index.js +203 -0
  13. package/configure/lib/index.js.map +1 -0
  14. package/configure/lib/main.js +484 -0
  15. package/configure/lib/main.js.map +1 -0
  16. package/configure/lib/utils.js +18 -0
  17. package/configure/lib/utils.js.map +1 -0
  18. package/configure/package.json +22 -0
  19. package/controller/CHANGELOG.json +527 -0
  20. package/controller/CHANGELOG.md +1423 -0
  21. package/controller/lib/__tests__/index.test.js +561 -0
  22. package/controller/lib/__tests__/utils.test.js +8 -0
  23. package/controller/lib/defaults.js +33 -0
  24. package/controller/lib/defaults.js.map +1 -0
  25. package/controller/lib/index.js +298 -0
  26. package/controller/lib/index.js.map +1 -0
  27. package/controller/lib/utils.js +15 -0
  28. package/controller/lib/utils.js.map +1 -0
  29. package/controller/package.json +15 -0
  30. package/docs/config-schema.json +2993 -0
  31. package/docs/config-schema.json.md +2217 -0
  32. package/docs/demo/config.js +8 -0
  33. package/docs/demo/generate.js +61 -0
  34. package/docs/demo/index.html +1 -0
  35. package/docs/demo/pie.manifest.json +11 -0
  36. package/docs/demo/session.js +7 -0
  37. package/docs/pie-schema.json +1332 -0
  38. package/docs/pie-schema.json.md +1015 -0
  39. package/lib/__tests__/choice-input-test.js +49 -0
  40. package/lib/__tests__/choice-input.test.js +49 -0
  41. package/lib/__tests__/index-test.js +206 -0
  42. package/lib/__tests__/index.test.js +221 -0
  43. package/lib/__tests__/key-events-test.js +95 -0
  44. package/lib/__tests__/key-events.test.js +107 -0
  45. package/lib/__tests__/multiple-choice-test.js +101 -0
  46. package/lib/__tests__/multiple-choice.test.js +256 -0
  47. package/lib/__tests__/session-updater-test.js +70 -0
  48. package/lib/__tests__/session-updater.test.js +70 -0
  49. package/lib/choice-input.js +383 -0
  50. package/lib/choice-input.js.map +1 -0
  51. package/lib/choice.js +192 -0
  52. package/lib/choice.js.map +1 -0
  53. package/lib/feedback-tick.js +134 -0
  54. package/lib/feedback-tick.js.map +1 -0
  55. package/lib/index.js +405 -0
  56. package/lib/index.js.map +1 -0
  57. package/lib/main.js +63 -0
  58. package/lib/main.js.map +1 -0
  59. package/lib/multiple-choice.js +399 -0
  60. package/lib/multiple-choice.js.map +1 -0
  61. package/lib/print.js +94 -0
  62. package/lib/print.js.map +1 -0
  63. package/lib/session-updater.js +37 -0
  64. package/lib/session-updater.js.map +1 -0
  65. package/lib/utils.js +14 -0
  66. package/lib/utils.js.map +1 -0
  67. package/module/configure.js +1 -0
  68. package/module/controller.js +3045 -0
  69. package/module/demo.js +86 -0
  70. package/module/element.js +1 -0
  71. package/module/index.html +21 -0
  72. package/module/manifest.json +14 -0
  73. package/module/print-demo.js +124 -0
  74. package/module/print.html +18 -0
  75. package/module/print.js +1 -17945
  76. package/package.json +28 -94
  77. package/configure.js +0 -2
  78. package/controller.js +0 -1
  79. package/dist/author/defaults.d.ts +0 -205
  80. package/dist/author/defaults.js +0 -151
  81. package/dist/author/index.d.ts +0 -26
  82. package/dist/author/index.js +0 -119
  83. package/dist/author/main.d.ts +0 -34
  84. package/dist/author/main.js +0 -287
  85. package/dist/author/utils.d.ts +0 -9
  86. package/dist/author/utils.js +0 -7
  87. package/dist/browser/Radio-Bbu0BH_k.js +0 -9581
  88. package/dist/browser/Radio-Bbu0BH_k.js.map +0 -1
  89. package/dist/browser/author/index.js +0 -37436
  90. package/dist/browser/author/index.js.map +0 -1
  91. package/dist/browser/controller/index.js +0 -204
  92. package/dist/browser/controller/index.js.map +0 -1
  93. package/dist/browser/delivery/index.js +0 -251
  94. package/dist/browser/delivery/index.js.map +0 -1
  95. package/dist/browser/dist-CHbLnyuX.js +0 -111
  96. package/dist/browser/dist-CHbLnyuX.js.map +0 -1
  97. package/dist/browser/main-DahQxQZC.js +0 -2451
  98. package/dist/browser/main-DahQxQZC.js.map +0 -1
  99. package/dist/browser/multiple-choice.css +0 -2
  100. package/dist/browser/print/index.js +0 -43
  101. package/dist/browser/print/index.js.map +0 -1
  102. package/dist/controller/defaults.d.ts +0 -35
  103. package/dist/controller/defaults.js +0 -29
  104. package/dist/controller/index.d.ts +0 -65
  105. package/dist/controller/index.js +0 -129
  106. package/dist/controller/utils.d.ts +0 -10
  107. package/dist/controller/utils.js +0 -8
  108. package/dist/delivery/choice-input.d.ts +0 -44
  109. package/dist/delivery/choice-input.js +0 -280
  110. package/dist/delivery/choice.d.ts +0 -20
  111. package/dist/delivery/choice.js +0 -105
  112. package/dist/delivery/feedback-tick.d.ts +0 -20
  113. package/dist/delivery/feedback-tick.js +0 -104
  114. package/dist/delivery/index.d.ts +0 -37
  115. package/dist/delivery/index.js +0 -215
  116. package/dist/delivery/main.d.ts +0 -31
  117. package/dist/delivery/main.js +0 -51
  118. package/dist/delivery/multiple-choice.d.ts +0 -61
  119. package/dist/delivery/multiple-choice.js +0 -245
  120. package/dist/delivery/session-updater.d.ts +0 -10
  121. package/dist/delivery/session-updater.js +0 -9
  122. package/dist/delivery/utils.d.ts +0 -10
  123. package/dist/delivery/utils.js +0 -4
  124. package/dist/index.d.ts +0 -1
  125. package/dist/index.iife.d.ts +0 -8
  126. package/dist/index.iife.js +0 -148
  127. package/dist/index.js +0 -2
  128. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +0 -16
  129. package/dist/print/index.d.ts +0 -15
  130. package/dist/print/index.js +0 -43
  131. package/dist/runtime-support.d.ts +0 -12
  132. package/dist/runtime-support.js +0 -12
  133. package/module/print.js.map +0 -1
@@ -1,20 +0,0 @@
1
- /**
2
- * @synced-from pie-elements/packages/multiple-choice/src/choice.jsx
3
- * @auto-generated
4
- *
5
- * This file is automatically synced from pie-elements and converted to TypeScript.
6
- * Manual edits will be overwritten on next sync.
7
- * To make changes, edit the upstream JavaScript file and run sync again.
8
- */
9
- import React from 'react';
10
- export declare class Choice extends React.Component {
11
- static propTypes: {};
12
- state: {
13
- isHovered: boolean;
14
- };
15
- handleMouseEnter: any;
16
- handleMouseLeave: any;
17
- onChange: any;
18
- render(): React.JSX.Element;
19
- }
20
- export default Choice;
@@ -1,105 +0,0 @@
1
- import { ChoiceInput as e } from "./choice-input.js";
2
- import t from "react";
3
- import n from "prop-types";
4
- import { jsx as r } from "react/jsx-runtime";
5
- import { styled as i } from "@mui/material/styles";
6
- import a from "@mui/material/Box";
7
- //#region src/delivery/choice.tsx
8
- var o = i(a, { shouldForwardProp: (e) => e !== "noBorder" && e !== "horizontalLayout" })(({ theme: e, noBorder: t, horizontalLayout: n }) => ({
9
- paddingTop: e.spacing(2.5),
10
- paddingBottom: `calc(${e.spacing(1)} + 2px)`,
11
- paddingLeft: `calc(${e.spacing(1)} + 2px)`,
12
- paddingRight: `calc(${e.spacing(1)} + 2px)`,
13
- borderBottom: t ? "none" : `1px solid ${e.palette.grey[300]}`,
14
- ...n && {
15
- paddingRight: e.spacing(2.5),
16
- "& label": { marginRight: e.spacing(1) }
17
- }
18
- })), s = class extends t.Component {
19
- static propTypes = {};
20
- state = { isHovered: !1 };
21
- handleMouseEnter = () => {
22
- let { disabled: e, checked: t } = this.props;
23
- !e && !t && this.setState({ isHovered: !0 });
24
- };
25
- handleMouseLeave = () => {
26
- this.setState({ isHovered: !1 });
27
- };
28
- onChange = (e) => {
29
- let { disabled: t, onChoiceChanged: n } = this.props;
30
- t || n(e);
31
- };
32
- render() {
33
- let { choice: t, index: n, choicesLength: i, showCorrect: a, isEvaluateMode: s, choiceMode: c, disabled: l, checked: u, correctness: d, displayKey: f, choicesLayout: p, gridColumns: m, isSelectionButtonBelow: h, selectedAnswerBackgroundColor: g, selectedAnswerStrokeColor: _, selectedAnswerStrokeWidth: v, hoverAnswerBackgroundColor: y, hoverAnswerStrokeColor: b, hoverAnswerStrokeWidth: x, tagName: S } = this.props, { isHovered: C } = this.state, w = "choice" + (n === i - 1 ? " last" : ""), T = !s || a ? "" : t.feedback, E = {
34
- ...t,
35
- checked: u,
36
- choiceMode: c,
37
- disabled: l,
38
- feedback: T,
39
- correctness: d,
40
- displayKey: f,
41
- index: n,
42
- choicesLayout: p,
43
- gridColumns: m,
44
- onChange: this.onChange,
45
- isEvaluateMode: s,
46
- isSelectionButtonBelow: h,
47
- selectedAnswerStrokeColor: _,
48
- selectedAnswerStrokeWidth: v,
49
- tagName: S
50
- }, D = (e) => {
51
- if (!e) return "2px";
52
- let t = String(e).trim();
53
- return /^\d+(\.\d+)?$/.test(t) ? `${t}px` : t;
54
- }, O = _ && _ !== "initial", k = b && b !== "initial", A = "transparent", j = "2px", M = "initial";
55
- (O || k) && (u && O ? (A = _, j = v) : C && !l && k && (A = b, j = x)), u && g && g !== "initial" ? M = g : C && !l && y && y !== "initial" && (M = y);
56
- let N = O || k, P = N ? {
57
- border: `${D(j)} solid ${A}`,
58
- borderRadius: "8px"
59
- } : {}, F = n === i - 1 || p !== "vertical" || N, I = p === "horizontal";
60
- return /* @__PURE__ */ r("div", {
61
- className: w,
62
- style: {
63
- backgroundColor: M === "initial" ? "initial" : M,
64
- ...P
65
- },
66
- onMouseEnter: this.handleMouseEnter,
67
- onMouseLeave: this.handleMouseLeave,
68
- children: /* @__PURE__ */ r(o, {
69
- component: "div",
70
- noBorder: F,
71
- horizontalLayout: I,
72
- children: /* @__PURE__ */ r(e, { ...E })
73
- })
74
- }, n);
75
- }
76
- };
77
- s.propTypes = {
78
- choiceMode: n.oneOf(["radio", "checkbox"]),
79
- choice: n.object,
80
- disabled: n.bool.isRequired,
81
- onChoiceChanged: n.func,
82
- index: n.number,
83
- choicesLength: n.number,
84
- showCorrect: n.bool,
85
- isEvaluateMode: n.bool,
86
- checked: n.bool,
87
- correctness: n.string,
88
- displayKey: n.string,
89
- choicesLayout: n.oneOf([
90
- "vertical",
91
- "grid",
92
- "horizontal"
93
- ]),
94
- gridColumns: n.string,
95
- selectedAnswerBackgroundColor: n.string,
96
- selectedAnswerStrokeColor: n.string,
97
- selectedAnswerStrokeWidth: n.string,
98
- hoverAnswerBackgroundColor: n.string,
99
- hoverAnswerStrokeColor: n.string,
100
- hoverAnswerStrokeWidth: n.string,
101
- tagName: n.string,
102
- isSelectionButtonBelow: n.bool
103
- };
104
- //#endregion
105
- export { s as Choice, s as default };
@@ -1,20 +0,0 @@
1
- /**
2
- * @synced-from pie-elements/packages/multiple-choice/src/feedback-tick.jsx
3
- * @auto-generated
4
- *
5
- * This file is automatically synced from pie-elements and converted to TypeScript.
6
- * Manual edits will be overwritten on next sync.
7
- * To make changes, edit the upstream JavaScript file and run sync again.
8
- */
9
- import React from 'react';
10
- import PropTypes from 'prop-types';
11
- declare class FeedbackTick extends React.Component {
12
- static propTypes: {
13
- correctness: PropTypes.Requireable<string>;
14
- };
15
- constructor(props: any);
16
- getIncorrectIcon: () => React.JSX.Element;
17
- getCorrectIcon: () => React.JSX.Element;
18
- render(): React.JSX.Element;
19
- }
20
- export default FeedbackTick;
@@ -1,104 +0,0 @@
1
- import e from "react";
2
- import t from "prop-types";
3
- import { color as n } from "@pie-lib/render-ui";
4
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
- import { styled as a } from "@mui/material/styles";
6
- import o from "@mui/material/Box";
7
- import { CSSTransition as s, TransitionGroup as c } from "react-transition-group";
8
- //#region src/delivery/feedback-tick.tsx
9
- var l = a(o)({
10
- width: "33px",
11
- height: "33px",
12
- "& svg": {
13
- position: "absolute",
14
- display: "inline-block",
15
- width: "33px",
16
- height: "33px",
17
- verticalAlign: "middle",
18
- "& hide": { display: "none" }
19
- }
20
- }), u = a("svg")({
21
- "& .incorrect-fill": { fill: `var(--feedback-incorrect-bg-color, ${n.incorrect()})` },
22
- "& .correct-fill": { fill: `var(--feedback-correct-bg-color, ${n.correct()})` }
23
- }), d = a("div")({
24
- position: "relative",
25
- "&.feedback-tick-enter": {
26
- opacity: "0",
27
- left: "-50px"
28
- },
29
- "&.feedback-tick-enter-active": {
30
- opacity: "1",
31
- left: "0px",
32
- transition: "left 500ms ease-in 200ms, opacity 500ms linear 200ms"
33
- },
34
- "&.feedback-tick-exit": {
35
- opacity: "1",
36
- left: "0px"
37
- },
38
- "&.feedback-tick-exit-active": {
39
- opacity: "0",
40
- left: "-50px",
41
- transition: "left 300ms ease-in, opacity 300ms"
42
- }
43
- }), f = class extends e.Component {
44
- static propTypes = { correctness: t.string };
45
- constructor(t) {
46
- super(t), this.nodeRef = e.createRef();
47
- }
48
- getIncorrectIcon = () => /* @__PURE__ */ r(u, {
49
- preserveAspectRatio: "xMinYMin meet",
50
- x: "0px",
51
- y: "0px",
52
- viewBox: "0 0 44 40",
53
- style: { enableBackground: "new 0 0 44 40" },
54
- children: /* @__PURE__ */ i("g", { children: [/* @__PURE__ */ r("rect", {
55
- x: "11",
56
- y: "17.3",
57
- transform: "matrix(0.7071 -0.7071 0.7071 0.7071 -7.852 19.2507)",
58
- className: "incorrect-fill",
59
- width: "16.6",
60
- height: "3.7"
61
- }), /* @__PURE__ */ r("rect", {
62
- x: "17.4",
63
- y: "10.7",
64
- transform: "matrix(0.7071 -0.7071 0.7071 0.7071 -7.8175 19.209)",
65
- className: "incorrect-fill",
66
- width: "3.7",
67
- height: "16.6"
68
- })] })
69
- }, "1");
70
- getCorrectIcon = () => /* @__PURE__ */ r(u, {
71
- preserveAspectRatio: "xMinYMin meet",
72
- version: "1.1",
73
- x: "0px",
74
- y: "0px",
75
- viewBox: "0 0 44 40",
76
- style: { enableBackground: "new 0 0 44 40" },
77
- children: /* @__PURE__ */ r("polygon", {
78
- className: "correct-fill",
79
- points: "19.1,28.6 11.8,22.3 14.4,19.2 17.9,22.1 23.9,11.4 27.5,13.4"
80
- })
81
- }, "2");
82
- render() {
83
- let { correctness: e } = this.props, t = e === "incorrect" ? this.getIncorrectIcon() : e === "correct" ? this.getCorrectIcon() : null;
84
- return /* @__PURE__ */ r(l, { children: /* @__PURE__ */ r(c, { children: e && /* @__PURE__ */ r(s, {
85
- nodeRef: this.nodeRef,
86
- classNames: {
87
- enter: "feedback-tick-enter",
88
- enterActive: "feedback-tick-enter-active",
89
- exit: "feedback-tick-exit",
90
- exitActive: "feedback-tick-exit-active"
91
- },
92
- timeout: {
93
- enter: 700,
94
- exit: 300
95
- },
96
- children: /* @__PURE__ */ r(d, {
97
- ref: this.nodeRef,
98
- children: t
99
- })
100
- }) }) });
101
- }
102
- };
103
- //#endregion
104
- export { f as default };
@@ -1,37 +0,0 @@
1
- /**
2
- * @synced-from pie-elements/packages/multiple-choice/src/index.js
3
- * @auto-generated
4
- *
5
- * This file is automatically synced from pie-elements and converted to TypeScript.
6
- * Manual edits will be overwritten on next sync.
7
- * To make changes, edit the upstream JavaScript file and run sync again.
8
- */
9
- export declare const isComplete: (session: any, model: any, audioComplete: any, elementContext: any) => boolean;
10
- export default class MultipleChoice extends HTMLElement {
11
- constructor();
12
- _scheduleMathRender: any;
13
- _initMathObserver(): void;
14
- _disconnectMathObserver(): void;
15
- onShowCorrectToggle(): void;
16
- setLangAttribute(): void;
17
- set model(s: any);
18
- get session(): any;
19
- get options(): any;
20
- set options(o: any);
21
- set baseHeadingLevel(level: any);
22
- set includeSrHeading(value: any);
23
- set session(s: any);
24
- _onChange(data: any): void;
25
- _createAudioInfoToast(): HTMLDivElement;
26
- connectedCallback(): void;
27
- enableKeyboardEvents(): void;
28
- _initPlayerObserver(): void;
29
- _disconnectPlayerObserver(): void;
30
- disconnectedCallback(): void;
31
- /**
32
- * Handles global keyboard events for selecting or toggling multiple-choice answers.
33
- * Maps keys (1-9, 0, a-j, A-J) to choices and updates the session state accordingly.
34
- * Ensures valid key presses toggle or select the appropriate choice based on the model.
35
- */
36
- handleKeyDown(event: any): void;
37
- }
@@ -1,215 +0,0 @@
1
- import { exceedsMaxSelections as e } from "./utils.js";
2
- import t from "./main.js";
3
- import { updateSessionMetadata as n, updateSessionValue as r } from "./session-updater.js";
4
- import i from "react";
5
- import * as a from "@pie-lib/render-ui";
6
- import { EnableAudioAutoplayImage as o } from "@pie-lib/render-ui";
7
- import { createRoot as s } from "react-dom/client";
8
- import { debounce as c } from "@pie-element/shared-lodash";
9
- import l from "debug";
10
- import { ModelSetEvent as u, SessionChangedEvent as d } from "@pie-element/shared-player-events";
11
- import { renderMath as f } from "@pie-element/shared-math-rendering-mathjax";
12
- //#region src/delivery/index.ts
13
- function p(e) {
14
- return typeof e == "function" || typeof e == "object" && !!e && typeof e.$$typeof == "symbol";
15
- }
16
- function m(e, t) {
17
- return !e || p(e) ? e : p(e.default) ? e.default : t && p(e[t]) ? e[t] : t && p(e[t]?.default) ? e[t].default : e;
18
- }
19
- var h = m(o, "EnableAudioAutoplayImage") || m(v.EnableAudioAutoplayImage, "EnableAudioAutoplayImage"), g = a, _ = g.default, v = _ && typeof _ == "object" ? _ : g, y = l("pie-ui:multiple-choice"), b = (t, n, r, i) => {
20
- let { autoplayAudioEnabled: a, completeAudioEnabled: o } = n || {};
21
- if (a && o && !r && i) {
22
- let e = i.querySelector("audio"), t = e && e.closest("#preview-prompt");
23
- if (e && t) return !1;
24
- }
25
- if (!t || !t.value) return !1;
26
- let { choiceMode: s, minSelections: c = 1, maxSelections: l } = n || {}, u = t.value.length || 0;
27
- return s === "radio" ? !!u : !(u < c || e(u, l));
28
- };
29
- function x(e) {
30
- let t = e.closest("pie-player") || e.closest("pie-item-player");
31
- if (!t) return {
32
- baseHeadingLevel: void 0,
33
- includeSrHeading: !0
34
- };
35
- let n = (e, n, r) => {
36
- let i = t[e];
37
- return i ??= t.getAttribute(n) ?? t.getAttribute(r), i;
38
- }, r = n("baseHeadingLevel", "base-heading-level", "baseheadinglevel"), i = parseInt(r, 10), a = Number.isFinite(i) && i >= 1 && i <= 6 ? i : void 0, o = n("includeSrHeading", "include-sr-heading", "includesrheading");
39
- return {
40
- baseHeadingLevel: a,
41
- includeSrHeading: o == null || o !== !1 && o !== "false"
42
- };
43
- }
44
- function S(e) {
45
- let t = x(e);
46
- return {
47
- baseHeadingLevel: e._baseHeadingLevel === void 0 ? t.baseHeadingLevel : e._baseHeadingLevel,
48
- includeSrHeading: e._includeSrHeading === void 0 ? t.includeSrHeading : e._includeSrHeading
49
- };
50
- }
51
- var C = class extends HTMLElement {
52
- constructor() {
53
- super(), this._model = null, this._session = null, this._options = null, this.audioComplete = !1, this._boundHandleKeyDown = this.handleKeyDown.bind(this), this._keyboardEventsEnabled = !1, this._audioInitialized = !1, this._root = null, this._mathObserver = null, this._mathRenderPending = !1, this._rerender = c(() => {
54
- if (this._model && this._session) {
55
- var e = i.createElement(t, {
56
- model: this._model,
57
- session: this._session,
58
- options: this._options,
59
- onChoiceChanged: this._onChange.bind(this),
60
- onShowCorrectToggle: this.onShowCorrectToggle.bind(this),
61
- ...S(this)
62
- });
63
- this.setAttribute("aria-label", this._model.choiceMode === "radio" ? "Multiple Choice Question" : "Multiple Correct Answer Question"), this.setAttribute("role", "region"), this.setLangAttribute(), this._initMathObserver(), this._root ||= s(this), this._root.render(e), this._model.keyboardEventsEnabled === !0 && !this._keyboardEventsEnabled && this.enableKeyboardEvents();
64
- } else y("skip");
65
- }, 50, {
66
- leading: !1,
67
- trailing: !0
68
- }), this._dispatchResponseChanged = c(() => {
69
- this.dispatchEvent(new d(this.tagName.toLowerCase(), b(this._session, this._model, this.audioComplete, this)));
70
- }), this._dispatchModelSet = c(() => {
71
- this.dispatchEvent(new u(this.tagName.toLowerCase(), b(this._session, this._model, this.audioComplete, this), this._model !== void 0));
72
- }, 50, {
73
- leading: !1,
74
- trailing: !0
75
- });
76
- }
77
- _scheduleMathRender = () => {
78
- this._mathRenderPending || (this._mathRenderPending = !0, requestAnimationFrame(() => {
79
- this._mathObserver && this._mathObserver.disconnect(), y("render complete - render math"), f(this), this._mathRenderPending = !1, setTimeout(() => {
80
- this._mathObserver && this._mathObserver.observe(this, {
81
- childList: !0,
82
- subtree: !0
83
- });
84
- }, 50);
85
- }));
86
- };
87
- _initMathObserver() {
88
- this._mathObserver || (this._mathObserver = new MutationObserver(this._scheduleMathRender), this._mathObserver.observe(this, {
89
- childList: !0,
90
- subtree: !0
91
- }));
92
- }
93
- _disconnectMathObserver() {
94
- this._mathObserver &&= (this._mathObserver.disconnect(), null);
95
- }
96
- onShowCorrectToggle() {
97
- f(this);
98
- }
99
- setLangAttribute() {
100
- let e = this._model && typeof this._model.language ? this._model.language : "", t = e ? e.slice(0, 2) : "en";
101
- this.setAttribute("lang", t);
102
- }
103
- set model(e) {
104
- this._model = e, this._rerender(), this._audioInitialized = !1, this._dispatchModelSet();
105
- }
106
- get session() {
107
- return this._session;
108
- }
109
- get options() {
110
- return this._options;
111
- }
112
- set options(e) {
113
- this._options = e, this._rerender();
114
- }
115
- set baseHeadingLevel(e) {
116
- this._baseHeadingLevel = e, this._rerender();
117
- }
118
- set includeSrHeading(e) {
119
- this._includeSrHeading = e, this._rerender();
120
- }
121
- set session(e) {
122
- this._session = e, this._rerender(), this._dispatchResponseChanged();
123
- }
124
- _onChange(e) {
125
- r(this._session, this._model.choiceMode, e), this._dispatchResponseChanged(), this._rerender();
126
- }
127
- _createAudioInfoToast() {
128
- let e = document.createElement("div");
129
- e.id = "play-audio-info", Object.assign(e.style, {
130
- position: "absolute",
131
- top: 0,
132
- width: "100%",
133
- height: "100%",
134
- display: "flex",
135
- justifyContent: "center",
136
- alignItems: "center",
137
- background: "white",
138
- zIndex: "1000",
139
- cursor: "pointer"
140
- });
141
- let t = document.createElement("img");
142
- return t.src = h, t.alt = "Click anywhere to enable audio autoplay", t.width = 500, t.height = 300, e.appendChild(t), e;
143
- }
144
- connectedCallback() {
145
- this._initMathObserver(), this._initPlayerObserver(), this._rerender(), new MutationObserver((e, t) => {
146
- e.forEach((e) => {
147
- if (e.type === "childList") {
148
- if (this._audioInitialized) return;
149
- let e = this.querySelector("audio"), r = e && e.closest("#preview-prompt");
150
- if (!this._model || !this._model.autoplayAudioEnabled || e && !r || !e) return;
151
- let i = this._createAudioInfoToast(), a = this.querySelector("#main-container"), o = () => {
152
- this.querySelector("#play-audio-info") && (e.play(), a.removeChild(i)), document.removeEventListener("click", o);
153
- };
154
- setTimeout(() => {
155
- e.paused && !this.querySelector("#play-audio-info") ? (a.appendChild(i), document.addEventListener("click", o)) : document.removeEventListener("click", o);
156
- }, 500);
157
- let s = () => {
158
- n(this._session, { audioStartTime: (/* @__PURE__ */ new Date()).getTime() });
159
- let t = this.querySelector("#play-audio-info");
160
- t && a.removeChild(t), e.removeEventListener("playing", s);
161
- };
162
- e.addEventListener("playing", s);
163
- let c = () => {
164
- n(this._session, { audioEndTime: (/* @__PURE__ */ new Date()).getTime() }), this.audioComplete = !0, this._dispatchResponseChanged(), e.removeEventListener("ended", c);
165
- };
166
- e.addEventListener("ended", c), this._audio = e, this._handlePlaying = s, this._handleEnded = c, this._enableAudio = o, this._audioInitialized = !0, t.disconnect();
167
- }
168
- });
169
- }).observe(this, {
170
- childList: !0,
171
- subtree: !0
172
- });
173
- }
174
- enableKeyboardEvents() {
175
- this._keyboardEventsEnabled ||= (window.addEventListener("keydown", this._boundHandleKeyDown), !0);
176
- }
177
- _initPlayerObserver() {
178
- let e = this.closest("pie-player") || this.closest("pie-item-player");
179
- e && (this._playerObserver = new MutationObserver(() => {
180
- this._rerender();
181
- }), this._playerObserver.observe(e, {
182
- attributes: !0,
183
- attributeFilter: [
184
- "base-heading-level",
185
- "baseheadinglevel",
186
- "include-sr-heading",
187
- "includesrheading"
188
- ]
189
- }));
190
- }
191
- _disconnectPlayerObserver() {
192
- this._playerObserver &&= (this._playerObserver.disconnect(), null);
193
- }
194
- disconnectedCallback() {
195
- this._disconnectMathObserver(), this._disconnectPlayerObserver(), this._keyboardEventsEnabled &&= (window.removeEventListener("keydown", this._boundHandleKeyDown), !1), document.removeEventListener("click", this._enableAudio), this._audio &&= (this._audio.removeEventListener("playing", this._handlePlaying), this._audio.removeEventListener("ended", this._handleEnded), null), this._root &&= (this._root.unmount(), null);
196
- }
197
- handleKeyDown(e) {
198
- if (!this._model || !this._session) return;
199
- let { mode: t } = this._model;
200
- if (t !== "gather") return;
201
- let n = ((e) => {
202
- let t = e >= "1" && e <= "9" ? e - "1" : e === "0" ? 9 : -1, n = /^[a-jA-J]$/.test(e) ? e.toLowerCase().charCodeAt(0) - 97 : -1;
203
- return t >= 0 ? t : n;
204
- })(e.key);
205
- if (n === void 0 || n <= -1 || n >= this._model.choices?.length) return;
206
- let r = this._session.value || [], i = this._model.choices[n].value, a = r.includes(i), o = {
207
- value: i,
208
- selected: this._model.choiceMode === "radio" || !a,
209
- selector: "Keyboard"
210
- };
211
- this._onChange(o);
212
- }
213
- };
214
- //#endregion
215
- export { C as default, b as isComplete };
@@ -1,31 +0,0 @@
1
- /**
2
- * @synced-from pie-elements/packages/multiple-choice/src/main.jsx
3
- * @auto-generated
4
- *
5
- * This file is automatically synced from pie-elements and converted to TypeScript.
6
- * Manual edits will be overwritten on next sync.
7
- * To make changes, edit the upstream JavaScript file and run sync again.
8
- */
9
- import React from 'react';
10
- import PropTypes from 'prop-types';
11
- declare class Main extends React.Component {
12
- static propTypes: {
13
- model: PropTypes.Requireable<object>;
14
- session: PropTypes.Requireable<object>;
15
- options: PropTypes.Requireable<object>;
16
- onChoiceChanged: PropTypes.Requireable<(...args: any[]) => any>;
17
- onShowCorrectToggle: PropTypes.Requireable<(...args: any[]) => any>;
18
- extraCSSRules: PropTypes.Requireable<PropTypes.InferProps<{
19
- names: PropTypes.Requireable<(string | null | undefined)[]>;
20
- rules: PropTypes.Requireable<string>;
21
- }>>;
22
- baseHeadingLevel: PropTypes.Requireable<number>;
23
- includeSrHeading: PropTypes.Requireable<boolean>;
24
- };
25
- static defaultProps: {
26
- model: {};
27
- session: {};
28
- };
29
- render(): React.JSX.Element;
30
- }
31
- export default Main;
@@ -1,51 +0,0 @@
1
- import { MultipleChoice as e } from "./multiple-choice.js";
2
- import t from "react";
3
- import n from "prop-types";
4
- import * as r from "@pie-lib/render-ui";
5
- import { PreviewLayout as i } from "@pie-lib/render-ui";
6
- import { jsx as a } from "react/jsx-runtime";
7
- //#region src/delivery/main.tsx
8
- function o(e) {
9
- return typeof e == "function" || typeof e == "object" && !!e && typeof e.$$typeof == "symbol";
10
- }
11
- function s(e, t) {
12
- return !e || o(e) ? e : o(e.default) ? e.default : t && o(e[t]) ? e[t] : t && o(e[t]?.default) ? e[t].default : e;
13
- }
14
- var c = s(i, "PreviewLayout") || s(d.PreviewLayout, "PreviewLayout"), l = r, u = l.default, d = u && typeof u == "object" ? u : l, f = class extends t.Component {
15
- static propTypes = {
16
- model: n.object,
17
- session: n.object,
18
- options: n.object,
19
- onChoiceChanged: n.func,
20
- onShowCorrectToggle: n.func,
21
- extraCSSRules: n.shape({
22
- names: n.arrayOf(n.string),
23
- rules: n.string
24
- }),
25
- baseHeadingLevel: n.number,
26
- includeSrHeading: n.bool
27
- };
28
- static defaultProps = {
29
- model: {},
30
- session: {}
31
- };
32
- render() {
33
- let { model: t, onChoiceChanged: n, session: r, onShowCorrectToggle: i, options: o, baseHeadingLevel: s, includeSrHeading: l } = this.props, { extraCSSRules: u, fontSizeFactor: d } = t;
34
- return /* @__PURE__ */ a(c, {
35
- extraCSSRules: u,
36
- fontSizeFactor: d,
37
- classes: {},
38
- children: /* @__PURE__ */ a(e, {
39
- ...t,
40
- options: o,
41
- session: r,
42
- onChoiceChanged: n,
43
- onShowCorrectToggle: i,
44
- baseHeadingLevel: s,
45
- includeSrHeading: l
46
- })
47
- });
48
- }
49
- };
50
- //#endregion
51
- export { f as default };
@@ -1,61 +0,0 @@
1
- /**
2
- * @synced-from pie-elements/packages/multiple-choice/src/multiple-choice.jsx
3
- * @auto-generated
4
- *
5
- * This file is automatically synced from pie-elements and converted to TypeScript.
6
- * Manual edits will be overwritten on next sync.
7
- * To make changes, edit the upstream JavaScript file and run sync again.
8
- */
9
- import React from 'react';
10
- import PropTypes from 'prop-types';
11
- export declare class MultipleChoice extends React.Component {
12
- static propTypes: {
13
- className: PropTypes.Requireable<string>;
14
- mode: PropTypes.Requireable<string>;
15
- choiceMode: PropTypes.Requireable<string>;
16
- keyMode: PropTypes.Requireable<string>;
17
- choices: PropTypes.Requireable<any[]>;
18
- partLabel: PropTypes.Requireable<string>;
19
- prompt: PropTypes.Requireable<string>;
20
- teacherInstructions: PropTypes.Requireable<string>;
21
- session: PropTypes.Requireable<object>;
22
- disabled: PropTypes.Requireable<boolean>;
23
- onChoiceChanged: PropTypes.Requireable<(...args: any[]) => any>;
24
- responseCorrect: PropTypes.Requireable<boolean>;
25
- correctResponse: PropTypes.Requireable<any[]>;
26
- choicesLayout: PropTypes.Requireable<string>;
27
- gridColumns: PropTypes.Requireable<string>;
28
- alwaysShowCorrect: PropTypes.Requireable<boolean>;
29
- animationsDisabled: PropTypes.Requireable<boolean>;
30
- language: PropTypes.Requireable<string>;
31
- selectedAnswerBackgroundColor: PropTypes.Requireable<string>;
32
- selectedAnswerStrokeColor: PropTypes.Requireable<string>;
33
- selectedAnswerStrokeWidth: PropTypes.Requireable<string>;
34
- hoverAnswerBackgroundColor: PropTypes.Requireable<string>;
35
- hoverAnswerStrokeColor: PropTypes.Requireable<string>;
36
- hoverAnswerStrokeWidth: PropTypes.Requireable<string>;
37
- onShowCorrectToggle: PropTypes.Requireable<(...args: any[]) => any>;
38
- isSelectionButtonBelow: PropTypes.Requireable<boolean>;
39
- minSelections: PropTypes.Requireable<number>;
40
- maxSelections: PropTypes.Requireable<number>;
41
- autoplayAudioEnabled: PropTypes.Requireable<boolean>;
42
- customAudioButton: {
43
- playImage: PropTypes.Requireable<string>;
44
- pauseImage: PropTypes.Requireable<string>;
45
- };
46
- options: PropTypes.Requireable<object>;
47
- baseHeadingLevel: PropTypes.Requireable<number>;
48
- includeSrHeading: PropTypes.Requireable<boolean>;
49
- };
50
- constructor(props: any);
51
- isSelected(value: any): any;
52
- handleChange: any;
53
- onToggle: any;
54
- UNSAFE_componentWillReceiveProps(nextProps: any): void;
55
- indexToSymbol(index: any): string;
56
- getCorrectness: any;
57
- getChecked(choice: any): any;
58
- renderHeading(): React.JSX.Element | null;
59
- render(): React.JSX.Element;
60
- }
61
- export default MultipleChoice;