@appaflytech/zeyrek-ai-mcp 0.0.5 → 0.0.7

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 (145) hide show
  1. package/.env.example +2 -2
  2. package/.env.production.example +9 -1
  3. package/README.md +14 -38
  4. package/dist/config.js +36 -3
  5. package/dist/knowledge/backendConstraints.js +982 -0
  6. package/dist/knowledge/componentCatalog.js +549 -92
  7. package/dist/knowledge/componentEvents.js +120 -25
  8. package/dist/knowledge/coverage.js +43 -0
  9. package/dist/knowledge/flowGuards.js +30 -0
  10. package/dist/knowledge/functionGuards.js +134 -0
  11. package/dist/knowledge/guideSections.js +49 -0
  12. package/dist/knowledge/hydrate.js +97 -0
  13. package/dist/knowledge/languageCodes.js +36 -0
  14. package/dist/knowledge/languages.js +105 -0
  15. package/dist/knowledge/layoutSummary.js +10 -0
  16. package/dist/knowledge/localization.js +51 -0
  17. package/dist/knowledge/normalize.js +500 -16
  18. package/dist/knowledge/outlines.js +167 -12
  19. package/dist/knowledge/policy.js +14 -5
  20. package/dist/knowledge/propTypes.js +80 -0
  21. package/dist/knowledge/rules.js +961 -44
  22. package/dist/knowledge/schemaGuard.js +199 -0
  23. package/dist/knowledge/styleResolve.js +63 -4
  24. package/dist/observability/trace.js +27 -3
  25. package/dist/platform/csv.js +123 -0
  26. package/dist/platform/errors.js +107 -6
  27. package/dist/platform/http.js +34 -4
  28. package/dist/platform/patch.js +27 -0
  29. package/dist/platform/refs.js +104 -0
  30. package/dist/platform/responses.js +25 -6
  31. package/dist/platform/screenshot.js +544 -16
  32. package/dist/platform/secrets.js +40 -0
  33. package/dist/platform/tokenVault.js +89 -0
  34. package/dist/platform/writeDiff.js +281 -0
  35. package/dist/resources/examples/flow-call-function.json +66 -0
  36. package/dist/resources/examples/function-total.json +70 -0
  37. package/dist/resources/examples/layout-app-shell.json +1 -1
  38. package/dist/resources/examples/microfunction-node-sum.json +56 -0
  39. package/dist/resources/examples/microservice-table-list.json +2 -4
  40. package/dist/resources/examples/page-dynamic-form.json +3 -3
  41. package/dist/resources/examples/page-flex-sections.json +99 -0
  42. package/dist/resources/examples/page-sign-in.json +4 -3
  43. package/dist/resources/guides/component.md +81 -8
  44. package/dist/resources/guides/entity.md +712 -20
  45. package/dist/resources/guides/expressions.md +47 -2
  46. package/dist/resources/guides/external-component.md +9 -0
  47. package/dist/resources/guides/functions.md +262 -0
  48. package/dist/resources/guides/getting-started.md +82 -7
  49. package/dist/resources/guides/layout.md +53 -10
  50. package/dist/resources/guides/merge.md +231 -0
  51. package/dist/resources/guides/microfunction.md +166 -0
  52. package/dist/resources/guides/microservice.md +287 -15
  53. package/dist/resources/guides/middleware.md +89 -1
  54. package/dist/resources/guides/modify-existing.md +23 -0
  55. package/dist/resources/guides/page.md +402 -49
  56. package/dist/resources/guides/translation.md +150 -8
  57. package/dist/resources/guides/view.md +16 -1
  58. package/dist/resources/guides/workflow.md +199 -28
  59. package/dist/resources/knowledge.js +5 -0
  60. package/dist/resources/rules.js +27 -0
  61. package/dist/resources/schema-fingerprint.json +8 -0
  62. package/dist/resources/schemas/AnalyzeImportQuery.json +51 -0
  63. package/dist/resources/schemas/ApplyMergePlanCommand.json +19 -0
  64. package/dist/resources/schemas/CreateBulkRowCommand.json +36 -0
  65. package/dist/resources/schemas/CreateDatasourceCommand.json +15 -6
  66. package/dist/resources/schemas/CreateDiscoveredEntitiesCommand.json +19 -8
  67. package/dist/resources/schemas/CreateEntityCommand.json +52 -12
  68. package/dist/resources/schemas/CreateEnvironmentCommand.json +31 -0
  69. package/dist/resources/schemas/CreateGlobalFunctionCommand.json +95 -0
  70. package/dist/resources/schemas/CreateImportPlanCommand.json +278 -0
  71. package/dist/resources/schemas/CreateMergePlanCommand.json +34 -0
  72. package/dist/resources/schemas/CreateMicrofunctionCommand.json +117 -0
  73. package/dist/resources/schemas/CreateMicrofunctionRuntimeCommand.json +51 -0
  74. package/dist/resources/schemas/CreateMicroserviceCommand.json +145 -3
  75. package/dist/resources/schemas/CreateQueryCommand.json +56 -3
  76. package/dist/resources/schemas/CreateRowCommand.json +38 -0
  77. package/dist/resources/schemas/CreateViewCommand.json +13 -10
  78. package/dist/resources/schemas/CreateWorkflowCommand.json +106 -14
  79. package/dist/resources/schemas/DataJobDto.json +267 -0
  80. package/dist/resources/schemas/ExportRowsCommand.json +172 -0
  81. package/dist/resources/schemas/Filter.json +3 -1
  82. package/dist/resources/schemas/GetRowsQuery.json +6 -1
  83. package/dist/resources/schemas/GlobalFunctionDto.json +89 -0
  84. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +249 -0
  85. package/dist/resources/schemas/ImportAnalysisDto.json +401 -0
  86. package/dist/resources/schemas/ImportPlanDto.json +260 -0
  87. package/dist/resources/schemas/ImportSampleDto.json +90 -0
  88. package/dist/resources/schemas/InvokeMicrofunctionCommand.json +25 -0
  89. package/dist/resources/schemas/PreviewMicroserviceCommand.json +135 -1
  90. package/dist/resources/schemas/PreviewQueryCommand.json +5 -2
  91. package/dist/resources/schemas/PreviewWorkflowCommand.json +45 -9
  92. package/dist/resources/schemas/ResolveMergeConflictsCommand.json +58 -0
  93. package/dist/resources/schemas/RevertMergePlanCommand.json +19 -0
  94. package/dist/resources/schemas/RunImportCommand.json +62 -0
  95. package/dist/resources/schemas/StepDto.json +34 -3
  96. package/dist/resources/schemas/UpdateBulkRowCommand.json +36 -0
  97. package/dist/resources/schemas/UpdateDatasourceCommand.json +15 -6
  98. package/dist/resources/schemas/UpdateEntityCommand.json +52 -11
  99. package/dist/resources/schemas/UpdateGlobalFunctionCommand.json +66 -0
  100. package/dist/resources/schemas/UpdateMicrofunctionCommand.json +121 -0
  101. package/dist/resources/schemas/UpdateMicrofunctionRuntimeCommand.json +54 -0
  102. package/dist/resources/schemas/UpdateMicroserviceCommand.json +147 -4
  103. package/dist/resources/schemas/UpdateQueryCommand.json +13 -3
  104. package/dist/resources/schemas/UpdateRowCommand.json +40 -0
  105. package/dist/resources/schemas/UpdateViewCommand.json +15 -10
  106. package/dist/resources/schemas/UpdateWorkflowCommand.json +106 -14
  107. package/dist/server.js +17 -1
  108. package/dist/tools/access.js +3 -3
  109. package/dist/tools/activities.js +40 -0
  110. package/dist/tools/applications.js +1 -1
  111. package/dist/tools/automations.js +76 -34
  112. package/dist/tools/common.js +55 -0
  113. package/dist/tools/components.js +16 -7
  114. package/dist/tools/datasources.js +83 -21
  115. package/dist/tools/dependencies.js +1 -1
  116. package/dist/tools/deployments.js +34 -2
  117. package/dist/tools/dtos.js +25 -12
  118. package/dist/tools/entities.js +113 -28
  119. package/dist/tools/environments.js +52 -0
  120. package/dist/tools/externalComponents.js +9 -3
  121. package/dist/tools/files.js +57 -42
  122. package/dist/tools/flows.js +205 -13
  123. package/dist/tools/folders.js +7 -2
  124. package/dist/tools/functions.js +331 -0
  125. package/dist/tools/globalFunctions.js +63 -0
  126. package/dist/tools/importSchemas.js +79 -0
  127. package/dist/tools/imports.js +241 -0
  128. package/dist/tools/layouts.js +103 -29
  129. package/dist/tools/merges.js +113 -0
  130. package/dist/tools/microfunctions.js +155 -0
  131. package/dist/tools/microservices.js +270 -40
  132. package/dist/tools/organizations.js +5 -6
  133. package/dist/tools/pages.js +421 -104
  134. package/dist/tools/platformInfo.js +155 -11
  135. package/dist/tools/projects.js +183 -33
  136. package/dist/tools/queries.js +32 -10
  137. package/dist/tools/revisions.js +94 -0
  138. package/dist/tools/rows.js +484 -50
  139. package/dist/tools/screenWrite.js +68 -0
  140. package/dist/tools/screens.js +28 -0
  141. package/dist/tools/templates.js +32 -5
  142. package/dist/tools/translations.js +24 -8
  143. package/dist/tools/views.js +20 -10
  144. package/dist/tools/workflows.js +56 -21
  145. package/package.json +7 -2
