@longsightgroup/qti3-player 0.5.1 → 0.5.4

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 (201) hide show
  1. package/dist/content/content-dom.d.ts +11 -0
  2. package/dist/content/content-dom.d.ts.map +1 -0
  3. package/dist/content/content-dom.js +262 -0
  4. package/dist/content/content-dom.js.map +1 -0
  5. package/dist/content/content-renderer.d.ts +17 -0
  6. package/dist/content/content-renderer.d.ts.map +1 -0
  7. package/dist/content/content-renderer.js +82 -0
  8. package/dist/content/content-renderer.js.map +1 -0
  9. package/dist/controls/remove-button.d.ts +3 -0
  10. package/dist/controls/remove-button.d.ts.map +1 -0
  11. package/dist/controls/remove-button.js +12 -0
  12. package/dist/controls/remove-button.js.map +1 -0
  13. package/dist/interactions/choice-interaction.d.ts +4 -0
  14. package/dist/interactions/choice-interaction.d.ts.map +1 -0
  15. package/dist/interactions/choice-interaction.js +81 -0
  16. package/dist/interactions/choice-interaction.js.map +1 -0
  17. package/dist/interactions/drawing-interaction.d.ts +6 -0
  18. package/dist/interactions/drawing-interaction.d.ts.map +1 -0
  19. package/dist/interactions/drawing-interaction.js +401 -0
  20. package/dist/interactions/drawing-interaction.js.map +1 -0
  21. package/dist/interactions/end-attempt-interaction.d.ts +4 -0
  22. package/dist/interactions/end-attempt-interaction.d.ts.map +1 -0
  23. package/dist/interactions/end-attempt-interaction.js +13 -0
  24. package/dist/interactions/end-attempt-interaction.js.map +1 -0
  25. package/dist/interactions/gap-match-interaction.d.ts +4 -0
  26. package/dist/interactions/gap-match-interaction.d.ts.map +1 -0
  27. package/dist/interactions/gap-match-interaction.js +277 -0
  28. package/dist/interactions/gap-match-interaction.js.map +1 -0
  29. package/dist/interactions/graphic-associate-interaction.d.ts +4 -0
  30. package/dist/interactions/graphic-associate-interaction.d.ts.map +1 -0
  31. package/dist/interactions/graphic-associate-interaction.js +297 -0
  32. package/dist/interactions/graphic-associate-interaction.js.map +1 -0
  33. package/dist/interactions/graphic-context.d.ts +3 -0
  34. package/dist/interactions/graphic-context.d.ts.map +1 -0
  35. package/dist/interactions/graphic-context.js +35 -0
  36. package/dist/interactions/graphic-context.js.map +1 -0
  37. package/dist/interactions/hotspot-interaction.d.ts +4 -0
  38. package/dist/interactions/hotspot-interaction.d.ts.map +1 -0
  39. package/dist/interactions/hotspot-interaction.js +68 -0
  40. package/dist/interactions/hotspot-interaction.js.map +1 -0
  41. package/dist/interactions/hottext-interaction.d.ts +3 -0
  42. package/dist/interactions/hottext-interaction.d.ts.map +1 -0
  43. package/dist/interactions/hottext-interaction.js +66 -0
  44. package/dist/interactions/hottext-interaction.js.map +1 -0
  45. package/dist/interactions/inline-choice-interaction.d.ts +4 -0
  46. package/dist/interactions/inline-choice-interaction.d.ts.map +1 -0
  47. package/dist/interactions/inline-choice-interaction.js +31 -0
  48. package/dist/interactions/inline-choice-interaction.js.map +1 -0
  49. package/dist/interactions/inline-controls.d.ts +6 -0
  50. package/dist/interactions/inline-controls.d.ts.map +1 -0
  51. package/dist/interactions/inline-controls.js +15 -0
  52. package/dist/interactions/inline-controls.js.map +1 -0
  53. package/dist/interactions/interaction-diagnostics.d.ts +7 -0
  54. package/dist/interactions/interaction-diagnostics.d.ts.map +1 -0
  55. package/dist/interactions/interaction-diagnostics.js +137 -0
  56. package/dist/interactions/interaction-diagnostics.js.map +1 -0
  57. package/dist/interactions/interaction-dispatch.d.ts +2 -0
  58. package/dist/interactions/interaction-dispatch.d.ts.map +1 -0
  59. package/dist/interactions/interaction-dispatch.js +2 -0
  60. package/dist/interactions/interaction-dispatch.js.map +1 -0
  61. package/dist/interactions/interaction-label.d.ts +4 -0
  62. package/dist/interactions/interaction-label.d.ts.map +1 -0
  63. package/dist/interactions/interaction-label.js +8 -0
  64. package/dist/interactions/interaction-label.js.map +1 -0
  65. package/dist/interactions/interaction-registry.d.ts +24 -0
  66. package/dist/interactions/interaction-registry.d.ts.map +1 -0
  67. package/dist/interactions/interaction-registry.js +138 -0
  68. package/dist/interactions/interaction-registry.js.map +1 -0
  69. package/dist/interactions/match-interaction.d.ts +4 -0
  70. package/dist/interactions/match-interaction.d.ts.map +1 -0
  71. package/dist/interactions/match-interaction.js +188 -0
  72. package/dist/interactions/match-interaction.js.map +1 -0
  73. package/dist/interactions/object-asset.d.ts +8 -0
  74. package/dist/interactions/object-asset.d.ts.map +1 -0
  75. package/dist/interactions/object-asset.js +182 -0
  76. package/dist/interactions/object-asset.js.map +1 -0
  77. package/dist/interactions/pair-interaction.d.ts +4 -0
  78. package/dist/interactions/pair-interaction.d.ts.map +1 -0
  79. package/dist/interactions/pair-interaction.js +125 -0
  80. package/dist/interactions/pair-interaction.js.map +1 -0
  81. package/dist/interactions/point-value.d.ts +16 -0
  82. package/dist/interactions/point-value.d.ts.map +1 -0
  83. package/dist/interactions/point-value.js +37 -0
  84. package/dist/interactions/point-value.js.map +1 -0
  85. package/dist/interactions/portable-custom-interaction.d.ts +16 -0
  86. package/dist/interactions/portable-custom-interaction.d.ts.map +1 -0
  87. package/dist/interactions/portable-custom-interaction.js +97 -0
  88. package/dist/interactions/portable-custom-interaction.js.map +1 -0
  89. package/dist/interactions/position-object-interaction.d.ts +4 -0
  90. package/dist/interactions/position-object-interaction.d.ts.map +1 -0
  91. package/dist/interactions/position-object-interaction.js +177 -0
  92. package/dist/interactions/position-object-interaction.js.map +1 -0
  93. package/dist/interactions/routing.d.ts +5 -0
  94. package/dist/interactions/routing.d.ts.map +1 -0
  95. package/dist/interactions/routing.js +24 -0
  96. package/dist/interactions/routing.js.map +1 -0
  97. package/dist/interactions/select-point-interaction.d.ts +4 -0
  98. package/dist/interactions/select-point-interaction.d.ts.map +1 -0
  99. package/dist/interactions/select-point-interaction.js +166 -0
  100. package/dist/interactions/select-point-interaction.js.map +1 -0
  101. package/dist/interactions/shared.d.ts +12 -0
  102. package/dist/interactions/shared.d.ts.map +1 -0
  103. package/dist/interactions/shared.js +65 -0
  104. package/dist/interactions/shared.js.map +1 -0
  105. package/dist/interactions/text-interaction.d.ts +6 -0
  106. package/dist/interactions/text-interaction.d.ts.map +1 -0
  107. package/dist/interactions/text-interaction.js +110 -0
  108. package/dist/interactions/text-interaction.js.map +1 -0
  109. package/dist/interactions/unsupported-interaction.d.ts +4 -0
  110. package/dist/interactions/unsupported-interaction.d.ts.map +1 -0
  111. package/dist/interactions/unsupported-interaction.js +23 -0
  112. package/dist/interactions/unsupported-interaction.js.map +1 -0
  113. package/dist/interactions/upload-interaction.d.ts +4 -0
  114. package/dist/interactions/upload-interaction.d.ts.map +1 -0
  115. package/dist/interactions/upload-interaction.js +10 -0
  116. package/dist/interactions/upload-interaction.js.map +1 -0
  117. package/dist/player/attempt-availability.d.ts +6 -0
  118. package/dist/player/attempt-availability.d.ts.map +1 -0
  119. package/dist/player/attempt-availability.js +27 -0
  120. package/dist/player/attempt-availability.js.map +1 -0
  121. package/dist/player/content-state.d.ts +19 -0
  122. package/dist/player/content-state.d.ts.map +1 -0
  123. package/dist/player/content-state.js +39 -0
  124. package/dist/player/content-state.js.map +1 -0
  125. package/dist/player/dynamic-body.d.ts +7 -0
  126. package/dist/player/dynamic-body.d.ts.map +1 -0
  127. package/dist/player/dynamic-body.js +28 -0
  128. package/dist/player/dynamic-body.js.map +1 -0
  129. package/dist/player/feedback-panel.d.ts +3 -0
  130. package/dist/player/feedback-panel.d.ts.map +1 -0
  131. package/dist/player/feedback-panel.js +14 -0
  132. package/dist/player/feedback-panel.js.map +1 -0
  133. package/dist/player/fetch-xml.d.ts +2 -0
  134. package/dist/player/fetch-xml.d.ts.map +1 -0
  135. package/dist/player/fetch-xml.js +10 -0
  136. package/dist/player/fetch-xml.js.map +1 -0
  137. package/dist/player/interaction-render.d.ts +14 -0
  138. package/dist/player/interaction-render.d.ts.map +1 -0
  139. package/dist/player/interaction-render.js +51 -0
  140. package/dist/player/interaction-render.js.map +1 -0
  141. package/dist/player/render-shell.d.ts +8 -0
  142. package/dist/player/render-shell.d.ts.map +1 -0
  143. package/dist/player/render-shell.js +37 -0
  144. package/dist/player/render-shell.js.map +1 -0
  145. package/dist/player/resolve-assets.d.ts +3 -0
  146. package/dist/player/resolve-assets.d.ts.map +1 -0
  147. package/dist/player/resolve-assets.js +12 -0
  148. package/dist/player/resolve-assets.js.map +1 -0
  149. package/dist/player/validation-messages.d.ts +17 -0
  150. package/dist/player/validation-messages.d.ts.map +1 -0
  151. package/dist/player/validation-messages.js +33 -0
  152. package/dist/player/validation-messages.js.map +1 -0
  153. package/dist/reorder/a11y.d.ts +7 -0
  154. package/dist/reorder/a11y.d.ts.map +1 -0
  155. package/dist/reorder/a11y.js +34 -0
  156. package/dist/reorder/a11y.js.map +1 -0
  157. package/dist/reorder/graphic-order-interaction.d.ts +4 -0
  158. package/dist/reorder/graphic-order-interaction.d.ts.map +1 -0
  159. package/dist/reorder/graphic-order-interaction.js +205 -0
  160. package/dist/reorder/graphic-order-interaction.js.map +1 -0
  161. package/dist/reorder/list-controls.d.ts +22 -0
  162. package/dist/reorder/list-controls.d.ts.map +1 -0
  163. package/dist/reorder/list-controls.js +75 -0
  164. package/dist/reorder/list-controls.js.map +1 -0
  165. package/dist/reorder/order-interaction.d.ts +4 -0
  166. package/dist/reorder/order-interaction.d.ts.map +1 -0
  167. package/dist/reorder/order-interaction.js +54 -0
  168. package/dist/reorder/order-interaction.js.map +1 -0
  169. package/dist/styles/base-styles.d.ts +2 -0
  170. package/dist/styles/base-styles.d.ts.map +1 -0
  171. package/dist/styles/base-styles.js +133 -0
  172. package/dist/styles/base-styles.js.map +1 -0
  173. package/dist/styles/choice-hottext-styles.d.ts +2 -0
  174. package/dist/styles/choice-hottext-styles.d.ts.map +1 -0
  175. package/dist/styles/choice-hottext-styles.js +76 -0
  176. package/dist/styles/choice-hottext-styles.js.map +1 -0
  177. package/dist/styles/control-styles.d.ts +2 -0
  178. package/dist/styles/control-styles.d.ts.map +1 -0
  179. package/dist/styles/control-styles.js +114 -0
  180. package/dist/styles/control-styles.js.map +1 -0
  181. package/dist/styles/drawing-styles.d.ts +2 -0
  182. package/dist/styles/drawing-styles.d.ts.map +1 -0
  183. package/dist/styles/drawing-styles.js +30 -0
  184. package/dist/styles/drawing-styles.js.map +1 -0
  185. package/dist/styles/gap-match-styles.d.ts +2 -0
  186. package/dist/styles/gap-match-styles.d.ts.map +1 -0
  187. package/dist/styles/gap-match-styles.js +33 -0
  188. package/dist/styles/gap-match-styles.js.map +1 -0
  189. package/dist/styles/graphic-styles.d.ts +2 -0
  190. package/dist/styles/graphic-styles.d.ts.map +1 -0
  191. package/dist/styles/graphic-styles.js +289 -0
  192. package/dist/styles/graphic-styles.js.map +1 -0
  193. package/dist/styles/match-pair-styles.d.ts +2 -0
  194. package/dist/styles/match-pair-styles.d.ts.map +1 -0
  195. package/dist/styles/match-pair-styles.js +62 -0
  196. package/dist/styles/match-pair-styles.js.map +1 -0
  197. package/dist/styles/text-slider-styles.d.ts +2 -0
  198. package/dist/styles/text-slider-styles.d.ts.map +1 -0
  199. package/dist/styles/text-slider-styles.js +35 -0
  200. package/dist/styles/text-slider-styles.js.map +1 -0
  201. package/package.json +8 -8
