@appaflytech/zeyrek-ai-mcp 0.0.2 → 0.0.4
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.
- package/.env.example +21 -7
- package/.env.production.example +42 -0
- package/README.md +14 -7
- package/dist/config.js +113 -46
- package/dist/knowledge/componentCatalog.js +476 -32
- package/dist/knowledge/componentEvents.js +154 -12
- package/dist/knowledge/errorPath.js +64 -0
- package/dist/knowledge/normalize.js +12 -1
- package/dist/knowledge/outlines.js +9 -2
- package/dist/knowledge/rules.js +184 -3
- package/dist/knowledge/styleResolve.js +485 -0
- package/dist/observability/trace.js +4 -0
- package/dist/platform/http.js +3 -0
- package/dist/platform/responses.js +80 -4
- package/dist/platform/screenshot.js +106 -0
- package/dist/resources/examples/layout-app-shell.json +368 -0
- package/dist/resources/examples/microservice-table-list.json +1 -0
- package/dist/resources/examples/middleware-authenticate.json +243 -47
- package/dist/resources/examples/workflow-basic.json +24 -2
- package/dist/resources/guides/component.md +6 -3
- package/dist/resources/guides/entity.md +33 -1
- package/dist/resources/guides/external-component.md +129 -0
- package/dist/resources/guides/layout.md +147 -0
- package/dist/resources/guides/microservice.md +35 -0
- package/dist/resources/guides/middleware.md +10 -0
- package/dist/resources/guides/page.md +137 -15
- package/dist/resources/guides/translation.md +80 -0
- package/dist/resources/guides/workflow.md +127 -2
- package/dist/server.js +4 -0
- package/dist/tools/externalComponents.js +285 -0
- package/dist/tools/layouts.js +48 -6
- package/dist/tools/microservices.js +2 -2
- package/dist/tools/pages.js +98 -30
- package/dist/tools/platformInfo.js +2 -2
- package/dist/tools/projects.js +7 -2
- package/dist/tools/screens.js +36 -0
- package/dist/tools/translations.js +37 -0
- package/dist/tools/workflows.js +3 -3
- package/package.json +4 -1
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ORTAK tipli stil grubu notları. Gruplar TEK kaynaktan üretilir
|
|
3
|
+
* (zeyrek-frontend `style-groups/style-group-schemas.ts`); alan sözleşmesi de
|
|
4
|
+
* tek yerde durur ki bir alan eklendiğinde komponent başına metin güncellemek
|
|
5
|
+
* gerekmesin. Tipli gruplu her komponentin propNotes'u bu sabitleri kullanır.
|
|
6
|
+
*
|
|
7
|
+
* DEĞER MODELİ (K9): boyut alanları CSS METNİDİR ('18px', '1.2em', '50%');
|
|
8
|
+
* çıplak sayı px sayılır. `radius` TEK alandır: preset anahtarı (none|sm|md|
|
|
9
|
+
* lg|pill) YA DA doğrudan CSS uzunluğu ('18px') yazılabilir.
|
|
10
|
+
*/
|
|
11
|
+
export const STYLE_GROUP_NOTES = {
|
|
12
|
+
surfaceStyle: "{ background, radius, borderTop, borderRight, borderBottom, borderLeft, shadow, contentOverflow(visible|hidden|auto) }. radius: tema kademesi ('var(--ng-radius-md)'; sm/lg 'Border radius'un oranı, md temanın kendisi), tek uzunluk ('18px') YA DA dört köşe ('90px 14px 14px 14px' — sol-üst, sağ-üst, sağ-alt, sol-alt). KENARLIK YÖN BAŞINADIR: her yön kendi CSS kısayolunu taşır ('1px solid var(--ng-border-primary)'), 'none' o kenarı kapatır; eski borderWidth/borderStyle/borderColor üçlüsü EMEKLİ (yalnız hiçbir yön yazılmamışsa okunur). shadow: çok katmanlı `box-shadow` metni ('0px 2px 5px 0px rgba(0,0,0,.2), inset 8px 5px 7px 0px #000'), tema token'ı ('var(--ng-shadow-md)') ya da eski preset anahtarı (none|sm|md|lg).",
|
|
13
|
+
typographyStyle: "{ textColor, fontFamily('var(--ng-font)' tema gövde | 'var(--ng-font-heading)' tema başlık | 'monospace' — token tema fontunu izler; serbest Google fontu yazma, tema yüklemez ve sessizce düşer), fontSize(CSS uzunluğu: '15px'|'1.1em'; çıplak sayı px sayılır), fontWeight(400|500|600|700), fontStyle(normal|italic), textDecoration(none|underline|line-through), lineHeight(TEK alan, üç yazım: oran '1.4' | yüzde '140%' | uzunluk '24px'; eski kayıtlardaki çıplak 140 yüzde sayılır), letterSpacing(CSS uzunluğu, negatif meşru: '-0.4px'), textAlign(left|center|right|justify) }. Komponentin içeriğine miras kalır.",
|
|
14
|
+
hoverStyle: "{ background, borderColor, shadow(none|sm|md|lg), lift(CSS uzunluğu: '2px'), transitionMs }. Hiçbir alan dolu değilse hover bloğu ve geçiş HİÇ yazılmaz.",
|
|
15
|
+
colorTokens: "RENK ALANLARI (background, textColor, borderColor, hover.background/borderColor) hex kadar tema token'ı da alır: 'var(--ng-accent-primary)', 'var(--ng-status-error)', 'var(--ng-background-inverse)'. Token yazılan alan tema değişince izler, hex yazılan kopar; tasarım sistemi renklerinde ÖNCE token'ı tercih et (studio panelinde aynı seçim tema chip'iyle yapılır).",
|
|
16
|
+
styleEscape: "Kaçış kapısı ve SON SÖZ: tipli grupların/builder'ın karşılamadığı her CSS kararı buraya yazılır (custom properties alanının veri kanalı budur). Önce tipli grupları dene; grup alanı yoksa style'a yaz. Efektif sonucu görmek için page_runtime_get(resolveStyles:true)."
|
|
17
|
+
};
|
|
1
18
|
export const componentKnowledge = {
|
|
2
19
|
html: {
|
|
3
20
|
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.',
|
|
@@ -22,13 +39,16 @@ export const componentKnowledge = {
|
|
|
22
39
|
summary: 'Etkileşimli veri ızgarası: satır seçimi, çift tık, hücre içi düzenleme, kolon filtreleme/sıralama — her etkileşim AYRI olay olarak akışa bağlanır.',
|
|
23
40
|
behavior: [
|
|
24
41
|
'Süzme/sıralama/sayfalama sunucu taraflıdır: filters/sortField/offset akışla uca gider, dönen satırlar rows prop’una setter ile yazılır.',
|
|
25
|
-
"isPaginated:true + akışta limit/offset parametreleri + pagination olayı üçlüsü birlikte kurulmalı; biri eksikse tablo tek sayfa kalır (platform_guide('page') Kural 1c)."
|
|
42
|
+
"isPaginated:true + akışta limit/offset parametreleri + pagination olayı üçlüsü birlikte kurulmalı; biri eksikse tablo tek sayfa kalır (platform_guide('page') Kural 1c).",
|
|
43
|
+
"SATIR BAZLI GÖRÜNÜM EZMESİ: bir satır kendi _columns DİZİSİNİ taşıyabilir — rows[i]._columns[<kolonun columns dizisindeki İNDEKSİ>] = { appearance:'error', isBold:true, options:[...] } kolon tanımıyla birleşir (column-view.ts resolveColumn → Table.svelte:1207 <TableCell {column}>). İndeks TANIM sırasıdır: buildViewColumns index'i isHidden kolonlar elenmeden ÖNCE atar, görünür sıra değil. Kullanıcı kolon menüsünden kolon gizlese bile indeksler kaymaz (hideColumns buildViewColumns'dan SONRA uygulanır). Ezilebilen alanlar appearance · options · isBold; CSV export'u da ezmeyi uygular. Aynı kalıp _actions[i] ile satır bazlı aksiyon ezmesinde de çalışır (rowActions). ŞEMA PROP'U DEĞİLDİR — component_get prop listesinde görünmez, satır verisinin içinde taşınır.",
|
|
44
|
+
"Koşullu/satır bazlı renk table'da _columns ile kurulur ve style prop'unu KAYBETTİRMEZ — datatable'ın colorMap'i statiktir. Hem CSS hem satıra göre renk isteyen tablo table'dır; renk için datatable'a mecbur değilsin."
|
|
26
45
|
],
|
|
27
46
|
propNotes: {
|
|
28
47
|
rows: 'Satır dizisi; mount/filter/sort/pagination akışlarının setter adımıyla doldurulur.',
|
|
29
48
|
totalRows: "Toplam kayıt: Number(Steps.<adım>?.headers?.[\"total-count\"] ?? 0) guard'lı ifadesiyle yazılır.",
|
|
30
49
|
rowSelection: "none | single | multi — seçim self.selectedRow / self.selectedRows prop'larından okunur.",
|
|
31
|
-
columns: "Kolon tanımları; mapping anahtarları kolonların name'iyle birebir eşleşmeli.",
|
|
50
|
+
columns: "Kolon tanımları; mapping anahtarları kolonların name'iyle birebir eşleşmeli. RENK: tag kolonu appearance ile 5 token alır (primary · info · success · warning · error) ve satır bazında _columns ezmesiyle değişir; serbest hex gerekiyorsa tags kolonunu kullan ve satır verisine [{ value, color:'#da1e28' }] yaz. Sayı/tarih biçimlendirmesi (prefix/suffix/precision/thousands/dateFormat/imageShape) table'da YOK — o datatable'ın kolon şemasındadır.",
|
|
51
|
+
style: "İKİ AYRI YAZIM KURALI: style.root emotion css() bloğudur (camelCase çalışır, iç seçici yazılabilir); style.thead|th|tr|td ise satır içi style attribute'una basılır (column-view.ts toStyleString anahtarı olduğu gibi yazar) — bu dördünde KEBAB-CASE zorunludur, fontSize sessizce düşer, font-size çalışır.",
|
|
32
52
|
isEditable: 'Hücre içi düzenleme; değişen satır rowChange olayında self.rows üzerinde güncellenir.'
|
|
33
53
|
}
|
|
34
54
|
},
|
|
@@ -36,13 +56,19 @@ export const componentKnowledge = {
|
|
|
36
56
|
summary: 'Kendi filtre paneli/sıralaması/sayfalaması İÇİNDE olan tablo: tek mount akışı yazılır, komponent etkileşimde prop’larını güncelleyip mount’u yeniden tetikler.',
|
|
37
57
|
behavior: [
|
|
38
58
|
"Tek olay yayması tasarımdır: kullanıcı süzünce/sıralayınca filters/sortField/sortType/offset prop'larını node'a yazar ve mount'u yeniden tetikler — akış bu prop'ları uca parametre geçirir. Yani mount/filter/sort/pagination için AYRI akışlar kurmak gerekmez (table'da gerekir).",
|
|
39
|
-
'Zengin kolon biçimlendirme (renk haritası, prefix/suffix, tarih formatı, avatar) kolon şemasındadır; satır seçimi/çift tık YOKTUR — gerekiyorsa table kullan.',
|
|
59
|
+
'Zengin kolon biçimlendirme (renk haritası, prefix/suffix, tarih formatı, avatar) kolon şemasındadır — ama renk haritası STATİKTİR; satır seçimi/çift tık YOKTUR — gerekiyorsa table kullan.',
|
|
40
60
|
"Liste→form geçişi satır AKSİYONUYLA kurulur: actions:[{ text, kind, icon, flow:{ type:'flow', ref:<flowId> } }]. doubleClick/select bağlamak 200 döner ama bağ ölüdür (gateway PAGE-008 keser).",
|
|
41
|
-
"Aksiyona tıklanınca komponent ÖNCE tıklanan satırı kendi selectedRow prop'una yazar, SONRA akışı çalıştırır (Table.svelte:72 setNode + onEmit) — akışta satır '<elementId>.selectedRow.<alan>' ile okunur. selectedRow katalogda hidden'dır; setter ile yazılmaz, komponent doldurur."
|
|
61
|
+
"Aksiyona tıklanınca komponent ÖNCE tıklanan satırı kendi selectedRow prop'una yazar, SONRA akışı çalıştırır (Table.svelte:72 setNode + onEmit) — akışta satır '<elementId>.selectedRow.<alan>' ile okunur. selectedRow katalogda hidden'dır; setter ile yazılmaz, komponent doldurur.",
|
|
62
|
+
"style prop'u 2026-08-27'de EKLENDİ: parçalar &__toolbar · &__title · &__head · &__th · &__body · &__row · &__td. table'ın aksine tek yazım kuralı vardır — hepsi designerCss'ten geçer, yani camelCase yazılır ve iç seçici alır. (Bu tarihten önce datatable stillendirilemiyordu; eski notlar 'style YOKTUR' diyorsa güncel değildir.)",
|
|
63
|
+
"Satır bazlı görünüm ezmesi (_columns / _actions) da YOKTUR — o table'a özgüdür. Renklendirme burada yalnız kolonun colorMap/autoColor sözlüğüyle, yani satırdan bağımsız kurulur."
|
|
42
64
|
],
|
|
43
65
|
propNotes: {
|
|
66
|
+
columns: "Kolon tipleri: text · number · date · datetime · time · switch · tag · email · url · link · image · file · progress. PROGRESS (2026-08-27) hücrenin içine çubuk ya da halka çizer: progressVariant bar|circle · max (varsayılan 100) · progressLabel none|percent|fraction|value · progressColor + customProgressColor · thresholds [{from,color}] (yüzdeyi geçmeyen en yüksek eşik kazanır) · captionField BAŞKA bir satır alanının metnini çubuğun ÜSTÜNE yazar, yani ad ve çubuk tek hücrede durur. Sıralama/dışa aktarım ham sayıyı görür, çizimi değil.",
|
|
44
67
|
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.",
|
|
45
|
-
selectedRow: "Salt okunur: satır aksiyonu tıklanınca komponentin kendisi doldurur; akış ifadesinde '<elementId>.selectedRow' ile okunur."
|
|
68
|
+
selectedRow: "Salt okunur: satır aksiyonu tıklanınca komponentin kendisi doldurur; akış ifadesinde '<elementId>.selectedRow' ile okunur.",
|
|
69
|
+
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.",
|
|
70
|
+
tableStyle: "zebra | plain — satır zemini varyantı; CSS DEĞİL. Serbest CSS için ayrı `style` prop'u vardır (parça bazlı).",
|
|
71
|
+
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."
|
|
46
72
|
}
|
|
47
73
|
},
|
|
48
74
|
form: {
|
|
@@ -55,18 +81,138 @@ export const componentKnowledge = {
|
|
|
55
81
|
errorElementId: "Sayfadaki form-validation-errors komponentinin elementId'si — bağlanmazsa alan doğrulama mesajları görünmez."
|
|
56
82
|
}
|
|
57
83
|
},
|
|
84
|
+
box: {
|
|
85
|
+
summary: "Evrensel bırakma kutusu: container'dan farkı MUTLAK 12 kolon canvas modunun OLMAMASI (yalnız akış), kutu modelinin border-box olması ve isteğe bağlı başlık/altlık bölgeleridir.",
|
|
86
|
+
behavior: [
|
|
87
|
+
"layout iki değer alır: 'flex' (akış) ve 'cssgrid' (GERÇEK display:grid). 'cssgrid', container'ın 'grid'inden AYRI bir değerdir — container'ınki mutlak koordinatlı canvas'tır, buradaki gerçek CSS grid akışıdır.",
|
|
88
|
+
"Yerleşim prop'ları bileşende OKUNMAZ: çocuk sarmalayıcısının stilini runtime'da RenderComponent, canvas'ta Draggable uygular (container ile aynı sözleşme).",
|
|
89
|
+
"GÖVDE İÇİN DÜĞÜM YOKTUR: kutunun kendi bırakma alanına inen her şey gövdedir. hasHeader/hasFooter ise ayrı 'box-section' DÜĞÜMLERİ açar; bölge kapatılınca içindeki çocuklar SİLİNMEZ, gövdeye taşınır.",
|
|
90
|
+
"cssgrid modunda çocuğun blocks[].size.w'si 'grid-column: span N'e çevrilir; gridTemplate doluysa gridColumns yok sayılır (şablon geçersizse kolon sayısına düşülür).",
|
|
91
|
+
"Yüzeyi TİPLİ GRUPLARDAN yönetilir: surfaceStyle (zemin, köşe, yön yön kenarlık, çok katmanlı gölge, gövde taşması), typographyStyle (içeriğe miras), hoverStyle ve box'a özgü sectionStyle (başlık/altlık bölgelerinin ayracı, ayraç rengi, bölge dolgusu). Bölgeler kutunun içinde bir eleman DEĞİL, gövdeye yerleşen ayrı 'box-section' düğümleridir; bu yüzden sectionStyle onları gerçek sınıflarından ('.ng-box-section--header/--footer') hedefler. style'ın tek parçası '&__body'dir — eski '&__header'/'&__footer' parçaları hiçbir elemana denk gelmediği için kaldırıldı."
|
|
92
|
+
],
|
|
93
|
+
propNotes: {
|
|
94
|
+
layout: "'flex' | 'cssgrid'. Diğer yerleşim prop'ları flex'te, gridColumns/gridTemplate/gridRowGap ise cssgrid'de okunur.",
|
|
95
|
+
gridTemplate: 'Serbest grid-template-columns metni; beyaz listeden geçmeyen değer sessizce yok sayılır ve gridColumns geçerli olur.',
|
|
96
|
+
isBorder: 'Çerçeveyi açar; kutu border-box olduğu için ölçü kaymaz.',
|
|
97
|
+
style: "Parçalar: '&__header' · '&__body' · '&__footer' — ancak yalnız '&__body' gerçek bir elemana denk gelir (CQ-157)."
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
'box-section': {
|
|
101
|
+
summary: "box'ın başlık/altlık bölgesi. Şemaya elle EKLENMEZ: box'ın hasHeader/hasFooter anahtarları bu düğümü açar ve kapatır.",
|
|
102
|
+
behavior: [
|
|
103
|
+
'Yüzeysiz sarmalayıcıdır: kendi zemini/kenarlığı yoktur, yalnız bölge ayracını çizer (header altına, footer üstüne).',
|
|
104
|
+
"Palette GÖRÜNMEZ (isHide) ve SİLİNEMEZ (isDeletable:false) — kaldırmanın tek yolu box'ın ilgili anahtarını kapatmaktır.",
|
|
105
|
+
"role prop'u ('header' | 'footer') bölgenin kimliğidir ve gizlidir; elle değiştirmek yerleşimi bozar.",
|
|
106
|
+
"Ayraç rengi ve bölge dolgusu artık kutunun 'sectionStyle' grubundan yönetilir (bölge düğümünün kendi şemasından değil): headerDivider/footerDivider/dividerColor/sectionPadding."
|
|
107
|
+
],
|
|
108
|
+
propNotes: { role: "'header' | 'footer' — gizli; box'ın bölge uzlaştırması yazar." }
|
|
109
|
+
},
|
|
110
|
+
divider: {
|
|
111
|
+
summary: 'Yatay ya da dikey ayraç çizgisi; ortasında isteğe bağlı etiket taşır. Olay YAYMAZ.',
|
|
112
|
+
behavior: [
|
|
113
|
+
"direction 'vertical' iken çizgi kapsayıcının YÜKSEKLİĞİNİ kullanır — yüksekliği olmayan bir akış kabında görünmez kalır.",
|
|
114
|
+
'label doluysa çizgi ikiye bölünür ve metin ortaya yerleşir; boşsa tek parça çizgidir.'
|
|
115
|
+
],
|
|
116
|
+
propNotes: {
|
|
117
|
+
variant: "'solid' | 'dashed' | 'dotted'.",
|
|
118
|
+
color: "Beş semantik değer + 'custom' (customColor ile); boş bırakılırsa tema kenarlık rengi."
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
spacer: {
|
|
122
|
+
summary: 'Sabit ya da esnek boşluk. Çalışma anında GÖRÜNMEZ; yalnız editörde tarandı çizilir.',
|
|
123
|
+
behavior: [
|
|
124
|
+
"mode 'fixed' iken size kadar px yer kaplar; 'flex' iken kalan boşluğu doldurur (flex kapsayıcıda iki grubu uçlara itmenin yolu).",
|
|
125
|
+
'showInEditor kapatılırsa editörde de görünmez — sayfayı okurken boşluğun neden orada olduğu anlaşılmaz, açık bırakmak yeğdir.',
|
|
126
|
+
"Kendi 'size' prop'u px'tir; kapsayıcının flex 'size' prop'uyla (shrink/grow) ilgisi yoktur."
|
|
127
|
+
],
|
|
128
|
+
propNotes: { mode: "'fixed' (size px) | 'flex' (kalanı doldurur)." }
|
|
129
|
+
},
|
|
130
|
+
popover: {
|
|
131
|
+
summary: 'Tetikleyici butondan açılan yüzen panel; İÇİNE komponent bırakılır (droppable).',
|
|
132
|
+
behavior: [
|
|
133
|
+
"trigger 'click' ya da 'hover' olabilir; editör kipinde tetikleme çalışmaz (tasarımcı içeriği düzenleyebilsin diye).",
|
|
134
|
+
"isOpen çift yönlüdür: açılış/kapanış olayları setter'dır (self.isOpen yazılır), dolayısıyla akış da isOpen'ı yazarak paneli açıp kapatabilir.",
|
|
135
|
+
'closeOnOutside kapatılırsa panel yalnız tetikleyiciyle ya da akışla kapanır.'
|
|
136
|
+
],
|
|
137
|
+
propNotes: {
|
|
138
|
+
position: 'Panelin tetikleyiciye göre yönü; yer yoksa kaydırılır.',
|
|
139
|
+
isOpen: "Açık/kapalı durumu; open/close olaylarıyla geri yazılır."
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
phoneinput: {
|
|
143
|
+
summary: 'Ülke kodu seçicili telefon girişi; değeri her zaman E.164 biçiminde yazar (+905321234567).',
|
|
144
|
+
behavior: [
|
|
145
|
+
'Yazılan metin ülkeye göre süzülür ve hane sınırına kırpılır; DEĞER DEĞİŞMEDİYSE change YAYILMAZ — duvara çarpan tuşlar boş akış tetiklemez.',
|
|
146
|
+
"blur her odak kaybında yayılır (değer aynı olsa bile) ve setter DEĞİLDİR — 'alan bırakıldı' kancası olarak kullan.",
|
|
147
|
+
'defaultCountry yalnız BAŞLANGIÇ ülkesidir; kullanıcı seçiciyi değiştirince değer yeni ülkenin koduyla yeniden kurulur.'
|
|
148
|
+
],
|
|
149
|
+
propNotes: { value: 'E.164 metni; boş girişte boş string.' }
|
|
150
|
+
},
|
|
151
|
+
filterbuilder: {
|
|
152
|
+
summary: 'İç içe and/or filtre kuralları kurar ve akışa HEM kural ağacını HEM hazır jexl ifadesini verir.',
|
|
153
|
+
behavior: [
|
|
154
|
+
"change olayının yükünde iki alan vardır: 'value' (ağaç) ve 'jexl' (aynı ağacın ifadesi). setter YALNIZ value'yi self'e yazar; jexl yalnız event.data'dadır — sorguya bağlanacak alan odur.",
|
|
155
|
+
'fields dizisi kullanıcıya sunulan alan sözlüğüdür; tipi (text/number/date/dropdown) operatör listesini belirler.',
|
|
156
|
+
'Her kural değişikliğinde change yayılır — sorguyu her tuşta yeniden koşturmak istemiyorsan akışta gecikme kur.'
|
|
157
|
+
],
|
|
158
|
+
propNotes: {
|
|
159
|
+
fields: '[{ label, field, type, options }] — options yalnız dropdown tipinde, virgülle ayrılmış metin.',
|
|
160
|
+
value: 'Kural ağacı; gizlidir ve setter ile yazılır.'
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
comments: {
|
|
164
|
+
summary: '@bahsetmeli, iç içe yanıtlı yorum akışı; gönderilen her yorumu akışa devreder.',
|
|
165
|
+
behavior: [
|
|
166
|
+
'İYİMSER KATMAN: gönderilen yorum, beğeni ve silme ANINDA arayüze yansır ama HİÇBİRİ kalıcı değildir — uca yazmak akışın işidir.',
|
|
167
|
+
'Bekleyen katman yalnız rows İÇERİĞİ değiştiğinde temizlenir (referans değişimi yetmez). Akış kaydettikten sonra rows tazelenmezse bekleyen satır bir sonraki içerik değişiminde kaybolur.',
|
|
168
|
+
'people listesi @bahsetme önerilerini besler; submit yükündeki mentions bu listeye göre çözülmüş adlardır.',
|
|
169
|
+
'ownOnly açıkken düzenleme/silme yalnız currentUser’ın kendi yorumlarında görünür — yetki KONTROLÜ değil, arayüz filtresidir; asıl kontrol uçtadır.'
|
|
170
|
+
],
|
|
171
|
+
propNotes: {
|
|
172
|
+
rows: '[{ id, author, text, createdAt, parentId, avatar, likeCount, likedByMe }] — parentId dolu olan satır yanıttır.',
|
|
173
|
+
currentUser: 'Yorum sahipliğini ve ownOnly filtresini belirleyen ad; boşsa düzenleme/silme gizlenir.',
|
|
174
|
+
people: '@bahsetme önerileri (virgülle ayrılmış).'
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
aibox: {
|
|
178
|
+
summary: "box'ın akış/bölge işlevini taşıyan kutu; farkı STİL YÖNETİMİNDE: yüzey, tipografi, hover ve bölge görünümü tipli prop gruplarıdır (surfaceStyle · typographyStyle · hoverStyle · sectionStyle), ham CSS değil.",
|
|
179
|
+
behavior: [
|
|
180
|
+
"Yerleşim prop'ları (layout/direction/gap/gridColumns...) box ile BİREBİR aynıdır ve bileşende okunmaz — çocuk sarmalayıcısını RenderComponent/Draggable giydirir. layout:'cssgrid' gerçek display:grid akışıdır (container'ın mutlak 12 kolon 'grid'i DEĞİL).",
|
|
181
|
+
"KATMAN SIRASI (K4): tema componentStyles → $preset TABANDIR (varsayılan verir); tipli grup alanları temayı alan alan EZER (tasarımcının/AI'ın açık seçimi kazanır); düğümün serbest style'ı her şeyin üstünde SON SÖZDÜR.",
|
|
182
|
+
"TEMA PRESET'İ: bir tema preset'ini düğüme bağlamak için style.$preset: '<ad>' yaz (adlar project_get → theme.presets; componentStyles[type] referanssız, tipin her örneğine uygulanır). Bir alanı 'temaya bırakmak' = o alanı HİÇ yazmamak (null/boş) — studio'daki 'Temaya dön' tam olarak bunu yapar; tema değerini gruba kopyalamak bağı koparır.",
|
|
183
|
+
"STİL YAZMA SIRASI: önce tipli gruplar (alan varsa oraya), grubun karşılamadığı karar style kanalına (custom properties). Tipli alan dururken aynı özelliği style'a yazmak paneli yanıltır — style kazanır ama panel alanı 'etkisiz' görünür.",
|
|
184
|
+
"Yüzey neden prop: düğümün appearance kanalı sarmalayıcıyı (.ng-app__node-item) boyar, kutunun İÇİNİ değil — box'ta .ng-box'ın kendi background/border-radius'una hiçbir panelden ulaşılamıyor. surfaceStyle bu boşluğu kapatır.",
|
|
185
|
+
"Bölge (header/footer) düğümleri box ile ORTAKTIR: hasHeader/hasFooter aynı box-section düğümlerini açar. sectionStyle kuralları bu yüzden '&__header' gibi bir parçaya değil, gerçek '& .ng-box-section--header' seçicisine yazılır.",
|
|
186
|
+
"Renk/gölge alanı boş bırakılırsa tema token'ı geçerlidir (--ng-background-surface, --ng-radius-md, --ng-shadow-*) — kutu tema değişimini izler. Radius preset'leri de --ng-radius-sm/lg/pill kademeleridir. Sabit renk ya da sabit px yazmak bu bağı koparır."
|
|
187
|
+
],
|
|
188
|
+
propNotes: {
|
|
189
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
190
|
+
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
191
|
+
hoverStyle: STYLE_GROUP_NOTES.hoverStyle,
|
|
192
|
+
sectionStyle: "{ headerDivider, footerDivider, dividerColor, sectionPadding(CSS uzunluğu: '12px') }. Ayraç anahtarı false ise bileşenin kendi ayracı KALDIRILIR (yok sayılmaz).",
|
|
193
|
+
style: STYLE_GROUP_NOTES.styleEscape + " Parça olarak yalnız '&__body' bildirilmiştir çünkü markup'ta gerçekten o eleman vardır."
|
|
194
|
+
}
|
|
195
|
+
},
|
|
58
196
|
container: {
|
|
59
|
-
summary: "Genel
|
|
197
|
+
summary: "Genel kapsayıcı (TİPLİ stil modeli: surfaceStyle · typographyStyle · hoverStyle · headerStyle); children'ını ya FLEX akışıyla (yeni kapsayıcıların varsayılanı) ya da 12 kolonluk IZGARA ile dizer. Her sayfanın kökünde silinemeyen page_container bundandır ve o da aynı düzen prop'larını alır.",
|
|
60
198
|
behavior: [
|
|
61
|
-
"states.isWrapper:true iken salt düzen elemanıdır: title ve __header bloğu ÇİZİLMEZ — kart başlığı gerekiyorsa içine text komponenti koy (platform_guide('page') Bilinen sınırlar).",
|
|
199
|
+
"states.isWrapper:true iken salt düzen elemanıdır: title ve __header bloğu ÇİZİLMEZ, zemin/çerçeve taşımaz ve gövdesi dolgusuzdur — kart başlığı gerekiyorsa içine text komponenti koy (platform_guide('page') Bilinen sınırlar). Bu kip artık bileşenin kendi CSS'inde: tipli alanlar (surfaceStyle) sayfa köküne de zemin/çerçeve verebilir.",
|
|
200
|
+
"KATMAN SIRASI (K4): tema componentStyles → $preset TABANDIR; tipli grup alanları temayı alan alan EZER; düğümün serbest style'ı SON SÖZDÜR. Yüzey/tipografi/hover/başlık kararlarını style'a ham CSS olarak yazma — alanı varsa gruba yaz.",
|
|
62
201
|
"page_container'ın isLoading prop'u sayfa açılış akışının yükleniyor bayrağıdır.",
|
|
63
202
|
"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.",
|
|
64
203
|
"Flex çocuğun GENİŞLİĞİ yine 12 kolonluk blocks[].size.w'dur (row'da flex-basis w/12, column'da width w/12) — içerik genişliği DEĞİL. Yani ızgara↔flex geçişi kayıpsızdır ve genişlik şemadan kurulabilir.",
|
|
65
204
|
"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' + size.h vermek gerekir. İstisna: states.isWrapper:true olan page_container zaten min-height:80vh ile sayfa boyu durur, onda dikey hizalama boşluksuz da çalışır.",
|
|
205
|
+
"ÜÇÜNCÜ YÜKSEKLİK: appearance.heightType:'fill' (2026-08-28) — yükseklik ne içerikten ne satır sayısından gelir, EBEVEYNİN BIRAKTIĞI yerden gelir: ızgara çocuğunda height:100% + align-self:stretch, flex sütununda flex:1 1 auto + min-height:0, flex satırında align-self:stretch + height:100%. Kaydırılabilir bir fill düğümü büyümek yerine içinde kaydırır. KÖK düğümde ekranı doldurur (100vh) — yerleşim kabuğu bununla kurulur.",
|
|
66
206
|
"layout:'grid' iken diğer altı prop okunmaz — Studio panelinde de gizlenir. Katalogda tanımlı oldukları için doğrulama duvarı susar: ızgara kapsayıcıya direction yazmak sessizce hiçbir şey yapmaz (gateway PAGE-015 ile uyarır).",
|
|
67
|
-
"Katalog varsayılanı 2026-08-25'te grid → FLEX oldu ama varsayılan düğüm KURULURKEN props'a yazılır (Studio bırakma yolu definition.defaults'u kopyalar), renderer'da geriye dönük bir etkisi YOKTUR: layout prop'u hiç olmayan düğüm — bütün eski kayıtlar — ızgara çizilmeye devam eder. Yani şemayı sen kuruyorsan varsayılana güvenme, layout'u açıkça yaz."
|
|
207
|
+
"Katalog varsayılanı 2026-08-25'te grid → FLEX oldu ama varsayılan düğüm KURULURKEN props'a yazılır (Studio bırakma yolu definition.defaults'u kopyalar), renderer'da geriye dönük bir etkisi YOKTUR: layout prop'u hiç olmayan düğüm — bütün eski kayıtlar — ızgara çizilmeye devam eder. Yani şemayı sen kuruyorsan varsayılana güvenme, layout'u açıkça yaz.",
|
|
208
|
+
"YERLEŞİM (layout) KURARKEN DE TERCİH EDİLEN KAPTIR: layout views'ü sıradan bir komponent ağacıdır ve kökü container'dır — Studio'nun yeni layout iskeleti (getDefaultLayout) tam olarak bunu kurar: states.isWrapper:true + appearance.heightType:'fill' + block x0/w12 kök (sayfanın page_container'ının yerleşim ikizi: çerçevesiz, başlıksız, ekranı dolduran), içinde yan menü kabı (w2, fill) + içerik sütunu (w10, fill, direction:'column') → üst şerit + slot (fill). layout-shell/layout-region ikilisi emekliye ayrıldı (platform_guide('layout')).",
|
|
209
|
+
"MOBİL TUZAĞI — flex çocukları telefonda ALT ALTA DÜŞMEZ: runtime'ın mobil kuralı yalnız ızgara özelliklerini ezer (RenderComponent.svelte, @media max-width:767px → grid-row/grid-column/height), flex çocuğu genişliğini getFlexChildStyle'ın flex-basis'inden alır ve flex-wrap:nowrap altında satır bozulmaz. 375px'te ölçüldü: aynı span'lerle ızgara kabın çocukları 375/375px alt alta, flex kabınkiler 49/310px yan yana. Telefonda yığılması gereken satır için layout:'grid' kullan, ya da wrap:true ile taşmayı aç (zeyrek-frontend docs/issues.md ARC-031)."
|
|
68
210
|
],
|
|
69
211
|
propNotes: {
|
|
212
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Kapsayıcının TABANI tema token'larıdır (--ng-background-surface zemin, 1px --ng-border-primary çerçeve, --ng-rounded köşe); alan boş bırakılırsa tema izlenir. contentOverflow gövdeye ('&__body') yazılır.",
|
|
213
|
+
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
214
|
+
hoverStyle: STYLE_GROUP_NOTES.hoverStyle,
|
|
215
|
+
headerStyle: "{ titleColor, titleSize(CSS uzunluğu), titleWeight(400|500|600|700), divider(bool — false BAŞLIK ÇİZGİSİNİ KALDIRIR, yok saymaz), dividerColor, padding(CSS kutu değeri: '12px' | '8px 16px' | 'var(--ng-spacing-md)'; varsayılanı boşluk ölçeğinden 'var(--ng-spacing-sm) var(--ng-spacing-md)'), minHeight(CSS uzunluğu; bileşenin 41px tabanını kaldırmak için '0'), align(flex-start|center|flex-end), margin(CSS kutu değeri; bandı içeriden almak ya da altına boşluk bırakmak için) }. Alanların HEPSİ varsayılan taşır (titleColor var(--ng-text-primary), titleSize calc(var(--ng-font-size) * 1.4), titleWeight '600', dividerColor var(--ng-border-primary)) — düğüm kurulurken props'a yazılırlar, yani component_get'teki defaults başlığın gerçek görünümüdür. Boyut alanlarında METİN '0' gerçek seçimdir ve bileşenin tabanını kaldırır (sayı 0 'seçilmedi' sayılır). Başlık yalnız title doluyken VE düğüm sarmalayıcı değilken çizilir.",
|
|
70
216
|
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.",
|
|
71
217
|
direction: "'row' (varsayılan) | 'column' → flex-direction. Hangi hizalamanın ana eksen olduğunu bu belirler.",
|
|
72
218
|
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.",
|
|
@@ -106,7 +252,14 @@ export const componentKnowledge = {
|
|
|
106
252
|
textinput: { summary: 'Tek satır metin girişi; value prop’u yazılabilir, change olayı { value } taşır.' },
|
|
107
253
|
textarea: { summary: 'Çok satırlı metin girişi.' },
|
|
108
254
|
texteditor: { summary: 'Zengin metin editörü; onChange değeri HTML string’dir. Olay adları istisnadır: onMount/onChange (on önekli).' },
|
|
109
|
-
numberinput: {
|
|
255
|
+
numberinput: {
|
|
256
|
+
summary: 'Sayı girişi; change olayı number taşır.',
|
|
257
|
+
propNotes: {
|
|
258
|
+
prefix: "Girdinin içinde SOLDA çizilen salt görsel ek (₺, $ gibi); value'ya karışmaz.",
|
|
259
|
+
suffix: "Girdinin içinde SAĞDA çizilen salt görsel ek (%, kg gibi); value'ya karışmaz.",
|
|
260
|
+
useThousandsSeparator: "Binlik ayracı YALNIZ ondalık (metin) modda çalışır — allowDemicalPoints kapalıyken native number girişi ayraç gösteremez, prop sessizce etkisizdir. Odakta ayraçlar soyulur, blur'da yeniden gruplanır; ayraç yerelden gelir (tr: 1.250,50 / en: 1,250.50)."
|
|
261
|
+
}
|
|
262
|
+
},
|
|
110
263
|
incrementalinput: { summary: 'Otomatik kod üretici (önek + ayraç + sayaç); bir sonraki kodu runtime’da çeker.' },
|
|
111
264
|
password: { summary: 'Parola girişi; textinput ile aynı olay sözleşmesi.' },
|
|
112
265
|
checkbox: { summary: 'İki durumlu kutu; change/checked/unchecked olayları boolean taşır.' },
|
|
@@ -120,7 +273,12 @@ export const componentKnowledge = {
|
|
|
120
273
|
fileInput: { summary: 'Dosya seç girişi; change yükü { value: [{ type, value }], fileName }.' },
|
|
121
274
|
filebutton: { summary: 'Buton görünümlü dosya seçici; fileInput ile aynı yük.' },
|
|
122
275
|
'file-viewer': { summary: 'Dosya önizleyici (pdf/görsel); file prop’una drive dosyası bağlanır.' },
|
|
123
|
-
button: {
|
|
276
|
+
button: {
|
|
277
|
+
summary: 'Tıklama kaynağı; click olayı veri taşımaz, bağlam gerekiyorsa ifadede komponent adlarıyla okunur.',
|
|
278
|
+
propNotes: {
|
|
279
|
+
kind: "success | error | info | primary | warning. `datatable.actions[].kind` FARKLI bir sözlük kullanır (error · information · solid · transparent · dark · danger · warning) — buradan bir değer (örn. 'transparent') butona yazılırsa invalid-enum-value verir."
|
|
280
|
+
}
|
|
281
|
+
},
|
|
124
282
|
'dropdown-button': { summary: 'Menülü buton; clickItem olayı tıklanan menü öğesini taşır.' },
|
|
125
283
|
compound: { summary: 'İkincil metinli büyük buton (compound button); click yayar.' },
|
|
126
284
|
'confirm-bar': { summary: 'Satır içi onay şeridi; click olayı tıklanan buton tanımını taşır.' },
|
|
@@ -157,10 +315,19 @@ export const componentKnowledge = {
|
|
|
157
315
|
}
|
|
158
316
|
},
|
|
159
317
|
text: {
|
|
160
|
-
summary: 'Tek satırlık metin gösterimi; değer type:code prop’uyla ifadeye bağlanabilir.',
|
|
318
|
+
summary: 'Tek satırlık metin gösterimi; değer type:code prop’uyla ifadeye bağlanabilir. Görünümü TİPLİ stil gruplarındadır (typographyStyle · surfaceStyle), ham CSS değil.',
|
|
161
319
|
behavior: [
|
|
162
|
-
"Yükseklik SABİTTİR: maxSize.h = 1 (katalog varsayılanı 8'dir ve olduğu gibi kopyalanırsa reddedilir; gateway 1'e çeker ve gatewayNormalized ile bildirir). Çok satırlı metin için textarea ya da html kullanın."
|
|
163
|
-
|
|
320
|
+
"Yükseklik SABİTTİR: maxSize.h = 1 (katalog varsayılanı 8'dir ve olduğu gibi kopyalanırsa reddedilir; gateway 1'e çeker ve gatewayNormalized ile bildirir). Çok satırlı metin için textarea ya da html kullanın.",
|
|
321
|
+
"type HTML etiketi + ölçek seviyesidir (h1|h2|h3|label|p|small; a11y için doğru seviyeyi seç). Punto/kalınlık/renk/hiza kararı typographyStyle'dadır: fontSize seviyenin puntosunu ezer, boş bırakılırsa seviye ölçeği (tema --ng-font-size-*) geçerlidir.",
|
|
322
|
+
"EMEKLİ prop'lar: isBold, align, color, customColor şemada YOK — yazılırsa unknown-prop ile reddedilir. Karşılıkları: typographyStyle.fontWeight ('600'), textAlign, textColor (semantik renk için tema token'ı: var(--ng-status-success) gibi). Kayıtlı eski sayfalarda bu prop'lar render anında takma adla çözülür (resolvedStyle bunu gösterir), yeni yazımda kullanılmaz.",
|
|
323
|
+
"Hover grubu yok (metnin hover semantiği yok); surfaceStyle etiket/vurgulu paragraf içindir (zemin, köşe, çerçeve, gölge) ve contentOverflow alanı yoktur (taşma hedefi yok).",
|
|
324
|
+
"KATMAN SIRASI (K4): tema componentStyles → $preset TABANDIR; tipli grup alanları temayı alan alan EZER; düğümün serbest style'ı SON SÖZDÜR. Grubun karşılamadığı kararı style kanalına (custom properties) yaz."
|
|
325
|
+
],
|
|
326
|
+
propNotes: {
|
|
327
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
328
|
+
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
329
|
+
style: STYLE_GROUP_NOTES.styleEscape
|
|
330
|
+
}
|
|
164
331
|
},
|
|
165
332
|
image: { summary: 'Görsel; click yayar, src ifadeyle beslenebilir.' },
|
|
166
333
|
video: { summary: 'Video oynatıcı; play/pause/ended olayları yayar.' },
|
|
@@ -179,18 +346,125 @@ export const componentKnowledge = {
|
|
|
179
346
|
},
|
|
180
347
|
'form-validation-errors': { summary: 'Formun doğrulama hatalarını listeler; form.errorElementId buraya işaret eder.' },
|
|
181
348
|
breadcrumb: { summary: 'Sayfa yolu; currentTitle setter ile kip etiketine (Yeni/Düzenle) çevrilir.' },
|
|
182
|
-
'page-header': {
|
|
183
|
-
|
|
184
|
-
|
|
349
|
+
'page-header': {
|
|
350
|
+
summary: 'Sayfa başlığı bandı; yalnız mount yayar.',
|
|
351
|
+
propNotes: {
|
|
352
|
+
pageTitle: "Bant başlığı; page_container.title ile karıştırılmamalı. `description` diye bir prop YOKTUR (unknown-prop verir).",
|
|
353
|
+
links: 'Sağ tarafta çizilen aksiyon/bağlantı listesi.',
|
|
354
|
+
breadcrumbStyle: 'Kırıntı izinin görünüm biçimi.',
|
|
355
|
+
isHidden: "Bu komponentin kataloğunda VAR (bazı komponentlerde yok — bkz. 'notification'); doğrudan şemaya yazılabilir."
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
header: {
|
|
359
|
+
summary: "Uygulama üst çubuğu (layout parçası): logo, TEK SEVİYE bağlantı şeridi, kullanıcı bloğu; navigation dizisi iç içe Prop sarmalı ister. Aktif bağlantı vurgusu YALNIZ prop'la sürülür — sidebar/layout'un aksine adrese bakmaz.",
|
|
360
|
+
behavior: [
|
|
361
|
+
"Vurgu OTOMATİK DEĞİLDİR: komponent adres çubuğuna bakmaz, yalnız activeNavHref ile bağlantının adresini karşılaştırır. Prop boşken hiçbir bağlantı vurgulanmaz; sayfa değişince vurguyu açılış akışındaki setter yazar. (Otomatiği isteyen sidebar/layout ya da qm-header kullanır.)",
|
|
362
|
+
"Karşılaştırma ÇÖZÜLMÜŞ yol üzerindedir (iki taraf da getHref'ten geçer): activeNavHref'e satırın ham href'ini ('musteriler'), bağlantı nesnesini ya da tarayıcıdaki tam yolu yazabilirsin — üçü de aynı satırı bulur.",
|
|
363
|
+
"2026-08-27'den önce karşılaştırma HAM değerler üzerindeydi ve bağlantı seçicisiyle doldurulmuş (nesne) href hiçbir zaman tutmuyordu; artık iki taraf da getHref'ten geçiyor — ham metin, bağlantı nesnesi ve tam yol aynı bağlantıyı gösterir.",
|
|
364
|
+
"navigation öğesi children alt-prop'unu kabul eder ama Header.svelte alt menü ÇİZMEZ — dizi tek seviye basılır. İç içe menü gerekiyorsa sidebar/layout (activeHref + otomatik vurgu) ya da qm-header (yalnız otomatik vurgu) kullan."
|
|
365
|
+
],
|
|
366
|
+
propNotes: {
|
|
367
|
+
activeNavHref: "Vurgulanacak bağlantının HAM href'i. Eşleşen öğeye 'active' sınıfı basılır; görsel fark yalnız arka plan tonudur (--ng-background-canvas) ve o ton hover'ın aynısıdır — kalınlık/renk değişmez (header.style.ts '&__navigations-item.active').",
|
|
368
|
+
navigation: "[{ title, href, icon }] — tek seviye. children yazılabilir ama render EDİLMEZ."
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
sidebar: {
|
|
372
|
+
summary: 'Yan menü (layout parçası): logo/başlık/alt başlık bandı + çok seviyeli navigations ağacı. Ağacı layout ile ORTAK renderer çizer (Navigations/NavigationsItem) — ikisinin menü davranışı birebir aynıdır.',
|
|
373
|
+
behavior: [
|
|
374
|
+
"AKTİF SATIR VURGUSU activeHref prop'uyla sürülür (2026-08-27'de eklendi): yazılan adres hangi satıra denk geliyorsa o satır vurgulanır. Prop BOŞ bırakılırsa menü tarayıcıdaki adrese uyan satırı kendi bulur — yani hiç ayar yapmadan da 'bulunduğun sayfa' vurgulanır. Akıştan setter ile yazılabilir.",
|
|
375
|
+
"Eşleşmenin iki tarafı da getHref'ten geçer: satırın ham href'ini ('musteriler'), bağlantı seçicisinin nesnesini ({type:'page', data, ref}) ya da tarayıcıdaki tam yolu yazmak AYNI satırı gösterir — header'ın ham eşitlik tuzağı burada yok.",
|
|
376
|
+
"Otomatik eşleşme kuralı: satırın yolu adresle TAM eşit olmalı, satırın istediği sorgu parametrelerinin hepsi adreste aynı değerle bulunmalı (sayfanın eklediği fazla parametreler yok sayılır); aynı yolu paylaşan satırlarda daha çok parametre eşleyen kazanır. Yalnız YAPRAK satırlar yarışır, gizli satırlar elenir. Adres mount'ta BİR KEZ okunur (bağlantılar tam sayfa yükler).",
|
|
377
|
+
"Vurgulanan satır 'nav-btn--active' sınıfı + aria-current='page' alır (accent zemin/metin, hover tonundan bilerek ayrı). ÜST DAL vurgulanmaz ve kendiliğinden AÇILMAZ — kapalı bir dal aktif satırı gizler.",
|
|
378
|
+
"Menü rengi/biçimi CSS ile hâlâ ezilemez: style'ın &__navigations, &__navigations-title, &__navigations-body, &__navigations-item, &__navigations-item-suffix parçaları ÖLÜDÜR — bu sınıflar hiçbir elemana basılmaz (Sidebar.svelte yalnız __header*/__content yazar, satırları Navigations kendi scoped .nav-btn sınıfıyla çizer). Vurgu bu yüzden komponentin kendi stilindedir (zeyrek-frontend docs/issues.md CQ-132).",
|
|
379
|
+
"Menü olay YAYMAZ (şemada yalnız mount), satır tıklaması akış tetiklemez — gezinme ham <a href> ile tam sayfa yükleyerek olur.",
|
|
380
|
+
"isExpandable:true olan öğe BUTON çizilir ve href'i YOK SAYILIR (yalnız açar/kapar); gezinen, href'i olup isExpandable olmayan yapraklardır. Ne href'i ne children'ı olan 0. seviye öğe tıklanamaz GRUP BAŞLIĞI olur.",
|
|
381
|
+
"isExpanded kullanıcı tıklayınca yalnız bellekteki öğe nesnesinde değişir — akışa yayılmaz, sayfa yenilenince şemadaki değere döner."
|
|
382
|
+
],
|
|
383
|
+
propNotes: {
|
|
384
|
+
navigations: "Ağaç: { title, href, icon, isExpandable, isExpanded, children }. href hem düz metin hem bağlantı seçicisinin nesnesi ({ type:'page', data, ref }) olabilir; ikisini de getHref çözer (http/mailto/tel olduğu gibi geçer, aksi hâlde geçerli adresin ilk üç segmentinin altına bağlanır). Öğe bazlı isHidden bu şemada YOKTUR — layout'ta vardır.",
|
|
385
|
+
activeHref: "Vurgulanacak satırın adresi; boş bırakılırsa tarayıcıdaki adres karar verir. Satırın href'iyle aynı biçimde yazılabilir (ham metin, bağlantı nesnesi ya da tam yol). YENİ prop — component_get çıktısındaki prop listesinde görünmüyorsa platform kataloğu henüz senkronlanmamıştır (components.json CI'daki syncComponents adımıyla iner).",
|
|
386
|
+
style: "Yalnız &__header, &__header-logo, &__header-title, &__header-subtle ve &__content gerçekten uygulanır; &__navigations* parçaları ölüdür (bkz. davranış)."
|
|
387
|
+
}
|
|
388
|
+
},
|
|
185
389
|
'auth-layout': { summary: 'Giriş ekranı kabuğu: logo kolonu + form slotu; primaryClick/secondaryClick olayları yayar.' },
|
|
186
|
-
layout: {
|
|
187
|
-
|
|
390
|
+
layout: {
|
|
391
|
+
summary: 'Layout kök komponenti: logo/başlık, kullanıcı menüsü, kırıntı yolu ve menü ağacı bir arada; sayfalar slot’una yerleşir, logout olayı yayar.',
|
|
392
|
+
behavior: [
|
|
393
|
+
"Menü ağacını sidebar ile AYNI renderer çizer (Navigations/NavigationsItem): activeHref prop'u, adresten otomatik eşleşme, isExpandable/isExpanded ve grup başlığı kuralları birebir aynıdır — ayrıntı sidebar kaydında.",
|
|
394
|
+
"Öğe bazlı isHidden BU şemada tanımlıdır (sidebar'ınkinde yoktur): true olan öğe canlıda elenir, Studio'nun düzenleyici kipinde görünmeye devam eder.",
|
|
395
|
+
"TEK PARÇA (monolit) kabuktur: logo, başlık, menü, kırıntı yolu ve kullanıcı menüsü sabittir — yalnız DOLDURULUR, yeniden düzenlenemez. Serbest kompozisyon için container + slot kullan (platform_guide('layout')); mevcut monolitler çalışmaya devam eder ve Studio'da 'Break apart' ile parçalarına ayrılabilir."
|
|
396
|
+
],
|
|
397
|
+
propNotes: {
|
|
398
|
+
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."
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
navigations: {
|
|
402
|
+
summary: "Çok seviyeli gezinme menüsü. 2026-08-27'de araç kutusuna ALINDI (kendi schema.ts'i o gün yazıldı): artık bir kaba sürüklenip yan menü, üst şerit ya da alt sekme çubuğu olarak kullanılabilir — daha önce yalnız layout/sidebar'ın içinden çiziliyordu.",
|
|
403
|
+
behavior: [
|
|
404
|
+
'Ağacı layout ve sidebar ile ORTAK renderer çizer (Navigations/NavigationsItem) — üçünün menü davranışı birebir aynıdır; ayrıntı sidebar kaydında.',
|
|
405
|
+
"Öğ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}).",
|
|
406
|
+
"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).",
|
|
407
|
+
"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).",
|
|
408
|
+
'Menü olay YAYMAZ (şemada yalnız mount); gezinme ham <a href> ile tam sayfa yükleyerek olur.'
|
|
409
|
+
],
|
|
410
|
+
propNotes: {
|
|
411
|
+
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.",
|
|
412
|
+
activeHref: 'Vurgulanacak satırın adresi; boş bırakılırsa tarayıcıdaki adres karar verir.',
|
|
413
|
+
isHidden: 'Komponentin tamamını gizler (ortak katman prop’u); öğe bazlı gizleme navigations[].isHidden’dır.',
|
|
414
|
+
style: 'ÖLÜ — hiçbir etkisi yok (bkz. davranış). Menü biçimini değiştirmek bugün mümkün değil.'
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
'layout-shell': {
|
|
418
|
+
summary: "Kompozisyon kabuğunun kökü: bölgeleri ve sayfa slot'unu içine dizersin. 2026-08-27'de eklendi, 2026-08-28'de EMEKLİYE AYRILMA kararı alındı — yeni layout'u container + slot ile kur (platform_guide('layout')). Kayıtlı kalır, mevcut layout'lar çalışmaya devam eder.",
|
|
419
|
+
behavior: [
|
|
420
|
+
"Gövdesi BLOK akışındadır ve çocukları 12 kolonluk IZGARA yerleştirir — hem runtime'da hem Studio tuvalinde. Gövde satır flex'i olsaydı renderer'ın çocuk sarmalayıcısı içerik genişliğine çökerdi (ölçüldü: runtime'da 1200px yerine 213px, tuvalde 0). Yani bölgelerin konumu dock prop'undan DEĞİL, blocks[]'ten gelir.",
|
|
421
|
+
"sidebarOpen CANLI DURUMDUR: prop'un kendisi durumdur, toggle onu doğrudan yazar (qm-sidebar'ın isCollapsed deseni). Bir Durum değişkenine bağlanabilir ya da change-property akışıyla çevrilebilir.",
|
|
422
|
+
"mobileBehavior yalnız yan panelin mobilde AÇIK BAŞLAYIP başlamayacağını belirler (resolveInitialSidebarOpen: drawer → kapalı, stack → açık). 2026-08-28'e kadar var olan 'stack ise gövdeyi column yap' CSS kuralı, gövde blok akışına geçtiği için KALDIRILDI — artık yerleşimi ızgara belirliyor.",
|
|
423
|
+
"isViewportFilling / isShellRoot yetenekleri ve states.isShell bayrağı BACKEND'DE SAKLANMAZ (components tablosunda sütun yok, States kaydında isShell yok — zeyrek-frontend docs/issues.md BE-002). Davranışı tip adına düşen yedek listeler taşır; şema yazarken bu bayraklara güvenme."
|
|
424
|
+
],
|
|
425
|
+
propNotes: {
|
|
426
|
+
sidebarOpen: 'Yan panelin açık olup olmadığı; canlı durumdur, bağlanabilir.',
|
|
427
|
+
mobileBehavior: "'drawer' (varsayılan; mobilde kapalı başlar) | 'stack' (mobilde açık başlar).",
|
|
428
|
+
style: "&__body ve &__overlay parçaları uygulanır."
|
|
429
|
+
}
|
|
430
|
+
},
|
|
431
|
+
'layout-region': {
|
|
432
|
+
summary: "Yerleşimin serbest bölgesi: içine ne sürüklersen o olur. layout-shell ile birlikte 2026-08-27'de eklendi, 2026-08-28'de EMEKLİYE AYRILMA kararı alındı — yeni layout'ta yerine container kullan.",
|
|
433
|
+
behavior: [
|
|
434
|
+
"dock BÖLGENİN NEREDE DURDUĞUNU BELİRLEMEZ — biçimini ve yönünü belirler: left/right tam yükseklikte dikey kolon, top/bottom tam genişlikte yatay şerit, fill kenarlıklı/zeminli yüzey. Konum ve boyut, diğer her komponentteki gibi blocks[]'ten gelir.",
|
|
435
|
+
"Gövdesi container/shell ile aynı sebeple blok akışındadır; row yönündeki bir bölgede flex olsaydı içerik genişliğine çökerdi (üst şerit 8px kalırdı — ölçüldü).",
|
|
436
|
+
"Kenara yaslı bölge (dock !== 'fill') shell'in sidebarOpen'ını izler ve kapanır; fill ASLA gizlenmez — yoksa sayfa içeriği kaybolurdu. Shell dışında tek başına duran bölge her zaman açık kabul edilir.",
|
|
437
|
+
"appearance.hideOn, dockMobile'ı HER ZAMAN yener; dockMobile:'hidden' yalnız bölge-yerel kısayoldur."
|
|
438
|
+
],
|
|
439
|
+
propNotes: {
|
|
440
|
+
dock: "left | right | top | bottom | fill — biçim/yön, konum değil.",
|
|
441
|
+
dockMobile: "inherit (varsayılan; masaüstünü izler) | left | right | top | bottom | drawer (içeriğin üstüne biner) | hidden.",
|
|
442
|
+
isCollapsible: 'Bölgenin kapanabilir olup olmadığı.',
|
|
443
|
+
isCollapsed: 'Kapalı başlar; bir Durum değişkenine bağlanabilir.',
|
|
444
|
+
style: '&__body parçası uygulanır.'
|
|
445
|
+
}
|
|
446
|
+
},
|
|
447
|
+
slot: {
|
|
448
|
+
summary: 'Layout’ta sayfa içeriğinin yerleştiği delik — slot’suz layout’a bağlanan sayfa BOŞ görünür.',
|
|
449
|
+
behavior: [
|
|
450
|
+
"Layout'ta TEK slot olmalı. Enjeksiyon HER slot'a ayrı ayrı kopyalar (layout.functions.ts injectPageSchemaIntoSlots ağacı dolaşır ve type==='slot' gören her düğümün children'ına sayfa şemasının klonunu yazar; önizleme tarafında page.mappers.mapPageLayoutToPreview aynısını yapar): iki slot = sayfa iki kez çizilir, elementId'ler çakışır. Doğrulama: page_state.layoutSlots.",
|
|
451
|
+
"Slot'un yerleşimi ızgara bloğundan gelir ve satır yüksekliği AÇIK UÇLUDUR — runtime slot için grid-row'u `y / auto` yazar (render.functions.ts), yani sayfa içeriği ne kadar uzarsa slot o kadar uzar. Slot'a sabit yükseklik vermeye çalışmak anlamsızdır."
|
|
452
|
+
]
|
|
453
|
+
},
|
|
188
454
|
view: { summary: 'Tabs/switcher altındaki görünüm kapsayıcısı; children gruplamaya yarar.' },
|
|
189
455
|
'widget-area': { summary: 'Widget’ların yerleştirildiği alan.' },
|
|
190
456
|
'audit-basic': { summary: 'Kayıt meta kutusu (oluşturan/güncelleyen); meta prop’u tek setter ile beslenir.' },
|
|
191
457
|
'audit-history': { summary: 'Kayıt geçmişi listesi.' },
|
|
192
458
|
'document-editor': { summary: 'Office şablon doldurma/görüntüleme editörü; file prop’una drive dosyası bağlanır.' },
|
|
193
|
-
'qm-header': {
|
|
459
|
+
'qm-header': {
|
|
460
|
+
summary: 'QM uygulama başlığı: global arama, bildirimler, hesap menüsü, çok seviyeli mega menü.',
|
|
461
|
+
behavior: [
|
|
462
|
+
"Aktif menü öğesini KOMPONENT KENDİ bulur: menüdeki href'leri getHref ile çözüp adres çubuğunun pathname + search'iyle karşılaştırır (shared/navigation-active.ts findActiveHref — sidebar/layout ile aynı kural). Bunu sürecek ya da ezecek bir prop YOKTUR: sidebar/layout'taki activeHref burada yok, yazmak unknown-prop verir.",
|
|
463
|
+
"Eşleşme kuralı: yol TAM eşit olmalı (önek eşleşmesi yok) ve href'in sorgu parametrelerinin HEPSİ adresteki sorguda aynı değerle bulunmalı; birden çok aday tutarsa EN ÇOK parametresi eşleşen kazanır — '/gorevler' ile '/gorevler?tip=acik' aynı sayfada böyle ayrışır.",
|
|
464
|
+
"Yalnız YAPRAK öğeler yarışır (children'ı olan dal atlanır), isHidden öğeler elenir. Kazanan yaprağın üstündeki akordeon dallar açılır; drawer kipindeki dal kendiliğinden açılmaz (findActiveTrail).",
|
|
465
|
+
'Sonuç: menü href’i sayfanın gerçek yoluna çözülüyorsa vurgu ek ayar istemeden çalışır; çözülmüyorsa vurguyu elle açmanın yolu yoktur.'
|
|
466
|
+
]
|
|
467
|
+
},
|
|
194
468
|
'qm-sidebar': { summary: 'QM yan menüsü.' },
|
|
195
469
|
'qm-content': { summary: 'QM içerik kapsayıcısı.' },
|
|
196
470
|
// — 2026-08-25 eşleme turu: ng-apps-ui kataloğunda olup burada kaydı olmayan 22 komponent.
|
|
@@ -222,11 +496,12 @@ export const componentKnowledge = {
|
|
|
222
496
|
}
|
|
223
497
|
},
|
|
224
498
|
badge: {
|
|
225
|
-
summary: 'Sayaç/durum rozeti: maxCount üstü "99+" olur, 0 showZero verilmedikçe gizlenir, isDot ile salt nokta çizer.
|
|
499
|
+
summary: 'Sayaç/durum rozeti: maxCount üstü "99+" olur, 0 showZero verilmedikçe gizlenir, isDot ile salt nokta çizer.',
|
|
226
500
|
behavior: [
|
|
227
501
|
'value SAYIYSA sayaç kuralları işler (0 gizlenir, maxCount aşılırsa "99+"); sayıya çevrilemeyen metin ("Yeni", "Beta") olduğu gibi basılır — durum rozeti böyle kurulur.',
|
|
228
502
|
'isDot:true iken value · icon · maxCount OKUNMAZ, yalnız renkli nokta çizilir; nokta tek başına anlam taşıyorsa dotLabel doldurulmalı (yoksa ekran okuyucuya aria-hidden geçilir).',
|
|
229
|
-
'isPulsing nabız animasyonu ekler ve prefers-reduced-motion açık kullanıcıda kendiliğinden durur.'
|
|
503
|
+
'isPulsing nabız animasyonu ekler ve prefers-reduced-motion açık kullanıcıda kendiliğinden durur.',
|
|
504
|
+
"click yalnız şemada bağlıysa yayılır (avatar/image deseni): bağlıyken rozet <button> olur, tıklanabilir görünür ve odak sırasına girer; bağlı değilken salt görsel <span>'dir."
|
|
230
505
|
],
|
|
231
506
|
propNotes: {
|
|
232
507
|
value: 'Sayı ya da metin; boş string rozeti tamamen gizler.',
|
|
@@ -269,10 +544,13 @@ export const componentKnowledge = {
|
|
|
269
544
|
'seriesField + valueField birlikte verilirse satırlar "kategori+seri başına bir satır" sayılıp geniş biçime pivotlanır; series dizisi o zaman prop’tan değil veriden türetilir.',
|
|
270
545
|
'aggregate/sort/topN/nullMode veriyi çizimden ÖNCE dönüştürür — aynı işi akışta yapmana gerek yok.',
|
|
271
546
|
'isDrillDown:true iken veri noktasına tıklamak kırıntı seviyesi ekler; dataPointClick yükü kaynak satırın TAMAMINI (row) taşır, böylece alt seviye sorgusu tek olayla kurulur. Geri dönüş breadcrumbClick ile bildirilir ve yeniden sorgulamak akışın işidir.',
|
|
272
|
-
'isExportable "tablo olarak gör" + dışa aktarma araç çubuğunu açar; showRefresh refresh olayını yayan bir yenile düğmesi ekler.'
|
|
547
|
+
'isExportable "tablo olarak gör" + dışa aktarma araç çubuğunu açar; showRefresh refresh olayını yayan bir yenile düğmesi ekler.',
|
|
548
|
+
"PASTA/HALKA ETİKETİ (2026-08-27 düzeltmesi): dataLabels.show artık pie/donut'a da geçiyor. Öncesinde prop bu dala hiç ulaşmıyordu ve dilim etiketleri HİÇBİR ayarla kapatılamıyordu — çekme çizgileri legend'in üstüne bindiği için halka fiilen kullanılamıyordu. Temiz halka için dataLabels:{ show:false } yaz."
|
|
273
549
|
],
|
|
274
550
|
propNotes: {
|
|
275
551
|
rows: 'Satır dizisi; mount/filter akışlarının setter hedefi.',
|
|
552
|
+
legend: "{ show, position, orient, showValues }. position artık DÖRT yön: top | bottom | left | right (2026-08-27). Yana yaslanan legend her zaman dikey çizilir — yatay seçilse bile ezilir, çünkü yandaki yatay legend grafiğin üstüne biner. showValues YALNIZ pasta/halkada iş görür: seri adının yanına dilim değerini yazar.",
|
|
553
|
+
centerLabel: "{ show, text, subtext } — YALNIZ donut. text boş bırakılırsa dilim değerlerinin TOPLAMI yazılır (valueFormat uygulanır), yani 'ortadaki toplam' için ayrı bir setter gerekmez. Pastada delik olmadığı için görünmez ve panelde gizlidir.",
|
|
276
554
|
categoryField: 'Kategori ekseni alan adı (varsayılan "label").',
|
|
277
555
|
series: "[{ valueField, type?, axis?, color?, stack?, lowField/highField?, targetField? }] — yFields'ın yerini aldı.",
|
|
278
556
|
stackMode: 'none | stacked | percent.',
|
|
@@ -281,7 +559,10 @@ export const componentKnowledge = {
|
|
|
281
559
|
},
|
|
282
560
|
checkboxgroup: {
|
|
283
561
|
summary: 'Değeri DİZİ olan çoklu kutu grubu (multi-select’in liste hâlinde açılmış hâli).',
|
|
284
|
-
behavior: [
|
|
562
|
+
behavior: [
|
|
563
|
+
'Zorunluluk/en az-en çok seçim kuralları formun validations’ından gelir (required · minItems · maxItems).',
|
|
564
|
+
"focus/blur GRUP düzeyindedir: kutular arasında Tab'lamak ayrı olay üretmez, yalnız grubun dışına çıkılınca/girilince bir kez yayılır (otpinput deseniyle aynı)."
|
|
565
|
+
],
|
|
285
566
|
propNotes: {
|
|
286
567
|
value: 'string[] — akıştan gelen dizide string olmayan öğeler elenir.',
|
|
287
568
|
options: '[{ label, value }]; direction ile dikey/yatay dizilir.'
|
|
@@ -304,17 +585,42 @@ export const componentKnowledge = {
|
|
|
304
585
|
summary: 'Sandbox’lı dış sayfa gömme. javascript:/data:/vbscript:/file: şemaları engellenir.',
|
|
305
586
|
behavior: [
|
|
306
587
|
"isSandboxed (varsayılan AÇIK) allow-scripts allow-forms allow-popups verir ama allow-same-origin VERMEZ — gömülü sayfa uygulamanın çerezine/depolamasına erişemez.",
|
|
307
|
-
'
|
|
588
|
+
"load/error native <iframe> DOM olaylarından gelir. load ÇAPRAZ KAYNAKTA da güvenilir tetiklenir (tarayıcı frame'i okuyamasa bile yükleme bitince ateşler) ve 'yükleniyor' örtüsünü kapatır. error ise pratikte neredeyse hiç tetiklenmez — engellenen (X-Frame-Options/CSP) ya da 404 çapraz-kaynak sayfalar tarayıcıda genelde sessiz bir load'a döner; ağ hatası yakalamak için güvenilmez."
|
|
308
589
|
]
|
|
309
590
|
},
|
|
591
|
+
icon: {
|
|
592
|
+
summary: 'Tek glif çizer (TİPLİ stil modeli: yalnız hoverStyle): Material Symbols ya da Phosphor setinden ikon + boyut + semantik renk + isteğe bağlı arka plan çipi, köşe rozeti, döndürme/çevirme, spin animasyonu ve click/href etkileşimi.',
|
|
593
|
+
behavior: [
|
|
594
|
+
"İKON ADI iki biçim alır: Material Symbols snake_case adı ('shopping_cart', 'progress_activity', 'account_circle') ya da Phosphor 'ph-<ağırlık> ph-<ad>' çifti ('ph-bold ph-heart'; ağırlıklar: ph-light|ph-bold|ph-duotone|ph-fill|ph-thin|'ph-regular ph'). BİLİNMEYEN Material adı hata vermez, ligature çözülmediği için adın METNİ görünür — adı uydurma, bilinen bir addan emin ol.",
|
|
595
|
+
"RENK TEK KANALDIR: icon.color OKUNMAZ (yazma). Çip kapalıyken glif rengini color/customColor çifti verir; çip açıkken renk sahibi chipColor'dur — solid varyantta glif otomatik kontrast rengini, soft varyantta çip renginin kendisini alır ve panel glif renk satırlarını gizler.",
|
|
596
|
+
"SPIN ile döndürme/çevirme AYRIKTIR: isSpinning açıkken rotation/flipHorizontal/flipVertical uygulanmaz (ikisi aynı CSS transform'unu paylaşamaz); değerler silinmez, spin kapanınca geri döner.",
|
|
597
|
+
"ETKİLEŞİM: href doluysa kök gerçek <a> olur (isNewTabLink yeni sekmede açar) ve click olayı YİNE yayılır; href boş ama click olayı bağlıysa kök <button>tur; ikisi de yoksa salt görsel <div> kalır.",
|
|
598
|
+
"ERİŞİLEBİLİRLİK: ariaLabel doluysa okuyucular onu okur (salt görselde role=img). Boşsa salt görsel ikon okuyuculardan GİZLENİR; tıklanabilir/bağlantılı ikon ise adsız kalmasın diye ikon adından türetilen etiketi okur. Anlam taşıyan her ikona ariaLabel yaz.",
|
|
599
|
+
'BOYUT tema puntosunun katıdır: sm|md|lg|xl kademeleri --ng-font-size ile ölçeklenir (md varsayılan temada ~24px) ya da elle CSS değeri yazılır — çıplak sayı px sayılır. Elle değer tema yazı ölçeğini izlemez.'
|
|
600
|
+
],
|
|
601
|
+
propNotes: {
|
|
602
|
+
icon: "{ name } — yalnız ad okunur; renk color/chipColor kanallarından gelir (picker'ın renk bölümü bu komponentte kapalıdır).",
|
|
603
|
+
size: "sm|md|lg|xl (tema puntosuna oransal) YA DA CSS uzunluğu ('40px', '2.5em'); çıplak sayı px sayılır.",
|
|
604
|
+
color: "primary|info|success|warning|error|custom — çip kapalıyken glifin rengi; custom seçilirse customColor okunur. Semantik değer temayı izler, custom izlemez.",
|
|
605
|
+
chipShape: "none|circle|rounded|square — none dışında glifin arkasına renkli kutu açılır ve renk yönetimi chipColor'a geçer.",
|
|
606
|
+
chipVariant: 'solid (tam renkli zemin + otomatik kontrast glif) | soft (soluk zemin + renkli glif).',
|
|
607
|
+
badgeValue: "Köşe rozetinin metni ('3', '99+'); boşsa rozet çizilmez. badgeDot açıkken okunmaz — sayısız nokta çizilir.",
|
|
608
|
+
rotation: "0|90|180|270 (derece, metin değer). flipHorizontal/flipVertical ile birleşir; isSpinning açıkken üçü de uygulanmaz.",
|
|
609
|
+
href: "Adres ya da sayfa yolu — dolu ise ikon gerçek bağlantıdır; click olayı da yayılmaya devam eder.",
|
|
610
|
+
hoverStyle: STYLE_GROUP_NOTES.hoverStyle + ' borderColor alanı bu komponentte YOKTUR (kökte kenarlık yok).',
|
|
611
|
+
style: STYLE_GROUP_NOTES.styleEscape + " Parçalar: '&__chip' (zemin kutusu — 'none' kipinde de vardır) · '&__glyph' (glifin sarmalı) · '&__badge' (rozet)."
|
|
612
|
+
}
|
|
613
|
+
},
|
|
310
614
|
jsonviewer: {
|
|
311
|
-
summary: 'Bağlanan veriyi katlanabilir JSON ağacı olarak çizer (hata ayıklama/detay ekranı).
|
|
615
|
+
summary: 'Bağlanan veriyi katlanabilir JSON ağacı olarak çizer (hata ayıklama/detay ekranı).',
|
|
312
616
|
behavior: [
|
|
313
617
|
"data STRING gelir ve '{' ya da '[' ile başlarsa JSON olarak parse edilip ağaç çizilir — uçtan metin olarak dönen gövdeyi akışta ayrıca çözmeye gerek yok; parse edilemezse düz metin gibi gösterilir.",
|
|
314
618
|
'Boş veri (null · undefined · "" · {} · []) ağaç yerine emptyText satırını çizer ve araç çubuğu gizlenir.',
|
|
315
619
|
'expandDepth çalışma anında değişirse ağaç YENİDEN kurulur: elle açıp kapattıkların sıfırlanır, düğümler yeni derinliğe göre açılır.',
|
|
316
620
|
'Araç çubuğu (showToolbar) tümünü aç / tümünü kapat / JSON kopyala düğmeleridir; her düğümün kendi kopyala düğmesi de vardır. Kopyalama panoya güvenli bağlam ister; izin yoksa sessizce hiçbir şey olmaz.',
|
|
317
|
-
'60 karakteri aşan string yaprakları önizlemede kırpılır ("…"); yaprağa tıklamak tam değeri açar.'
|
|
621
|
+
'60 karakteri aşan string yaprakları önizlemede kırpılır ("…"); yaprağa tıklamak tam değeri açar.',
|
|
622
|
+
"nodeClick HER satırda (yaprak ya da object/array) tıklanınca yayılır — aç/kapa oku ayrı davranır, satırın geneline tıklamak nodeClick'i tetikler.",
|
|
623
|
+
"copy iki kaynaktan gelir: araç çubuğundaki 'tümünü kopyala' path:'' + kind:'root' + value:normalize edilmiş TÜM veriyle yayılır; düğümün kendi kopyala düğmesi ise o düğümün path/kind/value'suyla yayılır."
|
|
318
624
|
],
|
|
319
625
|
propNotes: {
|
|
320
626
|
data: 'Nesne/dizi ya da JSON metni; döngüsel referanslar "[Circular]" yaprağına düşer.',
|
|
@@ -328,11 +634,16 @@ export const componentKnowledge = {
|
|
|
328
634
|
behavior: [
|
|
329
635
|
"change olayında runtime machine.setLanguage(value) çağırır: seçim localStorage'a (zeyrek:{appSlug}:lang) yazılır ve çeviri bağlı bütün prop'lar SAYFA YENİLENMEDEN yeniden çözülür.",
|
|
330
636
|
'Projede dil tanımlı değilse liste boş çizilir — önce proje dillerini (Translations paneli) kur.'
|
|
331
|
-
]
|
|
637
|
+
],
|
|
638
|
+
guide: 'translation'
|
|
332
639
|
},
|
|
333
640
|
otpinput: {
|
|
334
641
|
summary: 'Tek haneli kutulardan oluşan tek kullanımlık kod girişi (2–12 hane); yapıştırma kutulara dağılır.',
|
|
335
|
-
behavior: [
|
|
642
|
+
behavior: [
|
|
643
|
+
'Bütün kutular dolduğunda change’e EK olarak complete olayı yayılır — doğrulama akışını buna bağla.',
|
|
644
|
+
"resend yalnız resendSeconds>0 iken görünen düğmeden gelir ve geri sayım bitmeden tıklanamaz; tetiklenince kendi geri sayımını yeniden başlatır.",
|
|
645
|
+
"focus/blur GRUP düzeyindedir (checkboxgroup deseniyle aynı): kutular arasında Tab'lamak olay üretmez, yalnız gruba giriş/çıkışta bir kez yayılır."
|
|
646
|
+
],
|
|
336
647
|
propNotes: {
|
|
337
648
|
value: 'Birleşik string; ortadaki kutu silinince sonraki haneler sola kayar.',
|
|
338
649
|
digitCount: '2–12 arası kutu sayısı.',
|
|
@@ -355,7 +666,10 @@ export const componentKnowledge = {
|
|
|
355
666
|
}
|
|
356
667
|
},
|
|
357
668
|
progress: {
|
|
358
|
-
summary: 'Çubuk ya da daire biçiminde ilerleme göstergesi; eşiğe göre renk değiştirir.
|
|
669
|
+
summary: 'Çubuk ya da daire biçiminde ilerleme göstergesi; eşiğe göre renk değiştirir.',
|
|
670
|
+
behavior: [
|
|
671
|
+
"complete yalnız yüzde 100'e İLK ULAŞTIĞINDA (kenar tetiklemesi) bir kez yayılır — her render'da değil; değer 100'ün altına inip yeniden çıkarsa tekrar yayılır. isIndeterminate:true iken hiç yayılmaz (belirsiz modda 'tamamlanma' tanımsızdır)."
|
|
672
|
+
],
|
|
359
673
|
propNotes: {
|
|
360
674
|
value: '0..max arası; yüzde kırpılarak hesaplanır.',
|
|
361
675
|
colorMap: '{ "0": "error", "50": "warning", "80": "success" } — yüzdeye eşit/altındaki EN BÜYÜK eşiğin rengi kazanır, yoksa color prop’u.'
|
|
@@ -363,7 +677,10 @@ export const componentKnowledge = {
|
|
|
363
677
|
},
|
|
364
678
|
rating: {
|
|
365
679
|
summary: 'Yıldız (ya da seçilen ikon) ile puanlama girişi.',
|
|
366
|
-
behavior: [
|
|
680
|
+
behavior: [
|
|
681
|
+
'Mevcut değere yeniden tıklamak puanı 0’a düşürür; allowHalf açıkken yıldızın sol yarısı yarım puan verir.',
|
|
682
|
+
"focus/blur yıldız GRUBUNUN tamamı için bir kez yayılır (tek bir role=\"slider\" kapsayıcıda dinlenir), yıldız başına değil."
|
|
683
|
+
],
|
|
367
684
|
propNotes: { value: '0..max arası sayı; akıştan gelen değer bu aralığa kırpılır.' }
|
|
368
685
|
},
|
|
369
686
|
result: {
|
|
@@ -372,7 +689,10 @@ export const componentKnowledge = {
|
|
|
372
689
|
},
|
|
373
690
|
slider: {
|
|
374
691
|
summary: 'minValue–maxValue arasında sayısal kaydırıcı (tek değer; iki tutamaklı aralık YOKTUR).',
|
|
375
|
-
behavior: [
|
|
692
|
+
behavior: [
|
|
693
|
+
'change sürüklerken sürekli, changed yalnız bırakıldığında yayılır — pahalı akışı changed’e bağla.',
|
|
694
|
+
"focus/blur GRUP düzeyindedir (checkboxgroup/otpinput deseni): input'un kendisi değil dıştaki kapsayıcı dinler, tek giriş/çıkışta bir kez yayılır."
|
|
695
|
+
],
|
|
376
696
|
propNotes: {
|
|
377
697
|
value: 'Sayı; akıştan gelen değer [minValue, maxValue] aralığına kırpılır (0 geçerli sınırdır).',
|
|
378
698
|
showTicks: 'datalist ile çentik gösterir (yalnız ≤50 çentikte).'
|
|
@@ -398,6 +718,18 @@ export const componentKnowledge = {
|
|
|
398
718
|
'Yan etiket (label) ve description YOKTUR — içerik iki segmentin kendi trueLabel/trueIcon ve falseLabel/falseIcon alanlarıdır.'
|
|
399
719
|
]
|
|
400
720
|
},
|
|
721
|
+
'theme-toggle': {
|
|
722
|
+
summary: 'Uygulamayı açık/koyu temaya çeviren tek düğme; tercih tarayıcıda kalıcıdır. Olay YAYMAZ.',
|
|
723
|
+
behavior: [
|
|
724
|
+
"Tıklama görünen modun TERSİNE yazar (viewerMode store'u) — proje varsayılanı koyuysa ilk tıklama açığa alır, kapatıp açmaya değil.",
|
|
725
|
+
"Seçim localStorage'a yazılır (language-selector'ın dil anahtarıyla aynı kalıcılık deseni) ve sayfa yenilenmeden temaya bağlı bütün stiller güncellenir.",
|
|
726
|
+
"Studio kanvasında tıklama ÇALIŞMAZ: _editorMode:true iken tıklama hiçbir şey yapmaz — tasarımcı düğmeyi sürüklerken/önizlerken uygulamanın temasını kazayla değiştirmesin diye."
|
|
727
|
+
],
|
|
728
|
+
propNotes: {
|
|
729
|
+
label: 'Boşsa yalnız ikon basılır; doluysa ikonun yanına metin de eklenir.',
|
|
730
|
+
isHidden: "Bu komponentin kataloğunda VAR — doğrudan şemaya yazılabilir (bkz. 'notification' propNotes'undaki karşıt örnek)."
|
|
731
|
+
}
|
|
732
|
+
},
|
|
401
733
|
timeline: {
|
|
402
734
|
summary: 'Durum renkli işaretçilerle tarihli olay listesi (audit-history’nin serbest veriyle çalışan genel hâli).',
|
|
403
735
|
behavior: [
|
|
@@ -413,7 +745,10 @@ export const componentKnowledge = {
|
|
|
413
745
|
},
|
|
414
746
|
timepicker: {
|
|
415
747
|
summary: 'Bağımsız saat seçici; değer tam olarak HH:mm biçimindedir.',
|
|
416
|
-
behavior: [
|
|
748
|
+
behavior: [
|
|
749
|
+
'minTime/maxTime dışındaki seçenekler listeden ATILMAZ, pasifleştirilir; minutesStep seçenek adımını belirler.',
|
|
750
|
+
"focus/blur GRUP düzeyindedir: paylaşılan Select kendi focus'unu yayar ama blur'ü yok, o yüzden ikisi de kapsayıcı üstünden köklendi — checkboxgroup/otpinput/slider ile aynı desen."
|
|
751
|
+
],
|
|
417
752
|
propNotes: { value: "'HH:mm' — Time doğrulamaları ve formun saat karşılaştırmaları bu biçimi bekler." }
|
|
418
753
|
},
|
|
419
754
|
toast: {
|
|
@@ -430,6 +765,115 @@ export const componentKnowledge = {
|
|
|
430
765
|
position: '9 çapa: top/bottom × left/center/right, center, top-full/bottom-full (tam genişlik bant).',
|
|
431
766
|
actions: '[{ text, flow, keepOpen, showCountdown }] — en çok 2 düğme.'
|
|
432
767
|
}
|
|
768
|
+
},
|
|
769
|
+
// — 2026-08-27 eşleme turu: components-new dalıyla gelen 6 yeni komponent.
|
|
770
|
+
// Kaynak: packages/ng-apps-ui/src/components/<ad>/{schema.ts,*.svelte,*-logic.ts} +
|
|
771
|
+
// zeyrek-frontend/docs/components/*.md. Bu kuşağın emit deseni ESKİSİNDEN FARKLIDIR:
|
|
772
|
+
// yük params ile DE gönderilir, akışta event.data.<anahtar> DOLU gelir — tekil sözleşmeler
|
|
773
|
+
// componentEvents.ts'te, bulgunun kaydı docs/20-komponent-bilgi-katmani.md §10'da.
|
|
774
|
+
detailview: {
|
|
775
|
+
summary: 'Tek kaydı etiket/değer ızgarası olarak basar; alan başına format (money/date/badge/link…) ve nokta ayraçlı iç içe alan yolu destekler. OLAY YAYMAZ.',
|
|
776
|
+
behavior: [
|
|
777
|
+
"Veri tek yönlü girer: record prop'u {{ }} ifadesiyle (sorgu çıktısı ya da tablonun selectedRow'u) ya da akıştaki setter ile beslenir; olay yolu yoktur — satır tıklaması gerekiyorsa tıklanabilir bir kapsayıcıya sar.",
|
|
778
|
+
"Boş nesne ({}) 'kayıt yok' sayılır ve emptyText basılır; geçerli kayıt olsa da fields boşsa yine boş durum çizilir. isLoading her dalı ezer ve alan başına iskelet gösterir.",
|
|
779
|
+
"fields[].field nokta ayraçlı iç içe yol alır (department.title, items.0.name); yol kopuksa hücre '-' basar, patlamaz.",
|
|
780
|
+
"format yalnız money/pertance/date/datetime'ı biçimler — 'number' ve 'text' ham String basar (84500 yerelleşmez). money her zaman TRY'dir; pertance (yazımı böyle) <1'i oran, >=1'i yüzde sayar; geçersiz tarih ham metne düşer.",
|
|
781
|
+
"locale boşken uygulama diline CANLI bağlıdır (dil değişince yeniden biçimler); size boş kaydedilir ve 'md' varsayılanı komponentin içinde çözülür.",
|
|
782
|
+
"columns çalışma anında 1-4 aralığına kırpılır; link formatı ham değeri hem href hem görünen metin yapar (şema doğrulaması yok — 'example.com' göreli URL olur)."
|
|
783
|
+
],
|
|
784
|
+
propNotes: {
|
|
785
|
+
record: 'Gösterilecek TEK kayıt (nesne); akıştan beslenecekse setter hedefi budur. Boş nesne = boş durum.',
|
|
786
|
+
fields: "[{ label, field, format, icon }] — field boş satırlar elenir, label boşsa field kullanılır, icon ETİKETİN yanına çizilir.",
|
|
787
|
+
labelPosition: "top (varsayılan) | left — left'te etiket sütunu minmax(96px, %38) ile ayrılır.",
|
|
788
|
+
emptyText: "Kayıt ya da geçerli alan yokken basılır; boşsa '—'."
|
|
789
|
+
}
|
|
790
|
+
},
|
|
791
|
+
eventcalendar: {
|
|
792
|
+
summary: 'Ay/hafta/gün görünümlü etkinlik takvimi. VERİ ÇEKMEZ: satırlar rows prop’una akışla yazılır; taşıma/oluşturmanın kalıcılığı akışın işidir.',
|
|
793
|
+
behavior: [
|
|
794
|
+
"TÜM olayların yükü yalnız params ile gider ve self'e YAZILMAZ: akışta event.data.<anahtar> ile okunur (eski komponentlerin self deseninin tersi).",
|
|
795
|
+
"Veri prop'u bilinçli olarak rows'tur, events DEĞİL — Studio kanvası 'events' adlı prop'u düğümün olay bağlarıyla ezer.",
|
|
796
|
+
"startField'ı geçersiz/boş satır SESSİZCE atılır; end geçersizse start'a eşitlenir, ters aralık start'a kırpılır; id yoksa event-<index> üretilir.",
|
|
797
|
+
"Taşıma iyimserdir: eventMove sonrası komponent rows'u DEĞİŞTİRMEZ; akış yeni tarihi uca yazıp rows'u tazeleyince (id:start:end imzası değişince) iyimser katman sıfırlanır — kalıcılaştırılmayan taşıma, veri değiştiği anda geri döner (kanban ile aynı sözleşme).",
|
|
798
|
+
"monthChange gezinme okları/Bugün ile HER görünümde yayılır (ilk mount'ta yayılmaz) ve month 1-TABANLIDIR — veri tazeleme akışı buna bağlanır.",
|
|
799
|
+
"isCreatable:true iken ay hücresi tıklaması dateClick YERİNE eventCreate yayar (start=end=o gün, allDay:true); hafta/gün boş slot tıklaması 60 dakikalık saatli eventCreate üretir. isCreatable kapalıyken slot tıklaması hiçbir şey yapmaz.",
|
|
800
|
+
"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.",
|
|
801
|
+
"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).",
|
|
802
|
+
"defaultDate ve defaultView yalnız İLK kurulumda okunur — sonradan prop değişse de takvim kımıldamaz.",
|
|
803
|
+
"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."
|
|
804
|
+
],
|
|
805
|
+
propNotes: {
|
|
806
|
+
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).',
|
|
807
|
+
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.",
|
|
808
|
+
maxVisibleEvents: 'Ay hücresinde görünen çip sayısı (varsayılan 3); fazlası +n olur.',
|
|
809
|
+
defaultDate: "Açılış ayı (yyyy-MM-dd; katalog varsayılanı örnek veriyle aynı ay olan '2026-08-01'). YALNIZ ilk kurulumda okunur.",
|
|
810
|
+
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).'
|
|
811
|
+
}
|
|
812
|
+
},
|
|
813
|
+
importwizard: {
|
|
814
|
+
summary: 'Üç adımlı CSV içe aktarma sihirbazı (dosya → kolon eşleme → önizleme); temiz ve hatalı satırları complete olayıyla akışa AYRI AYRI verir.',
|
|
815
|
+
behavior: [
|
|
816
|
+
"İçe aktarmayı komponent YAPMAZ: complete akışı satırları uca kendisi yazar (döngü/bulk adımı) — komponent yalnız ayrıştırır, eşler, doğrular. complete yükü hem self'e yazılır hem event.data ile gelir.",
|
|
817
|
+
"Kolon eşleme otomatiktir: TR harf katlamalı normalizasyon (ç→c, ı→i…) + önce field, sonra label tam eşleşmesi, sonra içerme; iki alan aynı kolonu isterse İKİSİ de eşlenmemiş kalır ve kullanıcı select ile elle düzeltir.",
|
|
818
|
+
"required alanları eşlenmeden önizlemeye geçilemez; required değeri boş satır rows'a girmez, errors'a düşer. maxRows aşımı satırı kırpmaz, hata kaydı üretir (0 = sınırsız).",
|
|
819
|
+
"Ayrıştırma yalnız UTF-8'dir (encoding seçeneği yok); BOM soyulur, tırnak/çift-tırnak kuralları ve tırnak içi ayraç/satır sonu desteklenir. delimiter 'auto' ilk satırdan tahmin eder; tamamen boş satırlar atılır, ilk kalan satır başlıktır.",
|
|
820
|
+
"Geri düğmesi durumu KORUR (parsed/mapping silinmez); ✕ düğmesi (cancel olayı) her şeyi sıfırlar.",
|
|
821
|
+
"Değerler her zaman STRING'dir — sayı/tarih dönüşümü akışta yapılır. total temiz satır + hata KAYDI sayısıdır: iki zorunlu alanı boş tek satır total'i iki artırır."
|
|
822
|
+
],
|
|
823
|
+
propNotes: {
|
|
824
|
+
targetFields: '[{ label, field, required }] — hedef şema; field boş satırlar elenir, otomatik eşleme label/field üzerinden yürür.',
|
|
825
|
+
maxRows: '0 = sınırsız; aşan TEMİZ satırlar hata kaydına dönüşür.',
|
|
826
|
+
isLoading: "Gövdeyi soluklaştırır ama düğmeleri kilitlemez; complete akışı sürerken setter ile true yaz."
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
kanban: {
|
|
830
|
+
summary: 'Satırları durum kolonlarında sürüklenebilir kart olarak dizen pano; her taşıma cardMove olayıyla akışa bildirilir, kalıcılık akışın işidir.',
|
|
831
|
+
behavior: [
|
|
832
|
+
"cardMove/cardClick yükü BİLİNÇLİ olarak yalnız params ile gider (self'e yazılsa id/from/to çöp prop olur ve tetiklenen render iyimser katmanı aynı karede silerdi): akışta event.data.id / .row / .from / .to ile okunur.",
|
|
833
|
+
"Taşıma iyimserdir: komponent rows'u DEĞİŞTİRMEZ; cardMove akışı yeni kolonu uca yazıp rows'u tazeler — (id:kolon) imzası değişince iyimser katman sıfırlanır. Kalıcılaştırılmayan taşıma, veri değiştiği anda eski kolonuna döner.",
|
|
834
|
+
"Kolon eşleşmesi columns[].value ile TAM string eşitliğidir; eşleşmeyen satır ilk kolona değil 'atanmamış' kuyruğuna düşer (kesikli kenarlık; yalnız doluyken çizilir, başlığı unassignedText).",
|
|
835
|
+
"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.",
|
|
836
|
+
"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.",
|
|
837
|
+
"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).",
|
|
838
|
+
"Sürükleme yerel HTML5 DnD'dir; klavyeyle taşıma yolu yoktur (Enter yalnız cardClick yayar). isLoading sürüklemeyi de kilitler."
|
|
839
|
+
],
|
|
840
|
+
propNotes: {
|
|
841
|
+
rows: 'Kart satırları; alan adları columnField/titleField/subtitleField/idField/colorField ile çözülür (nokta ayraçlı iç içe yol çalışır).',
|
|
842
|
+
columns: '[{ label, value, color, wipLimit }] — value boş kolonlar elenir; value satır eşleşmesinin anahtarıdır.',
|
|
843
|
+
isDraggable: 'Varsayılan açık; kapatınca pano salt okunur olur.'
|
|
844
|
+
}
|
|
845
|
+
},
|
|
846
|
+
signature: {
|
|
847
|
+
summary: 'El yazısı imza alanı: çizim pointer ile alınır (fare/dokunma/kalem tek yol), değer PNG data-URL ya da ham SVG string olarak change olayıyla yazılır.',
|
|
848
|
+
behavior: [
|
|
849
|
+
"change her tamamlanan ÇİZGİDE (pointer bırakılınca) yayılır, hareket sırasında değil; value hem self.value'ya yazılır (setter) hem event.data.value ile gelir. Temizleme önce change('') sonra clear (veri taşımaz) yayar.",
|
|
850
|
+
"outputFormat 'png' (varsayılan) base64 data-URL üretir; 'svg' HAM SVG işaretlemesi döner (data-URL DEĞİL) — kaydederken/gömerken ayrımı gözet. PNG üretimi başarısız olursa sessizce SVG metnine düşer.",
|
|
851
|
+
"Mevcut value yeniden düzenlemeye YÜKLENMEZ: data:image… ya da <svg ile başlayan değer arka planda resim olarak gösterilir, ilk yeni çizgi onu tamamen değiştirir — ekleme/undo yoktur.",
|
|
852
|
+
"Yeniden boyutlanma çizimi silmez ama mürekkep sol üst köşeye çapalı kalır (ölçeklenmez); bir sonraki çizgi güncel boyutla dışa aktarır.",
|
|
853
|
+
"Zorunluluk formun validations'ıyla kurulur (şemada isRequired yoktur). Ekran rengi penColor || tema metni, dışa aktarım rengi penColor || #111111 — tema değişkeni dışa aktarıma taşınmaz.",
|
|
854
|
+
"isDisabled/isReadonly/isViewmode üçü de kilitler; kilitliyken Clear düğmesi hiç çizilmez."
|
|
855
|
+
],
|
|
856
|
+
propNotes: {
|
|
857
|
+
value: "İmza string'i (PNG data-URL ya da SVG işaretlemesi); boş imza ''dir, null değil.",
|
|
858
|
+
outputFormat: "'png' | 'svg' — svg dışındaki her değer png sayılır.",
|
|
859
|
+
penWidth: "En az 1'e kırpılır; geçersiz değer 2'ye düşer."
|
|
860
|
+
}
|
|
861
|
+
},
|
|
862
|
+
stepper: {
|
|
863
|
+
summary: "Adımlı akış kabı: tabs gibi her adım kendi droppable görünümünü (children) taşır, ileri gidiş canProceed kapısıyla tutulur.",
|
|
864
|
+
behavior: [
|
|
865
|
+
"Kapı kuralı: canProceed yalnız false ya da 'false' iken engeller — undefined/''/çözülmemiş şablon dahil geri kalan her şey GEÇİRİR. Güvenilir bağ {{ form1.isValid === true }} biçimidir; çıplak {{ x.value }} ölçümde güvenilmez çıktı.",
|
|
866
|
+
"Adım tanımındaki canProceed bağı çalışma anında undefined çözülür (frontend CQ-117) — kapıyı ÜST DÜZEY canProceed prop'una bağla, adım tanımına statik değer dışında bir şey yazma.",
|
|
867
|
+
"stepChange {currentStep, previous} taşır ve currentStep self'e yazılır; validationFail YALNIZ İleri düğmesinden yayılır (engellenen başlık tıklaması sessiz kalır); finish son adımda kapı açıkken yayılır ve adımı DEĞİŞTİRMEZ.",
|
|
868
|
+
"Başlık tıklaması allowClickNavigation'a bağlıdır: none | backward (varsayılan; yalnız geri) | all. isLinear:true iken ileri sıçramak aradaki HER adımın optional olmasını ister.",
|
|
869
|
+
"Akıştan adım sürme: setter ile currentStep yaz — değer aralığa kırpılır. Hatalı/başarısız adım görseli yoktur; tek gösterge engellenmişken soluklaşan İleri düğmesidir.",
|
|
870
|
+
"Form validations sistemiyle entegrasyonu YOKTUR (kapı yalnız çözülen ifade değeridir); Studio kanvasında adımlar arası geçiş Element Tree üzerindendir."
|
|
871
|
+
],
|
|
872
|
+
propNotes: {
|
|
873
|
+
steps: "[{ title, description, icon, optional, canProceed }] — tabs'ın views deseni; her adım children'da kendi kapsayıcısını taşır.",
|
|
874
|
+
canProceed: "Aktif adımın kapısı; ifadeye bağlanır. Yalnız false/'false' engeller.",
|
|
875
|
+
currentStep: '0 tabanlı aktif adım; setter hedefi, aralık dışı değer kırpılır.'
|
|
876
|
+
}
|
|
433
877
|
}
|
|
434
878
|
};
|
|
435
879
|
export const knowledgeNote = 'knowledge alanı elle doğrulanmış davranış bilgisidir; kayıt yoksa davranış sözlüğe henüz işlenmemiştir — prop/olay semantiği tahmin etmeyin, gerekirse NgApps.UI kaynağına bakın.';
|