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/prep/index.js
CHANGED
|
@@ -12,9 +12,8 @@ const CONFIG = {
|
|
|
12
12
|
completion: { fill: "#ccfff2", stroke: "#13da57" },
|
|
13
13
|
silhouetteMask: "#374151",
|
|
14
14
|
anchors: { invalid: "#7dd3fc", valid: "#475569" },
|
|
15
|
-
piece: { draggingFill: "#8e7cc3ff", validFill: "#8e7cc3ff", invalidFill: "#ef4444",
|
|
16
|
-
|
|
17
|
-
blueprint: { fill: "#374151", selectedStroke: "#111827", badgeFill: "#000000", labelFill: "#ffffff" },
|
|
15
|
+
piece: { draggingFill: "#8e7cc3ff", validFill: "#8e7cc3ff", invalidFill: "#ef4444", allGreenStroke: "#86efac"},
|
|
16
|
+
blueprint: { fill: "#374151", badgeFill: "#000000", labelFill: "#ffffff" },
|
|
18
17
|
tangramDecomposition: { stroke: "#fef2cc" }
|
|
19
18
|
},
|
|
20
19
|
opacity: {
|
|
@@ -25,7 +24,7 @@ const CONFIG = {
|
|
|
25
24
|
piece: { invalid: 0.35, dragging: 0.75, locked: 1, normal: 1 }
|
|
26
25
|
},
|
|
27
26
|
size: {
|
|
28
|
-
stroke: { bandPx: 5,
|
|
27
|
+
stroke: { bandPx: 5, allGreenStrokePx: 10, tangramDecompositionPx: 1 },
|
|
29
28
|
anchorRadiusPx: { valid: 1, invalid: 1 },
|
|
30
29
|
badgeFontPx: 16,
|
|
31
30
|
centerBadge: { fractionOfOuterR: 0.15, minPx: 20, marginPx: 4 }
|
|
@@ -40,14 +39,10 @@ const CONFIG = {
|
|
|
40
39
|
quickstashDiamAnchors: 7,
|
|
41
40
|
// num anchors req'd to be in single quickstash slot
|
|
42
41
|
primitiveDiamAnchors: 5
|
|
43
|
-
},
|
|
44
|
-
defaults: { maxQuickstashSlots: 1 }
|
|
45
|
-
},
|
|
42
|
+
}},
|
|
46
43
|
game: {
|
|
47
44
|
snapRadiusPx: 15,
|
|
48
|
-
showBorders: false
|
|
49
|
-
hideTouchingBorders: true
|
|
50
|
-
}
|
|
45
|
+
showBorders: false}
|
|
51
46
|
};
|
|
52
47
|
|
|
53
48
|
function isComposite(bp) {
|
|
@@ -823,6 +818,10 @@ function shouldUseSelectiveBorders(blueprintId) {
|
|
|
823
818
|
return CONFIG.game.showBorders;
|
|
824
819
|
}
|
|
825
820
|
|
|
821
|
+
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=";
|
|
822
|
+
|
|
823
|
+
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==";
|
|
824
|
+
|
|
826
825
|
function pathD(poly) {
|
|
827
826
|
return `M ${poly.map((pt) => `${pt.x} ${pt.y}`).join(" L ")} Z`;
|
|
828
827
|
}
|
|
@@ -993,10 +992,20 @@ function BoardView(props) {
|
|
|
993
992
|
}
|
|
994
993
|
)));
|
|
995
994
|
}),
|
|
995
|
+
/* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement("filter", { id: "invert-to-white" }, /* @__PURE__ */ React.createElement(
|
|
996
|
+
"feColorMatrix",
|
|
997
|
+
{
|
|
998
|
+
type: "matrix",
|
|
999
|
+
values: "-1 0 0 0 1\n 0 -1 0 0 1\n 0 0 -1 0 1\n 0 0 0 1 0"
|
|
1000
|
+
}
|
|
1001
|
+
))),
|
|
996
1002
|
(() => {
|
|
997
1003
|
const isPrep = controller.state.cfg.mode === "prep";
|
|
998
1004
|
const isSubmitEnabled = isPrep ? controller.isSubmitEnabled() : true;
|
|
999
1005
|
const isClickable = !draggingId && (!isPrep || isSubmitEnabled);
|
|
1006
|
+
const [imageError, setImageError] = React.useState(false);
|
|
1007
|
+
const iconSize = badgeR * 1.6;
|
|
1008
|
+
const iconOffset = iconSize / 2;
|
|
1000
1009
|
return /* @__PURE__ */ React.createElement(
|
|
1001
1010
|
"g",
|
|
1002
1011
|
{
|
|
@@ -1012,7 +1021,7 @@ function BoardView(props) {
|
|
|
1012
1021
|
opacity: isSubmitEnabled ? 1 : 0.5
|
|
1013
1022
|
}
|
|
1014
1023
|
),
|
|
1015
|
-
/* @__PURE__ */ React.createElement(
|
|
1024
|
+
isPrep ? /* @__PURE__ */ React.createElement(
|
|
1016
1025
|
"text",
|
|
1017
1026
|
{
|
|
1018
1027
|
textAnchor: "middle",
|
|
@@ -1021,7 +1030,29 @@ function BoardView(props) {
|
|
|
1021
1030
|
fill: isSubmitEnabled ? CONFIG.color.blueprint.labelFill : "#888",
|
|
1022
1031
|
pointerEvents: "none"
|
|
1023
1032
|
},
|
|
1024
|
-
|
|
1033
|
+
"Submit"
|
|
1034
|
+
) : imageError ? /* @__PURE__ */ React.createElement(
|
|
1035
|
+
"text",
|
|
1036
|
+
{
|
|
1037
|
+
textAnchor: "middle",
|
|
1038
|
+
dominantBaseline: "middle",
|
|
1039
|
+
fontSize: CONFIG.size.badgeFontPx,
|
|
1040
|
+
fill: CONFIG.color.blueprint.labelFill,
|
|
1041
|
+
pointerEvents: "none"
|
|
1042
|
+
},
|
|
1043
|
+
"inventory"
|
|
1044
|
+
) : /* @__PURE__ */ React.createElement(
|
|
1045
|
+
"image",
|
|
1046
|
+
{
|
|
1047
|
+
href: controller.state.blueprintView === "quickstash" ? lockedIcon : unlockedIcon,
|
|
1048
|
+
x: -iconOffset,
|
|
1049
|
+
y: -iconOffset,
|
|
1050
|
+
width: iconSize,
|
|
1051
|
+
height: iconSize,
|
|
1052
|
+
pointerEvents: "none",
|
|
1053
|
+
onError: () => setImageError(true),
|
|
1054
|
+
filter: "url(#invert-to-white)"
|
|
1055
|
+
}
|
|
1025
1056
|
)
|
|
1026
1057
|
);
|
|
1027
1058
|
})(),
|
|
@@ -2609,6 +2640,7 @@ class InteractionTracker {
|
|
|
2609
2640
|
const trialEndTime = Date.now();
|
|
2610
2641
|
const totalDuration = trialEndTime - this.trialStartTime;
|
|
2611
2642
|
const finalSnapshot = this.buildStateSnapshot();
|
|
2643
|
+
const anchorToStimuliRatio = CONFIG.layout.grid.stepPx / CONFIG.layout.grid.unitPx;
|
|
2612
2644
|
const mode = this.controller.state.cfg.mode;
|
|
2613
2645
|
if (mode === "construction") {
|
|
2614
2646
|
const finalBlueprintState = this.buildFinalBlueprintState(finalSnapshot);
|
|
@@ -2623,6 +2655,7 @@ class InteractionTracker {
|
|
|
2623
2655
|
trialStartTime: this.trialStartTime,
|
|
2624
2656
|
trialEndTime,
|
|
2625
2657
|
totalDuration,
|
|
2658
|
+
anchorToStimuliRatio,
|
|
2626
2659
|
trialParams: this.trialParams,
|
|
2627
2660
|
endReason,
|
|
2628
2661
|
completionTimes: this.completionTimes,
|
|
@@ -2645,6 +2678,7 @@ class InteractionTracker {
|
|
|
2645
2678
|
trialStartTime: this.trialStartTime,
|
|
2646
2679
|
trialEndTime,
|
|
2647
2680
|
totalDuration,
|
|
2681
|
+
anchorToStimuliRatio,
|
|
2648
2682
|
trialParams: this.trialParams,
|
|
2649
2683
|
endReason: "submit",
|
|
2650
2684
|
createdMacros: finalMacros,
|