@mhmttosun/dnd 0.0.0-stage → 1.1.1

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.
@@ -0,0 +1,883 @@
1
+ /**
2
+ * SampleProjects - 4 temel etkinlik türü için hazır, yüksek kaliteli ve
3
+ * görsel olarak zengin örnek projeler.
4
+ */
5
+
6
+ // SVG Vektör Görsel Üreteçleri (Data URL)
7
+ function createSvgDataUrl(svgString) {
8
+ return 'data:image/svg+xml;utf8,' + encodeURIComponent(svgString.trim());
9
+ }
10
+
11
+ // 1. İnsan Anatomisi Vektör Görseli
12
+ const humanBodySvg = createSvgDataUrl(`
13
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 550" width="400" height="550">
14
+ <defs>
15
+ <linearGradient id="bodyGrad" x1="0%" y1="0%" x2="100%" y2="100%">
16
+ <stop offset="0%" stop-color="#fed7aa" />
17
+ <stop offset="100%" stop-color="#fdba74" />
18
+ </linearGradient>
19
+ <linearGradient id="organGrad" x1="0%" y1="0%" x2="0%" y2="100%">
20
+ <stop offset="0%" stop-color="#fda4af" />
21
+ <stop offset="100%" stop-color="#f43f5e" />
22
+ </linearGradient>
23
+ <linearGradient id="lungGrad" x1="0%" y1="0%" x2="100%" y2="100%">
24
+ <stop offset="0%" stop-color="#bae6fd" />
25
+ <stop offset="100%" stop-color="#38bdf8" />
26
+ </linearGradient>
27
+ </defs>
28
+
29
+ <!-- Kafa ve Boyun -->
30
+ <circle cx="200" cy="70" r="45" fill="url(#bodyGrad)" stroke="#ea580c" stroke-width="2" />
31
+ <rect x="188" y="110" width="24" height="30" fill="url(#bodyGrad)" />
32
+
33
+ <!-- Gövde -->
34
+ <path d="M 140 140 C 130 180, 125 240, 135 340 C 140 390, 150 430, 200 430 C 250 430, 260 390, 265 340 C 275 240, 270 180, 260 140 Z" fill="url(#bodyGrad)" stroke="#ea580c" stroke-width="2" />
35
+
36
+ <!-- Omuzlar ve Kollar (Kısa) -->
37
+ <path d="M 140 140 C 100 170, 90 230, 95 300" stroke="#fed7aa" stroke-width="26" stroke-linecap="round" fill="none" />
38
+ <path d="M 260 140 C 300 170, 310 230, 305 300" stroke="#fed7aa" stroke-width="26" stroke-linecap="round" fill="none" />
39
+
40
+ <!-- Beyin Şematik Çizgisi -->
41
+ <path d="M 180 65 Q 200 45 220 65 Q 210 85 190 85 Z" fill="#fbcfe8" stroke="#db2777" stroke-width="1.5" opacity="0.85" />
42
+
43
+ <!-- Akciğerler Şematik -->
44
+ <path d="M 160 180 C 145 200, 150 250, 175 250 C 185 240, 185 200, 175 180 Z" fill="url(#lungGrad)" stroke="#0284c7" stroke-width="1.5" opacity="0.9" />
45
+ <path d="M 240 180 C 255 200, 250 250, 225 250 C 215 240, 215 200, 225 180 Z" fill="url(#lungGrad)" stroke="#0284c7" stroke-width="1.5" opacity="0.9" />
46
+
47
+ <!-- Kalp Şematik -->
48
+ <path d="M 200 215 C 190 200, 175 210, 185 230 L 200 245 L 215 230 C 225 210, 210 200, 200 215 Z" fill="url(#organGrad)" stroke="#be123c" stroke-width="1.5" />
49
+
50
+ <!-- Karaciğer Şematik -->
51
+ <path d="M 175 270 C 160 275, 170 305, 205 305 C 220 295, 215 270, 195 270 Z" fill="#ca8a04" stroke="#a16207" stroke-width="1.5" opacity="0.85" />
52
+
53
+ <!-- Mide Şematik -->
54
+ <path d="M 210 275 C 235 280, 240 320, 215 330 C 195 330, 200 295, 210 275 Z" fill="#fb923c" stroke="#c2410c" stroke-width="1.5" opacity="0.9" />
55
+ </svg>
56
+ `);
57
+
58
+ // 2. Hayvan İkonları
59
+ const lionSvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="42" fill="#fef08a"/><circle cx="50" cy="50" r="30" fill="#f59e0b"/><circle cx="40" cy="46" r="4" fill="#1e293b"/><circle cx="60" cy="46" r="4" fill="#1e293b"/><polygon points="46,55 54,55 50,60" fill="#78350f"/><path d="M 45 64 Q 50 68 55 64" stroke="#78350f" stroke-width="2" fill="none"/><text x="50" y="88" font-size="12" font-family="sans-serif" font-weight="bold" fill="#78350f" text-anchor="middle">ASLAN</text></svg>`);
60
+ const penguinSvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><ellipse cx="50" cy="50" rx="32" ry="42" fill="#0f172a"/><ellipse cx="50" cy="54" rx="22" ry="30" fill="#ffffff"/><circle cx="42" cy="38" r="3.5" fill="#0f172a"/><circle cx="58" cy="38" r="3.5" fill="#0f172a"/><polygon points="46,45 54,45 50,54" fill="#f97316"/><ellipse cx="36" cy="88" rx="8" ry="4" fill="#f97316"/><ellipse cx="64" cy="88" rx="8" ry="4" fill="#f97316"/><text x="50" y="24" font-size="11" font-family="sans-serif" font-weight="bold" fill="#38bdf8" text-anchor="middle">PENGUEN</text></svg>`);
61
+ const dolphinSvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M 20 65 Q 40 25 75 35 Q 85 45 80 55 Q 60 55 35 70 Z" fill="#0284c7"/><polygon points="75,35 90,20 85,38" fill="#0284c7"/><polygon points="48,32 54,18 58,34" fill="#0369a1"/><circle cx="32" cy="52" r="3" fill="#ffffff"/><circle cx="31" cy="52" r="1.5" fill="#0f172a"/><text x="50" y="90" font-size="12" font-family="sans-serif" font-weight="bold" fill="#0284c7" text-anchor="middle">YUNUS</text></svg>`);
62
+ const eagleSvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="40" fill="#78350f"/><circle cx="50" cy="40" r="26" fill="#f8fafc"/><circle cx="42" cy="38" r="3.5" fill="#ca8a04"/><polygon points="45,44 55,44 50,58" fill="#eab308"/><text x="50" y="88" font-size="12" font-family="sans-serif" font-weight="bold" fill="#fef08a" text-anchor="middle">KARTAL</text></svg>`);
63
+
64
+ // 3. Yaşam Döngüsü İkonları (Kelebek)
65
+ const eggSvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><ellipse cx="50" cy="65" rx="35" ry="18" fill="#84cc16"/><ellipse cx="48" cy="48" rx="14" ry="18" fill="#fef08a" stroke="#ca8a04" stroke-width="2"/><circle cx="48" cy="42" r="3" fill="#ffffff"/><text x="50" y="92" font-size="11" font-family="sans-serif" font-weight="bold" fill="#365314" text-anchor="middle">1. YUMURTA</text></svg>`);
66
+ const caterpillarSvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="25" cy="55" r="14" fill="#22c55e"/><circle cx="45" cy="50" r="14" fill="#16a34a"/><circle cx="65" cy="55" r="14" fill="#15803d"/><circle cx="80" cy="45" r="15" fill="#84cc16"/><circle cx="76" cy="40" r="2.5" fill="#000"/><circle cx="84" cy="40" r="2.5" fill="#000"/><text x="50" y="92" font-size="11" font-family="sans-serif" font-weight="bold" fill="#14532d" text-anchor="middle">2. TIRTIL</text></svg>`);
67
+ const chrysalisSvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><rect x="46" y="10" width="8" height="25" fill="#78350f"/><path d="M 50 35 C 30 50, 35 75, 50 90 C 65 75, 70 50, 50 35 Z" fill="#84cc16" stroke="#4d7c0f" stroke-width="2"/><text x="50" y="96" font-size="11" font-family="sans-serif" font-weight="bold" fill="#365314" text-anchor="middle">3. KOZA</text></svg>`);
68
+ const butterflySvg = createSvgDataUrl(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M 50 50 C 20 20, 10 50, 30 70 C 40 80, 48 65, 50 55 Z" fill="#ec4899"/><path d="M 50 50 C 80 20, 90 50, 70 70 C 60 80, 52 65, 50 55 Z" fill="#3b82f6"/><ellipse cx="50" cy="52" rx="4" ry="18" fill="#1e293b"/><text x="50" y="94" font-size="11" font-family="sans-serif" font-weight="bold" fill="#1e293b" text-anchor="middle">4. KELEBEK</text></svg>`);
69
+
70
+ const SAMPLE_PROJECTS = {
71
+ // 1. ETKİNLİK: GÖRSEL ÜZERİNDE ETİKETLEME (ORGANLAR)
72
+ 'image-labeling': {
73
+ version: '1.0',
74
+ project: {
75
+ id: 'proj_sample_labeling',
76
+ name: 'İnsan Vücudundaki Organlar',
77
+ activityType: 'image-labeling',
78
+ description: 'Organ etiketlerini insan vücudu üzerindeki doğru konumlara yerleştirin.'
79
+ },
80
+ stage: {
81
+ width: 1200,
82
+ height: 675,
83
+ backgroundColor: '#f8fafc',
84
+ backgroundImage: null
85
+ },
86
+ objects: [
87
+ // Başlık ve Açıklama
88
+ {
89
+ id: 'title_1',
90
+ name: 'Ana Başlık',
91
+ type: 'text',
92
+ role: 'decorative',
93
+ x: 40,
94
+ y: 30,
95
+ width: 440,
96
+ height: 50,
97
+ rotation: 0,
98
+ zIndex: 1,
99
+ locked: false,
100
+ visible: true,
101
+ text: 'İnsan Vücudu ve Organlarımız',
102
+ fontSize: 26,
103
+ fontWeight: '800',
104
+ textColor: '#0f172a',
105
+ textAlign: 'left',
106
+ backgroundColor: 'transparent',
107
+ borderColor: 'transparent'
108
+ },
109
+ {
110
+ id: 'desc_1',
111
+ name: 'Açıklama',
112
+ type: 'text',
113
+ role: 'decorative',
114
+ x: 40,
115
+ y: 80,
116
+ width: 440,
117
+ height: 35,
118
+ rotation: 0,
119
+ zIndex: 1,
120
+ locked: false,
121
+ visible: true,
122
+ text: 'Sağ taraftaki organ etiketlerini vücut üzerindeki doğru hedef kutucuklarına sürükleyin.',
123
+ fontSize: 14,
124
+ fontWeight: '500',
125
+ textColor: '#64748b',
126
+ textAlign: 'left',
127
+ backgroundColor: 'transparent',
128
+ borderColor: 'transparent'
129
+ },
130
+
131
+ // Ana Anatomi Görseli (Ortada)
132
+ {
133
+ id: 'bg_anatomy',
134
+ name: 'Anatomi Çizimi',
135
+ type: 'image',
136
+ role: 'decorative',
137
+ x: 410,
138
+ y: 80,
139
+ width: 380,
140
+ height: 530,
141
+ rotation: 0,
142
+ zIndex: 2,
143
+ locked: false,
144
+ visible: true,
145
+ src: humanBodySvg,
146
+ backgroundColor: '#ffffff',
147
+ borderColor: '#e2e8f0',
148
+ borderWidth: 1,
149
+ borderRadius: 16,
150
+ boxShadow: '0 8px 24px rgba(0,0,0,0.06)'
151
+ },
152
+
153
+ // Hedef Noktaları (Görsel Üzerinde)
154
+ {
155
+ id: 'target_brain',
156
+ name: 'Hedef: Beyin',
157
+ type: 'zone',
158
+ role: 'target',
159
+ x: 540,
160
+ y: 120,
161
+ width: 120,
162
+ height: 44,
163
+ rotation: 0,
164
+ zIndex: 3,
165
+ locked: false,
166
+ visible: true,
167
+ text: 'Hedef: Baş Bölgesi',
168
+ fontSize: 12,
169
+ fontWeight: '600',
170
+ textColor: '#3b82f6',
171
+ backgroundColor: 'rgba(239, 246, 255, 0.75)',
172
+ borderColor: '#3b82f6',
173
+ borderStyle: 'dashed',
174
+ borderWidth: 2,
175
+ borderRadius: 8
176
+ },
177
+ {
178
+ id: 'target_lungs',
179
+ name: 'Hedef: Akciğerler',
180
+ type: 'zone',
181
+ role: 'target',
182
+ x: 430,
183
+ y: 250,
184
+ width: 130,
185
+ height: 48,
186
+ rotation: 0,
187
+ zIndex: 3,
188
+ locked: false,
189
+ visible: true,
190
+ text: 'Hedef: Göğüs',
191
+ fontSize: 12,
192
+ fontWeight: '600',
193
+ textColor: '#0284c7',
194
+ backgroundColor: 'rgba(240, 249, 255, 0.75)',
195
+ borderColor: '#0284c7',
196
+ borderStyle: 'dashed',
197
+ borderWidth: 2,
198
+ borderRadius: 8
199
+ },
200
+ {
201
+ id: 'target_heart',
202
+ name: 'Hedef: Kalp',
203
+ type: 'zone',
204
+ role: 'target',
205
+ x: 640,
206
+ y: 270,
207
+ width: 120,
208
+ height: 48,
209
+ rotation: 0,
210
+ zIndex: 3,
211
+ locked: false,
212
+ visible: true,
213
+ text: 'Hedef: Kalp',
214
+ fontSize: 12,
215
+ fontWeight: '600',
216
+ textColor: '#e11d48',
217
+ backgroundColor: 'rgba(255, 241, 242, 0.75)',
218
+ borderColor: '#e11d48',
219
+ borderStyle: 'dashed',
220
+ borderWidth: 2,
221
+ borderRadius: 8
222
+ },
223
+ {
224
+ id: 'target_stomach',
225
+ name: 'Hedef: Mide',
226
+ type: 'zone',
227
+ role: 'target',
228
+ x: 610,
229
+ y: 360,
230
+ width: 120,
231
+ height: 48,
232
+ rotation: 0,
233
+ zIndex: 3,
234
+ locked: false,
235
+ visible: true,
236
+ text: 'Hedef: Karın',
237
+ fontSize: 12,
238
+ fontWeight: '600',
239
+ textColor: '#ea580c',
240
+ backgroundColor: 'rgba(255, 247, 237, 0.75)',
241
+ borderColor: '#ea580c',
242
+ borderStyle: 'dashed',
243
+ borderWidth: 2,
244
+ borderRadius: 8
245
+ },
246
+
247
+ // Sürüklenebilir Etiketler (Sağ Panelde)
248
+ {
249
+ id: 'drag_brain',
250
+ name: 'Etiket: Beyin',
251
+ type: 'text',
252
+ role: 'draggable',
253
+ x: 930,
254
+ y: 130,
255
+ width: 150,
256
+ height: 48,
257
+ rotation: 0,
258
+ zIndex: 10,
259
+ locked: false,
260
+ visible: true,
261
+ text: '🧠 Beyin',
262
+ fontSize: 16,
263
+ fontWeight: '700',
264
+ textColor: '#1e293b',
265
+ backgroundColor: '#ffffff',
266
+ borderColor: '#6366f1',
267
+ borderWidth: 2,
268
+ borderRadius: 10,
269
+ boxShadow: '0 4px 12px rgba(99, 102, 241, 0.15)'
270
+ },
271
+ {
272
+ id: 'drag_lungs',
273
+ name: 'Etiket: Akciğerler',
274
+ type: 'text',
275
+ role: 'draggable',
276
+ x: 930,
277
+ y: 200,
278
+ width: 150,
279
+ height: 48,
280
+ rotation: 0,
281
+ zIndex: 10,
282
+ locked: false,
283
+ visible: true,
284
+ text: '🫁 Akciğerler',
285
+ fontSize: 16,
286
+ fontWeight: '700',
287
+ textColor: '#1e293b',
288
+ backgroundColor: '#ffffff',
289
+ borderColor: '#6366f1',
290
+ borderWidth: 2,
291
+ borderRadius: 10,
292
+ boxShadow: '0 4px 12px rgba(99, 102, 241, 0.15)'
293
+ },
294
+ {
295
+ id: 'drag_heart',
296
+ name: 'Etiket: Kalp',
297
+ type: 'text',
298
+ role: 'draggable',
299
+ x: 930,
300
+ y: 270,
301
+ width: 150,
302
+ height: 48,
303
+ rotation: 0,
304
+ zIndex: 10,
305
+ locked: false,
306
+ visible: true,
307
+ text: '❤️ Kalp',
308
+ fontSize: 16,
309
+ fontWeight: '700',
310
+ textColor: '#1e293b',
311
+ backgroundColor: '#ffffff',
312
+ borderColor: '#6366f1',
313
+ borderWidth: 2,
314
+ borderRadius: 10,
315
+ boxShadow: '0 4px 12px rgba(99, 102, 241, 0.15)'
316
+ },
317
+ {
318
+ id: 'drag_stomach',
319
+ name: 'Etiket: Mide',
320
+ type: 'text',
321
+ role: 'draggable',
322
+ x: 930,
323
+ y: 340,
324
+ width: 150,
325
+ height: 48,
326
+ rotation: 0,
327
+ zIndex: 10,
328
+ locked: false,
329
+ visible: true,
330
+ text: '🥘 Mide',
331
+ fontSize: 16,
332
+ fontWeight: '700',
333
+ textColor: '#1e293b',
334
+ backgroundColor: '#ffffff',
335
+ borderColor: '#6366f1',
336
+ borderWidth: 2,
337
+ borderRadius: 10,
338
+ boxShadow: '0 4px 12px rgba(99, 102, 241, 0.15)'
339
+ }
340
+ ],
341
+ answerKey: {
342
+ 'drag_brain': 'target_brain',
343
+ 'drag_lungs': 'target_lungs',
344
+ 'drag_heart': 'target_heart',
345
+ 'drag_stomach': 'target_stomach'
346
+ },
347
+ settings: {
348
+ evaluationMode: 'instant',
349
+ wrongAnswerBehavior: 'return',
350
+ correctAnswerBehavior: 'lock',
351
+ showFeedback: true,
352
+ showScore: true,
353
+ allowRetry: true,
354
+ shuffleDraggables: true,
355
+ soundEnabled: true,
356
+ showTargetsInGame: true,
357
+ completionMessage: 'Mükemmel! Bütün ana organları doğru yerlerine yerleştirdiniz.'
358
+ }
359
+ },
360
+
361
+ // 2. ETKİNLİK: SÜRÜKLE-BIRAK EŞLEŞTİRME (KAVRAM VE TANIM)
362
+ 'matching': {
363
+ version: '1.0',
364
+ project: {
365
+ id: 'proj_sample_matching',
366
+ name: 'Kavram ve Tanım',
367
+ activityType: 'matching',
368
+ description: 'Kavramları doğru tanımlarla eşleştirin.'
369
+ },
370
+ stage: {
371
+ width: 1200,
372
+ height: 675,
373
+ backgroundColor: '#ffffff',
374
+ backgroundImage: null
375
+ },
376
+ objects: [
377
+ // Ana Başlık
378
+ {
379
+ id: 'match_title',
380
+ name: 'Başlık',
381
+ type: 'text',
382
+ role: 'decorative',
383
+ x: 120,
384
+ y: 45,
385
+ width: 500,
386
+ height: 42,
387
+ rotation: 0,
388
+ zIndex: 1,
389
+ locked: false,
390
+ visible: true,
391
+ text: 'Kavram ve Tanım',
392
+ fontSize: 28,
393
+ fontWeight: '700',
394
+ textColor: '#0f172a',
395
+ textAlign: 'left'
396
+ },
397
+ // Alt Açıklama
398
+ {
399
+ id: 'match_subtitle',
400
+ name: 'Açıklama',
401
+ type: 'text',
402
+ role: 'decorative',
403
+ x: 120,
404
+ y: 92,
405
+ width: 600,
406
+ height: 28,
407
+ rotation: 0,
408
+ zIndex: 1,
409
+ locked: false,
410
+ visible: true,
411
+ text: 'Kavramları doğru tanımlarla eşleştirin.',
412
+ fontSize: 14,
413
+ fontWeight: '500',
414
+ textColor: '#64748b',
415
+ textAlign: 'left'
416
+ },
417
+ // Dekoratif İnce Ayırıcı Çizgi
418
+ {
419
+ id: 'header_divider',
420
+ name: 'Ayırıcı Çizgi',
421
+ type: 'rectangle',
422
+ role: 'decorative',
423
+ x: 120,
424
+ y: 130,
425
+ width: 960,
426
+ height: 1,
427
+ rotation: 0,
428
+ zIndex: 1,
429
+ locked: false,
430
+ visible: true,
431
+ backgroundColor: '#e2e8f0',
432
+ borderColor: 'transparent',
433
+ borderWidth: 0,
434
+ borderRadius: 0
435
+ },
436
+ // Kolon 1 Başlığı: KAVRAMLAR
437
+ {
438
+ id: 'col_kavramlar',
439
+ name: 'Sütun Başlığı: Kavramlar',
440
+ type: 'text',
441
+ role: 'decorative',
442
+ x: 120,
443
+ y: 155,
444
+ width: 250,
445
+ height: 24,
446
+ rotation: 0,
447
+ zIndex: 2,
448
+ locked: false,
449
+ visible: true,
450
+ text: 'KAVRAMLAR',
451
+ fontSize: 12,
452
+ fontWeight: '700',
453
+ textColor: '#64748b',
454
+ textAlign: 'left'
455
+ },
456
+ // Kolon 2 Başlığı: TANIMLAR
457
+ {
458
+ id: 'col_tanimlar',
459
+ name: 'Sütun Başlığı: Tanımlar',
460
+ type: 'text',
461
+ role: 'decorative',
462
+ x: 520,
463
+ y: 155,
464
+ width: 250,
465
+ height: 24,
466
+ rotation: 0,
467
+ zIndex: 2,
468
+ locked: false,
469
+ visible: true,
470
+ text: 'TANIMLAR',
471
+ fontSize: 12,
472
+ fontWeight: '700',
473
+ textColor: '#64748b',
474
+ textAlign: 'left'
475
+ },
476
+ // Sol Sütun: Sürüklenebilir Kavram Kartları (Turuncu Kenarlık)
477
+ {
478
+ id: 'drag_kuvvet',
479
+ name: 'Kavram: Kuvvet',
480
+ type: 'text',
481
+ role: 'draggable',
482
+ x: 120,
483
+ y: 195,
484
+ width: 320,
485
+ height: 60,
486
+ rotation: 0,
487
+ zIndex: 10,
488
+ locked: false,
489
+ visible: true,
490
+ text: 'Kuvvet',
491
+ fontSize: 16,
492
+ fontWeight: '600',
493
+ textColor: '#0f172a',
494
+ textAlign: 'center',
495
+ backgroundColor: '#ffffff',
496
+ borderColor: '#f97316',
497
+ borderWidth: 2,
498
+ borderRadius: 12
499
+ },
500
+ {
501
+ id: 'drag_enerji',
502
+ name: 'Kavram: Enerji',
503
+ type: 'text',
504
+ role: 'draggable',
505
+ x: 120,
506
+ y: 275,
507
+ width: 320,
508
+ height: 60,
509
+ rotation: 0,
510
+ zIndex: 10,
511
+ locked: false,
512
+ visible: true,
513
+ text: 'Enerji',
514
+ fontSize: 16,
515
+ fontWeight: '600',
516
+ textColor: '#0f172a',
517
+ textAlign: 'center',
518
+ backgroundColor: '#ffffff',
519
+ borderColor: '#f97316',
520
+ borderWidth: 2,
521
+ borderRadius: 12
522
+ },
523
+ {
524
+ id: 'drag_madde',
525
+ name: 'Kavram: Madde',
526
+ type: 'text',
527
+ role: 'draggable',
528
+ x: 120,
529
+ y: 355,
530
+ width: 320,
531
+ height: 60,
532
+ rotation: 0,
533
+ zIndex: 10,
534
+ locked: false,
535
+ visible: true,
536
+ text: 'Madde',
537
+ fontSize: 16,
538
+ fontWeight: '600',
539
+ textColor: '#0f172a',
540
+ textAlign: 'center',
541
+ backgroundColor: '#ffffff',
542
+ borderColor: '#f97316',
543
+ borderWidth: 2,
544
+ borderRadius: 12
545
+ },
546
+ {
547
+ id: 'drag_isi',
548
+ name: 'Kavram: Isı',
549
+ type: 'text',
550
+ role: 'draggable',
551
+ x: 120,
552
+ y: 435,
553
+ width: 320,
554
+ height: 60,
555
+ rotation: 0,
556
+ zIndex: 10,
557
+ locked: false,
558
+ visible: true,
559
+ text: 'Isı',
560
+ fontSize: 16,
561
+ fontWeight: '600',
562
+ textColor: '#0f172a',
563
+ textAlign: 'center',
564
+ backgroundColor: '#ffffff',
565
+ borderColor: '#f97316',
566
+ borderWidth: 2,
567
+ borderRadius: 12
568
+ },
569
+ // Sağ Sütun: Hedef Tanım Kutuları (Mavi Kenarlık, Açık Mavi Dolgu)
570
+ {
571
+ id: 'target_is',
572
+ name: 'Tanım: İş yapabilme kapasitesi',
573
+ type: 'text',
574
+ role: 'target',
575
+ x: 520,
576
+ y: 195,
577
+ width: 560,
578
+ height: 60,
579
+ rotation: 0,
580
+ zIndex: 2,
581
+ locked: false,
582
+ visible: true,
583
+ text: 'İş yapabilme kapasitesi',
584
+ fontSize: 16,
585
+ fontWeight: '500',
586
+ textColor: '#0f172a',
587
+ textAlign: 'center',
588
+ backgroundColor: '#f8faff',
589
+ borderColor: '#3b82f6',
590
+ borderWidth: 2,
591
+ borderRadius: 12
592
+ },
593
+ {
594
+ id: 'target_hareket',
595
+ name: 'Tanım: Hareketi değiştirebilen etki',
596
+ type: 'text',
597
+ role: 'target',
598
+ x: 520,
599
+ y: 275,
600
+ width: 560,
601
+ height: 60,
602
+ rotation: 0,
603
+ zIndex: 2,
604
+ locked: false,
605
+ visible: true,
606
+ text: 'Hareketi değiştirebilen etki',
607
+ fontSize: 16,
608
+ fontWeight: '500',
609
+ textColor: '#0f172a',
610
+ textAlign: 'center',
611
+ backgroundColor: '#f8faff',
612
+ borderColor: '#3b82f6',
613
+ borderWidth: 2,
614
+ borderRadius: 12
615
+ },
616
+ {
617
+ id: 'target_sicaklik',
618
+ name: 'Tanım: Sıcaklık farkıyla aktarılan enerji',
619
+ type: 'text',
620
+ role: 'target',
621
+ x: 520,
622
+ y: 355,
623
+ width: 560,
624
+ height: 60,
625
+ rotation: 0,
626
+ zIndex: 2,
627
+ locked: false,
628
+ visible: true,
629
+ text: 'Sıcaklık farkıyla aktarılan enerji',
630
+ fontSize: 16,
631
+ fontWeight: '500',
632
+ textColor: '#0f172a',
633
+ textAlign: 'center',
634
+ backgroundColor: '#f8faff',
635
+ borderColor: '#3b82f6',
636
+ borderWidth: 2,
637
+ borderRadius: 12
638
+ },
639
+ {
640
+ id: 'target_kutle',
641
+ name: 'Tanım: Kütlesi ve hacmi olan varlık',
642
+ type: 'text',
643
+ role: 'target',
644
+ x: 520,
645
+ y: 435,
646
+ width: 560,
647
+ height: 60,
648
+ rotation: 0,
649
+ zIndex: 2,
650
+ locked: false,
651
+ visible: true,
652
+ text: 'Kütlesi ve hacmi olan varlık',
653
+ fontSize: 16,
654
+ fontWeight: '500',
655
+ textColor: '#0f172a',
656
+ textAlign: 'center',
657
+ backgroundColor: '#f8faff',
658
+ borderColor: '#3b82f6',
659
+ borderWidth: 2,
660
+ borderRadius: 12
661
+ }
662
+ ],
663
+ answerKey: {
664
+ 'drag_kuvvet': 'target_hareket',
665
+ 'drag_enerji': 'target_is',
666
+ 'drag_madde': 'target_kutle',
667
+ 'drag_isi': 'target_sicaklik'
668
+ },
669
+ settings: {
670
+ evaluationMode: 'instant',
671
+ wrongAnswerBehavior: 'return',
672
+ correctAnswerBehavior: 'lock',
673
+ showFeedback: true,
674
+ showScore: true,
675
+ allowRetry: true,
676
+ shuffleDraggables: true,
677
+ soundEnabled: true,
678
+ completionMessage: 'Tebrikler! Bütün kavramları doğru tanımlarla eşleştirdiniz.'
679
+ }
680
+ },
681
+
682
+ // 3. ETKİNLİK: KATEGORİLERE AYIRMA (MEYVELER VE SEBZELER)
683
+ 'categorization': {
684
+ version: '1.0',
685
+ project: {
686
+ id: 'proj_sample_categorization',
687
+ name: 'Meyveler ve Sebzeler',
688
+ activityType: 'categorization',
689
+ description: 'Yiyecekleri Meyveler veya Sebzeler sepetlerine sürükleyerek gruplandırın.'
690
+ },
691
+ stage: {
692
+ width: 1200,
693
+ height: 675,
694
+ backgroundColor: '#f8fafc',
695
+ backgroundImage: null
696
+ },
697
+ objects: [
698
+ {
699
+ id: 'cat_title',
700
+ name: 'Başlık',
701
+ type: 'text',
702
+ role: 'decorative',
703
+ x: 60,
704
+ y: 25,
705
+ width: 600,
706
+ height: 45,
707
+ zIndex: 1,
708
+ locked: false,
709
+ visible: true,
710
+ text: '🍎 Besin Grupları: Meyveler ve Sebzeler 🥦',
711
+ fontSize: 24,
712
+ fontWeight: '800',
713
+ textColor: '#0f172a',
714
+ textAlign: 'left'
715
+ },
716
+
717
+ // 2 Büyük Kategori Alanı (Sol ve Sağ)
718
+ {
719
+ id: 'cat_fruits',
720
+ name: 'Kategori: Meyveler',
721
+ type: 'zone',
722
+ role: 'category',
723
+ x: 80,
724
+ y: 90,
725
+ width: 380,
726
+ height: 520,
727
+ zIndex: 2,
728
+ locked: false,
729
+ visible: true,
730
+ text: '🍓 Meyveler Sepeti',
731
+ fontSize: 20,
732
+ fontWeight: '800',
733
+ textColor: '#991b1b',
734
+ backgroundColor: '#fff1f2',
735
+ borderColor: '#f43f5e',
736
+ borderStyle: 'dashed',
737
+ borderWidth: 3,
738
+ borderRadius: 20
739
+ },
740
+ {
741
+ id: 'cat_vegetables',
742
+ name: 'Kategori: Sebzeler',
743
+ type: 'zone',
744
+ role: 'category',
745
+ x: 740,
746
+ y: 90,
747
+ width: 380,
748
+ height: 520,
749
+ zIndex: 2,
750
+ locked: false,
751
+ visible: true,
752
+ text: '🥕 Sebzeler Sepeti',
753
+ fontSize: 20,
754
+ fontWeight: '800',
755
+ textColor: '#166534',
756
+ backgroundColor: '#f0fdf4',
757
+ borderColor: '#22c55e',
758
+ borderStyle: 'dashed',
759
+ borderWidth: 3,
760
+ borderRadius: 20
761
+ },
762
+
763
+ // Ortadaki Sürüklenebilir Öğeler (8 adet)
764
+ { id: 'drag_apple', name: 'Elma', type: 'text', role: 'draggable', x: 510, y: 100, width: 170, height: 50, text: '🍎 Kırmızı Elma', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 },
765
+ { id: 'drag_carrot', name: 'Havuç', type: 'text', role: 'draggable', x: 510, y: 165, width: 170, height: 50, text: '🥕 Havuç', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 },
766
+ { id: 'drag_banana', name: 'Muz', type: 'text', role: 'draggable', x: 510, y: 230, width: 170, height: 50, text: '🍌 Sarı Muz', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 },
767
+ { id: 'drag_broccoli', name: 'Brokoli', type: 'text', role: 'draggable', x: 510, y: 295, width: 170, height: 50, text: '🥦 Taze Brokoli', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 },
768
+ { id: 'drag_strawberry', name: 'Çilek', type: 'text', role: 'draggable', x: 510, y: 360, width: 170, height: 50, text: '🍓 Çilek', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 },
769
+ { id: 'drag_eggplant', name: 'Patlıcan', type: 'text', role: 'draggable', x: 510, y: 425, width: 170, height: 50, text: '🍆 Patlıcan', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 },
770
+ { id: 'drag_orange', name: 'Portakal', type: 'text', role: 'draggable', x: 510, y: 490, width: 170, height: 50, text: '🍊 Sulu Portakal', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 },
771
+ { id: 'drag_corn', name: 'Mısır', type: 'text', role: 'draggable', x: 510, y: 555, width: 170, height: 50, text: '🌽 Tatlı Mısır', fontSize: 16, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 10, zIndex: 10 }
772
+ ],
773
+ answerKey: {
774
+ 'drag_apple': 'cat_fruits',
775
+ 'drag_banana': 'cat_fruits',
776
+ 'drag_strawberry': 'cat_fruits',
777
+ 'drag_orange': 'cat_fruits',
778
+ 'drag_carrot': 'cat_vegetables',
779
+ 'drag_broccoli': 'cat_vegetables',
780
+ 'drag_eggplant': 'cat_vegetables',
781
+ 'drag_corn': 'cat_vegetables'
782
+ },
783
+ settings: {
784
+ evaluationMode: 'instant',
785
+ wrongAnswerBehavior: 'return',
786
+ correctAnswerBehavior: 'lock',
787
+ showFeedback: true,
788
+ showScore: true,
789
+ allowRetry: true,
790
+ shuffleDraggables: true,
791
+ soundEnabled: true,
792
+ completionMessage: 'Tebrikler! Bütün meyve ve sebzeleri doğru sepetlere ayırdınız.'
793
+ }
794
+ },
795
+
796
+ // 4. ETKİNLİK: SIRALAMA (KELEBEĞİN YAŞAM DÖNGÜSÜ)
797
+ 'sequencing': {
798
+ version: '1.0',
799
+ project: {
800
+ id: 'proj_sample_sequencing',
801
+ name: 'Kelebeğin Yaşam Döngüsü',
802
+ activityType: 'sequencing',
803
+ description: 'Kelebeğin oluşum aşamalarını baştan sona doğru sıraya yerleştirin.'
804
+ },
805
+ stage: {
806
+ width: 1200,
807
+ height: 675,
808
+ backgroundColor: '#f8fafc',
809
+ backgroundImage: null
810
+ },
811
+ objects: [
812
+ {
813
+ id: 'seq_title',
814
+ name: 'Başlık',
815
+ type: 'text',
816
+ role: 'decorative',
817
+ x: 60,
818
+ y: 40,
819
+ width: 600,
820
+ height: 45,
821
+ zIndex: 1,
822
+ locked: false,
823
+ visible: true,
824
+ text: '🦋 Kelebeğin Yaşam Döngüsünü Sıralayalım',
825
+ fontSize: 26,
826
+ fontWeight: '800',
827
+ textColor: '#0f172a',
828
+ textAlign: 'left'
829
+ },
830
+ {
831
+ id: 'seq_desc',
832
+ name: 'Açıklama',
833
+ type: 'text',
834
+ role: 'decorative',
835
+ x: 60,
836
+ y: 90,
837
+ width: 600,
838
+ height: 30,
839
+ zIndex: 1,
840
+ locked: false,
841
+ visible: true,
842
+ text: 'Aşağıdaki aşamaları 1. adımdan 4. adıma doğru sırayla kutulara yerleştirin.',
843
+ fontSize: 15,
844
+ fontWeight: '500',
845
+ textColor: '#64748b',
846
+ textAlign: 'left'
847
+ },
848
+
849
+ // Üst Bölüm: Sıralama Kutuları (Slots)
850
+ { id: 'slot_1', name: '1. Adım Yuvası', type: 'zone', role: 'sequence_slot', slotIndex: 0, x: 80, y: 150, width: 220, height: 200, text: '1. Aşama', fontSize: 16, fontWeight: '700', backgroundColor: '#f5f3ff', borderColor: '#8b5cf6', borderStyle: 'dashed', borderWidth: 2.5, borderRadius: 16, zIndex: 2 },
851
+ { id: 'slot_2', name: '2. Adım Yuvası', type: 'zone', role: 'sequence_slot', slotIndex: 1, x: 360, y: 150, width: 220, height: 200, text: '2. Aşama', fontSize: 16, fontWeight: '700', backgroundColor: '#f5f3ff', borderColor: '#8b5cf6', borderStyle: 'dashed', borderWidth: 2.5, borderRadius: 16, zIndex: 2 },
852
+ { id: 'slot_3', name: '3. Adım Yuvası', type: 'zone', role: 'sequence_slot', slotIndex: 2, x: 640, y: 150, width: 220, height: 200, text: '3. Aşama', fontSize: 16, fontWeight: '700', backgroundColor: '#f5f3ff', borderColor: '#8b5cf6', borderStyle: 'dashed', borderWidth: 2.5, borderRadius: 16, zIndex: 2 },
853
+ { id: 'slot_4', name: '4. Adım Yuvası', type: 'zone', role: 'sequence_slot', slotIndex: 3, x: 920, y: 150, width: 220, height: 200, text: '4. Aşama', fontSize: 16, fontWeight: '700', backgroundColor: '#f5f3ff', borderColor: '#8b5cf6', borderStyle: 'dashed', borderWidth: 2.5, borderRadius: 16, zIndex: 2 },
854
+
855
+ // Alt Bölüm: Karışık Başlayan Aşamalar
856
+ { id: 'drag_step_egg', name: 'Aşama: Yumurta', type: 'image', role: 'draggable', x: 80, y: 410, width: 210, height: 180, src: eggSvg, text: 'Yumurta Evresi', fontSize: 15, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 14, zIndex: 10 },
857
+ { id: 'drag_step_caterpillar', name: 'Aşama: Tırtıl', type: 'image', role: 'draggable', x: 360, y: 410, width: 210, height: 180, src: caterpillarSvg, text: 'Tırtıl (Larva)', fontSize: 15, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 14, zIndex: 10 },
858
+ { id: 'drag_step_chrysalis', name: 'Aşama: Koza', type: 'image', role: 'draggable', x: 640, y: 410, width: 210, height: 180, src: chrysalisSvg, text: 'Krizalit (Koza)', fontSize: 15, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 14, zIndex: 10 },
859
+ { id: 'drag_step_butterfly', name: 'Aşama: Kelebek', type: 'image', role: 'draggable', x: 920, y: 410, width: 210, height: 180, src: butterflySvg, text: 'Yetişkin Kelebek', fontSize: 15, fontWeight: '700', backgroundColor: '#ffffff', borderColor: '#cbd5e1', borderWidth: 2, borderRadius: 14, zIndex: 10 }
860
+ ],
861
+ answerKey: {
862
+ 'drag_step_egg': 'slot_1',
863
+ 'drag_step_caterpillar': 'slot_2',
864
+ 'drag_step_chrysalis': 'slot_3',
865
+ 'drag_step_butterfly': 'slot_4'
866
+ },
867
+ settings: {
868
+ evaluationMode: 'instant',
869
+ wrongAnswerBehavior: 'return',
870
+ correctAnswerBehavior: 'lock',
871
+ showFeedback: true,
872
+ showScore: true,
873
+ allowRetry: true,
874
+ shuffleDraggables: true,
875
+ soundEnabled: true,
876
+ completionMessage: 'Harika bir biyologsun! Kelebeğin yaşam evrelerini kusursuz sıraladın.'
877
+ }
878
+ }
879
+ };
880
+
881
+ // Global namespace
882
+ window.DND = window.DND || {};
883
+ window.DND.SAMPLE_PROJECTS = SAMPLE_PROJECTS;