@appaflytech/zeyrek-ai-mcp 0.0.26 → 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.",
|
|
@@ -358,15 +359,18 @@ export const componentKnowledge = {
|
|
|
358
359
|
"SEÇİM İKİ YOLDAN YAZILIR, ikisi de self.selectedIndex'e: (1) satırın HERHANGİ bir yerine tıklama — her tıklamada `select`, satır değiştiyse önce `change`; (2) satırdaki bir çocuğun yaydığı olay (buton click, girdi change/focus…) — satır değiştiyse `change`. Yalnız text/image taşıyan kart da tıklamayla seçilir (2026-09-15'ten önce ancak olay yayan bir çocukla seçilebiliyordu). İSTİSNA: tıklamayı kendisi yutan etkileşimli çocuklar (dropdown-button, collapsible-container, tag-input, tarih seçici, dosya girdileri, tree-view, table) satıra ulaştırmaz — orada select gelmez, seçim yalnız o çocuk olay yayarsa change ile yazılır. Etikete tıklamak (switch/checkbox/radio) tek tıklama sayılır. Satırdaki butona tıklanınca akışların BAŞLAMA sırası: repeater `change` → butonun click akışı → repeater `select` (akışlar asenkron, bitiş sırası garanti değil); butonun akışında <repeater>.selectedIndex zaten o satırdır. Butonun akışı satırı SİLER ya da selectedIndex'e null yazarsa, ardından gelen select eski sırayla yayılır ve selectedIndex'i yeniden yazar — silme/temizleme akışını butona bağla, repeater'ın select'ine iş bağlama.",
|
|
359
360
|
"SEÇİLİ SATIRIN VERİSİ `selectedItem`'dır (şema prop'u DEĞİL, runtime türetir): `{{ <repeater>.selectedItem.<alan> }}` ve akışta self.selectedItem. selectedIndex yazılmamışken İLK SATIRI (rows[0]) döndürür — 'henüz seçim yok' ile 'ilk satır seçili'yi ayırmak için selectedIndex'e bak (sayı değilse seçim yok). rows yenilenince selectedIndex SIFIRLANMAZ; eski sıra yeni listede başka satırı gösterebilir, gerekiyorsa sorgu akışında selectedIndex'i null yaz.",
|
|
360
361
|
"rows dizi DEĞİLSE (henüz koşmamış sorgu, null yazan akış) liste boş çizilir, sayfa düşmez; aynı _id/id'yi taşıyan satırlar da çizilir AMA çocuk girdilerin satır başına değerleri o kimliğe göre tutulduğu için bu satırlar yazılan değeri PAYLAŞIR — girdi taşıyan kartlarda id'ler benzersiz olmalı. Boş liste için ayrı bir emptystate bileşeni koy ve isHidden'ını `{{ (<repeater>.rows || []).length > 0 }}` yap — repeater'ın kendi boş durum metni yok.",
|
|
361
|
-
"Izgara: columnCount kolon (en az 1), kartlar arası dikey boşluk verticalSpacing (px, yazılmazsa 20), yatay boşluk horizontalSpacing (px, yazılmazsa 0). autoRowSize:false iken bütün satırlar EN UZUN kart kadar yüksek (1fr); true iken her satır kendi içeriği kadar. Boş/null boşluk varsayılana düşer."
|
|
362
|
+
"Izgara: columnCount kolon (en az 1; katalog varsayılanı 5, yazılmamış eski düğüm 1), kartlar arası dikey boşluk verticalSpacing (px; katalog varsayılanı 12, yazılmazsa 20), yatay boşluk horizontalSpacing (px; katalog varsayılanı 12, yazılmazsa 0). autoRowSize:false iken bütün satırlar EN UZUN kart kadar yüksek (1fr); true iken her satır kendi içeriği kadar. Boş/null boşluk varsayılana düşer.",
|
|
363
|
+
"KARTIN İÇİ container ailesiyle AYNI yedi yerleşim prop'uyla dizilir (2026-09-29): layout ('flex' | 'grid', katalog varsayılanı 'flex') + direction/horizontalAlign/verticalAlign/size/gap/wrap — anlamları container kaydındakiyle birebir; TEK FARK direction varsayılanının 'column' olması (kart dikey yığındır). Satır (row) akışında heightType:'fill' yalnız align-self:stretch'tir ve wrap açıkken kısa kart hücreyi doldurmaz — eşit boylu kartlar için column kullan. Her satırın kartı ayrı bir .ng-app__node-children sarmalıdır ve bu düzeni giyer; çocuklar blocks[].position sırasıyla (önce y, sonra x) akar ve flex çocuk sözleşmesini (appearance.widthType/heightType, spacer mode) alır. Kartların KENDİ dizilişi (kaç kolon, aralarındaki boşluk) hâlâ columnCount/verticalSpacing/horizontalSpacing'tir. layout prop'u hiç yazılmamış eski repeater'ın kartı 12 kolon ızgara kalır.",
|
|
364
|
+
"Studio'ya bırakılan YENİ repeater dolu doğar: 10 görselli örnek satır (id, image, title, category, price, description; satırda 5 kart, iki tam sıra) ve tek bir kart şablonu — tema yüzeyli bir container (layout flex, direction column, gap small; appearance widthType/heightType 'fill') içinde image (240px kapak), kategori, başlık (1 satır), açıklama (2 satır), esnek spacer (mode 'flex' — fiyatı ve butonu kartın tabanına iter), fiyat ('{{ item.price }} ₺') ve buton (kind 'info'). Şemayı sen kuruyorsan bu şablon GELMEZ: kartı children olarak yaz; kartın içindeki her parçaya appearance.widthType:'fill' ver — sütun akışında genişliği yazılmamış çocuk 12 kolon payına düşer ve o pay sütunda yükseklik anlamına gelir."
|
|
362
365
|
],
|
|
363
366
|
propNotes: {
|
|
364
367
|
surfaceStyle: NODE_SURFACE_NOTE,
|
|
365
368
|
rows: "Yinelenen veri; çocuk komponent ifadelerinde satıra item / Row ile, satırın sırasına RowIndex ile (0'dan başlar) erişilir. Satırlara kalıcı bir id ya da _id ver: girilen değerler ve kart örnekleri ona göre eşlenir.",
|
|
366
369
|
columns: "YALNIZ Studio'daki Rows düzenleyicisinin alanlarını tanımlar; runtime OKUMAZ. Kartta ne görüneceğini repeater'ın children'ı ve onların `{{ item.<alan> }}` ifadeleri belirler — columns yazmak kartı değiştirmez.",
|
|
367
|
-
columnCount: 'Bir satırdaki kart sayısı (tam sayı, en az 1; 0/boş 1 sayılır).',
|
|
368
|
-
verticalSpacing: 'Kart satırları arası boşluk, px. Yazılmazsa 20 (
|
|
369
|
-
horizontalSpacing: 'Yan yana kartlar arası boşluk, px. Yazılmazsa 0.',
|
|
370
|
+
columnCount: 'Bir satırdaki kart sayısı (tam sayı, en az 1; 0/boş 1 sayılır). Katalog varsayılanı 5 (2026-09-29).',
|
|
371
|
+
verticalSpacing: 'Kart satırları arası boşluk, px. Yazılmazsa 20 (bileşen varsayılanı; 2026-09-15 öncesi yazılmamış düğüm 0 çiziyordu); yeni düğümün katalog varsayılanı 12 (2026-09-29).',
|
|
372
|
+
horizontalSpacing: 'Yan yana kartlar arası boşluk, px. Yazılmazsa 0; katalog varsayılanı 12 (2026-09-29).',
|
|
373
|
+
layout: "KARTIN İÇİ: '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 aynı.",
|
|
370
374
|
selectedIndex: "Tıklanan/olay yayan satırın sırası (0'dan). Runtime `change` ve `select` ile yazar; akışta self.selectedIndex, başka bileşende `{{ <repeater>.selectedIndex }}`. Şemada gizli durum prop'udur (panelde çizilmez); akış yazarak seçimi değiştirebilir ya da null yazıp temizleyebilir. Seçili satırın verisi için behavior'daki selectedItem maddesine bak."
|
|
371
375
|
}
|
|
372
376
|
},
|
|
@@ -803,6 +807,8 @@ export const componentKnowledge = {
|
|
|
803
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.",
|
|
804
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.",
|
|
805
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.",
|
|
806
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).",
|
|
807
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)."
|
|
808
814
|
],
|
|
@@ -1196,9 +1202,9 @@ export const componentKnowledge = {
|
|
|
1196
1202
|
}
|
|
1197
1203
|
},
|
|
1198
1204
|
navigations: {
|
|
1199
|
-
summary: "Çok seviyeli gezinme menüsü. 2026-08-27'de araç kutusuna alındı; 2026-09-22'de TEK AĞAÇ · 12 DÜZEN modeline geçti (
|
|
1205
|
+
summary: "Çok seviyeli gezinme menüsü. 2026-08-27'de araç kutusuna alındı; 2026-09-22'de TEK AĞAÇ · 12 DÜZEN modeline geçti (navLayout prop'u — 2026-09-29'a kadar adı layout idi): sidebar, header, hybrid (header+sidebar), dual (rail+panel), bottom (alt sekme çubuğu), dock, tabs, breadcrumb, command (komut paleti), launcher, footer, toc (içindekiler). Aynı navigations ağacı hepsinde kullanılır.",
|
|
1200
1206
|
behavior: [
|
|
1201
|
-
"
|
|
1207
|
+
"navLayout prop'u hangi KABUĞUN çizeceğini seçer; seçim tipli bir kayıttan yapılır (components/navigations/navigation-layouts/). Tanınmayan ya da temizlenmiş (null) bir değer sidebar'a düşer — ekran boş kalmaz.",
|
|
1202
1208
|
"variant 'drawer' bir düzen DEĞİL sidebar/hybrid'in menü tipidir ve kendi kabuğunu çağırır (tetikleyici + karartma + örtü katmanı); içindeki satırların düz mü akordiyon mu olduğunu drawerContent söyler.",
|
|
1203
1209
|
"Derin seviyeler nestingMode ile açılır: 'inline' yerinde ağaç, 'drill' panel içinde panel (drillHeader üç biçimde), 'cascade' sidebar'da kademeli flyout / drawer'da drawer-içinde-drawer. inlineDepth bir panelde yerinde gösterilen seviye sayısıdır.",
|
|
1204
1210
|
"Bazı prop bileşimlerinin ekranda karşılığı yoktur ve ÇİZİM ANINDA zorlanır (navigation-effective.ts): drawerSide 'bottom' iken cascade → drill ve push → overlay; fullscreen + cascade → üst üste; ≤768px'te sidebar/header/hybrid/dual/dock drawer'a döner (mobileBehavior 'drawer' ise) ve hover ile açma kapanır.",
|
|
@@ -1211,14 +1217,16 @@ export const componentKnowledge = {
|
|
|
1211
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.",
|
|
1212
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.",
|
|
1213
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.",
|
|
1214
|
-
"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).",
|
|
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.",
|
|
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.",
|
|
1215
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.",
|
|
1216
1224
|
"Satır görünümü TİPLİ navigationStyle grubuyla verilir (layout ile aynı grup); serbest style'ın &__item, &__item--active ve &__icon parçaları gruptan SONRA gelir (son söz).",
|
|
1217
|
-
'Karar
|
|
1225
|
+
'Karar kayıtları: zeyrek-frontend/docs/adr/0001-navigation-duzen-kaydi.md (düzen kaydı), 0007-navigation-duzen-proplari-yeniden-adlandirildi.md (navLayout/density adları).'
|
|
1218
1226
|
],
|
|
1219
1227
|
propNotes: {
|
|
1220
1228
|
navigations: "Ağaç: { title, href, icon, isHidden, isExpandable, isExpanded, children } + görünüm alanları { badge, badgeTone, isDisabled, target }. Alan adları kaydedilmiş sayfaların sözleşmesidir ve değişmedi. href düz metin ya da bağlantı seçicisinin nesnesi ({ type:'page', data, ref }) olabilir; ikisini de getHref çözer.",
|
|
1221
|
-
|
|
1229
|
+
navLayout: "Navigasyonun ekrandaki yeri ve biçimi; 12 seçenek (2026-09-29'a kadar prop'un adı layout idi). Kabuk seçimini bu prop yapar — tek istisna, sidebar ve hybrid düzenlerinde drawer menü tipinin kendi kabuğunu çağırmasıdır (bkz. variant).",
|
|
1222
1230
|
variant: "Menü tipi: 'flat' (alt öğeler hep açık), 'accordion' (açılır/kapanır), 'drawer' (tetikleyiciyle açılan panel). Yalnız sidebar ailesinde anlamlıdır.",
|
|
1223
1231
|
displayMode: "'full' ikon+metin · 'rail' yalnız ikon (alt seviyeler kademeli flyout) · 'text' yalnız metin.",
|
|
1224
1232
|
nestingMode: "Derin seviyeler nasıl açılır: 'inline' | 'drill' | 'cascade'. Rail'de her zaman cascade'e zorlanır.",
|
|
@@ -1296,7 +1304,7 @@ export const componentKnowledge = {
|
|
|
1296
1304
|
showFooter: "Panelin alt bandı (kullanıcı alanı vb.). Kapatılırsa liste panelin dibine kadar uzar.",
|
|
1297
1305
|
showBadges: "Öğelerin badge alanını çizer. Rail modunda rozetin yazacak yeri olmadığı için sayı tek bir NOKTAYA iner.",
|
|
1298
1306
|
tooltips: "Yalnız ikon görünen satırlarda üzerine gelince adı balonla gösterir. Rail’de ve daraltılabilir panelde anlamlıdır; etiketin zaten göründüğü yerde basılmaz.",
|
|
1299
|
-
|
|
1307
|
+
density: "Yoğunluk kademesi: 'sm' | 'md' | 'lg' (2026-09-29'a kadar prop'un adı size idi). Tek bir prop satır yüksekliğini, yazı boyutunu, satır dolgusunu ve ikon-metin boşluğunu birlikte değiştirir (navigation-tokens.ts ROW_HEIGHTS/FONT_SIZES/ROW_PADDINGS/ROW_GAPS) — bunlar ayrı ayrı ayarlanmaz.",
|
|
1300
1308
|
radius: "Satırın köşe yuvarlaklığı (px, 0–24). SIFIR verildiğinde satırın dış boşluğu da sıfırlanır ve satır panelin kenarına dayanır — yuvarlak köşeli bir satırın kenara yapışması tasarımın istemediği tek durumdur.",
|
|
1301
1309
|
indent: "Bir seviyenin girintisi (px, 8–48). maxIndent’e kadar her seviye bu kadar içeri alınır, sonrası 12px’lik küçük adımlara döner. Rail’de girinti çizilecek yer yoktur.",
|
|
1302
1310
|
itemGap: "Satırlar arası dikey boşluk (px, 0–16). Kök listeye ve her çocuk listesine birlikte uygulanır; satır yüksekliğini değiştirmez (onu size belirler).",
|
|
@@ -1316,7 +1324,14 @@ export const componentKnowledge = {
|
|
|
1316
1324
|
activeBgColor: "Aktif satırın zemini. activeIndicator hangisi olursa olsun geçerlidir — \"bar\"/\"pill\"/\"text\" kendi tonlarını yazar ama AÇIK seçimini ezmez (--ng-nav-active-bg-set).",
|
|
1317
1325
|
activeTextColor: "Aktif satırın yazı rengi. activeBgColor ile aynı kural: gösterge biçimi bunu ezmez.",
|
|
1318
1326
|
hoverColor: "Fare üzerindeyken satırın zemini. \"bar\" göstergesi aktif satırın zemini olarak da bunu kullanır.",
|
|
1319
|
-
borderColor: "Panel kenarlığı, grup ayraçları ve kılavuz çizgilerinin ortak rengi."
|
|
1327
|
+
borderColor: "Panel kenarlığı, grup ayraçları ve kılavuz çizgilerinin ortak rengi.",
|
|
1328
|
+
layout: "İÇERİK ALANI yerleşimi: 'flex' (katalog varsayılanı; akış) | 'grid' (12 kolonluk ızgara). Menüyü değil bırakılan çocukları dizer; anlamı container kaydındakiyle aynı. Menünün düzeni navLayout'tur.",
|
|
1329
|
+
direction: "İçerik alanı flex yönü: 'row' (varsayılan) | 'column'. Yalnız flex yerleşimde okunur; container ile aynı.",
|
|
1330
|
+
horizontalAlign: 'left | center | right | stretch — içerik alanı; container ile aynı eksen kuralları.',
|
|
1331
|
+
verticalAlign: 'top | middle | bottom | stretch — içerik alanı; container ile aynı eksen kuralları.',
|
|
1332
|
+
size: "İçerik alanı çocuk boyu: 'shrink' (varsayılan) | 'grow'. Satır yoğunluğu DEĞİLDİR — o density'dir (2026-09-29'a kadar size yoğunluktu).",
|
|
1333
|
+
gap: 'none | small | medium (varsayılan) | large ya da ham CSS değeri — içerik alanı çocukları arası; container ile aynı.',
|
|
1334
|
+
wrap: 'İçerik alanında flex-wrap; varsayılan açık, container ile aynı.'
|
|
1320
1335
|
}
|
|
1321
1336
|
},
|
|
1322
1337
|
'layout-shell': {
|
|
@@ -1587,7 +1602,7 @@ export const componentKnowledge = {
|
|
|
1587
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).',
|
|
1588
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.",
|
|
1589
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.',
|
|
1590
|
-
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.',
|
|
1591
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.',
|
|
1592
1607
|
colorRules: '[{ operator, value, valueTo, color }] — ilk eşleşen kural kazanır. radial/funnel/radar/funnelflow dışındaki her tipte uygulanır.'
|
|
1593
1608
|
}
|
|
@@ -1910,7 +1910,7 @@ export const FLEX_LAYOUT_PROP_NAMES = new Set(['layout', ...Object.keys(FLEX_LAY
|
|
|
1910
1910
|
* `icon` gibi komponentlerin KENDİ `size` prop'u flex `size`'ı değildir ve dokuz komponent için
|
|
1911
1911
|
* yanlış uyarı üretiyordu (09-04 Y-08).
|
|
1912
1912
|
*/
|
|
1913
|
-
const FLEX_LAYOUT_HOST_TYPES = new Set(['aibox', 'box', 'box-section', 'container', 'page-container', 'form', 'layout', 'widget-area']);
|
|
1913
|
+
const FLEX_LAYOUT_HOST_TYPES = new Set(['aibox', 'box', 'box-section', 'container', 'page-container', 'form', 'layout', 'widget-area', 'repeater', 'navigations']);
|
|
1914
1914
|
/**
|
|
1915
1915
|
* Eski `cssgrid` (box/aibox'ın akan gerçek `display:grid` kipi; 2026-09-02'de seçenek olmaktan
|
|
1916
1916
|
* çıktı, kayıtlı düğümlerde çalışmaya devam ediyor) düzen prop'larının HEPSİNİ ölü yapmaz:
|
|
@@ -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