@@ -0,0 +1,125 @@
1
+ import { removeButton } from "../controls/remove-button.js";
2
+ import { missingChoicesMessage, responseGroup, valueToStrings } from "../interaction-support.js";
3
+ import { choiceText, pairRegionLabels, sourceChoices, targetChoices, tokenButton, tokenRegion, } from "./shared.js";
4
+ export function renderPairResponse(interaction, update, currentValue, messages) {
5
+ const group = responseGroup();
6
+ const sources = sourceChoices(interaction);
7
+ const targets = targetChoices(interaction);
8
+ if (sources.length === 0 || targets.length === 0) {
9
+ group.append(missingChoicesMessage(interaction));
10
+ return group;
11
+ }
12
+ const selectedPairs = valueToStrings(currentValue);
13
+ let selectedSource;
14
+ let selectedTarget;
15
+ const labels = pairRegionLabels(interaction, messages);
16
+ const sourceRegion = tokenRegion(messages.message("interactionSourcesBank", { type: interaction.type }), labels.source);
17
+ const targetRegion = tokenRegion(messages.message("interactionTargetsBank", { type: interaction.type }), labels.target);
18
+ const selector = document.createElement("div");
19
+ selector.className = "qti3-pair-selector";
20
+ const pairList = document.createElement("ul");
21
+ pairList.className = "qti3-pair-list";
22
+ pairList.setAttribute("aria-label", messages.message("interactionSelectedPairsList", { type: interaction.type }));
23
+ let draggedSource;
24
+ const commit = () => {
25
+ if (interaction.responseCardinality === "single")
26
+ update(selectedPairs[0] ?? null);
27
+ else
28
+ update([...selectedPairs]);
29
+ };
30
+ const syncPressed = () => {
31
+ for (const button of sourceRegion.querySelectorAll("button")) {
32
+ button.setAttribute("aria-pressed", button.dataset.choiceIdentifier === selectedSource?.identifier ? "true" : "false");
33
+ }
34
+ for (const button of targetRegion.querySelectorAll("button")) {
35
+ button.setAttribute("aria-pressed", button.dataset.choiceIdentifier === selectedTarget?.identifier ? "true" : "false");
36
+ }
37
+ };
38
+ const addSelectedPair = () => {
39
+ if (!selectedSource || !selectedTarget)
40
+ return;
41
+ const pair = `${selectedSource.identifier} ${selectedTarget.identifier}`;
42
+ if (!selectedPairs.includes(pair))
43
+ selectedPairs.push(pair);
44
+ selectedSource = undefined;
45
+ selectedTarget = undefined;
46
+ syncPressed();
47
+ renderPairs();
48
+ commit();
49
+ };
50
+ const addPair = (sourceIdentifier, targetIdentifier) => {
51
+ const source = sources.find((choice) => choice.identifier === sourceIdentifier);
52
+ const target = targets.find((choice) => choice.identifier === targetIdentifier);
53
+ if (!source || !target)
54
+ return;
55
+ selectedSource = source;
56
+ selectedTarget = target;
57
+ addSelectedPair();
58
+ };
59
+ const renderPairs = () => {
60
+ pairList.replaceChildren(...selectedPairs.map((pair) => {
61
+ const [source, target] = pair.split(" ");
62
+ const label = messages.message("associationPairLabel", {
63
+ source: choiceText(sources, source),
64
+ target: choiceText(targets, target),
65
+ });
66
+ const item = document.createElement("li");
67
+ item.className = "qti3-pair-chip";
68
+ const text = document.createElement("span");
69
+ text.textContent = label;
70
+ const remove = removeButton(label, messages);
71
+ remove.addEventListener("click", () => {
72
+ const index = selectedPairs.indexOf(pair);
73
+ if (index >= 0)
74
+ selectedPairs.splice(index, 1);
75
+ renderPairs();
76
+ commit();
77
+ });
78
+ item.append(text, remove);
79
+ return item;
80
+ }));
81
+ };
82
+ for (const choice of sources) {
83
+ const button = tokenButton(choice);
84
+ button.draggable = true;
85
+ button.addEventListener("dragstart", (event) => {
86
+ draggedSource = choice.identifier;
87
+ event.dataTransfer?.setData("text/plain", choice.identifier);
88
+ event.dataTransfer?.setDragImage(button, 8, 8);
89
+ });
90
+ button.addEventListener("dragend", () => {
91
+ draggedSource = undefined;
92
+ syncPressed();
93
+ });
94
+ button.addEventListener("click", () => {
95
+ selectedSource = choice;
96
+ syncPressed();
97
+ addSelectedPair();
98
+ });
99
+ sourceRegion.append(button);
100
+ }
101
+ for (const choice of targets) {
102
+ const button = tokenButton(choice);
103
+ button.addEventListener("dragover", (event) => {
104
+ event.preventDefault();
105
+ button.classList.add("qti3-drop-target");
106
+ });
107
+ button.addEventListener("dragleave", () => button.classList.remove("qti3-drop-target"));
108
+ button.addEventListener("drop", (event) => {
109
+ event.preventDefault();
110
+ button.classList.remove("qti3-drop-target");
111
+ addPair(event.dataTransfer?.getData("text/plain") || draggedSource, choice.identifier);
112
+ });
113
+ button.addEventListener("click", () => {
114
+ selectedTarget = choice;
115
+ syncPressed();
116
+ addSelectedPair();
117
+ });
118
+ targetRegion.append(button);
119
+ }
120
+ selector.append(sourceRegion, targetRegion);
121
+ renderPairs();
122
+ group.append(selector, pairList);
123
+ return group;
124
+ }
125
+ //# sourceMappingURL=pair-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair-interaction.js","sourceRoot":"","sources":["../../src/interactions/pair-interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { QtiObjectAsset, QtiValue } from "@longsightgroup/qti3-core";
2
+ export declare function parsePointValue(value: QtiValue): {
3
+ x: number;
4
+ y: number;
5
+ } | undefined;
6
+ export declare function parsePointValues(value: QtiValue): Array<{
7
+ x: number;
8
+ y: number;
9
+ }>;
10
+ export declare function pointToString(point: {
11
+ x: number;
12
+ y: number;
13
+ } | undefined): string;
14
+ export declare function objectAssetWidth(object: QtiObjectAsset | undefined, fallback: number): number;
15
+ export declare function objectAssetHeight(object: QtiObjectAsset | undefined, fallback: number): number;
16
+ //# sourceMappingURL=point-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"point-value.d.ts","sourceRoot":"","sources":["../../src/interactions/point-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAGrF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKjF;AAYD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,CAEjF;AAOD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9F"}
@@ -0,0 +1,37 @@
1
+ import { valueToStrings } from "../interaction-support.js";
2
+ export function parsePointValue(value) {
3
+ const [raw] = valueToStrings(value);
4
+ return parsePointString(raw);
5
+ }
6
+ export function parsePointValues(value) {
7
+ return valueToStrings(value).flatMap((raw) => {
8
+ const point = parsePointString(raw);
9
+ return point ? [point] : [];
10
+ });
11
+ }
12
+ function parsePointString(raw) {
13
+ if (!raw)
14
+ return undefined;
15
+ const values = raw.split(/\s+/).map(Number);
16
+ const x = values[0];
17
+ const y = values[1];
18
+ if (typeof x !== "number" || typeof y !== "number")
19
+ return undefined;
20
+ if (!Number.isFinite(x) || !Number.isFinite(y))
21
+ return undefined;
22
+ return { x, y };
23
+ }
24
+ export function pointToString(point) {
25
+ return point ? `${point.x} ${point.y}` : "";
26
+ }
27
+ function dimension(value, fallback) {
28
+ const parsed = Number(value);
29
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
30
+ }
31
+ export function objectAssetWidth(object, fallback) {
32
+ return dimension(object?.width, fallback);
33
+ }
34
+ export function objectAssetHeight(object, fallback) {
35
+ return dimension(object?.height, fallback);
36
+ }
37
+ //# sourceMappingURL=point-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"point-value.js","sourceRoot":"","sources":["../../src/interactions/point-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,UAAU,eAAe,CAAC,KAAe;IAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAe;IAC9C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAA2C;IACvE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB,EAAE,QAAgB;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkC,EAAE,QAAgB;IACnF,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAkC,EAAE,QAAgB;IACpF,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { QtiContentNode, QtiDiagnostic, QtiInteraction, QtiPortableCustomStateValue, QtiValue } from "@longsightgroup/qti3-core";
2
+ import type { QtiPortableCustomMountEventDetail } from "../player-types.js";
3
+ export interface PortableCustomResponseContext {
4
+ interaction: QtiInteraction;
5
+ update: (value: QtiValue) => void;
6
+ currentValue: QtiValue;
7
+ currentState?: QtiPortableCustomStateValue | undefined;
8
+ renderMarkup: (nodes: QtiContentNode[]) => Node[];
9
+ setInteractionState: (responseIdentifier: string, state: QtiPortableCustomStateValue) => void;
10
+ setValidity: (responseIdentifier: string, valid: boolean, message?: string) => void;
11
+ emitStateChange: () => void;
12
+ onMount: (detail: QtiPortableCustomMountEventDetail) => void;
13
+ }
14
+ export declare function portableCustomValidityDiagnostic(responseIdentifier: string, valid: boolean, message: string | undefined): QtiDiagnostic | undefined;
15
+ export declare function renderPortableCustomResponse(context: PortableCustomResponseContext): HTMLElement;
16
+ //# sourceMappingURL=portable-custom-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-custom-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/portable-custom-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,cAAc,EAEd,2BAA2B,EAC3B,QAAQ,EACT,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAS5E,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,cAAc,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,YAAY,EAAE,QAAQ,CAAC;IACvB,YAAY,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC;IAClD,mBAAmB,EAAE,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;IAC9F,WAAW,EAAE,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,iCAAiC,KAAK,IAAI,CAAC;CAC9D;AAED,wBAAgB,gCAAgC,CAC9C,kBAAkB,EAAE,MAAM,EAC1B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,aAAa,GAAG,SAAS,CAQ3B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,WAAW,CAsEhG"}
@@ -0,0 +1,97 @@
1
+ import { portableCustomDefinitionFromAttributes, portableCustomEventState, portableCustomEventValidity, portableCustomEventValue, scalarString, } from "../portable-custom-support.js";
2
+ export function portableCustomValidityDiagnostic(responseIdentifier, valid, message) {
3
+ if (valid)
4
+ return undefined;
5
+ return {
6
+ code: "response.portableCustom.validity",
7
+ severity: "error",
8
+ message: message?.trim() || `${responseIdentifier} is not valid.`,
9
+ path: responseIdentifier,
10
+ };
11
+ }
12
+ export function renderPortableCustomResponse(context) {
13
+ const { interaction, update, currentValue } = context;
14
+ const definition = interaction.portableCustom ?? portableCustomDefinitionFromAttributes(interaction);
15
+ const responseIdentifier = interaction.responseIdentifier ?? definition.responseIdentifier ?? "";
16
+ const currentState = context.currentState;
17
+ const group = document.createElement("div");
18
+ group.role = "group";
19
+ group.setAttribute("aria-label", interaction.prompt ?? "Portable custom interaction");
20
+ const host = createPortableCustomHost(interaction, definition, responseIdentifier, currentState);
21
+ if (definition.interactionMarkup.length > 0) {
22
+ const markup = document.createElement("div");
23
+ markup.className = "qti3-portable-custom-markup";
24
+ markup.append(...context.renderMarkup(definition.interactionMarkup));
25
+ host.append(markup);
26
+ }
27
+ else {
28
+ host.textContent = "Portable custom interaction host";
29
+ }
30
+ const fallback = document.createElement("input");
31
+ fallback.type = "hidden";
32
+ fallback.className = "qti3-portable-custom-response";
33
+ fallback.hidden = true;
34
+ fallback.tabIndex = -1;
35
+ fallback.setAttribute("aria-hidden", "true");
36
+ fallback.value = scalarString(currentValue);
37
+ const handlePortableCustomEvent = (event) => {
38
+ const state = portableCustomEventState(event);
39
+ const value = portableCustomEventValue(event);
40
+ const validity = portableCustomEventValidity(event);
41
+ if (state !== undefined && responseIdentifier) {
42
+ context.setInteractionState(responseIdentifier, state);
43
+ host.dataset.state = JSON.stringify(state);
44
+ }
45
+ if (value !== undefined) {
46
+ fallback.value = scalarString(value ?? null);
47
+ update(value);
48
+ }
49
+ if (validity && responseIdentifier) {
50
+ context.setValidity(responseIdentifier, validity.valid, validity.message);
51
+ context.emitStateChange();
52
+ }
53
+ if (value === undefined && state !== undefined && !validity)
54
+ context.emitStateChange();
55
+ };
56
+ for (const eventName of [
57
+ "qti3-portable-custom-response",
58
+ "qti3-pci-response",
59
+ "qti3-portable-custom-state",
60
+ "qti3-portable-custom-validity",
61
+ ]) {
62
+ host.addEventListener(eventName, handlePortableCustomEvent);
63
+ }
64
+ queueMicrotask(() => {
65
+ context.onMount({
66
+ responseIdentifier,
67
+ interaction,
68
+ definition,
69
+ host,
70
+ value: currentValue,
71
+ state: currentState,
72
+ });
73
+ });
74
+ group.append(host, fallback);
75
+ return group;
76
+ }
77
+ function createPortableCustomHost(interaction, definition, responseIdentifier, currentState) {
78
+ const host = document.createElement("div");
79
+ host.className = "qti3-portable-custom-host";
80
+ host.tabIndex = 0;
81
+ host.dataset.responseIdentifier = responseIdentifier;
82
+ host.dataset.typeIdentifier = definition.customInteractionTypeIdentifier ?? "";
83
+ host.dataset.module = definition.module ?? "";
84
+ host.dataset.qtiName = interaction.qtiName;
85
+ if (definition.interactionModules?.primaryConfiguration) {
86
+ host.dataset.primaryConfiguration = definition.interactionModules.primaryConfiguration;
87
+ }
88
+ if (definition.interactionModules?.secondaryConfiguration) {
89
+ host.dataset.secondaryConfiguration = definition.interactionModules.secondaryConfiguration;
90
+ }
91
+ if (currentState !== undefined)
92
+ host.dataset.state = JSON.stringify(currentState);
93
+ host.setAttribute("role", "application");
94
+ host.setAttribute("aria-label", interaction.prompt ?? "Portable custom interaction host");
95
+ return host;
96
+ }
97
+ //# sourceMappingURL=portable-custom-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-custom-interaction.js","sourceRoot":"","sources":["../../src/interactions/portable-custom-interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
2
+ import type { PlayerMessageResolver } from "../player-message-resolver.js";
3
+ export declare function renderPositionObjectResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
4
+ //# sourceMappingURL=position-object-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position-object-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/position-object-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAW1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAQ3E,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAkMb"}
@@ -0,0 +1,177 @@
1
+ import { applyGraphicSurfaceLayout, applyPositionObjectMarkerPlacement, applyPositionObjectMarkerSize, appendGraphicObjectImage, objectIsImage, percent, responseGroup, } from "../interaction-support.js";
2
+ import { movementButton } from "../movement.js";
3
+ import { objectAssetHeight, objectAssetWidth, parsePointValue, pointToString, } from "./point-value.js";
4
+ export function renderPositionObjectResponse(interaction, update, currentValue, messages) {
5
+ const group = responseGroup();
6
+ group.role = "group";
7
+ group.setAttribute("aria-label", messages.message("interactionPlacementResponse", { type: interaction.type }));
8
+ const stageObject = interaction.positionObjectStage ?? interaction.object;
9
+ const movableObject = interaction.positionObjectStage ? interaction.object : undefined;
10
+ const width = objectAssetWidth(stageObject, 480);
11
+ const height = objectAssetHeight(stageObject, 300);
12
+ const movableWidth = objectAssetWidth(movableObject, Math.max(32, Math.round(width * 0.12)));
13
+ const movableHeight = objectAssetHeight(movableObject, Math.max(32, Math.round(height * 0.12)));
14
+ const parsedPoint = parsePointValue(currentValue);
15
+ let point = parsedPoint ?? { x: 0, y: 0 };
16
+ let isPlaced = Boolean(parsedPoint);
17
+ const stage = document.createElement("div");
18
+ applyGraphicSurfaceLayout(stage, width, height, "qti3-position-object-stage");
19
+ stage.style.setProperty("--qti3-position-object-marker-block-size", `${movableHeight}px`);
20
+ stage.tabIndex = 0;
21
+ stage.role = "group";
22
+ stage.setAttribute("aria-label", messages.message("interactionPlacementStage", { type: interaction.type }));
23
+ if (stageObject?.data && objectIsImage(stageObject)) {
24
+ appendGraphicObjectImage(stage, stageObject, stageObject.text || "");
25
+ }
26
+ const marker = document.createElement("button");
27
+ marker.type = "button";
28
+ marker.className = "qti3-position-object-marker";
29
+ marker.setAttribute("aria-label", messages.message("movableObject"));
30
+ applyPositionObjectMarkerSize(marker, movableWidth, movableHeight);
31
+ marker.draggable = false;
32
+ if (movableObject?.data && objectIsImage(movableObject)) {
33
+ const image = document.createElement("img");
34
+ image.src = movableObject.data;
35
+ image.alt = "";
36
+ marker.append(image);
37
+ }
38
+ else {
39
+ marker.textContent = messages.message("placeObject");
40
+ }
41
+ stage.append(marker);
42
+ const coordinate = document.createElement("output");
43
+ coordinate.className = "qti3-coordinate-output qti-visually-hidden";
44
+ coordinate.setAttribute("aria-live", "polite");
45
+ const clamp = () => {
46
+ point.x = Math.max(0, Math.min(width, point.x));
47
+ point.y = Math.max(0, Math.min(height, point.y));
48
+ };
49
+ const commit = () => {
50
+ if (!isPlaced)
51
+ return;
52
+ update(pointToString(point));
53
+ };
54
+ const syncMarker = () => {
55
+ if (!isPlaced) {
56
+ marker.dataset.placed = "false";
57
+ marker.style.removeProperty("insetInlineStart");
58
+ marker.style.removeProperty("insetBlockStart");
59
+ marker.style.setProperty("--qti3-position-object-unplaced-inline-start", `${Math.round(movableWidth / 2)}px`);
60
+ marker.style.setProperty("--qti3-position-object-unplaced-block-start", `calc(100% + ${Math.round(movableHeight / 2 + 8)}px)`);
61
+ coordinate.value = "";
62
+ coordinate.textContent = messages.message("objectNotPlaced");
63
+ stage.setAttribute("aria-label", messages.message("interactionPlacementStageEmpty", { type: interaction.type }));
64
+ return;
65
+ }
66
+ clamp();
67
+ marker.dataset.placed = "true";
68
+ marker.style.removeProperty("--qti3-position-object-unplaced-inline-start");
69
+ marker.style.removeProperty("--qti3-position-object-unplaced-block-start");
70
+ applyPositionObjectMarkerPlacement(marker, `${percent(point.x, width)}%`, `${percent(point.y, height)}%`);
71
+ coordinate.value = pointToString(point);
72
+ const coordinates = pointToString(point);
73
+ coordinate.textContent = messages.message("objectPositionedAt", { coordinates });
74
+ stage.setAttribute("aria-label", messages.message("interactionPlacementStageAt", { type: interaction.type, coordinates }));
75
+ };
76
+ const pointFromPointer = (event) => {
77
+ const rect = stage.getBoundingClientRect();
78
+ point = {
79
+ x: Math.round(((event.clientX - rect.left) / rect.width) * width),
80
+ y: Math.round(((event.clientY - rect.top) / rect.height) * height),
81
+ };
82
+ isPlaced = true;
83
+ clamp();
84
+ };
85
+ const ensureKeyboardPoint = () => {
86
+ if (isPlaced)
87
+ return;
88
+ point = { x: 0, y: 0 };
89
+ isPlaced = true;
90
+ };
91
+ const moveBy = (dx, dy, emit = true) => {
92
+ ensureKeyboardPoint();
93
+ point.x += dx;
94
+ point.y += dy;
95
+ syncMarker();
96
+ if (emit)
97
+ commit();
98
+ };
99
+ const handleKey = (event) => {
100
+ const step = event.shiftKey ? 10 : 1;
101
+ if (event.key === "ArrowLeft")
102
+ moveBy(-step, 0, false);
103
+ else if (event.key === "ArrowRight")
104
+ moveBy(step, 0, false);
105
+ else if (event.key === "ArrowUp")
106
+ moveBy(0, -step, false);
107
+ else if (event.key === "ArrowDown")
108
+ moveBy(0, step, false);
109
+ else if (event.key === "Enter" || event.key === " ") {
110
+ ensureKeyboardPoint();
111
+ syncMarker();
112
+ commit();
113
+ }
114
+ else
115
+ return;
116
+ event.preventDefault();
117
+ };
118
+ let dragging = false;
119
+ let dragMoved = false;
120
+ marker.addEventListener("pointerdown", (event) => {
121
+ dragging = true;
122
+ dragMoved = false;
123
+ marker.dataset.dragging = "true";
124
+ marker.setPointerCapture(event.pointerId);
125
+ if (isPlaced) {
126
+ pointFromPointer(event);
127
+ syncMarker();
128
+ }
129
+ event.preventDefault();
130
+ });
131
+ marker.addEventListener("pointermove", (event) => {
132
+ if (!dragging)
133
+ return;
134
+ dragMoved = true;
135
+ pointFromPointer(event);
136
+ syncMarker();
137
+ });
138
+ marker.addEventListener("pointerup", (event) => {
139
+ if (!dragging)
140
+ return;
141
+ dragging = false;
142
+ delete marker.dataset.dragging;
143
+ marker.releasePointerCapture(event.pointerId);
144
+ if (dragMoved || isPlaced) {
145
+ pointFromPointer(event);
146
+ syncMarker();
147
+ commit();
148
+ }
149
+ });
150
+ marker.addEventListener("pointercancel", () => {
151
+ dragging = false;
152
+ delete marker.dataset.dragging;
153
+ });
154
+ stage.addEventListener("click", (event) => {
155
+ if (event.target === marker)
156
+ return;
157
+ pointFromPointer(event);
158
+ syncMarker();
159
+ commit();
160
+ });
161
+ stage.addEventListener("keydown", handleKey);
162
+ marker.addEventListener("keydown", handleKey);
163
+ const controls = document.createElement("div");
164
+ controls.className = "qti3-point-controls";
165
+ for (const [direction, dx, dy] of [
166
+ ["up", 0, -1],
167
+ ["left", -1, 0],
168
+ ["right", 1, 0],
169
+ ["down", 0, 1],
170
+ ]) {
171
+ controls.append(movementButton(direction, messages.message("moveObject", { direction }), () => moveBy(dx, dy)));
172
+ }
173
+ syncMarker();
174
+ group.append(stage, coordinate, controls);
175
+ return group;
176
+ }
177
+ //# sourceMappingURL=position-object-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position-object-interaction.js","sourceRoot":"","sources":["../../src/interactions/position-object-interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { QtiInteraction } from "@longsightgroup/qti3-core";
2
+ export declare function usesChoiceSet(interaction: QtiInteraction): boolean;
3
+ export declare function usesOrderedResponse(interaction: QtiInteraction): boolean;
4
+ export declare function usesPairResponse(interaction: QtiInteraction): boolean;
5
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/interactions/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,wBAAgB,aAAa,CAAC,WAAW,EAAE,cAAc,GAAG,OAAO,CAKlE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,cAAc,GAAG,OAAO,CAExE;AAWD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,cAAc,GAAG,OAAO,CAIrE"}
@@ -0,0 +1,24 @@
1
+ export function usesChoiceSet(interaction) {
2
+ if (interaction.type === "choice")
3
+ return true;
4
+ return (interaction.responseCardinality === "multiple" && interaction.responseBaseType === "identifier");
5
+ }
6
+ export function usesOrderedResponse(interaction) {
7
+ return interaction.responseCardinality === "ordered" || interaction.type === "order";
8
+ }
9
+ const explicitNonPairInteractionTypes = new Set([
10
+ "match",
11
+ "gapMatch",
12
+ "graphicGapMatch",
13
+ "graphicAssociate",
14
+ "graphicOrder",
15
+ "order",
16
+ ]);
17
+ export function usesPairResponse(interaction) {
18
+ if (interaction.type === "associate")
19
+ return true;
20
+ if (explicitNonPairInteractionTypes.has(interaction.type))
21
+ return false;
22
+ return interaction.responseBaseType === "pair" || interaction.responseBaseType === "directedPair";
23
+ }
24
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/interactions/routing.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,WAA2B;IACvD,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,CACL,WAAW,CAAC,mBAAmB,KAAK,UAAU,IAAI,WAAW,CAAC,gBAAgB,KAAK,YAAY,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAA2B;IAC7D,OAAO,WAAW,CAAC,mBAAmB,KAAK,SAAS,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC;AACvF,CAAC;AAED,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAyB;IACtE,OAAO;IACP,UAAU;IACV,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;IACd,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,WAA2B;IAC1D,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,+BAA+B,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,WAAW,CAAC,gBAAgB,KAAK,MAAM,IAAI,WAAW,CAAC,gBAAgB,KAAK,cAAc,CAAC;AACpG,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { QtiInteraction, QtiValue } from "@longsightgroup/qti3-core";
2
+ import type { PlayerMessageResolver } from "../player-message-resolver.js";
3
+ export declare function renderSelectPointResponse(interaction: QtiInteraction, update: (value: QtiValue) => void, currentValue: QtiValue, messages: PlayerMessageResolver): HTMLElement;
4
+ //# sourceMappingURL=select-point-interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-point-interaction.d.ts","sourceRoot":"","sources":["../../src/interactions/select-point-interaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAU1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAI3E,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,cAAc,EAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,YAAY,EAAE,QAAQ,EACtB,QAAQ,EAAE,qBAAqB,GAC9B,WAAW,CAiLb"}