@appaflytech/zeyrek-ai-mcp 0.0.33 → 0.0.34

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 (169) hide show
  1. package/.env.example +0 -15
  2. package/dist/config.js +0 -11
  3. package/dist/index.js +0 -2
  4. package/dist/knowledge/boxSections.js +184 -0
  5. package/dist/knowledge/componentCatalog.js +248 -108
  6. package/dist/knowledge/componentEvents.js +22 -24
  7. package/dist/knowledge/layoutSummary.js +2 -140
  8. package/dist/knowledge/normalize.js +126 -117
  9. package/dist/knowledge/rules.js +19 -291
  10. package/dist/knowledge/styleResolve.js +38 -55
  11. package/dist/knowledge/themeResolve.js +3 -3
  12. package/dist/observability/trace.js +1 -1
  13. package/dist/platform/diagnostics.js +4 -10
  14. package/dist/platform/domSummary.js +1 -1
  15. package/dist/platform/http.js +7 -23
  16. package/dist/platform/responses.js +2 -6
  17. package/dist/platform/screenshot.js +1162 -0
  18. package/dist/platform/secrets.js +0 -9
  19. package/dist/platform/strictArguments.js +12 -68
  20. package/dist/platform/tokenVault.js +4 -187
  21. package/dist/resources/examples/layout-app-shell.json +707 -229
  22. package/dist/resources/examples/page-flex-sections.json +1 -1
  23. package/dist/resources/guides/component.md +5 -13
  24. package/dist/resources/guides/entity.md +5 -3
  25. package/dist/resources/guides/expressions.md +5 -14
  26. package/dist/resources/guides/functions.md +1 -1
  27. package/dist/resources/guides/layout.md +58 -55
  28. package/dist/resources/guides/microservice.md +2 -9
  29. package/dist/resources/guides/middleware.md +2 -34
  30. package/dist/resources/guides/page.md +171 -256
  31. package/dist/resources/guides/theme.md +2 -8
  32. package/dist/resources/guides/translation.md +1 -1
  33. package/dist/resources/guides/workflow.md +1 -7
  34. package/dist/resources/schema-fingerprint.json +4 -4
  35. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -3
  36. package/dist/resources/schemas/MicroserviceDto.json +2 -2
  37. package/dist/server.js +1 -7
  38. package/dist/tools/applications.js +3 -60
  39. package/dist/tools/components.js +16 -103
  40. package/dist/tools/datasources.js +1 -1
  41. package/dist/tools/designSchemaPatch.js +19 -23
  42. package/dist/tools/externalComponents.js +4 -25
  43. package/dist/tools/flows.js +6 -79
  44. package/dist/tools/layouts.js +20 -48
  45. package/dist/tools/microservices.js +10 -32
  46. package/dist/tools/pages.js +115 -396
  47. package/dist/tools/platformInfo.js +2 -7
  48. package/dist/tools/rows.js +1 -7
  49. package/dist/tools/schemaOps.js +4 -35
  50. package/dist/tools/screenWrite.js +37 -25
  51. package/dist/tools/screens.js +4 -91
  52. package/dist/tools/variables.js +5 -11
  53. package/package.json +2 -2
  54. package/dist/knowledge/access.js +0 -802
  55. package/dist/knowledge/case.js +0 -41
  56. package/dist/knowledge/connectDataBind.js +0 -819
  57. package/dist/knowledge/connectDataDefinition.js +0 -341
  58. package/dist/knowledge/connectDataExecute.js +0 -93
  59. package/dist/knowledge/connectDataRules.js +0 -128
  60. package/dist/knowledge/decision.js +0 -121
  61. package/dist/knowledge/expressionPrelude.js +0 -59
  62. package/dist/knowledge/microserviceParameters.js +0 -58
  63. package/dist/knowledge/mining.js +0 -94
  64. package/dist/knowledge/mobileComponentCatalog.js +0 -864
  65. package/dist/knowledge/mobileComponentEvents.js +0 -239
  66. package/dist/knowledge/mobileStore.js +0 -227
  67. package/dist/knowledge/platform/lint.js +0 -385
  68. package/dist/knowledge/platform/mobile.js +0 -142
  69. package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
  70. package/dist/knowledge/platform/mobileRules.js +0 -231
  71. package/dist/knowledge/platform/mobileSpacing.js +0 -82
  72. package/dist/knowledge/platform/mobileTabs.js +0 -108
  73. package/dist/knowledge/platform/nativeBoxModel.js +0 -44
  74. package/dist/knowledge/platform/profile.js +0 -25
  75. package/dist/knowledge/platform/resolve.js +0 -122
  76. package/dist/knowledge/platform/web.js +0 -39
  77. package/dist/knowledge/process.js +0 -510
  78. package/dist/knowledge/rowFilter.js +0 -43
  79. package/dist/knowledge/styleResolveNative.js +0 -527
  80. package/dist/platform/argumentAliases.js +0 -128
  81. package/dist/platform/bodyFile.js +0 -103
  82. package/dist/platform/capture/actions.js +0 -333
  83. package/dist/platform/capture/browser.js +0 -1
  84. package/dist/platform/capture/capture.js +0 -659
  85. package/dist/platform/capture/console-log.js +0 -122
  86. package/dist/platform/capture/index.js +0 -11
  87. package/dist/platform/capture/readiness.js +0 -103
  88. package/dist/platform/capture/summary.js +0 -77
  89. package/dist/platform/capture/target.js +0 -5
  90. package/dist/platform/capture/targets/studio-mobile.js +0 -15
  91. package/dist/platform/capture/targets/studio-web.js +0 -5
  92. package/dist/platform/impersonation.js +0 -45
  93. package/dist/platform/jsonArray.js +0 -24
  94. package/dist/platform/schemaReadMemory.js +0 -60
  95. package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
  96. package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
  97. package/dist/resources/examples/bpm-satinalma.json +0 -376
  98. package/dist/resources/examples/connect-data-convert-verify.json +0 -107
  99. package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
  100. package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
  101. package/dist/resources/examples/connect-data-query-params.json +0 -50
  102. package/dist/resources/examples/connect-data-table-entity.json +0 -147
  103. package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
  104. package/dist/resources/examples/mobile-app-shell-drawer.json +0 -244
  105. package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
  106. package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
  107. package/dist/resources/examples/mobile-form-screen.json +0 -365
  108. package/dist/resources/examples/mobile-list-detail-form.json +0 -703
  109. package/dist/resources/guides/access.md +0 -796
  110. package/dist/resources/guides/bpm.md +0 -686
  111. package/dist/resources/guides/case.md +0 -153
  112. package/dist/resources/guides/decision.md +0 -185
  113. package/dist/resources/guides/mobile-layout.md +0 -193
  114. package/dist/resources/guides/mobile.md +0 -578
  115. package/dist/resources/read.js +0 -41
  116. package/dist/resources/schemas/AccessExplanationDto.json +0 -144
  117. package/dist/resources/schemas/AccessMatrixDto.json +0 -170
  118. package/dist/resources/schemas/AccessPermissionDto.json +0 -57
  119. package/dist/resources/schemas/AccessPolicyDto.json +0 -223
  120. package/dist/resources/schemas/AccessResourceDto.json +0 -86
  121. package/dist/resources/schemas/AppSessionDto.json +0 -53
  122. package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
  123. package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
  124. package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
  125. package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
  126. package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
  127. package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
  128. package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
  129. package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
  130. package/dist/resources/schemas/DecisionDto.json +0 -302
  131. package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
  132. package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
  133. package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
  134. package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
  135. package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
  136. package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
  137. package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
  138. package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
  139. package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
  140. package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
  141. package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
  142. package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
  143. package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
  144. package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
  145. package/dist/resources/schemas/StartMobileBuildCommand.json +0 -54
  146. package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
  147. package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
  148. package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
  149. package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +0 -259
  150. package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
  151. package/dist/tools/accessOperations.js +0 -135
  152. package/dist/tools/accessPolicies.js +0 -170
  153. package/dist/tools/accessRuntime.js +0 -203
  154. package/dist/tools/bpm.js +0 -343
  155. package/dist/tools/bpmGovernance.js +0 -266
  156. package/dist/tools/bpmOperations.js +0 -230
  157. package/dist/tools/bpmReporting.js +0 -154
  158. package/dist/tools/bpmRouting.js +0 -150
  159. package/dist/tools/bpmRuntime.js +0 -396
  160. package/dist/tools/case.js +0 -178
  161. package/dist/tools/caseRuntime.js +0 -89
  162. package/dist/tools/connectData.js +0 -449
  163. package/dist/tools/connectors.js +0 -193
  164. package/dist/tools/decisions.js +0 -206
  165. package/dist/tools/mobile.js +0 -221
  166. package/dist/tools/mobileStore.js +0 -268
  167. package/dist/tools/modules.js +0 -48
  168. package/dist/tools/organizationStructure.js +0 -137
  169. package/dist/tools/profileWrite.js +0 -92