@@ -0,0 +1,99 @@
1
+ {
2
+ "_meta": {
3
+ "synthetic": true,
4
+ "note": "Flex boyut modeli (2026-09-01) örneği: wrap:true satır kapsayıcı içinde üç genişlik modu bir arada — 'fixed'+widthString sabit yan sütun, 'fill' kalan alanı alan ana bölge, widthType'sız (eski 12 kolon payı) tam genişlik alt şerit. Hücreler Studio Quick Stack iskeletiyle aynı desendedir (hücre tipi box, states.isQuickStack). page_schema_patch'in ops alanına olduğu gibi verilebilir.",
5
+ "pairsWith": "layout-app-shell (kabuk tarafındaki fixed/fill kullanımı), page-detail-profile (ızgara yerleşimli sayfa)",
6
+ "sourceRef": "platform_guide('page') Kural 1f-2; platform_guide('component') §appearance; zeyrek-frontend packages/ng-apps-screen-builder/src/flex-layout.ts (getFlexChildStyle, normalizeCssSize), apps/studio/src/components/screen-builder/quick-stack.functions.ts, zeyrek-frontend/docs/features/quick-stack.md"
7
+ },
8
+ "_rules": {
9
+ "explicitWidthType": "Flex çocuğun genişliği appearance.widthType'tan gelir — öncelik fill > fixed(+widthString) > auto > eski blocks.size.w payı (widthType hiç yoksa). Şemayı sen kuruyorsan modu AÇIKÇA yaz; cell_footer'daki mod eksikliği bilinçli bir fallback gösterimidir.",
10
+ "stringNeedsFixedMode": "widthString/heightString YALNIZ ilgili *Type:'fixed' iken okunur. 'fill'/'auto' moda string yazmak ölüdür — gateway PAGE-017 uyarısı verir, Studio paneli mod değişiminde string'i siler.",
11
+ "cssSizeAcceptance": "Boyut string'i kabul kuralı (normalizeCssSize): çıplak sayı px sayılır, birimler px/%/vw/vh/vmin/vmax/rem/em/ch, calc(...) geçer. Negatif, pt, fr, 'auto' GEÇMEZ — platform 200 döner ama panel ve runtime değeri sessizce düşürür (PAGE-018).",
12
+ "wrapDefaultTrue": "wrap varsayılanı 2026-09-01'den beri AÇIK: w:12 çocuklar alt satıra sararak dikey akar. Bu örnekte de açık bırakıldı; kapatırsan üç hücre tek satıra sıkışır.",
13
+ "gapThemeVars": "gap preset'leri tema değişkenidir (small/medium/large → var(--ng-spacing-sm/md/lg)); alan allowCustom'dır, '18px' gibi ham CSS de geçer.",
14
+ "quickStackSkeleton": "Studio'nun Quick Stack üreteci hücre olarak DAİMA box kurar, ebeveyne layout:'flex' + direction:'row' + wrap:true yazar ve satır span'ları 12'ye tamamlanır. states.isQuickStack yalnız editör süsüdür (kesikli çerçeve) — runtime'da hiçbir etkisi yoktur.",
15
+ "orderFromBlocks": "Flex'te sıra blocks[].position'dan gelir (önce y, sonra x) ve y yalnız SIRADIR; boşluk çizilmez. Yine de bitişik ver ki grid'e dönüşte şema geçerli kalsın.",
16
+ "heightStringOnlyFixed": "heightType:'fixed' ölçüyü heightString'den alır ('30vh' gibi), o yoksa size.h×10px'ten. heightType:'auto' içerik kadar, 'fill' ebeveynin bıraktığı yer."
17
+ },
18
+ "schemaPatchOps": [
19
+ {
20
+ "op": "add_component",
21
+ "parent": "page_container",
22
+ "component": {
23
+ "elementId": "sections_row",
24
+ "name": "sections_row",
25
+ "kind": "component",
26
+ "type": "container",
27
+ "props": {
28
+ "title": { "type": "static", "ref": null, "data": "" },
29
+ "layout": { "type": "static", "ref": null, "data": "flex" },
30
+ "direction": { "type": "static", "ref": null, "data": "row" },
31
+ "horizontalAlign": { "type": "static", "ref": null, "data": "left" },
32
+ "verticalAlign": { "type": "static", "ref": null, "data": "stretch" },
33
+ "size": { "type": "static", "ref": null, "data": "shrink" },
34
+ "gap": { "type": "static", "ref": null, "data": "medium" },
35
+ "wrap": { "type": "static", "ref": null, "data": true }
36
+ },
37
+ "states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": false },
38
+ "appearance": { "heightType": "auto", "widthType": "fill", "marginType": "none", "paddingType": "none" },
39
+ "blocks": [{ "breakpoint": 1024, "size": { "w": 12, "h": 24 }, "position": { "x": 0, "y": 0 } }],
40
+ "children": [
41
+ {
42
+ "elementId": "cell_sidebar",
43
+ "name": "cell_sidebar",
44
+ "kind": "component",
45
+ "type": "box",
46
+ "props": {
47
+ "layout": { "type": "static", "ref": null, "data": "flex" },
48
+ "direction": { "type": "static", "ref": null, "data": "column" }
49
+ },
50
+ "states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": false, "isQuickStack": true },
51
+ "appearance": { "heightType": "fixed", "heightString": "30vh", "widthType": "fixed", "widthString": "240px" },
52
+ "blocks": [{ "breakpoint": 1024, "size": { "w": 4, "h": 6 }, "position": { "x": 0, "y": 0 } }],
53
+ "children": [],
54
+ "events": [],
55
+ "validations": [],
56
+ "stateBindings": []
57
+ },
58
+ {
59
+ "elementId": "cell_main",
60
+ "name": "cell_main",
61
+ "kind": "component",
62
+ "type": "box",
63
+ "props": {
64
+ "layout": { "type": "static", "ref": null, "data": "flex" },
65
+ "direction": { "type": "static", "ref": null, "data": "column" }
66
+ },
67
+ "states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": false, "isQuickStack": true },
68
+ "appearance": { "heightType": "auto", "widthType": "fill" },
69
+ "blocks": [{ "breakpoint": 1024, "size": { "w": 8, "h": 6 }, "position": { "x": 4, "y": 0 } }],
70
+ "children": [],
71
+ "events": [],
72
+ "validations": [],
73
+ "stateBindings": []
74
+ },
75
+ {
76
+ "elementId": "cell_footer",
77
+ "name": "cell_footer",
78
+ "kind": "component",
79
+ "type": "box",
80
+ "props": {
81
+ "layout": { "type": "static", "ref": null, "data": "flex" },
82
+ "direction": { "type": "static", "ref": null, "data": "row" }
83
+ },
84
+ "states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": false, "isQuickStack": true },
85
+ "appearance": { "heightType": "auto" },
86
+ "blocks": [{ "breakpoint": 1024, "size": { "w": 12, "h": 6 }, "position": { "x": 0, "y": 6 } }],
87
+ "children": [],
88
+ "events": [],
89
+ "validations": [],
90
+ "stateBindings": []
91
+ }
92
+ ],
93
+ "events": [],
94
+ "validations": [],
95
+ "stateBindings": []
96
+ }
97
+ }
98
+ ]
99
+ }
@@ -9,10 +9,11 @@
9
9
  "cookieNameContract": "setcookie'deki ad ile auth middleware'inin okuduğu ad BİREBİR aynı olmalı (burada APP_Token → middleware'de cookie.APP_Token). Uyuşmazlık 'her istek 401' olarak görünür ve teşhisi zordur.",
