@appaflytech/zeyrek-ai-mcp 0.0.7 → 0.0.8

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 (35) hide show
  1. package/dist/knowledge/backendConstraints.js +3 -0
  2. package/dist/knowledge/componentCatalog.js +59 -15
  3. package/dist/knowledge/normalize.js +459 -23
  4. package/dist/knowledge/propTypes.js +5 -4
  5. package/dist/knowledge/rules.js +110 -5
  6. package/dist/knowledge/styleResolve.js +6 -1
  7. package/dist/platform/http.js +10 -2
  8. package/dist/platform/screenshot.js +80 -8
  9. package/dist/platform/strictArguments.js +32 -0
  10. package/dist/platform/writeDiff.js +6 -3
  11. package/dist/resources/examples/page-sign-in.json +1 -1
  12. package/dist/resources/guides/component.md +1 -1
  13. package/dist/resources/guides/expressions.md +6 -0
  14. package/dist/resources/guides/getting-started.md +2 -0
  15. package/dist/resources/guides/layout.md +6 -0
  16. package/dist/resources/guides/microservice.md +105 -5
  17. package/dist/resources/guides/page.md +81 -18
  18. package/dist/resources/guides/translation.md +11 -10
  19. package/dist/resources/guides/workflow.md +50 -1
  20. package/dist/resources/schema-fingerprint.json +2 -2
  21. package/dist/resources/schemas/CreateMicroserviceCommand.json +4 -1
  22. package/dist/resources/schemas/CreateWorkflowCommand.json +4 -1
  23. package/dist/resources/schemas/PreviewMicroserviceCommand.json +4 -1
  24. package/dist/resources/schemas/PreviewWorkflowCommand.json +4 -1
  25. package/dist/resources/schemas/StepDto.json +4 -1
  26. package/dist/resources/schemas/UpdateMicroserviceCommand.json +4 -1
  27. package/dist/resources/schemas/UpdateWorkflowCommand.json +4 -1
  28. package/dist/server.js +2 -1
  29. package/dist/tools/flows.js +9 -3
  30. package/dist/tools/layouts.js +4 -4
  31. package/dist/tools/microservices.js +70 -6
  32. package/dist/tools/pages.js +127 -57
  33. package/dist/tools/queries.js +72 -6
  34. package/dist/tools/workflows.js +9 -5
  35. package/package.json +1 -1
@@ -417,6 +417,9 @@ function microserviceFindings(body) {
417
417
  findings.push(`sourceParameters.fields[${index}]: writeOn:'${String(field.writeOn)}' yalnız operation:'upsert' ucunda anlamlı; bu uç '${operation ?? '?'}' — writeOn'u kaldırın ya da 'always' bırakın (Fields.All(WriteOn == Always) when Operation != Upsert).`);
418
418
  }
419
419
  });
420
+ if (body.source === 'table' && operation !== undefined && operation.startsWith('bulk-') && asObjects(parameters.filters).length > 0) {
421
+ findings.push(`sourceParameters.filters: '${operation}' ucu filtre KULLANMAZ — bulk create/update satırları gövdeden, bulk delete birincil anahtarları gövdeden okur. Filtreleri kaldırın.`);
422
+ }
420
423
  flattenFilters(parameters.filters).forEach((filter, index) => {
421
424
  if (!isSingleFilter(filter))
422
425
  return;
@@ -45,9 +45,12 @@ export const STYLE_GROUP_NOTES = {
45
45
  * borderWidth…) yerini alır; kayıtlı appearance değerleri çizilmeye devam eder
46
46
  * ama Studio'da artık düzenlenmez — yeni karar surfaceStyle'a yazılır.
47
47
  */
48
+ const DATE_VALUE_FORMAT_NOTE = "YEREL duvar saati 'yyyy-MM-ddTHH:mm:ss' metni (dilim eki yok; valueOffset verilmişse o kadar saat kaydırılmış) ya da null. Biçim uygulama dilinden ve locale'den BAĞIMSIZDIR — locale yalnız ekrandaki metni değiştirir. Uca type:'text' parametreyle aynen gider; SQL'de ::timestamp ile okunur, to_timestamp/AM-PM ayrıştırması GEREKMEZ (G-01: backend bu değeri eskiden en-US '9/15/2026 10:23:00 PM' metnine çeviriyordu, 2026-09-15'te düzeltildi).";
48
49
  export const LOCALE_FOLLOWS_APP_NOTE = "Boş bırak — komponent o zaman UYGULAMA dilini izler ve language-selector ile dil değişince gün/ay adları ve saat biçimi anında güncellenir. Doldurulursa o dile SABİTLENİR (bilinçli sabitleme için). Tasarımcı listesi tr/en gösterir ama uygulama dili yolu her ISO 639-1 kodunu kabul eder; sözlüğü olmayan dilde METİN İngilizceye düşer, sayı/tarih BİÇİMİ o dilin kendi kuralını kullanır.";
49
50
  const NODE_SURFACE_NOTE = STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens +
50
51
  " Bu bileşen grubu KENDİ OKUMAZ: render katmanı yüzeyi düğüm kutusuna (.ng-app__node-item) yazar, contentOverflow kutunun kendisine iner. Eski appearance Surface alanları (background/borderWidth/radius/shadow/opacity/overflow) EMEKLİ — yeni karar buraya yazılır.";
52
+ /** layout ve navigations'ın ORTAK menü satırı grubu (frontend style-group-schemas.ts navigationStyleGroup + navigation-style-logic.ts). */
53
+ const NAVIGATION_STYLE_NOTE = "Menü satırlarının TİPLİ grubu, menünün TAMAMINA uygulanır: padding (CSS kutu kısayolu; sol değer satırın derinlik girintisiyle TOPLANIR), radius (tema kademesi 'sm|md|lg|pill' ya da CSS), textColor · iconColor · hoverBackground (seçili OLMAYAN satırlar), activeBackground · activeTextColor · activeIconColor (seçili satır; zemin hover'da da korunur). Boş iconColor yazı rengini izler. Renkler hex ya da var(--ng-…) token'ı alır. ÖĞE BAZLI STİL YOKTUR: navigations[].style diye bir alan tanımlı değil, yazılan değer sessizce düşer — satır görünümünü yalnız bu grup verir. Grubun yazmadığı CSS için style'ın &__item / &__item--active / &__icon parçaları kullanılır (yalnız navigations bileşeninde; layout'un style'ı menüye ulaşmaz). resolvedStyle raporu bu grubu İÇERMEZ.";
51
54
  export const componentKnowledge = {
52
55
  html: {
53
56
  summary: 'Kaçış kapısı: hazır komponentler yetmediğinde ham HTML + Mustache şablonu + scoped CSS + satır içi script + flow köprüsüyle her gereksinimi kapatır.',
@@ -114,7 +117,7 @@ export const componentKnowledge = {
114
117
  image: "IMAGE/FILE kolonu düz URL string'i KABUL ETMEZ: hücre `{ absolute_path, display_name }` (ya da `fileName`) alanlarını taşıyan bir DOSYA NESNESİ (veya nesne dizisi) bekler — `DisplayCellView.svelte:10` `file.absolute_path ?? ''` okur, düz string verilince kaynak boş kalır ve hücre SESSİZCE boş çizilir (09-04 Y-21). Satır verisi bir metin kolonunda URL taşıyorsa kolonu 'url'/'link' yap ya da veriyi { absolute_path: '<url>', display_name: '<ad>' } biçimine çevir; entity'nin FILE alanı zaten bu şekli döner.",
115
118
  actions: "Satır aksiyonları. kind sözlüğü BUTON'unkinden farklıdır: error · information · solid · transparent · dark · danger · warning (butonda success/error/info/primary/warning). Yanlış sözlükten değer invalid-enum-value verir.",
116
119
  selectedRow: "Salt okunur: satır aksiyonu tıklanınca komponentin kendisi doldurur; akış ifadesinde '<elementId>.selectedRow' ile okunur.",
117
- colorMap: "Kolon içi değer→renk sözlüğü: [{ value:'Active', color:'#16a34a' }]. STATİKTİR — hücrenin kendi değerine bakar, satırın başka alanına göre hesaplanamaz. Satıra göre koşullu renk gerekiyorsa ya table + _columns ezmesi kullan ya da satır verisinde rengi taşı ({ label, color }) — render sırası: veri objesindeki color → colorMap[etiket] → autoColor.",
120
+ colorMap: "Kolon içi değer→renk sözlüğü: [{ value:'Active', color:'#16a34a' }]. STATİKTİR — hücrenin kendi değerine bakar, satırın başka alanına göre hesaplanamaz. Satıra göre koşullu renk gerekiyorsa ya table + _columns ezmesi kullan ya da satır verisinde rengi taşı ({ label, color }) — render sırası: veri objesindeki color → colorMap[etiket] → autoColor. TAG HÜCRE ŞEKLİ: metin, { label, color? } ya da { value, color? } (label yoksa value okunur; ikisi de yoksa obje ham JSON basılır) veya bunların dizisi. RENK (veri objesinde de colorMap'te de): semantik ad primary · info · success · warning · error TEMA TOKEN'INA çözülür (tema değişince izler, ham hex yazmaya gerek yok); hex/rgb/'var(--ng-…)'/CSS renk adı olduğu gibi geçer; başka bir değer (yazım hatası, çözülmemiş '{{ }}') o kademeyi ATLAR ve sıradakine düşer. Veri objesindeki variant OKUNMAZ — outline/solid kolonun appearance'ından gelir. Solid rozetin yazı rengi token'da CSS ile siyah/beyaz seçilir.",
118
121
  tableStyle: "zebra | plain — satır zemini varyantı; CSS DEĞİL. Serbest CSS için ayrı `style` prop'u vardır (parça bazlı).",
119
122
  style: "Parça bazlı CSS: &__toolbar · &__title · &__head · &__th · &__body · &__row · &__td. designerCss her bildirime !important ekler, yani komponentin kendi çerçeve/ayraç varsayılanlarını ezer — Figma tipi düz tablo bununla kurulur."
120
123
  }
@@ -124,10 +127,12 @@ export const componentKnowledge = {
124
127
  behavior: [
125
128
  "Düzen prop grubunun TAMAMINI taşır (2026-09-01): layout ('flex' | 'grid') + direction/horizontalAlign/verticalAlign/size/gap/wrap, varsayılanları container ile aynı (flex · row · left · top · shrink · medium · wrap açık). 'Form'a layout yazılmaz' eski bilgidir. layout prop'u hiç yazılmamış eski form kayıtları ızgara koordinatıyla (blocks[].position + size.w) dizilmeye devam eder. Platform kataloğu component_get'te hâlâ eski şemayı gösteriyorsa kayıt yenilenmemiştir (ARC-024).",
126
129
  "Alan doğrulaması komponentin kendi validations dizisindedir: [{ type: 'required'|'email'|'max-length'…, message, value, isActive }] — dördü de zorunlu, eski 'maxLength' yazımı kaydedilir ama runtime doğrulayıcı onu TANIMAZ ve sessizce hiçbir şey doğrulamaz.",
127
- "message bir ÇEVİRİ ANAHTARI olabilir: 't:' önekiyle yazılan mesaj (ör. 't:form.required') uygulamanın çeviri sözlüğünden çözülür — hem alanın kendi hata metninde hem form-validation-errors listesinde. Öneksiz mesaj yazarın kendi cümlesidir ve iki nokta içerse bile aynen gösterilir. Çözüm form MOUNT olurken bir kez yapılır: ekranda hata dururken dil değiştirilirse metin sayfa yenilenene kadar eski dilde kalır."
130
+ "message bir ÇEVİRİ ANAHTARI olabilir: 't:' önekiyle yazılan mesaj (ör. 't:form.required') uygulamanın çeviri sözlüğünden çözülür — hem alanın kendi hata metninde hem form-validation-errors listesinde. Öneksiz mesaj yazarın kendi cümlesidir ve iki nokta içerse bile aynen gösterilir. Çözüm form MOUNT olurken bir kez yapılır: ekranda hata dururken dil değiştirilirse metin sayfa yenilenene kadar eski dilde kalır.",
131
+ "Formu temizlemek için akış kodunda resetForm('<form adı>') çağrılır (2026-09-15): alanlar başlangıç değerine döner, form gönderilmemiş hâline geçer, hata işaretleri ve form-validation-errors listesi silinir. Alanları setter ile tek tek null'a çekmek YANLIŞ yoldur: form bir kez gönderildiyse her change doğrulamayı yeniden koşturur ve boş form 'zorunlu alan' mesajlarıyla açılır. Gönderim sonrası otomatik temizlik isteniyorsa isClearFormInputsAfterSubmit aynı sıfırlamayı yapar."
128
132
  ],
129
133
  propNotes: {
130
- surfaceStyle: NODE_SURFACE_NOTE,
134
+ surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Form grubu KENDİ derler (2026-09-15): değer <form> KÖKÜNE iner, contentOverflow gövdeye ('&__body'). Formu bir kartın içine koyup kendi zeminini/çerçevesini kaldırmanın yolu budur: { background: 'transparent', borderTop: 'none', borderRight: 'none', borderBottom: 'none', borderLeft: 'none' }.",
135
+ style: STYLE_GROUP_NOTES.styleEscape + " Parçalar: KÖK (anahtarlar doğrudan style'da) <form> elemanıdır ve TABAN zemini (--ng-background-surface), 1px çerçeveyi (--ng-border-primary) ve köşeyi (--ng-rounded) ÇİZER; '&__body' yalnız kaydırma/esneme taşır — çerçeveyi '&__body'ye yazarak kaldıramazsın. '&__header' başlık bandı, '&__title' başlık metni. DOM yapısına bağlı seçiciler ('& > div') belgelenmemiştir ve iç yapı değişince sessizce kırılır.",
131
136
  errorElementId: "Sayfadaki form-validation-errors komponentinin elementId'si — bağlanmazsa alan doğrulama mesajları görünmez."
132
137
  }
133
138
  },
@@ -282,7 +287,7 @@ export const componentKnowledge = {
282
287
  layout: "'flex' (katalog varsayılanı; akış) | 'grid' (12 kolonluk ızgara). Prop hiç yazılmamışsa renderer IZGARA çizer — varsayılan yalnız düğüm kurulurken materyalize olur. Aşağıdaki altı prop YALNIZ 'flex' iken etkilidir.",
283
288
  direction: "'row' (varsayılan) | 'column' → flex-direction. Hangi hizalamanın ana eksen olduğunu bu belirler.",
284
289
  horizontalAlign: "left | center | right | stretch. row'da ANA eksen (justify-content), column'da ÇAPRAZ eksen (align-items). stretch: ana eksende space-between, çapraz eksende tam doldurma.",
285
- verticalAlign: "top | middle | bottom | stretch. row'da ÇAPRAZ eksen, column'da ANA eksen — horizontalAlign ile rollerini değiştirirler.",
290
+ verticalAlign: "top | middle | bottom | stretch. row'da ÇAPRAZ eksen, column'da ANA eksen — horizontalAlign ile rollerini değiştirirler. row'da stretch seçiliyken çocuğun sabit yüksekliği (heightType fixed → heightString ya da size.h×10px) HEIGHT değil MIN-HEIGHT olarak yazılır (2026-09-15): çocuklar en uzun kardeşin boyuna eşitlenir, sabit ölçü taban kalır — eşit boylu KPI kartları için her karta elle aynı heightString yazmak gerekmez. İstisna: isScrollable çocuk kesin yüksekliğini korur. Izgara kapta (layout grid) bu prop da gap de okunmaz; eşit kart satırı flex row + stretch ile kurulur.",
286
291
  size: "'shrink' (çocuklar flex: 0 1 auto, varsayılan) | 'grow' (flex: 1 1 auto — çocuklar boşluğu paylaşır).",
287
292
  gap: "none | small | medium (varsayılan) | large → tema değişkenleri: 0 / var(--ng-spacing-sm) / --ng-spacing-md / --ng-spacing-lg (varsayılan temada 8/16/32px). Alan allowCustom'dır: '18px' ya da 'var(--ng-spacing-xl)' gibi ham CSS değeri de geçer. Çocuk genişlik formülünden payı düşülür, böylece w toplamı 12 olan satır tam kapanır.",
288
293
  wrap: "flex-wrap: wrap. Varsayılan AÇIK (2026-09-01'de flipledi): w:12 çocuklar alt satıra sararak dikey akar. Kapatırsan satıra sığmayan çocuklar sıkışır, alta inmez.",
@@ -300,7 +305,10 @@ export const componentKnowledge = {
300
305
  },
301
306
  modal: {
302
307
  summary: 'Ortalanmış katman; şemanın KÖKÜNDE page_container’ın kardeşi olarak durur, içeriği (kendi formu ve submit akışı dahil) children’ına eklenir.',
303
- behavior: ["open/close olayları akışa bağlanabilir; açma/kapama isHidden ile değil kendi open state'iyle yürür (setter ile isOpen yaz)."],
308
+ behavior: [
309
+ "open/close olayları akışa bağlanabilir; açma/kapama isHidden ile değil kendi open state'iyle yürür (setter ile isOpen yaz).",
310
+ "Kaplama çerçevesidir (isFrame): kanvasta blok tutmaz, runtime kutu stili yazmadan ayrı dalda çizer. Katalog boyutu bilerek BOŞ aralıktır (minSize 1, maxSize 0) ve 2026-09-15'ten beri doğrulayıcı boş aralıklı eksende blocks[].size'ı DENETLEMEZ — add_component ile kökte (parent null) herhangi bir { w, h } ile eklenir. Daha eski backend build'i her boyutu 'Height of modal must be between 1 and 0' (invalid-size) ile reddeder; o durumda imaj yenilenmemiştir. drawer ve toast aynı kuraldadır."
311
+ ],
304
312
  propNotes: { surfaceStyle: NODE_SURFACE_NOTE }
305
313
  },
306
314
  drawer: {
@@ -516,9 +524,21 @@ export const componentKnowledge = {
516
524
  isLoading: 'Grubu KİLİTLER (checkboxgroup deseni): seçenek listesi soluklaşır, tık yutulur, change yayılmaz ve grup aria-busy taşır; etiketin yanında dönen spinner çizilir. Seçenekleri getiren sorgu sürerken aç, gelince kapat.'
517
525
  }
518
526
  },
519
- datepicker: { summary: 'Tarih seçici; change yükü { value, HH, mm }.', propNotes: { locale: LOCALE_FOLLOWS_APP_NOTE } },
520
- datetimepicker: { summary: 'Tarih+saat seçici; değer event.data’da değil self.value’dadır.', propNotes: { locale: LOCALE_FOLLOWS_APP_NOTE } },
521
- daterangepicker: { summary: 'Tarih aralığı; change yükü { valueFrom, valueTo, HH, mm }.', propNotes: { locale: LOCALE_FOLLOWS_APP_NOTE } },
527
+ datepicker: {
528
+ summary: 'Tarih seçici; change yükü { value, HH, mm }.',
529
+ behavior: [
530
+ "Kutu salt okunurdur (elle yazma çift tıkla açılır) ama programdan gelen change'i DİNLER: page_screenshot 'set' ile ISO tarih ('2026-08-01') ya da gösterim biçimi yazılabilir, değer takvimden seçilmiş gibi yayılır. 2026-09-15 öncesi olay dinlenmiyordu: kutu dolu görünüyor, prop boş kalıyordu (G-14)."
531
+ ],
532
+ propNotes: { value: DATE_VALUE_FORMAT_NOTE, locale: LOCALE_FOLLOWS_APP_NOTE }
533
+ },
534
+ datetimepicker: { summary: 'Tarih+saat seçici; değer event.data’da değil self.value’dadır.', propNotes: { value: DATE_VALUE_FORMAT_NOTE, locale: LOCALE_FOLLOWS_APP_NOTE } },
535
+ daterangepicker: {
536
+ summary: 'Tarih aralığı; change yükü { valueFrom, valueTo, HH, mm }.',
537
+ behavior: [
538
+ "İki kutu ayrı adreslenir: '<elementId>__start' (valueFrom) ve '<elementId>__end' (valueTo). page_screenshot 'set' kökü REDDEDER (tek değer yok); kutuya ISO tarih ('2026-08-01') ya da gösterim biçimi ('1 Ağu 2026') yazılır, kutu değeri kendi change yoluna sokar ve prop'a yazar. Okunamayan metin kutuyu tutulan değere geri çevirir; actionsReport propWritten:false döner (G-14, 2026-09-15)."
539
+ ],
540
+ propNotes: { valueFrom: DATE_VALUE_FORMAT_NOTE, valueTo: DATE_VALUE_FORMAT_NOTE, locale: LOCALE_FOLLOWS_APP_NOTE }
541
+ },
522
542
  datetimerangepicker: {
523
543
  summary: 'Tarih+saat aralığı: değer valueFrom/valueTo İKİLİSİDİR (tek value yok); her yarı bir takvim + dakika adımlı saat listesi; change yükü { valueFrom, valueTo }.',
524
544
  behavior: [
@@ -530,7 +550,8 @@ export const componentKnowledge = {
530
550
  "focus/blur ALAN düzeyindedir (2026-09-12): iki tarih girdisi, iki saat girdisi, takvim ve saat listesi arasında dolaşmak olay yaymaz; yalnız alana girmek ve alandan çıkmak yayar. Kilitli alan (isDisabled/isReadonly/isViewmode) hiçbir olay yaymaz.",
531
551
  "isLoading KİLİT DEĞİLDİR (2026-09-12): alan odaklanabilir kalır, sağ uçta dönen spinner çizilir, kök aria-busy taşır (478px altındaki dikey yığılmada spinner çizilmez, aria-busy kalır). Kilit için isDisabled kullan.",
532
552
  "Her yarının kendi X'i vardır ve yalnız o yarıyı boşaltır (change o yarı null, diğeri olduğu gibi). İkisini birden boşaltmanın yolu iki X ya da akıştan iki prop'u null yazmaktır.",
533
- "Gösterim dili locale'den (boşsa uygulama dili): tarih tr'de 'd MMM yyyy', diğer dillerde 'MMM d, yyyy'; saat en'de 12 saat (01:00 PM), diğer dillerde 24 saat. Değer her dilde aynı 24 saatlik metindir. Biçim prop'u YOK (ARC-071)."
553
+ "Gösterim dili locale'den (boşsa uygulama dili): tarih tr'de 'd MMM yyyy', diğer dillerde 'MMM d, yyyy'; saat en'de 12 saat (01:00 PM), diğer dillerde 24 saat. Değer her dilde aynı 24 saatlik metindir. Biçim prop'u YOK (ARC-071).",
554
+ "Tarih kutuları '<elementId>__start' / '<elementId>__end' ile adreslenir (G-14, 2026-09-15). page_screenshot 'set' kökü reddeder; kutuya ISO tarih yazmak takvimden gün seçmekle AYNI kuraldır: yarı değer tutmuyorsa yalnız taslak olur ve propWritten:false döner — saat kutusu ayrıca hedeflenemez, önce akıştan değer yazın ya da saati tıklamayla seçin."
534
555
  ],
535
556
  propNotes: {
536
557
  valueFrom: "Başlangıç: 'yyyy-MM-ddTHH:mm:ss' ya da null. Akıştan yazarken bu biçimi (ya da Date'in okuduğu bir ISO metnini) kullan; okunamayan metin yarıyı BOŞ gösterir, hata vermez.",
@@ -614,7 +635,7 @@ export const componentKnowledge = {
614
635
  summary: 'Sayfa içi geri bildirim kutusu; akışlarda alert adımı yerine bu komponent kullanılır.',
615
636
  behavior: [
616
637
  "isHidden 2026-08-26'dan beri bu komponentin ŞEMASINDA VARDIR (daha önce yoktu ve bu katalog bir dönem 'unknown-prop verir' diyordu): props.isHidden'ı doğrudan şemaya yazabilirsin, başlangıçta gizli bildirim için container'a sarmak GEREKMEZ.",
617
- "appearance.isHidden bir çözüm DEĞİLDİR: kaydedilir ama runtime hiçbir yerde okumaz (renderer yalnız props.isHidden'a bakar).",
638
+ "Görünürlük yalnız props.isHidden'dır: appearance'ta isHidden alanı YOKTUR (2026-09-15'te platformdan kaldırıldı, S-16). Gövdeye appearance.isHidden konursa gateway onu props.isHidden'a taşır ve gatewayNormalized'da bildirir.",
618
639
  "Kendini KAPATIRKEN props.isHidden'a yazar: hem timeout dolduğunda hem kapatma düğmesinde 'toggled' emit'i { isHidden: true } taşır (Notification.svelte handleEvent). Şema events sözlüğünde bu ad YOKTUR — akışa bağlanacak bir olay değil, prop'a geri yazma yoludur.",
619
640
  'Başlangıçta gizli bir bildirim: şemaya props.isHidden:true yaz, açılışı akıştaki setter ile yap; timeout verilirse kendini kapatır.'
620
641
  ],
@@ -676,6 +697,7 @@ export const componentKnowledge = {
676
697
  ],
677
698
  propNotes: {
678
699
  surfaceStyle: NODE_SURFACE_NOTE,
700
+ navigationStyle: NAVIGATION_STYLE_NOTE,
679
701
  activeHref: "Vurgulanacak menü satırının adresi; boşken adres çubuğu karar verir (sidebar ile aynı davranış). YENİ prop — platform kataloğuna CI senkronuyla iner.",
680
702
  layout: "'flex' (katalog varsayılanı; akış) | 'grid' (12 kolonluk ızgara). Prop hiç yazılmamışsa renderer IZGARA çizer. Diğer altı yerleşim prop'u yalnız 'flex' iken etkilidir; anlamları container kaydındakiyle birebir aynı."
681
703
  }
@@ -686,14 +708,15 @@ export const componentKnowledge = {
686
708
  'Ağacı layout ve sidebar ile ORTAK renderer çizer (Navigations/NavigationsItem) — üçünün menü davranışı birebir aynıdır; ayrıntı sidebar kaydında.',
687
709
  "Öğe bazlı isHidden BU şemada VARDIR: canlıda elenir, Studio'nun düzenleyici kipinde görünmeye devam eder (Navigations.svelte: {#if isEditorMode || item.isHidden !== true}).",
688
710
  "activeHref boşken menü tarayıcıdaki adrese uyan satırı kendi bulur; adres mount'ta BİR KEZ okunur (bağlantılar tam sayfa yükler).",
689
- "style PROP'U ÖLÜDÜR: şema &__item ve &__item--active parçalarını sunuyor ama Navigations.svelte style diye bir prop KABUL ETMİYOR (yalnız navigations ve activeHref alır) ve satırları NavigationsItem kendi scoped .nav-btn sınıfıyla çizer. Panelden yazılan hiçbir şey uygulanmaz — sidebar'daki aynı kusurun ikizi (zeyrek-frontend docs/issues.md CQ-143 / CQ-132).",
711
+ "Satır görünümü TİPLİ navigationStyle grubuyla verilir (2026-09-15, layout ile aynı grup); serbest style'ın &__item, &__item--active ve &__icon parçaları da artık gerçek elemanlara basılır ve gruptan SONRA gelir (son söz).",
690
712
  'Menü olay YAYMAZ (şemada yalnız mount); gezinme ham <a href> ile tam sayfa yükleyerek olur.'
691
713
  ],
692
714
  propNotes: {
693
715
  navigations: "Ağaç: { title, href, icon, isHidden, isExpandable, isExpanded, children }. href düz metin ya da bağlantı seçicisinin nesnesi ({ type:'page', data, ref }) olabilir; ikisini de getHref çözer.",
694
716
  activeHref: 'Vurgulanacak satırın adresi; boş bırakılırsa tarayıcıdaki adres karar verir.',
695
717
  isHidden: 'Komponentin tamamını gizler (ortak katman prop’u); öğe bazlı gizleme navigations[].isHidden’dır.',
696
- style: 'ÖLÜ — hiçbir etkisi yok (bkz. davranış). Menü biçimini değiştirmek bugün mümkün değil.'
718
+ navigationStyle: NAVIGATION_STYLE_NOTE,
719
+ style: "Kaçış kanalı: &__item (her satır), &__item--active (seçili satır), &__icon (satır ikonu). Önce navigationStyle'ı kullan; burada yalnız grubun karşılamadığı CSS yazılır."
697
720
  }
698
721
  },
699
722
  'layout-shell': {
@@ -859,6 +882,7 @@ export const componentKnowledge = {
859
882
  categoryField: 'Kategori ekseni alan adı (varsayılan "label").',
860
883
  series: "[{ valueField, type?, axis?, color?, stack?, lowField/highField?, targetField? }] — yFields'ın yerini aldı.",
861
884
  stackMode: 'none | stacked | percent.',
885
+ dataLabels: "{ show, position, content, showTotal }. showTotal YALNIZ stackMode:'stacked' iken iş görür: her yığının tepesine (yatayda sağına) dilimlerin toplamını yazar, valueFormat uygulanır; toplam EKSENE ve LEGEND'e GİRMEZ. 2026-09-15 düzeltmesi — öncesinde toplam şeffaf bir seri olarak yığına ekleniyordu: değer ekseni gerçek en yüksek yığının İKİ KATINA çıkıyor, toplam etiketi barın çok üstünde boşlukta duruyor ve legend'de '<grup>__total' diye dördüncü bir madde beliriyordu (S-18). percent modunda etkisizdir.",
862
886
  isDrillDown: 'Veri noktası tıklamasını kırıntı seviyesine çevirir; sorguyu akış yeniler.'
863
887
  }
864
888
  },
@@ -1163,13 +1187,14 @@ export const componentKnowledge = {
1163
1187
  "Sürükleyerek taşıma yalnız isEditable ile: ay görünümünde gün kayar (saat korunur), hafta/gün kolonunda saat 30 dakikaya yuvarlanır; tüm-gün etkinlik saat KAZANMAZ. Yeniden boyutlandırma (resize) yoktur.",
1164
1188
  "Süresi >=24 saat ya da 00:00→00:00 olan etkinlik 'tüm gün' sayılır ve saat ızgarası yerine üst şeride çizilir; çok günlü etkinlik ay görünümünde kapladığı HER güne ayrı çip düşer (sürekli bant yok).",
1165
1189
  "defaultDate ve defaultView yalnız İLK kurulumda okunur — sonradan prop değişse de takvim kımıldamaz.",
1166
- "Hafta başlangıcı yerele bağlıdır (tr Pazartesi, en Pazar); startHour/endHour saat penceresini belirler, pencereye kısmen taşan blok en az 15 dakikalık yükseklikle çizilir."
1190
+ "Hafta başlangıcı yerele bağlıdır (tr Pazartesi, en Pazar); startHour/endHour saat penceresini belirler, pencereye kısmen taşan blok en az 15 dakikalık yükseklikle çizilir.",
1191
+ "Etkinlik her görünümde <elementId>__event-<id> data-element-id'si taşır; bırakma hedefleri ay hücresi ve hafta/gün kolonu <elementId>__day-<yyyy-MM-dd>, tüm gün hücresi __allday-<yyyy-MM-dd>, saat dilimi __slot-<yyyy-MM-dd>T<HH> (YEREL tarih). eventClick 'click' ile, eventMove page_screenshot actions 'drag' (target etkinlik, to gün/slot) ile doğrulanır; slota bırakma o saatin ortasına düşer ve 30 dakikaya yuvarlanır. Çok günlü etkinlik aynı kimliği her gününde taşır, hedef ilk eşleşmedir."
1167
1192
  ],
1168
1193
  propNotes: {
1169
1194
  rows: 'Etkinlik satırları; mount/monthChange akışlarının setter hedefi. Alan adları titleField/startField/endField/colorField/idField ile çözülür (nokta ayraçlı iç içe yol çalışır).',
1170
1195
  colorField: "Geçerli CSS rengi olduğu gibi kullanılır, semantik durum adı tema değişkenine çözülür, tanınmayan değer accent'e düşer. 'info' beyaz temada görünmezdir — ham renk ver.",
1171
1196
  maxVisibleEvents: 'Ay hücresinde görünen çip sayısı (varsayılan 3); fazlası +n olur.',
1172
- defaultDate: "Açılış ayı (yyyy-MM-dd; katalog varsayılanı örnek veriyle aynı ay olan '2026-08-01'). YALNIZ ilk kurulumda okunur.",
1197
+ defaultDate: "Açılış ayı (yyyy-MM-dd ya da ISO tarih-saat; katalog varsayılanı örnek veriyle aynı ay olan '2026-08-01'). YALNIZ ilk kurulumda okunur. BOŞ bırakılırsa bugünün ayı açılır — 'bugün' için sabit tarih yazmayın. İfadeyle bağlanacaksa code prop'u '{{ }}' içinde yazılır: { type: 'code', ref: \"{{ new Date().toISOString().slice(0, 10) }}\" } — parantezsiz ifade metin olarak gelir (PAGE-032 reddeder). Bu iki biçim dışındaki her metin bugüne düşer.",
1173
1198
  startHour: 'Hafta/gün görünümünün ilk saati (varsayılan 8); endHour en az startHour+1 olacak biçimde kırpılır (varsayılan 18).'
1174
1199
  }
1175
1200
  },
@@ -1198,7 +1223,8 @@ export const componentKnowledge = {
1198
1223
  "Kolon içi SIRALAMA yoktur: kartlar rows dizisinin sırasıyla çizilir, aynı kolona bırakma no-op'tur, sıra ne taşınır ne yayılır.",
1199
1224
  "wipLimit yalnız GÖRSELDİR: aşımda kolon başlığı kırmızılaşır ama bırakma engellenmez; 0/boş = sınırsız.",
1200
1225
  "Kart şablonu sabittir: başlığın ilk harfi (TR büyük harf) rozet + başlık + alt başlık — resim avatarı, etiket, tarih alanı yoktur. Renk karta sol şerit, kolona üst şerit olarak iner (ham CSS ya da semantik ad).",
1201
- "Sürükleme yerel HTML5 DnD'dir; klavyeyle taşıma yolu yoktur (Enter yalnız cardClick yayar). isLoading sürüklemeyi de kilitler."
1226
+ "Sürükleme yerel HTML5 DnD'dir; klavyeyle taşıma yolu yoktur (Enter yalnız cardClick yayar). isLoading sürüklemeyi de kilitler.",
1227
+ "Kart <elementId>__card-<id>, kolon <elementId>__col-<value> data-element-id'si taşır (id = idField değeri, yoksa card-<sıra>): cardClick page_screenshot actions 'click' ile, cardMove 'drag' (target kart, to kolon) ile uçtan uca doğrulanır — actionsReport flowRuns/requests taşımanın akışı gerçekten koşturduğunu gösterir."
1202
1228
  ],
1203
1229
  propNotes: {
1204
1230
  rows: 'Kart satırları; alan adları columnField/titleField/subtitleField/idField/colorField ile çözülür (nokta ayraçlı iç içe yol çalışır).',
@@ -1326,6 +1352,24 @@ export const INTERNAL_ROLES_BY_TYPE = {
1326
1352
  'colmenu',
1327
1353
  'search (arama kutusu, isSearchable)',
1328
1354
  'row-<0 tabanlı sıra; sayfa değişince yeniden numaralanır>'
1355
+ ],
1356
+ kanban: [
1357
+ "card-<kart id'si (idField; yoksa card-<sıra>)>",
1358
+ "col-<kolon value'su> (bırakma hedefi)"
1359
+ ],
1360
+ eventcalendar: [
1361
+ "event-<etkinlik id'si (idField; yoksa event-<sıra>)>",
1362
+ 'day-<yyyy-MM-dd> (ay hücresi / hafta-gün kolonu, bırakma hedefi)',
1363
+ 'allday-<yyyy-MM-dd> (tüm gün hücresi, bırakma hedefi)',
1364
+ 'slot-<yyyy-MM-dd>T<HH> (saat dilimi, bırakma hedefi)'
1365
+ ],
1366
+ daterangepicker: [
1367
+ 'start (başlangıç tarihi kutusu, valueFrom)',
1368
+ 'end (bitiş tarihi kutusu, valueTo)'
1369
+ ],
1370
+ datetimerangepicker: [
1371
+ 'start (başlangıç tarihi kutusu, valueFrom)',
1372
+ 'end (bitiş tarihi kutusu, valueTo)'
1329
1373
  ]
1330
1374
  };
1331
1375
  /** Hedefteki `__` ayracından sonrası bir iç roldür; gateway bulunamayan hedefte listeyi basar. */