@@ -116,8 +116,9 @@ export const componentEventContracts = {
116
116
  layout: { mount: NO_DATA, logout: NO_DATA },
117
117
  'layout-shell': {
118
118
  mount: NO_DATA,
119
- // LayoutShell.svelte toggle(): dispatch('emit', { name, data, params }) — `params` VERİLDİĞİ
120
- // için bu olay istisnadır: sidebarOpen hem self.sidebarOpen'dan hem event.data'dan okunur.
119
+ // LayoutShell.svelte announce(): sidebarOpen her değiştiğinde (overlay, Escape, akış, Durum
120
+ // bağlaması — SHELL-009) dispatch('emit', { name, data, params }). `params` VERİLDİĞİ için bu olay
121
+ // istisnadır: sidebarOpen hem self.sidebarOpen'dan hem event.data'dan okunur.
121
122
  toggle: { payload: { sidebarOpen: 'boolean (panelin YENİ durumu)' }, reads: 'self.sidebarOpen; params verildiği için event.data.sidebarOpen de dolar' }
122
123
  },
123
124
  'layout-region': { mount: NO_DATA },
@@ -157,7 +158,7 @@ export const componentEventContracts = {
157
158
  payload: {
158
159
  value: "string (elle yazılan metin) YA DA { Prefix, Separator, Counter, DigitCount, FieldId } (sunucudan kod gelince: kodun METNİ DEĞİL, kodu üreten şekil)"
159
160
  },
160
- reads: 'setter: self.value da yazılır. Elle yazarken HER TUŞTA, otomatik kod gelince bir kez yayılır — pahalı akışı changed’e bağla'
161
+ reads: 'setter: self.value da yazılır. Elle yazarken HER TUŞTA, otomatik kod gelince bir kez yayılır — pahalı akışı changed’e bağla. Yükte kodun METNİ yoktur; Counter başlangıç değeridir, kaydedilen numara değil — numarayı kayıttan dönen satırdan oku.'
161
162
  },
162
163
  changed: valueChange('string (alan bırakılınca kesinleşen metin; yalnız ELLE düzenlemede yayılır)'),
163
164
  focus: NO_DATA,
@@ -248,8 +249,8 @@ export const componentEventContracts = {
248
249
  },
249
250
  fileUpload: {
250
251
  change: {
251
- payload: { value: "Array<{ value: base64 data URL, fileName: string, type: 'file', ref: '' }>" },
252
- reads: 'self.value — dosya EKLENİNCE de SİLİNİNCE de (çipe tıklama) aynı olay yayılır ve yük her seferinde KALAN TÜM listedir, yalnız yeni dosyalar değil. isMultiple:false iken dizi tek elemanlıdır. Kilitliyken (isDisabled/isReadonly/isViewmode) hiç yayılmaz; tür/boyut/adet sınırına takılan dosya listeye girmez ve uyarı komponentin içinde çizilir, ama kabul KISMİDİR: geçen dosya varsa olay GEÇENLERLE yayılır, yalnız hepsi reddedilirse hiç yayılmaz. enableCrop açıkken görsel dosyalar kırpma katmanından geçtikten SONRA yayılır (İptal dosyayı düşürür; hepsi düşerse olay çalışmaz).'
252
+ payload: { value: "Array — her eleman: yeni seçimde { type:'file', ref:'', fileName, value:<base64 data URL> }; akışın yazdığı kayıtlı dosya AYNEN ({ type:'ref', value:<fileId>, fileName, absolute_path, … }); akış düz URL yazdıysa { type:'file', ref:'', fileName, value:<URL> } (kayıtta 500 FormatException)" },
253
+ reads: "self.value — dosya EKLENİNCE de SİLİNİNCE de (çipe tıklama) aynı olay yayılır ve yük her seferinde KALAN TÜM listedir, yalnız yeni dosyalar değil. isMultiple:false iken dizi tek elemanlıdır. Kilitliyken (isDisabled/isReadonly/isViewmode) hiç yayılmaz; tür/boyut/adet sınırına takılan dosya listeye girmez ve uyarı komponentin içinde çizilir, ama kabul KISMİDİR: geçen dosya varsa olay GEÇENLERLE yayılır, yalnız hepsi reddedilirse hiç yayılmaz. enableCrop açıkken görsel dosyalar kırpma katmanından geçtikten SONRA yayılır (İptal dosyayı düşürür; hepsi düşerse olay çalışmaz). Akışın yazdığı type:'ref' kayıtları yükte aynen kalır. isMultiple:false iken de dizidir (silmede []); tekil FILE alanına göndermeden önce ilk elemanı al (componentCatalog fileUpload.propNotes.value)."
253
254
  }
254
255
  },
255
256
  fileInput: {
@@ -433,8 +434,11 @@ export const componentEventContracts = {
433
434
  'breadcrumb-title': {
434
435
  mount: NO_DATA,
435
436
  clickItem: {
436
- payload: { currentItem: '{ key, text, flow, isHidden } — tıklanan iz öğesi (satır içi ya da … menüsünden, ikisi de aynı yükü yayar)' },
437
- reads: 'self.currentItem — öğe düğümün prop’una da yazılır; akış hangi adımın seçildiğini self.currentItem.key ile okur. Öğenin kendi flow’u varsa ÖNCE o çalışır, sonra clickItem yayılır.'
437
+ payload: {
438
+ currentItem: '{ key, text, flow, isHidden } — tıklanan iz öğesi (satır içi ya da … menüsünden, ikisi de aynı yükü yayar)',
439
+ index: 'number (items dizisindeki GERÇEK yer; gizli öğeler kaydırmaz)'
440
+ },
441
+ reads: "event.data.currentItem.key ve event.data.index ile oku (2026-09-30'dan önce event.data BOŞ geliyordu — QA BT-002). Öğenin kendi flow'u varsa ÖNCE o çalışır ve AYNI yükü event.data'dan alır, sonra clickItem yayılır. currentItem düğüme de yazılır ama self.currentItem ifade yüzeyine yalnız kayıtlı düğüm o anahtarı taşıyorsa çıkar (ARC-096) — güvenilir yol event.data'dır; index self'e YAZILMAZ. breadcrumb'ın aksine olay bağlı akış olmasa da yayılır (tıklama düğüme currentItem yazar)."
438
442
  },
439
443
  clickRoot: {
440
444
  payload: {},
@@ -454,11 +458,11 @@ export const componentEventContracts = {
454
458
  },
455
459
  chart: {
456
460
  mount: NO_DATA,
457
- dataPointClick: { payload: { name: 'string (kategori); scatter grafiğinde x değeri', seriesName: 'string', value: 'number | null; scatter grafiğinde y', dataIndex: 'number (çizimdeki sıra)', row: 'kaynak satırın TAMAMI | null' }, reads: 'YALNIZ seri noktasına basışta; eksen etiketi tıklaması axisLabelClick’tir (2026-09-16 öncesinde o da boş bir dataPointClick üretiyordu), hedef çizgisi (referenceLines) ve bant (plotBands) olay değildir. row kategori adıyla — scatter’da x değeriyle — bulunur (nullMode skip ya da huni sıralaması dataIndex`i kaydırır); kategorisi olmayan noktada (histogram kutusu, radar serisi, funnelflow düğümü/bağı) null. scatter noktası ECharts tarafında [x, y, size] dizisidir, yük tek değere indirgenir: name = x, value = y' },
461
+ dataPointClick: { payload: { name: 'string (kategori); scatter grafiğinde x değeri', seriesName: 'string', value: 'number | null; scatter grafiğinde y', dataIndex: 'number', row: 'kaynak satırın TAMAMI | null' }, reads: 'YALNIZ seri noktasında yayılır; eksen etiketi tıklaması axisLabelClick’tir (2026-09-16 öncesinde o da boş bir dataPointClick üretiyordu). scatter noktası ECharts tarafında [x, y, size] dizisidir, yük tek değere indirgenir: name = x, value = y' },
458
462
  breadcrumbClick: { payload: { filterValue: 'hedef seviyenin filtre değeri (kök seviyede undefined)' } },
459
- selectionChange: { payload: { selected: 'seçili veri noktaları' }, reads: "yalnız selectionMode 'single'/'multi' iken; 'none' iken ECharts'ın her tıklamada attığı boş seçim yayılmaz (2026-09-25 öncesi yayılıyordu)" },
463
+ selectionChange: { payload: { selected: 'seçili veri noktaları' } },
460
464
  legendClick: { payload: { name: 'string (seri adı)', selected: 'seri → görünürlük haritası' } },
461
- axisLabelClick: { payload: { value: 'string (tıklanan eksen etiketi)' }, reads: 'yalnız kategori ekseninin etiketine basışta; kategori ekseni hangi eksene düşerse oradan gelir — yatay yönelimde yAxis (2026-09-16 öncesinde yatayda hiç yayılmıyordu). Nokta tıklaması ve eksen başlığı (categoryAxis.title) bu olayı yaymaz — 2026-09-25 öncesinde nesne sorgusu süzmediği için her nokta tıklamasında noktanın değeriyle yayılıyordu' },
465
+ axisLabelClick: { payload: { value: 'string (tıklanan eksen etiketi)' }, reads: 'Kategori ekseni hangi eksene düşerse oradan gelir — yatay yönelimde yAxis (2026-09-16 öncesinde yatayda hiç yayılmıyordu)' },
462
466
  zoom: { payload: { start: 'number | null (görünen aralığın başlangıç yüzdesi)', end: 'number | null (bitiş yüzdesi)', startValue: 'number | null (eksenin kendi birimindeki mutlak alt sınır)', endValue: 'number | null (mutlak üst sınır)' }, reads: 'Yük normalize edilir: ECharts iki dataZoom bileşeniyle alanları batch içine koysa da akış her zaman bu dört alanı görür. Aralığı sorguya çevirecekseniz yüzdeleri değil startValue/endValue kullanın (2026-09-16)' },
463
467
  refresh: NO_DATA,
464
468
  retry: NO_DATA
@@ -466,7 +470,7 @@ export const componentEventContracts = {
466
470
  checkboxgroup: { mount: NO_DATA, change: valueChange('string[] (seçili değerler)'), focus: NO_DATA, blur: NO_DATA },
467
471
  emptystate: {
468
472
  mount: NO_DATA,
469
- actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "aksiyonun kendi flow'u zaten doğrudan çalışır; index GÖRÜNEN aksiyonların sırasıdır (isHidden olanlar elenmiş). href dolu satırda olay YİNE yayılır ama aynı sekmede gezinme sayfayı değiştirir ve olayın sayfa-içi sonucu görünmeden kaybolur — ikisini birlikte görmek için satırda isNewTabLink aç" }
473
+ actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "event.data.text / event.data.index (2026-10-01, QA ES-005; self.text / self.index de yazılır). Aksiyonun kendi flow'u varsa tıklamada YALNIZ o akış koşar, bu olaya bağlı akış kendi flow'u olmayan aksiyonlarda koşar; index GÖRÜNEN aksiyonların sırasıdır (isHidden olanlar elenmiş). href dolu satırda olay YİNE yayılır ama aynı sekmede gezinme sayfayı değiştirir ve olayın sayfa-içi sonucu görünmeden kaybolur — ikisini birlikte görmek için satırda isNewTabLink aç" }
470
474
  },
471
475
  iframe: {
472
476
  mount: NO_DATA,
@@ -538,7 +542,7 @@ export const componentEventContracts = {
538
542
  mount: NO_DATA,
539
543
  actionClick: {
540
544
  payload: { text: 'string (aksiyonun metni)', index: 'number' },
541
- reads: "aksiyonun kendi flow'u zaten doğrudan çalışır. index GÖRÜNEN sıradır: isHidden satırlar çizilmeden ELENİR, yani gizli satırı olan bir listede index actions dizisindeki sıra DEĞİLDİR — akışı sıraya değil text'e ya da aksiyonun kendi flow'una bağla. isLoading açıkken HİÇ yayılmaz (iskelet çizilirken düğme de yoktur); isDisabled satır da yaymaz"
545
+ reads: "event.data.text / event.data.index (2026-10-01, QA RS-004; self.text / self.index de yazılır). Aksiyonun kendi flow'u varsa tıklamada YALNIZ o akış koşar, bu olaya bağlı akış kendi flow'u olmayan aksiyonlarda koşar. index GÖRÜNEN sıradır: isHidden satırlar çizilmeden ELENİR, yani gizli satırı olan bir listede index actions dizisindeki sıra DEĞİLDİR — akışı sıraya değil text'e ya da aksiyonun kendi flow'una bağla. isLoading açıkken HİÇ yayılmaz (iskelet çizilirken düğme de yoktur); isDisabled satır da yaymaz"
542
546
  }
543
547
  },
544
548
  slider: {
@@ -580,10 +584,10 @@ export const componentEventContracts = {
580
584
  },
581
585
  close: {
582
586
  payload: { reason: "'timeout' | 'user' | 'programmatic'" },
583
- reads: 'Toast kapanınca yayılır; akışta self.reason ile okunur. timeout = süre doldu; user = kullanıcı kapattı (× düğmesi, closeOnClick tıklaması, kaydırma, Escape, aksiyon düğmesi, Clear all); programmatic = koddan dismiss/dismissAll. duplicates ile atılan tetikleme ve delay beklerken iptal edilen toast close YAYMAZ'
587
+ reads: 'Toast kapanınca yayılır; neden akışta event.data.reason ile okunur (2026-10-01, QA TS-006; self.reason da yazılmaya devam eder). timeout = süre doldu; user = kullanıcı kapattı (× düğmesi, closeOnClick tıklaması, kaydırma, Escape, aksiyon düğmesi, Clear all); programmatic = koddan dismiss/dismissAll. duplicates ile atılan tetikleme ve delay beklerken iptal edilen toast close YAYMAZ'
584
588
  },
585
589
  click: NO_DATA,
586
- actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "aksiyonun kendi flow'u zaten doğrudan çalışır" }
590
+ actionClick: { payload: { text: 'string (aksiyonun metni)', index: 'number' }, reads: "event.data.text / event.data.index (2026-10-01, QA TS-006). Yalnız kendi flow'u OLMAYAN aksiyonda koşar: aksiyonun flow'u varsa tıklamada o akış çalışır, bu olaya bağlı akış çalışmaz" }
587
591
  },
588
592
  'qm-header': {
589
593
  mount: NO_DATA,
@@ -721,19 +725,13 @@ export const eventPayloadNote = "Olay yükü motorda komponentin KENDİ prop'una
721
725
  "self.<anahtar> ile okunur — payload anahtarları aynı zamanda o prop'ların adıdır. " +
722
726
  "event.data ESKİ kuşak komponent olaylarında BOŞ gelir: motor akışı emit'in params'ıyla başlatır ve " +
723
727
  "event.data = params.data'dır (html actions/fireEvent ile 2026-08-27 kuşağı — eventcalendar · " +
724
- "importwizard · kanban · signature · stepper — bu yoldan doldurur; ayrım tekil sözleşme notlarında). " +
728
+ "importwizard · kanban · signature · stepper — ve QA turlarında params eklenen tabs · breadcrumb-title · " +
729
+ "toast · result · emptystate bu yoldan doldurur; ayrım tekil sözleşme notlarında). " +
725
730
  "payload boşsa olay veri taşımaz; 'reads' verilmişse değer yükte değil komponentin başka bir prop'undadır. " +
726
731
  "self yerine value { type:'property', ref:{ source:'component', element:'<elementId>', property:'<prop>' } } de kullanılabilir. " +
727
732
  "payload alanı yoksa yük sözlüğe henüz işlenmemiştir; tahmin etmeyin.";
728
- /**
729
- * `platformContracts` platforma özgü sözlüktür (mobilde `mobileComponentEvents.ts`): aynı olayda
730
- * web sözleşmesinin ÖNÜNE geçer, web'de karşılığı olmayan bileşenin tek kaynağıdır.
731
- */
732
- export function eventContractsFor(slug, names, platformContracts) {
733
- const own = (source) => slug !== undefined && source !== undefined && Object.hasOwn(source, slug) ? source[slug] : undefined;
734
- const web = own(componentEventContracts);
735
- const platform = own(platformContracts);
736
- const contracts = web || platform ? { ...web, ...platform } : undefined;
733
+ export function eventContractsFor(slug, names) {
734
+ const contracts = slug ? componentEventContracts[slug] : undefined;
737
735
  return names.map(name => {
738
736
  const contract = contracts?.[name];
739
737
  if (!contract)
@@ -1,148 +1,10 @@
1
- import { MOBILE_DROPPABLE_TYPES, MOBILE_INTRINSIC_WIDTH_TYPES, MOBILE_OUT_OF_FLOW_TYPES, MOBILE_TRANSPARENT_WRAPPER_TYPES } from './mobileComponentCatalog.js';
2
- const SPACING_SCALE = [0, 4, 8, 16, 24, 32];
3
- const EDGE_TOLERANCE = 1;
4
- const WIDTH_TOLERANCE = 2;
5
- export function summarizeLayout(boxes, viewport, options = {}) {
1
+ export function summarizeLayout(boxes, viewport) {
6
2
  const outside = (box) => box.x + box.width <= 0 || box.y + box.height <= 0 || box.x >= viewport.width || box.y >= viewport.height;
7
- const alignment = options.alignment === true ? summarizeAlignment(boxes, viewport) : undefined;
8
3
  return {
9
4
  nodeCount: boxes.length,
10
5
  overflowing: boxes.filter(box => box.overflowX || box.overflowY).map(box => box.elementId),
11
6
  outsideViewport: boxes.filter(box => box.width > 0 && box.height > 0 && outside(box)).map(box => box.elementId),
12
7
  zeroSized: boxes.filter(box => box.width === 0 || box.height === 0).map(box => box.elementId),
13
- truncated: boxes.length >= 500,
14
- ...(alignment ? { alignment } : {})
8
+ truncated: boxes.length >= 500
15
9
  };
16
10
  }
17
- function summarizeAlignment(boxes, viewport) {
18
- // Tip ve ata sırası olmayan kutular (eski runtime/betik) ağaç kurmaz; hiza uydurulmaz.
19
- if (!boxes.some(box => typeof box.type === 'string' && box.parentIndex !== undefined))
20
- return undefined;
21
- // Ağaç sırayla kurulur, kimlikle değil: `repeater` aynı elementId'yi her satırda yeniden çizer.
22
- const parentOf = (box) => typeof box.parentIndex === 'number' ? boxes[box.parentIndex] : undefined;
23
- // İç roller (`__trigger`, `__press`) tip taşımaz: bileşenin parçasıdır, düğüm değildir.
24
- const typedParent = (box) => {
25
- for (let current = parentOf(box); current; current = parentOf(current))
26
- if (current.type)
27
- return current;
28
- return undefined;
29
- };
30
- const ancestors = (box) => {
31
- const chain = [];
32
- for (let current = typedParent(box); current; current = typedParent(current))
33
- chain.push(current);
34
- return chain;
35
- };
36
- // Ana ağacın kökü en büyük atasız kutudur. Öteki atasız kutular portala çizilir (floating-container,
37
- // toast, modal içeriği) ve akışta değildir; sayılsalar ana kökü "yan yana kardeş" yapar, ekran satır sayılırdı.
38
- // Sayfanın ağacını taşıyan kök seçilir (kabuklu sayfada shell_root, kabuksuzda page_container); bulunamazsa
39
- // en büyük kök, eşitlikte sonraki — portal içeriği DOM'da uygulamadan önce durur.
40
- const roots = boxes.filter(box => box.type && !typedParent(box));
41
- const pageContainer = boxes.find(box => box.elementId === 'page_container');
42
- const mainRoot = (pageContainer ? [pageContainer, ...ancestors(pageContainer)].at(-1) : undefined)
43
- ?? [...roots].reverse().sort((a, b) => b.width * b.height - a.width * a.height)[0];
44
- // Saydam sarmalayıcının (tooltip) kutusu görünmez; dikey aralık onun görünen içeriğinden ölçülür.
45
- const visibleExtent = (box) => {
46
- const children = MOBILE_TRANSPARENT_WRAPPER_TYPES.includes(box.type ?? '') ? boxes.filter(child => child.type && typedParent(child) === box && child.height > 0) : [];
47
- return children.length === 0
48
- ? { top: box.y, bottom: box.y + box.height }
49
- : { top: Math.min(...children.map(child => child.y)), bottom: Math.max(...children.map(child => child.y + child.height)) };
50
- };
51
- const outOfFlow = (box) => {
52
- const chain = [box, ...ancestors(box)];
53
- return chain.some(item => MOBILE_OUT_OF_FLOW_TYPES.includes(item.type ?? '')) || chain[chain.length - 1] !== mainRoot;
54
- };
55
- // Yatayda ekrana sığmayan kutu (carousel ya da yatay kaydırmanın öteki sayfaları) sütun akışında değildir.
56
- const onScreen = (box) => box.x >= -EDGE_TOLERANCE && box.x + box.width <= viewport.width + EDGE_TOLERANCE;
57
- const flow = boxes.filter(box => box.type && box.width > 0 && box.height > 0 && onScreen(box) && !outOfFlow(box));
58
- const inFlow = new Set(flow);
59
- const parents = new Set(flow.map(typedParent).filter(Boolean));
60
- const siblings = (box) => flow.filter(other => other !== box && typedParent(other) === typedParent(box));
61
- const besideSibling = (box) => siblings(box).some(other => other.y < box.y + box.height - EDGE_TOLERANCE && box.y < other.y + other.height - EDGE_TOLERANCE);
62
- // Kapsam, kendi kapsamından dar bir yüzeydir. Kapsamı boydan boya kaplayan zemin (boyanmış sayfa kökü,
63
- // tam genişlik bant) yeni kapsam açmaz; içeriği ekranın kenar ölçüsüne girer.
64
- const scopeCache = new Map();
65
- const scopeOf = (box) => {
66
- if (scopeCache.has(box))
67
- return scopeCache.get(box);
68
- const scope = ancestors(box).find(item => inFlow.has(item) && opensScope(item));
69
- scopeCache.set(box, scope);
70
- return scope;
71
- };
72
- const opensScope = (box) => box.surface === true && box.width < (scopeOf(box)?.width ?? viewport.width) - WIDTH_TOLERANCE;
73
- // Yan yana dizilen öğe (satır kabının çocuğu ya da onun içindeki sütun) sütun hizasına girmez.
74
- const inRow = (box) => {
75
- const scope = scopeOf(box);
76
- const chain = [box, ...ancestors(box)];
77
- return chain.slice(0, scope ? chain.indexOf(scope) : chain.length).some(besideSibling);
78
- };
79
- const isContent = (box) => parents.has(box)
80
- ? opensScope(box)
81
- : box.surface === true || !MOBILE_DROPPABLE_TYPES.includes(box.type ?? '');
82
- const scopes = new Map([[undefined, []]]);
83
- for (const box of flow.filter(isContent)) {
84
- const scope = scopeOf(box);
85
- if (box.width >= (scope?.width ?? viewport.width) / 2 && !inRow(box))
86
- scopes.set(scope, [...(scopes.get(scope) ?? []), box]);
87
- }
88
- const reports = [...scopes].map(([scope, members]) => ({ scope, ...scopeAlignment(members) }));
89
- const screen = reports.find(report => report.scope === undefined);
90
- return {
91
- gutter: screenGutter(screen?.dominantLeft, screen?.dominantRight, viewport.width),
92
- leftEdges: screen?.leftEdges ?? [],
93
- surfaces: reports.filter(report => report.scope !== undefined && report.leftEdges.length > 1).map(report => ({ elementId: report.scope?.elementId ?? '', leftEdges: report.leftEdges })),
94
- widthOutliers: reports.flatMap(report => report.widthOutliers),
95
- offScaleGaps: offScaleGaps(flow, typedParent, visibleExtent)
96
- };
97
- }
98
- function scopeAlignment(members) {
99
- const leftEdges = clusters(members, box => box.x);
100
- const sized = members.filter(box => !MOBILE_INTRINSIC_WIDTH_TYPES.includes(box.type ?? ''));
101
- // Yalnız içerik genişlikli öğe varsa (metin listesi) sağ kenar onlardan okunur; sapma yine sayılmaz.
102
- const rightEdges = clusters(sized.length > 0 ? sized : members, box => box.x + box.width);
103
- // Eşitlikte en soldaki sol kenar ve en sağdaki sağ kenar kazanır: sözleşmenin normu `fill`dir.
104
- const dominantLeft = [...leftEdges].sort((a, b) => b.elementIds.length - a.elementIds.length || a.x - b.x)[0]?.x;
105
- const dominantRight = [...rightEdges].sort((a, b) => b.elementIds.length - a.elementIds.length || b.x - a.x)[0]?.x;
106
- const widthOutliers = dominantLeft === undefined || dominantRight === undefined
107
- ? []
108
- : unique(sized.filter(box => Math.abs(box.x + box.width - dominantRight) > WIDTH_TOLERANCE), box => box.elementId)
109
- .map(box => ({ elementId: box.elementId, insetLeft: box.x - dominantLeft, insetRight: dominantRight - (box.x + box.width) }));
110
- return { leftEdges, dominantLeft, dominantRight, widthOutliers };
111
- }
112
- const unique = (items, key) => items.filter((item, index) => items.findIndex(other => key(other) === key(item)) === index);
113
- function clusters(members, edge) {
114
- const result = [];
115
- for (const box of members) {
116
- const match = result.find(cluster => Math.abs(cluster.x - edge(box)) <= EDGE_TOLERANCE);
117
- if (match && !match.elementIds.includes(box.elementId))
118
- match.elementIds.push(box.elementId);
119
- else if (!match)
120
- result.push({ x: edge(box), elementIds: [box.elementId] });
121
- }
122
- return result.sort((a, b) => a.x - b.x);
123
- }
124
- function screenGutter(left, right, width) {
125
- if (left === undefined || right === undefined)
126
- return null;
127
- const rightGutter = width - right;
128
- return Math.abs(left - rightGutter) <= EDGE_TOLERANCE ? left : { left, right: rightGutter };
129
- }
130
- /** Aynı atanın alt alta duran ardışık çocukları arasındaki boşluk ölçekte mi (yan yana olanlar sayılmaz). */
131
- function offScaleGaps(flow, typedParent, extent) {
132
- const groups = new Map();
133
- for (const box of flow) {
134
- const key = typedParent(box);
135
- groups.set(key, [...(groups.get(key) ?? []), box]);
136
- }
137
- return [...groups.values()].flatMap(group => {
138
- const sorted = [...group].sort((a, b) => a.y - b.y);
139
- return sorted.slice(1).flatMap((next, index) => {
140
- const previous = sorted[index];
141
- const gap = extent(next).top - extent(previous).bottom;
142
- const stacked = gap >= -EDGE_TOLERANCE && previous.x < next.x + next.width && next.x < previous.x + previous.width;
143
- return stacked && !SPACING_SCALE.some(step => Math.abs(step - gap) <= EDGE_TOLERANCE)
144
- ? [{ between: [previous.elementId, next.elementId], gap }]
145
- : [];
146
- });
147
- });
148
- }