10
10
  "signInEndpoint": "Sign-in ucu bir workflow'dur: kullanıcıyı e-postayla bulur, şifreyi karşılaştırır, system.generateToken({...claims}) ile token üretir. Claim anahtarları neyse middleware onları okur (claims.userId gibi) — token.data.id diye evrensel bir alan YOKTUR. Bkz. platform_guide('expressions') ve platform_guide('middleware') Tarif 1.",
11
11
  "conditionAlways": "Token kontrolü condition ile yapılır; `always` dalı buton durumunu her koşumda sıfırlar, kural dalları başarı/hata yolunu ayırır.",
12
+ "submitButtonType": "Formun `submit` olayına akış bağlamak TEK BAŞINA yetmez: `button` varsayılan olarak `type=\"button\"` çizilir ve HTML form submit'i HİÇ doğmaz — tıklamak da alanda Enter da uca istek göndermez ve hiçbir hata çıkmaz (ölçüldü 2026-09-05; teşhis ancak gerçek tıklamayla mümkün oldu, `page_screenshot` `actions`). Bu yüzden butona `props.type = 'submit'` veriliyor. Alternatif: aynı akışı butonun `click` olayına da bağlamak. Gateway ikisi de yoksa FORM-003 ile uyarır.",
12
13
  "rawRedirect": "redirect isRaw:true iken path ÇOK SATIRLI JS bloğudur ve son ifadenin değeri hedef adrestir. 'Korunan sayfaya gitmek isterken login'e düşen kullanıcıyı geri gönderme' deseni budur; yoksa sabit bir sayfaya gidilir (pageId + path).",
