jspsych-tangram 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/construct/index.browser.js +4572 -3884
- package/dist/construct/index.browser.js.map +1 -1
- package/dist/construct/index.browser.min.js +15 -12
- package/dist/construct/index.browser.min.js.map +1 -1
- package/dist/construct/index.cjs +45 -9
- package/dist/construct/index.cjs.map +1 -1
- package/dist/construct/index.js +45 -9
- package/dist/construct/index.js.map +1 -1
- package/dist/index.cjs +373 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +180 -8
- package/dist/index.js +374 -15
- package/dist/index.js.map +1 -1
- package/dist/nback/index.browser.js +17703 -0
- package/dist/nback/index.browser.js.map +1 -0
- package/dist/nback/index.browser.min.js +42 -0
- package/dist/nback/index.browser.min.js.map +1 -0
- package/dist/nback/index.cjs +395 -0
- package/dist/nback/index.cjs.map +1 -0
- package/dist/nback/index.d.ts +175 -0
- package/dist/nback/index.js +393 -0
- package/dist/nback/index.js.map +1 -0
- package/dist/prep/index.browser.js +4578 -3892
- package/dist/prep/index.browser.js.map +1 -1
- package/dist/prep/index.browser.min.js +16 -13
- package/dist/prep/index.browser.min.js.map +1 -1
- package/dist/prep/index.cjs +46 -12
- package/dist/prep/index.cjs.map +1 -1
- package/dist/prep/index.js +46 -12
- package/dist/prep/index.js.map +1 -1
- package/package.json +9 -3
- package/src/assets/README.md +6 -0
- package/src/assets/images.d.ts +19 -0
- package/src/assets/locked.png +0 -0
- package/src/assets/unlocked.png +0 -0
- package/src/core/components/board/BoardView.tsx +72 -29
- package/src/core/io/InteractionTracker.ts +16 -8
- package/src/core/io/data-tracking.ts +3 -0
- package/src/index.ts +2 -1
- package/src/plugins/tangram-nback/NBackApp.tsx +316 -0
- package/src/plugins/tangram-nback/index.ts +141 -0
- package/tangram-construct.min.js +15 -12
- package/tangram-nback.min.js +42 -0
- package/tangram-prep.min.js +16 -13
package/dist/construct/index.cjs
CHANGED
|
@@ -14,9 +14,8 @@ const CONFIG = {
|
|
|
14
14
|
completion: { fill: "#ccfff2", stroke: "#13da57" },
|
|
15
15
|
silhouetteMask: "#374151",
|
|
16
16
|
anchors: { invalid: "#7dd3fc", valid: "#475569" },
|
|
17
|
-
piece: { draggingFill: "#8e7cc3ff", validFill: "#8e7cc3ff", invalidFill: "#ef4444",
|
|
18
|
-
|
|
19
|
-
blueprint: { fill: "#374151", selectedStroke: "#111827", badgeFill: "#000000", labelFill: "#ffffff" },
|
|
17
|
+
piece: { draggingFill: "#8e7cc3ff", validFill: "#8e7cc3ff", invalidFill: "#ef4444", allGreenStroke: "#86efac"},
|
|
18
|
+
blueprint: { fill: "#374151", badgeFill: "#000000", labelFill: "#ffffff" },
|
|
20
19
|
tangramDecomposition: { stroke: "#fef2cc" }
|
|
21
20
|
},
|
|
22
21
|
opacity: {
|
|
@@ -27,7 +26,7 @@ const CONFIG = {
|
|
|
27
26
|
piece: { invalid: 0.35, dragging: 0.75, locked: 1, normal: 1 }
|
|
28
27
|
},
|
|
29
28
|
size: {
|
|
30
|
-
stroke: { bandPx: 5,
|
|
29
|
+
stroke: { bandPx: 5, allGreenStrokePx: 10, tangramDecompositionPx: 1 },
|
|
31
30
|
anchorRadiusPx: { valid: 1, invalid: 1 },
|
|
32
31
|
badgeFontPx: 16,
|
|
33
32
|
centerBadge: { fractionOfOuterR: 0.15, minPx: 20, marginPx: 4 }
|
|
@@ -47,9 +46,7 @@ const CONFIG = {
|
|
|
47
46
|
},
|
|
48
47
|
game: {
|
|
49
48
|
snapRadiusPx: 15,
|
|
50
|
-
showBorders: false
|
|
51
|
-
hideTouchingBorders: true
|
|
52
|
-
}
|
|
49
|
+
showBorders: false}
|
|
53
50
|
};
|
|
54
51
|
|
|
55
52
|
function isComposite(bp) {
|
|
@@ -825,6 +822,10 @@ function shouldUseSelectiveBorders(blueprintId) {
|
|
|
825
822
|
return CONFIG.game.showBorders;
|
|
826
823
|
}
|
|
827
824
|
|
|
825
|
+
var lockedIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAACXBIWXMAAAsSAAALEgHS3X78AAAFY0lEQVR4nO2d7XXrNgyGH/r0f7zB9QbXnaDqBt6gvhM0I2SE3A2UDXwnqLKBPEHdDewJ0B+kYieWZEoiQfrjPQcnjqOI0GuYAAFQMiJCLjDGLIEFsHQyB/7w/Pd397MCamAnInVgFUfDpCTaGLMACmDlfj4FHuKAJX4DVCKyC3x+b6gTbYyZA2sn31UHhy1QAqWI7FVHFhEVwVpsCUgmUgKF2vUrEVxlQGyXVBqE3zPBqoTHIHhOXlPEUCmBedZEY6OHfQZkTZU9sMqO6Buw4ujWHYLkJXaBkJqUWFIDy6REYx3eLUwVl2TPREc5heR1BgRoy1qV6DsleRLZD5KVyH6QrET2UMeX+uJyE28H6UvykvuILobKHs/Qz4fkObcdJ0+VGo9FzcV8tDGmBP7qPSg+DtgLqrFWBLYSs8C/AhMTbyKy7j3igjWvSPu1LPH4ajo9y4S6ChdyI5emjFTz8isjcgxYC98kNIxOnfuUTmEhk5e6Tvd1IiMpBxFNmlDOy6kMIDtVpNRqKK3O0BhToetk/sPOxZ0FU1cxX2CNAGxFZCc9lW3XvlARvrreh3cRKc7ezcSaOx0e1tH1hZc1PY6INA79zKrbFKuUlXrpccZDdKnomHqwzlXzmqpeotG35l0PyWMWSa3zPGkiqKKP6FJZmXUH0VVIa0pk1WUr0e5T11REaLe+dYwPEOtIk13fqSLPykp0Wd4uwLm7piTtnM1zM/aMI9boovr6hgvHvgU49zdjTNHyvnZ36bp5MYOPGFW74bDtoouA52871y7g+X3w3XH7YdGFsgJwzMKdYh55zCry+dtQwJHoVQIF7gUrSGvR94ICYOYckGYu4N7wZIxZzLDx5QNxsZxh04kPxMUS9JNINfBChB7kS4KNal4JsygaIhtNooNUTwKS/oxeoqky7kVsbB3JujuhLkCzMKBF9O+S0ebKU7il+j+xx5ldPmQyfuZKMoCIVMCv2ONoEP2qMMZUlLEHiD11HEQkdv4iCIwxUafQ2Bad7ZShjd9SK+CLkz3kTQJsQ4o93RMQNX4MFPN2NcN4t816jBE1ltZwhpPgLLmiPdZ9Aip3TNbInmjsdNG3oHhCvww3GDOOd27JFT5FidwLF+8z2ktKD4TFfkb+Idgm0DEpUV8L0Yeevx94ED0dYttyC9rJPmCzgjtFlcagnjkl+ywmOVxSasHn5M8vYJFzwsrhICK7JryrUmriA7cCPCW1vpJVYQXHODr3Oe6asYEj0VU6PW4eFTii3Ty9TajMrWLbOOrTJXiZRJXbRtm8eBAdF2Xz4oNo58HfUmhzo3g7jYq+Zu9KXV0Go+54nSPKT7+1JMArwiW86wiNL2sm3ERKKfF/VvA42zkbus9BREyoc8WC68r/N+Ap/3RtDB84S/y7A4LlqI0xueeKIWx/+PtXkoHzqeOkRpdV3TCmELbpsbWG2Td4yA2QwefUgCS/BLzO185xehSYB/6ksyObsLeX2zHmxihOkdB3Biixqc3UBC8If6eaom9Mn5tXvQJ/9x40HFtsGKmd5pxjHV/oPZU/ReS57wCvp1YYY2r0N3xeC7YicnF7im9fx4rMqzCJcMCz1cGLaDnW7R74jEI865XenUpia3M/xmp0g/ghQ+qViUOia5XBoWoO8ee1yaj1QC7B/rXIKJK94ug+JLqvXAo0jTqjc+CT2nbdwEtuu7C7xSaKphUaAi1pm62/qb/aoWXUzWiDztEdhD8e4aRB9I1YdzArjkr0CeGNo0xNnK9UBNp4pEr0CeFF5oRXXPODIzsILzMgtpFSg+BGHg/3VcLjcdVKSEr0Vzjil4x/AHvTrF5jm3d2wZUcif8BqSLxz8FiAOgAAAAASUVORK5CYII=";
|
|
826
|
+
|
|
827
|
+
var unlockedIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAACXBIWXMAAAsSAAALEgHS3X78AAAFYklEQVR4nO1d0ZGjOBB9ct3/+iJYMlg2giODcwjeDCYEbwbeDNgMvBloIjgmAyYDHEHfh4SHsQUIaLVk7FfVNTblkZpHq1u0GqGICKlAKZUDyADkVrYA/vH891f7VwOoANREVDGrOBsqJtFKqQxAAWBn/35h7uIMQ/wJgCaimrl9b4gTrZTaAthb+SbaOfAGoARQElEj2jMRiQiMxZYAKBEpARRi5y9EsE6A2D7REoQ/MsGihIcgeIu0XMRUKQFskyYaZvbQJEDWUmkA7JIjegVWHNy6OUjOYW4QYpMSSioAeVSiYQLeGlzFmDRYGCiXkLxPgABp2YsS/aAkLyL7SbIQ2U+ShcieGvhin1xq4h0gvbJ3Nk+swZ/G9MEZZooFmKlkDB36cIYhezzv7WHJW8jOkxsAR5i7TOfNAszoOgKoBfXqk6pPz0muA3J3fDXmBBkTN2ITXi4i2lqVhKJHH6sYGXXHyGQP5kbGlJe465tsxSPWHYvoZshYYrsMNpITIbvXhfQpWwgo9eJB2AmfR1Vjjw1eoMhkF1OI1oGV0SNxofZoo8aAX7QXJAbRznOLZc1ZDzlzAtqxp60sEtEEh1XHsGanHwNwWNCm0w0h3mLEjVUnYc1M/d4k55GQVUtbQBUwJpx62q4jEV06iYaZN4fu/MafgtfqXKMlFtGEzrx6gw/sER6u5MuOsf1D94tS6gXAV8b2p2J/+dS58hKJo9tovCwIukTbNrXA+YxJ9cl1QC5ouIiONd+VkqzrOgrEQzI1zIFQALgQzeknh5AJ9ZMSdgDELTpzHDsJ9R0LRfshR4TgkNAUTMRPbyA7nL/ZxymuoQV1iIF8A2PRknDFg7W7j3wD+RnHTX9EdIJZUV4r8r8idPqvUmpLtw/rHBH+oscqV9gCskGhgblrY6+o9xWYmHSAfBWsWEenmAQ7CN9C9q5UpJMyNrEDhGsJDlTLdkC8wyTlZR+g9IR9wLRGYN+9Gf/JYhxSJRkArG7H0P1IWPTfKRMNXIo4/wvaB8IS/U5EWcD22aCUCmpwoV1HHbj9u4GEj2aBUmqnlKqUUmSlUkpJpXdZEHJao5mmYEOFNc4Cmhl9BJ9H65SJhl/NR5E40XoDcyuaMnzcwz60EgvRbJD+mp1PGjcLrcRCVPdAtM+IS31U3gXRPosCqS8cVG0gCJUy5Jp1DBX3ONchEwqGDdFHXYdmuGohUQD44zj+B3FrUnyggY8blqSHHhE1RLQD8LNz+CcR7VLPo8Byey8Wfc/QgCWazA6HbxGVWSveLLefch1lFFXWjbL98CQ6LMr2w4VoG1R+x9BmpfjdDdTXadJSVpdVo+x++UQ0EWl87MP8xHy8Wi4vcCX+DyKqzENbOnZG2nP/w/UB5w40SikN/53Ih8C+ZmgXUkHMu50zrhm+ElFx034P0Zyrwo+2Cv7dZQTONUP7w19MHd/Duh6Xjr96R9pANqut4FmavaqRUM1dz3lyZC8Hz7N3FdwO95cJV7MPXyFQCbQAJ/CUg+0HXaTHFefaq6hEQpYN3mrS0ZV4X6W4nqqtYRZS11Qf7bXw4LvBYGbJ5qy4fId8JRN3xf8ZplK2Hvuh93tYJAoB7xDOqZwL3iVhtsEfs1VaH374kgzAz0df+bg9eHzbPct+Mm8zA8ojkz2Z5NlEPzDZs0j2nnX0IfJ2x5Lw3764B4vqo23HOda9sPsGM4Vbli1kuglIYbfbELJoF2AWH91D+PMVThJEr8S62aw4KNEdwttAGZs4X9FgeFWTONEdwovECde45xdH9hBeJkBsK6UEwa08X+4rhOfrqoUQlehrWOJzzH8BewOTN69gEvI1u5Iz8T+TOcUtjzRRXwAAAABJRU5ErkJggg==";
|
|
828
|
+
|
|
828
829
|
function pathD(poly) {
|
|
829
830
|
return `M ${poly.map((pt) => `${pt.x} ${pt.y}`).join(" L ")} Z`;
|
|
830
831
|
}
|
|
@@ -995,10 +996,20 @@ function BoardView(props) {
|
|
|
995
996
|
}
|
|
996
997
|
)));
|
|
997
998
|
}),
|
|
999
|
+
/* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement("filter", { id: "invert-to-white" }, /* @__PURE__ */ React.createElement(
|
|
1000
|
+
"feColorMatrix",
|
|
1001
|
+
{
|
|
1002
|
+
type: "matrix",
|
|
1003
|
+
values: "-1 0 0 0 1\n 0 -1 0 0 1\n 0 0 -1 0 1\n 0 0 0 1 0"
|
|
1004
|
+
}
|
|
1005
|
+
))),
|
|
998
1006
|
(() => {
|
|
999
1007
|
const isPrep = controller.state.cfg.mode === "prep";
|
|
1000
1008
|
const isSubmitEnabled = isPrep ? controller.isSubmitEnabled() : true;
|
|
1001
1009
|
const isClickable = !draggingId && (!isPrep || isSubmitEnabled);
|
|
1010
|
+
const [imageError, setImageError] = React.useState(false);
|
|
1011
|
+
const iconSize = badgeR * 1.6;
|
|
1012
|
+
const iconOffset = iconSize / 2;
|
|
1002
1013
|
return /* @__PURE__ */ React.createElement(
|
|
1003
1014
|
"g",
|
|
1004
1015
|
{
|
|
@@ -1014,7 +1025,7 @@ function BoardView(props) {
|
|
|
1014
1025
|
opacity: isSubmitEnabled ? 1 : 0.5
|
|
1015
1026
|
}
|
|
1016
1027
|
),
|
|
1017
|
-
/* @__PURE__ */ React.createElement(
|
|
1028
|
+
isPrep ? /* @__PURE__ */ React.createElement(
|
|
1018
1029
|
"text",
|
|
1019
1030
|
{
|
|
1020
1031
|
textAnchor: "middle",
|
|
@@ -1023,7 +1034,29 @@ function BoardView(props) {
|
|
|
1023
1034
|
fill: isSubmitEnabled ? CONFIG.color.blueprint.labelFill : "#888",
|
|
1024
1035
|
pointerEvents: "none"
|
|
1025
1036
|
},
|
|
1026
|
-
|
|
1037
|
+
"Submit"
|
|
1038
|
+
) : imageError ? /* @__PURE__ */ React.createElement(
|
|
1039
|
+
"text",
|
|
1040
|
+
{
|
|
1041
|
+
textAnchor: "middle",
|
|
1042
|
+
dominantBaseline: "middle",
|
|
1043
|
+
fontSize: CONFIG.size.badgeFontPx,
|
|
1044
|
+
fill: CONFIG.color.blueprint.labelFill,
|
|
1045
|
+
pointerEvents: "none"
|
|
1046
|
+
},
|
|
1047
|
+
"inventory"
|
|
1048
|
+
) : /* @__PURE__ */ React.createElement(
|
|
1049
|
+
"image",
|
|
1050
|
+
{
|
|
1051
|
+
href: controller.state.blueprintView === "quickstash" ? lockedIcon : unlockedIcon,
|
|
1052
|
+
x: -iconOffset,
|
|
1053
|
+
y: -iconOffset,
|
|
1054
|
+
width: iconSize,
|
|
1055
|
+
height: iconSize,
|
|
1056
|
+
pointerEvents: "none",
|
|
1057
|
+
onError: () => setImageError(true),
|
|
1058
|
+
filter: "url(#invert-to-white)"
|
|
1059
|
+
}
|
|
1027
1060
|
)
|
|
1028
1061
|
);
|
|
1029
1062
|
})(),
|
|
@@ -2611,6 +2644,7 @@ class InteractionTracker {
|
|
|
2611
2644
|
const trialEndTime = Date.now();
|
|
2612
2645
|
const totalDuration = trialEndTime - this.trialStartTime;
|
|
2613
2646
|
const finalSnapshot = this.buildStateSnapshot();
|
|
2647
|
+
const anchorToStimuliRatio = CONFIG.layout.grid.stepPx / CONFIG.layout.grid.unitPx;
|
|
2614
2648
|
const mode = this.controller.state.cfg.mode;
|
|
2615
2649
|
if (mode === "construction") {
|
|
2616
2650
|
const finalBlueprintState = this.buildFinalBlueprintState(finalSnapshot);
|
|
@@ -2625,6 +2659,7 @@ class InteractionTracker {
|
|
|
2625
2659
|
trialStartTime: this.trialStartTime,
|
|
2626
2660
|
trialEndTime,
|
|
2627
2661
|
totalDuration,
|
|
2662
|
+
anchorToStimuliRatio,
|
|
2628
2663
|
trialParams: this.trialParams,
|
|
2629
2664
|
endReason,
|
|
2630
2665
|
completionTimes: this.completionTimes,
|
|
@@ -2647,6 +2682,7 @@ class InteractionTracker {
|
|
|
2647
2682
|
trialStartTime: this.trialStartTime,
|
|
2648
2683
|
trialEndTime,
|
|
2649
2684
|
totalDuration,
|
|
2685
|
+
anchorToStimuliRatio,
|
|
2650
2686
|
trialParams: this.trialParams,
|
|
2651
2687
|
endReason: "submit",
|
|
2652
2688
|
createdMacros: finalMacros,
|