@appaflytech/zeyrek-ai-mcp 0.0.21 → 0.0.23

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 (51) hide show
  1. package/dist/config.js +2 -0
  2. package/dist/knowledge/componentCatalog.js +6 -4
  3. package/dist/knowledge/componentEvents.js +12 -5
  4. package/dist/knowledge/mobileComponentCatalog.js +628 -0
  5. package/dist/knowledge/mobileComponentEvents.js +110 -0
  6. package/dist/knowledge/normalize.js +52 -11
  7. package/dist/knowledge/platform/lint.js +205 -0
  8. package/dist/knowledge/platform/mobile.js +78 -0
  9. package/dist/knowledge/platform/mobileRules.js +126 -0
  10. package/dist/knowledge/platform/mobileTabs.js +108 -0
  11. package/dist/knowledge/platform/profile.js +20 -0
  12. package/dist/knowledge/platform/resolve.js +122 -0
  13. package/dist/knowledge/platform/web.js +38 -0
  14. package/dist/knowledge/rules.js +56 -12
  15. package/dist/knowledge/styleResolve.js +1 -1
  16. package/dist/knowledge/styleResolveNative.js +410 -0
  17. package/dist/knowledge/themeResolve.js +3 -3
  18. package/dist/platform/capture/actions.js +333 -0
  19. package/dist/platform/capture/browser.js +1 -0
  20. package/dist/platform/{screenshot.js → capture/capture.js} +23 -509
  21. package/dist/platform/capture/index.js +10 -0
  22. package/dist/platform/capture/readiness.js +103 -0
  23. package/dist/platform/capture/summary.js +77 -0
  24. package/dist/platform/capture/target.js +5 -0
  25. package/dist/platform/capture/targets/studio-mobile.js +15 -0
  26. package/dist/platform/capture/targets/studio-web.js +5 -0
  27. package/dist/platform/domSummary.js +1 -1
  28. package/dist/resources/examples/mobile-app-shell-drawer.json +209 -0
  29. package/dist/resources/examples/mobile-app-shell-stack.json +123 -0
  30. package/dist/resources/examples/mobile-app-shell-tab.json +174 -0
  31. package/dist/resources/examples/mobile-list-detail-form.json +656 -0
  32. package/dist/resources/guides/component.md +6 -1
  33. package/dist/resources/guides/functions.md +1 -1
  34. package/dist/resources/guides/layout.md +11 -7
  35. package/dist/resources/guides/mobile.md +283 -0
  36. package/dist/resources/guides/page.md +69 -16
  37. package/dist/resources/guides/translation.md +1 -1
  38. package/dist/server.js +2 -0
  39. package/dist/tools/applications.js +60 -3
  40. package/dist/tools/components.js +50 -10
  41. package/dist/tools/designSchemaPatch.js +13 -4
  42. package/dist/tools/externalComponents.js +25 -4
  43. package/dist/tools/flows.js +9 -2
  44. package/dist/tools/layouts.js +41 -9
  45. package/dist/tools/mobile.js +203 -0
  46. package/dist/tools/pages.js +115 -35
  47. package/dist/tools/platformInfo.js +2 -1
  48. package/dist/tools/profileWrite.js +45 -0
  49. package/dist/tools/screenWrite.js +2 -2
  50. package/dist/tools/screens.js +9 -3
  51. package/package.json +1 -1