13
14
  "objectProp": "Prop değeri nesne olabilir: icon → { type:'static', ref:{ name:'progress_activity' } }.",
14
15
  "pageIsPublic": "Giriş sayfasına middlewareIds BAĞLANMAZ (guard'lı olsaydı kullanıcı giriş yapamazdı). Buna karşılık diğer sayfalar ve korunan uçlar middlewareIds ile bağlanır.",
15
- "notificationIsHidden": "notification KATALOĞUNDA isHidden YOKTUR: şemaya props.isHidden yazmak 'unknown-prop' ile reddedilir (bu örneğin eski hâli öyleydi — crm koşumu B-10). Runtime'da gizleme her komponentte çalışır ama prop'u SETTER yazar. Başlangıçta gizli göstermek için komponenti isHidden'ı OLAN bir container'a (box_message) sar ve koşulu sarmalayıcıya bağla; appearance.isHidden bir çözüm DEĞİLDİR — runtime onu hiç okumaz.",
16
+ "notificationIsHidden": "notification'ın şemasında isHidden 2026-08-26'dan beri VARDIR: props.isHidden'ı doğrudan bildirime yazabilirsin. Bu örnekteki box_message sarmalayıcısı o dönemin kalıntısıdır (crm koşumu B-10) ve tek bir bildirim için ARTIK GEREKMEZ — burada duruyor çünkü şeridi bir kaba sarıp birden çok parçayı birlikte gösterip gizliyor. appearance.isHidden ise hiçbir zaman çözüm DEĞİLDİR — runtime onu hiç okumaz.",
16
17
  "validationShape": "Validation gövdesi DÖRT alan taşır: { type, message, value, isActive }. 'name' anahtarı JsonIgnore'dur — {name, value, message} yazarsan tip enum varsayılanına düşer ve alan sessizce REGEX doğrulamasına döner. Tip adları TİRELİDİR (max-length / min-length / max-value / min-value); 'maxLength' backend'e yazılır ama runtime doğrulayıcı onu tanımaz ve doğrulama hiç koşmaz. Gateway düzeltebildiğini düzeltir, kalanını PAGE-016 ile reddeder."
