jspsych-tangram 0.0.5 → 0.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jspsych-tangram",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Tangram tasks for jsPsych: prep and construct.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -25,6 +25,7 @@ import { CONFIG } from "../../core/config/config";
25
25
  export interface StartConstructionTrialParams {
26
26
  tangrams: any[];
27
27
  quickstash_macros?: Blueprint[] | AnchorComposite[];
28
+ primitiveOrder: string[];
28
29
  target?: PlacementTarget;
29
30
  input?: InputMode;
30
31
  layout?: LayoutMode;
@@ -57,6 +58,9 @@ export function startConstructionTrial(
57
58
  "largetriangle",
58
59
  ]);
59
60
 
61
+ // make copy of PRIMITIVE_BLUEPRINTS sorted by primitiveOrder
62
+ const PRIMITIVE_BLUEPRINTS_ORDERED = [...PRIMITIVE_BLUEPRINTS].sort((a, b) => params.primitiveOrder.indexOf(a.kind) - params.primitiveOrder.indexOf(b.kind));
63
+
60
64
  // Convert JSON plugin parameters to internal Sector[] format
61
65
  const sectors: Sector[] = params.tangrams.map((tangramSpec, index) => {
62
66
 
@@ -99,7 +103,7 @@ export function startConstructionTrial(
99
103
 
100
104
  // Create primitive map for conversion
101
105
  const primsByKind = new Map<TanKind, PrimitiveBlueprint>();
102
- PRIMITIVE_BLUEPRINTS.forEach(p => primsByKind.set(p.kind, p));
106
+ PRIMITIVE_BLUEPRINTS_ORDERED.forEach(p => primsByKind.set(p.kind, p));
103
107
 
104
108
  // Convert each anchor composite to pixel-based blueprint
105
109
  quickstash = (params.quickstash_macros as AnchorComposite[]).map(anchorComposite =>
@@ -116,7 +120,7 @@ export function startConstructionTrial(
116
120
  const gameBoardProps = {
117
121
  sectors,
118
122
  quickstash,
119
- primitives: PRIMITIVE_BLUEPRINTS,
123
+ primitives: PRIMITIVE_BLUEPRINTS_ORDERED,
120
124
  layout: params.layout as LayoutMode,
121
125
  target: params.target as PlacementTarget,
122
126
  input: params.input as InputMode,
@@ -17,6 +17,12 @@ const info = {
17
17
  default: [],
18
18
  description: "Array of MacroSpec objects created in prep trial"
19
19
  },
20
+ /** Array of primitive names in the order they should be displayed */
21
+ primitive_order: {
22
+ type: ParameterType.OBJECT,
23
+ default: ["square", "smalltriangle", "parallelogram", "medtriangle", "largetriangle"],
24
+ description: "Array of primitive names in the order they should be displayed"
25
+ },
20
26
  /** Whether to place pieces in workspace or directly on silhouette */
21
27
  target: {
22
28
  type: ParameterType.SELECT,
@@ -137,6 +143,7 @@ class TangramConstructPlugin implements JsPsychPlugin<Info> {
137
143
  const params: StartConstructionTrialParams = {
138
144
  tangrams: trial.tangrams,
139
145
  quickstash_macros: trial.quickstash_macros,
146
+ primitiveOrder: trial.primitive_order,
140
147
  target: trial.target,
141
148
  input: trial.input,
142
149
  layout: trial.layout,
@@ -32,6 +32,7 @@ export interface StartPrepTrialParams {
32
32
  layoutMode: "circle" | "semicircle";
33
33
  requireAllSlots: boolean;
34
34
  quickstashMacros?: AnchorComposite[];
35
+ primitiveOrder: string[];
35
36
  onInteraction?: (event: any) => void;
36
37
  onTrialEnd?: (data: any) => void;
37
38
  }
@@ -53,10 +54,14 @@ export function startPrepTrial(
53
54
  layoutMode,
54
55
  requireAllSlots,
55
56
  quickstashMacros,
57
+ primitiveOrder,
56
58
  onInteraction,
57
59
  onTrialEnd,
58
60
  } = params;
59
61
 
62
+ // make copy of PRIMITIVE_BLUEPRINTS sorted by primitiveOrder
63
+ const PRIMITIVE_BLUEPRINTS_ORDERED = [...PRIMITIVE_BLUEPRINTS].sort((a, b) => primitiveOrder.indexOf(a.kind) - primitiveOrder.indexOf(b.kind));
64
+
60
65
  // Create blank prep sectors (no silhouettes)
61
66
  const prepSectors: Sector[] = Array.from({ length: numQuickstashSlots }, (_, i) => ({
62
67
  id: `prep-sector-${i}`,
@@ -75,7 +80,8 @@ export function startPrepTrial(
75
80
  if (quickstashMacros && quickstashMacros.length > 0 && layout) {
76
81
  // Spawn pieces immediately when controller and layout are ready
77
82
  const primsByKind = new Map<TanKind, PrimitiveBlueprint>();
78
- PRIMITIVE_BLUEPRINTS.forEach(p => primsByKind.set(p.kind, p));
83
+
84
+ PRIMITIVE_BLUEPRINTS_ORDERED.forEach(p => primsByKind.set(p.kind, p));
79
85
 
80
86
  quickstashMacros.forEach((anchorComposite, macroIndex) => {
81
87
  const sectorId = `prep-sector-${macroIndex}`;
@@ -164,7 +170,7 @@ export function startPrepTrial(
164
170
  root.render(React.createElement(GameBoard, {
165
171
  sectors: prepSectors,
166
172
  quickstash: [], // No pre-made macros
167
- primitives: PRIMITIVE_BLUEPRINTS,
173
+ primitives: PRIMITIVE_BLUEPRINTS_ORDERED,
168
174
  layout: layoutMode,
169
175
  target: 'workspace', // Pieces go in sectors
170
176
  input: inputMode,
@@ -41,6 +41,12 @@ const info = {
41
41
  default: [],
42
42
  description: "Array of AnchorComposite objects to edit as primitive pieces"
43
43
  },
44
+ /** Array of primitive names in the order they should be displayed */
45
+ primitive_order: {
46
+ type: ParameterType.OBJECT,
47
+ default: ["square", "smalltriangle", "parallelogram", "medtriangle", "largetriangle"],
48
+ description: "Array of primitive names in the order they should be displayed"
49
+ },
44
50
  /** Callback fired after each interaction (optional analytics hook) */
45
51
  onInteraction: {
46
52
  type: ParameterType.FUNCTION,
@@ -108,6 +114,7 @@ class TangramPrepPlugin implements JsPsychPlugin<Info> {
108
114
  layoutMode: trial.layout as "circle" | "semicircle",
109
115
  requireAllSlots: trial.require_all_slots,
110
116
  quickstashMacros: trial.quickstash_macros,
117
+ primitiveOrder: trial.primitive_order,
111
118
  onInteraction: trial.onInteraction,
112
119
  onTrialEnd: wrappedOnTrialEnd,
113
120
  };