@@ -0,0 +1,656 @@
1
+ {
2
+ "_meta": {
3
+ "synthetic": true,
4
+ "note": "Mobil uygulamada üç sayfalık liste → detay → form akışı (G6 koşusunun girdisi): 'gorevler' mount'ta görevleri yükleyip repeater'a yazar, satıra dokunmak 'detay'ı id ile açar, 'yeni' formu kaydedip toast gösterir ve listeye döner. Yerleşim flex (blocks yok), görünüm tipli gruplarla.",
5
+ "pairsWith": "mobile-app-shell-stack ya da mobile-app-shell-tab (kabuk), microservice-table-list (liste ucu), page-form-upsert (web'deki form ikizi)",
6
+ "sourceRef": "platform_guide('mobile') §Kurulum sırası, §Akış adımları; ngapps://examples/flow-list-to-form (redirect query sözleşmesi)"
7
+ },
8
+ "_rules": {
9
+ "order": "Önce kabuk ve sayfalar (mobile_app_create), sonra microservice'ler, sonra her sayfanın schemaPatchOps'u, en son akışlar (flow_create) ve bağları (set_event).",
10
+ "flexOnly": "Mobil çizer blocks okumaz: add_component'e blocks yazma, sıra index'tir (MOB-001). Genişlik appearance.widthType ile.",
11
+ "repeaterRows": "repeater'ın satır şablonu çocuklarıdır ve satırlar `rows` prop'una yazılır; satır verisi item.<alan> ile okunur. `card` çocuk almaz: satır kartının alanları `title`/`description` bağıyla verilir. Satıra dokunuş MOBİLDE repeater'ın kendi `itemPress` olayıdır (`itemPressable: true`) — kartın `click`'i değil; payload `{ index, row }` taşır. Satır iç rolü <elementId>__row-<i> page_screenshot'ta tıklanabilir.",
12
+ "queryIsExpression": "redirect.args.query ifadedir: `id=${lst_tasks.selectedItem.id}`; hedef sayfa Page.queryParams.id ile okur (flow-list-to-form ile aynı sözleşme). Satır çocuğunun AKIŞINDA `item`/`Row` tıklanan satır DEĞİLDİR (yalnız prop bağlarında satır bağlamıdır): dokunuş önce tekrarlayıcının `selectedIndex`'ini yazar, akış satırı `<tekrarlayıcı>.selectedItem` olarak okur.",
13
+ "toastDoesNotWait": "alert.alertType 'success' toast'tur ve beklemez; ardından gelen redirect hemen koşar. Onay beklemek için alertType verme.",
14
+ "catalog": "repeater, form, textinput, textarea, card ve text mobil kataloğun Dalga 1 bileşenleridir; component_list mobil uygulamada döndürmüyorsa yazım MOB-003 alır.",
15
+ "verify": "page_screenshot({ applicationSlug: 'saha', pageSlug: 'yeni', actions: [{ action: 'set', target: 'in_title', value: 'Sayaç okuma' }, { action: 'submit', target: 'frm_task' }] }) → submitVia 'bridge', flowRuns ≥ 1, son kare 'gorevler'.",
16
+ "propNames": "Prop adları mobil kataloğun adlarıdır (component_get): metin `text.content`, satırlar `repeater.rows`. Mobilde istemci tarafı form doğrulaması yok (`isRequired` prop'u yok) — zorunlu alanı kayıt akışı denetler. Kod bağı ifadeyi `ref`'te taşır: `{ type: 'code', ref: '{{ item.title }}' }` — `data`'ya yazılan ifade çizilmez (boş metin).",
17
+ "detailFromSteps": "Detay alanları uçtan gelen veriyi SETTER adımıyla alır (`fill_detail`, `value.type: 'storage'`): `{{ Steps.… }}` kod bağı ilk çizimde okunur ve `Steps`'e yazmak düğümü yeniden okutmaz — sayfa boş kalırdı (web `page-detail-profile` ile aynı desen).",
18
+ "mobileBehavior": "Çekerek yenile listenin değil onu saran `scroll-view`'ın işidir (`refreshable: true` + `refresh` olayı). `redirect.presentation` push | modal | replace alır; küme dışı değer MOB-008 uyarısı ve backend 422'sidir. Sekme hedefine giden redirect'te modal `navigate`'e düşer."
19
+ },
20
+ "pages": [
21
+ {
22
+ "pageCreateArgs": {
23
+ "name": "Görevler",
24
+ "slug": "gorevler"
25
+ },
26
+ "schemaPatchOps": [
27
+ {
28
+ "op": "add_component",
29
+ "parent": "page_container",
30
+ "component": {
31
+ "elementId": "scr_tasks",
32
+ "name": "scr_tasks",
33
+ "type": "scroll-view",
34
+ "kind": "component",
35
+ "props": {
36
+ "refreshable": {
37
+ "type": "static",
38
+ "ref": null,
39
+ "data": true
40
+ }
41
+ },
42
+ "appearance": {
43
+ "widthType": "fill",
44
+ "heightType": "fill"
45
+ },
46
+ "blocks": [],
47
+ "events": [],
48
+ "validations": [],
49
+ "stateBindings": [],
50
+ "children": []
51
+ }
52
+ },
53
+ {
54
+ "op": "add_component",
55
+ "parent": "scr_tasks",
56
+ "component": {
57
+ "elementId": "lst_tasks",
58
+ "name": "lst_tasks",
59
+ "type": "repeater",
60
+ "kind": "component",
61
+ "props": {
62
+ "rows": {
63
+ "type": "static",
64
+ "ref": null,
65
+ "data": []
66
+ },
67
+ "itemPressable": {
68
+ "type": "static",
69
+ "ref": null,
70
+ "data": true
71
+ }
72
+ },
73
+ "appearance": {
74
+ "widthType": "fill"
75
+ },
76
+ "blocks": [],
77
+ "events": [],
78
+ "validations": [],
79
+ "stateBindings": [],
80
+ "children": [
81
+ {
82
+ "elementId": "row_card",
83
+ "name": "row_card",
84
+ "type": "card",
85
+ "kind": "component",
86
+ "props": {
87
+ "title": {
88
+ "type": "code",
89
+ "ref": "{{ item.title }}"
90
+ },
91
+ "description": {
92
+ "type": "code",
93
+ "ref": "{{ item.status }}"
94
+ }
95
+ },
96
+ "appearance": {
97
+ "widthType": "fill"
98
+ },
99
+ "blocks": [],
100
+ "events": [],
101
+ "validations": [],
102
+ "stateBindings": [],
103
+ "children": []
104
+ }
105
+ ]
106
+ }
107
+ },
108
+ {
109
+ "op": "add_component",
110
+ "parent": "page_container",
111
+ "component": {
112
+ "elementId": "btn_new",
113
+ "name": "btn_new",
114
+ "type": "button",
115
+ "kind": "component",
116
+ "props": {
117
+ "text": {
118
+ "type": "static",
119
+ "ref": null,
120
+ "data": "Yeni görev"
121
+ }
122
+ },
123
+ "appearance": {
124
+ "widthType": "fill"
125
+ },
126
+ "blocks": [],
127
+ "events": [],
128
+ "validations": [],
129
+ "stateBindings": [],
130
+ "children": []
131
+ }
132
+ }
133
+ ],
134
+ "mountFlowCreateArgs": {
135
+ "host": "page",
136
+ "hostId": "<gorevler sayfa id>",
137
+ "name": "gorevler mount",
138
+ "slug": "gorevler-mount",
139
+ "steps": [
140
+ {
141
+ "stepId": "start",
142
+ "name": "start",
143
+ "type": "start",
144
+ "kind": "normal",
145
+ "args": {},
146
+ "branches": [
147
+ {
148
+ "id": "<GUID>",
149
+ "name": "always",
150
+ "nextStepId": "load_tasks"
151
+ }
152
+ ]
153
+ },
154
+ {
155
+ "stepId": "load_tasks",
156
+ "name": "load_tasks",
157
+ "type": "microservice",
158
+ "kind": "normal",
159
+ "args": {
160
+ "microserviceId": "<görev listesi microservice id>",
161
+ "isRaw": false,
162
+ "parameters": []
163
+ },
164
+ "branches": [
165
+ {
166
+ "id": "<GUID>",
167
+ "name": "success",
168
+ "nextStepId": "apply_rows"
169
+ },
170
+ {
171
+ "id": "<GUID>",
172
+ "name": "always",
173
+ "nextStepId": null
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ "stepId": "apply_rows",
179
+ "name": "apply_rows",
180
+ "type": "setter",
181
+ "kind": "normal",
182
+ "args": {
183
+ "iteratees": [
184
+ {
185
+ "id": "<GUID>",
186
+ "type": "change",
187
+ "element": "lst_tasks",
188
+ "property": "rows",
189
+ "source": "component",
190
+ "mapping": {
191
+ "source": "",
192
+ "mappings": {}
193
+ },
194
+ "value": {
195
+ "type": "code",
196
+ "ref": "Steps.load_tasks.data"
197
+ }
198
+ }
199
+ ]
200
+ },
201
+ "branches": [
202
+ {
203
+ "id": "<GUID>",
204
+ "name": "always",
205
+ "nextStepId": null
206
+ }
207
+ ]
208
+ }
209
+ ]
210
+ },
211
+ "rowFlowCreateArgs": {
212
+ "host": "page",
213
+ "hostId": "<gorevler sayfa id>",
214
+ "name": "satırı aç",
215
+ "slug": "gorev-ac",
216
+ "steps": [
217
+ {
218
+ "stepId": "start",
219
+ "name": "start",
220
+ "type": "start",
221
+ "kind": "normal",
222
+ "args": {},
223
+ "branches": [
224
+ {
225
+ "id": "<GUID>",
226
+ "name": "always",
227
+ "nextStepId": "go_detail"
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "stepId": "go_detail",
233
+ "name": "go_detail",
234
+ "type": "redirect",
235
+ "kind": "normal",
236
+ "args": {
237
+ "pageId": "<detay sayfa id>",
238
+ "path": "detay",
239
+ "query": "`id=${lst_tasks.selectedItem.id}`",
240
+ "presentation": "modal"
241
+ },
242
+ "branches": [
243
+ {
244
+ "id": "<GUID>",
245
+ "name": "always",
246
+ "nextStepId": null
247
+ }
248
+ ]
249
+ }
250
+ ]
251
+ },
252
+ "bindOps": [
253
+ {
254
+ "op": "set_event",
255
+ "target": "page_container",
256
+ "event": "mount",
257
+ "eventValue": "<mount akış id>"
258
+ },
259
+ {
260
+ "op": "set_event",
261
+ "target": "btn_new",
262
+ "event": "click",
263
+ "eventValue": "<yeni sayfaya redirect akış id>"
264
+ },
265
+ {
266
+ "op": "set_event",
267
+ "target": "lst_tasks",
268
+ "event": "itemPress",
269
+ "eventValue": "<satırı aç akış id>"
270
+ },
271
+ {
272
+ "op": "set_event",
273
+ "target": "scr_tasks",
274
+ "event": "refresh",
275
+ "eventValue": "<mount akış id>"
276
+ }
277
+ ]
278
+ },
279
+ {
280
+ "pageCreateArgs": {
281
+ "name": "Görev detayı",
282
+ "slug": "detay"
283
+ },
284
+ "schemaPatchOps": [
285
+ {
286
+ "op": "add_component",
287
+ "parent": "page_container",
288
+ "component": {
289
+ "elementId": "txt_title",
290
+ "name": "txt_title",
291
+ "type": "text",
292
+ "kind": "component",
293
+ "props": {
294
+ "content": {
295
+ "type": "static",
296
+ "ref": null,
297
+ "data": ""
298
+ },
299
+ "typographyStyle": {
300
+ "type": "static",
301
+ "ref": null,
302
+ "data": {
303
+ "fontSize": "20px",
304
+ "fontWeight": "600"
305
+ }
306
+ }
307
+ },
308
+ "appearance": {},
309
+ "blocks": [],
310
+ "events": [],
311
+ "validations": [],
312
+ "stateBindings": [],
313
+ "children": []
314
+ }
315
+ },
316
+ {
317
+ "op": "add_component",
318
+ "parent": "page_container",
319
+ "component": {
320
+ "elementId": "txt_status",
321
+ "name": "txt_status",
322
+ "type": "text",
323
+ "kind": "component",
324
+ "props": {
325
+ "content": {
326
+ "type": "static",
327
+ "ref": null,
328
+ "data": ""
329
+ }
330
+ },
331
+ "appearance": {},
332
+ "blocks": [],
333
+ "events": [],
334
+ "validations": [],
335
+ "stateBindings": [],
336
+ "children": []
337
+ }
338
+ }
339
+ ],
340
+ "mountFlowCreateArgs": {
341
+ "host": "page",
342
+ "hostId": "<detay sayfa id>",
343
+ "name": "detay mount",
344
+ "slug": "detay-mount",
345
+ "steps": [
346
+ {
347
+ "stepId": "start",
348
+ "name": "start",
349
+ "type": "start",
350
+ "kind": "normal",
351
+ "args": {},
352
+ "branches": [
353
+ {
354
+ "id": "<GUID>",
355
+ "name": "always",
356
+ "nextStepId": "load_task"
357
+ }
358
+ ]
359
+ },
360
+ {
361
+ "stepId": "load_task",
362
+ "name": "load_task",
363
+ "type": "microservice",
364
+ "kind": "normal",
365
+ "args": {
366
+ "microserviceId": "<görev getir microservice id>",
367
+ "isRaw": false,
368
+ "parameters": [
369
+ {
370
+ "name": "id",
371
+ "type": "text",
372
+ "source": "query-string",
373
+ "value": {
374
+ "type": "code",
375
+ "ref": "Page.queryParams.id"
376
+ }
377
+ }
378
+ ]
379
+ },
380
+ "branches": [
381
+ {
382
+ "id": "<GUID>",
383
+ "name": "always",
384
+ "nextStepId": "fill_detail"
385
+ }
386
+ ]
387
+ },
388
+ {
389
+ "stepId": "fill_detail",
390
+ "name": "fill_detail",
391
+ "type": "setter",
392
+ "kind": "normal",
393
+ "args": {
394
+ "iteratees": [
395
+ {
396
+ "id": "<GUID>",
397
+ "type": "change",
398
+ "source": "component",
399
+ "element": "txt_title",
400
+ "property": "content",
401
+ "mapping": {
402
+ "source": "",
403
+ "mappings": {}
404
+ },
405
+ "value": {
406
+ "type": "storage",
407
+ "ref": "load_task.data.title"
408
+ }
409
+ },
410
+ {
411
+ "id": "<GUID>",
412
+ "type": "change",
413
+ "source": "component",
414
+ "element": "txt_status",
415
+ "property": "content",
416
+ "mapping": {
417
+ "source": "",
418
+ "mappings": {}
419
+ },
420
+ "value": {
421
+ "type": "storage",
422
+ "ref": "load_task.data.status"
423
+ }
424
+ }
425
+ ]
426
+ },
427
+ "branches": [
428
+ {
429
+ "id": "<GUID>",
430
+ "name": "always",
431
+ "nextStepId": null
432
+ }
433
+ ]
434
+ }
435
+ ]
436
+ },
437
+ "bindOps": [
438
+ {
439
+ "op": "set_event",
440
+ "target": "page_container",
441
+ "event": "mount",
442
+ "eventValue": "<detay mount akış id>"
443
+ }
444
+ ]
445
+ },
446
+ {
447
+ "pageCreateArgs": {
448
+ "name": "Yeni görev",
449
+ "slug": "yeni"
450
+ },
451
+ "schemaPatchOps": [
452
+ {
453
+ "op": "add_component",
454
+ "parent": "page_container",
455
+ "component": {
456
+ "elementId": "frm_task",
457
+ "name": "frm_task",
458
+ "type": "form",
459
+ "kind": "component",
460
+ "props": {},
461
+ "appearance": {
462
+ "widthType": "fill"
463
+ },
464
+ "blocks": [],
465
+ "events": [],
466
+ "validations": [],
467
+ "stateBindings": [],
468
+ "children": [
469
+ {
470
+ "elementId": "in_title",
471
+ "name": "in_title",
472
+ "type": "textinput",
473
+ "kind": "component",
474
+ "props": {
475
+ "label": {
476
+ "type": "static",
477
+ "ref": null,
478
+ "data": "Başlık"
479
+ }
480
+ },
481
+ "appearance": {
482
+ "widthType": "fill"
483
+ },
484
+ "blocks": [],
485
+ "events": [],
486
+ "validations": [],
487
+ "stateBindings": [],
488
+ "children": []
489
+ },
490
+ {
491
+ "elementId": "in_note",
492
+ "name": "in_note",
493
+ "type": "textarea",
494
+ "kind": "component",
495
+ "props": {
496
+ "label": {
497
+ "type": "static",
498
+ "ref": null,
499
+ "data": "Not"
500
+ }
501
+ },
502
+ "appearance": {
503
+ "widthType": "fill"
504
+ },
505
+ "blocks": [],
506
+ "events": [],
507
+ "validations": [],
508
+ "stateBindings": [],
509
+ "children": []
510
+ },
511
+ {
512
+ "elementId": "btn_save",
513
+ "name": "btn_save",
514
+ "type": "button",
515
+ "kind": "component",
516
+ "props": {
517
+ "text": {
518
+ "type": "static",
519
+ "ref": null,
520
+ "data": "Kaydet"
521
+ },
522
+ "type": {
523
+ "type": "static",
524
+ "ref": null,
525
+ "data": "submit"
526
+ }
527
+ },
528
+ "appearance": {
529
+ "widthType": "fill"
530
+ },
531
+ "blocks": [],
532
+ "events": [],
533
+ "validations": [],
534
+ "stateBindings": [],
535
+ "children": []
536
+ }
537
+ ]
538
+ }
539
+ }
540
+ ],
541
+ "submitFlowCreateArgs": {
542
+ "host": "page",
543
+ "hostId": "<yeni sayfa id>",
544
+ "name": "görev kaydet",
545
+ "slug": "gorev-kaydet",
546
+ "steps": [
547
+ {
548
+ "stepId": "start",
549
+ "name": "start",
550
+ "type": "start",
551
+ "kind": "normal",
552
+ "args": {},
553
+ "branches": [
554
+ {
555
+ "id": "<GUID>",
556
+ "name": "always",
557
+ "nextStepId": "save_task"
558
+ }
559
+ ]
560
+ },
561
+ {
562
+ "stepId": "save_task",
563
+ "name": "save_task",
564
+ "type": "microservice",
565
+ "kind": "normal",
566
+ "args": {
567
+ "microserviceId": "<görev oluştur microservice id>",
568
+ "isRaw": false,
569
+ "parameters": [
570
+ {
571
+ "name": "title",
572
+ "type": "text",
573
+ "source": "body",
574
+ "value": {
575
+ "type": "property",
576
+ "ref": {
577
+ "element": "in_title",
578
+ "property": "value"
579
+ }
580
+ }
581
+ },
582
+ {
583
+ "name": "note",
584
+ "type": "text",
585
+ "source": "body",
586
+ "value": {
587
+ "type": "property",
588
+ "ref": {
589
+ "element": "in_note",
590
+ "property": "value"
591
+ }
592
+ }
593
+ }
594
+ ]
595
+ },
596
+ "branches": [
597
+ {
598
+ "id": "<GUID>",
599
+ "name": "success",
600
+ "nextStepId": "notify"
601
+ },
602
+ {
603
+ "id": "<GUID>",
604
+ "name": "always",
605
+ "nextStepId": null
606
+ }
607
+ ]
608
+ },
609
+ {
610
+ "stepId": "notify",
611
+ "name": "notify",
612
+ "type": "alert",
613
+ "kind": "normal",
614
+ "args": {
615
+ "message": "Görev kaydedildi",
616
+ "alertType": "success"
617
+ },
618
+ "branches": [
619
+ {
620
+ "id": "<GUID>",
621
+ "name": "always",
622
+ "nextStepId": "go_list"
623
+ }
624
+ ]
625
+ },
626
+ {
627
+ "stepId": "go_list",
628
+ "name": "go_list",
629
+ "type": "redirect",
630
+ "kind": "normal",
631
+ "args": {
632
+ "pageId": "<gorevler sayfa id>",
633
+ "path": "gorevler",
634
+ "query": ""
635
+ },
636
+ "branches": [
637
+ {
638
+ "id": "<GUID>",
639
+ "name": "always",
640
+ "nextStepId": null
641
+ }
642
+ ]
643
+ }
644
+ ]
645
+ },
646
+ "bindOps": [
647
+ {
648
+ "op": "set_event",
649
+ "target": "frm_task",
650
+ "event": "submit",
651
+ "eventValue": "<görev kaydet akış id>"
652
+ }
653
+ ]
654
+ }
655
+ ]
656
+ }
@@ -3,6 +3,11 @@
3
3
  Sayfaya konan her şeyin ortak kuralları. Kuruluş sırası ve şema gövdesi için
4
4
  `platform_guide('page')`; HTML kaçış kapısının derin sözleşmesi için `platform_guide('html')`.
5
5
 
6
+ > **Mobil uygulamada** katalog ayrıdır: `component_list`/`component_get` mobil satırları okur,
7
+ > `component_get` `mobileKnowledge` (bileşenin mobil farkları) ve `mobileNotes` ekler; katalogda
8
+ > olmayan tip `MOB-003` alır. Stil CSS değil React Native'dir — `page_runtime_get(resolveStyles)`
9
+ > `nativeStyle` döner (`platform_guide('mobile')`).
10
+
6
11
  ## Keşif: iki tool, üç bilgi katmanı
7
12
 
8
13
  ```
@@ -108,7 +113,7 @@ Her şema düğümünde iki sözlük vardır; ikisi de ortak render katmanında
108
113
 
109
114
  | `states` | Anlamı |
110
115
  |---|---|
111
- | `isDroppable` | İçine komponent alır (container/form/repeater true) |
116
+ | `isDroppable` | İçine komponent alır (container/form/repeater true). **Değer kataloğun kararıdır** (`component_list` `droppable` sütunu): Studio kanvası bırakma hedefini bu alandan çözer, bu yüzden gateway yazdığı düğümlerde alanı katalogdan doldurur ve `gatewayNormalized` ile bildirir (PAGE-036). `false` yazılmış bir kabın içine kanvasta bırakma yapılamaz — bilerek kapatmak için `resize_component`/`set_states` |
112
117
  | `isScrollable` | İçeriği kendi alanında kaydırır (sabit yükseklikte `overflow-y: auto`) |
113
118
  | `isWrapper` | Sayfanın/layout'un/widget'ın ANA kabı — salt düzen elemanı: `height:100%` + **`min-height:80vh`**, kap başlığı ÇİZİLMEZ. **Yalnız sayfa boyu kaplaması gereken tek kap için kullan:** iç içe kutuya verirsen 720px'lik pencerede o kutu 36px içerikle bile 576px çizilir (ölçüldü, `platform_guide('page')` Kural 1f). Çerçeve/başlık gizlemek için wrapper değil `style` (`border:'none'`) kullan. Kurulmuş bir düğümün bayrağını `resize_component` micro-op'unun `states` alanı değiştirir — düğümü yeniden kurmak gerekmez |
114
119
  | `isSticky` | Kaydırmada yerinde kalır (header/sidebar; z-index'i otomatik) |
@@ -273,7 +273,7 @@ toplamHesapla(row.fiyat, row.adet) > 1000
273
273
  serbesttir — sunucuda o ad alanı yok.
274
274
  - **Önekli hata:** gövde hatası `Functions.<ad>: <mesaj>` (studio) ya da `<ad>: <mesaj>` (workflow)
275
275
  olarak gelir; `Steps.<adım>.error.message` ya da `runtimeErrors`'ta bu öneki ara.
276
- - **Mobil yok** (K11): `apps/mobile` runtime'ı `Functions`'ı boş nesne kurar.
276
+ - **Mobil uygulama:** mobil runtime (`@ng-apps/ui-native`) `appFunctions`/`pageFunctions`'ı `Functions`'a geçirir, çağrı web'deki gibi çalışır.
277
277
  - **Önbellek:** `/view` yolu eski gövdeyi birkaç saniye gösterebilir; `/dev` yolu anlıktır.
278
278
  - **Parametre konumsal:** `parameters` sırasını değiştirmek mevcut çağrıların anlamını değiştirir;
279
279
  `function` adımları ada göre eşlendiği için etkilenmez.