17
18
  },
18
19
  "pageCreateArgs": {
@@ -63,7 +64,7 @@
63
64
  "parent": "auth_layout",
64
65
  "component": {
65
66
  "elementId": "sign_in_form", "kind": "component", "type": "form", "name": "sign_in_form",
66
- "props": { "title": { "type": "static", "data": "Giriş" }, "hideBorders": { "type": "static", "data": true } },
67
+ "props": { "title": { "type": "static", "data": "Giriş" }, "style": { "type": "static", "data": { "border": { "type": "static", "data": "none" } } } },
67
68
  "states": { "isSticky": false, "isDroppable": true, "isScrollable": false, "isWrapper": true },
68
69
  "blocks": [{ "breakpoint": 1024, "size": { "h": 24, "w": 12 }, "position": { "x": 0, "y": 4 } }],
69
70
  "children": [], "events": [], "validations": [], "stateBindings": []
@@ -103,7 +104,7 @@
103
104
  "parent": "sign_in_form",
104
105
  "component": {
105
106
  "elementId": "btn_sign_in", "kind": "component", "type": "button", "name": "btn_sign_in",
106
- "props": { "text": { "type": "static", "data": "Giriş yap" } },
107
+ "props": { "text": { "type": "static", "data": "Giriş yap" }, "type": { "type": "static", "data": "submit" } },
107
108
  "states": { "isSticky": false, "isDroppable": false, "isScrollable": false, "isWrapper": false },
108
109
  "blocks": [{ "breakpoint": 1024, "size": { "h": 4, "w": 12 }, "position": { "x": 0, "y": 10 } }],
109
110
  "children": [], "events": [], "validations": [], "stateBindings": []
@@ -30,6 +30,23 @@ component_get → tek tipin TAM sözleşmesi, üç katman birleşik:
30
30
  `appearance.heightType: 'auto'` tercih edilir. Katalog varsayılanı bazı tiplerde kendi
31
31
  sınırını aşar — körü körüne kopyalama, gateway kırpar ve bildirir.
32
32
 
33
+ ### Arayüz metni ve biçimler uygulama dilini izler
34
+
35
+ Komponentlerin KENDİ arayüz metni (tablo sayfalaması, filtre operatörleri, boş durumlar, kırpma
36
+ düğmeleri) ve sayı/tarih biçimleri uygulamanın aktif dilinden gelir — prop vermene gerek yok.
37
+ İki ayrı kural işliyor ve karıştırılmamalı:
38
+
39
+ - **Metin İngilizceye düşer.** Kütüphanenin sözlüğü tr/en taşır; projede `de` seçiliyse o metinler
40
+ İngilizce çıkar. Yeni dil eklemek sözlüğe satır eklemektir, komponent değişikliği değil.
41
+ - **Biçim düşmez.** Sayı ayraçları ve tarih adları seçilen dilin kendi kuralını kullanır
42
+ (`de` → `1.234,5`). Dili olmayan bir biçim yoktur; dil verilmediğinde taban İngilizcedir.
43
+
44
+ Bazı komponentlerin `locale` prop'u geriye uyum için durur ve **doluysa kazanır** — bilinçli
45
+ sabitleme içindir. Boş bırakmak doğru varsayılandır.
46
+
47
+ Doğrulama mesajını çeviriye bağlamak ayrı bir sözleşmedir (`t:` öneki, `platform_guide('page')`
48
+ §validasyon); prop'ları bağlamak için `set_prop_type` (`platform_guide('translation')`).
49
+
33
50
  ## Olay modeli
34
51
 
35
52
  - Olay adları `component_get.events`'ten okunur, **`on` öneki almaz** (tek istisna
@@ -79,29 +96,85 @@ Her şema düğümünde iki sözlük vardır; ikisi de ortak render katmanında
79
96
  |---|---|
80
97
  | `isDroppable` | İçine komponent alır (container/form/repeater true) |
81
98
  | `isScrollable` | İçeriği kendi alanında kaydırır (sabit yükseklikte `overflow-y: auto`) |
82
- | `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` / `hideBorders` kullan; `states` için micro-op olmadığından düzeltmek düğümü yeniden kurmayı gerektirir |
99
+ | `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 |
83
100
  | `isSticky` | Kaydırmada yerinde kalır (header/sidebar; z-index'i otomatik) |
101
+ | `isFloating` | Düğümü akıştan çıkarıp yüzdürür (katman davranışı; nadir) |
102
+ | `isQuickStack` | Studio'nun Quick Stack iskelet hücresi işareti — editörde kesikli çerçeve çizer, **runtime'da hiçbir etkisi yoktur**. MCP'den iskelet kurarken yazmak serbesttir ama gerekmez |
84
103
 
85
104
  > **Çocukların DİZİLİMİ `states`'te değil kabın PROP'undadır:** `container` — ve dolayısıyla
86
105
  > `page_container` — `layout: 'flex' | 'grid'` + altı ayar (`direction`, `horizontalAlign`,
87
- > `verticalAlign`, `size`, `gap`, `wrap`) taşır. Katalog varsayılanı `flex`'tir ama varsayılan
88
- > düğüm kurulurken yazılır: `layout` prop'u hiç yoksa renderer IZGARA çizer, o yüzden şemayı sen
89
- > kuruyorsan açıkça yaz. Ortalama/yaslama/aralık işini `style` ile değil bu grupla kur:
90
- > `platform_guide('page')` Kural 1f-2.
106
+ > `verticalAlign`, `size`, `gap`, `wrap`) taşır; **`form` (2026-09-01), `box`/`aibox` ve
107
+ > `layout`/`widget-area` (2026-09-03) da aynı grubu aynı varsayılanlarla taşır** — değer
108
+ > kümesi hepsinde `flex`/`grid`, yalnız `box-section` tek değerlidir. Katalog
109
+ > varsayılanı `flex` + `wrap: true`'dur ama varsayılan düğüm kurulurken yazılır: `layout`
110
+ > prop'u hiç yoksa renderer IZGARA çizer, o yüzden şemayı sen kuruyorsan açıkça yaz.
111
+ > Ortalama/yaslama/aralık işini `style` ile değil bu grupla kur: `platform_guide('page')`
112
+ > Kural 1f-2.
91
113
 
92
114
  | `appearance` | Değerler | Anlamı |
93
115
  |---|---|---|
94
- | `heightType` | `auto` · `fixed` · `fill` | `auto`: içerik kadar (önerilen — Kural 1d); `fixed`: `blocks.h × 10px`; `fill`: **kalanı doldur** — ebeveynin bıraktığı yer (ızgarada `height:100%`, flex sütununda `flex:1 1 auto`, flex satırında `align-self:stretch`). Tam ekran yerleşim kabuğu bununla kurulur, bkz. `platform_guide('layout')` |
95
- | `marginType` / `marginValue` | `normal` · `none` · `custom` + px | Dış boşluk: normal=5px, custom=`marginValue` |
116
+ | `heightType` | `auto` · `fixed` · `fill` | `auto`: içerik kadar (önerilen — Kural 1d); `fixed`: `heightString` varsa o, yoksa `blocks.h × 10px`; `fill`: **kalanı doldur** — ebeveynin bıraktığı yer (ızgarada `height:100%`, flex sütununda `flex:1 1 auto`, flex satırında `align-self:stretch`). Tam ekran yerleşim kabuğu bununla kurulur, bkz. `platform_guide('layout')` |
117
+ | `widthType` | `cover` · `contain` · `auto` · `fixed` · `fill` | İlk ikisi görsel/medya sığdırma. Kalanı **flex (ve eski cssgrid) kabın çocuğunun genişlik modu** (2026-09-01): `auto` içerik kadar, `fixed` `widthString`'den, `fill` kabın tüm genişliği (satırda `flex:1 1 100%`, sütunda `align-self:stretch`). **Yazılmazsa eski 12 kolon `blocks.size.w` payı geçerlidir** — öncelik: `fill` > `fixed` > `auto` > span |
118
+ | `widthString` / `heightString` | CSS uzunluğu | Sabit ölçü; **yalnız ilgili `*Type: 'fixed'` iken okunur** (aksi PAGE-017 uyarısı). Kabul: çıplak sayı (px sayılır) · `px % vw vh vmin vmax rem em ch` birimli değer · `calc(...)`. Negatif/`pt`/`fr`/`auto` GEÇMEZ — platform kaydeder ama panel ve runtime sessizce düşürür (PAGE-018). Eski `widthPx` alanı 2026-09-01'de kaldırıldı |
119
+ | `marginType` / `marginValue` | `normal` · `none` · `custom` + px | Dış boşluk: **yazılmazsa `normal` sayılır** = her kenara 4px (`spacing.ts` `CANVAS_NORMAL_MARGIN`); custom=`marginValue`. Bileşenleri dip dibe dizmek için `none` ŞART — `gap:'none'` olsa bile normal margin komşular arasında 8px bırakır (sıkı dizilim tarifi: `platform_guide('page')` Kural 1f-2) |
96
120
  | `paddingType` / `paddingValue` | `normal` · `none` · `custom` + px | Droppable kapların iç boşluğu: normal=10px |
97
121
  | `alignType` | `left` · `center` · `right` | İçerik hizalama (destekleyen komponentlerde) |
98
- | `widthType` | `cover` · `contain` | Görsel/medya sığdırma davranışı |
99
122
  | `aspectRatio` | sayı | En-boy oranı kilidi (medya komponentleri) |
100
123
 
101
124
  `isHidden` bu sözlüklerde değil PROP'tur ve her komponentte çalışır; flow'lar `margin` /
102
125
  `padding` / `height` prop adlarıyla da appearance'ı setter üzerinden değiştirebilir
103
126
  (RenderComponent bu üç prop'u appearance'a çevirir).
104
127
 
128
+ > **Yerleşim YALNIZ `appearance`'tan geçer — `style`'a yazılan CSS kaçamakları sessizce
129
+ > yutulur.** `style` serbest bir sözlüktür: doğrulama duvarı susar, kayıt 200 döner, `*_get`
130
+ > değeri geri verir ve düzen hiç değişmez. 2026-09-06·2 koşusunda üst çubuktaki "Dashboard"
131
+ > etiketi flex satırında sıkışıp "Dashboar" olarak çizildi; `style.flexShrink: 0` hiçbir şey
132
+ > yapmadı, çözüm `appearance` oldu (`S-11`). Karşılıklar:
133
+ >
134
+ > | `style`'a yazma | Karşılığı |
135
+ > |---|---|
136
+ > | `flexShrink` · `flexGrow` · `flexBasis` · `flex` | `widthType`/`heightType`: küçülmeyi durdurmak `fixed` + `*String`, kalanı almak `fill`, içerik kadar `auto` |
137
+ > | `width` · `minWidth` · `maxWidth` | `widthType: 'fixed'` + `widthString` |
138
+ > | `height` · `minHeight` · `maxHeight` | `heightType: 'fixed'` + `heightString` (ya da `auto`/`fill`) |
139
+ > | `margin` · `padding` | `marginType`/`marginValue` · `paddingType`/`paddingValue` |
140
+ > | `alignSelf` · `justifySelf` | Ebeveynin flex prop'ları (`horizontalAlign`/`verticalAlign`) + çocuğun `*Type`'ı |
141
+ >
142
+ > `style` rengin, tipografinin ve kenarlığın yeridir; kutu modeline ait her şey `appearance`'ta.
143
+
144
+ > **Jeton kümesi kapalıdır ve tanınmayan jeton artık 400 döner.** Yukarıdaki beş alanın
145
+ > (`paddingType` · `marginType` · `widthType` · `heightType` · `alignType`) kabul ettiği değerler
146
+ > platformun kendi enum'larıdır; tanınmayan bir jeton eskiden **sessizce sıfırlanıyordu** —
147
+ > 2026-09-06 koşusunda `paddingType: 'large'` gönderildi, HTTP 200 döndü ve kart `none` ile,
148
+ > yani hiç iç boşluksuz çizildi (`S-2`). Platform bunu artık kabul edilen jetonları sayan bir
149
+ > hatayla reddeder. Aynı kümeler `component_get` yanıtının `appearanceValues` alanında da döner,
150
+ > `states` bayraklarının "true iken ne olur" karşılıkları ise `stateFlags` alanında —
151
+ > `gap` gibi komponente özel jetonlar için `component_get` prop şemasına bakın.
152
+ >
153
+ > **`gap` jetonlarına benzeterek jeton uydurma:** `gap` bir container PROP'udur ve kendi kümesi
154
+ > vardır; `appearance` alanlarıyla aynı sözlüğü paylaşmaz.
155
+
156
+ ## Dosya/görsel taşıyan prop'lar nesne bekler
157
+
158
+ Görsel ya da dosya gösteren her yüzey (`datatable`'ın `image`/`file` kolonu başta olmak üzere)
159
+ düz URL string'i değil **dosya nesnesi** ister: `{ absolute_path, display_name }` (etikette
160
+ `fileName` de okunur). Düz string verilirse kaynak boş kalır ve hücre/kutu **sessizce boş**
161
+ çizilir — istek 200 döner, hata yoktur (ölçüm: 09-04 koşusu Y-21). Entity'nin `FILE` alanı bu
162
+ şekli zaten döner; ham bir URL'yi göstermek istiyorsan ya kolonu `url`/`link` yap ya da veriyi
163
+ `{ absolute_path: '<url>', display_name: '<ad>' }` biçimine çevir. Komponentin kendi sözleşmesi
164
+ için `component_get` `propNotes`.
165
+
166
+ ## Tasarımcı toolbar'ı: `designer.toolbar` (studio'ya özel, kataloğa girmez)
167
+
168
+ Studio kanvasında seçili komponentin yanında çıkan bant, komponentin **kendi 2–4 prop'unu**
169
+ tek tıkla değiştirir (`textinput`: Disabled · Readonly · Size). Liste komponentin kendi
170
+ `schema.ts`'inde `designer.toolbar` olarak durur; kontrol prop tipinden türer (switch → toggle,
171
+ ≤ 4 seçenekli radio/dropdown/switcher → kısa metin grubu, fazlası açılır liste, number → sayı
172
+ alanı). Kural üretimde denetlenir: en fazla 4 ad, ad şemada var, tip izinli, `designer.hide`
173
+ ve `layout` grubundaki adlar giremez. **MCP tarafında karşılığı yoktur:** `designer` bloğu
174
+ `components.json`'a ve `component_get` yanıtına girmez; toolbar'daki her prop zaten sıradan
175
+ bir prop'tur, `set_prop` ile aynı şekilde yazılır. Bu bilgi yalnız "studio'da neden o
176
+ düğmeler var" sorusuna cevaptır.
177
+
105
178
  ## Komponent seçimi
106
179
 
107
180
  "Hangi işe hangi komponent" tablosu ve `table` / `datatable` karşılaştırması: