@appaflytech/zeyrek-ai-mcp 0.0.27 → 0.0.28

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.
@@ -326,6 +326,7 @@ export const componentKnowledge = {
326
326
  "BAŞLIK BANDI title YA DA description doluyken çizilir (2026-09-18): description başlığın altındaki ikinci satırdır (ikincil metin rengi, küçük punto) ve yalnız açıklama yazmak da bandı açar. İki alan da KIRPILIR: yalnız boşluktan ibaret bir başlık/açıklama doldurulmamış sayılır ve bant açılmaz. states.isWrapper:true iken ikisi de çizilmez.",
327
327
  "KANVASTA BIRAKMA ALANI HİÇBİR DURUM PROP'UYLA ÖLMEZ (2026-09-18): isLoading gövdeyi 100px'e kırpar ve slot'u pointer-events:none yapar ama yalnız çalışma anında/önizlemede — editörde (_editorMode) sadece yükleyici çizilir, tasarımcı kabın içine bileşen bırakmaya devam eder. Yükleyici akış DIŞINDA, konumlandırılmış bir kaplamadır ve tıklamayı geçirir: akış içinde çizildiğinde bırakma alanını görünür kutunun altına itiyordu. Kanvas toolbar'ında iki düğme vardır (Loading, Is hidden); yerleşim kontrollerini kanvasın kendi kap toolbar'ı çizer.",
328
328
  "page_container'ın isLoading prop'u sayfa açılış akışının yükleniyor bayrağıdır.",
329
+ "GÖVDE TAŞMASI yüksekliğe bağlıdır (2026-09-29): appearance.heightType:'auto' olan (ve isScrollable olmayan) kabın gövdesi KAYDIRMA KABI DEĞİLDİR — overflow-y:visible + overflow-x:clip. İçerik kadar boylanan kap zaten kaymaz; eskiden 1px'lik yuvarlama ya da taşan bir glif gövdede kaydırma okları çiziyordu (Rexora dashboard: profit_summary 45/46). fixed/fill/yazılmamış yükseklikte gövde eskisi gibi overflow-y:auto'dur — dolduran bir kök (yerleşim kabuğu) sayfayı bu gövdede kaydırır ve isSticky başlık ona yapışır. surfaceStyle.contentOverflow seçimi her iki durumda da KAZANIR.",
329
330
  "layout:'flex' çocukları akışa alır (RenderComponent düzeni .ng-app__node-children sarmalına yazar): sıra blocks[].position'dan gelir (önce y, sonra x) ama y BOŞLUKLARI yok sayılır — flex'te dikey konum yalnız sıradır, ızgara koordinatı değil.",
330
331
  "Flex çocuğun GENİŞLİĞİ appearance.widthType'tan gelir (2026-09-01): 'fill' kabın tüm genişliği (satırda flex:1 1 100%), 'fixed' + widthString sabit CSS ölçüsü ('240px'/'50%'/calc), 'auto' içerik kadar. widthType HİÇ yazılmamışsa eski 12 kolonluk blocks[].size.w payı geçerlidir (row'da flex-basis w/12, column'da width w/12) — ızgara↔flex geçişi bu fallback sayesinde kayıpsızdır. Şemayı sen kuruyorsan widthType'ı AÇIKÇA yaz; string yalnız 'fixed' modda okunur (PAGE-017/018 uyarıları).",
331
332
  "Flex kapsayıcının yüksekliği içeriğinden gelir; verticalAlign'ın dağıtacak boşluğu olması için appearance.heightType:'fixed' vermek gerekir — ölçü heightString'den (serbest CSS uzunluğu, ör. '30vh'), o yoksa size.h×10px'ten. heightString yalnız heightType:'fixed' iken okunur. İstisna: states.isWrapper:true olan page_container zaten min-height:80vh ile sayfa boyu durur, onda dikey hizalama boşluksuz da çalışır.",
@@ -806,6 +807,8 @@ export const componentKnowledge = {
806
807
  "click YALNIZ type:'button' iken yayılır. type:'submit' click YAYMAZ, formu gönderir: akışı butona değil formun submit olayına bağla (form doğrulaması geçerse yayılır). type:'link' de click yaymaz, tarayıcı href'e gider.",
807
808
  "type:'submit' buton bir Form'un İÇİNDEYSE formId gerekmez, tarayıcı en yakın forma bağlar; formun DIŞINDAYSA formId = formun elementId'si ya da adı. isDisabled/isLoading açıkken gönderim de kilitlidir.",
808
809
  "href ve isNewTabLink YALNIZ type:'link' iken okunur — href doldurmak butonu link yapmaz. İç sayfaya link için href'e URL değil { type:'page', ref:<pageId> } Prop'u yaz. Link kilitliyken (isDisabled/isLoading) ya da href boşken hiçbir yere gitmez ve odak almaz; kilit kalkınca ya da href akışla değişince adres anında güncellenir (2026-09-11 öncesi ilk çizimdeki adreste donuyordu: kilitli açılan link hep ölü kalıyordu).",
810
+ "YATAY DOLGU ikon + metinde MÜREKKEBE göre dengelenir (2026-09-29): Material glifinin ~0.2em yan boşluğu yüzünden eşit kutu dolgusunda ikon tarafı 3px geniş görünüyordu ('Save Order': glif 16px, metin 13px). Bileşen ikon tarafını o kadar daraltır (ikon sağdaysa sağı). Dolguyu büyütmek/küçültmek için style.padding YAZMA — !important ile dengeyi ezer; style: { '--ng-btn-pad-x': '18px' } yaz, iki taraf ondan türetilir. Pill (radius-pill) düğmede 16-18px, lg'nin 12px tabanı dar görünür.",
811
+ "METİN RENGİ zeminin ölçülen parlaklığından seçilir (2026-09-29, shared/utils getContrastTextColor): açık zemine koyu, koyu zemine açık metin; temanın onPrimary'si (--ng-text-on-accent) o polaritedeyse o kullanılır, değilse #000000/#ffffff. Tema metin token'ı (--ng-text-primary) YEDEK DEĞİLDİR: koyu modda açığa döner ve açık accent'li butonda (Rexora #B8F06C) metni okunmaz yapıyordu. Tema modu değişince (theme-toggle) renk yeniden hesaplanır; aynı kural icon çipinde ve tablo etiketlerinde de geçerlidir.",
809
812
  "Kayıtlı sayfalardaki eski kind:'custom' + customColor ikilisi VERİ GÖÇÜ OLMADAN aynen çizilir (render-anı takma adı, text emsali): surfaceStyle.background boşsa eski renk `--ng-btn-custom-color` değişkeniyle solid/outline/text varyantına eskisi gibi iner; Background doldurulunca takma ad susar. page_runtime_get(resolveStyles:true) bu değişkeni resolvedStyle'da gösterir. DİKKAT: platformun doğrulama duvarı sayfanın TAMAMINI okur — böyle bir düğüm taşıyan sayfaya yapılan her page_schema_patch, dokunulmayan düğüm yüzünden invalid-enum-value/unknown-prop ile reddedilir (ARC-036). Sayfayı yeniden yazmadan önce o butonu kind: semantik değer + surfaceStyle.background'a çevir (aynı çağrıda replace_prop ile).",
810
813
  "İpucu (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition: top · bottom · left · right) her komponentte ipucu çizer. Tıklamadan önce onay istemek de butonun değil akışın işidir: click akışının başına confirm adımı koy (yalnız web — mobil barındırıcıda confirm adımı yok)."
811
814
  ],
@@ -1214,7 +1217,7 @@ export const componentKnowledge = {
1214
1217
  "sidebar düzeninde MARKA ve KULLANICI bileşenin içindedir (2026-09-25): başlık bandı logo/ikon + title + subTitle çizer (logo kutusu uygulamanın ana sayfasına giden bir bağlantıdır — kırıntı yolunun ev halkasıyla aynı hedef), collapsible açıksa daraltma düğmesi bandın SAĞINDADIR (şeritte alt kısma iner). Alt kısım userName/userEmail doluysa kullanıcı düğmesidir (avatar ya da baş harfler, ad, e-posta); tıklanınca yukarı doğru bir panel açılır: ad, e-posta, userPosition, userRole ve 'Çıkış yap'. Panel Escape ve dış tıklamayla kapanır (dismiss-chain). Daraltınca marka, arama ve kullanıcı birlikte şeride iner.",
1215
1218
  "Daraltma durumu tarayıcıda (localStorage, 'ng-nav-collapsed:<elementId>') saklanır ve SONRAKİ SAYFADA okunur — menü linkleri tam sayfa yüklediği için bellekteki durum her tıklamada kayboluyordu. Tuvalde okunmaz.",
1216
1219
  "Menü içi arama bir ALAN gibi çizilir (kenarlık + açık zemin + '/' ipucu); sayfada yazı alanı dışındayken '/' aramaya odaklanır (kısayolun sayfada tek sahibi vardır). command düzeninin tetikleyicisi de alan görünümündedir ve Ctrl K / ⌘ K ipucu taşır; iki yerde de yer tutucu searchPlaceholder'dır.",
1217
- "KAPSAYICIDIR (isDroppable, 2026-09-24): layout gibi içine komponent bırakılır ve bırakılan çocuklar menünün YANINDA/ALTINDA kendi içerik alanında çizilir, menü satırlarının arasında değil. Akış yönünü düzen belirler (navigation-content.ts): sidebar/hybrid/dual menü solda içerik sağda — sidebarSide right ise ters; toc tocPosition ile; header/tabs/breadcrumb içerik altta; footer/bottom ve dock bottom içerik üstte (dock top altta); drawer/command/launcher akışta yer kaplamaz, içerik alanı tek başına kalır. İçerik alanı navigations dizisi BOŞKEN de durur — son menü öğesi silinince bırakılan bileşenler kaybolmaz. İçine hiçbir şey bırakılmamışsa alan akıştan çıkar (menünün yanına boşluk düşmez); kenara yapışık panelde (sidebar/hybrid/dual, floating değil) menü ile içerik arasında boşluk YOKTUR, panelin kenarlığı ayırır. Bırakılan içerik alanın boyunu doldurur (fill zinciri) — yan menü + içerik sütunu kabuğu tek navigations ile kurulabilir. Kanvasta çocukların çizilmesi için kayıtlı düğümde states.isDroppable true olmalı.",
1220
+ "KAPSAYICIDIR (isDroppable, 2026-09-24): layout gibi içine komponent bırakılır ve bırakılan çocuklar menünün YANINDA/ALTINDA kendi içerik alanında çizilir, menü satırlarının arasında değil. Akış yönünü düzen belirler (navigation-content.ts): sidebar/hybrid/dual menü solda içerik sağda — sidebarSide right ise ters; toc tocPosition ile; header/tabs/breadcrumb içerik altta; footer/bottom ve dock bottom içerik üstte (dock top altta); drawer/command/launcher akışta yer kaplamaz, içerik alanı tek başına kalır. İçerik alanı navigations dizisi BOŞKEN de durur — son menü öğesi silinince bırakılan bileşenler kaybolmaz. İçine hiçbir şey bırakılmamışsa alan akıştan çıkar (menünün yanına boşluk düşmez); kenara yapışık panelde (sidebar/hybrid/dual, floating değil) menü ile içerik arasında boşluk YOKTUR, panelin kenarlığı ayırır. Bırakılan içerik alanın boyunu doldurur (fill zinciri) — yan menü + içerik sütunu kabuğu tek navigations ile kurulabilir. Kanvasta çocukların çizilmesi için kayıtlı düğümde states.isDroppable true olmalı. Kanvasın boş bırakma alanı (80px taban) da YALNIZ isDroppable true iken açılır (2026-09-29): bırakılamayan menü eskiden kanvasta altına boş bir kutu ekliyordu (header hapı kanvasta 136px, runtime'da 56px).",
1218
1221
  "İÇERİK ALANININ YERLEŞİMİ container ailesiyle AYNI yedi prop'tur (2026-09-29): layout ('flex' | 'grid', katalog varsayılanı 'flex') + direction/horizontalAlign/verticalAlign/size/gap/wrap, anlamları ve varsayılanları container kaydındakiyle birebir. Bunlar menüyü DEĞİL, menünün yanına bırakılan çocukları dizer (RenderComponent içerik alanındaki .ng-app__node-children sarmalına yazar). Menünün kendi biçimi navLayout, satır yoğunluğu density'dir. layout prop'u 'flex'/'grid' dışında bir değer taşıyan (ya da hiç taşımayan) düğümün içerik alanı 12 kolon IZGARA çizilir.",
1219
1222
  "YENİDEN ADLANDIRMA (2026-09-29, ADR 0007): menü düzeni layout → navLayout, satır yoğunluğu size → density. Kayıtlı eski düğümler göç görmedi: navLayout yoksa bileşen eski layout değerini (sidebar/header/… ise) düzen sayar, density yoksa eski size'ı (sm/md/lg ise) — ekranda değişiklik olmaz. AMA backend doğrulayıcısı eski değerli düğüme DOKUNAN patch'i invalid-enum-value ile reddeder (layout artık flex|grid, size shrink|grow): böyle bir düğümü düzenlerken aynı patch'te navLayout'a eski layout değerini, density'ye eski size değerini yaz ve layout'u 'grid' (eski görünüm) ya da 'flex', size'ı 'shrink' yap.",
1220
1223
  "sidebar ve layout bileşenleri bu ağacı GÖMÜLÜ kipte mount eder (embedded): panel kromunu — genişlik, kenarlık, zemin, logo, kullanıcı alanı — o kabuklar çizer, navigations ikinci kez çizmez.",
@@ -1599,7 +1602,7 @@ export const componentKnowledge = {
1599
1602
  subtitle: 'Başlığın altına yazılır. Başlık boş bırakılsa da çizilir (2026-09-16 öncesinde title boşken subtitle kayboluyordu).',
1600
1603
  chartType: "bar | line | area | pie | donut | waterfall | histogram | pareto | bullet | tornado | radial | funnel | gauge | radar | funnelflow | scatter. SEÇİLEN TİP hangi ayarların OKUNDUĞUNU belirler; panel de ona göre gizler.",
1601
1604
  sizeField: 'YALNIZ scatter: nokta çapını ölçekleyen sayısal kolon (kabarcık grafiği). Boş bırakılırsa bütün noktalar aynı boyda çizilir.',
1602
- barStyle: '{ barWidth, maxBarWidth, barGap, categoryGap, borderRadius, minBarSize } — YALNIZ bar ve tornado okur. minBarSize çok küçük değerlerin görünmez kalmasını engeller (ECharts barMinHeight); 2026-09-16 öncesinde şemada duruyor ama hiçbir yerde okunmuyordu.',
1605
+ barStyle: '{ barWidth, maxBarWidth, barGap, categoryGap, borderRadius, minBarSize } — YALNIZ bar ve tornado okur. minBarSize çok küçük değerlerin görünmez kalmasını engeller (ECharts barMinHeight); 2026-09-16 öncesinde şemada duruyor ama hiçbir yerde okunmuyordu. borderRadius yığılmış modda (stackMode stacked/percent) YALNIZ yığının dış ucuna iner (2026-09-29): son bar serisi [r,r,0,0] (yatayda [0,r,r,0]), alttaki dilimler köşesiz — eskiden her dilimin dört köşesi yuvarlanıyor ve yığın ayrık çubuklar gibi görünüyordu.',
1603
1606
  categoryAxis: '{ title, isReversed, labelRotate, gridLines }. Kategori ekseni HER ZAMAN kategori eksenidir; bir zaman ekseni anahtarı vardı, çizilemeyen bir option ürettiği için 2026-09-16’da kaldırıldı. scatter’da bu prop x (değer) eksenini ayarlar.',
1604
1607
  colorRules: '[{ operator, value, valueTo, color }] — ilk eşleşen kural kazanır. radial/funnel/radar/funnelflow dışındaki her tipte uygulanır.'
1605
1608
  }
@@ -1304,6 +1304,20 @@ bağlamında `page_runtime_get` → `theme.presets`; `componentStyles[type]` ref
1304
1304
  Preset'in kendisini yazmak/silmek `theme_update` işidir — `platform_guide('theme')`. Bir alanı temaya bırakmak = o alanı hiç yazmamak;
1305
1305
  studio'da bunun adı "Temaya dön"dür. Tema değerini gruba kopyalama — bağ kopar, tema değişince izlemez.
1306
1306
 
1307
+ **Yatay denge MÜREKKEPLE ölçülür, kutuyla değil (2026-09-29).** "Soldan sağdan eşit" bir
1308
+ düğme/çip/hap için iki kenardaki boşluk, elemanların kutusundan değil GÖRÜNEN çizgiden ölçülür:
1309
+ Material glifinin kendi yan boşluğu (~0.2em) vardır ve kutular eşitken ikon tarafı 3px daha
1310
+ geniş görünür. Rexora'da "Export Report" ve "Save Order" kutu ölçüsüyle 12/12 "eşit" raporlandı,
1311
+ kullanıcı iki kez "yazı sağa yapışmış" dedi. Kurallar:
1312
+ - `button` ikon + metinde dengeyi KENDİSİ kurar (ikon tarafını ~0.2em daraltır). Dolguyu
1313
+ değiştirmek için `style.padding` YAZMA — `!important` ile bu dengeyi ezer; `style:
1314
+ { '--ng-btn-pad-x': '18px' }` yaz, iki taraf ondan türetilir.
1315
+ - Yuvarlak (pill) düğmede yatay dolgu yüksekliğin ~%35-40'ı olmalı; 44px'lik hapta 12px dar
1316
+ görünür (16-18px).
1317
+ - Kendi kurduğun çipte (container/html) ikon tarafını glif yan boşluğu kadar dar tut ya da
1318
+ simetrik bir öğeyle (avatar, nokta) başla. Doğrulama: `page_screenshot` + ölçü betiğinde
1319
+ glifin `measureText().actualBoundingBox*` değerleriyle mürekkep kenarı.
1320
+
1307
1321
  **Efektif stili okumak:** `page_runtime_get(resolveStyles: true)` her düğüme `resolvedStyle`
1308
1322
  (kaskad çözülmüş birleşik stil) ve `styleLayers` (`{ typedGroups, componentStyle, preset, own }`)
1309
1323
  ekler. "Bu kutu neden böyle görünüyor / benim yazdığım stil neden görünmüyor" sorusunun cevabı
@@ -1515,6 +1529,25 @@ Tercih kuralı: *"bu değer başka bir değerden TÜRETİLİYORSA"* `set_binding
1515
1529
  *"bir OLAY sonucunda bir kez yazılacaksa"* (uçtan veri çekme gibi) flow + setter kullan.
1516
1530
  İkisini aynı prop'ta karıştırma — setter'ın yazdığı değeri canlı bağ bir sonraki tetikte ezer.
1517
1531
 
1532
+ **Designer'da da görünsün: varsayılan değer kur (2026-09-29).** Studio kanvası akış
1533
+ koşturmaz; `type:'code'` prop'larını tasarım anında `state.page.*` / `state.app.*`
1534
+ değişkenlerinin **varsayılan değerleriyle** çözer (Rexora dashboard: KPI'lar, grafikler ve
1535
+ metinler önce `{{ state.page… }}` ham metni olarak görünüyordu). Kural: tasarımcıya boş kutu
1536
+ bırakma, kanvasta da view'daki içeriğin aynısı görünsün.
1537
+ - Veriyi akışla (microservice → setter) yüklesen bile, bağlanan şeklin **gerçekçi bir
1538
+ örneğini** `variable_create` ile sayfa değişkeni olarak kur ve prop'u ona bağla — view'da akış
1539
+ değeri ezer, kanvasta örnek görünür.
1540
+ - Kanvasta çözülmeyen ifadeler: `item.*` (repeater satırı), `Functions.*`, komponent adları ve
1541
+ `Steps.*`. Bunları taşıyan prop'a `data` alanında tasarım değeri ver (metin olmayan prop'larda
1542
+ kanvas `data`'yı çizer); metin prop'u çözülmeyen ifadeyi ipucu olarak gösterir, bu yüzden
1543
+ metni mümkünse `state.page` üzerinden besle (`{{ state.page.summary.totalText }}`).
1544
+ - `repeater`'ın `rows`'u statik ya da `state.page`'e bağlı olsun; kanvas tek satırı şablon
1545
+ olarak çizer.
1546
+ - Yer tutucu boşluk için BOŞ `container` kurma, `spacer` kullan. Boş kap kanvasta bırakma
1547
+ alanı olarak ~130px yükseklik alır ve bulunduğu satırı şişirir (Rexora New Order: tablo
1548
+ başlık satırı designer'da 148px, view'da 38px). Satırda yatay boşluk: `spacer` +
1549
+ `mode:'fixed'` + `size: 0` + `appearance.widthType:'fixed'` / `widthString:'32px'`.
1550
+
1518
1551
  **`stateBindings[]` (şema düğümündeki dizi)** Studio'nun state-bağımlılık özelliğidir:
1519
1552
  `[{ name, expression, targets: [{ elementId, elementProperty }] }]` — bir ifade değişince
1520
1553
  listedeki hedef prop'lara yazılır. Micro-op sözlüğünde karşılığı YOKTUR; yalnız
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appaflytech/zeyrek-ai-mcp",
3
- "version": "0.0.27",
3
+ "version": "0.0.28",
4
4
  "type": "module",
5
5
  "description": "Zeyrek (NgApps) platform APIs as MCP tools — data, logic and Studio design surface in one gateway",
6
6
  "license": "UNLICENSED",