@appaflytech/zeyrek-ai-mcp 0.0.33 → 0.0.35
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 +0 -15
- package/dist/config.js +0 -11
- package/dist/index.js +0 -2
- package/dist/knowledge/boxSections.js +184 -0
- package/dist/knowledge/componentCatalog.js +634 -255
- package/dist/knowledge/componentEvents.js +38 -32
- package/dist/knowledge/layoutSummary.js +2 -140
- package/dist/knowledge/normalize.js +144 -117
- package/dist/knowledge/rules.js +42 -291
- package/dist/knowledge/styleResolve.js +53 -58
- package/dist/knowledge/themeResolve.js +4 -4
- package/dist/knowledge/themeSchema.js +2 -1
- package/dist/observability/trace.js +1 -1
- package/dist/platform/diagnostics.js +4 -10
- package/dist/platform/domSummary.js +1 -1
- package/dist/platform/http.js +7 -23
- package/dist/platform/responses.js +2 -6
- package/dist/platform/screenshot.js +1162 -0
- package/dist/platform/secrets.js +0 -9
- package/dist/platform/strictArguments.js +12 -68
- package/dist/platform/tokenVault.js +4 -187
- package/dist/resources/examples/layout-app-shell.json +707 -229
- package/dist/resources/examples/page-flex-sections.json +1 -1
- package/dist/resources/guides/component.md +6 -14
- package/dist/resources/guides/entity.md +5 -3
- package/dist/resources/guides/expressions.md +5 -14
- package/dist/resources/guides/functions.md +1 -1
- package/dist/resources/guides/layout.md +58 -55
- package/dist/resources/guides/microservice.md +2 -9
- package/dist/resources/guides/middleware.md +2 -34
- package/dist/resources/guides/page.md +179 -256
- package/dist/resources/guides/theme.md +3 -8
- package/dist/resources/guides/translation.md +1 -1
- package/dist/resources/guides/workflow.md +1 -7
- package/dist/resources/schema-fingerprint.json +4 -4
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -3
- package/dist/resources/schemas/MicroserviceDto.json +2 -2
- package/dist/server.js +1 -7
- package/dist/tools/applications.js +3 -60
- package/dist/tools/components.js +16 -103
- package/dist/tools/datasources.js +1 -1
- package/dist/tools/designSchemaPatch.js +19 -23
- package/dist/tools/externalComponents.js +4 -25
- package/dist/tools/flows.js +13 -80
- package/dist/tools/layouts.js +20 -48
- package/dist/tools/microservices.js +10 -32
- package/dist/tools/pages.js +115 -396
- package/dist/tools/platformInfo.js +2 -7
- package/dist/tools/rows.js +1 -7
- package/dist/tools/schemaOps.js +4 -35
- package/dist/tools/screenWrite.js +37 -25
- package/dist/tools/screens.js +4 -91
- package/dist/tools/variables.js +5 -11
- package/package.json +2 -2
- package/dist/knowledge/access.js +0 -802
- package/dist/knowledge/case.js +0 -41
- package/dist/knowledge/connectDataBind.js +0 -819
- package/dist/knowledge/connectDataDefinition.js +0 -341
- package/dist/knowledge/connectDataExecute.js +0 -93
- package/dist/knowledge/connectDataRules.js +0 -128
- package/dist/knowledge/decision.js +0 -121
- package/dist/knowledge/expressionPrelude.js +0 -59
- package/dist/knowledge/microserviceParameters.js +0 -58
- package/dist/knowledge/mining.js +0 -94
- package/dist/knowledge/mobileComponentCatalog.js +0 -864
- package/dist/knowledge/mobileComponentEvents.js +0 -239
- package/dist/knowledge/mobileStore.js +0 -227
- package/dist/knowledge/platform/lint.js +0 -385
- package/dist/knowledge/platform/mobile.js +0 -142
- package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
- package/dist/knowledge/platform/mobileRules.js +0 -231
- package/dist/knowledge/platform/mobileSpacing.js +0 -82
- package/dist/knowledge/platform/mobileTabs.js +0 -108
- package/dist/knowledge/platform/nativeBoxModel.js +0 -44
- package/dist/knowledge/platform/profile.js +0 -25
- package/dist/knowledge/platform/resolve.js +0 -122
- package/dist/knowledge/platform/web.js +0 -39
- package/dist/knowledge/process.js +0 -510
- package/dist/knowledge/rowFilter.js +0 -43
- package/dist/knowledge/styleResolveNative.js +0 -527
- package/dist/platform/argumentAliases.js +0 -128
- package/dist/platform/bodyFile.js +0 -103
- package/dist/platform/capture/actions.js +0 -333
- package/dist/platform/capture/browser.js +0 -1
- package/dist/platform/capture/capture.js +0 -659
- package/dist/platform/capture/console-log.js +0 -122
- package/dist/platform/capture/index.js +0 -11
- package/dist/platform/capture/readiness.js +0 -103
- package/dist/platform/capture/summary.js +0 -77
- package/dist/platform/capture/target.js +0 -5
- package/dist/platform/capture/targets/studio-mobile.js +0 -15
- package/dist/platform/capture/targets/studio-web.js +0 -5
- package/dist/platform/impersonation.js +0 -45
- package/dist/platform/jsonArray.js +0 -24
- package/dist/platform/schemaReadMemory.js +0 -60
- package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
- package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
- package/dist/resources/examples/bpm-satinalma.json +0 -376
- package/dist/resources/examples/connect-data-convert-verify.json +0 -107
- package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
- package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
- package/dist/resources/examples/connect-data-query-params.json +0 -50
- package/dist/resources/examples/connect-data-table-entity.json +0 -147
- package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
- package/dist/resources/examples/mobile-app-shell-drawer.json +0 -244
- package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
- package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
- package/dist/resources/examples/mobile-form-screen.json +0 -365
- package/dist/resources/examples/mobile-list-detail-form.json +0 -703
- package/dist/resources/guides/access.md +0 -796
- package/dist/resources/guides/bpm.md +0 -686
- package/dist/resources/guides/case.md +0 -153
- package/dist/resources/guides/decision.md +0 -185
- package/dist/resources/guides/mobile-layout.md +0 -193
- package/dist/resources/guides/mobile.md +0 -578
- package/dist/resources/read.js +0 -41
- package/dist/resources/schemas/AccessExplanationDto.json +0 -144
- package/dist/resources/schemas/AccessMatrixDto.json +0 -170
- package/dist/resources/schemas/AccessPermissionDto.json +0 -57
- package/dist/resources/schemas/AccessPolicyDto.json +0 -223
- package/dist/resources/schemas/AccessResourceDto.json +0 -86
- package/dist/resources/schemas/AppSessionDto.json +0 -53
- package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
- package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
- package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
- package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
- package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
- package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
- package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
- package/dist/resources/schemas/DecisionDto.json +0 -302
- package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
- package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
- package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
- package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
- package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
- package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
- package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
- package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
- package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
- package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
- package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
- package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
- package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
- package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
- package/dist/resources/schemas/StartMobileBuildCommand.json +0 -54
- package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
- package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
- package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +0 -259
- package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
- package/dist/tools/accessOperations.js +0 -135
- package/dist/tools/accessPolicies.js +0 -170
- package/dist/tools/accessRuntime.js +0 -203
- package/dist/tools/bpm.js +0 -343
- package/dist/tools/bpmGovernance.js +0 -266
- package/dist/tools/bpmOperations.js +0 -230
- package/dist/tools/bpmReporting.js +0 -154
- package/dist/tools/bpmRouting.js +0 -150
- package/dist/tools/bpmRuntime.js +0 -396
- package/dist/tools/case.js +0 -178
- package/dist/tools/caseRuntime.js +0 -89
- package/dist/tools/connectData.js +0 -449
- package/dist/tools/connectors.js +0 -193
- package/dist/tools/decisions.js +0 -206
- package/dist/tools/mobile.js +0 -221
- package/dist/tools/mobileStore.js +0 -268
- package/dist/tools/modules.js +0 -48
- package/dist/tools/organizationStructure.js +0 -137
- package/dist/tools/profileWrite.js +0 -92
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
export const TABLE_COLUMN_TYPE_NOTE = "KOLON TİPİ SÖZLÜĞÜ (bekler → çizer). " +
|
|
19
19
|
"text/long-text: metin → düz metin (long-text hücreye sığdırıp kırpar). " +
|
|
20
20
|
"number/time: sayı ya da metin → olduğu gibi. " +
|
|
21
|
-
"money: sayı →
|
|
21
|
+
"money: sayı → para biçimi, ayıraçlar dile göre (tr '₺1.250,00', en '₺1,250.00'); para birimi kolonun currency alanından gelir (ISO 4217: 'USD' → en '$1,250.00', tr '$1.250,00'), boş ya da geçersiz değer TRY'ye düşer. " +
|
|
22
22
|
"pertance: SAYI → yüzde metni; 0..1 arası değer ORAN sayılıp 100'le çarpılır, 1'den büyük değer zaten yüzdedir (tam 1 = %100). Çubuk ÇİZMEZ — çubuk için progress. " +
|
|
23
23
|
"progress: ham sayı → hücrede oransal çubuk (value/max, max varsayılanı 100); progressVariant/progressLabel/progressColor/thresholds ile ayarlanır. " +
|
|
24
24
|
"date/datetime: ISO metni ya da Date → dile göre biçimli tarih (locale prop'undan). " +
|
|
@@ -32,9 +32,9 @@ export const TABLE_COLUMN_TYPE_NOTE = "KOLON TİPİ SÖZLÜĞÜ (bekler → çiz
|
|
|
32
32
|
"tags: [{ value, color }] dizisi ya da metin dizisi → çok rozet, renk SATIR VERİSİNDEN (serbest hex burada geçer), sığmayanlar +N ile toplanır. " +
|
|
33
33
|
"action: veri kolonu DEĞİL — aksiyon sütunu ayrı çizilir; kolon tanımında seçilirse ham değer metin olarak görünür.";
|
|
34
34
|
export const STYLE_GROUP_NOTES = {
|
|
35
|
-
surfaceStyle: "{ background, radius, borderTop, borderRight, borderBottom, borderLeft, shadow, contentOverflow(visible|hidden|auto), opacity(0–100 yüzde; 100/boş yazılmaz)
|
|
36
|
-
typographyStyle: "{ textColor, fontFamily('var(--ng-font)' tema gövde | 'var(--ng-font-heading)' tema başlık | 'monospace' — token tema fontunu izler; serbest
|
|
37
|
-
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.",
|
|
35
|
+
surfaceStyle: "{ background, radius, borderTop, borderRight, borderBottom, borderLeft, shadow, contentOverflow(visible|hidden|auto), opacity(0–100 yüzde; 100/boş yazılmaz) }. 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).",
|
|
36
|
+
typographyStyle: "{ textColor, fontFamily('var(--ng-font)' tema gövde | 'var(--ng-font-heading)' tema başlık | 'monospace' — token tema fontunu izler; SİSTEM fontları ('Georgia, serif', 'Courier New, monospace') olduğu gibi uygulanır, serbest WEB fontu (Google) ise YÜKLENMEZ: tema yüklemediği için tarayıcı yedek yazı tipine 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|start|end — left/right FİZİKSELDİR, dir=rtl'de de aynı yöne yazar; start/end MANTIKSALDIR, yazı yönüne göre döner (LTR'de sol/sağ, RTL'de sağ/sol): çok dilli ya da ar/RTL uygulamada start/end yaz) }. Komponentin içeriğine miras kalır.",
|
|
37
|
+
hoverStyle: "{ background, borderColor, shadow(none|sm|md|lg), lift(CSS uzunluğu: '2px' — POZİTİF değer öğeyi yukarı kaldırır, '-2px' aşağı iter), transitionMs }. Hiçbir alan dolu değilse hover bloğu ve geçiş HİÇ yazılmaz.",
|
|
38
38
|
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).",
|
|
39
39
|
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)."
|
|
40
40
|
};
|
|
@@ -51,6 +51,8 @@ const NODE_SURFACE_NOTE = STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOT
|
|
|
51
51
|
" Bu bileşen grubu KENDİ OKUMAZ: render katmanı yüzeyi düğüm kutusuna (.ng-app__node-item) yazar, contentOverflow kutunun kendisine iner. Eski appearance Surface alanları (background/borderWidth/radius/shadow/opacity/overflow) EMEKLİ — yeni karar buraya yazılır.";
|
|
52
52
|
/** layout ve navigations'ın ORTAK menü satırı grubu (frontend style-group-schemas.ts navigationStyleGroup + navigation-style-logic.ts). */
|
|
53
53
|
const NAVIGATION_STYLE_NOTE = "Menü satırlarının TİPLİ grubu, menünün TAMAMINA uygulanır: padding (CSS kutu kısayolu; sol değer satırın derinlik girintisiyle TOPLANIR), radius (tema kademesi 'sm|md|lg|pill' ya da CSS), textColor · iconColor · hoverBackground (seçili OLMAYAN satırlar), activeBackground · activeTextColor · activeIconColor (seçili satır; zemin hover'da da korunur). Boş iconColor yazı rengini izler. Renkler hex ya da var(--ng-…) token'ı alır. ÖĞE BAZLI STİL YOKTUR: navigations[].style diye bir alan tanımlı değil, yazılan değer sessizce düşer — satır görünümünü yalnız bu grup verir. Grubun yazmadığı CSS için style'ın &__item / &__item--active / &__icon parçaları kullanılır (yalnız navigations bileşeninde; layout'un style'ı menüye ulaşmaz). resolvedStyle raporu bu grubu İÇERMEZ.";
|
|
54
|
+
/** Yerleşim grubunu taşıyan kapların ORTAK notu (container, box, box-section, aibox, form — ADR 0003, QA CT-001). */
|
|
55
|
+
const LAYOUT_ABSENT_NOTE = "EKSİK ANAHTAR VARSAYILAN DEĞİLDİR: layout prop'u hiç yazılmamışsa renderer IZGARA çizer, wrap hiç yazılmamışsa SARMAZ (flex-layout.ts, eski kayıtlar için). Şema varsayılanları (flex, wrap açık) yalnız Studio'da sürüklenip kurulan düğüme materyalize olur; page_schema_patch ile kurduğun kapta flex akış istiyorsan layout:'flex', sarma istiyorsan wrap:true'yu AÇIKÇA yaz. Studio paneli 2026-09-30'dan beri eksik anahtarı ekranla aynı gösterir (Grid / Wrap kapalı; designer.absent).";
|
|
54
56
|
export const componentKnowledge = {
|
|
55
57
|
html: {
|
|
56
58
|
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. KAPSAYICI DEĞİLDİR: içine komponent bırakılamaz, içeriği markup’ının kendisidir.',
|
|
@@ -65,13 +67,19 @@ export const componentKnowledge = {
|
|
|
65
67
|
"Script'ler flow ifade bağlamına (Page, Steps, komponent adları) erişemez; köprü yalnız fireEvent (dışarı) ve context (içeri).",
|
|
66
68
|
"Şema olayı yalnız mount'tur; aksiyonlar set_event ile DEĞİL kendi flow prop'uyla bağlanır (type:'flow', ref:<flowId>).",
|
|
67
69
|
'isLoading açıkken içeriğin YERİNE nabız atan bir iskelet bloğu çizilir ve satır içi script’ler çalışmaz; kapanınca aynı içerik için baştan çalışırlar. mount + setter ile veri çeken ekranda "veri gelene kadar ne görünsün" cevabı budur.',
|
|
68
|
-
'Temizlenmiş prop kırmaz: content boş
|
|
70
|
+
'Temizlenmiş prop kırmaz: content null/undefined olduğunda komponent boş çizer, sayı ve boolean metne çevrilip basılır (0 ve false dahil), context nesne değilse boş sözlük sayılır — hata atmaz.',
|
|
71
|
+
"content HİÇ yazılmamışsa (props: {}) düğüm BOŞ çizilir: kayıttaki <p>HTML Content</p> varsayılanı yalnız Studio'da tuvale bırakılan düğüme yazılır. MCP ile eklerken content'i her zaman yaz.",
|
|
72
|
+
"KUTU İÇERİĞİ KIRPMAZ: sabit yükseklikli düğümde uzun bir tablo ya da 300 karakterlik boşluksuz kelime kutudan taşar ve komşuyu örter (overflow: visible). Kaydırmak ya da kesmek için surfaceStyle.contentOverflow: 'auto' | 'hidden' yaz (ikisi de ölçüldü).",
|
|
73
|
+
"Yazı rengi: markup renk yazmıyorsa tema kökünün metin rengini (--ng-text-primary) miras alır ve koyu temada da okunur; bir kabın (box/container) typographyStyle.textColor'ı bu mirası değiştirir, style'daki color (kök ya da iç seçici) her zaman kazanır. Açık temada varsayılan metin #262626'dır.",
|
|
74
|
+
"Çıplak <p>, başlık, bağlantı ve düğme etiketleri studio'nun Carbon global stilini taşır: <p> kökün font-size/line-height'ını MİRAS ALMAZ (16px/1.5, kök 19px/1.7 olsa bile). Kök boyunu p'ye indirmek için style'a `& p { font-size: inherit; line-height: inherit }` yaz.",
|
|
75
|
+
"@keyframes adları sayfa genelinde ORTAKTIR (kapsamlanmaz): iki html düğümü aynı adı kullanırsa çakışır — adı düğüme özgü yap (pulse-hero gibi).",
|
|
76
|
+
"Tekrarlayıcı (repeater) içindeki html'e satır verisi context: { type: 'code', ref: '{{ item }}' } ile geçer; content'te {{ alan }} ile okunur (satırda iç içe nesne varsa o alanı bir seviye düzleştir: iç içe nesneler bileşene boş gelir, CQ-276). context'in iç değerlerine { type: 'translation', ref } da yazılabilir; dil değişince yeniden çözülür."
|
|
69
77
|
],
|
|
70
78
|
propNotes: {
|
|
71
79
|
surfaceStyle: NODE_SURFACE_NOTE,
|
|
72
|
-
content: "Ham HTML ya da Mustache şablonu. type:'code' + {{ }} ifadesiyle dinamik de beslenebilir.",
|
|
80
|
+
content: "Ham HTML ya da Mustache şablonu. type:'code' + {{ }} ifadesiyle dinamik de beslenebilir. HİÇ yazılmamışsa düğüm boş çizilir — her zaman yaz. {{ ad }} HTML'i kaçışlar, {{{ ad }}} kaçışsız basar (içerik güvenilir değilse üçlüyü kullanma).",
|
|
73
81
|
context: 'Mustache değişken sözlüğü (nesne). Setter ile yazmak içeriği yeniden render eder.',
|
|
74
|
-
style: "emotion css() bloğu: iç seçiciler
|
|
82
|
+
style: "emotion css() bloğu, DÜZ CSS METNİ olarak yazılır: iç seçiciler, &:hover, :focus-visible, ::first-letter, @media ve @keyframes çalışır; üretilen sınıf komponente scope'ludur (@keyframes adı hariç). page_schema_patch'in 'style NESNE olmalı' (PAGE-014) uyarısı html için GEÇERSİZDİR. Nesne biçiminde PascalCase Webkit* anahtarı kayıtta sessizce düşer (silentlyDropped; 2026-10-04'te ölçüldü); tarayıcı öneki gerekiyorsa düz CSS metni yaz.",
|
|
75
83
|
actions: "[{ key, text, flow }] — key fireEvent adıdır (text'ten snake üretilir), flow çalıştırılacak akıştır.",
|
|
76
84
|
isLoading: 'Yükleme iskeleti anahtarı. Geri YAZILMAZ (komponentin change olayı yok), yalnız akış sürer: fetch öncesi setter ile aç, veriyi context’e yazan setter’dan sonra kapat.'
|
|
77
85
|
}
|
|
@@ -130,8 +138,9 @@ export const componentKnowledge = {
|
|
|
130
138
|
form: {
|
|
131
139
|
summary: "Alanları saran kapsayıcı; gönderimde her alanın kendi kurallarını ve formun kendi form düzeyi kurallarını koşar, hepsi geçince submit yayar, hataları errorElementId'deki form-validation-errors listesinde toplar; toplu değeri (value) ve geçerliliği (isValid) çalışma zamanında kendi düğümüne yazar.",
|
|
132
140
|
behavior: [
|
|
141
|
+
LAYOUT_ABSENT_NOTE,
|
|
133
142
|
"GÖNDERİM: submit yalnız bütün kurallar geçince yayılır; kalırsa alanlar işaretlenir, liste dolar ve sayfa listeye kayar. Alan mesajları formun İLK gönderiminden sonra görünür, o andan itibaren her change o alanı canlı yeniden doğrular. Formu gönderen düğme Type='submit' olur (form içinde ya da formId ile bağlı); akışta event.source.id gönderen düğmenin ADI, event.source.props onun prop'larıdır — event.data boştur (componentEvents).",
|
|
134
|
-
"value ve isValid RUNTIME YAZAR, panelde çizilmez (2026-09-18): Page.components.<form>.value = { <alan adı>: değer } — yalnız doğrulama sözlüğündeki alan bileşenleri girer (text/button gibi gösterim düğümleri girmez), boş alan null, aralık seçici { valueFrom, valueTo }; gönderim akışında self.value ile de okunur ve uca
|
|
143
|
+
"value ve isValid RUNTIME YAZAR, panelde çizilmez (2026-09-18): Page.components.<form>.value = { <alan adı>: değer } — yalnız doğrulama sözlüğündeki alan bileşenleri girer (text/button gibi gösterim düğümleri girmez), boş alan null, aralık seçici { valueFrom, valueTo }; gönderim akışında self.value ile de okunur. DİKKAT (ölçüldü 2026-10-03): bu toplu değer boolean ve sayı alanlarında false/0'ı '' taşır — uca form.value/self.value ile VERME: nullable kolon NULL'lanır (kayıttaki 7/true silinir), NOT NULL kolonda 400 RowValidationFailed. Uca her alanı KENDİ prop'undan gönder (property ref ya da Page.components.<alan>.value); form resetForm ya da isClearFormInputsAfterSubmit kullanıyorsa sıfırlama alanın prop'unu da ''ya çevirir, o durumda değeri zorla: boolean <alan>.value === true, sayı typeof <alan>.value === 'number' ? <alan>.value : null. required da değeri aynı biçimde okur: 0 ve false BOŞ sayılır (bileşen notlarına bak). Page.components.<form>.isValid mount'ta ve her değişimde SESSİZCE yeniden hesaplanır (form düzeyi kurallar dahil) — mesaj göstermez. GİZLİLİK MUAFİYETİ YALNIZ ALANIN KENDİ isHidden'ıdır: isHidden'lı bir kabın (container/box) ya da appearance.hideOn ile gizlenen kabın içindeki zorunlu alan doğrulanmaya devam eder, ekranda olmadığı hâlde hata listesine girer ve gönderimi KİLİTLER; form düzeyi kural (validations element) hedefi kendisi gizli olsa bile koşar. Koşullu bölümde zorunlu alanların her birine kendi isHidden koşulunu ver, kabı gizlemeye güvenme. isHidden bir ifadeye ({{ }}) bağlıysa isValid bir adım geriden gelebilir (gönderim gizliliği canlı okur); gizli alanların değeri value'da kalır (ölçüldü 2026-10-03); submit düğmesini {{ !Page.components.<form>.isValid }} ile kilitlemenin yolu budur. İkisini setter ile YAZMA, sonraki değişimde ezilir.",
|
|
135
144
|
"Düzen prop grubunun TAMAMINI taşır (2026-09-01): layout ('flex' | 'grid') + direction/horizontalAlign/verticalAlign/size/gap/wrap, varsayılanları container ile aynı (flex · row · left · top · shrink · medium · wrap açık). 'Form'a layout yazılmaz' eski bilgidir. layout prop'u hiç yazılmamış eski form kayıtları ızgara koordinatıyla (blocks[].position + size.w) dizilmeye devam eder. Platform kataloğu component_get'te hâlâ eski şemayı gösteriyorsa kayıt yenilenmemiştir (ARC-024).",
|
|
136
145
|
"Alan doğrulaması komponentin kendi validations dizisindedir: [{ type: 'required'|'email'|'max-length'…, message, value, isActive }] — dördü de zorunlu, eski 'maxLength' yazımı kaydedilir ama runtime doğrulayıcı onu TANIMAZ ve sessizce hiçbir şey doğrulamaz. min-value/max-value tarih kuralının çıplak 'yyyy-MM-dd' değeri YEREL gün okunur (2026-09-18): sınır gününe eşit bir alan değeri her saat diliminde geçer (eskiden UTC okunup Türkiye'de 3 saat kayıyordu, CQ-252).",
|
|
137
146
|
"message bir ÇEVİRİ ANAHTARI olabilir: 't:' önekiyle yazılan mesaj (ör. 't:form.required') uygulamanın çeviri sözlüğünden çözülür — hem alanın kendi hata metninde hem form-validation-errors listesinde. Öneksiz mesaj yazarın kendi cümlesidir ve iki nokta içerse bile aynen gösterilir. Çözüm form MOUNT olurken bir kez yapılır: ekranda hata dururken dil değiştirilirse metin sayfa yenilenene kadar eski dilde kalır.",
|
|
@@ -145,39 +154,53 @@ export const componentKnowledge = {
|
|
|
145
154
|
validations: "FORM DÜZEYİ kurallar — alanın kendi validations dizisi DEĞİL: [{ name, element, condition, message }]. condition bir ifade ya da fx bağıdır ve TRUE olunca kural KIRILMIŞ sayılır ('table1.rows.length <= 0', 'Page.components.end.value < Page.components.start.value'); element (elementId) işaretlenir, message (t: anahtarı olabilir) listeye o alanın etiketiyle girer. İŞARET ve MESAJ yalnız gönderimde; koşulun kendisi isValid için her alan değişiminde sessizce yeniden değerlendirilir (formun dışındaki bir düğüme bağlı koşul — 'table1.rows.length' gibi — yalnız o anlarda ve gönderimde okunur). Repeater içindeki form için value/isValid tanımsızdır (satır parametresi taşımaz).",
|
|
146
155
|
title: "Başlık bandının metni; boş bırakılırsa bant ve alt çizgisi hiç çizilmez.",
|
|
147
156
|
isLoading: "Açıkken alanlar yerine yükleme animasyonu — çocuklar DOM'dan kalkar, kapanınca yeniden mount olur (mount olayları ikinci kez çalışır). Sorgu sonucu gelene kadar formu kapatmak için akıştan açılıp kapatılır.",
|
|
148
|
-
value: "RUNTIME YAZAR, okunur: { <alan adı>: değer } — alan adı düğümün name'i, boş alan null, aralık seçici { valueFrom, valueTo }; gösterim düğümleri girmez. Panelde görünmez, setter ile yazılmaz.",
|
|
149
|
-
isValid: "RUNTIME YAZAR, okunur: bütün alan kuralları ve form düzeyi kurallar şu an geçiyor mu. Mount'ta ve her değişimde sessizce güncellenir, mesaj göstermez;
|
|
157
|
+
value: "RUNTIME YAZAR, okunur: { <alan adı>: değer } — alan adı düğümün name'i, boş alan null (boolean/sayı alanında false/0 da '' olur — uca verme, behavior'a bak), aralık seçici { valueFrom, valueTo }; gösterim düğümleri girmez. Panelde görünmez, setter ile yazılmaz.",
|
|
158
|
+
isValid: "RUNTIME YAZAR, okunur: bütün alan kuralları ve form düzeyi kurallar şu an geçiyor mu. Mount'ta ve her değişimde sessizce güncellenir, mesaj göstermez; yalnız KENDİ isHidden'ı açık alanlar muaf — gizli kabın içindeki alan muaf değil."
|
|
150
159
|
}
|
|
151
160
|
},
|
|
152
161
|
box: {
|
|
153
162
|
summary: "Evrensel bırakma kutusu: container'dan farkı kutu modelinin border-box olması ve isteğe bağlı başlık/altlık bölgeleridir; yerleşim değer kümesi 2026-09-02'den beri container'ınkiyle aynıdır.",
|
|
154
163
|
behavior: [
|
|
164
|
+
LAYOUT_ABSENT_NOTE,
|
|
155
165
|
"layout iki değer alır: 'flex' (akış) ve 'grid' — ve 'grid' container'ınkiyle AYNI ŞEYDİR: mutlak koordinatlı 12 kolon canvas (kullanıcı kararı 2026-09-02, tek grid kavramı). Şemadaki eski 'cssgrid' değeri (akan GERÇEK display:grid) seçenek olmaktan çıktı: yeni yazımda geçmez (invalid-enum-value), yalnız o değerle KAYITLI eski düğümler çizilmeye devam eder (screen-builder/grid-layout.ts isCssGridLayout yalnız 'cssgrid'e bakar).",
|
|
156
166
|
"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).",
|
|
157
|
-
"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 — TEK İSTİSNA bölge açılınca tohumlanan varsayılan metindir: dokunulmadıysa bölgeyle birlikte silinir (ölçüldü 2026-09-18), düzenlendiyse o da taşınır.",
|
|
167
|
+
"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 — bayrak tek başına bir şey çizmez, bölge o düğümdür. page_schema_patch / layout_schema_patch bayrağı gördüğünde eksik bölge düğümünü gateway KENDİSİ ekler (QA BX-002, 2026-09-30; öncesinde bayrak yazılıyor ama bölge hiç çizilmiyordu), yanıttaki gatewayNormalized söyler; bölge kapatılınca içindeki çocuklar SİLİNMEZ, gövdeye taşınır — TEK İSTİSNA bölge açılınca tohumlanan varsayılan metindir: dokunulmadıysa bölgeyle birlikte silinir (ölçüldü 2026-09-18), düzenlendiyse o da taşınır.",
|
|
158
168
|
"KANVASTA BIRAKMA ALANI HİÇBİR DURUM PROP'UYLA ÖLMEZ (2026-09-18, CQ-308): isLoading gövdeyi gizler (opacity 0 + pointer-events none) ama yalnız çalışma anında/önizlemede — editörde (_editorMode) sadece yükleyici çizilir ve tasarımcı kutunun içine bileşen bırakmaya devam eder. Yükleyici akış DIŞINDA konumlandırılmış bir kaplamadır ve pointer-events:none ile tıklamayı geçirir; aksi hâlde kutunun üst şeridindeki bırakmayı yiyordu.",
|
|
169
|
+
"MOBİL TUZAĞI container ile aynıdır: flex çocukları telefonda ALT ALTA DÜŞMEZ (mobil kural yalnız ızgarayı yığar); satır yönündeki box 375px'te çocuklarını yan yana sıkıştırır. Telefonda yığılması gereken içerik için direction:'column' (box'ın varsayılanı) ya da layout:'grid' kullan. Sabit heightString mobilde ızgara kuralıyla sıfırlanır (qa-box-01 375 ölçümü: 200px → içerik boyu).",
|
|
159
170
|
"Kanvas toolbar'ında dört düğme vardır (2026-09-18): Has header · Has footer · Loading · Is hidden. Yerleşim kontrollerini kanvasın kendi kap toolbar'ı çizer, designer.toolbar'a hiçbir yerleşim prop'u girmez.",
|
|
160
171
|
"gridColumns/gridTemplate/gridRowGap ARTIK YALNIZ eski 'cssgrid' düğümlerinde okunur: o modda çocuğun blocks[].size.w'si 'grid-column: span N'e çevrilir ve gridTemplate doluysa gridColumns yok sayılır (şablon geçersizse kolon sayısına düşülür). layout:'grid' seçilen yeni kutuda bu üç prop ÖLÜDÜR — kolon payı yine blocks[].size.w'den gelir.",
|
|
161
172
|
"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ı."
|
|
162
173
|
],
|
|
163
174
|
propNotes: {
|
|
164
175
|
layout: "'flex' | 'grid' (2026-09-02'ye kadar ikinci değer 'cssgrid' idi). Diğer altı yerleşim prop'u yalnız 'flex' iken okunur; 'grid' container'ın mutlak 12 kolon canvas'ıdır ve çocuk ölçüsü blocks[].size'dan gelir.",
|
|
176
|
+
direction: "'row' | 'column'. Şema varsayılanı 'column' (kutunun sezgisi dikey yığın) AMA bu değer yalnız Studio'da sürüklenen düğüme yazılır; prop hiç yazılmamışsa SATIR çizilir (flex-layout.ts FLEX_ABSENT_PROPS, QA BX-001). page_schema_patch ile dikey yığın istiyorsan direction:'column'u AÇIKÇA yaz. Studio paneli ve kanvas araç çubuğu eksik yönü 2026-09-30'dan beri satır gösterir — ekranla aynı.",
|
|
177
|
+
hasHeader: "true → gateway kutunun İLK çocuğu olarak '<kutu>_header' elementId'li bir box-section düğümü ekler (ad alınmışsa _2, _3…). Başlık içeriğini add_component parent: '<kutu>_header' ile o düğüme koy; aynı çağrıda kutuyu ekleyen op'un ardından da hedeflenebilir. false → bölgenin çocukları gövdenin BAŞINA taşınır (silinmez), bölge düğümü kaldırılır.",
|
|
178
|
+
hasFooter: "true → '<kutu>_footer' box-section düğümü kutunun SON çocuğu olarak eklenir; içerik add_component parent: '<kutu>_footer'. false → çocuklar gövdenin SONUNA taşınır, bölge kaldırılır.",
|
|
179
|
+
horizontalAlign: "left | center | right | stretch. DİKKAT — box'ın varsayılan yönü SÜTUN olduğu için yatay hiza varsayılanda ÇAPRAZ eksendir (align-items), container'da (satır) ana eksendir. direction column + right: çocuklar sağa yaslanır (qa-box-01 bx_mid, x=951/1432). direction row iken ana eksen (justify-content); stretch ana eksende space-between, çaprazda tam doldurma. Yalnız layout flex iken okunur.",
|
|
180
|
+
verticalAlign: "top | middle | bottom | stretch. Box'ın varsayılan SÜTUN yönünde ANA eksendir (justify-content): middle çocukları dikeyde ortalar — ama kutunun yüksekliği içerikten geliyorsa dağıtacak boşluk yoktur, appearance.heightType fixed + heightString gerekir (bx_mid 200px'te çocuklar 38–154px). direction row iken çapraz eksen (align-items). Yalnız layout flex iken okunur.",
|
|
181
|
+
size: "'shrink' (çocuklar içerik/blok payı kadar) | 'grow' (flex: 1 1 auto, çocuklar kalan boşluğu paylaşır). Yazılmamışsa shrink. Yalnız layout flex iken okunur.",
|
|
182
|
+
gap: "none | small | medium (varsayılan) | large → 0 / var(--ng-spacing-sm) / --ng-spacing-md / --ng-spacing-lg (varsayılan temada 8/16/32px). allowCustom: '40px' gibi ham CSS de geçer (bx_gap ölçümü gap:40px). layout:'grid' (mutlak ızgara) iken ETKİSİZDİR ve panelde gizlenir; flex'te ve eski 'cssgrid' düğümlerinde etkilidir.",
|
|
183
|
+
wrap: "Satıra sığmayan çocuğu alt satıra atar. Varsayılan AÇIK ama yalnız Studio'da kurulan düğüme yazılır; prop hiç yazılmamışsa SARMAZ (nowrap) — page_schema_patch ile sarma istiyorsan wrap:true yaz. Kapalı satırda taşan çocuk gövdenin overflow:hidden'ı yüzünden KESİLİR (bx_nowrap: 4×400px, 4. çocuk görünmüyor). Sütun yönünde pratikte etkisizdir.",
|
|
184
|
+
isHidden: "Ortak katman görünürlüğü (RenderComponent okur): true iken kutu ve bütün çocukları DOM'a hiç girmez (bx_hidden ölçümü). Kanvas toolbar'ında tek tıkla açılır.",
|
|
165
185
|
gridTemplate: "Serbest grid-template-columns metni; beyaz listeden geçmeyen değer sessizce yok sayılır ve gridColumns geçerli olur. YALNIZ eski 'cssgrid' düğümlerinde etkilidir.",
|
|
186
|
+
gridColumns: "1–12; YALNIZ eski 'cssgrid' düğümlerinde okunur (eşit kolon sayısı) ve gridTemplate doluysa yok sayılır. layout 'flex' ya da 'grid' olan kutuda ÖLÜDÜR — kolon payı blocks[].size.w'den gelir.",
|
|
187
|
+
gridRowGap: "none | small | medium | large; YALNIZ eski cssgrid düğümlerinde satır aralığıdır. Yeni kutuda etkisizdir: flex akışta aralık gap prop'undan, ızgarada blokların konumundan gelir.",
|
|
166
188
|
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " EMEKLİ isBorder prop'unun yerini bu grup aldı (2026-08-31 tipli stil göçü): çerçeve artık yön başına borderTop/Right/Bottom/Left ile açılır, isBorder yazmak unknown-prop verir.",
|
|
167
189
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
168
190
|
hoverStyle: STYLE_GROUP_NOTES.hoverStyle,
|
|
169
|
-
sectionStyle: "{ headerDivider, footerDivider, dividerColor, sectionPadding(CSS uzunluğu: '12px') }. Ayraç anahtarı false ise bileşenin kendi ayracı KALDIRILIR (yok sayılmaz). dividerColor boş, yalnız boşluk ya da çözülmemiş ifade ise tema kenarlık token'ına düşer (2026-09-18); eskiden boşluk değeri çizgiyi METİN rengiyle (currentColor) çizdiriyor, çözülmemiş ifade ise bildirimi düşürüp bölgenin taban çizgisine bırakıyordu — ayraç kaybolmuyor, yanlış renkte çiziliyordu.",
|
|
170
|
-
isLoading: "Yükleniyor durumu: gövde gizlenir ve yerine Loader çizilir — ama YALNIZ çalışma anında/önizlemede. Editör kipinde (_editorMode) gövde dokunulmaz kalır, yalnız yükleyici kaplaması eklenir; kanvasta kutunun içine bırakmak çalışmaya devam eder (CQ-308).",
|
|
191
|
+
sectionStyle: "{ headerDivider, footerDivider, dividerColor, sectionPadding(CSS uzunluğu: '12px') }. Ayraç anahtarı false ise bileşenin kendi ayracı KALDIRILIR (yok sayılmaz). dividerColor boş, yalnız boşluk ya da çözülmemiş ifade ise tema kenarlık token'ına düşer (2026-09-18); eskiden boşluk değeri çizgiyi METİN rengiyle (currentColor) çizdiriyor, çözülmemiş ifade ise bildirimi düşürüp bölgenin taban çizgisine bırakıyordu — ayraç kaybolmuyor, yanlış renkte çiziliyordu. Ayraç anahtarları varsayılan AÇIKTIR: yalnız dividerColor yazmak iki ayracı o renkle çizer (2026-09-30, QA BX-005; öncesinde renk anahtar da yazılmadıkça sessizce yok sayılıyordu).",
|
|
192
|
+
isLoading: "Yükleniyor durumu: gövde gizlenir (opacity 0) ve yerine Loader çizilir; gösterge kutunun görünür alanının ORTASINDADIR, her boyda (2026-09-30, QA BX-003 — öncesinde her boyda 28–56px'te çiziliyor, alçak kutuda taşıyor, yüksek kutuda tepede kalıyordu). Gövde gizlenir — ama YALNIZ çalışma anında/önizlemede. Editör kipinde (_editorMode) gövde dokunulmaz kalır, yalnız yükleyici kaplaması eklenir; kanvasta kutunun içine bırakmak çalışmaya devam eder (CQ-308).",
|
|
171
193
|
style: STYLE_GROUP_NOTES.styleEscape + " Tek parça '&__body'dir; eski '&__header'/'&__footer' parçaları şemadan KALDIRILDI çünkü bölgeler kutunun markup'ında eleman değil ayrı box-section düğümleridir (eski CQ-157). Bölge görünümü sectionStyle'ın işidir."
|
|
172
194
|
}
|
|
173
195
|
},
|
|
174
196
|
'box-section': {
|
|
175
|
-
summary: "box'ın başlık/altlık bölgesi. AI BU DÜĞÜMÜ DOĞRUDAN
|
|
197
|
+
summary: "box'ın başlık/altlık bölgesi. AI BU DÜĞÜMÜ DOĞRUDAN KURMAZ: box'a hasHeader/hasFooter yazınca gateway '<kutu>_header' / '<kutu>_footer' elementId'li düğümü kendisi ekler (slot/view emsali). Bölgeye içerik koymak için o elementId'yi add_component parent'ı olarak kullan.",
|
|
176
198
|
behavior: [
|
|
199
|
+
LAYOUT_ABSENT_NOTE,
|
|
177
200
|
'Yüzeysiz sarmalayıcıdır: kendi zemini/kenarlığı yoktur, yalnız bölge ayracını çizer (header altına, footer üstüne).',
|
|
178
201
|
"Palette GÖRÜNMEZ (isHide) ve SİLİNEMEZ (isDeletable:false) — kaldırmanın tek yolu box'ın ilgili anahtarını kapatmaktır.",
|
|
179
202
|
"isLoading prop'u YOKTUR: yükleniyor durumu kutunun kendisindedir, bölge onu hiç görmez — dolayısıyla CQ-308'in bırakma alanını öldüren kalıbı bu düğümde hiç oluşmaz.",
|
|
180
|
-
"Kendi yerleşimini panelden değil ELEMENT AĞACINDAN seçilerek düzenler (palette gizli, ağaçta görünür); gap alanı hâlâ eski gap+gapCustom ikilisini taşır (box'ta tek
|
|
203
|
+
"Kendi yerleşimini panelden değil ELEMENT AĞACINDAN seçilerek düzenler (palette gizli, ağaçta görünür); gap alanı hâlâ eski gap+gapCustom ikilisini taşır (box'ta tek alan allowCustom ile birleşti).",
|
|
181
204
|
"role prop'u ('header' | 'footer') bölgenin kimliğidir ve gizlidir; elle değiştirmek yerleşimi bozar.",
|
|
182
205
|
"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."
|
|
183
206
|
],
|
|
@@ -194,11 +217,12 @@ export const componentKnowledge = {
|
|
|
194
217
|
"Kanvas toolbar'ı: direction · variant · thickness · color · isHidden."
|
|
195
218
|
],
|
|
196
219
|
propNotes: {
|
|
197
|
-
label: 'Çizginin ortasındaki metin; yalnız yatayda çizilir. Sayı gelirse metne çevrilir.',
|
|
220
|
+
label: 'Çizginin ortasındaki metin; yalnız yatayda çizilir. Sayı gelirse metne çevrilir. Panel alanı direction vertical iken gizlenir (2026-10-01, QA DV-002).',
|
|
198
221
|
direction: "'horizontal' (varsayılan) | 'vertical'. Dikey çizginin kendi genişliği yoktur, hücresinde ortalanır.",
|
|
222
|
+
isHidden: "Ortak katman görünürlüğü: true iken ayraç DOM'a hiç girmez, yer de tutmaz (dv_hidden ölçümü, 2026-10-01). Kanvas toolbar'ından tek tıkla açılır.",
|
|
199
223
|
variant: "'solid' | 'dashed' | 'dotted'.",
|
|
200
224
|
thickness: 'Çizgi kalınlığı px; en az 1. Kesikli/noktalı desende parça boyu da bununla büyür.',
|
|
201
|
-
color: "Beş semantik değer + 'custom' (customColor ile); boş bırakılırsa tema kenarlık rengi (--ng-border-primary). 'custom' seçilip customColor geçersiz/boşsa 'primary' tonuna düşer, kenarlık rengine DEĞİL.",
|
|
225
|
+
color: "Beş semantik değer + 'custom' (customColor ile); boş bırakılırsa tema kenarlık rengi (--ng-border-primary). 'custom' seçilip customColor geçersiz/boşsa 'primary' tonuna düşer, kenarlık rengine DEĞİL. 'info' ayraçta ikincil metin rengiyle (--ng-text-secondary) çizilir: temanın info tonu bilgi kutusu ZEMİNİdir (beyaz temada #F8F8F8) ve ince çizgide görünmüyordu (2026-10-01, QA DV-001).",
|
|
202
226
|
customColor: "Yalnız color 'custom' iken okunur; hex/rgb/hsl/adlandırılmış renk ya da tema token'ı. Hex/rgb tema değişimini izlemez, var(--ng-…) token'ı izler.",
|
|
203
227
|
style: 'Köke uygulanır; şemada parça seçicisi yok. Çizgi ve etiket kökteki CSS değişkenlerinden boyanır (--divider-color/--divider-width/--divider-style); style içinde bu değişkenler yazılırsa inline değeri EZER (designerCss !important), iç parçalara "& .ng-divider__line" / "& .ng-divider__label" ile ulaşılır.'
|
|
204
228
|
}
|
|
@@ -206,7 +230,7 @@ export const componentKnowledge = {
|
|
|
206
230
|
spacer: {
|
|
207
231
|
summary: 'Boşluk bileşeni: sabit yükseklik (size px) ya da esnek itici. Çalışma anında GÖRÜNMEZ; yalnız editörde taralı çizilir. Olay YAYMAZ, içine bileşen bırakılmaz.',
|
|
208
232
|
behavior: [
|
|
209
|
-
"mode 'fixed' iken size kadar px YÜKSEKLİK kaplar, genişliği hep %100'dür. Satır (row) kapta yatay boşluk isteniyorsa ölçü size'dan değil düğümün genişliğinden gelir: appearance.widthType 'fixed' + widthString ('24px').",
|
|
233
|
+
"mode 'fixed' iken size kadar px YÜKSEKLİK kaplar, genişliği hep %100'dür. Kardeşler arasında açılan GERÇEK boşluk size + 8px'tir (ölçüldü 2026-10-01, QA SP-002): her düğüm gibi spacer da ortak dış boşluğu taşır (her yanda 4px) — size 16 → 24px, size 0 → 8px. Tam size px için düğümde appearance.marginType 'none' verin (16 → 16, 0 → 0); paddingType bunu YAPMAZ, o kapların çocuk alanı katmanıdır. Satır (row) kapta yatay boşluk isteniyorsa ölçü size'dan değil düğümün genişliğinden gelir: appearance.widthType 'fixed' + widthString ('24px').",
|
|
210
234
|
"mode 'flex' iken düğüm flex kabın ANA ekseninde kalan alanı alır ve kardeşlerini uçlara iter (sütunda dikey, satırda yatay; wrap açıkken de aynı satırda kalır). 2026-09-18'den önce çalışma anında 0px'ti. Kabın ölçüsü ana eksende belirli olmalı — auto/hug yükseklikli bir sütunda kalan alan yoktur, spacer 0px kalır. Kabın kendi size prop'u 'grow' ise kardeşler de büyür ve kalan alan paylaşılır; itici etkisi için kap 'shrink' kalmalı.",
|
|
211
235
|
"12 kolonlu grid kapta hücre ölçer (blocks[].size.h × satır yüksekliği): 'fixed' size kadar çizilir, hücreden büyükse satırlar uzar; 'flex' kipi düğümün yüksekliği sabitlenmedikçe (appearance.heightType 'fixed'/'fill') 0px'tir, sabitlenince hücreyi doldurur ama kimseyi itmez. Spacer'ın yeri flex kaptır.",
|
|
212
236
|
'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 (Element Tree tek seçme yolu kalır).',
|
|
@@ -214,8 +238,10 @@ export const componentKnowledge = {
|
|
|
214
238
|
],
|
|
215
239
|
propNotes: {
|
|
216
240
|
mode: "'fixed' (size px yükseklik) | 'flex' (ana eksende kalanı doldurur, itici). 'flex' ortak katman sözleşmesidir: düğüm sarmalayıcısı flex 1 1 0 alır, appearance genişlik/yükseklik kipinden bağımsız.",
|
|
217
|
-
size: "Yalnız 'fixed' kipte okunur; px, min 0. Yatay boşluk için düğüm genişliği (appearance.widthString) kullanılır, size değil.",
|
|
218
|
-
showInEditor: 'Editördeki taralı iz; runtime her zaman görünmez.'
|
|
241
|
+
size: "Yalnız 'fixed' kipte okunur; px, min 0. Görünen boşluk size + 8px'tir (düğümün dış boşluğu); tam değer için appearance.marginType 'none'. Yatay boşluk için düğüm genişliği (appearance.widthString) kullanılır, size değil. Panel alanı yalnız mode 'flex' iken gizlenir — mode yazılmamış düğümde de görünür (2026-10-01, QA SP-001; öncesinde mode'suz düğümde alan gizleniyordu).",
|
|
242
|
+
showInEditor: 'Editördeki taralı iz; runtime her zaman görünmez. Kapalıyken kanvasta iz yoktur ama boşluğa tıklayınca düğüm yine seçilir.',
|
|
243
|
+
isHidden: "Ortak katman görünürlüğü: true iken düğüm DOM'a hiç girmez, yani boşluk da (dış boşluğun 8px'i dâhil) kalkar (sp_hidden ölçümü, 2026-10-01). Kanvasta gizli spacer taralı iziyle çizilmeye devam eder.",
|
|
244
|
+
style: "Köke uygulanır (tek <div>, parça seçicisi yok). Spacer yayında saydamdır; style ile background/border verilirse yayında da görünür olur — background: kırmızı ölçümde 32px'lik dolu bir şerit çizdi ve kanvastaki taramayı örttü. Boşluk ölçüsü için style değil size (sabit kip) ya da düğüm genişliği kullanılır."
|
|
219
245
|
}
|
|
220
246
|
},
|
|
221
247
|
popover: {
|
|
@@ -223,21 +249,22 @@ export const componentKnowledge = {
|
|
|
223
249
|
behavior: [
|
|
224
250
|
"trigger 'click' ya da 'hover' olabilir; editör kipinde tetikleme çalışmaz ve panel HER ZAMAN açık, akış içinde çizilir (tasarımcı içeriği düzenleyebilsin diye) — gerçek konumlanma yalnız önizleme/çalışma anındadır.",
|
|
225
251
|
"isOpen çift yönlüdür: tetikleyici yolu open/close olayını setter'la yayar (self.isOpen yazılır); akış isOpen'ı yazınca da (2026-09-18'den beri) aynı open/close olayı çıkar, bu kez setter'sız. İlk çizimde olay yok. Yani open'a bağlı bir akış (örn. detay yükle) panel nasıl açılırsa açılsın çalışır.",
|
|
226
|
-
"Panel çocukları panelWidth px genişliğinde bir kutuda 12 sütunlu ızgaraya dizer (varsayılan 320). Eskiden genişlik içeriğe göre 200–320 arası büzülüyordu; editördeki yerleşim çalışma anıyla uyuşmuyordu. Panel
|
|
227
|
-
"Panel
|
|
228
|
-
"closeOnOutside panelde yalnız trigger 'click' iken gösterilir (hover kipinde gizlidir; runtime kayıtlı değeri her kipte okur). Kapatılırsa panel yalnız tetikleyici, Escape ya da akışla kapanır. Escape her zaman kapatır. Hover kipinde 250 ms tolerans vardır (tetikleyiciden panele geçerken kapanmaz); klavye odağı da hover kipinde açar/kapatır.",
|
|
252
|
+
"Panel çocukları panelWidth px genişliğinde bir kutuda 12 sütunlu ızgaraya dizer (varsayılan 320). Eskiden genişlik içeriğe göre 200–320 arası büzülüyordu; editördeki yerleşim çalışma anıyla uyuşmuyordu. Panel `position: fixed` ile konumlanır (2026-10-05, ADR 0017): position TERCİHTİR — yer yoksa panel karşı yöne ÇEVRİLİR, viewport'a sığması için kaydırılır ve genişlik/yükseklik kalan yerle sınırlanır (375 px'te 480'lik panel 359'a iner, uzun içerik panelin İÇİNDE kayar). Tetikleyiciden 10 px uzakta, tetikleyicinin başlangıç kenarına hizalı açılır; ok panelin gerçekte indiği yöne ve tetikleyicinin ortasına bakar.",
|
|
253
|
+
"Panel fixed olduğu için overflow veren atalar (sayfa kökü, modal gövdesi, overflow:hidden kart, container) onu KIRPMAZ; kırpabilecek tek ata transform/filter/contain taşıyan bir kaptır (böyle bir kabın içine koyma). Editörde panel akış içindedir ve kapsayıcıya göre kırpılabilir; gerçek konum yalnız önizleme/çalışma anındadır.",
|
|
254
|
+
"closeOnOutside panelde yalnız trigger 'click' iken gösterilir (hover kipinde gizlidir; runtime kayıtlı değeri her kipte okur). Kapatılırsa panel yalnız tetikleyici, Escape ya da akışla kapanır. Escape her zaman kapatır: aynı anda açık birden çok popover'da (iç içe dahil) yalnız EN SON AÇILAN kapanır, panelin içindeki açık bir seçim listesi Escape'i önce kendisi alır, modal/drawer içindeyse modal'ı DEĞİL popover'ı kapatır ve odak panelin içindeyse tetikleyiciye döner. Hover kipinde 250 ms tolerans vardır (tetikleyiciden panele geçerken kapanmaz); klavye odağı da hover kipinde açar/kapatır.",
|
|
229
255
|
"isDisabled tetikleyiciyi kilitler (tıklama/hover açmaz, düğme disabled); akışın isOpen yazması etkilenmez. triggerText boş ve triggerIcon dolu ise düğme yalnız ikon çizer; ikisi de boşsa sözlükteki 'Toggle/Aç-kapat' metni yazılır.",
|
|
256
|
+
"Akıştan isOpen=true yazan bir düğmenin kendi tıklaması paneli kapatmaz (dışarı-tıklama yalnız panelin açıldığı andan SONRAKİ tıklamalarda çalışır). Erişilebilirlik: panel role=dialog'dur ve adını tetikleyici düğmeden alır (aria-labelledby), tetikleyicide aria-controls vardır; tetikleyiciye ikon+metin verilse ikon ekran okuyucuya okunmaz. Bir repeater satırının içindeki popover'ın open/close olayları satırı SEÇMEZ (satır seçimi yalnız tıklamayla olur).",
|
|
230
257
|
"Panel yeniden yerleştirilmez: modal'daki gibi overlay/odak kapanı yoktur, arka plan tıklanabilir kalır. Sayfa akışını kesecek bir onay için modal kullan; satır detayı/hızlı form için popover."
|
|
231
258
|
],
|
|
232
259
|
propNotes: {
|
|
233
260
|
surfaceStyle: NODE_SURFACE_NOTE,
|
|
234
|
-
triggerText: "Tetikleyici düğme metni. Boş bırakılıp triggerIcon verilirse yalnız ikon çizilir.",
|
|
261
|
+
triggerText: "Tetikleyici düğme metni; yalnız metin ve sayı yazılır — nesne/dizi/boş/boşluk-yalnız/çözülmemiş {{ }} yerel 'Toggle/Aç-kapat' yazısına düşer (düğmeye [object Object] basılmaz). Boş bırakılıp triggerIcon verilirse yalnız ikon çizilir. Uzun/boşluksuz metin düğmeyi büyütmez, satır kırılır.",
|
|
235
262
|
trigger: "'click' (tıkla aç/kapat) | 'hover' (üzerine gelince açılır, ayrılınca 250 ms sonra kapanır).",
|
|
236
|
-
position: "'bottom' | 'top' | 'right' | 'left' — panelin tetikleyiciye göre
|
|
263
|
+
position: "'bottom' | 'top' | 'right' | 'left' — panelin tetikleyiciye göre TERCİH EDİLEN yönü; yer yoksa çevrilir (kenardaki 'top' 'bottom'a dönebilir). bottom/top mantıksaldır (RTL'de tetikleyicinin sağ kenarına hizalanır); right/left FİZİKSELDİR (RTL'de aynalanmaz). Geçersiz/boş değer 'bottom'.",
|
|
237
264
|
panelWidth: 'Panel kutusunun genişliği px (160–1200, varsayılan 320; aralık dışı değer kırpılır, sayı olmayan/boş değer 320). Çocuklar bu genişlik içinde 12 sütuna dizilir; kart için 320–400, küçük form için 400–560 iyi başlangıçtır.',
|
|
238
265
|
isDisabled: 'Tetikleyici kilidi; açık paneli kapatmaz, akışın isOpen yazmasını engellemez.',
|
|
239
266
|
closeOnOutside: "Panelde yalnız trigger 'click' iken gösterilir; kapalıysa dışarı tıklamak paneli kapatmaz.",
|
|
240
|
-
style: "Köke uygulanır; parça seçicileri '&__trigger' (düğme) ve '&__panel' (kutu) ile düğme ve panel ayrı boyanır.",
|
|
267
|
+
style: "Köke uygulanır; parça seçicileri '&__trigger' (düğme) ve '&__panel' (kutu) ile düğme ve panel ayrı boyanır. Kökteki color/fontFamily/fontSize tetikleyiciye ve panele iner (panelin içindeki text bileşeni kendi rengini taşır: koyu panelde text'e açık renk yaz). Ok panelin zeminini ve kenarlık rengini devralır; `&__panel::after` ile ayrıca boyanır/boyutlanır. `&__arrow` ve `&__content` parçası YOKTUR (etkisiz). Hover/odak/açık durumu için '&__trigger:hover', '&__trigger:focus-visible', '&__trigger[aria-expanded=\"true\"]', '&__trigger:disabled', '&__panel:focus-within' çalışır; @media ve @keyframes çalışır. Panelin konumunu left/top ile ezmeye çalışma: fixed ve ölçülür (ezmek için !important gerekir ve çevirmeyi kırar).",
|
|
241
268
|
isOpen: "Açık/kapalı durumu; open/close olaylarıyla geri yazılır, akıştan yazılınca da olay çıkar. Editörde etkisizdir (panel hep açık), önizlemenin başlangıç durumunu belirler."
|
|
242
269
|
}
|
|
243
270
|
},
|
|
@@ -266,41 +293,50 @@ export const componentKnowledge = {
|
|
|
266
293
|
behavior: [
|
|
267
294
|
"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.",
|
|
268
295
|
'fields dizisi kullanıcıya sunulan alan sözlüğüdür; tipi operatör listesini belirler (ağaçta operatör ANAHTARI durur, ekrandaki etiket değil): text → eq, neq, contains, notContains, empty, notEmpty · number → eq, neq, gt, gte, lt, lte, between, empty, notEmpty · date → on, before, after, between, empty, notEmpty · select → eq, neq, empty, notEmpty. Sayı alanında operatörler sembolle çizilir (= ≠ > ≥ < ≤ ⟷), doluluk ikilisi metinle.',
|
|
269
|
-
'Her kural değişikliğinde change yayılır — sorguyu her tuşta yeniden koşturmak istemiyorsan akışta gecikme kur.',
|
|
270
|
-
'Yarım bırakılan kural ekranda kalır ama jexl çıktısına girmez; sayı alanına sayı olmayan bir değer ya da
|
|
271
|
-
'Kural ağacı çalışma anı durumudur, sayfa tasarımının parçası değil: preview yenilenince sıfırlanır. Kalıcılık için value prop’unu bir State’e bağla.'
|
|
296
|
+
'Her kural değişikliğinde change yayılır — sorguyu her tuşta yeniden koşturmak istemiyorsan akışta gecikme kur — gecikmeyi State’e geri yazan adımın önüne değil, sorguyu koşturan adımın önüne koy (geç gelen eski ağaç yeni tuşu geçici ezer).',
|
|
297
|
+
'Yarım bırakılan kural ekranda kalır ama jexl çıktısına girmez; sayı alanına sayı olmayan bir değer, tipe uymayan bir operatör ya da fields’ta olmayan bir alan adı (seçici ekranda boş kalır) yazılırsa da girmez. Boş ağaç boş string üretir (filtre yok) — sorguda "jexl boşsa filtre uygulama" dalını kur.',
|
|
298
|
+
'Kural ağacı çalışma anı durumudur, sayfa tasarımının parçası değil: preview yenilenince sıfırlanır. Kalıcılık için value prop’unu bir State’e bağla VE change akışında ağacı geri yaz (state.page.<ad> = event.data.value): value State’e bağlıyken içeriği değişmediği sürece kullanıcının düzenlemesi ekranda korunur, ama State ağacı ancak bu geri yazmayla öğrenir.'
|
|
272
299
|
],
|
|
273
300
|
propNotes: {
|
|
274
301
|
fields: '[{ label, field, type, options }] — type: text|number|date|select (varsayılan text); options yalnız select tipinde okunur, virgülle ayrılmış metin. Aynı field iki satırda tekrarlanırsa ikincisi yok sayılır.',
|
|
275
|
-
value: 'Kural ağacı; gizlidir ve setter ile yazılır. Düğüm kimlikleri (id) ağaçta korunur; aynı kimliği iki düğüme verirsen ikincisine yenisi atanır.',
|
|
302
|
+
value: 'Kural ağacı; gizlidir ve setter ile yazılır. Düğüm kimlikleri (id) ağaçta korunur; aynı kimliği iki düğüme verirsen ikincisine yenisi atanır. Başlangıç ağacı için value’ya static bir ağaç da verilebilir; State’e bağlarsan aynı içerik yeniden çözümlenince ekrandaki düzenleme ezilmez.',
|
|
276
303
|
showClear: 'Kuralların altına "Tümünü temizle" düğmesi koyar (varsayılan açık); basıldığında ağaç boşalır ve boş jexl ile change yayılır. Ağaç zaten boşken düğme pasiftir.',
|
|
277
304
|
size: 'Kural satırlarının puntosu (sm|md|lg); boş bırakılırsa md.',
|
|
278
305
|
isReadonly: 'Kurallar görünür kalır, hepsi kilitlenir; olay yayılmaz.',
|
|
279
|
-
isViewmode: 'Kurallar çerçevesiz düz metne iner (kayıt görüntüleme ekranı): VE/VEYA düğme çifti yerini etkin birleştiricinin düz metnine bırakır, ekle/kaldır ve temizle düğmeleri çizilmez.'
|
|
306
|
+
isViewmode: 'Kurallar çerçevesiz düz metne iner (kayıt görüntüleme ekranı): VE/VEYA düğme çifti yerini etkin birleştiricinin düz metnine bırakır, ekle/kaldır ve temizle düğmeleri çizilmez.',
|
|
307
|
+
style: 'Parçalar: &__group (kök grup da dahil; iç gruba ayrı parça yok), &__rule, &__combinator (VE/VEYA kabı), &__input (alan, operatör ve değer kutularının üçü), &__add, &__remove, &__clear. Etkin VE/VEYA seçeneği adlı parça DEĞİL: `& button[aria-pressed="true"]` ile hedefle, ikisi için `& button`.'
|
|
280
308
|
}
|
|
281
309
|
},
|
|
282
310
|
comments: {
|
|
283
311
|
summary: '@bahsetmeli, iç içe yanıtlı yorum akışı; gönderilen her yorumu akışa devreder.',
|
|
284
312
|
behavior: [
|
|
285
313
|
'İYİMSER KATMAN: gönderilen yorum, beğeni, DÜZENLEME ve silme ANINDA arayüze yansır ama HİÇBİRİ kalıcı değildir — uca yazmak akışın işidir. Düzenlenen yorum yeni metinle, soluk ve "düzenlendi" işaretiyle görünür.',
|
|
286
|
-
'
|
|
314
|
+
'BEKLEYEN YORUM yalnız karşılığı rows’a gelince kalkar: gönderimden SONRA beliren, aynı üst yoruma (parentId), aynı metne (boşluklar sadeleştirilir) ve — currentUser doluysa — aynı yazara sahip yeni bir satır. Akışın rows’u başka bir sebeple tazelemesi (geç dönen önceki gönderim) bekleyeni silmez. Akış yorumu hiç kaydetmezse ya da metni değiştirerek (kırpma, temizleme) kaydederse bekleyen "gönderiliyor…" kalır; kaydettiğin metni olduğu gibi yaz. Beğeni, düzenleme ve silme katmanları ise rows İÇERİĞİ değişince temizlenir (referans değişimi yetmez).',
|
|
287
315
|
'Yorum silinince altındaki her yanıt da ekrandan gizlenir; delete yükü yalnız kök id taşır — yanıtları silmek (ya da bırakmak) akışın/servisin kararıdır.',
|
|
288
316
|
'Yanıt tek seviyedir: yanıt düğmesi yalnız kök yorumda çıkar, yanıtın yanıtı yoktur.',
|
|
289
317
|
'people listesi @bahsetme önerilerini besler; submit yükündeki mentions bu listeye göre çözülmüş adlardır. Listede olmayan @ad düz metin kalır.',
|
|
290
318
|
'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.',
|
|
291
319
|
'Kilitler: isDisabled yazma kutusunu soluk (yazılamaz) gösterir; isReadonly ve isViewmode kutuyu hiç çizmez. Üçünde de yanıtla/düzenle/sil gizlenir, beğeni sayacı görünür ama tıklanmaz (like yayılmaz).',
|
|
292
|
-
'Tekrarlanan id’de ilk satır id’sini korur, sonrakiler "<id>#<sıra>" olur ve olay yükleri bu uydurma id’yi taşır (uç tanımaz) — id benzersiz verilmeli.'
|
|
320
|
+
'Tekrarlanan id’de ilk satır id’sini korur, sonrakiler "<id>#<sıra>" olur ve olay yükleri bu uydurma id’yi taşır (uç tanımaz) — id benzersiz verilmeli.',
|
|
321
|
+
'OLAY YÜKÜ YALNIZ event.data’DADIR: submit/like/edit/delete bileşenin prop’larına yazılmaz, self.text · self.id · self.mentions gibi okumalar boş/undefined gelir ve akış adımı 400 verebilir. Akışta {{ event.data.text }}, {{ event.data.parentId }}, {{ event.data.id }} yaz.',
|
|
322
|
+
'Tek submit yükündeki mentions yalnız ekranda vurgulanan adlardır: @ bir kelimenin sonuna yapışık olmamalı ("foo@Ayşe" bahsetme sayılmaz, "(@Ayşe Kaya)" ve "Selam,@Ali" sayılır) ve ad, daha uzun bir kelimenin başı olmamalı ("@Ayşe Kayalı" sayılmaz). Birden çok sözcüklü ad ("Ayşe Kaya") yazılırken öneri boşluktan sonra da açık kalır; adın tamamı yazılıp boşluk basılınca ("@Ali " ve listede "Ali" varsa) kapanır, Enter gönderir.',
|
|
323
|
+
'createdAt çözülemezse (dün, 2026-13-45, 2026-02-30, 2026-02-30T10:00:00, tek başına 0 ya da 12345) tarih HAM metin olarak görünür; yeni bir gün uydurulmaz. Tarih biçimi seçilemez, yerele göre sabittir.',
|
|
324
|
+
'Kök yazı tipi/rengi içe iner: style.fontSize, fontFamily ve color yazar adı, metin, tarih ve yazma kutusuna ulaşır (iç boyutlar kökün oranıdır; tarih rengi yazı renginin %72’sidir). Bağlantı gibi çizilen eylem düğmeleri ve @bahsetme vurgusu vurgu rengini korur.',
|
|
325
|
+
'Klavye: yazma kutusunda @ ile açılan öneri ↑/↓ ile gezilir, Enter seçer (liste kapalıysa gönderir), Esc listeyi kapatır (IME bileşimi sırasındaki Esc de üst katmanı kapatmaz); gezilen satır kaydırılan listenin görünür bölümünde kalır; yanıt/düzenleme kutusu Esc ile kapanır ve çekmece/modal gibi üst katmanı KAPATMAZ. Yanıt ve düzenleme kutusu açılınca odak kutuya gelir, kapanınca açan düğmeye döner. IME bileşimi sırasında Enter göndermez. Öneri listesi altta sığmıyorsa kutunun üstüne açılır.',
|
|
326
|
+
'Yorumlar liste yapısındadır (role="list", her konu listitem); yazma kutusunun adı "Yorum yaz", yanıt kutusunun "Yanıt yaz", düzenleme kutusunun "Yorumu düzenle" (dile göre). Avatar süs görseldir; kırık ya da yüklenemeyen avatar adın baş harflerine düşer.'
|
|
293
327
|
],
|
|
294
328
|
propNotes: {
|
|
295
329
|
rows: '[{ id, author, text, createdAt, parentId, avatar, likeCount, likedByMe }] — parentId dolu olan satır yanıttır. createdAt ISO metni, "YYYY-AA-GG" ya da Unix zaman damgası (10 hane saniye / 13 hane milisaniye) olabilir; boş author+text satırı atlanır.',
|
|
296
330
|
currentUser: 'Yorum sahipliğini ve ownOnly filtresini belirleyen ad; tüm olay yüklerindeki author budur (yorumun sahibi DEĞİL, işlemi yapan). Boşsa düzenleme/silme ownOnly açıkken gizlenir.',
|
|
297
331
|
people: '@bahsetme önerileri: virgülle ayrılmış metin ya da ad dizisi ({{ users.map((u) => u.name) }}).',
|
|
298
|
-
placeholder: 'Boşsa dile göre "Yorum yaz… (@ ile birini an)" gösterilir; yanıt kutusu da aynı metni kullanır.'
|
|
332
|
+
placeholder: 'Boşsa dile göre "Yorum yaz… (@ ile birini an)" gösterilir; yanıt kutusu da aynı metni kullanır. Erişilebilir ad ayrıdır ve dile göre sabittir.',
|
|
333
|
+
style: STYLE_GROUP_NOTES.styleEscape + " PARÇALAR (19): '&__list' · '&__thread' (bir kök yorum + yanıtları) · '&__comment' · '&__avatar' · '&__body' · '&__meta' · '&__author' · '&__date' · '&__text' · '&__mention' · '&__actions' · '&__action' · '&__reply-composer' · '&__composer' · '&__textarea' · '&__button' · '&__suggestions' · '&__suggestion' · '&__empty'. Durum hedefleri parçaya EK olarak yazılır: '&__comment--reply' (yanıt) · '&__comment--pending' (gönderiliyor) · '&__action--danger' (Sil) · '&__button--ghost' (Vazgeç); beğeni düğmesi için '&__action[aria-pressed=\"true\"]'; '&__textarea:focus-visible', '&__action:hover', '&__suggestion:hover', '::before/::after' ve '@media' çalışır. Hepsi ilk adayda tutar. Yanıt girintisi mantıksaldır (margin-inline-start): RTL'de sağdan gelir; özelleştirirken marginLeft değil marginInlineStart yaz."
|
|
299
334
|
}
|
|
300
335
|
},
|
|
301
336
|
aibox: {
|
|
302
|
-
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.",
|
|
337
|
+
summary: "EMEKLİ — YENİ YAZIMDA box KULLAN: aibox palette görünmez ve render'da box olarak çizilir (prop adları birebir aynı); kayıt yalnız eski düğümler çizilsin diye durur. 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.",
|
|
303
338
|
behavior: [
|
|
339
|
+
LAYOUT_ABSENT_NOTE,
|
|
304
340
|
"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 değerleri de box ile aynı: 'flex' | 'grid' (2026-09-02'de 'cssgrid' seçenek olmaktan çıktı; o değerle kayıtlı düğümler gerçek display:grid akışıyla çizilmeye devam eder).",
|
|
305
341
|
"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.",
|
|
306
342
|
"TEMA PRESET'İ: bir tema preset'ini düğüme bağlamak için style.$preset: '<ad>' yaz (adlar theme_get → presets, sayfa bağlamında page_runtime_get → theme.presets; preset'i yazmak/silmek theme_update; 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.",
|
|
@@ -313,8 +349,9 @@ export const componentKnowledge = {
|
|
|
313
349
|
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
314
350
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
315
351
|
hoverStyle: STYLE_GROUP_NOTES.hoverStyle,
|
|
316
|
-
|
|
317
|
-
|
|
352
|
+
direction: "'row' | 'column'. Şema varsayılanı 'column' (kutunun sezgisi dikey yığın) AMA bu değer yalnız Studio'da sürüklenen düğüme yazılır; prop hiç yazılmamışsa SATIR çizilir (flex-layout.ts FLEX_ABSENT_PROPS, QA BX-001). page_schema_patch ile dikey yığın istiyorsan direction:'column'u AÇIKÇA yaz. Studio paneli ve kanvas araç çubuğu eksik yönü 2026-09-30'dan beri satır gösterir — ekranla aynı.",
|
|
353
|
+
gapCustom: 'Sayısal px boşluğu (0-200); doluysa gap preset\'ini EZER. Eski kanal — yeni şemada gap alanının kendisi ham CSS değeri kabul eder (allowCustom).',
|
|
354
|
+
sectionStyle: "{ headerDivider, footerDivider, dividerColor, sectionPadding(CSS uzunluğu: '12px') }. Ayraç anahtarı false ise bileşenin kendi ayracı KALDIRILIR (yok sayılmaz). Anahtarlar varsayılan açıktır: yalnız dividerColor yazmak iki ayracı o renkle çizer (QA BX-005, box ile aynı derleyici).",
|
|
318
355
|
style: STYLE_GROUP_NOTES.styleEscape + " Parça olarak yalnız '&__body' bildirilmiştir çünkü markup'ta gerçekten o eleman vardır."
|
|
319
356
|
}
|
|
320
357
|
},
|
|
@@ -326,14 +363,15 @@ export const componentKnowledge = {
|
|
|
326
363
|
"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
364
|
"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
365
|
"page_container'ın isLoading prop'u sayfa açılış akışının yükleniyor bayrağıdır.",
|
|
366
|
+
"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
367
|
"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
368
|
"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
369
|
"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.",
|
|
332
370
|
"ÜÇÜ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.",
|
|
333
371
|
"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).",
|
|
334
372
|
"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.",
|
|
335
|
-
"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
|
|
336
|
-
"
|
|
373
|
+
"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 VARSAYILAN layout iskeleti (getDefaultLayout, 2026-09-29) kökü böyle kurar: states.isWrapper:true + appearance.heightType:'fill' + block x0/w12 (sayfanın page_container'ının yerleşim ikizi: çerçevesiz, başlıksız, ekranı dolduran); içinde navigations sol menü, menünün İÇİNDE ana sütun container'ı (column) → üst şerit container'ı + içerik container'ı → slot. Yeni kabukta önce ngapps://examples/layout-app-shell'i kullan, sonra özelleştir. layout monoliti ve layout-shell/layout-region ikilisi emekliye ayrıldı (platform_guide('layout')).",
|
|
374
|
+
"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; wrap artık varsayılan açık (2026-09-01) ama sarma yalnız sığmayan çocuğu alta atar, ızgara yığılmasının yerini tutmaz (zeyrek-frontend docs/issues.md ARC-031)."
|
|
337
375
|
],
|
|
338
376
|
propNotes: {
|
|
339
377
|
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.",
|
|
@@ -345,30 +383,37 @@ export const componentKnowledge = {
|
|
|
345
383
|
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.",
|
|
346
384
|
verticalAlign: "top | middle | bottom | stretch. row'da ÇAPRAZ eksen, column'da ANA eksen — horizontalAlign ile rollerini değiştirirler. row'da stretch seçiliyken çocuğun sabit yüksekliği (heightType fixed → heightString ya da size.h×10px) HEIGHT değil MIN-HEIGHT olarak yazılır (2026-09-15): çocuklar en uzun kardeşin boyuna eşitlenir, sabit ölçü taban kalır — eşit boylu KPI kartları için her karta elle aynı heightString yazmak gerekmez. İstisna: isScrollable çocuk kesin yüksekliğini korur. Izgara kapta (layout grid) bu prop da gap de okunmaz; eşit kart satırı flex row + stretch ile kurulur.",
|
|
347
385
|
size: "'shrink' (çocuklar flex: 0 1 auto, varsayılan) | 'grow' (flex: 1 1 auto — çocuklar boşluğu paylaşır).",
|
|
348
|
-
gap: "none | small | medium (varsayılan) | large → tema değişkenleri: 0 / var(--ng-spacing-sm) / --ng-spacing-md / --ng-spacing-lg (varsayılan temada 8/16/32px).
|
|
349
|
-
wrap: "flex-wrap: wrap. Varsayılan AÇIK (2026-09-01'de flipledi): w:12 çocuklar alt satıra sararak dikey akar. Kapatırsan satıra sığmayan çocuklar sıkışır, alta inmez.",
|
|
386
|
+
gap: "none | small | medium (varsayılan) | large → tema değişkenleri: 0 / var(--ng-spacing-sm) / --ng-spacing-md / --ng-spacing-lg (varsayılan temada 8/16/32px). Alan allowCustom'dır: '18px' ya da 'var(--ng-spacing-xl)' gibi ham CSS değeri de geçer. Çocuk genişlik formülünden payı düşülür, böylece w toplamı 12 olan satır tam kapanır.",
|
|
387
|
+
wrap: "flex-wrap: wrap. Varsayılan AÇIK (2026-09-01'de flipledi): w:12 çocuklar alt satıra sararak dikey akar. Kapatırsan satıra sığmayan çocuklar sıkışır, alta inmez. AMA prop hiç yazılmamışsa SARMAZ (flex-layout.ts eksik wrap'i nowrap okur — varsayılan yalnız Studio'da sürüklenip kurulan düğüme materyalize olur): page_schema_patch ile kurduğun flex kapta sarma istiyorsan wrap:true'yu AÇIKÇA yaz. Studio paneli de 2026-09-30'dan beri eksik wrap'i 'kapalı', eksik layout'u 'Grid' gösterir (designer.absent, QA CT-001) — ekranla aynı.",
|
|
350
388
|
title: "Varsayılanı boştur. isWrapper:false kapta yalnız açıkça doluysa başlık çizer; page_container'da ise dolu değer tarayıcı sekmesinin adını yazar (browserTitle).",
|
|
351
389
|
description: "Başlığın ALTINDAKİ ikinci satır (2026-09-18): ikincil metin renginde, başlıktan küçük punto. Varsayılanı boştur ve boşken eleman hiç çizilmez, bandın yüksekliğini değiştirmez. Yalnız description yazmak başlık bandını açar (title boş kalabilir); sarmalayıcı kipte (page_container, yerleşim kökü) title gibi o da çizilmez. Kart başlığının altına açıklama yazmak için artık içine text bileşeni bırakmak gerekmez.",
|
|
352
|
-
isLoading: "Gövdeyi 100px'e kısar, slot'u gizler ve spinner gösterir — ama YALNIZ çalışma anında ve önizlemede. Kanvasta (editör kipi) gövde kırpılmaz, yalnız yükleyici çizilir ve bırakma alanı çalışmaya devam eder (2026-09-18). page_container'da sayfa açılış akışının yükleniyor bayrağıdır; kanvas toolbar'ından tek tıkla açılır."
|
|
390
|
+
isLoading: "Gövdeyi 100px'e kısar, slot'u gizler ve spinner gösterir — ama YALNIZ çalışma anında ve önizlemede. Kanvasta (editör kipi) gövde kırpılmaz, yalnız yükleyici çizilir ve bırakma alanı çalışmaya devam eder (2026-09-18). page_container'da sayfa açılış akışının yükleniyor bayrağıdır; kanvas toolbar'ından tek tıkla açılır. Spinner gövdenin kendi kutusunu kaplayan katmanda ortalanır (2026-09-30, QA CT-002): önceden gizlenen çocukların boyuna göre ortalanıp alçak gövdede yarıdan kesiliyordu ve gövde 4px/2px kayıyordu.",
|
|
391
|
+
isHidden: "Ortak katman görünürlüğü (RenderComponent okur): true iken düğüm ve bütün çocukları hiç çizilmez. Kanvas toolbar'ında tek tıkla açılır.",
|
|
392
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
393
|
+
" Container parçaları: '&__body' (gövde — çocukların dolgusu/kaydırması buraya), '&__header' (başlık bandı), '&__title' (başlık metni). Başlık rengi/puntosu/ayraç/bant dolgusu için önce headerStyle."
|
|
353
394
|
}
|
|
354
395
|
},
|
|
355
396
|
repeater: {
|
|
356
397
|
summary: 'Kart listesi: rows dizisindeki her satır için children şablonunu yineler, satırları columnCount kolonlu bir ızgaraya dizer; satır bağlamı item/Row (sırası RowIndex) olarak çocuklara iner.',
|
|
357
398
|
behavior: [
|
|
358
|
-
"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,
|
|
359
|
-
"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.",
|
|
399
|
+
"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, tarih seçici, dosya girdileri, tree-view, table; tag-input'ta yalnız çipler, çip silme ve temizle düğmesi — metin alanına tıklamak satırı SEÇER) 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. select ya da change olayına bir akış bağlıysa satırlar cursor:pointer gösterir (akışsız olayda ya da hiç olay yoksa imleç değişmez); tasarımcının style'ı ezer. 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.",
|
|
400
|
+
"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). selectedIndex bir sayıdır; bir girdiden gelen \"1\" gibi tam sayı metni de sayı sayılır (ölçüldü: \"1\" → rows[1]). Boş, \"abc\", \"1.5\" ve ondalık/üslü metin 'seçim yok'tur ve rows[0] döner. rows yenilenince selectedIndex SIFIRLANMAZ; eski sıra yeni listede başka satırı gösterebilir, gerekiyorsa sorgu akışında selectedIndex'i null yaz. Silme akışı son satırı silerse selectedIndex artık listenin dışında kalır ve selectedItem TANIMSIZ olur (ilk satıra düşmez): silmeden sonra selectedIndex'i düzelt ya da null yaz.",
|
|
360
401
|
"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; 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.",
|
|
402
|
+
"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. Kolonlar eşit paydır (minmax(0, 1fr)): uzun bir başlık kolonu genişletmez, taşarsa Text'in kendi wordBreak / lineClamp prop'uyla kes.",
|
|
362
403
|
"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.",
|
|
404
|
+
"KART İÇERİĞİ HÜCREYİ VARSAYILANDA DOLDURMAZ: hücre en uzun kart kadardır ama karttaki container kendi yüksekliğinde kalır (heightType:fill etkisiz), kısa kartın altında boşluk kalır. Arka planı/gölgesi/kenarlığı olan kartlarda cardFill:true yaz: satır sarmalayıcısını flex yapıp düğümü ve kutusunu hücreye yayar (ölçüldü: kısa kart 146px → hücre kadar 326px). cardFill kapalıyken hiçbir şey değişmez.",
|
|
405
|
+
"SEÇİLİ SATIR GÖRÜNÜMÜ: seçili satırın sarmalayıcısı aria-current=\"true\" ve data-selected=\"true\" taşır (seçim yokken hiçbir satırda yok — selectedItem rows[0] dönse de ilk satır işaretlenmez). Repeater'ın style'ında `& > [data-selected=true]` ile stille: zemin, kenarlık, outline, opacity (ölçüldü: yalnız tıklanan satırda outline 4px + opacity 0.6). Kartın İÇİNDEKİ bir bileşen seçiliyi bilmek zorundaysa isHidden'ı `{{ typeof <repeater>.selectedIndex === 'number' && <repeater>.selectedItem.id === item.id }}` yaz (bu koruma yalnız selectedIndex gerçek sayı olarak yazılıyorsa doğrudur; akış metin yazıyorsa orada Number(...) ile çevir — satır işaretleri ikisini de kabul eder).",
|
|
363
406
|
"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."
|
|
364
407
|
],
|
|
365
408
|
propNotes: {
|
|
366
409
|
surfaceStyle: NODE_SURFACE_NOTE,
|
|
367
|
-
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.",
|
|
410
|
+
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ı ve BENZERSİZ bir id ya da _id ver: girilen değerler ve kart örnekleri ona göre eşlenir. Düz tipli öğeler (null, sayı, metin, iç içe dizi) statik rows olarak yazılamaz (platform 500) — `{{ }}` ifadesiyle ver; bozuk öğe kartı boş çizer, sayfa düşmez.",
|
|
411
|
+
style: "Repeater'da `&__parça` YOKTUR; `style` ızgara elemanının kendisine yazılır (kök özellikler: background, padding, border, borderRadius, maxWidth, overflow…). Kartlar için satır sarmalayıcısını hedefle: `& > div` (= `& > .ng-app__node-children`), `& > div:nth-child(odd)`, `& > div:hover`, `& > div:focus-within`, `& > div::before` (içerik kartın içinde yer tutar; ölçüldü: `content: '>>'` kartı 48px'ten 62px'e uzattı), `&:hover`. `gap` yazmak verticalSpacing ve horizontalSpacing'i birlikte ezer; `display:flex` ızgarayı düşürür — boşluk ve kolon için kendi prop'larını kullan. @media içindeki kural taban kuralın önüne düşebilir (aynı özgüllükte taban kazanır): medya içinde `&&` ile özgüllüğü artır (`@media (max-width: 480px)` > `&&` > { gridTemplateColumns: 'repeat(2, minmax(0, 1fr))' }).",
|
|
368
412
|
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.",
|
|
369
413
|
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).',
|
|
370
414
|
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).',
|
|
371
415
|
horizontalSpacing: 'Yan yana kartlar arası boşluk, px. Yazılmazsa 0; katalog varsayılanı 12 (2026-09-29).',
|
|
416
|
+
cardFill: 'Kart içeriği (container) hücrenin tamamını doldursun: kısa kartın altında boşluk kalmaz. Varsayılan kapalı; arka planı/gölgesi/kenarlığı olan kartlarda aç. autoRowSize ile birlikte de çalışır (hücre yüksekliği satırın en uzun kartıdır).',
|
|
372
417
|
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ı.",
|
|
373
418
|
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."
|
|
374
419
|
}
|
|
@@ -376,14 +421,49 @@ export const componentKnowledge = {
|
|
|
376
421
|
modal: {
|
|
377
422
|
summary: 'Ortalanmış katman; şemanın KÖKÜNDE page_container’ın kardeşi olarak durur, içeriği (kendi formu ve submit akışı dahil) children’ına eklenir.',
|
|
378
423
|
behavior: [
|
|
379
|
-
"open/close olayları akışa bağlanabilir; açma/kapama isHidden ile değil kendi open state'iyle yürür (setter ile isOpen yaz).",
|
|
380
|
-
"Kaplama çerçevesidir (isFrame): kanvasta blok tutmaz, runtime kutu stili yazmadan ayrı dalda çizer. Katalog boyutu bilerek BOŞ aralıktır (minSize 1, maxSize 0) ve 2026-09-15'ten beri doğrulayıcı blocks[].size'ı hiçbir eksende DENETLEMEZ (boyut sınırı kanvasın kuralıdır) — add_component ile kökte (parent null) herhangi bir { w, h } ile eklenir. Daha eski backend build'i her boyutu 'Height of modal must be between 1 and 0' (invalid-size) ile reddeder; o durumda imaj yenilenmemiştir. drawer ve toast aynı kuraldadır."
|
|
424
|
+
"open/close olayları akışa bağlanabilir; açma/kapama isHidden ile değil kendi open state'iyle yürür (setter ile isOpen yaz). Kapat düğmesi, perdeye tıklama ve Esc isOpen'ı KENDİSİ false yapar; close bu yollardan ve akıştan yazılan isOpen=false'tan BİR KEZ çalışır (2026-10-05'e kadar kullanıcı kapatışında iki kez çalışıyordu). open yalnız açılışta çalışır: sayfa yüklenirken isOpen zaten true ise open koşmaz. isOpen hiç yazılmadıysa {{ modal.isOpen }} ilk açılışa kadar undefined okur — {{ !!modal.isOpen }} yaz.",
|
|
425
|
+
"Kaplama çerçevesidir (isFrame): kanvasta blok tutmaz, runtime kutu stili yazmadan ayrı dalda çizer. Katalog boyutu bilerek BOŞ aralıktır (minSize 1, maxSize 0) ve 2026-09-15'ten beri doğrulayıcı blocks[].size'ı hiçbir eksende DENETLEMEZ (boyut sınırı kanvasın kuralıdır) — add_component ile kökte (parent null) herhangi bir { w, h } ile eklenir. Daha eski backend build'i her boyutu 'Height of modal must be between 1 and 0' (invalid-size) ile reddeder; o durumda imaj yenilenmemiştir. drawer ve toast aynı kuraldadır.",
|
|
426
|
+
"Panel PORTAL ile düğüm kutusunun DIŞINA çizilir: surfaceStyle ve style panelin kendisine (.ng-modal) uygulanır, düğüm kutusuna değil. Kullanılabilir style parçaları: &__header, &__title, &__description, &__close (kapat düğmesi), &__body, &__footer, &__actions (düğme grubu), &__overlay (arkadaki perde); kökte :hover, :focus-within, ::before/::after, @media çalışır. Alta yapışık sayfa gibi yerleşim için kökte top/left/bottom/transform/width yaz (kök left:50% top:50% translate(-50%,-50%) ile ortalanır; 767 px ve altındaki %90 genişlik kuralı style.width'e yenilir). Altlık düğmelerini boyamak için '&__actions button' ve '& .ng-button--outline' gibi iç içe seçiciler çalışır (actions[]'ta düğme stili alanı yok); odak halkası için '&__actions button.ng-button:focus-visible' yaz, bileşenin kendi odak kuralı yoksa yeniler. style/surfaceStyle ve eski appearance alanları 2026-10-05'ten önce modalda HİÇBİR ŞEYE inmiyordu; kayıt defteri eski kalmışsa page_schema_patch style'ı unknown-prop diye reddeder (components-sync çalıştır).",
|
|
427
|
+
"Boyut: size small 600, medium 800, large 1400 px; panel ekrandan en fazla iki kenar boşluğu kadar dar tutulur (large 1280 px'te ekrana sığar) ve yüksekliği ekranı aşmaz — gövde (max 600 px) kendi içinde kayar, başlık ve aksiyonlar görünür kalır. 767 px ve altında genişlik %90 (style.width ile ezilebilir). Başlık ve açıklama boşluksuz uzun metinde satıra kırılır; bu başlık sütunu ekran yüksekliğinin %40'ında durur ve kendi içinde kayar (çok uzun başlık kısa ekranda gövdeyi ve altlığı dışarı itmez; kapat düğmesi sütunun yanında sabittir); açıklamadaki satır sonları (\\n) korunur; aksiyon düğmesi metni uzunsa düğme içinde sarılır. title/description metin değilse (nesne, dizi, true/false, NaN) ya da çözülmemiş {{ }} ise BOŞ sayılır; boş başlıkta başlık satırı çizilmez.",
|
|
428
|
+
"isLoading gövdeyi bir yükleniyor göstergesiyle örter ve aksiyonları kilitler ama çocukları SÖKMEZ: yazılmış form değerleri kalır, pencere boyu zıplamaz, yükleme bitince odak yüklemeden önceki elemana döner. (2026-10-05'ten önce gövde ve altlık DOM'dan sökülüyordu.) Yükleme bir aksiyonun düğmesinde gösterilecekse aksiyonun kendi isLoading'ini kullan.",
|
|
429
|
+
"Çocuklar 12 kolonlu ızgarada konumlanır (blocks.position), akış değil: add_component ile birden çok çocuk eklerken hepsi y:0 alır ve üst üste biner. İçeriği tek bir flex container (ya da form) içine koyup onu ekle; modalın doğrudan çocuğu bir container olsun.",
|
|
430
|
+
"Klavye ve erişilebilirlik: role=dialog, adı title; aria-modal bilerek YOK (portal'daki seçim listeleri pencerenin dışında kalır). Açılışta odak kapat düğmesine (yoksa ilk odaklanabilir öğeye) gelir, Tab pencere içinde döner, kapanınca odak açan öğeye döner; Esc yalnız EN ÜSTTEKİ katmanı kapatır (iç içe modal/drawer'da sırayla). Pencere içinde açık bir dropdown/multi-select varken ilk Esc yalnız listeyi kapatır, sonraki Esc pencereyi kapatır (2026-10-05'e kadar alan kapalı listede de her Esc'yi tüketiyor, pencere klavyeyle kapanmıyordu). Açıkken sayfa kaydırması kilitlenir ve kapanınca sayfanın önceki değeri geri gelir.",
|
|
431
|
+
"Altlık aksiyonları pencerenin BİTİŞ kenarına yaslanır (LTR'de sağ, ar/RTL'de sol); RTL'de başlangıca almak için style &__footer { justifyContent: 'flex-start' } yaz. Aksiyonlarda flow değeri { type: 'flow', ref: <akış kimliği> } sarmalıdır; type: 'submit' aksiyonu formId'deki formu gönderir ve kendi flow'unu ÇALIŞTIRMAZ (akışı formun submit olayına bağla), type: 'button' kendi flow'unu çalıştırır."
|
|
381
432
|
],
|
|
382
|
-
propNotes: {
|
|
433
|
+
propNotes: {
|
|
434
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens +
|
|
435
|
+
" Modalda yüzey PANELİN kökünde derlenir (portal'dan dolayı düğüm kutusu yoktur); contentOverflow panelin KÖKÜNE iner (hidden → başlık bandı gibi taşan çocuklar panelin yuvarlak köşelerinde kırpılır); gövde zaten kendi içinde kayar (max 600 px), başlık ve aksiyonlar kaydırılmaz.",
|
|
436
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
437
|
+
" Modalda parçalar: &__header, &__title, &__description, &__close, &__body, &__footer, &__actions, &__overlay. Sınıf adları ng-modal / ng-modal__header / ng-modal-body / ng-modal-footer / ng-modal__overlay olduğundan '& .ng-modal-body p' gibi iç içe seçici de yazılabilir ama parça adları kalıcı sözleşmedir.",
|
|
438
|
+
size: "small 600 · medium 800 · large 1400 px; ekran dar ise ekrana sığar, 767 px ve altında %90.",
|
|
439
|
+
isLoading: 'Gövdeyi yükleniyor göstergesiyle örter ve aksiyonları kilitler; çocuklar yerinde kalır (form değerleri silinmez). Pencere boyu değişmez.',
|
|
440
|
+
isDismissDisabled: 'Kapat düğmesini gizler; perdeye tıklama ve Esc de kapatmaz — pencereden yalnız aksiyonlarla çıkılır. close olayı bu yollardan yayılmaz.'
|
|
441
|
+
}
|
|
383
442
|
},
|
|
384
443
|
drawer: {
|
|
385
444
|
summary: 'Yandan açılan katman; modal ile aynı kurallar: şema kökünde yaşar, kendi children ve akışlarını taşır.',
|
|
386
|
-
|
|
445
|
+
behavior: [
|
|
446
|
+
"open/close olayları akışa bağlanabilir; açma/kapama isHidden ile değil kendi open state'iyle yürür (setter ile isOpen yaz). Kapat düğmesi, perdeye tıklama ve Esc isOpen'ı KENDİSİ false yapar; close bu yollardan ve akıştan yazılan isOpen=false'tan TAM BİR KEZ çalışır. open yalnız açılışta çalışır: sayfa yüklenirken isOpen zaten true ise open koşmaz. isOpen hiç yazılmadıysa {{ drawer.isOpen }} ilk açılışa kadar undefined okur — {{ !!drawer.isOpen }} yaz.",
|
|
447
|
+
"Kaplama çerçevesidir (isFrame): kanvasta blok tutmaz, kökte (parent null) herhangi bir { w, h } ile eklenir; boyut denetimi modal ile aynıdır.",
|
|
448
|
+
"Panel PORTAL ile düğüm kutusunun DIŞINA çizilir (kök drawer düğümünün kendi kutusu DOM'da YOKTUR): surfaceStyle ve style panelin kendisine (.ng-drawer) uygulanır. 2026-10-05'ten önce ikisi de HİÇBİR ŞEYE inmiyordu ve style şemada yoktu; kayıt defteri eski kalmışsa page_schema_patch style'ı unknown-prop diye reddeder (components-sync çalıştır). Kullanılabilir style parçaları: &__header, &__title, &__description, &__close (kapat düğmesi), &__body, &__footer, &__actions (düğme grubu; sol ve sağ grup ikisi de), &__overlay (arkadaki perde); kökte :hover, :focus-within, ::before/::after, @media çalışır. Kenardan boşluklu yüzen panel için kökte top/right/bottom/height yaz (kök left:0 top:0 height:100vh ile sabittir). Altlık düğmelerini boyamak için '&__actions button' ve '& .ng-button--outline' gibi iç içe seçiciler çalışır (actions[]'ta düğme stili alanı yok); odak halkası için '&__actions button.ng-button:focus-visible' yaz. Altlık düğmelerinin sınıfları: .ng-button--solid / --text / --outline ve kind için .ng-button--primary|info|success|warning|error; menülü aksiyonun düğmesi '.dropdown-menu__button'. Yalnız sağ kenarda açılan panele özel stil için '&.ng-drawer--right' yaz ('&--right' tutmaz). Kökün varsayılan padding'i 20px'tir (padding: 0 ile başlık bandı kenardan kenara alınır); kapat düğmesi varsayılan 35x35 px'tir (dokunma hedefi için &__close ile büyüt). Harf aralığı (letterSpacing) altlık düğmesinin ikon ligatürünü bozabilir (ikon adı harf harf görünür): onu '&__title' gibi yalnız metin parçasına yaz, '&__actions button'a değil. PascalCase Webkit* anahtarları sessizce düşer (kebab/camelCase backdropFilter yaz).",
|
|
449
|
+
"Boyut: size default 400, medium 600, large 800, x-large 1120, 2x-large 1280 px, full tüm ekran; panel ekrandan GENİŞ olmaz (1024 px'te 2x-large 1024'e iner; 2026-10-05'e kadar 256 px taşıyor, kapat düğmesi ekran dışında kalıyordu). 767 px ve altında genişlik %90 (style.width ile ezilebilir). Yükseklik her zaman ekranın tamamıdır; gövde kendi içinde kayar, başlık ve altlık sabit kalır. Başlık ve açıklama boşluksuz uzun metinde satıra kırılır; açıklamadaki satır sonları (\n) korunur; aksiyon düğmesi metni uzunsa düğme içinde sarılır. title/description metin değilse (nesne, dizi, true/false, NaN) ya da çözülmemiş {{ }} ise BOŞ sayılır; sayı yazı olarak çizilir (0 → '0'); boş başlıkta başlık satırı çizilmez.",
|
|
450
|
+
"position fiziksel kenardır: left sol, right sağ; geçersiz/boş değer left'tir. Arapça/RTL sayfada panel AYNALANMAZ (left yine soldan açılır); kapat düğmesi ve altlık grupları ise mantıksaldır. RTL'de panelin başlangıç kenarından açılmasını istiyorsan position'ı dile göre sen seç.",
|
|
451
|
+
"isLoading gövdeyi bir yükleniyor göstergesiyle örter ve aksiyonları kilitler ama çocukları SÖKMEZ: yazılmış form değerleri kalır, panel düzeni zıplamaz, altlık yerinde durur (görünmez + kilitli), yükleme bitince odak yüklemeden önceki elemana döner. (2026-10-05'ten önce gövde ve altlık DOM'dan sökülüyor, gövde 200 px'e düşüyordu.) Yükleme bir aksiyonun düğmesinde gösterilecekse aksiyonun kendi isLoading'ini kullan.",
|
|
452
|
+
"Çocuklar 12 kolonlu ızgarada konumlanır (blocks.position), akış değil: add_component ile birden çok çocuk eklerken hepsi y:0 alır ve üst üste biner. İçeriği tek bir flex container (ya da form) içine koyup onu ekle.",
|
|
453
|
+
"Klavye ve erişilebilirlik: role=dialog, adı title; aria-modal bilerek YOK (portal'daki seçim listeleri panelin dışında kalır). Açılışta odak kapat düğmesine gelir, Tab panel içinde döner (Select/MultiSelect girdisinden de çıkmaz), kapanınca odak açan öğeye döner; Esc yalnız EN ÜSTTEKİ katmanı kapatır. Panel içinde açık bir dropdown/multi-select listesi ya da açılır menülü aksiyonun menüsü varken ilk Esc yalnız onu kapatır, sonraki Esc paneli kapatır. Menülü aksiyondan bir seçenek seçilince menü kapanır ve odak o aksiyonun menü düğmesine döner (panel dışına, sayfaya düşmez). Perdede mousedown odağı çalmaz. prefers-reduced-motion: reduce iken kayma animasyonu (giriş ve çıkış) çalışmaz. Açıkken sayfa kaydırması kilitlenir ve kapanınca sayfanın önceki değeri geri gelir. Perde panelle birlikte gider ve arkadaki sayfaya tıklamayı yutar: panel açıkken başka bir satıra tıklamak yalnız paneli kapatır.",
|
|
454
|
+
"Altlık aksiyonları position'a göre iki gruba ayrılır: position 'left' olan sol, DİĞERLERİ (yazılmayan dahil) sağ grupta çizilir; aksiyonun bildirilen varsayılanı 'right'tır (2026-10-05'e kadar sözlük 'left' diyordu ama çalışma anı yazılmayanı sağa koyuyordu). Sola almak için position: 'left' yaz. Sarma olursa sağ grup kendi satırında sağa yaslanır. Aksiyonlarda flow değeri { type: 'flow', ref: <akış kimliği> } sarmalıdır; type: 'submit' aksiyonu formId'deki formu gönderir (formId bir bileşen adı ya da elementId'dir; düğümün iç GUID'i çözülmez) ve kendi flow'unu ÇALIŞTIRMAZ, type: 'button' kendi flow'unu çalıştırır.",
|
|
455
|
+
"options dolu aksiyon açılır menü olur (optionsTitle başlık): seçilen SEÇENEĞİN kendi flow'u çalışır, seçenekte flow yoksa aksiyonun flow'u; currentItem seçenektir (key ile dallanabilirsin). 2026-10-05'e kadar seçeneğin flow'u HİÇ çalışmıyor, hep aksiyonunki çalışıyordu. isDisabled seçenek tıklanmaz, isHidden çizilmez, isDanger kırmızı çizer. Menü panelin üstünde açılır ve kırpılmaz."
|
|
456
|
+
],
|
|
457
|
+
propNotes: {
|
|
458
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens +
|
|
459
|
+
" Drawer'da yüzey PANELİN kökünde derlenir (portal'dan dolayı düğüm kutusu yoktur); contentOverflow panelin KÖKÜNE iner (hidden → başlık bandı gibi taşan çocuklar panelin yuvarlak köşelerinde kırpılır); gövde zaten kendi içinde kayar, başlık ve aksiyonlar kaydırılmaz.",
|
|
460
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
461
|
+
" Drawer'da parçalar: &__header, &__title, &__description, &__close, &__body, &__footer, &__actions, &__overlay. Sınıf adları ng-drawer / ng-drawer__header / ng-drawer-body / ng-drawer-footer / ng-drawer__overlay olduğundan '& .ng-drawer-body p' gibi iç içe seçici de yazılabilir ama parça adları kalıcı sözleşmedir.",
|
|
462
|
+
size: "default 400 · medium 600 · large 800 · x-large 1120 · 2x-large 1280 px · full tüm ekran; ekran dar ise ekrana sığar, 767 px ve altında %90.",
|
|
463
|
+
position: "Fiziksel kenar: left | right (varsayılan left). RTL'de aynalanmaz.",
|
|
464
|
+
isLoading: 'Gövdeyi yükleniyor göstergesiyle örter ve aksiyonları kilitler; çocuklar yerinde kalır (form değerleri silinmez). Panel düzeni değişmez.',
|
|
465
|
+
isDismissDisabled: 'Kapat düğmesini gizler; perdeye tıklama ve Esc de kapatmaz — panelden yalnız aksiyonlarla çıkılır. close olayı bu yollardan yayılmaz.'
|
|
466
|
+
}
|
|
387
467
|
},
|
|
388
468
|
dropdown: {
|
|
389
469
|
summary: 'Tek seçim listesi; options statik verilebilir ya da mount/search akışıyla uzaktan doldurulur.',
|
|
@@ -422,7 +502,7 @@ export const componentKnowledge = {
|
|
|
422
502
|
'Liste açıldığında seçili olanlar (ve seçili çocuğu olan başlıklar) başa alınır; sıra liste AÇILDIĞI ANDA dondurulur, seçim değiştikçe satırlar zıplamaz.',
|
|
423
503
|
"optionType='grouped' iken children alt satırları çizer; çocuğu olan satır VARSAYILAN OLARAK SEÇİLEMEZ: kutusu çizilmez ve satırın kendisi disabled'dır, açıp kapatmak yalnız sağdaki ok düğmesiyle (ya da klavyede Enter/ok tuşlarıyla) olur — başlık da seçilebilsin isteniyorsa o option'a isSelectable ver. optionType='single' iken children/isExpanded/isSelectable okunmaz.",
|
|
424
504
|
'Arama kutusu boşken Backspace son etiketi siler; etiketler tek satıra sığmazsa fazlası "+n" rozetinde toplanır (kilitli/viewmode alanda rozet tıklanınca kalanları listeler).',
|
|
425
|
-
"Doğrulama kuralları: required · minItems · maxItems (2026-09-11; `pattern` bildirimi kaldırıldı — değeri dizi olan alanda uygulanacak metin yok ve panelde hiç çizilemiyordu). Panel bu iki sayı kuralını 'Min length' / 'Max length' adıyla çizer; dizide uzunluk = SEÇİLİ ELEMAN SAYISI."
|
|
505
|
+
"Doğrulama kuralları: required · minItems · maxItems (2026-09-11; `pattern` bildirimi kaldırıldı — değeri dizi olan alanda uygulanacak metin yok ve panelde hiç çizilemiyordu). Panel bu iki sayı kuralını 'Min length' / 'Max length' adıyla çizer; dizide uzunluk = SEÇİLİ ELEMAN SAYISI. minItems/maxItems yazılırsa gateway min-length/max-length'e çevirir."
|
|
426
506
|
],
|
|
427
507
|
propNotes: {
|
|
428
508
|
value: "Seçili değerlerin dizisi — ilişki alanlarında etiket değil id yazılır/okunur. Düz değer dizisi de (['a', 'b']) geçerlidir; etiketler options yüklendiğinde tazelenir.",
|
|
@@ -443,7 +523,7 @@ export const componentKnowledge = {
|
|
|
443
523
|
"Seçenekler iki kaynaktan gelir: statik options prop'u yerel olarak süzülür; komponente search olayına akış bağlıysa süzme SUNUCUDADIR ve options akıştan geldiği gibi gösterilir (dropdown/autocomplete deseninin aynısı). Eklenmiş etiketler her iki modda da listeden düşer.",
|
|
444
524
|
'Olaylar: mount (render katmanı atar) · change (etiket eklenince/silinince/rengi değişince, setter) · search · focus · blur. Etiketin rengini değiştirmek de change yayar — renk değerin parçasıdır.',
|
|
445
525
|
'Yinelenen etiket eklenemez: ölçü kırpılmış + küçük harftir ("Ankara" varken "ankara" eklenmez). Yapıştırma , ve satır sonundan böler, her parça ayrı etiket olur; options ile eşleşen parça seçeneğin RENGİYLE eklenir.',
|
|
446
|
-
"Zorunluluk ve eleman SAYISI sınırı Validations'tan kurulur: Required · Min length · Max length. Dizi alanında 'length' eleman sayısını ölçer (CQ-226 ad ikiliği). Bileşen bu sınırı kendisi GÖRMEZ, yani sınır dolunca giriş kapanmaz, kural gönderimde işler (CQ-093)."
|
|
526
|
+
"Zorunluluk ve eleman SAYISI sınırı Validations'tan kurulur: Required · Min length · Max length. Dizi alanında 'length' eleman sayısını ölçer (CQ-226 ad ikiliği); minItems/maxItems yazılırsa gateway min-length/max-length'e çevirir. Bileşen bu sınırı kendisi GÖRMEZ, yani sınır dolunca giriş kapanmaz, kural gönderimde işler (CQ-093)."
|
|
447
527
|
],
|
|
448
528
|
propNotes: {
|
|
449
529
|
value: 'Seçili etiketler: [{ value, color? }]. Renk hex (#rrggbb); verilmezse etiket gri çizilir.',
|
|
@@ -462,11 +542,11 @@ export const componentKnowledge = {
|
|
|
462
542
|
behavior: [
|
|
463
543
|
"change HER TUŞTA yayılır; değer kesinleşince (blur/Enter) changed yayılır — arama sorgusu ya da kayıt gibi pahalı akışı changed'e (ya da enter'a) bağla, change'e değil.",
|
|
464
544
|
"enter yalnız Enter'da yayılır; textinput bir form içindeyse Enter aynı anda formun submit akışını da tetikler — kaydetmeyi forma bağla, enter'a bağlarsan iki kez çalışır.",
|
|
465
|
-
"inputMask seçiliyse
|
|
545
|
+
"inputMask seçiliyse KULLANICININ yazdığı metin anında maskeye biçimlenir ve value biçimli hâlidir ('0(555) 123 45 67'); kullanıcı yazarken maske dışı karakterler sessizce düşer. Akıştan/kayıttan yazılan değer ise OLDUĞU GİBİ kalır (ekranda biçimli görünür). Form, biçimlenince hiçbir karakter kaybetmeyen ham değeri ('5551234567') kabul eder ve akışa HAM gönderir; karakter kaybettiren değer ('+905551234567', fazla hane, küçük harf) ile tarih/saat/son kullanma maskelerindeki ayraçsız değer 'Value does not match the selected input mask.' ile formu kilitler — o maskelere akıştan biçimli yaz. Ham rakam istiyorsan akışta ayıkla (2026-10-03)."
|
|
466
546
|
],
|
|
467
547
|
propNotes: {
|
|
468
548
|
clearable: 'Değer varken alanın sağında × düğmesi çizer; tıklanınca value boşalır ve change + changed yayılır. Kilitli (disabled/readonly/viewmode/loading) alanda çizilmez.',
|
|
469
|
-
inputMask: "Hazır maske anahtarı (pattern:/date:/time:/regex:…); serbest desen için 'custom:' öneki ('custom:(###) ###-####').",
|
|
549
|
+
inputMask: "Hazır maske anahtarı (pattern:/date:/time:/regex:…); serbest desen için 'custom:' öneki ('custom:(###) ###-####'). IBAN anahtarı 'iban:TR## #### #### #### #### #### #### ##' dizesi 28 # okunur ama deseni TR + 24 rakamdır (26 karakter); geçerli TR IBAN biçimlenir ve Form maske denetiminden geçer (2026-10-03).",
|
|
470
550
|
prefixIcon: "Alanın İÇİNDE solda çizilen salt görsel ikon ({ name: 'search' }); value'ya karışmaz. Renk verilmezse ikincil metin rengi. Viewmode'da hiç çizilmez: alan düz metne döner ve ikon yuvası kadar girinti bırakmaz.",
|
|
471
551
|
suffixIcon: "Alanın içinde sağda çizilen ikon; × ve spinner'ın sağında durur. Viewmode'da hiç çizilmez.",
|
|
472
552
|
maxChars: "SERT sınır: fazlası YAZILAMAZ (maskesizde tarayıcı maxlength'i, maskelide biçimlenmiş değer kesilir). Akıştan gelen daha uzun değer aynen gösterilir, yeniden yazılmaz (sayaç 45/40 okur). validations.maxLength'ten FARKLIDIR: o yalnız doğrular. 0/boş = sınırsız.",
|
|
@@ -511,7 +591,9 @@ export const componentKnowledge = {
|
|
|
511
591
|
"change HER TUŞTA ve artı/eksi düğmesinde yayılır; değer kesinleşince (blur/Enter, düğme tıklaması) changed yayılır — sorgu ya da kayıt gibi pahalı akışı changed'e (ya da enter'a) bağla.",
|
|
512
592
|
"minValue/maxValue yazarken değil KESİNLEŞİNCE kırpar: min 10 alanına '15' yazılabilir (ilk tuşta 1 → 10'a çekilmez); blur/Enter'da aralık dışı değer sınıra çekilir ve change+changed yayılır. 0 gerçek sınırdır, boş = sınırsız.",
|
|
513
593
|
"Boşaltılan alan 0 sayılır: silinince change 0 yayılır, blur'da alan 0 gösterir; null/boş değer durumu yoktur. placeholder yalnız value akıştan null/boş yazıldığında görünür.",
|
|
514
|
-
"allowDemicalPoints kapalıyken tarayıcının native number alanıdır (tam sayı kullanımı; step tam sayı ver), açıkken locale'e göre biçimlenen metin alanıdır (tr 1.250,50 / en 1,250.50) — decimalPlaces, useThousandsSeparator ve locale yalnız açıkken okunur. Modu kapatıp açmak kesri düşürür."
|
|
594
|
+
"allowDemicalPoints kapalıyken tarayıcının native number alanıdır (tam sayı kullanımı; step tam sayı ver), açıkken locale'e göre biçimlenen metin alanıdır (tr 1.250,50 / en 1,250.50) — decimalPlaces, useThousandsSeparator ve locale yalnız açıkken okunur. Modu kapatıp açmak kesri düşürür.",
|
|
595
|
+
"required 0'ı da BOŞ sayar: kullanıcının sildiği kutu 0 yayar ve yine 'zorunlu' hatası verir. 0 meşruysa required koyma; 'pozitif olmalı' için min-value: 1 kullan. value'yu açıkça yaz: yazılmazsa ekranda 0 görünür ama form boş sayar ve kullanıcının o boş kutuya yazdığı 0 olay yaymaz (ölçüldü 2026-10-03).",
|
|
596
|
+
"Tam sayı kipinde (allowDemicalPoints kapalı) alan tarayıcının min/max/step denetimini taşır ve Form'da novalidate yoktur: açılışta ya da akıştan gelen aralık dışı ya da adım ızgarası dışı değer (değersiz düğümün gösterdiği 0 + minValue 1, akıştan 15 > maxValue 10, akıştan 2.5 + step 1) Kaydet'te TARAYICI balonuyla gönderimi durdurur — submit akışı koşmaz, hata listesi boş kalır, aynı formdaki diğer alanların hataları da görünmez. Kullanıcının yazdığı aralık dışı değer blur/Enter'da sınıra çekilir; adım dışı ondalık (2.5, step 1) çekilmez ve aynı balona takılır. Adım ızgarası minValue'dan başlar (min 1, step 10 → 1, 11, 21…); bileşenin + düğmesi 0'dan 10 üretip balona takılabilir. Bu yüzden value'yu aralıkta ve ızgarada yaz, minValue 0'dan büyükse value'yu mutlaka yaz. isReadonly alan bu denetimden muaftır. Ondalık kipte (allowDemicalPoints açık) min/max/step hiç uygulanmaz: akıştan gelen aralık dışı değer olduğu gibi gider (ölçüldü 2026-10-03)."
|
|
515
597
|
],
|
|
516
598
|
propNotes: {
|
|
517
599
|
prefix: "Girdinin içinde SOLDA çizilen salt görsel ek (₺, $ gibi); value'ya karışmaz. Viewmode'da da çizilir — değerin anlamını taşır.",
|
|
@@ -526,21 +608,23 @@ export const componentKnowledge = {
|
|
|
526
608
|
incrementalinput: {
|
|
527
609
|
summary: 'Otomatik kod alanı: önek + ayraç + sıfır dolgulu sayaç (INV-0001); sıradaki kodu runtime’da sunucudan çeker. Sayısal stepper DEĞİLDİR — artır/azalt için numberinput.',
|
|
528
610
|
behavior: [
|
|
529
|
-
|
|
611
|
+
"MCP ile kurarken separator, counter, digitcount, autoFetchNextCode:true ve field AÇIKÇA yazılır: component_get.defaults (separator '-', counter 1, digitcount 2, autoFetchNextCode true) yalnız Studio'dan bırakılan düğüme yazılır; düğümde yoksa bileşen ''/null/null/false okur, alan düz metin kutusuna döner, istek gitmez ve kayıt NULL gider (ölçüldü 2026-10-02).",
|
|
612
|
+
"Sunucu isteği YALNIZ runtime rotalarında atılır (/preview, /view, /dev, /branch) ve ilki 1 sn gecikmeyle gider; tasarım kanvasında hiç atılmaz. Değer boşken alan (kanvasta VE runtime'da) counter'dan YERELDE hesaplanan kodu gri yer tutucu olarak gösterir — bu, sunucunun vereceği numara da değer de DEĞİLDİR (ölçüldü 2026-10-02: yer tutucu NUL-0001, gerçek sıradaki NUL-0003).",
|
|
530
613
|
'İstek POST entities/{entityId}/row/next-code — entity + alan (field) seçilmeden, sayaç ya da hane 0 iken, ya da önek varken ayraç boşken hiç gitmez. Önek BOŞ olabilir: o zaman ayraç da düşer ve kod yalnız sayaçtır.',
|
|
531
614
|
'change olayı İKİ farklı yük taşır: sunucudan kod gelince değer NESNEdir ({ Prefix, Separator, Counter, DigitCount, FieldId }) — kodun metni değil kodu ÜRETEN şekil; kullanıcı elle yazınca değer düz METİNdir. self.value okuyan akış ikisini de karşılamalı.',
|
|
532
|
-
|
|
615
|
+
"Elle yazılan değer korunur: yazmaya başlandıktan sonra dönen sunucu yanıtı atılır, alan yeniden yazılmaz. Değer dolu METİNse istek hiç gitmez. İstek açılışta bir kez gider; runtime'da akış şekil prop'unu (prefix/counter…) değiştirirse yeni istek ÖNCEKİ şekille gider (ölçüldü 2026-10-02: prefix YEN yazıldı, kod NUL-0008 kaydedildi) — şekli akıştan değiştirme.",
|
|
616
|
+
"Form temizlenince (isClearFormInputsAfterSubmit ya da resetForm) değer null olur ve yeni kod GELMEZ: art arda kayıtta ikinci kayıt kodsuz gider (nullable alanda NULL, NOT NULL alanda 400 RowValidationFailed). Ardışık kayıt formunda temizlemeyi KAPALI tut — değer şekil nesnesi kalır ve backend her kayıtta yeni kod üretir (ölçüldü: WRK-0009, WRK-0010); ekranda eski kod kalır, yeni numarayı kayıttan dönen satırdan al.",
|
|
533
617
|
'next-code isteği başarısız olursa alan invalid görünür ve hata metni invalidText’in YERİNE yazılır — panelde isInvalid kapalı olsa bile.',
|
|
534
618
|
'Dört kip ekranda ayrı görünür: isDisabled gri + tıklanamaz, isReadonly okunur zemin, isViewmode çerçevesiz düz metin (önizleme de çizilmez), isLoading alanı dondurur ve sağda spinner döndürür. İstek sürerken bileşen isLoading görünümünü KENDİSİ açar.'
|
|
535
619
|
],
|
|
536
620
|
propNotes: {
|
|
537
|
-
value:
|
|
538
|
-
prefix:
|
|
539
|
-
separator:
|
|
540
|
-
counter:
|
|
541
|
-
digitcount:
|
|
621
|
+
value: "Ya sunucudan gelen şekil nesnesi ya da elle yazılmış metin (davranışa bak). Nesneyi uca OLDUĞU GİBİ gönder: backend kodu üretir ve alanı kod METNİYLE değiştirir (satırda INV-0003 gibi metin durur, nesne değil). Nesnedeki Counter başlangıç değeridir, kaydedilen numara değil; kod metni akışta YOKTUR — kayıttan dönen satırdan oku (Steps.<adım>.data.<alan>) (ölçüldü 2026-10-02).",
|
|
622
|
+
prefix: "Kodun başındaki sabit ek (INV). Boş bırakılabilir; boşsa ayraç da yazılmaz. Backend sınırı en çok 3 karakter: önizleme fazlasını gösterir ama kayıt 400 InvalidParameterException ile düşer, satır yazılmaz (ölçüldü 2026-10-02).",
|
|
623
|
+
separator: "Önek ile sayaç arasındaki ayraç. Önek varsa ZORUNLUDUR — boşsa kod hiç üretilmez. Backend sınırı 1 karakter: '--' önizlenir ama kayıt 400 InvalidParameterException ile düşer.",
|
|
624
|
+
counter: "Sayacın başlangıç değeri (en az 1). Sıradaki numarayı backend belirler; bu değer isteğin başlangıç noktasıdır. Numara alan başına TEK sıradır: önek değişse de kaldığı yerden devam eder (ölçüldü: INV-0002'den sonra NUL önekiyle ilk kod NUL-0003).",
|
|
625
|
+
digitcount: "Sayacın kaç haneye sıfırla doldurulacağı (1–12): 4 → 0001. 12'yi aşan değer önizlenir ama kayıt 400 InvalidParameterException ile düşer.",
|
|
542
626
|
autoFetchNextCode: 'Kapalıyken istek atılmaz VE önek/ayraç/sayaç/hane hiç okunmaz — alan düz bir metin girdisine döner, kanvas önizlemesi de kaybolur.',
|
|
543
|
-
field: 'Kodun hangi tablonun hangi alanı üzerinden ilerleyeceği (
|
|
627
|
+
field: 'Kodun hangi tablonun hangi alanı üzerinden ilerleyeceği. Biçim: JSON metni {"entityId":"<GUID>","fieldId":"<GUID>"} (Studio bunu yazar) ya da aynı anahtarlı nesne; ikisi de GUID. Slug çalışmaz: düz slug sessizce istek atmaz, JSON içinde slug 404 alır; { entity, field } anahtarları okunmaz. Alan Incremental tipinde ve formun YAZDIĞI alanla aynı olmalı — değilse önizleme çalışır ama kayıt 400 InvalidParameterException ile düşer (ölçüldü 2026-10-02).',
|
|
544
628
|
placeholder: 'Alan boşken görünen metin. Otomatik çekme açıkken önizlenen kod bunu EZER; buradaki metin yalnız otomatik çekme kapalıyken görünür.',
|
|
545
629
|
prefixIcon: "Alanın İÇİNDE solda çizilen salt görsel ikon ({ name: 'tag' }); value'ya karışmaz. Viewmode'da çizilmez.",
|
|
546
630
|
suffixIcon: "Alanın içinde sağda çizilen ikon; yükleniyor spinner'ının sağında durur. Viewmode'da çizilmez.",
|
|
@@ -573,8 +657,9 @@ export const componentKnowledge = {
|
|
|
573
657
|
'Bir tık İKİ olay yayar: önce change, sonra yeni duruma göre checked ya da unchecked. Üçü de setter’dır (self.value yazılır) — kaydı yalnız BİRİNE bağla, yoksa akış iki kez koşar. checked/unchecked yalnız "işaretlenince şunu yap" gibi tek yönlü işler için vardır.',
|
|
574
658
|
'Kilitli (isDisabled/isReadonly/isViewmode) ya da isLoading olan kutu hiçbir olay yaymaz; focus/blur de susar.',
|
|
575
659
|
'value akıştan METİN gelirse: "false" · "0" · "no" · "off" · "null" · "undefined" · "nan" · boş metin YANLIŞ sayılır, kalan dolu metin doğru. Yine de alana boolean yaz — sözleşme boolean’dır.',
|
|
576
|
-
'Zorunluluk prop değil, Form’un doğrulama listesinden gelir (`required`). checkbox’ın TEK doğrulama kuralı odur — panel boolean tipinin listesini çizer, desen/uzunluk kuralı yoktur.
|
|
577
|
-
'Birden çok seçenek gerekiyorsa checkbox yığmak yerine checkboxgroup kullan: değeri string[] ve seç-tümü/sayaç onda hazır.'
|
|
660
|
+
'Zorunluluk prop değil, Form’un doğrulama listesinden gelir (`required`). checkbox’ın TEK doğrulama kuralı odur — panel boolean tipinin listesini çizer, desen/uzunluk kuralı yoktur.',
|
|
661
|
+
'Birden çok seçenek gerekiyorsa checkbox yığmak yerine checkboxgroup kullan: değeri string[] ve seç-tümü/sayaç onda hazır.',
|
|
662
|
+
"required = kutu İŞARETLİ olmalı: işaretsiz (false) kutu boş sayılır ve 'zorunlu' hatası verir — onay/şart kabul kutusu için doğru kullanım. false meşru bir cevapsa required koyma (ölçüldü 2026-10-03)."
|
|
578
663
|
],
|
|
579
664
|
propNotes: {
|
|
580
665
|
labelPosition: "Etiketin kutuya göre yeri: 'right' (varsayılan, kutu solda) ya da 'left'. Kutu her iki yerleşimde de etikete yapışır; ayrı bir hizalama prop’u yoktur, satırın hizası düğümün appearance kanalından gelir.",
|
|
@@ -593,7 +678,8 @@ export const componentKnowledge = {
|
|
|
593
678
|
'value akıştan METİN gelirse: "false" · "0" · "no" · "off" · "null" · "undefined" · "nan" · boş metin YANLIŞ sayılır, kalan dolu metin doğru (checkbox ile ortak normalizasyon). Yine de alana boolean yaz — sözleşme boolean’dır.',
|
|
594
679
|
'Zorunluluk prop değil, Form’un doğrulama listesinden gelir (`required`). switch’in TEK doğrulama kuralı odur — panel boolean tipinin listesini çizer, desen/uzunluk kuralı yoktur.',
|
|
595
680
|
'isIndeterminate YOKTUR ve bilerek eklenmedi: anahtar tanımı gereği ikili, "kısmen açık" diye bir durumu yok. Üçüncü durum gerekiyorsa checkbox kullan.',
|
|
596
|
-
'Anahtarın rengi TEMANIN vurgu renginden gelir; renk prop’u yoktur ve style düğümün KÖKÜNE yazılır (kolun kendisine ulaşmaz) — "yeşil anahtar" gibi bir istek tema ayarıdır, prop değil.'
|
|
681
|
+
'Anahtarın rengi TEMANIN vurgu renginden gelir; renk prop’u yoktur ve style düğümün KÖKÜNE yazılır (kolun kendisine ulaşmaz) — "yeşil anahtar" gibi bir istek tema ayarıdır, prop değil.',
|
|
682
|
+
"required = anahtar AÇIK olmalı: kapalı (false) anahtar boş sayılır ve 'zorunlu' hatası verir. Kapalı da meşru bir seçimse required koyma (ölçüldü 2026-10-03)."
|
|
597
683
|
],
|
|
598
684
|
propNotes: {
|
|
599
685
|
labelPosition: "Etiketin anahtara göre yeri: 'right' (varsayılan, anahtar solda) ya da 'left'. Anahtar her iki yerleşimde de etikete yapışır; yükleniyor spinner'ı kolla etiketin ARASINDA durur — 'right'ta kolun sağında, 'left'te satırın sonunda.",
|
|
@@ -723,7 +809,7 @@ export const componentKnowledge = {
|
|
|
723
809
|
fileUpload: {
|
|
724
810
|
summary: 'Sürükle-bırak yükleme ALANI (dropzone): büyük bir hedef kutu, tıklayınca da dosya penceresi açar, seçilenleri silinebilir çip listesi olarak gösterir ve görselleri kırpabilir. Tek satırlık alan için fileInput, düz buton için filebutton. Seçim self.value’dan okunur.',
|
|
725
811
|
behavior: [
|
|
726
|
-
"Komponentin YAYDIĞI value her zaman DİZİDİR
|
|
812
|
+
"Komponentin change ile YAYDIĞI value her zaman DİZİDİR — isMultiple:false iken de tek elemanlı dizi, çip silinince []. Yeni seçilen dosya { type:'file', ref:'', fileName, value:<base64 data URL> } olur; akışın yazdığı kayıtlı dosyalar listede OLDUĞU GİBİ kalır. Akışın yazdığı değer change gelene kadar yazıldığı şekliyle durur (nesne yazdıysan value nesnedir). Kayıtlı dosyayı geri basmak için uç ya da workflow table get adımının döndüğü FILE değerini OLDUĞU GİBİ yaz — tekil alanda { type:'ref', value:<fileId>, fileName, absolute_path, … }, çoka-çok alanda bunun dizisi: her dosya ayrı çipte adıyla çizilir, dokunmadan kaydetmek dosyaları korur. Düz URL metni ya da dizisi YAZMA: çip aynı görünür ama kayıt bozulur — çoka-çok alanda 500 JsonException, tekil alanda dosya sessizce silinir, bir çip silinince kalan URL { type:'file', value:<URL> } olarak yayılır ve 500 FormatException verir (ölçüldü 2026-10-02).",
|
|
727
813
|
'Çipe tıklamak o dosyayı listeden siler ve change olayını KALAN listeyle yayar; ayrı bir silme olayı yoktur. Kilitliyken (isDisabled/isReadonly/isViewmode) ne ekleme ne silme olur, sürükleme de tepki vermez.',
|
|
728
814
|
'allowedFiletypes KAPALI bir uzantı listesidir: seçilmeyen uzantı dosya penceresinde de görünmez, sürüklenirse reddedilir ve komponentin içinde tür uyarısı çizilir. jpg ve jpeg AYRI satırdır — ikisini de kabul edeceksen ikisini de seç. Listede HİÇ olmayan bir uzantı için customFiletypes metin alanına yaz ("heic, p7m" — virgül/boşluk/noktalı virgül ayırır, baştaki . ve * atılır, küçük harfe iner); iki kaynak birleşir. İkisi de boşsa her tür serbesttir.',
|
|
729
815
|
'maxFileSizeMb / maxFileCount yalnız kullanıcıya hızlı geri bildirimdir, sunucu tarafını bağlamaz. 0, negatif ya da boş değer SINIRSIZ demektir. Sınıra takılan dosya listeye girmez, geçenler girer (hepsi ya da hiçbiri değil); boyut ihlali adet ihlalinin önüne geçer. Adet sınırı çok seçimde zaten seçili dosyaları da sayar.',
|
|
@@ -732,7 +818,7 @@ export const componentKnowledge = {
|
|
|
732
818
|
'Doğrulama: required ve pattern. isInvalid/invalidText Form’un merkezi hatasıdır; komponentin kendi tür ve sınır uyarıları ondan ayrı çizilir.'
|
|
733
819
|
],
|
|
734
820
|
propNotes: {
|
|
735
|
-
value: "Panelde GİZLİ (.hide()):
|
|
821
|
+
value: "Panelde GİZLİ (.hide()): akıştan bağla, change'den sonra self.value ile oku. Kayıtlı dosyayı forma basarken uç/workflow get adımının FILE değerini (type:'ref') OLDUĞU GİBİ yaz, düz URL yazma. TEKİL FILE alanına gönderirken diziyi açmak ZORUNLU — değer v ise Array.isArray(v) ? (v[0] || { type:'ref', value:null }) : v. Dizi gönderilirse tablo ucu 200 döner ama alanı sessizce NULL'lar: yeni dosya açılmaz, mevcut dosya da silinir. Yalnız v[0] da yetmez: dokunulmamış formda değer akışın yazdığı nesnedir. Çoka-çok alana değer olduğu gibi gider: X ile silinen dosya düşer, kalan type:'ref' kayıtları korunur, yeni dosyalar açılır (ölçüldü 2026-10-02). Tasarımda value'ya drive dosyası BAĞLAMA ({ type:'file', ref:<fileId> } — Studio panelinin dosya seçicisi de bunu yazar): çalışma anı değeri { type:'file', ref, data:<URL> } olur, çip dosya adı yerine URL yazar ve kullanıcı dokunmadan kaydederse backend type:'file' kaydında yalnız value'yu okuduğu için tekil alan sessizce NULL'lanır (200 döner, mevcut dosya silinir; NOT NULL alanda 400 InvalidParameterException). Varsayılan dosya gerekiyorsa value'yu static ref nesnesi olarak ver: { type:'static', data:{ type:'ref', value:'<fileId>', fileName, absolute_path } } — çip adıyla çizilir, dokunmadan kayıt dosyayı yazar (ölçüldü 2026-10-02).",
|
|
736
822
|
customFiletypes: "allowedFiletypes listesinde HİÇ olmayan uzantılar için serbest metin: 'heic, p7m' (virgül/boşluk/noktalı virgül ayırır). İki kaynak birleşir; fileInput'taki aynı adlı prop'la aynı sözleşme.",
|
|
737
823
|
size: "sm | md | lg — metin ve ikon ölçeğini değiştirir; boş bırakılırsa uygulamanın form boyutu geçerlidir (2026-09-17 öncesinde hiçbir etkisi yoktu).",
|
|
738
824
|
isMultiple: 'Kapalıyken yeni seçim eskisinin YERİNE geçer, listeye eklenmez.',
|
|
@@ -750,7 +836,7 @@ export const componentKnowledge = {
|
|
|
750
836
|
'isLoading prop’u YOKTUR ve bilinçlidir (CQ-215): bu dosya ailesinde yükleniyor sözcüğü alan kilidi mi yükleme ilerlemesi mi, karar verilmedi. Alanı dondurmak için isDisabled kullan.'
|
|
751
837
|
],
|
|
752
838
|
propNotes: {
|
|
753
|
-
value:
|
|
839
|
+
value: "Tek dosyada NESNE, isMultiple açıkken nesnelerin DİZİSİ. Kullanıcının seçtiği YENİ dosya { type:'file', fileName, value:<base64 data URL> } olarak gelir ve uca böyle gider; çoklu kipte yeni seçim dizinin sonuna eklenir ve kayıtta yalnız o dosya açılır. Kayıtlı dosyayı forma geri basarken uç ya da workflow table get adımının döndüğü FILE değerini OLDUĞU GİBİ yaz — tekil alanda nesne ({ type:'ref', value:<fileId>, fileName, absolute_path, … }), çoka-çok alanda bu nesnelerin dizisi: kullanıcı dokunmadan kaydederse aynı değer uca gider, dosyalar referans olarak korunur, yeni dosya açılmaz; X ile silinen dosya gövdeden düşer. Tek dosyada çip adıyla çizilir; 2+ dosyada çip 'N dosya seçildi' yazar, adlar çipe tıklayınca açılan listededir. Kayıtlı dosyayı type:'file' ile (value'da URL ya da guid) YAZMA: ekranda fark görünmez ama backend value'yu base64 diye çözer ve kayıt 500 FormatException ile düşer. Asgari { type:'ref', value:<fileId> } kaydı geçirir ama tek dosya çipi 'undefined' yazar; fileName ve absolute_path da taşınmalı. row_get/row_list şekillerini uca geri yazma: tekil alanda düz guid ya da { id, display_name } tablo kaynaklı uçta alanı SESSİZCE NULL'lar (200; workflow table adımı bu ikisini doğru bağlar); çoka-çok alanda row_get/row_list'in [{ id, display_name }] dizisi uçta DA workflow table adımında DA bütün dosyaları sessizce siler, düz guid dizisi 500 JsonException verir. Boşaltmak için tekil alanda { type:'ref', value:null }, çoklu alanda [{ type:'ref', value:null }] ya da []. (ölçüldü 2026-10-02) Tasarımda value'ya drive dosyası BAĞLAMA ({ type:'file', ref:<fileId> } — Studio panelinin dosya seçicisi de bunu yazar): çalışma anı değeri { type:'file', ref, data:<URL> } olur, çip dosya adı yerine URL yazar ve kullanıcı dokunmadan kaydederse backend type:'file' kaydında yalnız value'yu okuduğu için tekil alan sessizce NULL'lanır (200 döner, mevcut dosya silinir; NOT NULL alanda 400 InvalidParameterException). Varsayılan dosya gerekiyorsa value'yu static ref nesnesi olarak ver: { type:'static', data:{ type:'ref', value:'<fileId>', fileName, absolute_path } } — çip adıyla çizilir, dokunmadan kayıt dosyayı yazar (ölçüldü 2026-10-02).",
|
|
754
840
|
button_text: 'Gözat butonunun metni (varsayılan Browse); boşaltılırsa buton HİÇ çizilmez, görüntüleme ve salt okunur kiplerde de çizilmez. Adın snake_case olması kayıtlı sayfalar yüzündendir (ARC-085); buttonText yazmak unknown-prop verir.',
|
|
755
841
|
placeholder: 'Dosya seçilmemişken gösterilen metin; boş bırakılırsa uygulama dilinde hazır metin yazar (Dosya seçiniz / Choose a file).',
|
|
756
842
|
allowedFiletypes: 'Sabit listeden seçilen uzantılar (pdf, docx, doc, xlsx, xls, pptx, ppt, txt, csv, jpg, png, heic, zip…). Boş bırakmak her tür serbest demektir; listede olmayan uzantı için customFiletypes. Liste 2026-09-17’den beri bir ipucu değil gerçek bir ENGEL olduğu için her uzantı AYRI satırdır: jpg seçip jpeg seçmemek .jpeg dosyasını reddettirir, doc/docx ve xls/xlsx çiftleri de ayrıdır.',
|
|
@@ -769,10 +855,10 @@ export const componentKnowledge = {
|
|
|
769
855
|
"Olaylar: mount ve change. mount'ı platform her düğüm için yayar ama bileşen bildirmediği sürece akışa bağlanamıyordu (2026-09-17'de bildirime eklendi)."
|
|
770
856
|
],
|
|
771
857
|
propNotes: {
|
|
772
|
-
value: "Seçili dosya(lar). Panelde ÇİZİLİR ve akıştan yazılabilir (2026-09-17'ye kadar gizliydi, bu yüzden AI sözlüğünde de görünmüyordu): kayıtlı bir dosyayı forma geri basmanın yolu budur. Tekli kipte nesne, çoklu kipte dizi; boşaltmak için null (çoklu kipte []). Kipiyle uyuşmayan şekil de OKUNUR: çoklu kipte yazılan tek nesne listelenir, tekli kipte yazılan dizinin ilk dosyası çizilir (2026-09-17'ye kadar ikisi de sessizce hiçbir şey göstermiyordu). İçeriği olmayan kayıt (ne value ne data ne absolute_path) hiç çizilmez.",
|
|
858
|
+
value: "Seçili dosya(lar). Panelde ÇİZİLİR ve akıştan yazılabilir (2026-09-17'ye kadar gizliydi, bu yüzden AI sözlüğünde de görünmüyordu): kayıtlı bir dosyayı forma geri basmanın yolu budur. Tekli kipte nesne, çoklu kipte dizi; boşaltmak için null (çoklu kipte []). Kipiyle uyuşmayan şekil de OKUNUR: çoklu kipte yazılan tek nesne listelenir, tekli kipte yazılan dizinin ilk dosyası çizilir (2026-09-17'ye kadar ikisi de sessizce hiçbir şey göstermiyordu). İçeriği olmayan kayıt (ne value ne data ne absolute_path) hiç çizilmez. Tasarımda value'ya drive dosyası BAĞLAMA ({ type:'file', ref:<fileId> } — Studio panelinin dosya seçicisi de bunu yazar): çalışma anı değeri { type:'file', ref, data:<URL> } olur, çip dosya adı yerine URL yazar ve kullanıcı dokunmadan kaydederse backend type:'file' kaydında yalnız value'yu okuduğu için tekil alan sessizce NULL'lanır (200 döner, mevcut dosya silinir; NOT NULL alanda 400 InvalidParameterException). Varsayılan dosya gerekiyorsa value'yu static ref nesnesi olarak ver: { type:'static', data:{ type:'ref', value:'<fileId>', fileName, absolute_path } } — çip adıyla çizilir, dokunmadan kayıt dosyayı yazar (ölçüldü 2026-10-02).",
|
|
773
859
|
text: 'Butonun üzerindeki metin (varsayılan "Attach File"); ikon sabittir. Alanın başlığı ayrı bir prop\'tur: label.',
|
|
774
860
|
description: 'Butonun altındaki yardım metni. Dosya seçilir seçilmez yerini dosya listesi alır, seçim temizlenince geri gelir (fileInput ile aynı kural).',
|
|
775
|
-
allowedFiletypes: 'İzin verilen uzantılar (çoklu seçim, kapalı liste). Hem dosya diyaloğunun accept süzgecini hem de seçimden SONRAKİ denetimi besler: liste dışı bir dosya seçilirse değere girmez ve komponentin içinde "desteklenmiyor" uyarısı çizilir (2026-09-17; öncesinde yalnız diyalog süzgeciydi, "Tüm dosyalar" ile aşılabiliyordu). Hem allowedFiletypes hem customFiletypes boşsa her tür serbesttir.
|
|
861
|
+
allowedFiletypes: 'İzin verilen uzantılar (çoklu seçim, kapalı liste). Hem dosya diyaloğunun accept süzgecini hem de seçimden SONRAKİ denetimi besler: liste dışı bir dosya seçilirse değere girmez ve komponentin içinde "desteklenmiyor" uyarısı çizilir (2026-09-17; öncesinde yalnız diyalog süzgeciydi, "Tüm dosyalar" ile aşılabiliyordu). Hem allowedFiletypes hem customFiletypes boşsa her tür serbesttir.',
|
|
776
862
|
customFiletypes: 'Listede olmayan uzantılar, serbest metin ("heic, dwg;psd"). Virgül, noktalı virgül ve boşluk ayraçtır; baştaki nokta ve yıldız atılır, büyük/küçük harf fark etmez. allowedFiletypes ile BİRLEŞİR, onun yerine geçmez (fileInput ile aynı ad ve aynı kural). Çok parçalı uzantı da yazılabilir ("tar.gz"): eşleşme adın SONUNA bakar, son noktadan sonrasına değil.',
|
|
777
863
|
maxFileSizeMb: 'Dosya BAŞINA en büyük boyut (MB). Boş/0/negatif değer sınırsız demektir; aşan dosya değere girmez, uyarı komponentin içinde çizilir.',
|
|
778
864
|
maxFileCount: "Çoklu kipte toplam dosya sayısı sınırı — zaten seçili olanlar da sayılır. Boş/0/negatif sınırsız. Tekli kipte hiç okunmaz ve panelde de gizlidir (isMultiple'a bağlı).",
|
|
@@ -787,6 +873,10 @@ export const componentKnowledge = {
|
|
|
787
873
|
'Adresi ÇÖZÜLEMEYEN kaynak önizleme değil HATA kutusu çizer ve error yayar: yalnız kimliğini taşıyan kayıtlı referans ({ type: "ref", value: "abc" }, absolute_path yok) "dosya var" sayılır ama adresi yoktur. 2026-09-17 öncesinde boş src ile bir çerçeve çiziliyor, tarayıcı about:blank yüklüyor ve hiçbir şey gösterilmediği hâlde load yayılıyordu.',
|
|
788
874
|
'Adres ŞEMA SÜZGECİNDEN geçer: http(s), göreli yol, blob: ve gerçekten çizilen gömülü türler (data:application/pdf · data:image/* · data:text/*) geçer; javascript:, vbscript:, file: ve sayfa gibi açılabilen gömülü türler (data:text/html, application/xhtml+xml, image/svg+xml) boşa düşer ve hata kutusu çizilir. Gerekçe: aynı adres hem PDF çerçevesine hem de programatik tıklanan indirme bağlantısına yazılıyor, javascript: ikisinde de uygulamanın origin’inde çalışırdı — üstelik son yol parçası .pdf ile biten bir javascript: metni uzantı kuralından PDF dalına giriyordu.',
|
|
789
875
|
'Tür MIME’den, MIME yoksa UZANTIDAN okunur (drive dosyası ve düz URL MIME taşımaz): görsel · pdf · düz metin (txt md csv tsv log json xml yml yaml) önizlenir, gerisi unsupportedTitle/unsupportedText kutusuna düşer. 2026-09-17 öncesi yalnız bellekteki Blob çizilebiliyordu; URL ya da drive dosyası bağlanan her viewer "desteklenmeyen tür" gösteriyordu.',
|
|
876
|
+
'Adres UZANTISIZSA (indirme ucu: /api/invoices/42/download) tür ipucu olarak fileName’e bakılır: fileName: "fatura.pdf" yazılırsa PDF çizilir ve başlık/indirme adı da o olur (adresin kendi adı uzantısızsa). Görsel ve metinde bu yeter; PDF’te sunucunun Content-Type’ı da application/pdf olmalı — application/octet-stream tarayıcının PDF çerçevesinde açılmaz (boş çerçeve, yine de load yayılır). fileName’de de uzantı yoksa kutu "desteklenmeyen tür"dür.',
|
|
877
|
+
'Metin prop’larının (emptyTitle · emptyText · unsupportedTitle · unsupportedText · downloadText · errorText) şema varsayılanı BOŞTUR: yazılmazsa uygulama dilinin (tr · en · ar) kendi metni çizilir, yazılan metin her dilde aynen kalır. 2026-10-02 öncesi varsayılanlar sabit İngilizce idi ve tr/ar uygulamada bile İngilizce çıkıyordu. Uzun ve boşluksuz metin kutuyu taşırmaz (satırlara bölünür), kısa kutuda içerik kaydırılır. Bir metni boş yazarak SUSTURAMAZSIN (boş = dilin metni); gizlemek için style: { "&__card-text": { display: "none" } }.',
|
|
878
|
+
'Durumlar: yükleniyor (role=status, kökte aria-busy), boş, desteklenmeyen, hata (role=alert) kutuları ve önizleme. Hata KALICI değildir: value/file başka bir dosyaya geçince hata kutusu kalkar, aynı adrese dönülürse yeniden denenir ve her deneme kendi load/error’unu yayar (2026-10-02 öncesi bir kez hata alan viewer sonraki geçerli dosyada da hata kutusunda kalıyor ve load yaymıyordu). Metin önizlemesi klavyeyle odaklanır (region, adı dosya adı); simgeler ekran okuyucuya kapalıdır.',
|
|
879
|
+
'PDF çerçevesi HTTP durumunu bilmez: 404/403 dönen bir PDF adresinde hata kutusu çizilmez, sunucunun hata sayfası çerçevede görünür ve error yerine load yayılır. Görsel (img) ve metin (fetch) HTTP hatasında doğru şekilde error yayar. PDF adresinin varlığından emin değilsen önce akışta kontrol et.',
|
|
790
880
|
'isDownloadable bileşenin ÇİZDİĞİ bütün indirme yüzeylerini yönetir: önizlemenin köşesindeki düğme, desteklenmeyen tür kutusundaki düğme ve hata kutusundaki düğme. Kapalıyken (varsayılan) bunların hiçbiri çizilmez — 2026-09-17 öncesi desteklenmeyen tür kutusu bu anahtardan bağımsız indirme sunuyordu.',
|
|
791
881
|
'controls YALNIZ PDF’te iş yapar: tarayıcının yerleşik araç çubuğunu (sayfa gezinme, yakınlaştırma, yazdırma) açar; kapalıyken çerçeveye #toolbar=0 yazılır. DİKKAT: o araç çubuğu tarayıcının KENDİ indirme ve yazdırma düğmelerini de getirir ve isDownloadable ona ulaşamaz — indirmeyi gerçekten kapatmak isteyen controls’u da kapalı tutar (yalnız indirmeyi gizleyen bir çapa parametresi yoktur).',
|
|
792
882
|
'Başlık, alt metni ve indirme adı dosyanın KENDİ adından gelir; dosya ad taşımıyorsa fileName kullanılır. fileName runtime’a geri YAZILMAZ, yalnız yedek addır.',
|
|
@@ -796,8 +886,10 @@ export const componentKnowledge = {
|
|
|
796
886
|
file: 'Tasarımcının seçtiği dosya. Drive nesnesi ya da düz URL metni geçerlidir (CQ-267: şema tipi object görünür).',
|
|
797
887
|
value: 'Akışın setter ile yazdığı dosya; panelde çizilmez ve file’ı ezer.',
|
|
798
888
|
controls: 'PDF dışındaki türlerde etkisizdir. Açıkken tarayıcının kendi indirme/yazdırma düğmeleri de gelir; isDownloadable onları kapatamaz.',
|
|
799
|
-
errorText: 'Yalnız error hâlindeki kutunun başlığı; unsupported kutusu unsupportedTitle kullanır.',
|
|
800
|
-
|
|
889
|
+
errorText: 'Yalnız error hâlindeki kutunun başlığı; unsupported kutusu unsupportedTitle kullanır. Boşsa dilin kendi metni çizilir.',
|
|
890
|
+
fileName: 'Dosya kendi adını taşımıyorsa yedek ad; adres uzantısızsa aynı zamanda TÜR İPUCUDUR ("fatura.pdf"). Runtime’a geri yazılmaz.',
|
|
891
|
+
style: "Serbest CSS. KÖK özellikleri iç yazıya iner: fontSize/color/fontFamily başlık, metin, düğme ve metin önizlemesini (kâğıdı kökün renginden türeyen %5’lik bir ton) boyar. Parçalar bildirilmiştir: &__loader, &__fab (köşedeki indirme düğmesi; &__fab { insetInlineStart: 0.5rem; insetInlineEnd: auto } ile karşı köşeye taşınır), &__content (önizleme alanı), &__image, &__pdf, &__text (metin önizlemesi), &__card (boş/hata/desteklenmeyen kartı), &__card-icon (simge rengi tema tokenı; &__card-icon { color } ile ezilir), &__card-title, &__card-text, &__download-btn (&__download-btn:hover ve :focus-visible çalışır). Hangi ekranın çizildiği parça adından anlaşılır: &__card yalnız boş/hata/desteklenmeyen varken, &__text yalnız metin dosyasında vardır.",
|
|
892
|
+
surfaceStyle: NODE_SURFACE_NOTE + ' Bu bileşenin kökü SAYDAMDIR: surfaceStyle.background (gradyan dahil) ve style.background iç ekranların altında görünür; 2026-10-02 öncesi opak iç zemin ikisini de örtüyordu.'
|
|
801
893
|
}
|
|
802
894
|
},
|
|
803
895
|
button: {
|
|
@@ -806,6 +898,8 @@ export const componentKnowledge = {
|
|
|
806
898
|
"click YALNIZ type:'button' iken yayılır. type:'submit' click YAYMAZ, formu gönderir: akışı butona değil formun submit olayına bağla (form doğrulaması geçerse yayılır). type:'link' de click yaymaz, tarayıcı href'e gider.",
|
|
807
899
|
"type:'submit' buton bir Form'un İÇİNDEYSE formId gerekmez, tarayıcı en yakın forma bağlar; formun DIŞINDAYSA formId = formun elementId'si ya da adı. isDisabled/isLoading açıkken gönderim de kilitlidir.",
|
|
808
900
|
"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).",
|
|
901
|
+
"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.",
|
|
902
|
+
"METİN RENGİ zeminin ölçülen parlaklığından seçilir (2026-09-29, shared/utils getContrastTextColor): açık zemine koyu, koyu zemine açık metin; temanın onPrimary'si (--ng-text-on-accent) o polaritedeyse o kullanılır, değilse #000000/#ffffff. Tema metin token'ı (--ng-text-primary) YEDEK DEĞİLDİR: koyu modda açığa döner ve açık accent'li butonda (Rexora #B8F06C) metni okunmaz yapıyordu. Tema modu değişince (theme-toggle) renk yeniden hesaplanır; aynı kural icon çipinde ve tablo etiketlerinde de geçerlidir.",
|
|
809
903
|
"Kayıtlı sayfalardaki eski kind:'custom' + customColor ikilisi VERİ GÖÇÜ OLMADAN aynen çizilir (render-anı takma adı, text emsali): surfaceStyle.background boşsa eski renk `--ng-btn-custom-color` değişkeniyle solid/outline/text varyantına eskisi gibi iner; Background doldurulunca takma ad susar. page_runtime_get(resolveStyles:true) bu değişkeni resolvedStyle'da gösterir. DİKKAT: platformun doğrulama duvarı sayfanın TAMAMINI okur — böyle bir düğüm taşıyan sayfaya yapılan her page_schema_patch, dokunulmayan düğüm yüzünden invalid-enum-value/unknown-prop ile reddedilir (ARC-036). Sayfayı yeniden yazmadan önce o butonu kind: semantik değer + surfaceStyle.background'a çevir (aynı çağrıda replace_prop ile).",
|
|
810
904
|
"İpucu (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition: top · bottom · left · right) her komponentte ipucu çizer. Tıklamadan önce onay istemek de butonun değil akışın işidir: click akışının başına confirm adımı koy (yalnız web — mobil barındırıcıda confirm adımı yok)."
|
|
811
905
|
],
|
|
@@ -824,7 +918,10 @@ export const componentKnowledge = {
|
|
|
824
918
|
"Bir öğeye tıklanınca ikisi birden olur: öğenin kendi flow'u (options[].flow doluysa) çalışır VE clickItem olayına bağlı akışlar çalışır. İkisinde de tıklanan öğenin TAMAMI self.currentItem'a yazılıdır ({ key, text, icon, flow, isDanger… }). Aynı işi iki kez yapmamak için ya öğelere flow bağla ya da clickItem'a tek akış bağlayıp içinde self.currentItem.key ile dallan.",
|
|
825
919
|
"click olayı BUTONUN KENDİSİNE basılınca yayılır (menüyü açan/kapatan tıklama) — menü hiç açılmasa bile. isDisabled ya da isLoading açıkken hiç yayılmaz. Öğe tıklamasıyla karıştırma: menü satırı click YAYMAZ, clickItem yayar.",
|
|
826
920
|
"Görünür öğe kalmadıysa (options boş, dizi değil ya da hepsi isHidden) buton devre dışı GÖRÜNÜR ve menü açılmaz — ama click yine yayılır. Menüyü akışla kurarken options'ı yazmadan butonu ekran açılışında ölü göstermemek için bir başlangıç listesi bırak.",
|
|
827
|
-
"Aynı sayfada tek menü açık kalır (ortak popover kaydı): bir menü açılınca diğeri kapanır. Menü kutusu
|
|
921
|
+
"Aynı sayfada tek menü açık kalır (ortak popover kaydı): bir menü açılınca diğeri kapanır. Menü kutusu ekrana SIĞAR: yükseklik viewport'a göre sınırlanır ve 50 satırlık liste kutunun İÇİNDE kayar; yatayda en geniş viewport − 16 px olur, düğme ekranın kenarındaysa menü kenara kayar (taşmaz), boşluksuz 300 karakterlik satır üç noktayla kesilir. Çok uzun listeyi yine de dropdown/table gibi bir listeleyene taşı (arama yok).",
|
|
922
|
+
"Menü, buton kilitlenince (isLoading/isDisabled) ya da görünür satır kalmayınca (options boşalınca) AÇIKSA KENDİLİĞİNDEN KAPANIR. Boş/gizli seçenekli ve yükleniyor düğme native disabled DEĞİLDİR (click yine yayılır, Tab odaklanır) ama aria-disabled=true taşır; isLoading ayrıca aria-busy=true yazar. Düğme aria-expanded taşır (aria-haspopup YAZILMAZ: menü rolü ve ok tuşu gezintisi yok, ARC-156), ikon glifi ekran okuyucudan gizlidir.",
|
|
923
|
+
"ERİŞİLEBİLİR AD: metin doluysa metnin kendisi (ariaLabel varsa metnin SONUNA eklenir: text 'Aç' + ariaLabel 'Sipariş 12' → 'Aç Sipariş 12'; etiket metni zaten içeriyorsa tek başına); metin BOŞSA (kebab) sırasıyla ariaLabel → optionsTitle → dilin 'Daha fazla'sı. Satırı tarif eden ad için ('Sipariş 12 işlemleri') kebab'da ariaLabel yaz. Spinner prefers-reduced-motion altında durur.",
|
|
924
|
+
"STİL PARÇALARI: style'a &__button · &__icon · &__text · &__chevron · &__menu · &__title · &__item yazılır (eskiden hiçbiri tutmuyordu, `& .dropdown-menu__button` gibi torun seçicilerle çalışılırdı — onlar HÂLÂ çalışır). &__menu açılan menü kutusu, &__title menü başlığı, &__item her menü satırı. Kökün fontSize/color/fontFamily'si düğmeye, ikonlara, başlığa ve satırlara İNER (size 'sm' düğmenin kendi küçük puntosunu korur: onu &__button { fontSize } ile ez). Açık durum için `&.dropdown-menu--open &__button`, odak için `&__button:focus-visible`.",
|
|
828
925
|
"İpucu (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition) her komponentte ipucu çizer. Aynı bileşen drawer'ın alt şeridinde de kullanılır (actions[].options dolu olan aksiyon); orada prop'ları aksiyon tanımından gelir, sayfa şemasından değil."
|
|
829
926
|
],
|
|
830
927
|
propNotes: {
|
|
@@ -833,7 +930,9 @@ export const componentKnowledge = {
|
|
|
833
930
|
optionsTitle: "Menü kutusunun üstündeki başlık; boşsa başlık satırı hiç çizilmez.",
|
|
834
931
|
icon: "{ name: 'more_vert', color? } nesnesi; düz 'more_vert' metni de okunur (CQ-164). Adı boş ya da temizlenmiş ikon HİÇ çizilmez (2026-09-17 öncesi boş ikon nesnesi 'home' glifi çiziyordu).",
|
|
835
932
|
iconPosition: "'left' (varsayılan) | 'right' — ikonun metnin hangi yanında durduğu; chevron her zaman en sağda kalır. İkon yokken etkisiz (panelde de gizlidir).",
|
|
836
|
-
text: "Butonun metni. BOŞ bırakılırsa chevron da çizilmez: buton yalnız ikondan oluşan bir menü düğmesine (kebab) döner. O kipte yükleniyor durumu ikonun yerinde spinner olarak görünür.",
|
|
933
|
+
text: "Butonun metni. BOŞ bırakılırsa chevron da çizilmez: buton yalnız ikondan oluşan bir menü düğmesine (kebab) döner. O kipte yükleniyor durumu ikonun yerinde spinner olarak görünür. Uzun metin düğmeyi büyütmez: tek satırda üç noktayla kesilir, tamamı title'dadır. Nesne/dizi/çözülmemiş {{ }} boş sayılır ([object Object] basmaz). Aynı kural menü satırı text'i ve optionsTitle için geçerli.",
|
|
934
|
+
ariaLabel: "Düğmenin ekran okuyucu adı. Metin doluyken ad metindir ve bu alan SONUNA bağlam ekler (görünen etiket adın içinde kalır, WCAG 2.5.3); metin boşken (kebab) yazılmazsa optionsTitle, o da boşsa dilin 'Daha fazla'sı okunur. Ortak appearance'ta değil bu bileşenin kendi alanıdır.",
|
|
935
|
+
style: "Kök CSS + parçalar: &__button · &__icon · &__text · &__chevron · &__menu · &__title · &__item. Kök fontSize/color/fontFamily içe iner (sm düğme hariç, bkz. behavior). Menü kutusu DOM'da kökün içindedir: `& .ng-popover__content` hâlâ çalışır.",
|
|
837
936
|
size: "sm | md (varsayılan 'md') — lg YOKTUR. sm satır yüksekliğini içeriğe indirir ve menüyü butonun SAĞ kenarına yaslar (bottom-end), md ortalar.",
|
|
838
937
|
isLoading: "Butonu kilitler (tıklama ve olay yok) ve chevron'un yerinde — metin yoksa ikonun yerinde — spinner döndürür. Devre dışı görünümüyle aynı soluklukta çizilir.",
|
|
839
938
|
currentItem: "Panelde YOKTUR, yalnız runtime yazar: tıklanan öğenin tamamı. Akışta YALNIZ self.currentItem ile okunur — event.data.currentItem BOŞTUR: event.data'yı yalnız params geçen emit'ler doldurur (flow-execution.functions.ts), clickItem ise yalnız data gönderir ve o da setNode'a gider (CQ-077)."
|
|
@@ -869,17 +968,24 @@ export const componentKnowledge = {
|
|
|
869
968
|
"Aksiyona flow bağlanabilir (actions[].flow) ya da şeridin click olayına akış bağlanabilir; İKİSİ birden bağlıysa tek tıklamada ikisi de koşar — aksiyonun akışı önce. Yalnız biri istensin diye diğerini boş bırakın.",
|
|
870
969
|
"Aksiyona href yazılırsa o aksiyon LİNK olur (Button type:'link'): tarayıcı adrese gider ve click YAYILMAZ, dolayısıyla akış koşmaz. isNewTabLink yeni sekmede açar ve yalnız href doluyken iş görür. Adres NESNE biçiminde data alanından okunur — iç sayfa için { data: '<sayfanın yolu>', ref: '<pageId>' } yazın; data'sı boş bir nesne (yalnız ref) adres saymaz ve aksiyon normal buton olarak çizilir.",
|
|
871
970
|
'showCloseButton:true iken aksiyonların sağında bir kapatma düğmesi çizilir; basılınca close olayı yayılır ve şerit KENDİNİ gizler (isHidden:true kendi prop’una yazılır). Varsayılan kapalıdır — kayıtlı sayfalarda düğme kendiliğinden çıkmaz.',
|
|
872
|
-
'Yükseklik 1-5 aralığındadır (varsayılan 5), genişlik 1-12 (varsayılan 12): tek satırlık tam genişlik şerittir.'
|
|
971
|
+
'Yükseklik 1-5 aralığındadır (varsayılan 5), genişlik 1-12 (varsayılan 12): tek satırlık tam genişlik şerittir.',
|
|
972
|
+
"DÜZEN kendiliğinden uyum sağlar: ikon + metin solda, aksiyonlar sağda tek satırdır; sığmayınca aksiyonlar metnin altına iner (sağa yaslı, sarar), uzun ya da boşluksuz başlık/alt metin ve uzun düğme metni kabı aşmaz, 375 px'te yatay kaydırma olmaz. 8-20 aksiyon da satır satır sarar. Bu yüzden style'a flexWrap / minWidth / overflowWrap hilesi YAZMA.",
|
|
973
|
+
"TON (zemin + 1px halka + ikon dairesi) tema YÜZEYİNDEN türetilir: koyu temada şerit koyu yüzeyle karışır ve başlık/alt metin her tonda ≥ 6.7:1 okunur; info nötr gri bir şerittir (tema info rengi neredeyse beyaz olduğundan şeridi ayırt ettirmez, kullanılmaz). primary tam vurgu halkası, öbürleri %40 halka taşır; transparent zemin ve halkayı boş bırakır. Yazı rengi kökten MİRAS alınır: style'ın kök color / fontSize / fontFamily'si başlığa, alt metne ve ikona iner (başlık 1.15em, alt metin .85em, ikon dairesi 2.85em).",
|
|
974
|
+
"title ve subtle YALNIZ metin ve sonlu sayı çizer; nesne, dizi, true, NaN ve çözülmemiş {{ }} boş sayılır (satır hiç çizilmez) — [object Object] basılmaz. Aksiyon text'i de aynı kuralla çizilir.",
|
|
975
|
+
"Aksiyonun kind'ı listede (primary|info|success|warning|error; eski sayfalardaki transparent de çizilir) yoksa primary, variant'ı yoksa solid çizilir (gri yerel düğme çıkmaz). YALNIZ-İKON aksiyonun (text boş) erişilebilir adı YOKTUR: okuyucu ikonun adını okur ('delete') ve aksiyonda ariaLabel alanı yoktur — metin yaz. Süs ikonu ekran okuyucudan gizlidir.",
|
|
976
|
+
'Kapatma düğmesi 24×24 px, klavye odağında 2 px vurgu halkası; forced-colors (yüksek karşıtlık) kipinde şerit 1px sistem kenarlığı çizer.'
|
|
873
977
|
],
|
|
874
978
|
propNotes: {
|
|
875
979
|
title: 'Şeridin ana metni; boş bırakılırsa başlık satırı hiç çizilmez.',
|
|
876
980
|
subtle: 'Başlığın altındaki ikincil metin; boşsa çizilmez.',
|
|
877
|
-
icon: "{ name: 'lock_open_right', color? } nesnesi; düz 'check' metni de okunur. Adı bo
|
|
981
|
+
icon: "{ name: 'lock_open_right', color? } nesnesi; düz 'check' metni de okunur. Adı boş, temizlenmiş ya da ikon fontunda olmayan (yazım hatası) ikonda checklist çizilir — ikonsuz şerit YOKTUR, boş daire de çıkmaz.",
|
|
878
982
|
kind: "primary | info | success | warning | error | transparent — şeridin tonu (zemin + kenarlık + ikon dairesi). Temizlenirse ya da sözlükte olmayan bir değer yazılırsa info çizilir. transparent zemini boş bırakır.",
|
|
879
983
|
showCloseButton: 'Kapatma düğmesini çizer (varsayılan false). Basılınca close olayı + isHidden:true.',
|
|
880
984
|
actions: "Buton listesi. Alanlar: key (text'ten snake_case türetilir, currentItem'da geri gelir) · text · kind · variant · icon · flow · href · isNewTabLink · isHidden · isDisabled · isLoading. Sıra dizinin sırasıdır.",
|
|
881
985
|
currentItem: "AI YAZMAZ: şeridin click olayında runtime'ın geri yazdığı durum prop'u — tıklanan aksiyonun tamamı. Akışta self.currentItem (ör. self.currentItem.key) ile okunur.",
|
|
882
|
-
isHidden: 'Şeridi söker. Kapatma düğmesi de bunu yazar; şeridi geri getirmek için akışta isHidden:false yazın.'
|
|
986
|
+
isHidden: 'Şeridi söker. Kapatma düğmesi de bunu yazar; şeridi geri getirmek için akışta isHidden:false yazın.',
|
|
987
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
988
|
+
" PARÇALAR (7): '&__content' (ikon + metin satırı) · '&__icon' (ikon dairesi) · '&__text' (başlık + alt metin sütunu) · '&__title' · '&__subtle' · '&__actions' (düğme satırı) · '&__close' (kapatma düğmesi). '&__close:hover' ve '&__close:focus-visible' çalışır. Kök anahtarlar (padding, borderRadius, border, boxShadow, background gradyanı, fontFamily, flexDirection) bileşenin varsayılanını ezer; ton halkası inset box-shadow'dur (border yazmak onu kaldırmaz, boxShadow: 'none' yaz). Aksiyon düğmeleri Button'dur: '& .ng-button' ile hedeflenir, parçası yoktur."
|
|
883
989
|
}
|
|
884
990
|
},
|
|
885
991
|
card: {
|
|
@@ -890,6 +996,8 @@ export const componentKnowledge = {
|
|
|
890
996
|
"image boşsa bant HİÇ çizilmez (kart başlık/açıklama/butona çöker); adres çözülemezse bandın yerine kırık görsel kutusu gelir.",
|
|
891
997
|
"buttonClick kabarcığı DURDURMAZ: butona basınca önce buttonClick, sonra kartın click olayı yayılır. Yalnız buton eylemi isteniyorsa kartın click bağını boş bırakın.",
|
|
892
998
|
"isLoading açıkken içerik yerine iskelet çizilir ve hiçbir tıklama olayı yayılmaz.",
|
|
999
|
+
"İÇERİK PROP'LARI YAZILMAZSA KART BOŞ ÇİZİLİR: title/description/buttonText/image'in varsayılanları ('Card Title', yer tutucu görsel) yalnız Studio'da sürüklenip bırakılan karta yazılan ÖRNEK içeriktir. page_schema_patch ile kurduğun kartta göstermek istediğin her parçayı AÇIKÇA yaz; yazmadığın parça hiç çizilmez (qa-card-01 cd_absent: yalnız çerçeve). Studio paneli de 2026-09-30'dan beri eksik anahtarı BOŞ gösterir (designer.absent, QA CD-003).",
|
|
1000
|
+
"KLAVYE (2026-09-30, QA CD-005): butonlu kartta klavye kullanıcısı BUTONA ulaşır — butona basmak buttonClick ve ardından click yayar, kartın kökü ayrıca odaklanmaz. Butonsuz kartta (buttonText boş) kök kendisi düğmedir: role=button, Tab ile odaklanır, Enter/Space click yayar, imleç el olur. Kart click'in bağlı olup olmadığını bilmez; bu yüzden click'i bağlanmamış butonsuz kart da bir odak durağıdır — tıklanması anlamsız kartta buttonText'i boş bırakıp click'siz kullanmak yerine içeriği text/image ile kur.",
|
|
893
1001
|
'Yükseklik 10-50 aralığındadır (min 10, varsayılan 32, max 50). Varsayılan 32, kartın kendi içeriğinin (160px bant + başlık/açıklama + buton) taşmadan sığdığı en küçük boydur; daha kısaya çekilirse bant sıkışır. Bu sınır grid kanvasının kuralıdır, API aralık dışı blocks[].size.h değerini reddetmez; yine de aralıkta tutun.'
|
|
894
1002
|
],
|
|
895
1003
|
propNotes: {
|
|
@@ -898,7 +1006,12 @@ export const componentKnowledge = {
|
|
|
898
1006
|
imageWidth: 'Görselin bant İÇİNDEKİ genişliği (px). Yazılmazsa bandın tamamı; dar yazılırsa görsel bantta ortalanır.',
|
|
899
1007
|
imageFit: "cover|contain|fill|none — CSS object-fit. Temizlenirse 'cover'.",
|
|
900
1008
|
isLoading: 'Akışın ya da tasarımcının açtığı iskelet: içerik yerine parlayan kutular çizilir, click/buttonClick yayılmaz.',
|
|
901
|
-
title:
|
|
1009
|
+
title: "Kart başlığı; aynı zamanda görselin alt metnidir (ayrı bir alt prop yoktur). En çok 2 satır çizilir, fazlası üç noktayla kesilir (tamamı fareyle üzerine gelince ipucunda). Varsayılan görünüm BÜYÜK HARFTİR — küçük harf için style['&__title'].textTransform:'none'. Yazılmazsa başlık çizilmez.",
|
|
1010
|
+
description: 'Başlığın altındaki metin. En çok 4 satır çizilir, fazlası üç noktayla kesilir (tamamı ipucunda); yer darsa önce görsel bandı küçülür, metin kesilmez (QA CD-001, 2026-09-30). Yazılmazsa çizilmez.',
|
|
1011
|
+
buttonText: "Kartın alt kısmındaki butonun etiketi; tek satır, sığmazsa üç nokta. BOŞ ya da yazılmamışsa buton HİÇ çizilmez (buton şeridi de yok) — buttonClick'i ancak dolu etiketli kartta bağla.",
|
|
1012
|
+
isHidden: 'Ortak katman görünürlüğü: true iken kart DOM’a girmez.',
|
|
1013
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
1014
|
+
" Card'ın tipli stil grubu YOKTUR; görünüm yalnız bu alandan verilir. Parçalar: '&__image' (görsel bandı), '&__title', '&__description', '&__button'. Kökün kenarlığı/zemini için düğüm kutusu (appearance) ya da parçasız anahtarlar."
|
|
902
1015
|
}
|
|
903
1016
|
},
|
|
904
1017
|
'qm-card': { summary: 'QM gösterge kartı; click yayar.' },
|
|
@@ -914,12 +1027,14 @@ export const componentKnowledge = {
|
|
|
914
1027
|
"Etkin OLMAYAN sekmenin içeriği DOM'da YOKTUR (keepAlways dışında): o sekmedeki bir düğümü hedefleyen doğrulama önce page_screenshot actions { action: 'tab', value: '<sekme anahtarı>' } ister — sekme grubunun köküne click ilk sekmeye gider ve reddedilir."
|
|
915
1028
|
],
|
|
916
1029
|
propNotes: {
|
|
917
|
-
surfaceStyle:
|
|
918
|
-
tabs: "[{ key, text, icon, isDisabled, isHidden, keepAlways }] — key sekmenin kimliğidir, benzersiz olmalı; boş bırakılırsa sekmenin SIRASI (\"0\", \"1\"…) kimlik sayılır. Studio key'i text'ten snake_case üretir.",
|
|
1030
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Sekme grubu yüzeyi KENDİ KÖKÜNDE derler (2026-09-30, QA TB-002; öncesinde render katmanı düğüm kutusuna yazıyordu, kök ve kutu görünümünün şerit/paneli onu örttüğü için seçilen zemin yalnız kenarlardan sızıyordu). container görünümünde background çerçeveyi (şerit + panel kenarı) boyar, açık sekmenin içerik kartı tema yüzeyinde kalır; radius kökü keser.",
|
|
1031
|
+
tabs: "[{ key, text, icon, isDisabled, isHidden, keepAlways }] — key sekmenin kimliğidir, benzersiz olmalı; boş bırakılırsa sekmenin SIRASI (\"0\", \"1\"…) kimlik sayılır. Studio key'i text'ten snake_case üretir. icon ikon seçicinin { name, color } nesnesi YA DA düz metin ('settings') olabilir (2026-09-30, QA TB-003; öncesinde düz metin sessizce 'home' ikonunu çizdiriyordu).",
|
|
919
1032
|
selected: "Açık sekmenin key'i; setter ile yazılırsa sekme değişir (olay yayılmaz). Şema varsayılanı 'overview' varsayılan sekme listesine göredir — kendi key'lerini yazdığında selected'ı da yaz, yoksa ilk seçilebilir sekme açılır.",
|
|
1033
|
+
isLoading: "Yayında ve önizlemede açık sekmenin içeriğini gizler, yerine gösterge çizer. Kanvasta (editör) içerik GÖRÜNÜR ve düzenlenebilir kalır, gösterge üstüne biner — tasarımcı yükleniyor açıkken de sekmeye bileşen bırakabilir (2026-09-30, QA TB-001; öncesinde kanvasta içerik gizleniyor, bırakma alanı ölüyordu).",
|
|
920
1034
|
variant: "container (varsayılan): başlıklar zemin şeridinde, açık sekme kart gibi; default: alt çizgili düz başlıklar. Yazılmazsa container çizilir (2026-09-15 öncesi yazılmamış düğüm default çiziyordu).",
|
|
921
1035
|
headerAlign: 'Başlık satırının hizası: left (varsayılan) · center · right · stretch (sekmeler satırı eşit genişlikte paylaşır; metni sığmayan sekme kendi metni kadar genişler).',
|
|
922
|
-
hideTabs: 'Başlık satırını gizler; içerik yalnız selected ile değişir.'
|
|
1036
|
+
hideTabs: 'Başlık satırını gizler; içerik yalnız selected ile değişir.',
|
|
1037
|
+
isHidden: 'Ortak katman görünürlüğü: true iken sekme grubu hiç kurulmaz — başlıklar da içerik de DOM’a girmez, içindeki bileşenlerin mount olayları koşmaz. Tek bir sekmeyi gizlemek için bunu değil tabs[i].isHidden kullan.'
|
|
923
1038
|
}
|
|
924
1039
|
},
|
|
925
1040
|
'collapsible-container': {
|
|
@@ -932,7 +1047,7 @@ export const componentKnowledge = {
|
|
|
932
1047
|
"Düğümün YÜKSEKLİĞİ bölümün kendisine bağlı değildir: kapanan bölüm kutuyu küçültmez, altında boş alan kalır. Kapandığında yer bırakmaması isteniyorsa düğümün Height kipi auto olmalı (ortak katman, appearance.heightType)."
|
|
933
1048
|
],
|
|
934
1049
|
propNotes: {
|
|
935
|
-
title:
|
|
1050
|
+
title: "Başlık satırının metni; tıklama alanı başlık ŞERİDİNİN tamamıdır (açıklama satırı ve aradaki boşluk dahil). Varsayılanı 'Container title' yalnız Studio'da bırakılan bölüme yazılan örnektir: prop yazılmazsa bölüm BAŞLIKSIZ çizilir — başlık istiyorsan açıkça yaz (QA CC-004, 2026-09-30).",
|
|
936
1051
|
description: 'Başlığın altındaki ikinci satır. Boş bırakılırsa hiç çizilmez.',
|
|
937
1052
|
openButtonText: 'Bölüm KAPALIYKEN düğmede yazan metin; açıkken de close karşılığı yazılmamışsa bu kullanılır.',
|
|
938
1053
|
closeButtonText: 'Bölüm AÇIKKEN düğmede yazan metin. Yalnız bunu yazmak kapalı durumu etkilemez: orada varsayılan +/− göstergesi çizilir.',
|
|
@@ -942,10 +1057,10 @@ export const componentKnowledge = {
|
|
|
942
1057
|
closeButtonVariant: 'Açık durumun düğme rengi; aynı seçenekler.',
|
|
943
1058
|
isOpen: 'Bölüm açık mı (varsayılan true). Kullanıcı tıklaması buraya geri yazar; akıştan setter ile yazmak bölümü açar/kapatır ve olay yaymaz.',
|
|
944
1059
|
isDisabled: 'Bölümü kilitler: başlık tıklaması ve düğme çalışmaz, kap yarı saydam çizilir. GÖVDEDEKİ komponentleri devre dışı bırakmaz — açık bir bölüm kilitlendiğinde içerik kullanılabilir kalır.',
|
|
945
|
-
isLoading:
|
|
1060
|
+
isLoading: "Gövdeyi (en çok 100px) kırpıp içeriği gizler ve göstergeyi gövdenin ÜSTÜNE akış dışı bir kaplama olarak çizer. Önizlemede ve runtime tarafında bölüm kapalıyken görünmez (gövde yok); kanvasta gövde her zaman çizildiği için orada kapalı bölümde de görünür. Kanvasta içerik gizlenmez ve kaplama tıklamayı geçirir: bırakma alanı yerinde kalır (QA CC-001, 2026-09-30 — öncesinde gösterge çocukları kutunun altına itiyordu).",
|
|
946
1061
|
isHidden: 'Düğümü hiç kurmaz: kapalı bir bölüm değil, olmayan bir bölümdür (ortak katman).',
|
|
947
1062
|
style: 'BEM parçaları: &__header (başlık şeridi) ve &__body (gövde).',
|
|
948
|
-
surfaceStyle:
|
|
1063
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Bölüm grubu KENDİ KÖKÜNDE derler (2026-09-30, QA CC-003; öncesinde render katmanı düğüm kutusuna yazıyor, bölümün beyaz kökü onu örttüğü için seçilen zemin ve köşe hiç görünmüyordu). Boş grup temanın görünümünü korur; contentOverflow gövdeye ('&__body') iner, başlık şeridi kaydırılmaz."
|
|
949
1064
|
}
|
|
950
1065
|
},
|
|
951
1066
|
'tree-view': {
|
|
@@ -955,24 +1070,31 @@ export const componentKnowledge = {
|
|
|
955
1070
|
"key satırın kimliğidir ve METİN olarak karşılaştırılır (selected '7' ile data key 7 eşleşir). key'i boş/eksik satır hiç seçili çizilmez ve onay kutusu kilitlidir (yalnız ebeveyninden durum alır); aynı seviyede key tekrar ederse ya da eksikse ağaç kırılmaz ama selected/checkedKeys o satırları ayırt edemez — sorgudan kurarken benzersiz id'yi key'e eşle.",
|
|
956
1071
|
'selected akıştan yazıldığında o düğüme giden dallar KENDİLİĞİNDEN açılır (yalnız açar; kullanıcının elle açtıklarını kapatmaz). Satır verisindeki isExpanded:true de kendi başına açar.',
|
|
957
1072
|
"isCheckable:true her satırın soluna onay kutusu koyar; işaretli key'ler checkedKeys dizisidir. Bir üst satırın key'i TÜM dalı temsil eder: checkedKeys'e yalnız ebeveyn yazmak altındaki bütün etkin satırları işaretler; etkin çocuklarının hepsi işaretli ebeveyn işaretli, bir kısmı işaretliyse yarım (—) çizilir. Kutuya tıklamak dalı birlikte işaretler/kaldırır. isDisabled satırın kutusu kilitlidir ve zincir onda durur: ebeveynin işareti ona ve altına inmez, o da ebeveynin durumuna sayılmaz (altındaki etkin satırlar tek tek işaretlenebilir).",
|
|
958
|
-
"change yalnız kullanıcı kutuya tıklayınca yayılır (akışın checkedKeys yazması yaymaz). Yazılan checkedKeys normalize edilmiştir: tam işaretli her satır belge sırasıyla (tamamlanan ebeveyn dahil); ağaçta çizilmeyen key'ler (gizli satır, henüz yüklenmemiş veri) sona olduğu gibi eklenir. Satır tıklaması (click/selected) ile kutu (change/checkedKeys) birbirinden bağımsızdır. checkedKeys (
|
|
1073
|
+
"change yalnız kullanıcı kutuya tıklayınca yayılır (akışın checkedKeys yazması yaymaz). Yazılan checkedKeys normalize edilmiştir: tam işaretli her satır belge sırasıyla (tamamlanan ebeveyn dahil); ağaçta çizilmeyen key'ler (gizli satır, henüz yüklenmemiş veri) sona olduğu gibi eklenir. Satır tıklaması (click/selected) ile kutu (change/checkedKeys) birbirinden bağımsızdır. checkedKeys'i (ve selected'ı) {{ }} İFADESİNE BAĞLAMA: kullanıcı yazması ifadeli prop'u bozar ve değişiklik kaybolur (platform kusuru CQ-247) — başlangıç listesi STATİK yazılamaz (skaler dizi 500 verir, ARC-157): tree'nin mount akışında self.checkedKeys = [...] ile ver.",
|
|
959
1074
|
"actions komponent düzeyinde BİR KEZ tanımlanır, her satır aynı menüyü çizer; bir satır farklılaşacaksa veri öğesine _actions dizisi konur ve SIRA numarasıyla şablonun üstüne biner (o satırda gizleme / etiket değiştirme).",
|
|
960
1075
|
"Aksiyonlar set_event ile DEĞİL her aksiyonun kendi flow prop'uyla bağlanır; şema olayı yayılmaz. Aksiyonun akışında satır self.currentItem'da, event.data'da { currentItem, actionKey } (actionKey: aksiyonun key'i) gelir. flow'u boş aksiyon hiçbir şey yapmaz.",
|
|
961
1076
|
'isSearchable:true arama kutusunu + tümünü aç/kapat düğmelerini açar. Süzme text ve subtle alanlarında geçer, eşleşenin ataları yerinde kalır, eşleşenin alt ağacı bütün görünür ve süzme sürerken dallar açık çizilir (chevron o sırada etkisizdir). Süzme İSTEMCİ tarafındadır: sunucuda arama gerekiyorsa kutuyu kapatıp kendi textinput + akış çiftini kur. Arama sürerken onay durumu TAM ağaçtan hesaplanır ve bir ebeveyni işaretlemek aramanın gizlediği çocuklarını da işaretler.',
|
|
962
1077
|
'isLoading iskelet satır çizer; veri (ya da arama sonucu) boşsa emptyText basılır. data içindeki null / düz değer öğeler atlanır.',
|
|
963
|
-
'Satır ikonu icon > image > varsayılan klasör ikonu sırasıyla seçilir; satırdaki isHidden satırı hiç çizmez, isDisabled satır tıklamasını ve kutusunu kilitler (dalı yine açılıp gezilebilir).'
|
|
1078
|
+
'Satır ikonu icon > image > varsayılan klasör ikonu sırasıyla seçilir; satırdaki isHidden satırı hiç çizmez, isDisabled satır tıklamasını ve kutusunu kilitler (dalı yine açılıp gezilebilir).',
|
|
1079
|
+
"Dallar chevron'la açılıp kapanır — seçili satırın atasını da kapatabilirsin (seçim DEĞİŞİNCE ilgili dallar yeniden açılır, kapattığın dal kendiliğinden geri açılmaz; seçili satıra giden dallar 'tümünü kapat'tan sonra da açık kalır). Arama kutusundaki 'tümünü aç' TÜM derinliği açar, 'tümünü kapat' hepsini kapatır; ikisinden sonra elle açılan dalın çocukları son işarete uyar. Satır text'i yoksa boş çizilir.",
|
|
1080
|
+
"Arama I/İ/ı/i'yi aynı harf sayar (ISPARTA = ısparta = İsparta) ve tarayıcı diline bağlı değildir; ç, ş, ü gibi diğer aksanlı harfler ayrı harftir.",
|
|
1081
|
+
"Sağdan sola (dir rtl / ar): girinti sağ kenardan başlar, açma oku aynalanır, klavyede ← dalı açar ve → kapatır (soldan sağa tersi). Ağaç kök öğesi role=tree, dallar aria-expanded taşır; arama kutusunun adı searchPlaceholder, chevron adı \"Aç/kapat: <satır>\".",
|
|
1082
|
+
"YÜKSEKLİK: ağaç satır sayısı kadar uzar ve kendi içinde KAYDIRMAZ. Düğümde sabit yükseklik (heightType fixed / heightString) verirsen ağaç kutudan taşar ve alttaki komşuları örter: düğümde states.isScrollable:true aç (ya da style { maxHeight, overflowY: 'auto' }). 375px'te mobil kural düğüm yüksekliğini ezer; orada style'daki maxHeight + overflowY yazılır.",
|
|
1083
|
+
"add_component'e props vermezsen katalog varsayılan verisi (Paper/Card/List) GELMEZ: ağaç 'No items' basar — data'yı kendin yaz. icon bir NESNEdir ({ name: 'folder' }); düz metin ('folder') beklenen simgeyi vermez.",
|
|
1084
|
+
"currentItem son tıklanan / kutusu değişen / aksiyon alınan satırdır: kutuya tıklamak da onu yazar. Seçili satırı akışta selected'tan oku; akışın yazdığı selected currentItem'ı doldurmaz."
|
|
964
1085
|
],
|
|
965
1086
|
propNotes: {
|
|
966
|
-
data: '[{ key, text, subtle, icon, image, isExpanded, isHidden, isDisabled, children[], _actions[] }] — key satırın kimliğidir (metin olarak karşılaştırılır), selected ve checkedKeys onunla eşleşir.',
|
|
1087
|
+
data: '[{ key, text, subtle, icon, image, isExpanded, isHidden, isDisabled, children[], _actions[] }] — key satırın kimliğidir (metin olarak karşılaştırılır), selected ve checkedKeys onunla eşleşir. icon nesnedir: { name: "folder" }.',
|
|
967
1088
|
selected: 'Seçili satırın key’i; setter ile dışarıdan da sürülebilir (o dala kadar ağaç açılır).',
|
|
968
|
-
checkedKeys: "İşaretli satırların key dizisi (yalnız isCheckable:true iken çizilir ve panelde görünür). Ebeveyn key'i tüm dalı işaretler. Kullanıcı kutuya tıklayınca normalize edilmiş diziyle geri yazılır.",
|
|
1089
|
+
checkedKeys: "İşaretli satırların key dizisi (yalnız isCheckable:true iken çizilir ve panelde görünür). Ebeveyn key'i tüm dalı işaretler. Kullanıcı kutuya tıklayınca normalize edilmiş diziyle geri yazılır. Akışın yazdığı liste NORMALİZE EDİLMEZ: kutular dal kuralıyla çizilir ama self.checkedKeys ham kalır — sayı gerekiyorsa tam listeyi yaz.",
|
|
969
1090
|
isCheckable: 'Satırlara onay kutusu koyar (çoklu seçim, dal zinciri, yarım durum); change olayını açar.',
|
|
970
1091
|
currentItem: 'Gizli prop: son tıklanan / kutusu değişen / aksiyon alınan satırın tamamı (arama sürerken children süzülmüş hâliyle).',
|
|
971
1092
|
isSearchable: 'İstemci tarafı arama kutusu + tümünü aç/kapat araçları.',
|
|
972
1093
|
searchPlaceholder: 'Arama kutusunun ipucu metni (yalnız isSearchable:true iken).',
|
|
973
1094
|
emptyText: 'Veri ya da arama sonucu boşken basılan metin.',
|
|
974
1095
|
actionsTitle: 'Aksiyon düğmesinin ipucu (üstüne gelince görünen metin) ve ekran okuyucu adı; menü başlık çizmez.',
|
|
975
|
-
isActionsShowAlways: 'Aksiyon düğmesi sürekli görünür (varsayılan: satırın üstüne gelince).'
|
|
1096
|
+
isActionsShowAlways: 'Aksiyon düğmesi sürekli görünür (varsayılan: satırın üstüne gelince).',
|
|
1097
|
+
style: "Kökteki fontFamily, fontSize ve color satır yazısına iner (seçili satırın yazı rengi ve alt metin kendi parçasından — &__text, &__subtle — yazılır; simge ve alt metin boyutu tema jetonundan hesaplanır). Parçalar (&__parça): &__search · &__search-input · &__search-tool · &__list · &__item (satır + alt dalı) · &__row · &__checkbox · &__icon · &__text · &__subtle · &__chevron · &__actions · &__actions-button · &__sublist · &__empty · &__loading. Seçili satır: `&__item[aria-selected=\"true\"] > &__row` (`>` şart: alt dal item'ın içindedir, yoksa seçili olmayan iç satırlar da boyanır) ve yazısı için `... > &__row &__text`. :hover ve :focus-visible parçalara yazılır. surfaceStyle ortak katmandır."
|
|
976
1098
|
}
|
|
977
1099
|
},
|
|
978
1100
|
text: {
|
|
@@ -980,7 +1102,11 @@ export const componentKnowledge = {
|
|
|
980
1102
|
behavior: [
|
|
981
1103
|
"Yükseklik SABİTTİR: maxSize.h = 1 (katalog varsayılanı 8'dir ve olduğu gibi kopyalanırsa kanvasta boyutlandırılamaz; gateway 1'e çeker ve gatewayNormalized ile bildirir). Çok satırlı metin için textarea ya da html kullanın.",
|
|
982
1104
|
"type HTML etiketi + ölçek seviyesidir (h1|h2|h3|h4|label|p|small; a11y için doğru seviyeyi seç; h4 2026-09-16'da açıldı — runtime ve tema ölçeği onu zaten tanıyordu, yalnız şemada yoktu). 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.",
|
|
983
|
-
"
|
|
1105
|
+
"type DOM etiketidir ve {{ }} ile veriden de gelebilir: yedi seviyenin (h1|h2|h3|h4|label|p|small) DIŞINDAKİ her değer çalışma anında label'a düşer (2026-10-02'ye dek veri 'script' döndürünce gerçek bir <script> kuruluyor ve çalışıyordu). Statik yazımda doğrulayıcı zaten reddeder; type'ı veriye bağlıyorsan yalnız bu yedi değeri döndür.",
|
|
1106
|
+
"content SAYISAL SIFIRI ve false'ı artık BASAR (2026-09-16'da düzeltildi): şablon content ?? '' okuyor. Öncesinde || kullanılıyordu ve {{ <düğüm>.total }} gibi bir bağlamada değer 0 olduğunda metin BOŞ çiziliyordu — sayaç/toplam basan her ekranda bağlama kopmuş gibi görünüyordu. NESNE okunur JSON olarak basılır ({\"a\":1}), nesne taşıyan dizi de; eskiden '[object Object]' çıkıyordu. Yalnız skaler içeren dizi eski virgüllü çıktısını korur ('kırmızı,mavi'); bigint sayı, tarih ISO metni olarak yazılır. Satır sonu (\\n) boşluğa çöker: metin tek satırdır, çok satırlı metin için textarea ya da html.",
|
|
1107
|
+
"HİZA: typographyStyle.textAlign yazılmazsa varsayılan 'start'tır (LTR'de sol, RTL'de sağ; 2026-10-02'ye dek fiziksel 'left' idi ve ar/RTL'de metin kutunun soluna yaslı kalıyordu). Açıkça 'left'/'right' yazarsan RTL'de de aynı yöne yazar; çok dilli uygulamada start/end yaz.",
|
|
1108
|
+
"SATIR YÜKSEKLİĞİ seviyeye göre sabit pikseldir (h1 40 · h2 35 · h3 30 · h4 25 · label/p 20 · small 15) ve yazı boyutuyla ölçeklenmez; typographyStyle.fontSize ile büyütülen metinde satır yüksekliği yazı boyunun en az 1.25 katına çıkar (h1 + 48px → 60px); taban punto 14px'ten büyük bir temada başlık seviyeleri de bu tabana çıkar (16px tabanda h1 40 → 45). Kendi satır aralığını istiyorsan typographyStyle.lineHeight yaz — o her zaman kazanır.",
|
|
1109
|
+
"isLoading ifadeye bağlanabilir: bir listenin satırında {{ item.yukleniyor }} yazılır, akıştan setter ile açılıp kapatılır. Yükleniyor durumunda iskelet gizlidir ama kök, ekran okuyucuya görünmez 'Yükleniyor' metni taşır (başlık etiketi boş okunmasın); prefers-reduced-motion'da iskelet nabız atmaz.",
|
|
984
1110
|
"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.",
|
|
985
1111
|
"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). METNİN taşması surfaceStyle'ın işi değildir, lineClamp prop'unundur.",
|
|
986
1112
|
"Olay YOKTUR: şema events sözlüğü boştur, componentEvents kaydı da yoktur. Metne tıklamayı akışa bağlamak isteyen düğümü button ya da bir kaba sarar.",
|
|
@@ -992,47 +1118,56 @@ export const componentKnowledge = {
|
|
|
992
1118
|
isLoading: 'Metnin yerine nabız atan bir iskelet çubuğu çizer ve aria-busy yazar; content hiç basılmaz. Veri gelene kadar gösterilecek yer tutucu içindir, akıştan setter ile açılıp kapatılır.',
|
|
993
1119
|
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
994
1120
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
995
|
-
style: STYLE_GROUP_NOTES.styleEscape
|
|
1121
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
1122
|
+
" text'in TEK iç parçası yükleniyor çubuğudur: &__skeleton (isLoading açıkken). Başka &__parça YOKTUR; &__text, &__content gibi adaylar sessizce etkisizdir (kök tek bir etikettir: kök özellikleri, :hover, :active, ::before/::after, ::first-letter, ::first-line, ::selection, @media ve @supports kökte çalışır). Text odaklanamaz (tabindex yok), yani &:focus-visible hedefi hiç tetiklenmez. @keyframes style içinde ÇALIŞIR (2026-10-02'den beri; animation adı + keyframe gövdesi birlikte yazılır), PascalCase 'Webkit*' anahtarlarını platform kayıtta DÜŞÜRÜR (yanıttaki silentlyDropped bildirir; ölçüldü): kebab yaz ('-webkit-text-fill-color', '-webkit-background-clip')."
|
|
996
1123
|
}
|
|
997
1124
|
},
|
|
998
1125
|
image: {
|
|
999
1126
|
summary: 'Görsel; mount ve click yayar, src ifadeyle beslenebilir. Büyütülmüş önizleme (isZoomable) ve önizlemenin içinde döndürme (isRotatable) vardır.',
|
|
1000
1127
|
behavior: [
|
|
1001
|
-
"ÖLÇEKLEME KİPİ PROP DEĞİL, düğümün appearance kanalındadır: appearance.widthType 'cover' (kutuyu doldurur, taşanı kırpar) ya da 'contain' (tamamını sığdırır ve appearance.alignType ile sola/ortaya/sağa hizalanır); appearance.heightType 'fixed' | 'auto' (appearance.aspectRatio ile oran) | 'fill'. Studio bir image düğümünü bırakırken heightType:'fixed', widthType:'contain', alignType:'center' yazar. 2026-09-16 öncesinde heightType:'fill' ve flex çocuğunun widthType:'fixed'/'fill' kipleri HİÇBİR sınıf üretmiyordu; object-fit tarayıcı varsayılanına düşüp görsel esneyerek bozuluyordu. Artık ikisi de varsayılan kiple (cover) kutuyu kaplar.",
|
|
1128
|
+
"ÖLÇEKLEME KİPİ PROP DEĞİL, düğümün appearance kanalındadır: appearance.widthType 'cover' (kutuyu doldurur, taşanı kırpar) ya da 'contain' (tamamını sığdırır ve appearance.alignType ile sola/ortaya/sağa hizalanır); appearance.heightType 'fixed' | 'auto' (appearance.aspectRatio ile oran) | 'fill'. Studio bir image düğümünü bırakırken heightType:'fixed', widthType:'contain', alignType:'center' yazar. 2026-09-16 öncesinde heightType:'fill' ve flex çocuğunun widthType:'fixed'/'fill' kipleri HİÇBİR sınıf üretmiyordu; object-fit tarayıcı varsayılanına düşüp görsel esneyerek bozuluyordu. Artık ikisi de varsayılan kiple (cover) kutuyu kaplar. 2026-10-04'ten beri widthType:'auto' da görseli GERDİRMEZ (taban kip cover; öncesinde heightType:'fill' + widthType:'auto' 400x200 görseli 400x400'e esnetiyordu) ve heightType:'auto' + widthType:'contain' gerçekten contain'dir (aspectRatio verilmiş kutuda önceden sessizce cover olup kırpıyordu; alignType de artık auto yükseklikte uygulanır).",
|
|
1002
1129
|
"Kaynak boşsa ya da yüklenemezse GÖRÜNÜR bir yedek kutu çizilir (ikon + alt metni). 2026-09-16 öncesinde <img> etiketinin kendi alt metni .ng-image kuralındaki color: transparent yüzünden gizleniyordu, yani kırık görsel boş bir dikdörtgenden ayırt edilemiyordu.",
|
|
1003
1130
|
'isLoading açıkken görselin yerine parıltılı iskelet çizilir; akıştan setter ile açılıp kapatılabilir, görselin kendi yükleme iskeletinden bağımsızdır.',
|
|
1004
1131
|
"isZoomable açıkken görsele tıklamak tam ekran önizleme açar (Escape, kapatma düğmesi ve zemine tıklama kapatır). Bağlı bir click akışı VARSA o da çalışır; ikisi birbirini iptal etmez, önizleme istenmiyorsa anahtar kapalı bırakılır. Kanvasta (tasarımcı yüzeyinde) önizleme hiç açılmaz. isRotatable yalnız önizlemenin içine 90 derecelik döndürme düğmeleri ekler ve kaydedilen hiçbir değeri değiştirmez.",
|
|
1005
|
-
'Görünürlük ortak katmandadır (props.isHidden); ipucu, köşe, gölge, kenarlık ve boşluk düğümün appearance kanalından gelir, bu komponentin prop yüzeyinde yoktur.'
|
|
1132
|
+
'Görünürlük ortak katmandadır (props.isHidden); ipucu, köşe, gölge, kenarlık ve boşluk düğümün appearance kanalından gelir, bu komponentin prop yüzeyinde yoktur.',
|
|
1133
|
+
"src ANAHTARI HİÇ YAZILMAZSA (MCP'nin kurduğu düğümde) görsel çizilmez, yedek kutu 'image' ikonu + alt metniyle çizilir; panelin gösterdiği '/images/default.webp' ekranda ÇİZİLMEZ (yalnız studio'nun bıraktığı düğümde src açıkça yazılıdır). STATİK yazımda skaler değerler (sayı, true, ['a']) platformda 500 verir ('Dictionary<String,Prop>', yol bilgisiz) — veri değişkenle taşınır; dosya nesnesi ({type:'file', data}) statik yazılamaz (platform data'yı kendi dosya uç adresiyle ezer ve silentlyDropped bildirir): nesne yalnız sayfa değişkeni ya da setter ile gelir. URL metni her zaman çalışır.",
|
|
1134
|
+
"alt ANAHTARI YAZILMAZSA alt BOŞTUR (2026-10-04'ten beri; öncesinde 'Image' olurdu: ekran okuyucu 'Image' okur ve görsel yüklenemezse son kullanıcıya İngilizce 'Image' yazısı çıkardı): <img alt=\"\"> dekoratif sayılır, ekran okuyucu atlar, yedek kutuda yalnız simge çizilir. ANLAMLI görsele (ürün, kapak, logo) mutlaka alt YAZ. Boş, null ve yalnız boşluk metni aynıdır; tıklanabilir/büyütülebilir düğümün erişilebilir adı alt boşken yerel 'zoom' metninden gelir: tr 'Yakınlaştırma', ar 'التكبير'.",
|
|
1135
|
+
"Yükleniyor (isLoading) iskeleti de tıklanabilir: bağlı click akışı varken iskelet üstüne tıklamak akışı koşturur (ölçüldü); yükleme sürerken tıklamanın bir şey yapmaması gerekiyorsa akışa koşul yaz. İskelet ve görsel yükleme animasyonu prefers-reduced-motion altında durur (2026-10-04'ten beri)."
|
|
1006
1136
|
],
|
|
1007
1137
|
propNotes: {
|
|
1008
|
-
src: "Yüklenen dosya alanının nesnesi (uçtan geldiği gibi) YA DA URL metni; ikisi de kabul edilir. Varsayılan '/images/default.webp'.",
|
|
1009
|
-
alt:
|
|
1138
|
+
src: "Yüklenen dosya alanının nesnesi (uçtan geldiği gibi) YA DA URL metni; ikisi de kabul edilir. Varsayılan '/images/default.webp' (yalnız panelde; anahtar yazılmazsa ekranda çizilmez).",
|
|
1139
|
+
alt: "Erişilebilirlik metni; görsel yüklenemediğinde yedek kutuda GÖRÜNÜR olarak da basılır. Anahtar yazılmazsa BOŞ (dekoratif); anlamlı görselde mutlaka yaz. Yalnız boşluktan oluşan metin boş sayılır.",
|
|
1010
1140
|
isZoomable: 'Tıklayınca tam ekran önizleme açar (rakiplerdeki zoom/lightbox karşılığı).',
|
|
1011
1141
|
isRotatable: 'Önizlemeye sola/sağa 90 derece döndürme düğmeleri ekler; isZoomable kapalıyken panelde çizilmez.',
|
|
1012
|
-
isLoading: 'Görselin yerine iskelet çizer; veri gelene kadar bekletmek için akıştan yazılır.'
|
|
1142
|
+
isLoading: 'Görselin yerine iskelet çizer; veri gelene kadar bekletmek için akıştan yazılır.',
|
|
1143
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
1144
|
+
" KÖK anahtarlar (kenarlık, köşe, gölge, filtre, dönüş, opacity) görselin kendisine (<img>) iner; kaynak boş/kırıksa yedek kutuya, isLoading iken iskelete de aynı kural iner. Sarmalayıcıya İNMEZ. PARÇALAR (hepsi ilk adayda tutar, 2026-10-04): '&__wrapper' (tıklanabilir ya da büyütülebilirse <button>, değilse <div>: TAM kutu), '&__skeleton' (isLoading), '&__fallback' + '&__fallback-icon' + '&__fallback-text' (kırık/boş kaynak), büyütülmüş önizleme: '&__preview' (tam ekran zemin), '&__bar' (düğme çubuğu), '&__button' (✕ ve döndürme düğmeleri), '&__zoomed' (büyütülmüş görsel). Önizleme portal ile sayfa kökünün altına taşınır ama sınıflar elemandadır, parçalar yine tutar. ODAK: <img> odak almaz, yani kök '&:focus-visible' HİÇ tetiklenmez; halka için '&__wrapper:focus-visible' yaz (varsayılan: UA halkası). '&:hover' ve '&:active' kökte (img) çalışır. <img> bir replaced element'tir: kökte '::before/::after' ÇİZİLMEZ — alttan örtü (scrim) için '&__wrapper' {position:'relative'} + '&__wrapper::after' {content:\"''\", position:'absolute', inset:0, background:'linear-gradient(...)', pointerEvents:'none'} yaz (ölçüldü: wrapper kutusunun tamamını kaplar). '@media', '@keyframes' (shared designerStyle) ve '!important' çalışır; kök 'objectFit' appearance.widthType'ı yener. Olmayan parça adı (ör. '&__image', '&__root') sessizce etkisizdir (silentlyDropped'a düşmez)."
|
|
1013
1145
|
}
|
|
1014
1146
|
},
|
|
1015
1147
|
video: {
|
|
1016
|
-
summary: 'HTML5 video oynatıcı: src + poster, autoplay/loop/muted/controls anahtarları, akıştan sürülebilen isPlaying kolu ve play/pause/ended olayları. Tarayıcının kendi kontrollerini çizer — özel oynatıcı arayüzü yoktur.',
|
|
1017
|
-
behavior: [
|
|
1018
|
-
"src hem DOSYA ALANI NESNESİ hem DÜZ URL METNİ kabul eder (getfileUrl: metin olduğu gibi kullanılır, nesnede type:'file' ise data/value, değilse absolute_path okunur). Katalog tipi 'object' görünür çünkü şemada FileProp'tur; metin yazmak geçerlidir ve akıştan gelen uç FILE alanı olduğu gibi taşınabilir. Boş src'de src özniteliği HİÇ yazılmaz (boş istek atılmaz), poster varsa yalnız kapak görünür.",
|
|
1019
|
-
'
|
|
1020
|
-
'
|
|
1021
|
-
|
|
1022
|
-
"'
|
|
1023
|
-
"
|
|
1024
|
-
"
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1148
|
+
summary: 'HTML5 video oynatıcı: src + poster, autoplay/loop/muted/controls anahtarları, akıştan sürülebilen isPlaying kolu ve play/pause/ended/load/error olayları. Tarayıcının kendi kontrollerini çizer — özel oynatıcı arayüzü yoktur.',
|
|
1149
|
+
behavior: [
|
|
1150
|
+
"src hem DOSYA ALANI NESNESİ hem DÜZ URL METNİ kabul eder (getfileUrl: metin olduğu gibi kullanılır, nesnede type:'file' ise data/value, değilse absolute_path okunur). Katalog tipi 'object' görünür çünkü şemada FileProp'tur; metin yazmak geçerlidir ve akıştan gelen uç FILE alanı olduğu gibi taşınabilir. Boş src'de src özniteliği HİÇ yazılmaz (boş istek atılmaz), poster varsa yalnız kapak görünür. Adres sanitize EDİLMEZ (javascript:/data: özniteliğe yazılır) ama <video> bunları çalıştırmaz (ölçüldü 2026-10-05: betik koşmadı).",
|
|
1151
|
+
"KAYNAK YÜKLENDİ / YÜKLENEMEDİ: 'load' ilk kare hazır olunca yayılır, event.data = { duration (sn; sonsuz/bilinmiyorsa 0), width, height (kaynağın kendi piksel boyu) }. İkisi de YALNIZ oynatıcı çizilirken yayılır: isLoading:true iken <video> hiç kurulmadığından load/error gelmez — kaynağı beklerken iskelet istiyorsan isLoading'i kapalı bırak, ayrı bir yer tutucu göster ve load/error'da gizle (ya da isLoading'i kaynağı çözen sorgudan kapat). Repeater satırı içindeki bir videoda mount/load/error ve sökülme geri yazımı satırı SEÇMEZ. 'error' kaynak yüklenemediğinde (404, video olmayan dosya, desteklenmeyen biçim) yayılır, event.data = { code (1 iptal · 2 ağ · 3 çözümleme · 4 kaynak yok/desteklenmiyor), message }. error olmadan bileşen bozuk kaynağı SESSİZCE siyah bir kutu olarak bırakır (kutu ölçüsünü korur, sayfa çökmez): kullanıcıya göstermek için error akışında bir yedek metin/ikon aç. error geldiğinde isPlaying true ise false'a düşer (bu yüzden doğan pause olayı yayılmaz).",
|
|
1152
|
+
"OYNATMAYI AKIŞTAN SÜRME: props.isPlaying true yazmak play(), false yazmak pause() demektir; bileşen de play/pause/ended olaylarında aynı prop'a geri yazar (popover isOpen deseninin aynısı). isPlaying NİYETTİR: kaynak değişirse (src yeni değer) tarayıcı eski klibi sessizce durdurur ama isPlaying true ise YENİ klip yüklenince kendiliğinden oynar — oynatma listesinde yalnız src'yi yazman yeter (2026-10-05'ten önce video duruyor ve isPlaying true takılı kalıyordu). Tarayıcı jest politikası burada da geçerlidir: SESLİ bir videoyu kullanıcı etkileşimi olmadan başlatmak REDDEDİLİR ve isPlaying hemen false'a geri yazılır (play/pause olayı YAYILMAZ); kullanıcı jesti sonrası akışın true yazması oynatır. Akıştan başlatılacak video için muted:true yaz.",
|
|
1153
|
+
'AUTOPLAY üç şart ister: autoplay:true + muted:true + tarayıcının izin vermesi. muted olmadan autoplay hemen hemen her tarayıcıda engellenir. Eleman her zaman playsinline ile çizilir, yani iOS Safari videoyu tam ekrana almaz. Ekranda duran bir videoda autoplay\'i sonradan açmak oynatmayı BAŞLATMAZ (ölçüldü 2026-10-05: el.autoplay true oldu, paused true kaldı).',
|
|
1154
|
+
"loop:true iken 'ended' HİÇ yayılmaz (döngü videosu bitmez; pause da yayılmaz); 'bittiğinde şunu yap' akışı loop kapalı ister. Video bittiğinde tarayıcı HTML spesifikasyonuna göre ÖNCE 'pause' SONRA 'ended' yayar — yani 'pause'a bağlı akış, kullanıcı duraklatmasa da bitişte koşar; ikisi de isPlaying'i false yazdığı için durum aynı kalır. 'Kullanıcı duraklattı' ile 'bitti'yi ayırmak gerekiyorsa event.data.currentTime ile duration'ı karşılaştır (ölçüldü: bitişte currentTime = duration).",
|
|
1155
|
+
"'click' olayı ancak akışa BAĞLIYSA çalışır. Sarmalayıcı HER ZAMAN <div>dir (2026-10-05'ten önce <button> idi ve controls:true iken içindeki <video controls> ikinci bir Tab durağıydı). controls:false iken sarmalayıcı role=button + tabindex=0 alır ve Enter/Boşluk da click üretir; controls:true iken düz kutu kalır: videonun kendisi tek Tab durağıdır ve klavyeyle oynat/duraklat click ÜRETMEZ. controls:true iken videonun YÜZEYİNE tıklamak hem oynatır/duraklatır hem click üretir; kontrol çubuğundaki yerel oynat/duraklat düğmesine basmak ise videoyu oynatır AMA click'i TETİKLEMEZ (ölçüldü 2026-10-05: yerel denetim çubuğu olayı sarmalayıcıya yükseltmiyor; eski 'düğmeye basmak da click tetikler' notu yanlıştı). Tıklamayı 'videoyu aç' gibi bir aksiyon için kullanacaksan controls:false ile kullan. controls:false + click bağlıyken odak sarmalayıcıdadır (video odak almaz): odak halkası için '&__wrapper:focus-visible' yaz.",
|
|
1156
|
+
"ERİŞİLEBİLİR AD: ariaLabel <video aria-label> olur ve controls:false + click bağlıyken düğme rolündeki sarmalayıcıya da yazılır (boşsa ad yoktur; adsız düğme ekran okuyucuda yalnız 'düğme' okunur). Altyazı (<track>) desteği YOKTUR: sesli içerikte altyazıyı başka bir bileşenle (metin) ver.",
|
|
1157
|
+
"isHidden:true iken bileşen hiç çizilmez; isLoading:true iken oynatıcı yerine nabız atan bir iskelet kutusu çizilir (src akıştan gelene kadar; prefers-reduced-motion altında nabız durur, sarmalayıcı aria-busy taşır). Oynatıcı bu iki yoldan ya da bileşenin sökülmesiyle (modal kapanışı, sekme değişimi) kalkarsa isPlaying false'a düşer; geri geldiğinde yeni eleman currentTime 0'dan başlar ve kendiliğinden BAŞLAMAZ. mount OLAYI bileşenin kendisinden DEĞİL, ortak render katmanından gelir ve bir kez yayılır (2026-09-16 turuna kadar bileşen ayrıca yayıyordu ve mount'a bağlı akış İKİ KEZ koşuyordu — ARC-006).",
|
|
1158
|
+
"Ölçü/uyum kararı düğümün appearance kanalındadır, prop değil: widthType cover|contain elemanın object-fit'ini seçer, alignType contain'de object-position'ı (heightType auto iken de), heightType:'auto' + aspectRatio en-boy oranını verir. aspectRatio bir SAYIDIR (1.7778): '16/9' metni 'System.Double' hatasıyla reddedilir; 0 ve negatif yok sayılır. heightType auto + widthType contain artık letterbox'lar (2026-10-05'ten önce object-fit cover kalıp oranı verilmiş kutuda sessizce kırpıyordu; contain'e eşlenen fixed/fill genişlikler de aynı değişimi alır). Flex kabında appearance aynı alanda YERLEŞİM kipi taşır (fill/fixed); bunlar contain'e eşlenir: flex/fill kutusundaki video LETTERBOX'lanır; kırpmak istiyorsan widthType'ı açıkça cover yap (ARC-079). heightType:'fill' sabit yükseklikli bir container içinde DOLDURMAZ: container'ın çocuk sarmalayıcısı içerikle büyür ve gövdesi kaydırır (container tasarımı, image'de de aynı), 'doldur' kesin yükseklik zinciri ister — sabit kutu için heightType:'fixed' + heightString yaz."
|
|
1159
|
+
],
|
|
1160
|
+
propNotes: {
|
|
1161
|
+
ariaLabel: "Videonun erişilebilir adı (ekran okuyucu): <video aria-label> ve click bağlıyken sarmalayıcı <button aria-label>. Görünür bir etiket çizmez. Boşsa ad verilmez.",
|
|
1162
|
+
src: 'Dosya alanı nesnesi YA DA mutlak/göreli URL metni. Boş bırakılırsa oynatıcı kaynaksız çizilir (poster varsa kapak görünür). Yüklenemezse error, yüklenince load olayı yayılır.',
|
|
1163
|
+
poster: 'Oynatmadan önce görünen kapak görseli (URL metni ya da görsel alanı). Oynatma başlayınca kaybolur. Kırık bir kapak sayfayı bozmaz ama kutu oynatmaya kadar boş görünür.',
|
|
1164
|
+
autoplay: 'Tarayıcı otomatik oynatma bayrağını kaynak İLK yüklenirken okur; ekranda duran bir videoda bu anahtarı sonradan açmak oynatmayı BAŞLATMAZ (ölçüldü 2026-10-05). muted ile birlikte kullan; akıştan başlatmak için isPlaying.',
|
|
1165
|
+
muted: 'Sessiz oynatma. autoplay ve akıştan başlatma için pratikte zorunludur. Çalışma anında akıştan değiştirilebilir.',
|
|
1166
|
+
controls: "Tarayıcının kendi oynatıcı kontrolleri. false iken tek oynatma yolu akıştan isPlaying'dir ve video odak almaz (Tab düşmez).",
|
|
1167
|
+
loop: "Bitince başa sarar; açıkken 'ended' ve 'pause' olayları yayılmaz.",
|
|
1168
|
+
isPlaying: "Çift yönlü NİYET kolu: akış yazınca oynatır/duraklatır, bileşen play/pause/ended'de geri yazar (self.isPlaying). Jestsiz sesli oynatma reddedilirse hemen false'a döner. src değişince yeni klip kendiliğinden oynar (true iken); oynatıcı sökülünce (isLoading/isHidden/modal kapanışı) ve error'da false'a düşer. Aynı değeri art arda yazmak (true iken true) bir şey yapmaz — başlatmak için önce durumun false olması gerekir.",
|
|
1169
|
+
isLoading: "Oynatıcının YERİNE iskelet kutusu çizer — <video> elemanı hiç kurulmaz (sarmalayıcı aria-busy taşır, prefers-reduced-motion altında nabız durur). Bu sırada click olayı çalışmaz ve oynayan bir video sökülür; isPlaying false'a düşer. isLoading kapanınca yeni eleman currentTime 0'dan başlar ve kendiliğinden başlamaz. Kök style'daki köşe/kenarlık iskelete de iner; iskeleti ayrıca '&__skeleton' ile boya. isLoading açıkken load/error yayılmaz (eleman yok); kaynağı çözen sorgudan kapat.",
|
|
1170
|
+
style: STYLE_GROUP_NOTES.styleEscape + " KÖK anahtarlar (köşe, kenarlık, gölge, filtre, opacity, objectFit, outline, transition, aspectRatio) <video> elemanına iner; sarmalayıcıya İNMEZ. PARÇALAR (iki tane, ilk adayda tutar, 2026-10-05): '&__wrapper' (<div>; controls:false + click bağlıyken role=button: TAM kutu — dolgu, zemin, gradyan çerçeve, köşe buradan verilir) ve '&__skeleton' (isLoading iskeleti). Olmayan parça adı ('&__video', '&__poster', '&__player', '&__root') sessizce etkisizdir (silentlyDropped'a düşmez). ODAK: video yalnız controls:true iken odak alır (click bağlı olsa da); controls:false + click bağlıyken odak sarmalayıcıdadır — halka için '&__wrapper:focus-visible' yaz (kök '&:focus-visible' orada tetiklenmez). '&:hover' ve '&:active' kökte (video) çalışır. <video> bir replaced element'tir: kökte '::before/::after' ÇİZİLMEZ — alttan karartma için '&__wrapper' {position:'relative'} + '&__wrapper::after' {content:\"''\", position:'absolute', inset:0, background:'linear-gradient(...)', pointerEvents:'none'} yaz. Yerel denetim çubuğu Chromium'da '&::-webkit-media-controls-panel' {background} ile boyanır (yalnız Chromium/Safari, shadow DOM: hesaplanmış değeri okunamaz). '@media', '@keyframes' (shared designerStyle) ve '!important' çalışır. Webkit önekli özellikleri kebab-case yaz ('-webkit-mask-image'); PascalCase 'WebkitMaskImage' sessizce DÜŞER (silentlyDropped). İç içe seçici ('&:hover &__wrapper') tutmaz."
|
|
1036
1171
|
}
|
|
1037
1172
|
},
|
|
1038
1173
|
qrcode: {
|
|
@@ -1058,16 +1193,20 @@ export const componentKnowledge = {
|
|
|
1058
1193
|
tags: {
|
|
1059
1194
|
summary: 'Salt gösterim etiket listesi (tag-input’un okunur akrabası); tıklanan etiketi akışa verir.',
|
|
1060
1195
|
behavior: [
|
|
1061
|
-
"values bir DİZİdir: [{ label, color?, variant?, isActive? }]. Akıştan gelen liste çizilmeden önce süzülür: dizi olmayan değer (null, düz metin) boş liste; metin/sayı öğe renksiz etiket olur (['billing','critical'] geçerli); label yoksa öğenin value alanı okunur (tag-input değeri doğrudan bağlanabilir,
|
|
1062
|
-
|
|
1196
|
+
"values bir DİZİdir: [{ label, icon?, color?, customColor?, variant?, isActive? }]. Akıştan gelen liste çizilmeden önce süzülür: dizi olmayan değer (null, düz metin) boş liste; metin/sayı öğe renksiz etiket olur (['billing','critical'] geçerli); label yoksa öğenin value alanı okunur (tag-input değeri doğrudan bağlanabilir, hex rengi de çizilir); boş metinli ya da metinsiz öğe atlanır.",
|
|
1197
|
+
"RENK: color bir status adıdır (primary|info|success|warning|error, tema renkleri) YA DA doğrudan çizilebilir bir CSS rengi (#hex, rgb()/hsl(), var(--ng-*) token, renk adı) — bir tag-input değerinin { value, color: '#3b82f6' } öğesi olduğu gibi bağlanınca rengiyle çizilir. Ayrıca customColor (panelde Custom color) doluysa o, color'ın (status adı olsa bile) önüne geçer. Çizilemeyen değer ('zzz', 'red; x:y', '#12345', 'rgb(zzz)', 'transparent', 'currentcolor', boş) yok sayılır: customColor geçersizse color okunur, ikisi de geçersizse etiket nötr gri çizilir. Serbest renk de status etiketi gibi açık bir ton zemin + rengin metin rengine çekilmiş hâli yazı olarak çizilir (opak renklerde, saf beyaz ve siyah dahil, açık ve koyu temada yazı ≥ 4.5:1 ölçüldü; alfa kanallı renkler ölçülmedi), outline'da kenarlık seçilen renktir; seçilen renk zemin tonunda ve kenarlıkta kalır, yazı rengini TEMA belirler. Hex renk temayı izlemez: koyu temada okunan tonu tema yazı rengi sağlar ama 'tam bu renk' beklenmez. SİMGE: icon (panelde Icon) etiket metninin önüne konur: Material Symbols adı ('star') ya da { name: 'star' } nesnesi; simge etiketin yazı rengini devralır, boş/adsız simge çizilmez. Simge dekoratiftir (ekran okuyucuya okunmaz, etiket metni adı verir). variant: solid (varsayılan, açık zemin) | outline (renkli kenarlık). isActive:true zemini belirginleştirir (hover seçili etiketi değiştirmez) — filtre çipi gibi seçili etiketi göstermek için akıştan yaz.",
|
|
1063
1198
|
"Düğümün olaylarında clickItem satırı varsa etiketler düğme olur (el imleci, hover, klavyeyle odak) — satıra akış seçilmemiş olsa bile; clickItem satırı yoksa salt metindir. Yayında event.data = { currentItem, index }, öğe ayrıca self.currentItem'a yazılır. index values dizisindeki GERÇEK yerdir (atlanan öğeler kaydırmaz) — akış values[index].isActive'i değiştirip values'u geri yazarak seçimi çevirebilir. Bileşen isActive'i kendisi DEĞİŞTİRMEZ.",
|
|
1064
1199
|
"Eski şemada öğe anahtarı active'di ve runtime okumuyordu (2026-09-16 düzeltildi); kayıtlı sayfalardaki active:true artık etkilidir ama paneldeki Active anahtarı onu KAPALI gösterir (isActive okur); yeni yazımda isActive kullan, eski öğeyi kapatmak için isActive:false yaz.",
|
|
1065
|
-
'Etiket eklemek/silmek gereken ekranda tag-input kullan; tags değer yazmaz, change yaymaz.'
|
|
1200
|
+
'Etiket eklemek/silmek gereken ekranda tag-input kullan; tags değer yazmaz, change yaymaz.',
|
|
1201
|
+
"UZUN METİN: boşluksuz 300 karakterlik etiket de kabın içinde satır kırar; etiket en çok kabın genişliği kadar olur — &__tag'a maxWidth/overflowWrap yazmak GEREKMEZ. Etiketler satır sonunda alt satıra sarar; kökte flexWrap:'nowrap' verirsen etiketler yine sözcüğün genişliğine kadar daralır (sözcük ortasından kırılmaz, yalnız kabı aşan tek etiket kırılır).",
|
|
1202
|
+
"ERİŞİLEBİLİRLİK: isActive olan etiket aria-current='true' taşır; seçili durumu ekran okuyucuya iletmesi tıklanabilir (button) etikette güvenilirdir, salt metin (span) etikette öznitelik taşınır ama okunması ekran okuyucuya bağlıdır — durumu başka bir yolla da anlatmak istersen etiket metnine yaz. Tıklanabilir etiket kendi metniyle adlanan bir button'dır; basılı tutulan Enter olayı BİR kez tetikler. Kök bir liste değildir (rolsüz div).",
|
|
1203
|
+
"VERİ YAZIMI: values'a statik düz metin/sayı dizisi (['billing','critical']) ve karışık dizi KAYDEDİLEMEZ (500) — values'u kod tipinde bağla: {{ ['billing','critical'] }}. Statik öğenin label'ında {{ }} yorumlanmaz, ham basılır; ifade gerekiyorsa values'un kendisini ifade olarak yaz ({{ [{ label: state.page.x }] }}). Akış values'ı okuyup geri yazarsa label'daki çeviri sarmalı boşalır: akışta t(anahtar) ile çözülmüş metni yaz.",
|
|
1204
|
+
"STİL HEDEFLERİ: kök CSS (gap, justifyContent, flexDirection, padding, border, fontSize, fontFamily, color…) çalışır; kökün fontSize/fontFamily'si etiketlere iner, color'ı yalnız renksiz (nötr) etikete iner — durum renkleri kendi rengini korur. '&__tag' HER etiketi hedefler (backgroundColor, color, border, borderRadius, padding, fontFamily, fontSize, fontWeight, textTransform, letterSpacing, boxShadow, textShadow, maxWidth ve linear-gradient çalışır; varyantın ve rengin zeminini ezer). Etiketin öznitelikleri durum hedefidir: &__tag[data-active='true'] (seçili), &__tag[data-color='success'] (renk), &__tag[data-variant='outline'] (varyant); bunlarla :hover, :focus-visible, ::before, :nth-child(n) ve @media birlikte yazılır. '&__tag:hover' salt metin (span) etiketine de uygulanır; YALNIZ tıklanabilirleri hedeflemek için '&__tag.ng-tag--clickable:hover'. Çakışan durum kuralları (aktif + hover aynı özellik) için kazanan anahtar sırasına bağlıdır: aynı özelliği tek seçicide ver. Etiket başına simge icon, etiket başına renk customColor/color ile verilir; renkli nokta isteniyorsa '&__tag[data-custom]::before' ile content:'', display:inline-block, width/height:8px, borderRadius:50%, marginInlineEnd:6px ve background:'var(--ng-tag-color)' yazılır (serbest renkli etiket CSS değişkeni --ng-tag-color taşır, data-custom='true' alır). Etiket başına GRADYAN özelliği YOKTUR: ':nth-child' ile yazılır (veriye bağlı değil)."
|
|
1066
1205
|
],
|
|
1067
1206
|
propNotes: {
|
|
1068
|
-
values: "[{ label, color?, variant?, isActive? }] ya da düz metin dizisi. color: primary|info|success|warning|error; variant: solid|outline.",
|
|
1207
|
+
values: "[{ label, icon?, color?, customColor?, variant?, isActive? }] ya da düz metin dizisi (kod tipinde bağla). color: primary|info|success|warning|error ya da doğrudan CSS rengi (#hex, rgb(), var(--token), renk adı); customColor (CSS rengi) doluysa color'ı ezer; çizilemeyen renk nötr. icon: Material Symbols adı ya da { name }. variant: solid|outline.",
|
|
1069
1208
|
currentItem: "Gizli prop: son tıklanan öğe (values'taki nesnenin tamamı, düz metin dizisinde metnin kendisi). index yalnız event.data'da.",
|
|
1070
|
-
style: "Kök düğüm ve '&__tag' alt anahtarı (her etiket)."
|
|
1209
|
+
style: "Kök düğüm ve '&__tag' alt anahtarı (her etiket). Durum hedefleri etiketin data-active / data-color / data-variant öznitelikleridir; tıklanabilir etiketin ek sınıfı ng-tag--clickable (davranış maddesi STİL HEDEFLERİ)."
|
|
1071
1210
|
}
|
|
1072
1211
|
},
|
|
1073
1212
|
notification: {
|
|
@@ -1082,10 +1221,11 @@ export const componentKnowledge = {
|
|
|
1082
1221
|
'İKON: tür ikonu (information info · success check_circle · warning warning · error error) showIcon ile kapatılabilir, icon prop ile başka bir Material Symbols adıyla değiştirilebilir. Rengi her zaman tür verir, ikon seçicide renk alanı YOKTUR — renk bu bandda anlamın kendisidir.'
|
|
1083
1222
|
],
|
|
1084
1223
|
propNotes: {
|
|
1085
|
-
header:
|
|
1086
|
-
content:
|
|
1224
|
+
header: "Kalın yazılan başlık; metnin başına akar (ayrı satır değildir) ve ardına İKİ NOKTA eklenir — başlık zaten noktalamayla bitiyorsa eklenmez ('Dikkat!' olduğu gibi kalır; 2026-10-01, QA NF-004). Sayı da başlıktır (0 → '0:'). YAZILMAZSA ÇİZİLMEZ: 'Error' yalnız Studio'da bırakılan bandın örneğidir (2026-10-01, QA NF-001 — öncesinde header'ı yazılmamış her bant, başarı bandı dâhil, 'Error:' çiziyordu). Başlıksız band için alanı yazma ya da boş bırak.",
|
|
1225
|
+
content: "Bandın metni. Tek satır gerekmez, kutu büyür; uzun kelimeler satır sonunda bölünür. Yazılmazsa BOŞTUR ('Notification content goes here' yalnız Studio'da bırakma anının örneğidir; 2026-10-01, QA NF-001).",
|
|
1087
1226
|
showIcon: 'Tür ikonunu çizer. false iken ikon kolonu hiç oluşturulmaz (metin sola yaslanır) ve panelde icon alanı gizlenir.',
|
|
1088
|
-
|
|
1227
|
+
showCloseButton: "Varsayılan true. × düğmesi close olayını yayar (event.data.reason 'user') ve bandı gizler; klavyeyle odaklanıp Enter ile de kapatılır. false iken düğmenin kolonu hiç oluşturulmaz — bant yalnız timeout ile ya da akışın isHidden yazmasıyla kapanır.",
|
|
1228
|
+
icon: "Tür ikonunu ezen Material Symbols adı; düz metin ('star') ya da ikon seçicinin { name } nesnesi. Boş bırakılırsa tür ikonu çizilir; renk yine türden gelir (nesnedeki color yok sayılır). Panelde alan yalnız showIcon false iken gizlenir (2026-10-01, QA NF-002; öncesinde showIcon yazılmamış düğümde de gizleniyordu).",
|
|
1089
1229
|
timeout: 'Milisaniye. Bileşen GÖRÜNÜR olduğu sürece sayar, süre dolunca close yayar ve props.isHidden true olur. 0, boş ya da sayı olmayan değer kendiliğinden kapanma YOK demektir.',
|
|
1090
1230
|
kind: 'information | error | success | warning — rengi ve ikonu birden seçer. Buton ve toast sözlüğünden farklıdır (orada info/primary/default var): akıştan info gelirse komponent information, danger gelirse error okur, bilinmeyen değer information olur. Panel açılır listesinde yalnız dört değer görünür.',
|
|
1091
1231
|
isHidden: 'Şemada tanımlıdır; statik true ile gizli başlatılır, akıştaki setter ile açılıp kapanır. Komponent kendi kapanışında da bu prop\'a yazar.',
|
|
@@ -1114,11 +1254,13 @@ export const componentKnowledge = {
|
|
|
1114
1254
|
breadcrumb: {
|
|
1115
1255
|
summary: 'Tek satırlık sayfa yolu: homeTitle (kök) + items (aradakiler) + currentTitle (bulunulan sayfa). Adresi olan öğe bağlantıdır, tıklama ayrıca clickItem yayar. KAPSAYICI DEĞİLDİR.',
|
|
1116
1256
|
behavior: [
|
|
1257
|
+
"BOŞ İZ (BC-002, 2026-09-30): homeTitle, items ve currentTitle üçü de boşken (ve yüklenmiyorken) kök etiketsiz bir div'dir — ekran okuyucuya boş bir gezinme bölgesi duyurulmaz; bir parça dolunca ya da isLoading açılınca yeniden nav olur.",
|
|
1258
|
+
"2026-09-30 (page-header QA PH-001/002/006/008/010): kırıntı satırdan geniş olamaz — uzun metin üç noktayla kısalır, tam ad title'da, ayraç kısalmaz. Kırıntı rengi --ng-text-secondary (eskiden --ng-text-disabled, 2.92:1 — bağlantı devre dışı görünüyordu). Ayraç '/' CSS alternatif metni boş olduğu için erişilebilir ada karışmaz. nav aria-label sayfa dilinden gelir ('Gezinti yolu' / 'Breadcrumb'). Yükleme çubukları --ng-border-primary tonunda.",
|
|
1117
1259
|
'Üç parça ayrı prop’tur ve sırası sabittir: homeTitle → items → currentTitle. Metni boş olan parça HİÇ çizilmez, yani yalnız items vererek köksüz bir iz de kurulabilir. Ayraç (/) bileşenin kendi CSS’indedir, prop’u yoktur; son öğeden sonra basılmaz.',
|
|
1118
1260
|
"Öğenin türü adresine ve olay bağına göre seçilir: href çözülüyorsa <a> (iç adres SPA gezinmesi, dış adres / mailto / tel doğrudan tarayıcı), href yoksa ve clickItem bir akışa bağlıysa <button>, ikisi de yoksa düz metin. 2026-09-17'den önce HER öğe <button> + goto() idi: dış adresler SvelteKit 2'de hata verip hiçbir yere gitmiyordu, bulunulan sayfa ise hiçbir şey yapmayan bir düğmeydi.",
|
|
1119
1261
|
'currentTitle tıklanabilir değildir (aria-current="page"); kip etiketi (Yeni/Düzenle) gibi kullanılacaksa akış bu prop’a setter ile yazar.',
|
|
1120
1262
|
"items dizi DEĞİLSE (temizlenmiş prop null, henüz dolmamış {{ }} ifadesi, düz nesne) iz BOŞ çizilir — 2026-09-17'den önce bileşen bu durumda çizim sırasında patlıyordu. Satır { title, href } bekler ama düz metin dizisi (['Müşteriler','Ahmet']) ve title yerine label yazan satır da okunur; metinsiz satır düşer, düşen satır olay yükündeki index'i KAYDIRMAZ.",
|
|
1121
|
-
'İz sarılır: tek satıra sığmayan kırıntı alt satıra iner (düğüm yüksekliği yetmiyorsa Size’dan artır, maxHeight 6
|
|
1263
|
+
'İz sarılır: tek satıra sığmayan kırıntı alt satıra iner (düğüm yüksekliği yetmiyorsa Size’dan artır, maxHeight 12 satırdır (2026-09-30’a kadar 6’ydı ve sarılan iz sabit yükseklikte taşıyordu — BC-001; varsayılan otomatik yükseklik her zaman sığar)). Uzun bir izi tek satırda toplayıp "…" menüsüne indiren varyant AYRI bir komponenttir: breadcrumb-title.',
|
|
1122
1264
|
'Olaylar: mount · clickItem. Sayfa başlığıyla birleşik, kip etiketli, ikonlu ya da katlanan bir iz isteniyorsa breadcrumb-title kullanılır; page-header ise bu komponenti kendi links/pageTitle prop’larıyla İÇİNDE çizer.'
|
|
1123
1265
|
],
|
|
1124
1266
|
propNotes: {
|
|
@@ -1132,8 +1274,10 @@ export const componentKnowledge = {
|
|
|
1132
1274
|
}
|
|
1133
1275
|
},
|
|
1134
1276
|
'page-header': {
|
|
1135
|
-
summary: 'Sayfa başlığı bandı: links dizisinden çizilen kırıntı izi + ALTINDA
|
|
1277
|
+
summary: 'Sayfa başlığı bandı: links dizisinden çizilen kırıntı izi + ALTINDA başlık olarak pageTitle (headingLevel: h1 varsayılan, h2/h3). İzdeki adresli öğe bağlantıdır, tıklama ayrıca clickItem yayar. KAPSAYICI DEĞİLDİR.',
|
|
1136
1278
|
behavior: [
|
|
1279
|
+
"2026-09-30 QA turu (PH-001…010): kök bir <div>'dir, <header> DEĞİL — sayfada banner yer imi oluşturmaz. Başlık etiketi headingLevel'dır (sekme/modal içindeki ikinci bantta h2/h3 ver; tanınmayan değer h1). pageTitle boşken başlık elemanı HİÇ çizilmez. isLoading'de başlık iskeleti bandın %40'ını (en az 10rem) kaplar. İz kırıntıları kutudan geniş olamaz: uzun kırıntı üç noktayla kısalır, tam ad title'da; bağlantılar ikincil metin renginde (≈8.4:1), bulunulan sayfa birincil renkte; ayraç '/' erişilebilir ada karışmaz; izin aria-label'ı sayfa dilinde ('Gezinti yolu').",
|
|
1280
|
+
"STUDIO PANELİ: Common'da pageTitle, headingLevel, links, isLoading; Style sekmesi stil kurucusudur — Preset · Spacing · Size · Breadcrumb style (breadcrumbStyle) · Custom properties (style). 2026-09-30'dan önce breadcrumbStyle panelde hiçbir yerde yoktu.",
|
|
1137
1281
|
'İki katman, sırası sabit: üstte iz (links), altında başlık (pageTitle). İzi çizen breadcrumb komponentinin KENDİSİDİR (links → items, pageTitle → currentTitle, breadcrumbStyle → style): öğe türü seçimi (<a> / <button> / düz metin), sarma, düz metin dizisi ve label anahtarı okuma breadcrumb ile birebir aynıdır. Kök öğe (homeTitle) YOKTUR — kök gerekiyorsa links’in ilk satırı olarak yazılır; varsayılan Homepage satırı tam bunu yapar.',
|
|
1138
1282
|
"links boşsa ya da dizi değilse (temizlenmiş prop null, henüz dolmamış {{ }} ifadesi) iz HİÇ çizilmez, yalnız başlık kalır — 2026-09-18'den önce dizi olmayan links çizim sırasında patlıyordu (links.length).",
|
|
1139
1283
|
'pageTitle izin SON öğesi olarak da basılır (tıklanamaz, aria-current="page") — başlığı links’e bir daha yazma. pageTitle boşsa başlık satırı boş kalır ve izde bulunulan sayfa öğesi çizilmez.',
|
|
@@ -1142,6 +1286,7 @@ export const componentKnowledge = {
|
|
|
1142
1286
|
'Düğüm boyu: başlık tek başına 40px (4 ızgara satırı), izle birlikte ≈ 62px (7 satır). Auto yükseklikle bırakılırsa içerik kadar uzar; sabit yükseklikte maxSize.h 12’dir — eski 4 satır sınırı izli başlığı sığdıramıyor, tutamaçtan boyutlandırılan düğümü 40px’e çökertiyordu (2026-09-18’de düzeltildi).'
|
|
1143
1287
|
],
|
|
1144
1288
|
propNotes: {
|
|
1289
|
+
headingLevel: "Başlığın etiketi: 'h1' (varsayılan) | 'h2' | 'h3'. Sayfanın ANA başlığı h1 kalsın; aynı sayfadaki ikinci bir bant (sekme, modal, bölüm) h2/h3 almalı — ikinci h1 başlık hiyerarşisini bozar. Boyut temanın o seviyedeki ölçeğinden gelir.",
|
|
1145
1290
|
pageTitle: "Bant başlığı (h1) VE izin son öğesi; page_container.title ile karıştırılmamalı. `description` / altbaşlık diye bir prop YOKTUR (unknown-prop verir) — açıklama satırı için bandın altına ayrı bir text düğümü koy.",
|
|
1146
1291
|
links: "Kırıntı izinin öğeleri: [{ title, href }], başlığın ÜSTÜNDE soldan sağa. Sağ tarafta aksiyon bağlantısı ÇİZMEZ (eski kayıt böyle diyordu, runtime hiç öyle çizmedi). Akıştan gelen düz metin dizisi ve label anahtarı da okunur; metinsiz satır düşer. Dizi olmayan değer = iz yok (hata değil).",
|
|
1147
1292
|
isLoading: 'true iken iz ve başlık yerine iskelet çubukları çizilir, hiçbir öğe basılmaz, clickItem yayılmaz — links’i mount akışından dolduran ekranda boş bandın görünmesini engeller. mount BUNDAN BAĞIMSIZDIR.',
|
|
@@ -1152,16 +1297,22 @@ export const componentKnowledge = {
|
|
|
1152
1297
|
}
|
|
1153
1298
|
},
|
|
1154
1299
|
header: {
|
|
1155
|
-
summary: "Uygulama üst çubuğu (layout parçası): logo,
|
|
1300
|
+
summary: "Uygulama üst çubuğu (layout parçası): logo, başlık, bağlantı şeridi (tek düzey açılır alt menülü), 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.",
|
|
1156
1301
|
behavior: [
|
|
1157
1302
|
"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.)",
|
|
1158
1303
|
"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.",
|
|
1159
1304
|
"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.",
|
|
1160
|
-
"navigation öğesi
|
|
1305
|
+
"ALT MENÜ (HDR-002, 2026-09-29): navigation[].children açılır alt menü olarak çizilir; alt öğesi olan üst öğe bağlantı değil düğmedir (aria-expanded) ve kendi href'i kullanılmaz. Dışarı tıklama ve Escape kapatır. Yalnız TEK düzey alt menü çizilir; daha derin ağaç için sidebar/layout ya da navigations kullan.",
|
|
1306
|
+
"Vurgulanan öğe vurgu rengi + alt çizgi alır ve aria-current='page' taşır (HDR-003); alt menüdeki bir sayfadayken üst öğe de vurgulanır. 2026-09-29'dan önce vurgu hover ile aynı zemin tonuydu ve açık temada görünmüyordu.",
|
|
1307
|
+
"DAR EKRAN (HDR-001, 2026-09-29): ≤1023px'te menü, şeritteki menü düğmesinin (aria-expanded) açtığı panele döner. Panel şeridin İÇİNDE akar — şerit uzar ve sayfayı aşağı iter; kaplar overflow ile kesemesin diye taşan katman değildir. ≤767px'te kullanıcı alanı rozete/ikona iner (ad ekran okuyucu için okunur kalır).",
|
|
1308
|
+
"Logo boşsa ya da yüklenemezse çizilmez (HDR-004); logoHref boşsa logo bağlantı değildir. logoHref ve userHref bağlantı seçicidir ve ikisi de menü gibi getHref'ten geçer (HDR-005). Kök <header>, menü <nav aria-label> (HDR-006)."
|
|
1161
1309
|
],
|
|
1162
1310
|
propNotes: {
|
|
1163
|
-
activeNavHref: "Vurgulanacak bağlantının
|
|
1164
|
-
navigation: "[{ title, href, icon }] — tek
|
|
1311
|
+
activeNavHref: "Vurgulanacak bağlantının href'i (ham metin, bağlantı nesnesi ya da tam yol). Eşleşen öğe 'active' sınıfı + aria-current='page' alır; görsel fark vurgu rengi + alt çizgidir.",
|
|
1312
|
+
navigation: "[{ title, href (bağlantı seçici), icon: { name, color }, children: [aynı şekil] }] — children tek düzey açılır alt menüdür.",
|
|
1313
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Şerit KENDİ derler (HDR-007, 2026-09-29): değer şeridin köküne iner; alt çizgi için borderBottom.",
|
|
1314
|
+
style: "Parçalar: &__logo, &__title, &__navigations, &__navigations-item, &__navigations-item-suffix, &__submenu, &__submenu-item, &__menu-toggle, &__user, &__user-icon, &__user-short, &__user-name.",
|
|
1315
|
+
userShortName: "Doluysa ad yerine rozet, boşsa account_circle ikonu çizilir. userName boşsa kullanıcı alanı hiç çizilmez."
|
|
1165
1316
|
}
|
|
1166
1317
|
},
|
|
1167
1318
|
sidebar: {
|
|
@@ -1171,28 +1322,56 @@ export const componentKnowledge = {
|
|
|
1171
1322
|
"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.",
|
|
1172
1323
|
"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).",
|
|
1173
1324
|
"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.",
|
|
1174
|
-
"
|
|
1325
|
+
"MENÜ GÖRÜNÜMÜ navigationStyle grubuyla verilir (SB-003, 2026-09-29) — layout ile aynı grup, doğrudan navigations'a gider. Eski style parçaları &__navigations* hiçbir elemana basılmadığı için şemadan KALDIRILDI; yazılırsa etkisizdir.",
|
|
1326
|
+
"DAR EKRAN (SB-001, 2026-09-29): ≤1023px'te ızgara alanında yalnız menü düğmesi (aria-expanded) kalır; menü ekranın solundan açılan bir çekmecedir (min(300px, 85vw), overlay, role=dialog). Overlay, Escape ve genişliğin 1023'ü aşması kapatır. Tuvalde çekmece yoktur.",
|
|
1327
|
+
"KAYDIRMA (SB-002): kök ekran yüksekliğindedir ve taşmaz; uzun menü içerik alanının İÇİNDE kayar.",
|
|
1175
1328
|
"Menü olay YAYMAZ (şemada yalnız mount), satır tıklaması akış tetiklemez — gezinme ham <a href> ile tam sayfa yükleyerek olur.",
|
|
1176
1329
|
"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.",
|
|
1177
|
-
"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."
|
|
1330
|
+
"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.",
|
|
1331
|
+
"BAŞLIK BANDI yalnız logo ya da title doluyken çizilir; subtle bu bandın içindedir, yani title ve logo boşsa subtle da GÖRÜNMEZ. Band sabit kalır, altındaki menü kayar.",
|
|
1332
|
+
"YERLEŞİM: 12 kolonluk ızgarada 1–2 kolon genişliğinde (varsayılan 2), yüksekliği blok değil ekran boyudur; isDroppable false — içine bileşen bırakılmaz, içerik yalnız navigations ağacıdır. Sayfa kabının kendi dolgusu yüzünden masaüstünde sayfa ~8px fazla kayabilir; sidebar'ın kutusundan değil.",
|
|
1333
|
+
"isHidden:true sidebar'ı ve menüsünü tamamen kaldırır (dar ekrandaki menü düğmesi dahil).",
|
|
1334
|
+
"STUDIO PANELİ: Common'da title, logo, subtle, navigations, activeHref; Style sekmesinde Preset, Spacing, Size, Surface (surfaceStyle), Menu items (navigationStyle), Custom properties (style) bölümleri."
|
|
1178
1335
|
],
|
|
1179
1336
|
propNotes: {
|
|
1337
|
+
title: "Başlık bandındaki ad; logonun alt metni de budur (boşsa alt metin boş kalır, sabit ürün adı yoktur — SB-005).",
|
|
1338
|
+
logo: "image bileşeniyle 40px yükseklikte çizilir; adres yüklenemezse image'in yedek kutusu (kırık resim ikonu) görünür, düzen bozulmaz.",
|
|
1339
|
+
subtle: "Başlığın altındaki kısa açıklama; yalnız title ya da logo doluyken çizilir.",
|
|
1340
|
+
isHidden: "true → sidebar tamamen kalkar.",
|
|
1180
1341
|
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.",
|
|
1181
|
-
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).
|
|
1182
|
-
style: "
|
|
1342
|
+
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).",
|
|
1343
|
+
style: "Parçalar: &__header, &__header-logo, &__header-title, &__header-subtle, &__content, &__toggle (dar ekran menü düğmesi), &__panel (başlık + menü; dar ekranda çekmece). Eski &__navigations* parçaları ölüydü (hiçbir elemana basılmıyordu) ve 2026-09-29'da kaldırıldı; menü görünümü navigationStyle'dadır.",
|
|
1344
|
+
navigationStyle: "Menü satırlarının görünümü — layout'taki navigationStyle ile aynı alanlar: padding, radius, textColor, iconColor, hoverBackground, activeBackground, activeTextColor, activeIconColor. Hepsi boş başlar; boş alan temadan gelir.",
|
|
1345
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Yan menü KENDİ derler (SB-004, 2026-09-29): değer kökün zeminine iner; sağ çizgi için borderRight."
|
|
1346
|
+
}
|
|
1347
|
+
},
|
|
1348
|
+
'auth-layout': {
|
|
1349
|
+
summary: 'Giriş ekranı kabuğu: logo kolonu + form slotu; primaryClick/secondaryClick olayları yayar.',
|
|
1350
|
+
behavior: [
|
|
1351
|
+
"ENTER (AUTH-001/002/003, 2026-09-29): odak bileşenin İÇİNDEKİ tek satırlı bir alandayken ve primaryText dolu, primaryDisabled kapalıyken Enter primaryClick yayar. textarea/contenteditable'da yeni satırdır; odaktaki düğme, bağlantı ve select kendi Enter davranışını korur; sayfanın başka yerindeki Enter formu göndermez. Önceden pencere düzeyinde HER Enter yutuluyordu.",
|
|
1352
|
+
"Tam ekran kendi kuralıyla gelir (min-height 100dvh); form kendi içinde kaydırmaz, uzun formda kolon ve sayfa uzar (AUTH-004/005). Kök artık ng-layout sınıfı taşımaz.",
|
|
1353
|
+
"backdrop boşsa ya da verilen resim yüklenemezse paketle gelen /images/auth-bg.jpg görünür (iki katmanlı background-image). Logo yüklenemezse gizlenir; alt metni boştur (başlık zaten h1)."
|
|
1354
|
+
],
|
|
1355
|
+
propNotes: {
|
|
1356
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Bileşen KENDİ derler (AUTH-006, 2026-09-29): değer .ng-auth KÖKÜNE (içerik kolonunun zemini) iner.",
|
|
1357
|
+
style: "Serbest CSS kaçış kanalı; parçalar: &__background (sol, resimli kolon), &__content (sağ, formlu kolon), &__title (başlık).",
|
|
1358
|
+
backdrop: "Varsayılan boş — paketle gelen yedek resim kullanılır.",
|
|
1359
|
+
primaryDisabled: 'Birincil düğmeyi ve Enter ile gönderimi birlikte kapatır.'
|
|
1183
1360
|
}
|
|
1184
1361
|
},
|
|
1185
|
-
'auth-layout': { summary: 'Giriş ekranı kabuğu: logo kolonu + form slotu; primaryClick/secondaryClick olayları yayar.', propNotes: { surfaceStyle: NODE_SURFACE_NOTE } },
|
|
1186
1362
|
layout: {
|
|
1187
1363
|
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.',
|
|
1188
1364
|
behavior: [
|
|
1189
1365
|
"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.",
|
|
1190
1366
|
"Öğ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.",
|
|
1191
1367
|
"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.",
|
|
1192
|
-
"İÇERİK ALANI BİR KAPTIR (2026-09-03): container ile aynı yedi yerleşim prop'unu taşır (layout/direction/horizontalAlign/verticalAlign/size/gap/wrap, katalog varsayılanı layout:'flex'); slot ve içine bırakılan başka çocuklar bu akışla dizilir. Studio'nun
|
|
1368
|
+
"İÇERİK ALANI BİR KAPTIR (2026-09-03): container ile aynı yedi yerleşim prop'unu taşır (layout/direction/horizontalAlign/verticalAlign/size/gap/wrap, katalog varsayılanı layout:'flex'); slot ve içine bırakılan başka çocuklar bu akışla dizilir. Studio'nun layout iskeleti 2026-09-29'dan beri bu bileşeni KURMAZ (varsayılan kabuk navigations + container'dır); kayıtlı monolitler çalışmaya devam eder. Prop hiç yazılmamış eski kayıtlar ızgara çizilmeye devam eder — container'daki kuralın aynısı.",
|
|
1369
|
+
"MOBİL (≤767px, 2026-09-29): sidebar kapalı başlar ve içerik başlığındaki düğmeyle overlay'li çekmece olarak açılır; menü satırları çekmecenin içinde DOĞRUDAN görünür (gömülü menü kendi hamburger'ine dönmez). Sidebar'ın açık/kapalı durumu prop DEĞİLDİR — akıştan açılıp kapatılamaz, page_screenshot actions ile de tıklanamaz (düğmenin elementId'si yok).",
|
|
1370
|
+
"Logo yüklenemezse (bozuk URL) icon'a düşer; icon.color glifin rengidir. userAvatar boşsa ya da yüklenemezse kırık resim yerine person ikonlu kutu çizilir."
|
|
1193
1371
|
],
|
|
1194
1372
|
propNotes: {
|
|
1195
|
-
surfaceStyle:
|
|
1373
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens +
|
|
1374
|
+
" Kabuk yüzeyi KENDİ KÖKÜNDE (.ng-layout) derler (2026-09-29, LAYOUT-006): background kabuğun gri tema zeminini (--ng-background-surface-alt) ezer, boş bırakılırsa tema zemini kalır; contentOverflow kökün kendisine iner (hidden yuvarlatılmış köşeyi kırpar). Katman sırası K4: tema componentStyles → surfaceStyle → düğümün style'ı. Eskiden değer düğüm kutusuna yazılıyor ve zemin kabuğun kendi zemini altında kalıp görünmüyordu.",
|
|
1196
1375
|
navigationStyle: NAVIGATION_STYLE_NOTE,
|
|
1197
1376
|
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.",
|
|
1198
1377
|
layout: "'flex' (katalog varsayılanı; akış) | 'grid' (12 kolonluk ızgara). Prop hiç yazılmamışsa renderer IZGARA çizer. Diğer altı yerleşim prop'u yalnız 'flex' iken etkilidir; anlamları container kaydındakiyle birebir aynı."
|
|
@@ -1214,22 +1393,29 @@ export const componentKnowledge = {
|
|
|
1214
1393
|
"sidebar düzeninde MARKA ve KULLANICI bileşenin içindedir (2026-09-25): başlık bandı logo/ikon + title + subTitle çizer (logo kutusu uygulamanın ana sayfasına giden bir bağlantıdır — kırıntı yolunun ev halkasıyla aynı hedef), collapsible açıksa daraltma düğmesi bandın SAĞINDADIR (şeritte alt kısma iner). Alt kısım userName/userEmail doluysa kullanıcı düğmesidir (avatar ya da baş harfler, ad, e-posta); tıklanınca yukarı doğru bir panel açılır: ad, e-posta, userPosition, userRole ve 'Çıkış yap'. Panel Escape ve dış tıklamayla kapanır (dismiss-chain). Daraltınca marka, arama ve kullanıcı birlikte şeride iner.",
|
|
1215
1394
|
"Daraltma durumu tarayıcıda (localStorage, 'ng-nav-collapsed:<elementId>') saklanır ve SONRAKİ SAYFADA okunur — menü linkleri tam sayfa yüklediği için bellekteki durum her tıklamada kayboluyordu. Tuvalde okunmaz.",
|
|
1216
1395
|
"Menü içi arama bir ALAN gibi çizilir (kenarlık + açık zemin + '/' ipucu); sayfada yazı alanı dışındayken '/' aramaya odaklanır (kısayolun sayfada tek sahibi vardır). command düzeninin tetikleyicisi de alan görünümündedir ve Ctrl K / ⌘ K ipucu taşır; iki yerde de yer tutucu searchPlaceholder'dır.",
|
|
1217
|
-
"KAPSAYICIDIR (isDroppable, 2026-09-24): layout gibi içine komponent bırakılır ve bırakılan çocuklar menünün YANINDA/ALTINDA kendi içerik alanında çizilir, menü satırlarının arasında değil. Akış yönünü düzen belirler (navigation-content.ts): sidebar/hybrid/dual menü solda içerik sağda — sidebarSide right ise ters; toc tocPosition ile; header/tabs/breadcrumb içerik altta; footer/bottom ve dock bottom içerik üstte (dock top altta); drawer/command/launcher akışta yer kaplamaz, içerik alanı tek başına kalır. İçerik alanı navigations dizisi BOŞKEN de durur — son menü öğesi silinince bırakılan bileşenler kaybolmaz. İçine hiçbir şey bırakılmamışsa alan akıştan çıkar (menünün yanına boşluk düşmez); kenara yapışık panelde (sidebar/hybrid/dual, floating değil) menü ile içerik arasında boşluk YOKTUR, panelin kenarlığı ayırır. Bırakılan içerik alanın boyunu doldurur (fill zinciri) — yan menü + içerik sütunu kabuğu tek navigations ile kurulabilir. Kanvasta çocukların çizilmesi için kayıtlı düğümde states.isDroppable true olmalı.",
|
|
1396
|
+
"KAPSAYICIDIR (isDroppable, 2026-09-24): layout gibi içine komponent bırakılır ve bırakılan çocuklar menünün YANINDA/ALTINDA kendi içerik alanında çizilir, menü satırlarının arasında değil. Akış yönünü düzen belirler (navigation-content.ts): sidebar/hybrid/dual menü solda içerik sağda — sidebarSide right ise ters; toc tocPosition ile; header/tabs/breadcrumb içerik altta; footer/bottom ve dock bottom içerik üstte (dock top altta); drawer/command/launcher akışta yer kaplamaz, içerik alanı tek başına kalır. İçerik alanı navigations dizisi BOŞKEN de durur — son menü öğesi silinince bırakılan bileşenler kaybolmaz. İçine hiçbir şey bırakılmamışsa alan akıştan çıkar (menünün yanına boşluk düşmez); kenara yapışık panelde (sidebar/hybrid/dual, floating değil) menü ile içerik arasında boşluk YOKTUR, panelin kenarlığı ayırır. Bırakılan içerik alanın boyunu doldurur (fill zinciri) — yan menü + içerik sütunu kabuğu tek navigations ile kurulabilir. Kanvasta çocukların çizilmesi için kayıtlı düğümde states.isDroppable true olmalı. Kanvasın boş bırakma alanı (80px taban) da YALNIZ isDroppable true iken açılır (2026-09-29): bırakılamayan menü eskiden kanvasta altına boş bir kutu ekliyordu (header hapı kanvasta 136px, runtime'da 56px).",
|
|
1218
1397
|
"İÇERİK ALANININ YERLEŞİMİ container ailesiyle AYNI yedi prop'tur (2026-09-29): layout ('flex' | 'grid', katalog varsayılanı 'flex') + direction/horizontalAlign/verticalAlign/size/gap/wrap, anlamları ve varsayılanları container kaydındakiyle birebir. Bunlar menüyü DEĞİL, menünün yanına bırakılan çocukları dizer (RenderComponent içerik alanındaki .ng-app__node-children sarmalına yazar). Menünün kendi biçimi navLayout, satır yoğunluğu density'dir. layout prop'u 'flex'/'grid' dışında bir değer taşıyan (ya da hiç taşımayan) düğümün içerik alanı 12 kolon IZGARA çizilir.",
|
|
1219
1398
|
"YENİDEN ADLANDIRMA (2026-09-29, ADR 0007): menü düzeni layout → navLayout, satır yoğunluğu size → density. Kayıtlı eski düğümler göç görmedi: navLayout yoksa bileşen eski layout değerini (sidebar/header/… ise) düzen sayar, density yoksa eski size'ı (sm/md/lg ise) — ekranda değişiklik olmaz. AMA backend doğrulayıcısı eski değerli düğüme DOKUNAN patch'i invalid-enum-value ile reddeder (layout artık flex|grid, size shrink|grow): böyle bir düğümü düzenlerken aynı patch'te navLayout'a eski layout değerini, density'ye eski size değerini yaz ve layout'u 'grid' (eski görünüm) ya da 'flex', size'ı 'shrink' yap.",
|
|
1220
1399
|
"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.",
|
|
1221
1400
|
"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).",
|
|
1401
|
+
"DEVRE DIŞI ÖĞE (navigations[].isDisabled, 2026-09-30): hiçbir düzenden GİDİLEMEZ ve kural ÇOCUKLARA GEÇER — devre dışı bir dalın altındaki her sayfa da gidilemez (sidebar devre dışı dalı zaten açmaz). Yüzeye göre iki okuma: 'bul ve git' yüzeyleri — command paleti, launcher karoları, breadcrumb'ın kardeş menüsü — öğeyi HİÇ LİSTELEMEZ; çubuklar — sidebar/header satırı, footer, bottom, dock, toc, breadcrumb yolu — yerini korur ve öğeyi soluk (%45), tıklanamaz, aria-disabled bir span olarak çizer. Bir sayfayı menüde görünür ama kapalı tutmak için isDisabled, tamamen saklamak için isHidden kullan. Eskiden beş düzende devre dışı öğe normal bağlantıydı (QA NAV-QA-001).",
|
|
1402
|
+
"KADEMELİ ÇEKMECE ZİNCİRİ (variant 'drawer' + nestingMode 'cascade'): her dal bir SONRAKİ çekmeceyi açar — kök → Raporlar → Stok üç panel olur; 'side' yan yana (288px aralıkla), 'stack' üst üste (alttakinin 20px'lik şeridi geri dönüş düğmesidir). Her alt çekmecenin başlığında bir önceki seviyenin adı ve geri oku vardır; yalnız EN SON çekmecede kapatma (×) düğmesi bulunur. inlineDepth (varsayılan 2) kadar seviye çekmecenin içinde yerinde açılır, daha derini yeni çekmecedir — inlineDepth 1 ile kökteki her dal doğrudan çekmece açar. Eskiden üçüncü seviye ikincinin yerine geçiyordu (QA NAV-QA-002).",
|
|
1403
|
+
"MOBİL (≤768px, navigation-effective.ts MOBILE_BREAKPOINT): mobileBehavior 'drawer' (varsayılan) iken sidebar/header/hybrid/dual/dock düzenleri 'Main menu' etiketli, aria-expanded taşıyan bir tetikleyiciye ve portal'da açılan çekmeceye döner; Escape ve dış tıklama kapatır. Çekmece genişliği mobilde 312px ve ekranın %88'iyle sınırlanır. cascade mobilde her zaman 'stack' olur, hover ile açma kapanır. GÖMÜLÜ ağaç (layout/sidebar içindeki) mobilde katlanMAZ — kabuğun kendi çekmecesi zaten vardır. 'same' düzeni olduğu gibi bırakır.",
|
|
1404
|
+
"KLAVYE: Tab menü sırasını izler, odak halkası 2px düz çizgidir; dal düğmesinde Enter/Space açar-kapar (aria-expanded + aria-controls). '/' menü içi aramaya, Ctrl/⌘+K komut paletine odaklanır (sayfada her kısayolun TEK sahibi vardır). Palette ↑/↓ seçimi gezer (sonda başa sarar), Enter seçili sayfaya gider, Escape kapatır ve odak tetikleyiciye döner. Açık katman zincirinde Escape yalnız EN ÜST katmanı kapatır (ADR 0002). Palet tetikleyicisi aria-haspopup='dialog' ve açık/kapalı durumunu aria-expanded ile duyurur.",
|
|
1405
|
+
"ÇALIŞMA ANINDA DEĞİŞEN PROP'LAR: görünüm, düzen, renk, girinti ve activeHref setComponentProperty ile anında uygulanır. defaultExpanded ise YALNIZ MOUNT anında okunur — sonradan değiştirmek açık dalları değiştirmez (kullanıcının açıp kapattığı durum korunur). Menü ağacı (navigations) değişince yeni dallar declared isExpanded'larına göre eklenir.",
|
|
1406
|
+
"MCP İLE KURULAN DÜĞÜM: page_schema_patch ile yalnız verilen prop'lar yazılır; yazılmayan her prop ÇALIŞMA ANINDA şemanın varsayılanıyla çizilir (navLayout 'sidebar', variant 'accordion', theme 'light', indent 28, width 256, tileCols 3 …). Studio paneli de 2026-09-30'dan beri eksik skaler prop'u varsayılanıyla gösterir; eskiden 0/boş ve kırmızı görünüyordu (QA NAV-QA-004). Liste ve nesne varsayılanları (örnek menü ağacı) panelde gösterilmez — navigations dizisini her zaman AÇIKÇA yaz.",
|
|
1407
|
+
"DÜZENE ÖZGÜ ETKİLEŞİM: header dalı dropdown/mega panel ya da ikinci satırda sekme açar (hMenuStyle), sığmayanlar 'Daha fazla'ya toplanır; dual'da rail ikonu paneli açar, aynı ikona ikinci basış kapatır; bottom'da dal olan sekme sayfaya gitmez, alttan bir sheet açar, bottomMax aşılınca 'Daha fazla' sheet'i gelir; dock'ta dal ikonu flyout açar; launcher'da dal karosu alt karolara İNER (başlıkta geri oku), yaprak karosu gider; breadcrumb mobilde tek bir 'üst seviye' bağlantısına iner, crumbMax aşılınca ortası '…' menüsüne toplanır; footer'da adresi olan kolon başlığı da bağlantıdır.",
|
|
1222
1408
|
'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ı).'
|
|
1223
1409
|
],
|
|
1224
1410
|
propNotes: {
|
|
1225
|
-
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.",
|
|
1411
|
+
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. isDisabled: öğe görünür ama hiçbir düzenden gidilemez ve bu çocuklarına da geçer (ayrıntı behavior'da); isHidden: canlıda hiç çizilmez.",
|
|
1226
1412
|
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).",
|
|
1227
1413
|
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.",
|
|
1228
1414
|
displayMode: "'full' ikon+metin · 'rail' yalnız ikon (alt seviyeler kademeli flyout) · 'text' yalnız metin.",
|
|
1229
1415
|
nestingMode: "Derin seviyeler nasıl açılır: 'inline' | 'drill' | 'cascade'. Rail'de her zaman cascade'e zorlanır.",
|
|
1230
1416
|
inlineDepth: 'Bir panelde yerinde gösterilecek seviye sayısı; daha derini drill/flyout/alt drawer ile açılır.',
|
|
1231
1417
|
drillHeader: "Drill panelinin başlığı: 'back' (geri + başlık) | 'path' (kısa yol, gizli seviyeler üç noktada) | 'switcher' (tüm yolu açan seviye seçici).",
|
|
1232
|
-
cascadeLayout: "Alt drawer'ların dizilişi: 'side' yan yana | 'stack' üst üste. Sığmazsa ve mobilde otomatik stack.",
|
|
1418
|
+
cascadeLayout: "Alt drawer'ların dizilişi: 'side' yan yana | 'stack' üst üste. Sığmazsa, fullscreen'de ve mobilde otomatik stack. Yalnız variant drawer + nestingMode cascade iken; her dal zincire YENİ bir çekmece ekler.",
|
|
1233
1419
|
activeHref: 'Vurgulanacak satırın adresi; boş bırakılırsa tarayıcıdaki adres karar verir.',
|
|
1234
1420
|
isHidden: 'Komponentin tamamını gizler (ortak katman prop’u); öğe bazlı gizleme navigations[].isHidden’dır.',
|
|
1235
1421
|
theme: "Temel renk şeması: 'light' | 'dark' | 'brand'. Renkler bölümündeki her prop bunun üstüne yazılır; boş bırakılan tema değerinde kalır.",
|
|
@@ -1276,14 +1462,14 @@ export const componentKnowledge = {
|
|
|
1276
1462
|
cmdGroupBy: "Sonuçlar 'group' ile kendi menü grubu başlıkları altında, 'none' ile tek düz liste olarak gösterilir. Yalnız command düzeninde geçerlidir.",
|
|
1277
1463
|
cmdShowPaths: "Her sonucun altında sayfanın yolunu yazar — aynı adlı iki sayfa ancak böyle ayırt edilir. Yalnız command düzeninde geçerlidir.",
|
|
1278
1464
|
launcherMode: "'popover' ızgara küçük bir panelde açılır; 'page' tüm sayfayı kaplar. Yalnız launcher düzeninde geçerlidir.",
|
|
1279
|
-
tileCols: "Izgaradaki kolon sayısı (2–6). Yalnız launcher düzeninde geçerlidir.",
|
|
1465
|
+
tileCols: "Izgaradaki kolon sayısı (2–6); aralık dışı değer sınıra kıstırılır. Popover 360px genişliğindedir — 5–6 kolonda karo etiketleri kısalır (tam ad title ile okunur); geniş ızgara için launcherMode 'page'. 2026-09-30'a kadar yalnız 3 ve 4 uygulanıyordu (QA NAV-QA-003). Yalnız launcher düzeninde geçerlidir.",
|
|
1280
1466
|
tileStyle: "Karo görünümü: 'icon' yalın ikon + ad; 'card' zeminli, kenarlıklı kart. Yalnız launcher düzeninde geçerlidir.",
|
|
1281
1467
|
footerStyle: "'columns' her kök grup kendi kolonu olur ve çocukları altında listelenir; 'compact' her şey tek satıra dizilir. Yalnız footer düzeninde geçerlidir.",
|
|
1282
1468
|
footerDepth: "Kolonlarda gösterilecek seviye sayısı (1–9). Yalnız footerStyle columns iken anlamlı — sıkışık dizilişte tek seviye vardır.",
|
|
1283
1469
|
expandBehavior: "'multiple' birden çok dal aynı anda açık kalabilir; 'single' bir dal açılınca kardeşleri kapanır. Yalnız variant accordion/drawer iken — düz menüde her dal zaten açıktır.",
|
|
1284
|
-
defaultExpanded: "İlk yüklemede ne açık gelsin: 'active' aktif sayfaya giden dallar (drill panelleri ve alt drawer’lar dahil); 'all' hepsi; 'none' hiçbiri. Arama yapılırken bu ayar geçici olarak devre dışı kalır — eşleşen her dal açılır.",
|
|
1470
|
+
defaultExpanded: "İlk yüklemede ne açık gelsin: 'active' aktif sayfaya giden dallar (drill panelleri ve alt drawer’lar dahil); 'all' hepsi; 'none' hiçbiri. Arama yapılırken bu ayar geçici olarak devre dışı kalır — eşleşen her dal açılır. YALNIZ MOUNT anında okunur: çalışma anında setComponentProperty ile değiştirmek açık dalları değiştirmez.",
|
|
1285
1471
|
groupCollapsible: "Kök GRUP başlıklarını da tıklanabilir yapar; ziyaretçi bütün bir grubu kapatabilir. Kapalıyken grup başlığı yalnız bir etikettir. Düz menüde anlamsızdır.",
|
|
1286
|
-
expandOnHover: "Fareyle üzerine gelince dalı açar. Yalnız KATMAN açan dallarda geçerlidir (flyout/cascade) — yerinde açılan ağaçta ve drill panelinde yok sayılır, pasif satırda da çalışmaz (navigation-nesting.ts shouldOpenOnHover). ≤768px’te otomatik kapanır.",
|
|
1472
|
+
expandOnHover: "Fareyle üzerine gelince dalı açar. Yalnız KATMAN açan dallarda geçerlidir (flyout/cascade) — yerinde açılan ağaçta ve drill panelinde yok sayılır, pasif satırda da çalışmaz (navigation-nesting.ts shouldOpenOnHover). Rail'de flyout'u, header'da dalın dropdown/mega panelini açar. ≤768px’te otomatik kapanır.",
|
|
1287
1473
|
highlightParent: "Aktif sayfaya giden ÜST dalları da vurgular (kalın yazı + vurgu rengi ikon), böylece kapalı bir dalın içinde bulunduğun anlaşılır. Kapatılırsa yalnız yaprağın kendisi vurgulanır.",
|
|
1288
1474
|
animated: "Menünün hareketini açar/kapatır: dalın açılma kaydırması, chevron dönüşü ve satır renk geçişleri. Kapatıldığında ÜÇÜ birden durur. Ziyaretçinin işletim sistemi hareket azaltma tercihi (prefers-reduced-motion) bu proptan BAĞIMSIZ ve koşulsuz okunur — prop açık olsa da hareket çizilmez.",
|
|
1289
1475
|
showHeader: "Panelin üst bandı: marka (logo/ikon + title + subTitle), daraltma düğmesi ve drill başlığı buraya çizilir. Kapatılırsa menü doğrudan satırlarla başlar ve daraltma düğmesi alt kısma iner.",
|
|
@@ -1310,7 +1496,7 @@ export const componentKnowledge = {
|
|
|
1310
1496
|
dividers: "Kök GRUPLAR arasına ayraç çizgisi koyar. Grup içi satırları ayırmaz.",
|
|
1311
1497
|
iconSize: "Satır ikonunun boyutu (px, 12–32). Yalnız MENÜ ikonunu ölçekler; chevron, taşma oku ve dış bağlantı işareti yazıyla birlikte ölçeklenmeye devam eder. iconContainer \"tile\" ise ikon kutusu bu değerin 12px fazlasıdır.",
|
|
1312
1498
|
iconContainer: "İkonun zemini: 'none' yalın ikon; 'tile' her ikonun çevresine yuvarlak köşeli bir kutucuk; 'branch' kutucuk yalnız alt öğesi olan (modül) satırlarında, yapraklar yalın kalır. Kutucuk rail genişliğini de büyütür.",
|
|
1313
|
-
childIcons: "Alt seviye satırlarda da ikon gösterir. Kapalıyken ikon yalnız kök seviyede çizilir (rail hariç — orada her satır ikonuyla vardır). Sadece-metin modunda anlamsızdır.",
|
|
1499
|
+
childIcons: "Alt seviye satırlarda da ikon gösterir. Kapalıyken ikon yalnız kök seviyede çizilir (rail hariç — orada her satır ikonuyla vardır). Sadece-metin modunda anlamsızdır. Yalnız icon alanı DOLU alt öğelerde fark yaratır.",
|
|
1314
1500
|
chevron: "Dalın açılır göstergesi: 'chevron' ok; 'caret' üçgen (açılınca DÖNER, ikon değişmez); 'plus' artı/eksi (yönsüz olduğu için durumu ikonun KENDİSİ söyler: kapalı '+', açık '−'). Düz menüde dal zaten açık olduğu için gösterge yoktur.",
|
|
1315
1501
|
chevronPosition: "Göstergenin satırdaki yeri: 'end' etiketin sonunda; 'start' ikondan önce. Yalnız YERİNDE açılan dallarda çizilir — katman/panel açan dal onun yerine alt öğe sayısını ve sağ oku gösterir.",
|
|
1316
1502
|
bgColor: "Menünün zemini. Boş bırakılırsa theme’in değeri geçerli kalır.",
|
|
@@ -1335,14 +1521,17 @@ export const componentKnowledge = {
|
|
|
1335
1521
|
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.",
|
|
1336
1522
|
behavior: [
|
|
1337
1523
|
"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.",
|
|
1338
|
-
"
|
|
1339
|
-
"
|
|
1524
|
+
"RUNTIME'DA İZLER KABUKTAN GELİR (SHELL-002/003, 2026-09-29): çocukların blocks[] çizgilerine dokunulmaz, yalnız satır/kolon ölçüleri değişir — fill bölgesinin kapladığı satırlar kabuğun kalan yüksekliğini paylaşır (üst/alt şerit satırları sabit kalır), yalnız KAPALI bölgelerin kapladığı kolonlar 0'a iner ve fill o alanı devralır. Fill bölgesi yoksa ızgara olduğu gibi kalır. Studio tuvali bu kuralı UYGULAMAZ: tuvalde tasarımcının ızgarası görünür.",
|
|
1525
|
+
"Mobilde (≤767px) kabuk en az ekran yüksekliğindedir; drawer bölgesi ve overlay ekrana SABİTTİR (position: fixed, çekmece min(300px, 85vw) genişlikte) — 2026-09-29'a kadar kabuk 0px'e çöküp çekmeceyi görünmez kılıyordu (SHELL-001). Açık çekmece role=dialog + aria-modal taşır; Escape kapatır.",
|
|
1526
|
+
"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. Mobil drawer'ın kapalı açılışı motora da yazılır (SHELL-005, 2026-09-29): ilk '!sidebarOpen' akışı artık çekmeceyi açar.",
|
|
1527
|
+
"toggle olayı DURUM DEĞİŞİKLİĞİNİ bildirir (SHELL-009, 2026-09-29): overlay, Escape, bir akışın ya da Durum bağlamasının yazdığı yeni değer aynı olayı doğurur; açılıştaki çözümleme olay sayılmaz. toggle'a bağlı bir akış sidebarOpen'ı çevirirse sonsuz döngü kurar — yapmayın.",
|
|
1528
|
+
"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.",
|
|
1340
1529
|
"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."
|
|
1341
1530
|
],
|
|
1342
1531
|
propNotes: {
|
|
1343
|
-
surfaceStyle:
|
|
1532
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + ' Kabuk KENDİ derler (SHELL-006, 2026-09-29): değer .ng-layout-shell KÖKÜNE iner, contentOverflow da köke.',
|
|
1344
1533
|
sidebarOpen: 'Yan panelin açık olup olmadığı; canlı durumdur, bağlanabilir.',
|
|
1345
|
-
mobileBehavior: "'drawer' (varsayılan;
|
|
1534
|
+
mobileBehavior: "'drawer' (varsayılan; mobilde kapalı başlar) | 'stack' (mobilde açık başlar).",
|
|
1346
1535
|
style: "&__body ve &__overlay parçaları uygulanır."
|
|
1347
1536
|
}
|
|
1348
1537
|
},
|
|
@@ -1351,14 +1540,18 @@ export const componentKnowledge = {
|
|
|
1351
1540
|
behavior: [
|
|
1352
1541
|
"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.",
|
|
1353
1542
|
"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ü).",
|
|
1354
|
-
"
|
|
1543
|
+
"Yalnız YAN bölgeler (left, right, mobilde drawer) shell'in sidebarOpen'ını izler ve kapanır; top/bottom şeridi ve fill hep açık kalır (SHELL-004, 2026-09-29 — önce şerit de kapanıyor, oradaki aç/kapa düğmesi de onunla kayboluyordu). Shell dışında tek başına duran bölge her zaman açık kabul edilir.",
|
|
1544
|
+
"isCollapsible:false 'bu bölge kapanmaz' demektir (REG-006, 2026-09-29): hem kendi isCollapsed'ini hem shell'in sidebarOpen'ını yok sayar. Tek istisna mobil drawer'dır — içeriğin üstüne binen panel kapanamazsa sayfayı örterdi.",
|
|
1545
|
+
"Shell içinde runtime'da açık bir yan panelin kolonları sabit pay alır (REG-001): bir yan panel kapanınca boşalan alanı fill ve şeritler alır, öbür yan panel genişlemez. Gizli bir şeridin satırları da çöker (REG-005).",
|
|
1546
|
+
"top/bottom şeridi ızgaradaki alanının tam yüksekliğini alır (REG-004, 2026-09-29; önce içeriği kadar çiziliyordu).",
|
|
1547
|
+
"MOBİLDE SIRA DOCK'TAN GELİR (REG-003, 2026-09-29): shell içinde ≤767px'te bölgeler top → left → fill (ve bölge olmayan çocuklar) → right → bottom sırasıyla dizilir; dockMobile:'bottom' seçilen bölge gerçekten en alta iner. Tuvalde tasarımcının sırası görünür.",
|
|
1355
1548
|
"appearance.hideOn, dockMobile'ı HER ZAMAN yener; dockMobile:'hidden' yalnız bölge-yerel kısayoldur."
|
|
1356
1549
|
],
|
|
1357
1550
|
propNotes: {
|
|
1358
|
-
surfaceStyle:
|
|
1359
|
-
dock: "left | right | top | bottom | fill — biçim/yön
|
|
1551
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens + " Bölge KENDİ derler (REG-002, 2026-09-29): değer .ng-layout-region KÖKÜNE iner, contentOverflow gövdeye ('&__body').",
|
|
1552
|
+
dock: "left | right | top | bottom | fill — biçim/yön; masaüstünde konum blocks[]'ten gelir, mobilde sırayı dock belirler.",
|
|
1360
1553
|
dockMobile: "inherit (varsayılan; masaüstünü izler) | left | right | top | bottom | drawer (içeriğin üstüne biner) | hidden.",
|
|
1361
|
-
isCollapsible:
|
|
1554
|
+
isCollapsible: "Bölgenin kapanabilir olup olmadığı; false iken bölge shell kapanınca da açık kalır (mobil drawer hariç).",
|
|
1362
1555
|
isCollapsed: 'Kapalı başlar; bir Durum değişkenine bağlanabilir.',
|
|
1363
1556
|
style: '&__body parçası uygulanır.'
|
|
1364
1557
|
}
|
|
@@ -1384,23 +1577,26 @@ export const componentKnowledge = {
|
|
|
1384
1577
|
summary: 'Kayıt künyesi: oluşturan/son güncelleyen ve ne zaman. Tek setter ile meta prop’una kaydın meta nesnesi bağlanır.',
|
|
1385
1578
|
behavior: [
|
|
1386
1579
|
"meta, kaydı getiren get servisi adımının (get_service) data.meta'sıdır: createdAt, createdUserId, createdUserEmail, createdUserFirstName, createdUserLastName, createdUserFullName ve aynı updated* alanları. Ad önce *UserFullName, yoksa FirstName + LastName, o da yoksa e-posta; e-posta ad değilse alt satırda (createdSubtle/updatedSubtle doluysa onun yerine) basılır.",
|
|
1387
|
-
'
|
|
1388
|
-
'
|
|
1580
|
+
'Kaynak kararı meta’nın bütününe göre verilir: meta iki taraftan (created/updated) HERHANGİ birine ait bir alan taşıyorsa İKİ taraf da TAMAMEN meta’dan okunur — createdBy/createdAt gibi statik prop’lar (şema varsayılanı John Doe, Erick Gallagher) hiçbir tarafa karışmaz; meta’nın anmadığı taraf (hiç güncellenmemiş kayıt) çizilmez. Statik prop’lar yalnız meta hiç denetim alanı taşımıyorsa (yok, boş nesne, nesne değil) çizilir; kayıt yüklenene dek demo adın görünmemesi için createdBy/updatedBy’ı boş yaz.',
|
|
1581
|
+
'data.meta İKİ koşul birlikte sağlanınca gelir: entity’de denetim izi açık (isAuditTrailActive: true, auditTrailType: basic) VE get servisi adımının kaynak ayarında includeHistory: true. Denetim izi tek başına yetmez — includeHistory’siz data.meta hiç oluşmaz ve iki taraf da statik prop’ları (John Doe…) çizer, hata görünmez. Gerçek sayfada createdBy/updatedBy/createdAt/updatedAt’i boşalt.',
|
|
1582
|
+
'Denetim izi asenkron yazılır: kaydı güncelleyen akış hemen ardından get servisini koşarsa eski updatedAt gelir; künyeyi tazelemek için kısa bir bekleme ya da ikinci okuma gerekir. Sayfa akışı anonim güncellerse updatedUserId boştur ve güncelleyen satırı adsız, yalnız tarihle çizilir.',
|
|
1389
1583
|
'Bir taraf ad ya da tarih taşımıyorsa hiç çizilmez; ikisi de boşsa yalnız title kalır. meta nesne değilse (null, metin, dizi) boş sayılır.',
|
|
1390
|
-
'Tarih ISO metin (ya da Date) olmalı; başka biçim olduğu gibi basılır. Saatsiz tarih (2026-02-13) yalnız tarih olarak basılır. relative gelecekteki zamanı şimdi sayar ve canlı güncellenmez. Dil uygulama dilidir (locale prop’u yok).',
|
|
1391
|
-
'
|
|
1584
|
+
'Tarih ISO metin (ya da Date) olmalı; başka biçim olduğu gibi basılır — takvimde olmayan gün de (2026-02-30, 2026-13-45) ham kalır, başka bir güne kaymaz. Saatsiz tarih (2026-02-13) yalnız tarih olarak basılır. relative gelecekteki zamanı şimdi sayar ve canlı güncellenmez. Dil uygulama dilidir (locale prop’u yok).',
|
|
1585
|
+
'Etiketler (createText/updateText boşken) tr, en ve ar sözlüğünden gelir; başka dil İngilizce okur. Boşluksuz uzun ad, e-posta, başlık ve etiket satıra bölünür, künyeyi taşırmaz.',
|
|
1586
|
+
'isLoading açıkken iki satırlık iskelet çizilir (ekran okuyucuya gizli, aria-busy kapta). Runtime kendisi yazmaz: kaydı getiren akış başta true, meta’yı yazarken false yazar. prefers-reduced-motion açıkken iskelet nabız atmaz.',
|
|
1587
|
+
'Erişilebilirlik: satırlar liste (list/listitem), ikon süs (aria-hidden) — okunan metin "Oluşturan Ayşe Kaya … 25 Ağu 2026". Künye tıklanabilir değildir, odak almaz.'
|
|
1392
1588
|
],
|
|
1393
1589
|
propNotes: {
|
|
1394
1590
|
meta: "Kaydın meta nesnesi; değer {type:'storage', ref:'<adım ADI>.data.meta'}. Alanları behavior’da.",
|
|
1395
|
-
createdBy: 'Meta created*
|
|
1396
|
-
updatedBy: 'Meta updated*
|
|
1397
|
-
createText: 'Oluşturan satırının etiketi; boşsa uygulama dilinde "Oluşturan"/"Created by".',
|
|
1398
|
-
updateText: 'Güncelleyen satırının etiketi; boşsa uygulama dilinde "Güncelleyen"/"Updated by".',
|
|
1399
|
-
createIcon: 'Ad (person_add varsayılan) ya da IconProp nesnesi.',
|
|
1400
|
-
updateIcon: 'Ad (person_edit varsayılan) ya da IconProp nesnesi.',
|
|
1591
|
+
createdBy: 'Meta hiç denetim alanı (created*/updated*) taşımadığında basılan statik ad (varsayılan John Doe — gerçek sayfada boşalt).',
|
|
1592
|
+
updatedBy: 'Meta hiç denetim alanı (created*/updated*) taşımadığında basılan statik ad (varsayılan Erick Gallagher — gerçek sayfada boşalt).',
|
|
1593
|
+
createText: 'Oluşturan satırının etiketi; boşsa uygulama dilinde "Oluşturan"/"Created by"/"تم الإنشاء بواسطة".',
|
|
1594
|
+
updateText: 'Güncelleyen satırının etiketi; boşsa uygulama dilinde "Güncelleyen"/"Updated by"/"تم التحديث بواسطة".',
|
|
1595
|
+
createIcon: 'Ad (person_add varsayılan) ya da IconProp nesnesi; boşluk-yalnız ad varsayılana düşer. İkon rengi yoktur (renk seçici kapalı): rengi style ile &__icon { color } yaz. Geçersiz ad ikon kutusunda kırpılır, kutuyu aşmaz.',
|
|
1596
|
+
updateIcon: 'Ad (person_edit varsayılan) ya da IconProp nesnesi; createIcon ile aynı kurallar.',
|
|
1401
1597
|
dateFormat: 'absolute (varsayılan; dilin kısa tarih + saat biçimi) | relative ("3 gün önce").',
|
|
1402
1598
|
isLoading: 'true iken içerik yerine iskelet.',
|
|
1403
|
-
style: 'Kök + &__item (her satır)
|
|
1599
|
+
style: 'Kök + parçalar: &__title, &__items (satırların kabı; aralık gap), &__item (her satır), &__icon (yuvarlak ikon kutusu; boyut width/height, fontSize hem kutuyu hem glifi ölçekler), &__text (etiket-ad-alt metin-tarih sütunu), &__label, &__value (ad), &__subtle (e-posta/alt metin), &__date. Satır durumları: &__item--created ve &__item--updated (hangi satır olduğu; iki satırı farklı boyamak için :nth-child yerine bunu kullan; satırda ayrıca data-side="created|updated"), &__item--skeleton (isLoading). Kök fontSize, color ve fontFamily içe iner: parçalar boyutlarını em ile kökten alır, ikincil metin rengi kökün rengidir (%72). Üst kabın yazı tipi künyeye geçmez (tema jetonu), gerekirse künyenin kendi style kökünde ver.'
|
|
1404
1600
|
}
|
|
1405
1601
|
},
|
|
1406
1602
|
'audit-history': {
|
|
@@ -1408,24 +1604,48 @@ export const componentKnowledge = {
|
|
|
1408
1604
|
behavior: [
|
|
1409
1605
|
"histories iki kayıt biçimini aynı kuralla okur. (1) Backend geçmişi — kaydı getiren get servisi adımının data.meta.history'si: { id, occurredAt, userId, userEmail, userFirstName, userLastName, action: CREATE|UPDATE|DELETE, ipAddress, changedFields: [{ fieldId, fieldSlug, fieldName, previousValue, currentValue }] }. (2) Kart alanları — { type, title, username, createdAt, status, statusLabel, icon, previousValue, currentValue }. Kart alanı doluysa kazanır, boşsa backend alanından türetilir: username ← userFirstName + userLastName ← userEmail; createdAt ← occurredAt; status/statusLabel/title/icon ← action (CREATE success 'Oluşturuldu'/'kaydı oluşturdu.', UPDATE primary 'Güncellendi', DELETE danger 'Silindi'; dil bileşenin dili).",
|
|
1410
1606
|
'changedFields’ın her satırı kartta "fieldName: önceki → şimdiki" satırı olur (fieldName yoksa fieldSlug); iki değeri de boş satır çizilmez. Değer nesneyse JSON basılır. Üst düzey previousValue/currentValue etiketsiz tek satırdır.',
|
|
1411
|
-
'meta.history İKİ şartla gelir: (1) kaydı getiren get servisi adımının kaynak ayarında includeHistory: true (kapalıysa data.meta hiç oluşmaz), (2) entity’de denetim izi (
|
|
1607
|
+
'meta.history İKİ şartla gelir: (1) kaydı getiren get servisi adımının kaynak ayarında includeHistory: true (microservice kaydında sourceParameters.includeHistory; kapalıysa data.meta hiç oluşmaz), (2) entity’de denetim izi: isAuditTrailActive true ve auditTrailType (Basic ya da Detailed) (ya da adımın requestedHistoryType’ı; entity türünü aşarsa istek hata verir). Simple’da history null’dır; changedFields yalnız Detailed’da dolar. Tek ya da liste getirmede kayıt başına EN YENİ 5 işlem gelir ve eskisini sayfa sayfa getiren bir akış yolu yoktur (meta.historyTotalCount toplamı söyler).',
|
|
1412
1608
|
'Sıralama yapılmaz: dizi geldiği sırayla çizilir (backend en yeniyi başa koyar). Nesne olmayan öğe (null, metin) atlanır; histories dizi değilse boş durum çizilir.',
|
|
1413
|
-
'visibleLogCount üstü kayıtlar atılmaz: altta "Daha fazla göster (N)" çıkar, her basış sınırı visibleLogCount kadar büyütür ve showMore yayar. Boş/0 = hepsi görünür. Backend en fazla 5 işlem verdiği için meta.history bağlıyken düğme ancak visibleLogCount 5’ten küçükken görünür; showMore veri çekmez. Açılan sınır
|
|
1609
|
+
'visibleLogCount üstü kayıtlar atılmaz: altta "Daha fazla göster (N)" çıkar, her basış sınırı visibleLogCount kadar büyütür ve showMore yayar. Boş/0 = hepsi görünür. Backend en fazla 5 işlem verdiği için meta.history bağlıyken düğme ancak visibleLogCount 5’ten küçükken görünür; showMore veri çekmez. Açılan sınır, listenin EN YENİ (ilk) girdisi değişince (başka kayda geçince ya da yeni işlem gelince) başa döner; aynı veri yeniden gelince, yalnız eski girdiler değişince ya da dil değişince açık kalır. İlk girdinin en yeni olduğu varsayılır (backend böyle verir; dizi tersse yeni işlem sınırı sıfırlamaz) ve aynı saniyede, aynı tür ve kullanıcıyla başlayan iki kayıt aynı kimlik sayılır.',
|
|
1414
1610
|
'Şema varsayılanı 5 demo kayıttır (James Anderson…): gerçek sayfada histories’i akışa bağla; kayıt gelene dek demo görünmesin istiyorsan başlangıçta isLoading true ya da histories [] yaz.',
|
|
1415
|
-
'isLoading açıkken 5 satırlık iskelet çizilir; runtime kendisi yazmaz, akış yazar.'
|
|
1611
|
+
'isLoading açıkken 5 satırlık iskelet çizilir; runtime kendisi yazmaz, akış yazar.',
|
|
1612
|
+
"Detailed denetim izinde bir UPDATE girdisinin changedFields'ı DEĞİŞMEYEN alanları da taşır (yalnız currentValue ile, kaydın şimdiki değerinin kopyası; gerçek değişimde previousValue de vardır): her güncelleme kartı kayıttaki alan sayısı kadar satır basar. Bileşen bir alanın 'değişmedi' mi 'boştan doldu' mu olduğunu ayırt edemediği için süzmez (backend kaydı: BE-015). Kalabalığı azaltmak için akışta histories'i bir code ifadesiyle süzüp (ör. changedFields içinde previousValue'su olanlar) yaz.",
|
|
1613
|
+
"Geçmiş girdisi kullanıcı adı olarak userFirstName + userLastName'i, yoksa userEmail'i okur; çalışan backend meta.history girdilerinde ad/soyad döndürmüyorsa kartta e-posta görünür (BE-016) — kart alanıyla (username) elle verilen ad bunu ezer.",
|
|
1614
|
+
"Dil: locale boşken uygulama dili. tr, en ve ar için tarih, boş durum, 'Daha fazla göster' ve CREATE/UPDATE/DELETE etiketleri o dilde çıkar; başka dil İngilizce okur. locale seçeneği tr, en ve ar listeler; başka dil için locale'i boş bırak ve uygulama dilini o yap, metinler İngilizce okunur.",
|
|
1615
|
+
"Kayıt tarihi takvimde olmayan gün (2026-02-30, 2026-13-45) ya da 1900’den eski yıl (0001-01-01, .NET DateTime.MinValue “tarih yok” değeri) ise başka güne kaydırılmaz, metin olduğu gibi basılır; saat içermeyen tarih takvim günüdür.",
|
|
1616
|
+
"Erişilebilirlik: liste role=list, kart role=listitem; ikonlar ve ok ekran okuyucudan gizlidir; eski → yeni değer del/ins ile işaretlidir. Daha fazla göster'e basınca odak ilk yeni karta geçer (düğme kalksa da odak kaybolmaz). RTL'de bağlantı çizgisi, ayırıcı ve ok yönü otomatik döner; prefers-reduced-motion altında iskelet durur. Yüklenirken dilde \"Geçmiş yükleniyor\" metni görünmez bir canlı bölgeye (role=status) yazılır, iskelet satırları ekran okuyucudan gizlidir; connector rail iskeletin çizgisini de kesintisiz çizer, none çizgisiz bırakır, iconStyle dot iskelette de nokta boyunu uygular."
|
|
1416
1617
|
],
|
|
1417
1618
|
propNotes: {
|
|
1418
1619
|
histories: "Değer {type:'storage', ref:'<adım ADI>.data.meta.history'} ya da kart alanlarıyla dizi; iki biçim behavior’da.",
|
|
1419
1620
|
visibleLogCount: 'İlk görünen kayıt sayısı (varsayılan 15); aşılınca "Daha fazla göster" çıkar. Boş/0 = hepsi.',
|
|
1420
1621
|
showMoreText: 'Düğme metni; boşsa dilde "Daha fazla göster"/"Show more". Yanına gizli kayıt sayısı eklenir. Panelde yalnız visibleLogCount doluyken görünür.',
|
|
1421
1622
|
emptyText: 'Liste boşken başlık; boşsa dilde "Geçmiş kaydı bulunmuyor" + açıklama. Doluysa açıklama çizilmez.',
|
|
1422
|
-
dateFormat: 'absolute (varsayılan; "11 Mart 2026 09:24") | relative ("3 gün önce", canlı güncellenmez, gelecek zaman şimdi sayılır). ISO olmayan metin olduğu gibi basılır.',
|
|
1423
|
-
|
|
1623
|
+
dateFormat: 'absolute (varsayılan; "11 Mart 2026 09:24") | relative ("3 gün önce", canlı güncellenmez, gelecek zaman şimdi sayılır). ISO olmayan metin ve takvimde olmayan gün (2026-02-30) olduğu gibi basılır.',
|
|
1624
|
+
connector: 'Kartlar arası dikey çizgi: stub (varsayılan; ikon daireleri arasında kısa çizgi, eski görünüm) | rail (ikonun üstünden ve altından kartın kenarına, komşu kartlarla kesintisiz birleşen çizgi; her kart yüksekliğinde ve ikon boyutunda çalışır) | none (çizgisiz). Tanınmayan değer stub okunur. İkonu küçültüp nokta yapmak için ikon boyutunu &__item { "--audit-hst-icon": "14px" } ile ver (daire ve çizgi birlikte uyar); &__icon width/height çizgiyi taşımaz. rail çizgisi &__connector ile boyanır (width, background; her kartta iki parça olduğu için gradyan her kartta yeniden başlar, tek parça gradyan olmaz). Kartı start tarafında kaydıracaksan padding yerine border-inline-start ya da margin ver: çizgi kartın kenarından ikonun yarısı kadar içeride durur, padding ikonu iter ama çizgiyi itmez. Kartlar bitişik olmalı ve ikon kartın dikey ortasında durmalı: &__list ya da &__item ile dikey margin/gap ve asimetrik padding-top/bottom rail çizgisini böler.',
|
|
1625
|
+
locale: 'Tarih, işlem etiketi, düğme ve boş durum dili; boşsa uygulama dili (ar dahil). Listede tr, en ve ar var; başka dil için boş bırak ve uygulama dilini o yap (metinler İngilizce okunur).',
|
|
1626
|
+
iconStyle: 'Kartın işaretçisi: icon (varsayılan; durum ikonu) | dot (ikonsuz dolu nokta, durumun renginde, çevresinde 3 px açık halka; zaman çizgisi görünümü). dot boyutunu &__item { "--audit-hst-icon": "18px" } ile ayarla; connector rail ile birlikte nokta ve çizgi aynı eksende durur. Tanınmayan değer icon okunur. Noktayı &__icon ile boya (background, border); glifi gizlemek için fontSize: 0 numarasına gerek kalmaz.',
|
|
1424
1627
|
isLoading: 'true iken içerik yerine iskelet.',
|
|
1425
|
-
style: 'Kök + &__title, &__item (her kart), &__icon (yuvarlak ikon), &__status (durum rozeti), &__empty (boş durum kutusu).'
|
|
1628
|
+
style: 'Kök + parçalar: &__title (başlık), &__list (kartların kabı), &__connector (yalnız connector rail: ikonun üstündeki ve altındaki çizgi parçaları), &__item (her kart; ayrıca data-status="primary|success|danger|warning|info" — durum başına farklı boyamak için [data-status="danger"] hedefle, :nth-child yerine), &__icon (yuvarlak ikon kutusu ya da iconStyle dot noktası; boyut --audit-hst-icon, glif fontSize ile ölçeklenir), &__type (tür etiketi), &__name (kullanıcı adı + mesaj satırı), &__message (yalnız mesaj), &__date, &__diff (her alan değişikliği satırı), &__status (durum rozeti), &__more (Daha fazla göster düğmesi; :hover ve :focus-visible alır), &__empty (boş durum kutusu). Durumlar: &__item:hover, &__item:last-child, &__item:nth-child(odd), @media. &__item::before (yatay ayırıcı) ve &__item::after (kısa çizgi) bileşenin kendi çizgileridir: display, background, width, height, border yazılır (connector none ya da rail ile kapatılır), content YAZILAMAZ (bileşenin kendi content kuralı kazanır, yazdığın sessizce etkisiz kalır). Kök fontSize, color ve fontFamily içe iner: parçalar boyutlarını em ile kökten alır, ikincil metin (tarih, tür, önceki değer) kökün renginin %72 oranındadır; kökte color verince durum rozetinin metni yine durumun rengine karışır (okunur kalır). Üst kabın yazı tipi kartlara geçmez (tema jetonu), gerekirse bu bileşenin kendi style kökünde ver.'
|
|
1426
1629
|
}
|
|
1427
1630
|
},
|
|
1428
|
-
'document-editor': {
|
|
1631
|
+
'document-editor': {
|
|
1632
|
+
summary: 'Office belgesini (docx · xlsx · pptx · txt) sayfa içinde görüntüler ve düzenler; dosya yokken düzenleme kipi yeni belge oluşturma düğmelerini gösterir.',
|
|
1633
|
+
behavior: [
|
|
1634
|
+
"Dört durum çizer: dosya yok + mode 'view' → 📄 ve emptyText; dosya yok + mode 'edit' → başlık (emptyText) ve Word · Excel · PowerPoint · Metin Belgesi düğmeleri; açılış sürerken ya da isLoading true iken yükleyici; hata → ⚠, errorText ve ikinci satırda ayrıntı. Belge açıkken editör kutuyu doldurur.",
|
|
1635
|
+
"file üç biçim kabul eder: Drive dosyası, FileInput/Dropzone'dan gelen inline base64 dosya, düz URL metni. URL açılamazsa (404, ağ hatası, geçersiz adres) hata durumu çizilir; ayrıntı satırı dosya servisi hatasında 'Belge alınamadı (404)' (dile göre), ağ hatasında yalnız 'Belge alınamadı' olur. mode 'view' | 'edit' dışındaki değer şema doğrulamasında REDDEDİLİR (422); bağlı ifade null dönerse view gibi davranır.",
|
|
1636
|
+
"emptyText ve errorText BOŞ ya da yalnız boşluk bırakılırsa dilin varsayılanı çıkar (tr 'Yeni bir döküman oluşturun' · 'Döküman yüklenemedi.', en 'Create a new document' · 'The document could not be loaded.', ar). Şema varsayılanı artık BOŞTUR; eski kayıtta Türkçe metin yazılı kalmış sayfa o metinde kalır. Edit kipinde emptyText düğmelerin başlığıdır ve boşsa 'Yeni belge oluştur' çıkar.",
|
|
1637
|
+
"Düzenleme sonrası değişiklikler 400 ms debounce ile hidden value prop'una (base64) yazılır, kaydederken hidden isSaving true olur — ikisi de setter ile bağlanır. value doluyken file değişse bile kullanıcının düzenlemesi korunur, dosya yeniden indirilmez.",
|
|
1638
|
+
"EDİTÖR MOTORU DIŞ HİZMETTİR: belgeyi açan/oluşturan iframe, studio kök layout'unun yüklediği editor-sdk.js üzerinden uzak ofis sunucusunda çalışır (VITE_DOCS_API_JS_URL). Belge açma, oluşturma, düzenleme ve mode geçişi bu hizmete ulaşılabilirken çalışır; boş / hata / yükleniyor durumları yerelde tamdır. Editör dili şimdilik hep 'tr' gönderilir.",
|
|
1639
|
+
"İç ekranlar (boş · oluştur · hata · yükleniyor) SAYDAMDIR: style ve surfaceStyle zemini (gradyan dahil) altından görünür. Kök fontSize, color ve fontFamily iç metinlere iner (em / currentColor; düğme rengi ayrıdır, &__button ile); uzun ve boşluksuz metin satırlara bölünür, taşan içerik kırpılmaz kaydırılır. Düğme simgeleri sabit Office marka renklerindedir (Word mavi, Excel yeşil, PowerPoint kırmızı): koyu ya da canlı zeminde simge kontrastı düşer, style ile boyanmaz.",
|
|
1640
|
+
"Kapsayıcı değildir: katalog droppable diyor ama çocuk slot'u çizilmez (CQ-278) — içine bileşen koyma.",
|
|
1641
|
+
],
|
|
1642
|
+
propNotes: {
|
|
1643
|
+
style: "style PARÇALARI (hepsi bildirilmiştir ve kendi öğesini boyar): &__empty (view'da boş durum kutusu) · &__create (edit'te oluştur kutusu) · &__title (oluştur başlığı) · &__button (Word/Excel/PowerPoint/Metin düğmesi; :hover ve :focus-visible bunda) · &__error (hata kutusu) · &__text (boş durum ve hata metni) · &__detail (hata ayrıntı satırı) · &__loading (yükleniyor katmanı). Kök fontSize, color ve fontFamily iç metinlere iner (düğme etiketi fontSize ve fontFamily'i izler; düğme rengi &__button ile verilir); border · borderRadius · background kök kutuyu boyar. Durum sınıfı yoktur: hangi ekranın çizildiği parça adından anlaşılır (örn. '&__error { border: ... }' yalnız hata varken boyar).",
|
|
1644
|
+
emptyText: "Boş bırakırsan dilin varsayılanı çıkar. view kipinde 📄'in altındaki metindir; edit kipinde düğmelerin başlığıdır.",
|
|
1645
|
+
errorText: "Boş bırakırsan dilin varsayılanı çıkar. Altındaki ayrıntı satırı ('Belge alınamadı (404)') ayrıdır, errorText ile değişmez; &__detail ile boyanır.",
|
|
1646
|
+
surfaceStyle: NODE_SURFACE_NOTE,
|
|
1647
|
+
},
|
|
1648
|
+
},
|
|
1429
1649
|
'qm-header': {
|
|
1430
1650
|
summary: 'QM uygulama başlığı: global arama, bildirimler, hesap menüsü, çok seviyeli mega menü.',
|
|
1431
1651
|
behavior: [
|
|
@@ -1475,16 +1695,24 @@ export const componentKnowledge = {
|
|
|
1475
1695
|
behavior: [
|
|
1476
1696
|
'click olayı yalnız bağlıysa komponent tıklanabilir hâle gelir (image deseni); isLoading açıkken tıklanmaz.',
|
|
1477
1697
|
'İçerik önceliği HER kipte aynı: src → name baş harfleri → fallbackIcon. Yani name doluyken ikon çizilmez; ikonun görünmesi için name boş olmalı.',
|
|
1698
|
+
'Baş harfler ilk ve son kelimenin ilk HARF ya da RAKAMIDIR: noktalama, tırnak ve emoji atlanır (\'John (Admin)\' → JA), vekil çiftli karakter (𠮷) bölünmez, büyütme uygulama diliyle yapılır (tr: ilker → İ). Arapça gibi bitişik yazılan yazılarda iki harfin arasına birleştirmeyi kesen sıfır genişlikli ayırıcı girer. name metin ya da sayı değilse (nesne, dizi) ya da çözülmemiş bir {{ }} ise boş sayılır, ikona düşer.',
|
|
1699
|
+
"ERİŞİLEBİLİR AD: açık ariaLabel doluysa o okunur; değilse ad + durum (yerelleştirilmiş: Çevrimiçi/Online…) + rozet değeri virgülle birleşir. Tıklanabilirde bu düğmenin adıdır; tıklanamayan tekil avatarda role=img adıdır; grupta her kişi kendi adıyla bir görseldir. Tıklanabilir grubun adı yalnız GÖRÜNEN adlar + taşan sayı ('Ali, Can, +3'); '+N' çipinin etiketi '+3: Ece, Mert, Zeynep'. Hesap menüsü gibi bir EYLEM avatarında ariaLabel'a eylemi yaz ('Hesap menüsü'), kişi adını değil. Ad yoksa tıklanabilir avatar 'Profil görseli' diye okunur.",
|
|
1478
1700
|
'Akıştan boş dizi gelirse emptyText yazılır. emptyText VERİLMEMİŞSE bileşen tekil avatara düşer (src/name, ikisi de boşsa person ikonu) — yani "kimse yok" demenin tek yolu emptyText doldurmaktır; grup bağlarken onu da ver.',
|
|
1479
1701
|
'mount akış tetikler: items’ı dolduran sorgu buradan koşulur, yükleniyor süresince isLoading ile nabız atan daire çizilir.'
|
|
1480
1702
|
],
|
|
1481
1703
|
propNotes: {
|
|
1482
1704
|
src: 'Görsel URL’i ya da drive dosyası; yüklenemezse baş harflere düşer.',
|
|
1483
|
-
name:
|
|
1484
|
-
|
|
1705
|
+
name: "Baş harflerin üretildiği ad; VARSAYILANI YOKTUR ve yazmak şart değil — adsız avatar fallbackIcon çizer. Doluyken fallbackIcon çizilmez. Metin ya da sayı olmayan değer boş sayılır.",
|
|
1706
|
+
ariaLabel: "Ekran okuyucunun okuyacağı ad (kişi adının, durumun ve rozetin yerine geçer). Boşsa ad + durum + rozet okunur. Eylem avatarında ('Hesap menüsü') doldur.",
|
|
1707
|
+
fallbackIcon: "Ne görsel ne ad varken çizilen ikon; varsayılanı { name: 'person' } ve düğümde hiç yazılı olmasa da çizilir (null ya da {} ikonu kapatır). Ekran okuyucudan gizlidir.",
|
|
1485
1708
|
items: 'Grup kipi: her öğe kendi src/name’ini taşır, maxCount üstü "+N" olur. Boş dizi = emptyText.',
|
|
1486
1709
|
emptyText: 'items DİZİ olarak gelip boş olduğunda yazılır; src/name bunu engellemez. Boş bırakılırsa boş grup tekil avatar gibi çizilir.',
|
|
1487
|
-
status: '
|
|
1710
|
+
status: 'Alt uç köşedeki durum noktası (LTR sağ alt, RTL sol alt); yalnız TEKİL avatarda çizilir (grupta kimin olduğu belirsiz olurdu). Erişilebilir adın parçasıdır, ayrıca okunmaz.',
|
|
1711
|
+
size: "xs sm md lg xl; bilinmeyen/boş değer md olur. xs'te baş harf 9 px altına inmez.",
|
|
1712
|
+
spacing: "Grupta binme yüzdesi. 0 ve boş = %30 varsayılanı (0 'binmesiz' DEMEK DEĞİLDİR); kenar kenara için 1 yaz. Negatif/geçersiz = %30.",
|
|
1713
|
+
badgeValue: "Köşe sayaç rozeti (RTL'de sol üst). 0 ve boş metin gizler (Badge ile aynı sayaç kuralı), 99 üstü '99+', uzun metin kırpılır ve tamamı title'dadır. Metin ya da sayı olmayan değer çizilmez.",
|
|
1714
|
+
badgeColor: 'Rozet zemini; yazı rengi zeminden otomatik seçilir (warning/info koyu, öbürleri açık). Geçersiz değer error olur.',
|
|
1715
|
+
style: "Serbest CSS; kök kutuya iner. Parçalar: &__item (avatar dairesi, iskelet dahil), &__status (nokta), &__overflow (+N çipi), &__badge (sayaç rozeti), &__empty (boş grup yazısı). {{ }} ile BAĞLANAN style uygulanmaz; parça içine @keyframes yazma, üst düzeye yaz.",
|
|
1488
1716
|
hasRing: 'Avatarın çevresindeki halka — tekil ve grup kipinde de çizilir; grupta üst üste binen avatarları ayıran şey odur.',
|
|
1489
1717
|
ringColor: 'Halkanın rengi; boş bırakılırsa yüzey rengi kullanılır (kart içinde görünmez, renkli zeminde bunu doldur).',
|
|
1490
1718
|
isLoading: 'İçerik yerine nabız atan nötr daire(ler) çizer; rozet, durum noktası ve tıklama kapanır.'
|
|
@@ -1493,19 +1721,27 @@ export const componentKnowledge = {
|
|
|
1493
1721
|
badge: {
|
|
1494
1722
|
summary: 'Sayaç/durum rozeti: maxCount üstü "99+" olur, 0 showZero verilmedikçe gizlenir, isDot ile salt nokta çizer.',
|
|
1495
1723
|
behavior: [
|
|
1496
|
-
'value
|
|
1724
|
+
'value YALNIZ düz ondalık sayıysa ("12", "-3", "12.5") sayaçtır: 0 gizlenir (showZero açıkken yazıldığı gibi çizilir, "00" → "00"), maxCount aşılırsa "99+". Başka her şey METİN olarak aynen basılır: "Yeni", "Beta", "007", "1e3", "0x1F", "+5", ".5" — durum rozeti böyle kurulur. Metin ya da sonlu sayı olmayan değer (nesne, dizi, true, NaN, Infinity) ve çözülmemiş "{{ }}" rozeti GİZLER; "[object Object]" ya da "NaN" basılmaz.',
|
|
1725
|
+
'Uzun metin, rozet doldurma genişlikli bir hücredeyse kapta üç noktayla kesilir ve kırpıldığı sürece tamamı fare ipucunda (title) görünür (kap genişleyince ipucu kalkar); sarmasını istiyorsan kök style\'a whiteSpace: normal yaz (rozet uzar). `flex-wrap` bir satırdaki auto genişlikli düğümde ise düğüm sarmalayıcısı metin kadar açılır ve kap rozeti görünmez biçimde keser (ARC-174). 99+ gibi kısaltılan sayının gerçek değeri de title\'a kendiliğinden yazılır; bu alana daha önce ortak appearance.tooltip yazılmışsa ikisi birden görünür, ortak ipucunu temizle.',
|
|
1726
|
+
'Rozet kendi yazı boyutuna göre ölçeklenir: size yazıyı seçer, kök style\'daki fontSize rozeti (yükseklik, ikon) birlikte büyütür. Yalnız rakam ve işaretten oluşan metin (sayaç: "99+") RTL sayfada bile soldan sağa okunur ("+99" çizilmez); harf içeren metin ("Yeni", "مرحبا") sayfanın yönünü izler.',
|
|
1727
|
+
'Yazı rengi zeminin ÇÖZÜLMÜŞ renginden seçilir: solid\'de ton (özel açık renkte — sarı, #fff — ve koyu temadaki warning\'de koyu yazı), soft\'ta tonun %15\'inin yüzeye karışmış hâli, outline\'da yüzey. Soft/outline yazısı ton rengini koyulaştırarak/açarak okunur kılar (warning, info, açık custom). textColor verirsen bu devre dışı kalır. Outline halkası ve nokta ton renginde kalır (info tonu #F8F8F8 olduğu için açık temada görünmez — token sorunu).',
|
|
1497
1728
|
'isDot:true iken value · icon · maxCount · showZero · variant · shape · textColor OKUNMAZ, yalnız renkli nokta çizilir (color ve size okunur); nokta tek başına anlam taşıyorsa dotLabel doldurulmalı (yoksa ekran okuyucuya aria-hidden geçilir).',
|
|
1498
1729
|
'isPulsing YALNIZ nokta kipinde çizilir (panelde de yalnız isDot açıkken görünür): sayaç/metin rozetine verilmesi hiçbir şey yapmaz. prefers-reduced-motion açık kullanıcıda animasyon kendiliğinden durur.',
|
|
1499
1730
|
"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.",
|
|
1500
1731
|
'TIKLANABİLİR NOKTA İÇİN dotLabel ZORUNLU: nokta kipinde rozetin metni yoktur, click bağlıyken aria-hidden da basılmaz — dotLabel boşsa ekranda adsız bir düğme kalır ve ekran okuyucu onu "düğme" diye okur.',
|
|
1501
1732
|
'Rozet kendi başına durur; başka bir bileşenin köşesine yapışmaz — saydığı şeyin yanına yerleştirilir (button ve icon kendi köşe rozetlerini kendileri çizer).',
|
|
1502
|
-
'Rozetin kendi
|
|
1503
|
-
'
|
|
1733
|
+
'Rozetin kendi ipucu prop’u YOKTUR ve gerekmez: 99+ ve kesilen metin title\'a kendiliğinden yazılır (nokta kipinde dotLabel title olur). Düğümün ortak appearance.tooltip kanalı rozet için BAĞLANAMAZ ("{{ item.count }}" harfi harfine basılır) ve ekran okuyucuya ulaşmaz (yalnız data-tooltip + CSS) — kullanma (CQ-249).',
|
|
1734
|
+
'Erişilebilir ad: ariaLabel doluysa rozetin okunan adı odur ("3 okunmamış mesaj"). Tıklanamayan chip tek bir görsel (role=img) olarak okunur ve içindeki sayı ayrıca okunmaz; tıklanabilir chip düğme kalır ve adı etiket olur (etiketsiz tıklanabilir sayaç yalnız "99+" gibi bir sayıyı okur ve ne yaptığını söylemez — sayaca tıklama bağlıyorsan ariaLabel yaz). Nokta kipinde dotLabel etiketin yedeğidir, ariaLabel onu ezer; etiketsiz tıklanabilir nokta adsız düğme kalır.',
|
|
1735
|
+
'Tıklanabilir NOKTANIN tıklama alanı görünmez bir 24×24 px\'e genişler (WCAG 2.5.8; nokta ve yerleşim aynı); bunu ::after kurar, noktada style\'a &::after yazma. Nokta başka bir tıklanabilir öğenin ~7 px yanındaysa o bölgedeki tıklamaları nokta alır: yan yana tıklanabilir nokta/düğme koyacaksan aralarını 14 px üstü bırak. Kendi başına hâlâ adsız bir düğme olabilir: dotLabel yaz.',
|
|
1736
|
+
'Köşe rozeti (bir düğme ya da avatarın köşesinde sayaç) için bileşen yok, style var: kabın style\'ına position: relative, rozetin style\'ına position: absolute; top: -4px; inset-inline-end: -6px (RTL\'de kendiliğinden aynalanır) ve kabın surfaceStyle\'ında contentOverflow: visible yaz — yoksa kap rozeti kırpar. Tıklanabilir köşe rozeti için rozetin kendisi click\'i taşır.',
|
|
1737
|
+
'Zorlanmış renkler modunda (forced-colors) nokta ve outline rozet sistem renginde 1 px çerçeve alır (zemin ve halka sistem rengine ezilince kaybolurdu).',
|
|
1504
1738
|
'mount düğüm çizilince bir kez yayılır (sayaç sorgusunu buradan başlat).'
|
|
1505
1739
|
],
|
|
1506
1740
|
propNotes: {
|
|
1507
1741
|
value: 'Sayı ya da metin; boş string (ve showZero kapalıyken 0) rozeti tamamen gizler — icon dolu olsa bile hiçbir şey çizilmez. Şemadaki 5 varsayılanı TASARIM ANI değeridir: paletten bırakılan düğüme yazılır, ama düğüm value taşımıyorsa runtime varsayılanı boş stringtir ve rozet HİÇ çizilmez. Rozeti buradan kurarken value’yu açıkça yaz (CQ-265).',
|
|
1508
|
-
|
|
1742
|
+
maxCount: 'Sayaç bu sayıyı aşınca "99+" biçimine kısalır. Geçersiz değer (0, negatif, sayı olmayan, boş) 99\'a döner, kesirli değer aşağı yuvarlanır (1.5 → 1); panel en az 1 kabul eder.',
|
|
1743
|
+
ariaLabel: 'Ekran okuyucunun okuyacağı ad; boşsa chip çizilen metni okur, nokta kipinde dotLabel okunur. Doluysa rozetin metni/sayısı ayrıca okunmaz, yerine bu ad gelir; tıklanabilir rozette düğmenin adı olur. Sayaç ve tıklanabilir rozetlerde ne saydığını/ne yaptığını söyleyen bir metin yaz ("Okunmamış mesaj: 3", "Bildirimleri aç").',
|
|
1744
|
+
icon: 'Metnin başlangıç tarafına küçük ikon (RTL\'de sağda); yazıyla orantılı çizilir. Nokta kipinde ve value boşken çizilmez.',
|
|
1509
1745
|
dotLabel: 'Nokta kipinin erişilebilir etiketi (title + aria-label). Nokta tıklanabilirse zorunludur; yalnız isDot açıkken panelde görünür.',
|
|
1510
1746
|
isPulsing: 'Nabız animasyonu — yalnız nokta kipinde etkilidir (canlı/bekleyen durum vurgusu).',
|
|
1511
1747
|
color: "Rozetin zemin/çerçeve rengi. custom seçilip customColor geçersiz bir renkse semantik varsayılana (primary) düşer, siyaha boyamaz.",
|
|
@@ -1513,14 +1749,16 @@ export const componentKnowledge = {
|
|
|
1513
1749
|
shape: 'pill | rounded | square — köşe yarıçapı; nokta kipinde okunmaz.',
|
|
1514
1750
|
textColor: "Boş bırakılırsa metin rengi zemine göre OTOMATİK seçilir (warning/info gibi açık zeminde koyu metin) ve doğru olan genelde budur. Doldurulursa otomatik kontrast devre dışı kalır; custom + geçersiz renk primary değerine DÜŞMEZ, otomatiğe geri döner.",
|
|
1515
1751
|
size: 'sm | md | lg — yalnız ölçü değişir, sayaç kuralları aynı kalır.',
|
|
1516
|
-
style: "Özel CSS; parçalar &__icon ve &__text (nokta kipinde ikisi de yoktur, style yalnız köke iner)."
|
|
1752
|
+
style: "Özel CSS, rozetin kendisine iner; parçalar &__icon ve &__text (nokta kipinde ikisi de yoktur, style yalnız köke iner). Kök fontSize rozeti büyütür; whiteSpace: normal uzun metni saralar; maxWidth ile üç nokta çalışır. {{ }} ile BAĞLANAN style uygulanmaz."
|
|
1517
1753
|
}
|
|
1518
1754
|
},
|
|
1519
1755
|
'breadcrumb-title': {
|
|
1520
1756
|
summary: 'Kalın sayfa başlığı + önünde daralan kırıntı izi; eski mustache "doküman başlık" HTML widget’ının komponent karşılığı. KAPSAYICI DEĞİLDİR, çocuk almaz.',
|
|
1521
1757
|
behavior: [
|
|
1522
1758
|
"Son maxVisibleItems öğe satır içinde kalır, öncekiler '…' menüsüne toplanır (varsayılan 1; 0 = izin tamamı menüde). Daralma SAYIYLA olur, genişlikle değil — dar düğümde satır içi öğeler kısalıp üç nokta ile biter.",
|
|
1523
|
-
"Öğeye tıklamak önce öğenin KENDİ flow'unu çalıştırır, sonra clickItem yayar (dropdown-button sözleşmesi). Tıklanan öğe düğümün currentItem prop'una yazılır
|
|
1759
|
+
"Öğeye tıklamak önce öğenin KENDİ flow'unu çalıştırır, sonra clickItem yayar (dropdown-button sözleşmesi). İKİ akış da yükü event.data'dan okur: { currentItem, index } — index items dizisindeki GERÇEK sıradır, gizli öğeler kaydırmaz (breadcrumb ile aynı sözleşme). 2026-09-30'dan önce event.data BOŞ geliyordu (QA BT-002). Tıklanan öğe ayrıca düğümün currentItem prop'una yazılır; self.currentItem ancak kayıtlı düğüm o anahtarı taşıyorsa ifade yüzeyine çıkar (ARC-096) — event.data.currentItem.key'i kullan.",
|
|
1760
|
+
"ERİŞİLEBİLİRLİK (2026-09-30, BT-001/003/004): kök bir nav'dır (sözlükten 'Gezinti yolu' / 'Breadcrumb'; gösterecek bir şey yoksa etiketsiz div), başlık aria-current='page' taşır. Kök ikon düğmesinin adı 'Ana sayfa' / 'Home', '…' düğmesininki 'Diğer seviyeler' / 'More levels' (aria-haspopup='menu' + aria-expanded); ikonlar ve ayraçlar ekran okuyucudan gizlidir. Açık '…' menüsü Escape ile kapanır, odak düğmeye döner.",
|
|
1761
|
+
"DAR DÜĞÜM (BT-005): satır içi öğeler ÖNCE küçülür (üç noktaya kadar), başlık ancak sonra — 469px'lik düğümde 649px'lik başlığın 302px'i okunur (önce 205px). Kök ikon + ayraçlar sabit yer kaplar; 250px altındaki düğümde başlık yine dar kalır, orada maxVisibleItems'ı düşür.",
|
|
1524
1762
|
'rootHref verilmişse kök ikonu ona gider ve rootFlow ÇALIŞMAZ — href akışı ezer; clickRoot ise HER durumda yayılır (2026-09-17: href yazılıyken sessizce yutuluyordu). Dış adres (http, https, mailto, tel) tam sayfa gezinmesiyle açılır, uygulama içi yol router ile.',
|
|
1525
1763
|
'isLoading açıkken iz ve başlık yerine iskelet çubukları çizilir; o sırada tıklanacak öğe yoktur. Veriyi mount olayına bağlanan akış getiriyorsa bunu aç, satır boy değiştirmesin.'
|
|
1526
1764
|
],
|
|
@@ -1529,7 +1767,12 @@ export const componentKnowledge = {
|
|
|
1529
1767
|
maxVisibleItems: 'Satır içinde kalacak öğe sayısı (varsayılan 1).',
|
|
1530
1768
|
rootIcon: 'Kök (ana sayfa) ikonu; NESNE bekler: { name: home }. Üretilen şema tipi string der ama runtime name alanını okur — düz metin de kabul edilir, runtime onu nesneye çevirir. Boş bırakılırsa kök düğmesi hiç çizilmez ve rootHref/rootFlow ulaşılamaz kalır.',
|
|
1531
1769
|
title: 'Sayfa başlığı; izin EN SAĞINDA, kalın. Şema varsayılanı Page title ve runtime da aynı varsayılanı çizer (CQ-265). Boş bırakılırsa yalnız iz görünür.',
|
|
1532
|
-
isLoading: 'İçerik yerine iskelet çizer (iz çubuğu + başlık çubuğu). Akış izi yazana kadar açık tutulur.'
|
|
1770
|
+
isLoading: 'İçerik yerine iskelet çizer (iz çubuğu + başlık çubuğu; --ng-border-primary tonunda, zeminden seçilir). Akış izi yazana kadar açık tutulur.',
|
|
1771
|
+
rootHref: "Kök ikonunun adresi (bağlantı seçici: sayfa ya da özel adres). Doluysa rootFlow ÇALIŞMAZ; önce clickRoot yayılır, sonra gezinilir — dış adres (http/https/mailto/tel) tam sayfa, uygulama içi yol router ile. rootIcon boşsa kök düğmesi hiç çizilmez ve bu prop etkisizdir.",
|
|
1772
|
+
rootFlow: "Kök ikonuna basınca koşan akış; YALNIZ rootHref boşken çalışır. Akış veri almaz (event.data boştur). clickRoot olayı bundan bağımsız ve her basışta yayılır.",
|
|
1773
|
+
style: "Serbest CSS, KÖK satıra uygulanır (zemin, dolgu, kenarlık …). Şema iç parça (&__title gibi) BİLDİRMEZ: başlık, öğe ve ayraç stilleri bileşenin kendi kurallarıdır, parça sözleşmesiyle değiştirilemez.",
|
|
1774
|
+
isHidden: 'Düğümü hiç çizmez (ortak katman). Öğe bazlı gizleme items[].isHidden’dır.',
|
|
1775
|
+
currentItem: "Şemada GİZLİ durum prop'u (panelde çizilmez): clickItem tıklanan öğeyi buraya yazar. Akış öğeyi event.data.currentItem ile okusun; kendin yazman gerekmez."
|
|
1533
1776
|
}
|
|
1534
1777
|
},
|
|
1535
1778
|
carousel: {
|
|
@@ -1579,14 +1822,23 @@ export const componentKnowledge = {
|
|
|
1579
1822
|
'aggregate/sort/topN/nullMode veriyi çizimden ÖNCE dönüştürür — aynı işi akışta yapmana gerek yok.',
|
|
1580
1823
|
'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.',
|
|
1581
1824
|
'isExportable "tablo olarak gör" + dışa aktarma araç çubuğunu açar; showRefresh refresh olayını yayan bir yenile düğmesi ekler.',
|
|
1582
|
-
"OLAYLAR (2026-09-25 düzeltmesi): nokta tıklaması YALNIZ dataPointClick, kategori ekseninin etiketine basış YALNIZ axisLabelClick yayar (yatay çubukta etiketler y eksenindedir). Öncesinde axisLabelClick her nokta tıklamasında noktanın değeriyle geliyor, etikete basış ise hiç gelmiyordu: triggerEvent eksen yerine axisLabel altındaydı ve olay sorgusu nesne olduğu için süzmüyordu. Hedef çizgisi, bant ve eksen başlığı tıklaması olay değildir; selectionChange yalnız selectionMode açıkken gelir (kapalıyken ECharts'ın boş seçimi self.selected'ı eziyordu); dataPointClick.row kategori adıyla bulunur (nullMode skip sonrası kayan dataIndex yanlış satırı veriyordu). Eşleme mobil chart ile ortak (chart-events.ts).",
|
|
1583
|
-
'BOZUK BAĞLI VERİ (2026-09-25): series/rows beklenmedik şekilde gelirse (dizi yerine metin, okunamayan alan) grafik düşmez — veri çözülemezse emptyText, seçenek kurulamazsa önceki çizim kalır. Eksen başlığı (categoryAxis.title / valueAxis.title) eksenin ortasına, etiketlerin dışına yazılır; ızgara etiket + başlığa yer ayırır (2026-09-29). title/subtitle doluyken çizim alanı başlığın altına iner (radar/radyalde merkez aşağı kayar).',
|
|
1584
1825
|
"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.",
|
|
1585
1826
|
'LEGENDDEN SERİ GİZLEME ÇALIŞIYOR (2026-09-16 düzeltmesi): legend tıklaması artık kalıcı. Öncesinde tıklama ~8 ms sonra kendiliğinden geri alınıyordu — olay yükü prop’lara yazılıyor, tepkime notMerge çizim yapıyor ve ECharts’ın legend.selected durumu siliniyordu. Seçim çizimden önce option’a geri yazılıyor; listede olmayan seri adları elenir.',
|
|
1586
1827
|
'YATAY + İKİNCİL EKSEN ÇİZİLİYOR (2026-09-16 düzeltmesi): orientation:"horizontal" ile bir seride axis:"secondary" birlikte verilince grafik SESSİZCE boş çiziliyordu — yatayda değer eksenleri xAxis dizisindedir, yAxis tek kategori eksenidir. Kombo grafiği artık iki yönelimde de kurulabilir.',
|
|
1587
1828
|
'RENK KURALLARI (colorRules) artık waterfall, histogram, pareto ve bullet’ta da uygulanıyor. Panelde görünüp hiçbir şey yapmıyorlardı. Kural neyi sınar: waterfall’da İŞARETLİ delta, histogram’da kutunun frekansı, pareto/bullet/scatter’da barın/noktanın kendi değeri, pie/donut ve kartezyende dilim değeri, gauge’de tek sayı.',
|
|
1588
1829
|
'ANIMATION her tipte okunuyor (2026-09-16): animation:{ enabled,duration,easing } önceden yalnız bar/line/area/tornado dalına yazılıyordu, pie/gauge/waterfall/… için ölü bir proptu.',
|
|
1589
|
-
'PANELDE GÖRÜNMEYEN AYAR ÖLÜ AYAR DEĞİL: barStyle, useDecalPatterns, sampling, isLarge, isZoomable, selectionMode, dataLabels ve legend artık yalnız kendi builder’larının OKUDUĞU tiplerde görünür. Bir ayarı panelde bulamıyorsan seçtiğin chartType onu okumuyor demektir — zorlamak yerine tipi değiştir.'
|
|
1830
|
+
'PANELDE GÖRÜNMEYEN AYAR ÖLÜ AYAR DEĞİL: barStyle, useDecalPatterns, sampling, isLarge, isZoomable, selectionMode, dataLabels ve legend artık yalnız kendi builder’larının OKUDUĞU tiplerde görünür. Bir ayarı panelde bulamıyorsan seçtiğin chartType onu okumuyor demektir — zorlamak yerine tipi değiştir.',
|
|
1831
|
+
'KÖK ÖZELLİK VE PARÇA SEÇİCİLERİ (2026-09-30): style kökü çizer; parçalar &__toolbar (araç çubuğu), &__actions (düğme grubu), &__breadcrumb (drill-down kırıntısı), &__body (grafik gövdesi), &__state (yükleme/hata/boş kutusu), &__caption (alt yazı), &__table ("tablo olarak gör" görünümü). Öncesinde bu seçiciler kabul ediliyor ama HİÇBİR şeyi boyamıyordu. Hover/odak için "& button:hover" ve "& button:focus-visible" yazılır; kanvasın İÇİNDEKİ çizim (çubuk, eksen, legend) CSS ile değil paletteten, barStyle, valueFormat gibi prop lardan gelir.',
|
|
1832
|
+
'ETKİLEŞİM DURUMU KORUNUR (2026-09-30): yakınlaştırma aralığı (isZoomable) ve seçili noktalar (selectionMode) olay yükü prop lara yazıldıktan sonra da kalır; selectionMode:"multi" noktaları biriktirir. Öncesinde her yeniden çizim ikisini de siliyordu (zoom kendiliğinden tam aralığa dönüyor, multi tek noktaya iniyordu).',
|
|
1833
|
+
'axisLabelClick GERÇEKTEN YAYILIR (2026-09-30): kategori ekseni etiketine tıklamak dikey ve yatay yönelimde { value } yayar ve dataPointClick üretmez. Öncesinde ECharts anahtarı yanlış yere yazıldığı için olay hiç çıkmıyordu.',
|
|
1834
|
+
'BAŞLIK / LEGEND YER AYIRIR (2026-09-30): title, subtitle ve üstte duran legend çizim alanını aşağı iter (öncesinde çubukların ve eksen etiketlerinin üstüne biniyordu); kabı aşan başlık satır kırar; 32 karakteri aşan legend adı "…" ile kısalır ve tam adı imleç kutusunda görünür.',
|
|
1835
|
+
'IMLEÇ KUTUSU valueFormat UYGULAR (2026-09-30): prefix, suffix, ayraç, decimals ve abbreviate eksen ve etiketle aynı biçimde ipucuna da yazılır. Öncesinde ipucu ham sayıyı basıyordu.',
|
|
1836
|
+
'TORNADO (2026-09-30): ilk seri değeri ne yazılırsa yazılsın (30 ya da -30) SOLA, ikinci seri sağa çizilir ve iki seri aynı kategori satırında yığılır; yatay yönelim (orientation:"horizontal") klasik tornado görünümünü verir.',
|
|
1837
|
+
'VARSAYILANLAR ÇALIŞMA ANINDA DA GEÇERLİ (2026-09-30): categoryField boşsa "label", series boşsa value alanı okunur; tanınmayan chartType bar çizilir. YİNE DE MCP ile eklediğin düğümde categoryField ve series u açıkça yaz: add_component katalogun varsayılanlarını düğüme yazmıyor, ve kendi alan adların ("ay", "gelir") varsayılanla eşleşmez.',
|
|
1838
|
+
'SAĞDAN SOLA (2026-09-30): kap okuma yönü rtl ise (tema direction ya da dir) kartezyen grafik aynalanır: kategori ekseni ters (ilk kategori sağda), dikey eksen sağda (ikincil eksen solda), legend karşı yana yaslanır (giriş sırası değişmez); yatay yığın toplamı etiketi ters eksenin dışına yazılır. Pasta/radar/gösterge/radyal eksensizdir, olduğu gibi kalır. Yön dil değişince de izlenir.',
|
|
1839
|
+
'BULLET plotBands (2026-09-30): plotBands verilince bullet nitel bantları ([{ from, to, label, color }]) arka planda çizer, otomatik gri aralık çubuğu kalkar ve değer ekseni en büyük bant ucuna kadar açılır. Bant yokken davranış aynı.',
|
|
1840
|
+
'TORNADO ARALIĞI (2026-09-30): series[].lowField/highField tornado ve bar ile çalışır; sıfırı aşan aralık (-30..40) iki yana bölünür, tamamen negatif ya da pozitif aralık da doğru çizilir (öncesinde -30..40 çubuğu 0..70 çiziliyordu).',
|
|
1841
|
+
'DURUM KUTULARI (2026-09-30): isLoading bir iskelet çizer (öncesinde alan boş kalıyordu); hata kutusu role="alert", boş kutu role="status" taşır; emptyText/errorText yalnız boşluktan oluşuyorsa varsayılan metin yazılır. Tam ekran (isExportable) bir kaplamadır: Esc kapatır, Tab kaplamanın dışına kaçmaz.'
|
|
1590
1842
|
],
|
|
1591
1843
|
propNotes: {
|
|
1592
1844
|
rows: 'Satır dizisi; mount/filter akışlarının setter hedefi.',
|
|
@@ -1595,21 +1847,29 @@ export const componentKnowledge = {
|
|
|
1595
1847
|
categoryField: 'Kategori ekseni alan adı (varsayılan "label"). SCATTER’DA x ekseninin SAYISAL kolonudur (y = series[0].valueField) — eski xField adı geriye uyumluluk için ayrılmış durumda, onu kullanma.',
|
|
1596
1848
|
series: "[{ valueField, type?, axis?, color?, stack?, lowField/highField?, targetField? }] — yFields'ın yerini aldı.",
|
|
1597
1849
|
stackMode: 'none | stacked | percent.',
|
|
1598
|
-
dataLabels: "{ show, position, content, showTotal }. showTotal YALNIZ stackMode:'stacked' iken iş görür: her yığının tepesine (yatayda sağına) dilimlerin toplamını yazar, valueFormat uygulanır; toplam EKSENE ve LEGEND'e GİRMEZ. 2026-09-15 düzeltmesi — öncesinde toplam şeffaf bir seri olarak yığına ekleniyordu: değer ekseni gerçek en yüksek yığının İKİ KATINA çıkıyor, toplam etiketi barın çok üstünde boşlukta duruyor ve legend'de '<grup>__total' diye dördüncü bir madde beliriyordu (S-18). İŞARETİ KARIŞIK yığın İKİ etiket yazar (2026-09-16): ECharts pozitifleri yukarı, negatifleri aşağı ayrı yığar, o yüzden pozitif dilimlerin toplamı üstte, negatiflerinki altta durur — tek bir 'net' sayı yanlış barın ucuna düşüyordu. percent modunda etkisizdir.",
|
|
1599
|
-
isDrillDown: 'Veri noktası tıklamasını kırıntı seviyesine çevirir; sorguyu akış yeniler. scatter’da yoktur: noktanın kategori adı yok.',
|
|
1850
|
+
dataLabels: "{ show, position, content, showTotal }. showTotal YALNIZ stackMode:'stacked' iken iş görür: her yığının tepesine (yatayda sağına) dilimlerin toplamını yazar, valueFormat uygulanır; toplam EKSENE ve LEGEND'e GİRMEZ. 2026-09-15 düzeltmesi — öncesinde toplam şeffaf bir seri olarak yığına ekleniyordu: değer ekseni gerçek en yüksek yığının İKİ KATINA çıkıyor, toplam etiketi barın çok üstünde boşlukta duruyor ve legend'de '<grup>__total' diye dördüncü bir madde beliriyordu (S-18). İŞARETİ KARIŞIK yığın İKİ etiket yazar (2026-09-16): ECharts pozitifleri yukarı, negatifleri aşağı ayrı yığar, o yüzden pozitif dilimlerin toplamı üstte, negatiflerinki altta durur — tek bir 'net' sayı yanlış barın ucuna düşüyordu. percent modunda etkisizdir. content:'percentage' bar/çizgi/alanda serinin toplamındaki payı, pasta/halkada dilim payını yazar; yüzde yığında (stackMode:'percent') değerin kendisi zaten yüzdedir. fontSize etiket puntosunu px yazar; çubuğun dışındaki etiket temanın metin rengini alır (koyu zeminde okunur).",
|
|
1851
|
+
isDrillDown: 'Veri noktası tıklamasını kırıntı seviyesine çevirir; sorguyu akış yeniler. scatter’da yoktur: noktanın kategori adı yok. Kırıntının kök etiketi "Başlangıç" (tr) / "Home" (en); tıklayınca breadcrumbClick filterValue:undefined yayar.',
|
|
1600
1852
|
caption: 'Grafiğin ALTINA yazılan açıklama satırı (DOM metni, kanvasın parçası değil). 2026-09-16 öncesinde prop panelde vardı ama hiçbir yere çizilmiyordu.',
|
|
1601
1853
|
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).',
|
|
1602
1854
|
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.",
|
|
1603
1855
|
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.',
|
|
1604
|
-
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.',
|
|
1856
|
+
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.',
|
|
1605
1857
|
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.',
|
|
1606
|
-
colorRules: '[{ operator, value, valueTo, color }] — ilk eşleşen kural kazanır. radial/funnel/radar/funnelflow dışındaki her tipte uygulanır.'
|
|
1858
|
+
colorRules: '[{ operator, value, valueTo, color }] — ilk eşleşen kural kazanır. radial/funnel/radar/funnelflow dışındaki her tipte uygulanır.',
|
|
1859
|
+
sort: 'by:"value" hangi serinin değerine göre dizer: seriesRef bir serinin VALUE FIELD adı ya da seri ADI olabilir, boşsa ilk seri. (2026-09-30 öncesi boş seriesRef sıralamayı sessizce etkisiz bırakıyordu.) by:"category" kategori adına göre dizer.',
|
|
1860
|
+
topN: 'topN sıralamadan BAĞIMSIZDIR: veri sırasındaki ilk N kategoriyi tutar, gerisini "otherLabel" satırında toplar. EN BÜYÜK N için önce sort:{ by:"value", direction:"desc" } ver.',
|
|
1861
|
+
annotations: 'x ve y yüzde ("62%") ya da piksel ("200px") olarak yazılır; kategori adı ("Haz") konumu bozar. Metin grafiğin arkasında soluk (opaklık 0.5) durur ve tıklanamaz.',
|
|
1862
|
+
locale: 'Yalnız "tr" ve "en" sözlüğü vardır; boş bırakılırsa uygulama dili izlenir, sözlükte olmayan dil (ar…) İngilizceye düşer. Araç çubuğu düğmeleri, tip seçici seçenekleri, boş/hata metni ve erişilebilirlik özeti aynı dili kullanır.',
|
|
1863
|
+
referenceLines: 'axis:"secondary" çizgi, ikinci değer eksenine bağlı bir seri VARSA o eksende çizilir (yoksa birincil eksende kalır); etiket çizginin ucunda, ızgaranın içindedir. plotBands yalnız birincil eksendedir.',
|
|
1864
|
+
plotBands: '[{ from, to, label, color }] — kartezyen tiplerde (bar/line/area/tornado) değer ekseni üstünde soluk bant, bullet\'ta nitel arka plan bantları. YALNIZ birincil eksende.',
|
|
1865
|
+
targetField: 'bullet: hedef işareti. Üst düzey targetField kazanır; boşsa ilk serinin series[].targetField alanı okunur.',
|
|
1866
|
+
style: 'Parça seçicileri: &__toolbar · &__actions · &__breadcrumb · &__body · &__state · &__caption · &__table; kökte doğrudan CSS ve "& button:hover" / "& button:focus-visible" çalışır. Kanvasın içindeki çubuk/eksen/legend CSS ile değil prop ile biçimlenir.'
|
|
1607
1867
|
}
|
|
1608
1868
|
},
|
|
1609
1869
|
checkboxgroup: {
|
|
1610
1870
|
summary: 'Değeri DİZİ olan çoklu kutu grubu (multi-select’in liste hâlinde açılmış hâli).',
|
|
1611
1871
|
behavior: [
|
|
1612
|
-
'Zorunluluk/en az-en çok seçim kuralları formun validations’ından gelir
|
|
1872
|
+
'Zorunluluk/en az-en çok seçim kuralları formun validations’ından gelir: required · min-length · max-length. Kayıt defteri (component_get.validations) iki sayı kuralını minItems/maxItems adıyla gösterir; gateway bunları min-length/max-length’e çevirir (backend ve runtime yalnız tireli adı tanır, Studio paneli de bu adla yazar). Form dizide uzunluk olarak SEÇİLİ ELEMAN SAYISINI ölçer.',
|
|
1613
1873
|
"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ı).",
|
|
1614
1874
|
'DEĞER MODELİ düz bir string[]’dir, seçenek→boolean haritası DEĞİL: bir seçenek, değeri listede olduğu için işaretli görünür. Bu yüzden options içindeki value’lar BENZERSİZ olmalıdır — liste value ile anahtarlandığı için aynı value’yu iki seçeneğe vermek desteklenmez (geliştirme derlemesinde “duplicate keys” hatası fırlatır, üretimde liste bozulur).',
|
|
1615
1875
|
'Seçenek listesinin TANIMADIĞI değerler korunur: tek tık da seç-tümü de listede karşılığı olmayan bir değeri silmez (sorguyla filtrelenmiş listede önceki seçimler kaybolmasın diye).',
|
|
@@ -1632,7 +1892,7 @@ export const componentKnowledge = {
|
|
|
1632
1892
|
emptystate: {
|
|
1633
1893
|
summary: 'Boş ekran/liste bloğu: görsel ya da ikon + başlık + açıklama + aksiyon düğmeleri. Olayları mount ve actionClick.',
|
|
1634
1894
|
behavior: [
|
|
1635
|
-
"
|
|
1895
|
+
"Aksiyonun kendi flow'u varsa tıklamada YALNIZ o akış koşar (emit'in flowId'si üzerinden); actionClick olayına bağlı akış kendi flow'u olmayan aksiyonlarda koşar (ölçüldü 2026-10-01, QA ES-005). İki akışta da event.data.text / event.data.index doludur.",
|
|
1636
1896
|
'image verilirse icon ÇİZİLMEZ (görsel ikonu ezer); ikisi birden gösterilmez.',
|
|
1637
1897
|
'isDisabled aksiyon tıklamayı yutar: ne kendi flow’u çalışır ne actionClick yayılır.',
|
|
1638
1898
|
'actions[].href verilen düğme gerçek bir <a> olur (orta tuş/yeni sekme çalışır); href ile flow birlikte verilebilir, tıklamada ikisi de işler. isDisabled olan satır href almaz, aria-disabled alır.',
|
|
@@ -1641,11 +1901,16 @@ export const componentKnowledge = {
|
|
|
1641
1901
|
'Her parça isteğe bağlıdır; yalnız title taşıyan bir blok geçerlidir. Icon ve görsel ekran okuyucuya dekoratiftir, mesajı h3 olan title taşır.'
|
|
1642
1902
|
],
|
|
1643
1903
|
propNotes: {
|
|
1644
|
-
image: 'Drive dosyası ya da URL; verildiğinde icon yok sayılır.',
|
|
1645
|
-
|
|
1904
|
+
image: 'Drive dosyası ya da URL; verildiğinde icon yok sayılır. Adres yüklenemezse yazılı ikona dönülür (2026-10-01, QA ES-006; öncesinde blok görselsiz kalıyordu).',
|
|
1905
|
+
title: "Başlık (h3). Yazılmazsa ÇİZİLMEZ: 'No records found' yalnız Studio'da bırakılan bloğun örneğidir (2026-10-01, QA ES-007). Sayı da metindir (0 çizilir). Boşluksuz uzun kelime blok içinde kırılır.",
|
|
1906
|
+
description: 'Başlığın altındaki açıklama; en çok 420px genişler, uzun metin ve boşluksuz kelime kırılır. Boşsa çizilmez; sayı metindir.',
|
|
1907
|
+
isHidden: 'Ortak katman görünürlüğü: true iken blok DOM’a girmez; mount, blok ilk kez görünür olduğunda yayılır.',
|
|
1908
|
+
customIconColor: "Yalnız iconColor 'custom' iken okunur (panelde de o koşulla görünür); hex/rgb ya da tema token'ı. Boş ya da geçersizse primary tonuna düşer.",
|
|
1909
|
+
style: "Köke uygulanır. Parçalar: '&__icon', '&__image', '&__title', '&__description', '&__actions'.",
|
|
1910
|
+
size: 'sm | md (varsayılan) | lg — ikon/görsel ölçüsünü ve dikey boşluğu birlikte ölçekler (dar kartta sm): ikon 40 / 64 / 88px (2026-10-01, QA ES-001; öncesinde ikon her boyutta 20px kalıyordu).',
|
|
1646
1911
|
align: 'left | center | right — metin, ikon ve düğmeler birlikte hizalanır.',
|
|
1647
|
-
icon: '
|
|
1648
|
-
iconColor:
|
|
1912
|
+
icon: "Düz metin ad ('inbox') ya da ikon seçicinin { name } nesnesi (2026-10-01, QA ES-002; öncesinde düz metinle hiç ikon çizilmiyordu). Yalnız AD okunur; glif rengi iconColor + customIconColor ile verilir (picker’ın gömülü renk alanı kapalı). Yazılmazsa ikon çizilmez — 'package_2' yalnız Studio'da bırakılan bloğun örneğidir.",
|
|
1913
|
+
iconColor: "primary | info | success | warning | error | custom. Boş bırakılırsa ikon sönük gri kalır — boş durum genelde bir hata değildir. custom seçilirse renk customIconColor’dan gelir. info bu bileşende ikincil metin rengiyle (--ng-text-secondary) çizilir: temanın info tonu bilgi kutusu ZEMİNİdir ve ikon olarak görünmüyordu; warning koyu sarıdır (2026-10-01, QA ES-003).",
|
|
1649
1914
|
isLoading: 'Akış veriyi getirene kadar iskelet. Bileşen geri yazmaz, yalnız akış sürer.',
|
|
1650
1915
|
actions: '[{ text, icon, kind, variant, flow, href, isNewTabLink, isHidden, isDisabled }] — boş bırakılan alanlar hiç çizilmez. isNewTabLink yalnız href dolu satırda anlamlıdır (panelde de o koşulla görünür) ve bağlantıyı target="_blank" + rel="noreferrer noopener" ile yeni sekmede açar; sayfa yerinde kaldığı için actionClick’in sonucu da görünür kalır. isHidden satır hiç çizilmez ve actionClick’in index’inde SAYILMAZ.'
|
|
1651
1916
|
}
|
|
@@ -1657,13 +1922,23 @@ export const componentKnowledge = {
|
|
|
1657
1922
|
"srcdoc YAZILIYSA src YOK SAYILIR (HTML’in kendi sırası): üçüncü parti 'embed kodu' adres uydurmadan yapıştırılır. html bileşeninden farkı: içerik sayfaya değil sandbox'lı çerçeveye girer, yani uygulamanın origin'ine dokunamaz — ama isSandboxed KAPATILIRSA srcdoc belgesi gömen sayfanın origin'ini devralır, ikisini birlikte kapatmak bilinçli bir karardır. Yalnız boşluktan oluşan srcdoc boş sayılır ve src'ye düşülür.",
|
|
1658
1923
|
"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. Örtüyü error de kapatır (2026-09-17 öncesinde kapatmıyordu, 'Loading…' sonsuza dek duruyordu).",
|
|
1659
1924
|
"message: gömülü sayfanın window.parent.postMessage(...) çağrısı bu olayı çalıştırır. YALNIZ bu çerçeveden gelen mesaj kabul edilir (event.source karşılaştırması); sayfadaki başka bir iframe ya da uygulamanın kendi postMessage çağrısı tetiklemez. Yük yalnız event.data'dadır ({ message, origin }), hiçbir prop yazılmaz. ORIGIN SÜZGECİ YOK: sandbox açıkken gömülü belgenin origin'i opak olduğu için event.data.origin 'null' gelir — hangi origin'e güvenileceğine akış karar verir.",
|
|
1660
|
-
"Kanvas toolbar'ı: showBorder · isSandboxed · allowFullscreen · isLazy · referrerPolicy · isHidden."
|
|
1925
|
+
"Kanvas toolbar'ı: showBorder · isSandboxed · allowFullscreen · isLazy · referrerPolicy · isHidden.",
|
|
1926
|
+
"AYAR DEĞİŞİMİ ÇERÇEVEYİ YENİDEN KURAR (2026-10-05): tarayıcı sandbox, allow, referrerPolicy ve allowFullscreen'ı yüklü çerçevede değişse de yalnız bir SONRAKİ gezintide uygular; bu yüzden isSandboxed (ya da allow/referrerPolicy/allowFullscreen) bir akışla çevrilince çerçeve baştan kurulur, yükleme örtüsü yeniden görünür ve gömülü sayfa yeni ayarla açılır (load bir kez daha yayılır). Eskiden öznitelik değişir ama belge eski opak origin'de kalırdı: anahtar 'kapalı' görünür, depolama hâlâ engelliydi. Daha önce yüklenmiş bir kaynağa (ya da ayara) geri dönülünce de örtü yeniden görünür. src'den srcdoc'a geçiş de artık tek load verir.",
|
|
1927
|
+
"SRC SÜZGECİ tarayıcının gördüğü hâli sınar: javascript:/data:/vbscript:/file: şemaları, aralarına sekme/satır sonu konsa (java<TAB>script:) ya da başına kontrol karakteri eklense de boşa düşer ve yedek metin çizilir. Tarayıcılar bu karakterleri URL ayrıştırırken siler; eskiden bu yazımlar süzgeci geçip, isSandboxed KAPALIYKEN gömenin sayfasında script çalıştırıyordu.",
|
|
1928
|
+
"YÜKLEME ÖRTÜSÜ YALNIZ load OLAYINDA KALKAR: tarayıcının load vermediği hedefler örtüyü sonsuza dek bırakır — indirme tetikleyen adres (Content-Disposition: attachment, Content-Type'sız ikili yanıt, örn. /favicon.ico), about:blank ve geçersiz blob:. Böyle bir adres gömme; gömüyorsan loadingText'i boş bırak (örtü hiç çizilmez). Engellenen (X-Frame-Options/CSP), 404 ve bağlantısı reddedilen sayfalar load verir (örtü kalkar, çerçevede tarayıcının kendi hata sayfası görünür), error yayılmaz.",
|
|
1929
|
+
"SANDBOX AÇIKKEN ZEYREK SAYFASI GÖMÜLMEZ: aynı uygulamanın (ya da başka bir Zeyrek uygulamasının) sayfasını gömerken isSandboxed'ı KAPAT. Sandbox'ta çerçeve opak origin'dedir; Zeyrek runtime'ı çerez/depolamaya erişemez ve gömülen sayfa boş beyaz kalır — hata ekranı da çıkmaz. Kapalıyken sayfa tam çizilir (ölçüldü 2026-10-05). Çerez ya da depolama isteyen üçüncü parti gömüler de sandbox'ta çalışmayabilir (ölçülmedi); sandbox'ı kapatmak gömülene gömenin origin'ini verir, bilinçli karar.",
|
|
1930
|
+
"BOYUT: çerçeve içeriğine göre BÜYÜMEZ — çapraz belgenin yüksekliğini bilemez. heightType 'auto' iken kök ~150 px (tarayıcının iframe varsayılanı) kalır, uzun içerik kırpılır; gömülen içeriğe yetecek yüksekliği heightType 'fixed' + heightString ile ver. Mobilde (≤ 767 px) yazılı sabit yükseklik 'auto'ya düşer; korumak için appearance.className'e ng-keep-height-mobile yaz.",
|
|
1931
|
+
"KÖK style'daki fontSize ve color yükleme örtüsüne ve yedek metne İNER (2026-10-05'ten önce örtü kendi 14 px'ini ve sabit rengini kullanıyordu); yedek metin varsayılan olarak ikincil metin rengindedir (kontrast ≥ 4.5). Örtüyü ayrıca &__loading, yedek kutuyu &__empty ile boya.",
|
|
1932
|
+
"ERİŞİLEBİLİRLİK: yükleme örtüsü role='status'tur (ekran okuyucuya loadingText'i duyurması için; gerçek bir ekran okuyucuyla doğrulanmadı). Kök aria-busy taşımaz — meşgul bir atanın içindeki canlı bölge duyurusu beklemeye alınırdı. Örtü load gelmeyen hedeflerde (indirme, about:blank) sonsuza dek kalır. title boş ya da boşluk-yalnız bırakılırsa çerçeve adsız kalmasın diye İngilizce 'Embedded content'e düşer (yerelleşmez; yedek metin de fallbackText boşken title'dır) — anlamlı ve dile uygun bir title yaz.",
|
|
1933
|
+
"STİL HEDEFLERİ (ölçüldü): kök sınıfı .ng-iframe; &__frame gömülen <iframe>, &__loading örtü, &__empty yedek kutu; metin <span> içindedir. '& > iframe', '& .ng-iframe__loading', '&__loading span', kök ::before/::after, @media, @keyframes (adları sayfa-geneli: benzersiz önek ver) ve backdropFilter çalışır; WebkitBackdropFilter reddedilir (silentlyDropped), önek yazma. &:hover ve &:focus-within yedek kutu/örtü/kök dolgusu üstünde çalışır; imleç çapraz belge çerçevesinin üstündeyken tarayıcı kök :hover'ı eşlemeyebilir (headless ölçümde eşlemedi) — hover'a ihtiyaç duyan görünümü dolgu/çerçeve kenarına kur. Olmayan parça (&__bogus) hata vermeden kaydolur ve hiçbir şeye basılmaz.",
|
|
1934
|
+
"SEKME İÇİNDE: tabs keepAlways KAPALIYKEN sekmeye her dönüşte çerçeve söküp yeniden kurulur ve baştan yüklenir (load her dönüşte yeniden yayılır); keepAlways AÇIKKEN gizli sekmelerdeki çerçeveler açılışta birlikte yüklenir — isLazy gizli sekmede erteleme yapmaz (ölçüldü 2026-10-05). 'Yalnız görünen sekme yüklensin ve dönüşte yeniden yüklenmesin' birlikte kurulamaz; ağır gömüyü sekmeye koyma ya da sayaçları buna göre kur.",
|
|
1935
|
+
"allow değeri ham string[] olarak yazılınca page_schema_patch 500 verir; çoklu seçim değerini [{ data: 'camera' }] nesne dizisi olarak yaz (bileşen ikisini de okur)."
|
|
1661
1936
|
]
|
|
1662
1937
|
},
|
|
1663
1938
|
icon: {
|
|
1664
1939
|
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, isDisabled kilidi ve click/href etkileşimi.',
|
|
1665
1940
|
behavior: [
|
|
1666
|
-
"İ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
|
|
1941
|
+
"İ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ı (yazım hatası, uydurma ad) hata vermez ama HİÇBİR ŞEY çizmez: glif 0×0 kalır (çip açıksa boş çip görünür) — adı uydurma, bilinen bir addan emin ol.",
|
|
1667
1942
|
"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.",
|
|
1668
1943
|
"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.",
|
|
1669
1944
|
"ETKİLEŞİM: href doluysa kök gerçek <a> olur (isNewTabLink yeni sekmede açar) ve click olayı (kilitli değilken) 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.",
|
|
@@ -1671,18 +1946,25 @@ export const componentKnowledge = {
|
|
|
1671
1946
|
'OLAYLAR: mount düğüm ilk çizildiğinde bir kez yayılır (salt görsel ikonda da; isHidden açıkken yayılmaz), click yalnız etkileşimli kökten (href ya da bağlı click) çıkar. İkisi de veri taşımaz.',
|
|
1672
1947
|
"İPUCU (tooltip) prop'u YOKTUR: düğümün ortak appearance.tooltip alanı (+ tooltipPosition: top · bottom · left · right) her komponentte ipucu çizer — ikon düğmesinin adını orada yaz.",
|
|
1673
1948
|
"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.",
|
|
1674
|
-
'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.'
|
|
1949
|
+
'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; px/em/rem/%/vh…, calc()/var()/clamp() olduğu gibi geçer. Elle değer tema yazı ölçeğini izlemez. Geçersiz uzunluk ("abc"), sıfır ya da negatif değer md\'ye düşer (ikon kaybolmaz, miras boyuta kalmaz); calc()/var() İÇİNDEKİ ifade denetlenmez.',
|
|
1950
|
+
"ROZET köşesi çipin BAŞLANGIÇ kenarına bağlıdır: tek haneli rozet köşede durur, geniş sayı ('99+', '12500') glife değil DIŞARI büyür; RTL\'de köşe aynalanır (sağdan sola düzende sol üst). warning/info rozetinde yazı rengi zemin parlaklığından seçilir (her iki temada), öteki renklerde tema token\'ı kullanılır. Rozeti kaydırmak için &__badge içine inset-inline-start (RTL\'de kendiliğinden aynalanır) yaz; fiziksel right/left yazarsan başlangıç kenarı da dolu kaldığı için rozet gerilir — onlarla birlikte inset-inline-start: auto yaz.",
|
|
1951
|
+
"HAREKET AZALTMA: kullanıcı prefers-reduced-motion tercih ediyorsa isSpinning dönüşü DURUR (glif yine meşgul işaretidir) — bunun için style\'a medya kuralı yazmaya gerek yok.",
|
|
1952
|
+
"RENK UYARISI: info varsayılan temada neredeyse beyazdır (#F8F8F8, CQ-087) ve warning açık zeminde ~1.9:1 kalır — çip KAPALIYKEN bu iki renk okunmaz. Okunur ikon için primary/success/error, ya da çip + soft/solid, ya da color=custom kullan. Çip açıkken glif rengi zeminin parlaklığından otomatik seçilir (custom çip rengi dahil, koyu tema dahil).",
|
|
1953
|
+
'STİL HEDEFLERİ: kök öğenin sınıfı .ng-icon\'dur; kök style/hoverStyle/&:hover/&:active/&:focus-visible/@media doğrudan köke yazılır. &:focus-visible yalnız ETKİLEŞİMLİ ikonda (href dolu ya da bağlı click) tetiklenir — salt görsel ikon odak almaz. Parçaya durum vermek için "&__chip:hover", ".ng-icon:focus-visible &__chip", ".ng-icon[aria-disabled=true] &__chip" yazımları çalışır (aria-disabled yalnız ETKİLEŞİMLİ kilitli ikonda vardır; salt görsel kilitli ikon için ".ng-icon--disabled" kullan). Platformun varsayılan odak halkası (2px outline) kökte "&:focus-visible { outline: none }" ile kapatılıp yerine kendi halkan konabilir.',
|
|
1954
|
+
"ALIGN left/right MANTIKSALDIR: RTL'de left = başa hizalı (sağda), right = sona hizalı (solda). Arapça sayfada ikonu fiziksel sola koymak için right yaz; yön işaretli ikonlarda (arrow_forward) ise ikon adını dile göre değiştir ya da flipHorizontal kullan.",
|
|
1955
|
+
"REPEATER İÇİNDE: satır içindeki ikona click/mount bağlanabilir; ikon satırda da <button>/<a> olur ve olay satır başına koşar (event.data'da satır yok, akışın satır bağlamı params'tadır). Akıştaki setter ile satır DIŞINDAKİ bir bileşene (sayaç metni gibi) yazmak satır bağlamında şu an değer değiştirmiyor (ARC-172) — sonucu satırı ya da sayfa değişkenini güncelleyen bir kod adımıyla yaz ya da olayı repeater'ın select olayına bağla.",
|
|
1956
|
+
"BİLİNMEYEN AD: yazım hatalı/uydurma Material adı sessizce BOŞ çizilir (hata, uyarı ve ham metin yok; glif 0×0) — ikon görünmüyorsa önce adı kontrol et. Kullanıcı girdisinden gelen adı doğrudan icon'a bağlama: tanınan küme fontun çizdiği Material Symbols ligatürleri (3961 ad; eski adlar `expand_more`, `done`, `email` dahil) ve Phosphor adlarıdır, gerisi boş kalır."
|
|
1675
1957
|
],
|
|
1676
1958
|
propNotes: {
|
|
1677
1959
|
icon: "İKİ biçim de geçer: { name: 'shopping_cart' } nesnesi ya da düz metin ('shopping_cart'). Yalnız AD okunur; renk color/chipColor kanallarından gelir (picker'ın renk bölümü bu komponentte kapalıdır). Boş/çözülmemiş değer varsayılan 'star' glifine düşer.",
|
|
1678
1960
|
isDisabled: 'Kilit: ikon solar, bağlantı adressiz kalır, düğme disabled olur ve click olayı yayılmaz.',
|
|
1679
|
-
size: "sm|md|lg|xl (tema puntosuna oransal) YA DA CSS uzunluğu ('40px', '2.5em'); çıplak sayı px sayılır.",
|
|
1961
|
+
size: "sm|md|lg|xl (tema puntosuna oransal) YA DA CSS uzunluğu ('40px', '2.5em', 'calc(…)'); çıplak sayı px sayılır. Geçersiz/sıfır/negatif → md.",
|
|
1680
1962
|
color: "primary|info|success|warning|error|custom — çip kapalıyken glifin rengi; custom seçilirse customColor okunur. Semantik değer temayı izler, custom izlemez.",
|
|
1681
1963
|
chipShape: "none|circle|rounded|square — none dışında glifin arkasına renkli kutu açılır ve renk yönetimi chipColor'a geçer.",
|
|
1682
1964
|
chipVariant: 'solid (tam renkli zemin + otomatik kontrast glif) | soft (soluk zemin + renkli glif).',
|
|
1683
1965
|
badgeValue: "Köşe rozetinin metni ('3', '99+'); boşsa rozet çizilmez. badgeDot açıkken okunmaz — sayısız nokta çizilir.",
|
|
1684
1966
|
rotation: "0|90|180|270 (derece, metin değer). flipHorizontal/flipVertical ile birleşir; isSpinning açıkken üçü de uygulanmaz.",
|
|
1685
|
-
href: "Adres ya da sayfa yolu — dolu ise ikon gerçek bağlantıdır; click olayı da yayılmaya devam eder.",
|
|
1967
|
+
href: "Adres ya da sayfa yolu — dolu ise ikon gerçek bağlantıdır; click olayı da yayılmaya devam eder. '#bolum' aynı sayfa çapası olarak kalır; çözülmemiş {{ }} ifadesi bağlantı OLMAZ (ikon salt görsel kalır); javascript:/data:/vbscript: şemaları yazılmaz.",
|
|
1686
1968
|
hoverStyle: STYLE_GROUP_NOTES.hoverStyle + ' borderColor alanı bu komponentte YOKTUR (kökte kenarlık yok).',
|
|
1687
1969
|
style: STYLE_GROUP_NOTES.styleEscape + " Parçalar: '&__chip' (zemin kutusu — 'none' kipinde de vardır) · '&__glyph' (glifin sarmalı) · '&__badge' (rozet)."
|
|
1688
1970
|
}
|
|
@@ -1699,7 +1981,14 @@ export const componentKnowledge = {
|
|
|
1699
1981
|
'60 karakteri aşan string yaprakları önizlemede kırpılır ("…"); yaprağa tıklamak tam değeri açar.',
|
|
1700
1982
|
"nodeClick HER satırda (yaprak ya da object/array) tıklanınca yayılır; aç/kapa oku ve satırın kopyala düğmesi nodeClick YAYMAZ. Yük akışta event.data.{ path, key, kind, value }; self.currentItem'a (gizli prop) value'SUZ { path, key, kind } yazılır — ham değeri event.data.value'dan oku. Kırpılmış string'e tıklamak hem tam değeri açar hem nodeClick yayar.",
|
|
1701
1983
|
"copy iki kaynaktan gelir: araç çubuğundaki 'tümünü kopyala' event.data = { path:'', key:'', kind:'root', value: normalize edilmiş TÜM veri }; düğümün kendi kopyala düğmesi o düğümün { path, key, kind, value }'suyla. copy hiçbir prop YAZMAZ, yalnız event.data taşır; pano izni yoksa olay da yayılmaz.",
|
|
1702
|
-
"Dizi elemanlarının anahtarı indekstir: quotesOnKeys açıkken yalnız obje anahtarları tırnaklanır (ham JSON'daki gibi). path noktalı/köşeli yol üretir; nokta ya da boşluk içeren anahtar yolda kaçırılmaz (a.b anahtarı ile a→b aynı yolu verir)."
|
|
1984
|
+
"Dizi elemanlarının anahtarı indekstir: quotesOnKeys açıkken yalnız obje anahtarları tırnaklanır (ham JSON'daki gibi). path noktalı/köşeli yol üretir; nokta ya da boşluk içeren anahtar yolda kaçırılmaz (a.b anahtarı ile a→b aynı yolu verir).",
|
|
1985
|
+
'Uzun anahtar ve değerler SATIRDA SARILIR (overflow-wrap:anywhere): sayfa/gövde yatay kaymaz, boşluksuz 300 karakterlik anahtar da kutuyu taşırmaz. Değer anahtarın yanında en az ~12 karakter yer bulamazsa alt satıra iner (dar sütunda harf harf ezilmez). Satır kopyala düğmesi satırın sağ ucunda sabit durur; fare olmayan (dokunmatik) cihazda soluk de olsa HEP görünür.',
|
|
1986
|
+
"title, emptyText, searchPlaceholder BOŞ ya da yalnız boşluk yazılırsa dilin varsayılanı çıkar (başlık şeridi hiç çizilmez; boş durum 'Veri yok'/'No data'/'لا توجد بيانات'; yer tutucu 'Ara'/'Search'/'بحث'). Uzun başlık satırlara bölünür. Şema varsayılanı artık BOŞTUR: hiç yazmazsan uygulama diline göre çıkar (tr 'Veri yok'/'Ara', en 'No data'/'Search', ar). Eski kayıtta 'No data'/'Search' diye yazılı kalmış sayfa İngilizce kalır — Türkçe/Arapça istiyorsan o alanı boşalt.",
|
|
1987
|
+
"isSearchable KAPANIRSA (panel ya da akış) kutudaki yazı süzgeç olmaktan çıkar, ağaç tam görünür; kutuya yazılı metin yeniden açılınca geri gelir. Aramada büyük/küçük harf duyarsız ve Türkçe katlamalıdır: i, I, ı, İ dördü eşittir ('ist' araması 'İstanbul'u, 'ısp' araması 'ISPARTA'yı bulur; vurgu özgün harfleri korur). Şu an tek tuşta 2000+ satır eşleşen aramalar (2000 öğeli dizide '1') yarım saniye sürer; çok büyük diziyi ham bağlama.",
|
|
1988
|
+
"size yazı boyutunu KÖK yazı boyutuna ORANLA verir (küçük 0.85×, orta 1×, büyük 1.15×): Style kökünde fontSize yazdıysan size onun üstüne biner, onu ezmez. Kökte yazılan color başlığa da iner; fontFamily ağaca iner ama başlık ve arama kutusu arayüz yazı tipinde kalır — onlar için '&__title' / '&__search' içine fontFamily yaz.",
|
|
1989
|
+
"style PARÇALARI (hepsi bildirilmiştir ve kendi öğesini boyar): &__title · &__toolbar · &__search (arama kutusu) · &__tool (araç çubuğu düğmesi) · &__body (kaydırılan gövde) · &__node (her düğümün kabı; girinti burada) · &__row · &__toggle (aç/kapa oku) · &__key · &__type (tür etiketi) · &__value · &__match (arama vurgusu) · &__copy · &__empty. Türe göre renk için &__value DEĞİL iç içe seçici: '& .ng-jsonviewer__value--string' / '--number' / '--boolean' / '--null' / '--object' / '--array'; tür etiketine '& .ng-jsonviewer__type--<tür>'. Satırda data-kind (object|array|string|number|boolean|null); tıklanan satırda data-selected='true' ve aria-current='true' — '&__row[data-selected]' ya da '&__row[aria-current]' ile boya (hâlâ tıklanan tek satır vardır). &__row:nth-child ile ZEBRA YAPILAMAZ: her satır kendi düğümünün ilk çocuğudur, hepsi eşleşir.",
|
|
1990
|
+
"Boş anahtar (\"\") görünür kalır: quotesOnKeys kapalıyken de '\"\":' diye tırnaklı çizilir. sortKeys kod noktası sırasıdır (büyük harf önce: 'Alpha2' 'alpha'dan, '10' '2'den önce) — dil sıralaması değil.",
|
|
1991
|
+
"Ağaç KLAVYEYLE gezilir (ARIA tree): gövde role=tree, satırlar role=treeitem (aria-level, genişletilebilirse aria-expanded, aria-selected); ağaç TEK Tab durağıdır (son odaklanan satır), Tab ağaçtan çıkarır. ↑/↓ komşu satır, Home/End uçlar, → kapalı dalı açar (açıksa ilk çocuğa geçer), ← açık dalı kapatır (değilse üst satıra çıkar), Enter ya da Space nodeClick yayar (fareyle tıklamayla aynı yük; kırpılmış değerde onu da açar), Ctrl/Cmd+C satırın kopyala işini yapar (copy yayar; metin seçiliyse tarayıcıya bırakılır). Sağdan sola düzende → ile ← yer değiştirir. Alt'lı tuşlar ve Ctrl/Shift'li gezinti tuşları işlenmez. Aç/kapa oku, satır kopyala düğmesi ve kırpılmış değer düğmesi Tab durağı DEĞİL (fareyle tıklanır; tıklama odağı o satıra alır), araç çubuğu düğmeleri ve arama kutusu Tab ile erişilir. Satırın erişilebilir adı 'anahtar: önizleme'dir (örn. 'user: {3}')."
|
|
1703
1992
|
],
|
|
1704
1993
|
propNotes: {
|
|
1705
1994
|
data: 'Nesne/dizi ya da JSON metni; döngüsel referanslar "[Circular]" yaprağına düşer.',
|
|
@@ -1765,38 +2054,58 @@ export const componentKnowledge = {
|
|
|
1765
2054
|
],
|
|
1766
2055
|
propNotes: {
|
|
1767
2056
|
totalRows: 'Toplam kayıt; sayfa sayısı bundan hesaplanır. isTotalUnknown açıkken okunmaz (panelde gizlenir).',
|
|
1768
|
-
variant: 'numbers (numaralı düğmeler) | simple (varsayılan; numarasız, sayfa kutusu showJumper ile) | compact (salt "3 / 12", kutu yok). showJumper numbers ve
|
|
1769
|
-
siblingCount: 'numbers’ta mevcut sayfanın iki yanındaki komşu sayısı; ilk ve son sayfa hep görünür, atlananlar "…".',
|
|
2057
|
+
variant: 'numbers (numaralı düğmeler) | simple (varsayılan; numarasız, sayfa kutusu showJumper ile) | compact (salt "3 / 12", kutu yok) | dots (sayı yerine noktalar, etkin nokta uzun; carousel gibi, pencere siblingCount ile). showJumper numbers, simple ve dots’ta kutuyu ekler. compact yalnız göstergeyi değiştirir: bilgi metni (showPageInfo) ve satır seçici (showLimitSelector) varsayılan açıktır ve göstergenin yanında çizilmeye devam eder — yalnız "3 / 12" istiyorsan ikisini de kapat.',
|
|
2058
|
+
siblingCount: 'numbers ve dots’ta mevcut sayfanın iki yanındaki komşu sayısı; ilk ve son sayfa hep görünür, atlananlar "…".',
|
|
1770
2059
|
align: 'left (varsayılan) | center | right barı doğal genişliğinde konumlar; none hücreyi doldurur.',
|
|
1771
2060
|
limitOptions: 'Sayfa boyu seçenekleri; geçersizler elenir, hiçbiri kalmazsa [10,20,30,40,50] kullanılır. Listede olmayan limit seçiciye kendiliğinden eklenir.',
|
|
1772
|
-
infoTemplate: '{from} {to} {total} {page} {pages} yer tutucuları;
|
|
2061
|
+
infoTemplate: '{from} {to} {total} {page} {pages} yer tutucuları; {fromText} {toText} {totalText} aynı sayılar ama dile göre binlik ayraçlı ("1,000" / "1.000"), {total} ham kalır. Boşsa yerelin varsayılan metni ("30 / 57", en: "30 of 57", ar: "30 / 57"). Etiketler tr, en ve ar\'de yerelleşir; başka dil İngilizceye düşer.',
|
|
2062
|
+
previousLabel: 'Önceki düğmesinin simgesinin yanına yazılan metin ("Previous", "Geri"); boşsa yalnız simge. Doluysa düğmenin erişilebilir adı da bu metin olur. Metin sabittir (locale ile değişmez): çok dilli istiyorsan translation değeri ver. CSS content: ile ok metni yazma — dile bağlı olmaz.',
|
|
2063
|
+
nextLabel: 'Sonraki düğmesinin simgesinin soluna yazılan metin ("Next"); boşsa yalnız simge. previousLabel ile aynı kurallar.',
|
|
2064
|
+
limitOptionTemplate: 'Satır seçicisindeki her seçeneğin etiketi; {count} sayıyla dolar ("{count} / page" → "10 / page"). Boşsa yerelin varsayılanı ("10 satır", en: "10 rows"). Tanınmayan yer tutucu olduğu gibi kalır; {count} içermeyen şablon her seçeneğe aynı etiketi basar. Yalnız showLimitSelector açıkken görünür.',
|
|
2065
|
+
jumperPrefixLabel: 'Sayfa numarası kutusunun soluna yazılan metin ("Go to"); yalnız showJumper açıkken ve compact dışında çizilir. Sabit metindir; CSS content: ile yazma. Stil için style `&__label`.',
|
|
2066
|
+
jumperSuffixLabel: 'Sayfa numarası kutusunun sağına yazılan metin ("Page"); jumperPrefixLabel ile aynı kurallar. Kutunun yanına yerleşimi `order` ile ayarlanır (örn. &__limit {order:1}, &__label ve &__page {order:2}).',
|
|
2067
|
+
showLastPage: 'Yalnız variant numbers ve dots: sağ "…" sonrası son sayfa (numara ya da nokta). false → "…" kalır, son sayfa basılmaz; CSS ile son numarayı gizleme. isTotalUnknown açıkken etkisizdir (panelde gizli).',
|
|
1773
2068
|
isTotalUnknown: 'Toplam kayıt sayısı dönmeyen (cursor/"daha fazla var mı" tarzı) veri için; açıkken ileri gitmeyi hasNextPage belirler.',
|
|
1774
|
-
hasNextPage: 'Metin gelirse yalnız true/"true" açık sayılır. Yalnız isTotalUnknown açıkken okunur (panelde yalnız o zaman görünür); false → ileri düğmesi kapalı. Varsayılan true.'
|
|
2069
|
+
hasNextPage: 'Metin gelirse yalnız true/"true" açık sayılır. Yalnız isTotalUnknown açıkken okunur (panelde yalnız o zaman görünür); false → ileri düğmesi kapalı. Varsayılan true.',
|
|
2070
|
+
style: "Görünümü (yuvarlak aktif sayfa, hap kap, düz kutulu, chip'li…) style ile kurarsın; variant/size görünümü değil yalnız yapıyı seçer. style KÖK CSS özelliklerini çubuğa yazar (background, borderRadius, boxShadow, padding, width…) ve parça anahtarları alır: &__nav (ok SARMALAYICI div'i — düğmenin kendisi değil: ok düğmesinin ölçüsü/rengi için '&__nav button' yaz), &__number (sayı düğmeleri), &__page (sayfa kutusu — input, ::before/::after almaz), &__label (jumperPrefixLabel/SuffixLabel metinleri), &__info, &__limit (seçici sarmalayıcısı). AKTİF SAYFA ayrı parça DEĞİLDİR: &__number[aria-current='page'] ile hedeflenir (--active/--current gibi sınıf adları tutmaz). Bileşenin kendi kuralları daha özgül: platform her değere !important ekler, o yüzden border/background/borderRadius yazılınca ezer. Çubuğun yüksekliği sabittir (size'a göre 26–36px, varsayılan yazı boyutunda; dikey taşan içerik kırpılır, yatay taşan çubuğun içinde kayar): düğmeleri büyütecek ya da gölge/dikey yerleşim isteyen tasarımda köke height:'auto' ver. İç içe seçici (&__nav:first-child, &__number:not(:last-child), sıradaki-kardeş ~), kökte &::before/&::after + order ve @media çalışır. SINIR: ok simgesinin kendisi prop ile değişmez. Ok yanındaki metin için previousLabel/nextLabel, seçici etiketi için limitOptionTemplate kullan — &__nav::after { content: 'Next' } gibi CSS metni SABİTTİR (locale ve değerle değişmez, çevrilmez). Dinamik bilgi metni yalnız infoTemplate'ten gelir (binlik ayraç için {totalText}); 'Go to … Page' için jumperPrefixLabel/jumperSuffixLabel, son numarayı gizlemek için showLastPage:false kullan."
|
|
1775
2071
|
}
|
|
1776
2072
|
},
|
|
1777
2073
|
progress: {
|
|
1778
2074
|
summary: 'Çubuk ya da daire biçiminde ilerleme göstergesi; eşiğe göre renk değiştirir. label neyin ilerlediğini yazar, showLabel değer okumasını açar.',
|
|
1779
2075
|
behavior: [
|
|
1780
|
-
"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).",
|
|
1781
|
-
'click yalnız akış BAĞLIYSA çalışır: bağlıyken sarmalayıcı <button> olur ve odak sırasına girer, bağlı değilken düz <div> kalır (badge/avatar/icon/image/
|
|
2076
|
+
"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). Sayfa açılışta zaten %100 olan gösterge de YAYMAZ: olay 'ulaşma' anıdır, açılışta ulaşılmış bir şey yoktur (2026-10-01, QA PG-005) — açılışta tamamlanmış durumu yakalamak için mount akışında değeri kendin sına.",
|
|
2077
|
+
'click yalnız akış BAĞLIYSA çalışır: bağlıyken sarmalayıcı <button> olur ve odak sırasına girer, bağlı değilken düz <div> kalır (badge/avatar/icon/image/statcard ile aynı desen; videoda sarmalayıcı her zaman <div>, kontrolsüzken role=button). role="progressbar" içteki elemanda kalır.',
|
|
1782
2078
|
'max alanı TEMİZLENİRSE 100 sayılır (şema varsayılanı), 0 değil — boş sayı alanı panelde null olarak saklanır ve 0 gibi okunsaydı bar tamamen boşalırdı. Prop .min(1) olduğu için kaybedilen bir "0" hâli yoktur.'
|
|
1783
2079
|
],
|
|
1784
2080
|
propNotes: {
|
|
1785
2081
|
label: 'Neyin ilerlediğini söyleyen metin ("Uploading…"); barın/dairenin ÜSTÜNDE durur. Değer okuması DEĞİLDİR — o showLabel/labelFormat/labelPosition üçlüsüdür. isIndeterminate:true iken de görünür; belirsiz kipte ekrandaki tek bilgi budur.',
|
|
1786
|
-
value:
|
|
2082
|
+
value: "0..max arası; yüzde kırpılarak hesaplanır (taşan değer %100, eksi/sayı olmayan değer %0). Yazılmazsa 0 sayılır — şemadaki 40 yalnız Studio'da bırakılan göstergenin örneğidir (2026-10-01, QA PG-006).",
|
|
2083
|
+
max: 'Yüzdenin paydası (varsayılan 100, en az 1). Temizlenirse 100 sayılır.',
|
|
2084
|
+
labelFormat: 'Değer okumasının biçimi: percent (40%) · fraction (3/10) · value (3). Yalnız showLabel açıkken çizilir; ekran okuyucuya aria-valuetext olarak da verilir.',
|
|
2085
|
+
showTrack: 'Dolgunun arkasındaki izi çizer (varsayılan true). Kapalıyken çubukta iz saydam olur, dairede iz çemberi hiç çizilmez.',
|
|
2086
|
+
isHidden: 'Ortak katman görünürlüğü: true iken gösterge DOM’a girmez.',
|
|
2087
|
+
variant: 'bar (varsayılan) | circle. Dairede okuma ortadadır; labelPosition ve isStriped okunmaz. Daire çapı size ile değişir: 56 / 84 / 112px.',
|
|
2088
|
+
size: 'sm | md (varsayılan) | lg — çubuk yüksekliği 5 / 8 / 12px, daire çapı 56 / 84 / 112px. thickness yazılırsa çubuk yüksekliğini o belirler.',
|
|
2089
|
+
color: "Dolgunun rengi: primary (varsayılan) | info | success | warning | error | custom. Eşik (thresholds) tutarsa onu ezer. info bu bileşende ikincil metin rengiyle (--ng-text-secondary) boyanır: temanın info tonu iz rengiyle aynı açıklıktadır ve çubuk boş görünüyordu (2026-10-01, QA PG-001). warning temanın sarısında kalır; okuma içerideyken sarı dolguda koyu yazılır (QA PG-004).",
|
|
2090
|
+
customColor: 'Yalnız color custom iken okunur (panelde de o koşulla görünür); boş ya da geçersizse primary tonuna düşer. Bir eşik rengi ezdiğinde okunmaz.',
|
|
2091
|
+
trackColor: 'İzin rengi; boşsa tema yüzey tonu. custom seçilirse customTrackColor okunur. showTrack kapalıyken okunmaz ve panelde gizlenir.',
|
|
2092
|
+
customTrackColor: 'Yalnız trackColor custom iken okunur.',
|
|
2093
|
+
style: "Köke uygulanır. Parçalar: '&__caption' (label), '&__track' (iz), '&__fill' (dolgu), '&__label' (değer okuması).",
|
|
2094
|
+
isIndeterminate: 'Belirsiz kip: çubukta kayan dolgu, dairede dönen yay. value/max/thresholds ve değer okuması okunmaz (panelde de gizlenir), complete yayılmaz; label görünmeye devam eder.',
|
|
1787
2095
|
showLabel: 'DEĞER okumasını açar (40% · 3/10 · 40) — label prop’unu değil. Panel başlığı "Show value".',
|
|
1788
2096
|
thresholds: '[{ from: <yüzde>, color: <primary|info|success|warning|error> }] — yüzdeye eşit/altındaki EN BÜYÜK eşiğin rengi kazanır, hiçbiri tutmazsa color prop’u. from BOŞ bırakılan satır düşer; açık 0 geçerlidir. isIndeterminate:true iken eşikler devre dışıdır.',
|
|
1789
2097
|
colorMap: '{ "0": "error", "50": "warning", "80": "success" } — thresholds’un ESKİ biçimi, panelde gizli, yalnız thresholds boşken okunur. Yeni iş thresholds yazar.',
|
|
1790
2098
|
thickness: 'Piksel. Barda yükseklik, dairede çizgi kalınlığı — daire için ölçülen çaptan çizim birimine çevrilir ve yay kırpılmasın diye sınırlanır, yani çok büyük değerler sessizce tavana oturur. Boş/0 = Size’dan gelen kalınlık.',
|
|
1791
2099
|
isStriped: 'Yalnız barda; dairede stroke üzerinde görünmez.',
|
|
1792
|
-
labelPosition: 'DEĞER okumasının yeri (
|
|
2100
|
+
labelPosition: 'DEĞER okumasının yeri: outside (varsayılan, çubuğun yanında) | inside (dolgunun içinde; beyaz, sarı warning dolgusunda koyu). Dairede etiket zaten ortadadır, ayar gizlenir. inside seçilip thickness yazılmazsa çubuk okumayı alacak boya (18px) çıkar (2026-10-01, QA PG-003; öncesinde okuma 8px çubukta kırpılıyordu).'
|
|
1793
2101
|
}
|
|
1794
2102
|
},
|
|
1795
2103
|
rating: {
|
|
1796
2104
|
summary: 'Yıldız (ya da seçilen ikon) ile puanlama girişi.',
|
|
1797
2105
|
behavior: [
|
|
1798
2106
|
'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.',
|
|
1799
|
-
"focus/blur yıldız GRUBUNUN tamamı için bir kez yayılır (kapsayıcıda focusin/focusout dinlenir), yıldız başına değil: yıldıza TIKLAMAK da alana girmek sayılır ve focus yayar, yıldızlar arasında gezinmek yeniden yaymaz, blur yalnız odak şeritten büsbütün çıkınca gelir. Kilitli (isDisabled/isReadonly/isViewmode) ya da yükleniyor alan hiçbir odak olayı yaymaz."
|
|
2107
|
+
"focus/blur yıldız GRUBUNUN tamamı için bir kez yayılır (kapsayıcıda focusin/focusout dinlenir), yıldız başına değil: yıldıza TIKLAMAK da alana girmek sayılır ve focus yayar, yıldızlar arasında gezinmek yeniden yaymaz, blur yalnız odak şeritten büsbütün çıkınca gelir. Kilitli (isDisabled/isReadonly/isViewmode) ya da yükleniyor alan hiçbir odak olayı yaymaz.",
|
|
2108
|
+
"required = en az bir yıldız: 0 puansız sayılır ve 'zorunlu' hatası verir (aynı yıldıza yeniden tık 0'a çeker) (ölçüldü 2026-10-03)."
|
|
1800
2109
|
],
|
|
1801
2110
|
propNotes: {
|
|
1802
2111
|
value: '0..max arası sayı; akıştan gelen değer bu aralığa kırpılır.',
|
|
@@ -1807,18 +2116,22 @@ export const componentKnowledge = {
|
|
|
1807
2116
|
result: {
|
|
1808
2117
|
summary: 'Durum bloğu (success/error/warning/info): büyük ikon ya da illüstrasyon + başlık + alt başlık + aksiyonlar — işlem sonucu ekranları için. KAPSAYICI DEĞİLDİR, çocuk komponent almaz.',
|
|
1809
2118
|
behavior: [
|
|
1810
|
-
'
|
|
2119
|
+
"Aksiyonun kendi flow'u varsa tıklamada YALNIZ o akış koşar; actionClick olayına bağlı akış kendi flow'u olmayan aksiyonlarda koşar (ölçüldü 2026-10-01, QA RS-004). İki akışta da event.data.text / event.data.index doludur.",
|
|
1811
2120
|
'Renk ve varsayılan ikon status prop’undan gelir; icon prop’u yalnız GLİFİ ezer, rengi ezmez — bu komponentte renk anlamın kendisidir (başarı yeşil, hata kırmızı).',
|
|
1812
2121
|
'Görsel slotu hiç boş kalmaz: image doluyken ikon çizilmez, ama adres yüklenemezse durum ikonuna geri dönülür.',
|
|
1813
2122
|
'isLoading açıkken durum ikonu ve metinler ÇİZİLMEZ — yerine nötr bir çark ve iskelet çubuklar gelir ve hiçbir olay yayılmaz. Sebep: varsayılan başlık ile yeşil onay, akış daha cevap vermeden "işlem tamam" derdi. İskelet gerçek yerleşimi taklit eder (yazılı her metin için bir çubuk, görünen her aksiyon için bir şerit; boy ölçüsü size ile ölçeklenir), yani veri gelince blok zıplamaz. Sonucu bir akıştan dolduruyorsan düğümü isLoading açık bırak, akışın son adımı kapatsın.',
|
|
1814
2123
|
'mount ortak katmandan gelir ve sayfa açılınca bir kez yayılır; sonucu dolduran akışın kancası budur.'
|
|
1815
2124
|
],
|
|
1816
2125
|
propNotes: {
|
|
1817
|
-
icon:
|
|
2126
|
+
icon: "Durum ikonunu ezer, RENGİ ezmez (renk her zaman status’tan gelir). Düz metin ad ('star') ya da ikon seçicinin { name } nesnesi olabilir (2026-10-01, QA RS-002; öncesinde düz metin sessizce yok sayılıyor, durum ikonu çiziliyordu). Picker’ın gömülü renk alanı kapalıdır — yazılsa okunmazdı.",
|
|
2127
|
+
title: "Başlık (h2). Yazılmazsa ÇİZİLMEZ: 'Operation completed' yalnız Studio'da bırakılan bloğun örneğidir (2026-10-01, QA RS-006). Sayı da metindir (0 çizilir). Boşluksuz uzun kelime blok içinde kırılır.",
|
|
2128
|
+
subtitle: 'Başlığın altındaki açıklama; en çok 480px genişler, uzun metin ve boşluksuz kelime kırılır. Boşsa çizilmez; sayı metindir.',
|
|
2129
|
+
isHidden: 'Ortak katman görünürlüğü: true iken blok DOM’a girmez, mount da yayılmaz.',
|
|
2130
|
+
style: "Köke uygulanır. Parçalar: '&__icon' (ikon çipi), '&__image', '&__title', '&__subtitle', '&__actions'.",
|
|
1818
2131
|
image: 'İllüstrasyon (Drive dosyası ya da mutlak URL). Doluyken ikon hiç çizilmez ve panelde gizlenir; adres çözülemezse durum ikonuna geri dönülür.',
|
|
1819
2132
|
status: 'Hem rengi hem varsayılan ikonu belirler; tanınmayan/boş değer info okunur.',
|
|
1820
2133
|
align: 'İçeriğin yatay hizası: metin, ikon ve düğmeler birlikte döner.',
|
|
1821
|
-
size: '
|
|
2134
|
+
size: 'sm | md (varsayılan) | lg — dolguyu, ikon çipini, ikonun kendisini ve başlığın puntosunu birlikte ölçekler: çip 48 / 72 / 96px, ikon 24 / 36 / 48px (2026-10-01, QA RS-001; öncesinde ikon her boyutta 20px kalıyordu).',
|
|
1822
2135
|
actions: 'Düğme listesi. Her satır flow (akış tetikler) ya da href (gezinme) alabilir, ikisi birlikte de çalışır. href dolu satır gerçek bir bağlantı olur (orta tuşla yeni sekme); isNewTabLink açıkken düğme zaten yeni sekmede açılır. isDisabled satırın bağlantısını düşürür ve tıklamayı yaymaz. isHidden satır hiç çizilmez ve actionClick’in index’inde de SAYILMAZ.',
|
|
1823
2136
|
isLoading: 'Sonuç henüz belli değilken açılır: blok iskelete döner, actionClick yayılmaz. Akışın kendisi kapatmalı — kendiliğinden kapanmaz.'
|
|
1824
2137
|
}
|
|
@@ -1828,7 +2141,8 @@ export const componentKnowledge = {
|
|
|
1828
2141
|
behavior: [
|
|
1829
2142
|
'change sürüklerken sürekli, changed yalnız bırakıldığında yayılır — pahalı akışı changed’e bağla.',
|
|
1830
2143
|
"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.",
|
|
1831
|
-
'isReadonly/isViewmode/isLoading rayı değiştirilemez yapar ama alanı ODAKLANABİLİR bırakır (değer klavyeyle ve ekran okuyucuyla okunur) ve kilitli alan focus/blur/change YAYMAZ; native disabled ve “yasak” imleci yalnız isDisabled’dan gelir.'
|
|
2144
|
+
'isReadonly/isViewmode/isLoading rayı değiştirilemez yapar ama alanı ODAKLANABİLİR bırakır (değer klavyeyle ve ekran okuyucuyla okunur) ve kilitli alan focus/blur/change YAYMAZ; native disabled ve “yasak” imleci yalnız isDisabled’dan gelir.',
|
|
2145
|
+
"required 0'ı boş sayar: 0'a çekilmiş kaydırıcı 'zorunlu' hatası verir. 0 meşruysa required koyma; alt sınırı minValue ile ver (ölçüldü 2026-10-03)."
|
|
1832
2146
|
],
|
|
1833
2147
|
propNotes: {
|
|
1834
2148
|
value: 'Sayı; akıştan gelen değer [minValue, maxValue] aralığına kırpılır (0 geçerli sınırdır) ve adıma oturmuyorsa en yakın geçerli adımda GÖSTERİLİR (tutamağın gittiği yer) — akışa yazılan sayı bundan etkilenmez, ekrandaki ile aynı olması isteniyorsa adıma oturan bir değer yaz.',
|
|
@@ -1844,15 +2158,21 @@ export const componentKnowledge = {
|
|
|
1844
2158
|
'invertTrend yalnız RENGİ ters çevirir (hata oranı gibi "azalan iyidir" metrikleri için); ok yönü değişmez. trendFormat yalnız METNİ değiştirir: percent "+12%", value "+340".',
|
|
1845
2159
|
'Kartın kendisi click (yalnız bir akış bağlıysa; bağlıyken ana yüzey <button> olur), alt bilgi satırı ayrı footerClick yayar. footerHref ile footerFlow BİRLİKTE çalışır: satır bağlantı olur ve tıklamada footerClick yine yayılır — gezinme akışı yarıda kesebilir; ikisini birlikte kullanacaksan isNewTabLink aç.',
|
|
1846
2160
|
'İkon rengi TEK kanaldır: iconColor + customIconColor. Icon picker\'ın gömülü renk alanı kapalıdır (colorless); çip zemini custom olduğunda glifin rengi zeminin ÖLÇÜLEN parlaklığından seçilir, açık renkte koyu glif çizilir.',
|
|
1847
|
-
'Tipli stil grupları kartın PARÇALARINA iner: typographyStyle.textColor başlık + değer + alt başlığı birlikte boyar (trend anlam rengini, alt satır bağlantı rengini korur), fontSize kartın bütün puntolarını orantılı ölçekler, hoverStyle.background tıklanabilir yüzeyde ve alt satırda da geçerlidir. Kartın ipucu için prop yoktur; düğümün ortak appearance.tooltip alanı kullanılır.'
|
|
2161
|
+
'Tipli stil grupları kartın PARÇALARINA iner: typographyStyle.textColor başlık + değer + alt başlığı birlikte boyar (trend anlam rengini, alt satır bağlantı rengini korur), fontSize kartın bütün puntolarını orantılı ölçekler, hoverStyle.background tıklanabilir yüzeyde ve alt satırda da geçerlidir. Kartın ipucu için prop yoktur; düğümün ortak appearance.tooltip alanı kullanılır.',
|
|
2162
|
+
"MCP ile eklenen kartta çerçeve, gölge ve köşe KENDİLİĞİNDEN GELMEZ: bu varsayılanlar component_get.defaults.surfaceStyle'da yaşar ve sayfaya YAZILMAZSA kart çerçevesiz ve gölgesiz çizilir. Kısmî surfaceStyle (yalnız borderTop) ötekileri varsayılanda TUTMAZ — dört kenarı da, shadow ve radius'u birlikte yaz.",
|
|
2163
|
+
'valueFormat.decimals YAZILMAZSA sayının kendi ondalığı (en çok iki) gösterilir: 3.1 "3,1", -45.5 "-45,5", 1250 "1.250"; açıkça yazılan decimals (0 dahil) bunu ezer ve yuvarlar. abbreviate açıkken basamak 0 kalır (1500 "2K"; decimals:1 ile "1,5K"). Aralık dışı decimals 0..20\'ye kenetlenir (eskiden negatif decimals tüm sayfayı çökertirdi). Trend metni değerle AYNI dilin ayraçlarıyla ve en çok iki ondalıkla yazılır (tr: "+12,5%").',
|
|
2164
|
+
'trendLabel yalnız trend VARKEN çizilir (trend boş/geçersizse etiket de çizilmez): trend ve etiket birlikte bağlanır.',
|
|
2165
|
+
'style parçaları: &__title · &__value · &__trend · &__subtitle · &__icon · &__sparkline · &__footer. Trend etiketi ve ana yüzey için parça YOKTUR; iç içe seçici yaz: "& .ng-statcard__trend-label", "& .ng-statcard__main:focus-visible", "& .ng-statcard__footer:hover". Odak halkası varsayılan olarak içeride, 2px vurgu renginde çizilir.',
|
|
2166
|
+
'Uzun başlık, altyazı, trend etiketi ve alt satır metni satır kırar, kırpılmaz; değer tek satırdır ve sığmazsa "…" ile biter (title tam metni taşır). 999px gibi büyük köşe yarıçapı alt satırın köşesini kırpar.'
|
|
1848
2167
|
],
|
|
1849
2168
|
propNotes: {
|
|
1850
2169
|
value: 'Sayı ya da metin; sayıysa valueFormat uygulanır.',
|
|
2170
|
+
valueFormat: 'decimals yazılmazsa sayının kendi ondalığı (en çok 2; 3.1 → "3,1"), abbreviate açıkken 0; thousandsSep kapalıyken ondalık ayracı DEĞİŞMEZ (1250,00); abbreviate basamaktan önce yuvarlar (1500 → "2K", decimals:1 ile "1,5K").',
|
|
1851
2171
|
sparkline: 'Sayı dizisi; kendi min/max’ına göre ölçeklenir (sıfır tabanlı değil).',
|
|
1852
2172
|
trend: 'Değişim miktarı; işareti yönü ve rengi belirler, birimini trendFormat söyler. 0 nötrdür ve panelden temizlenemez.',
|
|
1853
2173
|
trendFormat: 'percent (varsayılan) yüzde işaretiyle yazar; value işareti korur, birim yazmaz — mutlak değişim gösteren KPI için.',
|
|
1854
2174
|
isNewTabLink: 'Yalnız footerHref doluyken anlamlı: target="_blank" + rel="noreferrer noopener". Yeni sekmede footerFlow akışı da tamamlanır.',
|
|
1855
|
-
isLoading: 'Kartı soldurur ve etkileşimi keser;
|
|
2175
|
+
isLoading: 'Kartı soldurur ve etkileşimi keser — fare VE klavye: düğmeler disabled olur, Tab\'a girmez, click/footerClick yayılmaz; alt satır bağlantısıysa tıklama yutulur. İçerik yerinde kalır, iskelet çizilmez.'
|
|
1856
2176
|
}
|
|
1857
2177
|
},
|
|
1858
2178
|
switcher: {
|
|
@@ -1864,7 +2184,8 @@ export const componentKnowledge = {
|
|
|
1864
2184
|
'value akıştan METİN gelirse: "false" · "0" · "no" · "off" · "null" · "undefined" · "nan" · boş metin YANLIŞ sayılır, kalan dolu metin doğru (checkbox/switch ile ortak normalizasyon, 2026-09-11). Yine de alana boolean yaz — sözleşme boolean’dır.',
|
|
1865
2185
|
'Zorunluluk prop değil, Form’un doğrulama listesinden gelir (`required`) — switcher’ın TEK doğrulama kuralı odur. 2026-09-11’e kadar panel bu bileşen için hiç liste çizmiyordu (slug `ComponentValidationTypes` sözlüğünde yoktu), artık boolean tipinin listesi çiziliyor.',
|
|
1866
2186
|
'Form içindeki switcher artık boolean bir alan olarak davranır: submit’te değeri boolean şemayla doğrulanır (önce metin tipine düşüyordu, yani kural yokken bile tip hatası veriyordu) ve formun Reset’i onu da başlangıç değerine döndürür (önce sıfırlamadan muaftı). 2026-09-11.',
|
|
1867
|
-
'Vurgulu segmentin rengi TEMANIN vurgu renginden gelir; renk prop’u yoktur ve style düğümün KÖKÜNE yazılır (segmentlere ulaşmaz).'
|
|
2187
|
+
'Vurgulu segmentin rengi TEMANIN vurgu renginden gelir; renk prop’u yoktur ve style düğümün KÖKÜNE yazılır (segmentlere ulaşmaz).',
|
|
2188
|
+
"required false segmentini REDDEDER: false boş sayılır ve 'zorunlu' hatası verir. İki seçenek de meşruysa required KOYMA — switcher'ın değeri her zaman vardır (ölçüldü 2026-10-03)."
|
|
1868
2189
|
],
|
|
1869
2190
|
propNotes: {
|
|
1870
2191
|
label: 'Alanın adı, track’in üstünde. Boş bırakılırsa hiç çizilmez ve kontrolün ekran okuyucudaki adı iki segmentin metninden okunur — form içindeki switcher’a etiket yaz.',
|
|
@@ -1903,16 +2224,24 @@ export const componentKnowledge = {
|
|
|
1903
2224
|
'maxCount üstü kayıtlar atılmaz: "Show more" çıkar, showMore olayı yayılır ve kalanların tamamı açılır; items yeni bir diziyle değişince (akışın items[index] alanını yazması DAHİL) görünüm kırpılmış hâline döner.',
|
|
1904
2225
|
"Her satır tıklaması clickItem yayar: event.data = { currentItem, index }, öğe ayrıca self.currentItem'a yazılır. index items dizisindeki GERÇEK yerdir (reverse/maxCount'tan etkilenmez) — akış items[index]'i güncelleyebilir.",
|
|
1905
2226
|
"Öğede flow varsa panelde bağlı clickItem akışı da öğenin kendi flow'u da çalışır — bağlı olay önce başlatılır ama biri diğerini BEKLEMEZ; ikisi de aynı event.data'yı ve self.currentItem'ı görür. Aynı akışı hem olaya hem öğenin flow alanına bağlama: İKİ KEZ çalışır. href'li satır gerçek bağlantıdır (sayfa değişir); flow'lu satır klavyeyle (Enter/Space) de tetiklenir, imleç yalnız href/flow'lu satırda el olur.",
|
|
1906
|
-
'orientation:horizontal yalnız öğe listesini yatay kayan şerit yapar; title üstte, "Show more" altta kalır.',
|
|
1907
|
-
'Nesne olmayan öğe (null, düz metin) atlanır; tanınmayan status primary rengine düşer.'
|
|
2227
|
+
'orientation:horizontal yalnız öğe listesini yatay kayan şerit yapar; title üstte, "Show more" altta kalır. Bağlantı çizgisi noktaları birleştirir ve yöne uyar: sağdan sola (ar) sayfada nokta sağda, çizgi noktanın altında/bir sonraki öğeye (solda) uzanır.',
|
|
2228
|
+
'Nesne olmayan öğe (null, düz metin) atlanır; tanınmayan status primary rengine düşer. İçeriği aynı yeni dizi ("Show more" açıkken) görünümü KAPATMAZ — items bir {{ }} ifadesinden her çizimde yeniden üretilse de.',
|
|
2229
|
+
"dateFormat 'relative' tarihi Intl ile PROJE DİLİNDE yazar (uygulama dili ar ise Arapça, de ise Almanca; 'yaklaşık' ön eki yok, 1 dakikadan azı 'şimdi'; saatsiz tarih takvim günüyle: 'bugün', '1 gün önce', saat farkı yazılmaz). 'absolute' uzun ay adıyla basar (12 Ekim 2026) ve tarayıcının yerel saatini kullanır (2026-09-28T09:00:00Z, +03'te 12:00); biçimi (kısa ay, saatsiz) denetleyen bir prop YOK.",
|
|
2230
|
+
'Dil: locale yalnız tr/en seçtirir; başka bir dil (ar, de…) için locale\'ı BOŞ bırak, uygulama dili izlenir. showMoreText ve emptyText BOŞ (ya da yalnız boşluk) ise ekran diline göre sözlük metni yazılır; her ikisi de YENİ düğümde BOŞ başlar (ekran diline uyar: "Daha fazla göster", "Henüz olay yok", ar); daha önce kaydedilmiş sayfalarda düğüme yazılı İngilizce metin ("Show more", "No events yet") olduğu gibi kalır ve ÇEVRİLMEZ — çok dilli sayfada onları boşalt ya da kendi metnini ver.',
|
|
2231
|
+
'Erişilebilirlik: liste ol/li ile bir liste olarak okunur; nokta ve ikon ekran okuyucudan gizlidir (ikon adı okunmaz); status (info, success, warning, error) ve isPending ekran okuyucuya metin olarak da verilir (renk tek başına anlam taşımaz); isLoading kök aria-busy taşır ve iskelet satırlar gizlidir; odak halkası 2px; prefers-reduced-motion altında nabız animasyonu durur. Klavye: yalnız flow\'lu satır (Enter/Space) ve href\'li satır (Tab) odaklanır — flow\'suz, href\'siz ama panelde clickItem bağlı satır isClickable açılmadıkça YALNIZ fareyle tetiklenir — isClickable: true ise her satır Tab durağı, role=button olur, imleç el olur ve Enter/Space clickItem yayar.',
|
|
2232
|
+
'Uzun metin: başlık, öğe başlığı, alt başlık, açıklama, boş metin ve "Show more" boşluksuz 300 karakterde bile satır kırar; yatay şeritte öğe en çok 280px genişler.',
|
|
2233
|
+
'href yalnız http(s), mailto, tel, /yol, site adresi ve göreli yol kabul eder; javascript:, data: ve vbscript: adresi bağlantıya ÇEVRİLMEZ (satır düz satır olur, tıklayınca yalnız clickItem yayılır).'
|
|
1908
2234
|
],
|
|
1909
2235
|
propNotes: {
|
|
1910
|
-
items: '[{ title, subtitle, description, date, status, color, icon, avatar, href, flow, isPending }] — boş alanlar çizilmez. date ISO metin ("2026-01-02" ya da "2026-01-02T14:30:00Z"); başka biçim olduğu gibi basılır. status: primary|info|success|warning|error. color doluysa status rengini ezer: #hex (3/4/6/8 hane), rgb()/hsl()/oklch() gibi renk fonksiyonu, var(--token), düz renk adı ya da status adı; başka her şey (iç içe parantez, ; taşıyan metin) sessizce yok sayılır.',
|
|
1911
|
-
dateFormat: 'absolute (varsayılan) | relative ("2 gün önce").',
|
|
2236
|
+
items: '[{ title, subtitle, description, date, status, color, icon, avatar, href, flow, isPending }] — boş alanlar çizilmez (alanı olmayan öğe yine de bir nokta çizer). date ISO metin ("2026-01-02" ya da "2026-01-02T14:30:00Z"); başka biçim olduğu gibi basılır. status: primary|info|success|warning|error (info nötr gri, primary mavi). color doluysa status rengini ezer: #hex (3/4/6/8 hane), rgb()/hsl()/oklch() gibi renk fonksiyonu, var(--token), TARAYICININ tanıdığı düz renk adı ya da status adı; başka her şey (tanınmayan sözcük "zzz", iç içe parantez, ; taşıyan metin) sessizce yok sayılır ve status rengi kullanılır. flow alanı olan öğede currentItem içinde flow depolama şeklinde ({ ref, type }) gelir — akışta kullanma, flow kendiliğinden çalışır. Statik items dizisine null/düz metin yazılamaz (platform 500 verir); karışık veri için items\'ı {{ }} ifadesine bağla.',
|
|
2237
|
+
dateFormat: 'absolute (varsayılan) | relative ("2 gün önce", proje dilinde).',
|
|
1912
2238
|
maxCount: 'Görünür kayıt sınırı; boş/0 = hepsi. Aşıldığında Show more çıkar (showMoreText yalnız maxCount doluyken panelde görünür).',
|
|
1913
2239
|
currentItem: "Gizli prop: son tıklanan öğenin tamamı (self.currentItem). index yalnız event.data'da.",
|
|
1914
|
-
locale: 'Tarih dili; boşsa uygulama dili.',
|
|
1915
|
-
|
|
2240
|
+
locale: 'Tarih dili (yalnız tr | en); boşsa uygulama dili — ar, de gibi diller için BOŞ bırak.',
|
|
2241
|
+
showMoreText: 'Boşsa (yeni düğümde varsayılan) ekran diline göre ("Daha fazla göster"); eski kayıtlı sayfalarda yazılı "Show more" çevrilmez.',
|
|
2242
|
+
emptyText: 'items boşken basılan metin; boşsa (yeni düğümde varsayılan) ekran diline göre ("Henüz olay yok"); eski kayıtlı sayfalarda yazılı "No events yet" çevrilmez.',
|
|
2243
|
+
isClickable: 'Varsayılan kapalı. Açıkken flow\'suz ve href\'siz satır da klavyeyle odaklanır (Tab, role=button), Enter/Space clickItem yayar ve imleç el olur — panelde clickItem akışı bağlayıp klavye erişimi isteyen için.',
|
|
2244
|
+
style: 'Kök CSS özellikleri (fontFamily, fontSize, color, backgroundColor, padding, border…) çalışır; fontFamily ve color liste başlığına ve öğe başlığına, fontSize yalnız öğe başlığına İNER (liste başlığı kendi ölçüsünü taşır: &__title { fontSize }). Kökte maxHeight TEK BAŞINA kırpmaz (CSS gereği içerik taşar): kaydırmak için overflowY: auto da yaz. gap kökte etkisiz; satırlar arasına boşluk (gap, margin) bağlantı çizgisini KOPARIR çünkü çizgi satırın kendi dolgusuna göre çizilir — boşluk istiyorsan showConnector kapat ya da &__row::after top/height değerini kendin ayarla. PARÇA SÖZLÜĞÜ (&__parça): title (listenin BAŞLIĞI), row, dot, content, date, description, item-title (HER ÖĞENİN başlığı), subtitle, header (başlık+tarih satırı), avatar, more ("Show more" düğmesi), empty (boş metin), list, item (li). Durum hedefi: satırda data-status="success|warning|…" var → &__row[data-status="error"] { … }; bekleyen nokta .ng-timeline__dot--pending, bağlantısız mod .ng-timeline--no-connector, yatay mod .ng-timeline--horizontal. Bağlantı çizgisi satırın ::after\'ı (yatayda ayrıca ::before — önceki öğeye uzanan yarı); rengi için &__row::after { background } (yatayda &__row::before da yaz, yoksa çizgi iki renkli olur). :hover, :focus-visible, iç içe seçici, ::before/::after ve @media çalışır; @media içinde && yazma (geçersiz seçici üretir). Her satır bir <li> içindedir: &__row:nth-child(…), :first-child ve :last-child HER satırı eşler — dönüşümlü/zebra için &__item:nth-child(odd) &__row yaz; yatayda &__row min-width li sınırını (280px) aşar.'
|
|
1916
2245
|
}
|
|
1917
2246
|
},
|
|
1918
2247
|
timepicker: {
|
|
@@ -1940,29 +2269,43 @@ export const componentKnowledge = {
|
|
|
1940
2269
|
}
|
|
1941
2270
|
},
|
|
1942
2271
|
toast: {
|
|
1943
|
-
summary: 'Geçici bildirim TETİKLEYİCİSİ:
|
|
2272
|
+
summary: 'Geçici bildirim TETİKLEYİCİSİ: yayında hiçbir şey çizmez, isOpen true’ya çekildiğinde bir toast atar. Düğüm yine de 8px yüksekliğinde bir satır tutar (her düğümün ortak dış boşluğu; ölçüldü 2026-10-01, QA TS-007) — sıfır yer için appearance.marginType \'none\' verin.',
|
|
1944
2273
|
behavior: [
|
|
1945
2274
|
"Tetikleme isOpen'ın YÜKSELEN KENARIDIR: komponent toast'ı gösterdikten sonra isOpen'ı kendi prop'unda false'a geri yazar. Akışta setter ile true yaz, sıfırlamayı düşünme.",
|
|
1946
2275
|
'Süre kind’a göre gelir (success/info/default 4sn, warning 6sn, error 8sn, loading süresiz); duration verirsen o kazanır, isSticky ise kapanmaz.',
|
|
1947
|
-
"
|
|
2276
|
+
"Aksiyonun kendi flow'u varsa tıklamada YALNIZ o akış koşar; actionClick olayına bağlı akış kendi flow'u OLMAYAN aksiyonlarda koşar (ölçüldü 2026-10-01, QA TS-006 — ikisi birden koşmaz). keepOpen verilmedikçe tıklama toast'ı kapatır. En çok 2 düğme çizilir, fazlası sessizce atılır.",
|
|
2277
|
+
"Başlığı da içeriği de boş olan toast ATILMAZ (2026-10-01, QA TS-008): kart çıkmaz, open/close koşmaz, isOpen yine false'a döner. content yazılmamış düğüm boş sayılır — 'Toast content goes here' yalnız Studio'da bırakma anının örneğidir.",
|
|
2278
|
+
"Farklı konumlara atılan toast'lar 480px altında kenar başına tek sütunda birleşir (üstte: top-full bandı, sonra üst köşeler; altta: center, alt köşeler, sonra bottom-full bandı); geniş ekranda bant aynı kenardaki köşe yığınlarını kendi yüksekliği kadar iter (2026-10-01, QA TS-003; öncesinde yığınlar birbirini örtüyordu).",
|
|
1948
2279
|
'Toast alanını runtime her uygulamada bir kez kurar — ikinci bir toast komponenti eklemek bildirimleri ÇİFTLEMEZ, her tetikleyici kendi toast’ını atar.',
|
|
1949
2280
|
"Aynı bildirimin üst üste binmesini duplicates kapatır: ignore aynı anahtarlı toast dururken yenisini ATAR, count tek kart üstünde ×N sayıp süreyi yeniler; varsayılan allow her tetiklemede yeni kart yığar — çift tıklanan Kaydet düğmesinin çözümü budur. ATILAN tetikleme HİÇBİR olay yaymaz: o toast için open, close ve click koşmaz, yani close akışına bağladığın iş ikinci tıklamada çalışmaz.",
|
|
1950
2281
|
"Aynılık sayfadaki TÜM toast'lar arasında bakılır (anahtar dedupeKey, yazmazsan kind + title + content): iki ayrı toast düğümü aynı metni taşıyorsa biri ötekini bastırır — varsayılan içeriği bırakmak bunu kolaylaştırır, o yüzden ignore ya da count seçtiğinde dedupeKey yaz. Kuyrukta bekleyen toast da eşleşir, delay ile beklemekte olan eşleşmez.",
|
|
1951
|
-
"open olayı toast KUYRUĞA girdiğinde yayılır: delay beklenir, duplicates ile atılan ya da do-not-disturb ile bastırılan toast open yaymaz, ama aynı konumda 5 toast doluysa fazlası ekranda görünmeden de open yayar. close yükünde reason taşır ve akışta
|
|
2282
|
+
"open olayı toast KUYRUĞA girdiğinde yayılır: delay beklenir, duplicates ile atılan ya da do-not-disturb ile bastırılan toast open yaymaz, ama aynı konumda 5 toast doluysa fazlası ekranda görünmeden de open yayar. close yükünde reason taşır ve akışta event.data.reason ile okunur (self.reason da yazılır): timeout süre doldu, user kullanıcı kapattı (× düğmesi, closeOnClick tıklaması, kaydırma, Escape, aksiyon düğmesi, Clear all), programmatic koddan kapatıldı. Gecikmede bekleyen toast iptal edilirse close HİÇ yayılmaz."
|
|
1952
2283
|
],
|
|
1953
2284
|
propNotes: {
|
|
1954
|
-
isOpen: 'Setter ile true yaz → bir toast; komponent false’a geri döner.',
|
|
2285
|
+
isOpen: 'Setter ile true yaz → bir toast; komponent false’a geri döner. Şemada true KAYDEDİLİRSE toast her sayfa açılışında atılır (açılış bildirimi için geçerli bir kullanım; 2026-10-01\'den beri open olayı da koşar ve tetikleyici yeniden kullanılabilir — QA TS-002).',
|
|
1955
2286
|
kind: 'default | info | success | error | warning | loading.',
|
|
1956
2287
|
position: '9 çapa: top/bottom × left/center/right, center, top-full/bottom-full (tam genişlik bant).',
|
|
1957
2288
|
actions: '[{ text, flow, keepOpen, showCountdown }] — en çok 2 düğme.',
|
|
1958
2289
|
dedupeKey: "Aynılık ölçütü; yazılmazsa kind + title + content’ten türer ve sayfadaki bütün toast'ları kapsar. Tek başına hiçbir şey yapmaz, duplicates ile çalışır.",
|
|
1959
2290
|
duplicates: 'allow (varsayılan, her tetikleme yeni toast) · ignore (aynı anahtarlı toast dururken yeni tetikleme atılır, olayları da koşmaz) · count (tek kart üstünde ×N sayacı, süre yenilenir). Şemada allow bırakmak ayarlamamakla aynıdır: uygulama koddan başka bir strateji kurduysa o geçerli olur.',
|
|
1960
|
-
icon: "Yazılmazsan türün ikonu çizilir; boş metin (\"\") verirsen hiç ikon çizilmez. kind loading iken ikon hiç okunmaz, yerine dönen halka çizilir.",
|
|
2291
|
+
icon: "Düz metin ('star') ya da ikon seçicinin { name, color } nesnesi olabilir; color verilirse glif o renkle çizilir (2026-10-01, QA TS-001 — öncesinde nesne biçimi editörü ve toast alanını çökertiyordu). Yazılmazsan türün ikonu çizilir; boş metin (\"\") verirsen hiç ikon çizilmez. kind loading iken ikon hiç okunmaz, yerine dönen halka çizilir.",
|
|
1961
2292
|
duration: 'ms; 0 ya da boş = türün varsayılan süresi. Hiç kapanmaması için isSticky.',
|
|
1962
2293
|
priority: "Yalnız aynı konumda 5 toast dolduğunda sıra değiştirir (yüksek olan öne geçer); normal bir ekranda gözle görülür etkisi YOKTUR.",
|
|
1963
2294
|
showProgress: "Yalnız süreli toast'ta çizilir: isSticky ya da kind loading iken ilerleme çubuğu zaten yok.",
|
|
1964
2295
|
pauseOnHover: "Yalnız süreli toast'ta anlamlı: duraklatılacak bir sayaç yoksa (isSticky, loading) etkisizdir.",
|
|
1965
|
-
isHidden: 'Açıkken komponent hiç kurulmaz: toast ATILMAZ. Gizli bir tetikleyici değil, kapalı bir tetikleyicidir — isOpen true yazmak da bir şey göstermez.'
|
|
2296
|
+
isHidden: 'Açıkken komponent hiç kurulmaz: toast ATILMAZ. Gizli bir tetikleyici değil, kapalı bir tetikleyicidir — isOpen true yazmak da bir şey göstermez.',
|
|
2297
|
+
title: 'Kalın başlık satırı; uzun başlık kırılır, taşmaz. Boş bırakılabilir — ama title da content de boşsa toast atılmaz.',
|
|
2298
|
+
content: "Bildirim metni. Yazılmazsa BOŞTUR ('Toast content goes here' yalnız Studio'da bırakma anının örneğidir). Uzun metin ve boşluksuz uzun kelime kart içinde kırılır.",
|
|
2299
|
+
isSticky: 'true iken toast kendiliğinden kapanmaz ve ilerleme çubuğu çizilmez; duration yok sayılır (panelde de gizlenir).',
|
|
2300
|
+
showCloseButton: "Varsayılan true. Kapatılırsa × çizilmez; toast yine süreyle, closeOnClick'le, aksiyonla ya da odaktayken Escape ile kapanır. isSticky + showCloseButton false + aksiyonsuz bir toast fareyle kapatılamaz — birini açık bırakın.",
|
|
2301
|
+
closeOnClick: "true iken karta tıklamak click olayını yayar VE toast'ı kapatır (close, reason 'user'). false iken yalnız click yayılır. × düğmesi click yaymaz.",
|
|
2302
|
+
showCopyButton: 'Kartta kopyala düğmesi çizer: başlık + içerik panoya gider (başlık varsa ilk satırda).',
|
|
2303
|
+
allowHtml: "true iken content HTML olarak çizilir ama sıkı temizlenir: kalın/italik gibi satır içi biçim ve http(s)/mailto bağlantıları kalır (bağlantılar yeni sekmede, rel=noopener), <script>, <img>, olay öznitelikleri atılır. false iken (varsayılan) HTML düz metin olarak görünür.",
|
|
2304
|
+
delay: 'ms; toast bu kadar bekledikten sonra çıkar, open olayı da o zaman yayılır. Boş = hemen.',
|
|
2305
|
+
maxLines: 'İçeriği bu satır sayısında kırpar ve altına aç/kapa bağlantısı koyar (metni uygulama diline çevrilir). Boş = sınırsız.',
|
|
2306
|
+
variant: "soft (varsayılan, açık renkli zemin) · filled (koyu, dolu zemin, açık metin — kontrast AA: 2026-10-01'den beri koyu ton) · outlined (yüzey zemini, renkli kenar ve ikon) · minimal (nötr kenar, gölgesiz, yalnız ikon renkli). kind default ve loading renksizdir: filled onlarda soft'la aynı çizilir.",
|
|
2307
|
+
size: "sm | md (varsayılan) | lg → kart genişliği 300 / 356 / 420px, dolgu ve yazı boyu birlikte değişir. 480px altında her boyut tam genişliktir.",
|
|
2308
|
+
style: "Kart köküne uygulanır (background, border…). Parça seçicileri: '&__title', '&__content', '&__icon', '&__actions'. Tür/görünüm renklerini ezer."
|
|
1966
2309
|
}
|
|
1967
2310
|
},
|
|
1968
2311
|
// — 2026-08-27 eşleme turu: components-new dalıyla gelen 6 yeni komponent.
|
|
@@ -1976,16 +2319,22 @@ export const componentKnowledge = {
|
|
|
1976
2319
|
"Veri tek yönlü girer: record prop'u {{ }} ifadesiyle (sorgu çıktısı ya da tablonun selectedRow'u) ya da akıştaki setter ile beslenir; tıklama/seçim olayı yoktur — satır tıklaması gerekiyorsa tıklanabilir bir kapsayıcıya sar. Tek olay mount'tur (yük yok).",
|
|
1977
2320
|
"Boş nesne ({}) 'kayıt yok' sayılır ve emptyText basılır; geçerli kayıt olsa da fields boşsa (ya da tüm alanlar isHidden ise) yine boş durum çizilir. isLoading her dalı ezer ve alan başına iskelet gösterir.",
|
|
1978
2321
|
"fields[].field nokta ayraçlı iç içe yol alır (department.title, items.0.name); yol kopuksa hücre '-' basar, patlamaz. Aynı alanı iki satırda iki ayrı formatla göstermek geçerlidir (2026-09-16'dan önce sayfayı düşürüyordu).",
|
|
1979
|
-
"format: money/pertance/date/datetime/number biçimlenir, 'text' ham String basar. number dilin ayıraçlarını kullanır (tr 84.500), sayıya çevrilemezse ham metne düşer; money
|
|
2322
|
+
"format: money/pertance/date/datetime/number biçimlenir, 'text' ham String basar. number dilin ayıraçlarını kullanır (tr 84.500), sayıya çevrilemezse ham metne düşer; money fields[].currency'den (ISO 4217: 'USD', 'EUR') para birimini alır, boş ya da geçersiz değer TRY'dir; pertance (yazımı böyle) <=1'i oran, >1'i yüzde sayar; geçersiz tarih ham metne düşer. boolean değeri ✓/✗ işaretine çevirir — yalnız false/0/'false'/'0' hayırdır, tanınmayan dolu metin evettir (table'ın 'switch' kolon tipinin detailview'daki adı 'boolean').",
|
|
1980
2323
|
"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.",
|
|
1981
|
-
"columns 1-4'tür ama sınırı zorlayan tek yüzey kanvas toolbar'ıdır: sağ panel büyük değeri uyarı ikonuyla KABUL EDER ve öyle kaydeder, runtime yine 1-4'e kırpar ve kesirli değeri tam sayıya indirir — yani 8 yazılmış bir sayfa 4 kolon çizer. link formatı görünen metni ham bırakır ama href'i düzeltir: şemasız değer https:// alır, e-posta gibi duran değer mailto: olur, '/...' ve '#...' olduğu gibi kalır; BEYAZ LİSTE dışındaki şema (javascript:, data:…) hiç bağlantı olmaz, değer düz metin basılır."
|
|
2324
|
+
"columns 1-4'tür ama sınırı zorlayan tek yüzey kanvas toolbar'ıdır: sağ panel büyük değeri uyarı ikonuyla KABUL EDER ve öyle kaydeder, runtime yine 1-4'e kırpar ve kesirli değeri tam sayıya indirir — yani 8 yazılmış bir sayfa 4 kolon çizer. link formatı görünen metni ham bırakır ama href'i düzeltir: şemasız değer https:// alır, e-posta gibi duran değer mailto: olur, '/...' ve '#...' olduğu gibi kalır; BEYAZ LİSTE dışındaki şema (javascript:, data:…) hiç bağlantı olmaz, değer düz metin basılır.",
|
|
2325
|
+
"style parçaları: &__grid (ızgara), &__item (alan satırı), &__label, &__value, &__empty (boş durum) ve biçim işaretleri &__badge, &__tag, &__link, &__boolean, &__image ayrı ayrı hedeflenir. Rozetin değere göre rengi için fields[].colorMap kullan (aşağıda), style ile değer→renk yazılmaz. tag kendi açık zemini ve kendi yazı jetonuyla çizilir (kökte color vermek onu okunmaz yapmaz); koyu ya da gradyan zeminde istersen &__tag ile boya.",
|
|
2326
|
+
"columns bir ÜST SINIRDIR: kap her kolona en az 8rem (labelPosition left iken 14rem) bırakamıyorsa kolon sayısı kendiliğinden düşer — 375px'te columns 4 iki kolon (left etiketle tek kolon) çizer, 628px ve üstünde aynen kalır. Dar ekran için ayrıca @media yazmana gerek yok.",
|
|
2327
|
+
"badge rengi değere göre verilir: fields[].colorMap = [{ value: 'active', color: 'success' }, { value: 'pending', color: 'warning' }, { value: 'failed', color: 'error' }]. Tonlu rozet tonun tintli zemininde ve tonla kökten devralınan rengin karışımı yazıyla çizilir (iki temada da ≥ 5.7 kontrast ölçüldü). Sınır: info tonu açık temada neredeyse beyazdır, hap görünmez — durum ayrımı için success/warning/error tercih et.",
|
|
2328
|
+
"tarih ve saat tr/en dışı dilde (ar, de…) o dilin Intl biçimiyle yazılır (ar: 14 مارس 2022); tr ve en date-fns desenleriyle aynen (14 Mar 2022 / Mar 14, 2022). Eskiden bu diller Türkçe ay adına düşüyordu.",
|
|
2329
|
+
"mount ilk görünür olduğunda BİR kez yayılır: isHidden açık açılan sayfada çıkmaz, gösterilince çıkar; sonradan gizleyip göstermek yeniden yaymaz."
|
|
1982
2330
|
],
|
|
1983
2331
|
propNotes: {
|
|
1984
2332
|
record: 'Gösterilecek TEK kayıt (nesne); akıştan beslenecekse setter hedefi budur. Boş nesne = boş durum.',
|
|
1985
|
-
fields: "[{ label, field, format, icon, isHidden }] — field boş satırlar elenir, isHidden satır çizilmez (table kolonlarındaki isHidden ile aynı iş), label boşsa field kullanılır, icon ETİKETİN yanına çizilir.",
|
|
2333
|
+
fields: "[{ label, field, format, currency, colorMap, icon, isHidden }] — field boş satırlar elenir, isHidden satır çizilmez (table kolonlarındaki isHidden ile aynı iş), label boşsa field kullanılır, icon ETİKETİN yanına çizilir. colorMap: [{ value, color }] YALNIZ badge biçiminde okunur — value alanın değeriyle (metin olarak, kırpılmış, büyük/küçük harfe DUYARLI) eşleşir, color primary | info | success | warning | error tonlarından biridir (ham renk kabul edilmez, tema jetonuna çözülür); eşleşmeyen değer eski vurgu renginde kalır; tanınan ton taşımayan (color boş ya da geçersiz) satır atlanır, aynı değerli sonraki geçerli satır kazanır; tag biçimi tonlanmaz.",
|
|
1986
2334
|
labelPosition: "top (varsayılan) | left — left'te etiket sütunu minmax(96px, %38) ile ayrılır.",
|
|
1987
|
-
columns: "Izgara kolon
|
|
1988
|
-
emptyText: "Kayıt ya da geçerli alan yokken basılır; boşsa '—'."
|
|
2335
|
+
columns: "Izgara kolon sayısı ÜST SINIRI, 1-4. Kanvas toolbar'ı sınıra çeker; sağ panel büyük değeri uyarı ikonuyla kabul eder, runtime yine 1-4'e kırpar. Dar kapta kolon sayısı kendiliğinden düşer (her kolona en az 8rem, left etiketle 14rem).",
|
|
2336
|
+
emptyText: "Kayıt ya da geçerli alan yokken basılır; boşsa '—'.",
|
|
2337
|
+
style: "Kök özellikler + &__grid · &__item · &__label · &__value · &__empty · &__badge · &__tag · &__link · &__boolean · &__image. &__label::after, @media, :hover, :nth-child, & a:hover çalışır."
|
|
1989
2338
|
}
|
|
1990
2339
|
},
|
|
1991
2340
|
eventcalendar: {
|
|
@@ -2001,9 +2350,14 @@ export const componentKnowledge = {
|
|
|
2001
2350
|
"Tüm-gün kararı: satırın allDayField (varsayılan 'allDay') bayrağı true ise her zaman tüm gün; false ise yalnız aralıkta saat bilgisi varsa saatli sayılır (tarih-yalnız / 00:00→00:00 satır false'la da şeritte kalır, görünmez olmaz); değer true/false, 'true'/'false', 1/0; bayrak yoksa süresi >=24 saat ya da 00:00→00:00 olan etkinlik tüm gün sayılır. Tüm gün etkinlik 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).",
|
|
2002
2351
|
"eventMove ve eventCreate tarihleri iki biçimdedir: tüm-gün aralık yerel 'yyyy-MM-dd', saatli aralık ISO-Z (toISOString) — uca yazarken ikisini de karşıla.",
|
|
2003
2352
|
"defaultDate ve defaultView DEĞİŞTİKÇE uygulanır (panelde ya da akıştan yazınca takvim o tarihe/görünüme gider, olay yaymaz); aynı değerle tekrar gelen render kullanıcının gezindiği yeri sıfırlamaz — aynı tarihe tekrar gitmek için değerin değişmesi gerekir.",
|
|
2004
|
-
"isLoading: takvim soluklaşır, üstte yükleyici; etkinlik tıklaması (Enter dahil), gün/slot tıklaması, aralık seçimi, taşıma ve boyutlandırma OLAY YAYMAZ. Gezinme okları ve görünüm düğmeleri açık kalır (monthChange/viewChange yayılır) — ay değiştirirken yeniden çekme sürebilir.",
|
|
2353
|
+
"isLoading: takvim soluklaşır, üstte yükleyici; etkinlik tıklaması (Enter dahil), gün/slot tıklaması, aralık seçimi, taşıma ve boyutlandırma OLAY YAYMAZ. Gezinme okları ve görünüm düğmeleri açık kalır (monthChange/viewChange yayılır) — ay değiştirirken yeniden çekme sürebilir. Kök aria-busy=true taşır.",
|
|
2005
2354
|
"Hafta başlangıcı dile bağlıdır: en Pazar, diğer her dil (tr dahil) Pazartesi — ay ızgarası, gün başlıkları ve hafta görünümü aynı kuralı izler; locale boşsa uygulama dili. startHour/endHour saat penceresini belirler (0–23 / 1–24, endHour en az startHour+1'e kırpılır); pencereye kısmen taşan blok en az 15 dakikalık yükseklikle çizilir.",
|
|
2006
|
-
"Etkinlik her görünümde <elementId>__event-<id> data-element-id'si taşır; bırakma hedefleri ay hücresi ve hafta/gün kolonu <elementId>__day-<yyyy-MM-dd>, tüm gün hücresi __allday-<yyyy-MM-dd>, saat dilimi __slot-<yyyy-MM-dd>T<HH> (YEREL tarih). eventClick 'click' ile, eventMove page_screenshot actions 'drag' (target etkinlik, to gün/slot) ile doğrulanır; slota bırakma o saatin ortasına düşer ve 30 dakikaya yuvarlanır. Çok günlü etkinlik aynı kimliği her gününde taşır, hedef ilk eşleşmedir."
|
|
2355
|
+
"Etkinlik her görünümde <elementId>__event-<id> data-element-id'si taşır; bırakma hedefleri ay hücresi ve hafta/gün kolonu <elementId>__day-<yyyy-MM-dd>, tüm gün hücresi __allday-<yyyy-MM-dd>, saat dilimi __slot-<yyyy-MM-dd>T<HH> (YEREL tarih). eventClick 'click' ile, eventMove page_screenshot actions 'drag' (target etkinlik, to gün/slot) ile doğrulanır; slota bırakma o saatin ortasına düşer ve 30 dakikaya yuvarlanır. Çok günlü etkinlik aynı kimliği her gününde taşır, hedef ilk eşleşmedir.",
|
|
2356
|
+
"Klavye ve ekran okuyucu: ay hücresi odaklanmaz — içindeki gün numarası düğmesi odaklanır (adı 'tarih, n etkinlik'; Enter/Space isCreatable açıkken eventCreate, kapalıyken dateClick). Etkinlik (çip, blok, ajanda satırı) role=button'dır; Enter VE Space eventClick yayar, olay hücreye sızmaz (hücrenin dateClick/eventCreate'i ayrıca tetiklenmez). Saat dilimi düğmeleri yalnız isCreatable açıkken odaklanır ve tarih+saat adı taşır; bugünün hücresi aria-current=date, görünüm düğmeleri 'Takvim görünümü' adlı tablist içinde, odak halkası 2px. Klavyeyle taşıma/boyutlandırma ve aralık seçimi YOKTUR — onlar yalnız fare/kalem.",
|
|
2357
|
+
"Dil: Bugün, görünüm adları, 'Etkinlik yok', 'Tüm gün' ve ok adları tr/en/ar sözlüğünden gelir; ay/gün adları da aynı üç dilde (başka dil İngilizceye düşer, Türkçeye değil). RTL'de çip şeridi ve ok yönü mantıksaldır (şerit sağda, önceki oku sağa bakar), çakışan bloklar sağdan dizilir.",
|
|
2358
|
+
"Etkinlik rengi her zeminde okunur: yazı rengi etkinlik renginin ~%35'i + tema yazı renginin karışımıdır (açık sarı, beyaz, 'info' dahil kontrast ≥ 4.5, açık ve koyu tema); kenar şeridi ve zemin tonu ham renktir. Yani ham rengi yazıda aynen bekleme — renk kimliğini şerit ve zemin taşır.",
|
|
2359
|
+
"Aynı kimlikli iki satır ÇÖKERTMEZ: ikisi de çizilir, yükte id aynen gider; iyimser taşıma kopyaları ayrı tutar (sürüklenen kopya kendi anahtarıyla kayar), ama data-element-id'leri aynıdır ve page_screenshot eylemi ilk eşleşmeye gider — id'leri benzersiz tut. Takvimde olmayan tarih ('2026-02-30', saatli '2026-02-30T10:00' dahil) satırı düşürür, defaultDate'te bugüne düşer (sessizce ertesi aya kaymaz); sayıya çevrilemeyen, boş ya da null startHour/endHour 8–18'e, maxVisibleEvents 3'e döner.",
|
|
2360
|
+
"Dar ekranda başlık ve düğme grubu iki satıra bölünür (başlık kırpılmaz); tüm-gün şeridi ~8em'de kayar, çok sayıda tüm-gün etkinlik saat ızgarasını ezmez; 8+ çakışan blok dar sütunda yalnız renkli şerit gösterir — gün görünümüne geç."
|
|
2007
2361
|
],
|
|
2008
2362
|
propNotes: {
|
|
2009
2363
|
rows: 'Etkinlik satırları; monthChange/viewChange akışlarının setter hedefi. Alan adları titleField/startField/endField/colorField/idField/allDayField ile çözülür (nokta ayraçlı iç içe yol çalışır; boşsa title/start/end/color/id/allDay).',
|
|
@@ -2015,7 +2369,9 @@ export const componentKnowledge = {
|
|
|
2015
2369
|
agendaDays: 'Ajanda listesinin gün sayısı (varsayılan 14); boş günler listelenmez, oklar haftalık kayar. Panelde yalnız ajandaya ulaşılabiliyorsa görünür (defaultView agenda ya da showViewSwitcher açık).',
|
|
2016
2370
|
isEditable: 'Sürükleyerek taşıma + hafta/gün kenarından boyutlandırma; ikisi de eventMove.',
|
|
2017
2371
|
isCreatable: 'Tıklama ve sürükleyerek aralık seçimiyle eventCreate; açıkken ay görünümünde dateClick YAYILMAZ.',
|
|
2018
|
-
startHour: 'Hafta/gün görünümünün ilk saati (0–23, varsayılan 8); endHour (1–24, varsayılan 18) en az startHour+1 olacak biçimde kırpılır.'
|
|
2372
|
+
startHour: 'Hafta/gün görünümünün ilk saati (0–23, varsayılan 8); endHour (1–24, varsayılan 18) en az startHour+1 olacak biçimde kırpılır.',
|
|
2373
|
+
locale: "tr | en | boş (uygulama dili). Etiketler ve tarih adları tr/en/ar için yerelleşir; başka dil kodu (de, fr…) İngilizce metinle çalışır, hafta başı Pazartesi kalır.",
|
|
2374
|
+
style: "Kök (CSS özellikleri doğrudan style'da) takvim kabıdır: backgroundColor · padding · border · borderRadius · color · fontFamily · fontSize içeri MİRAS iner (parçaların boyutu köke göre orantılıdır: kök 20px ise çip ≈ 15.8px; tek parçayı değiştirmek için ilgili parçaya yaz); maxHeight kökü kırpar ve ızgara İÇİNDE kayar. Parçalar: &__header · &__title · &__nav · &__views · &__view-button · &__nav-button · &__weekdays · &__weekday · &__grid · &__day · &__day-number · &__chips · &__chip · &__more · &__timegrid · &__timegrid-header · &__timegrid-day · &__allday · &__allday-cell · &__gutter · &__timegrid-body · &__hours · &__hour-label · &__day-column · &__slot · &__block · &__resize · &__agenda · &__agenda-group · &__agenda-day · &__agenda-row · &__agenda-time · &__agenda-title · &__agenda-empty · &__loader. Durumlar iç içe yazılır: '&__chip': { '&:hover': {…}, '&:focus-visible': {…} }, aktif görünüm düğmesi '&__view-button[aria-selected=\"true\"]', bugünün hücresi '&__day--today' ya da gün numarası '&__day-number[aria-current=\"date\"]'. Etkinlik rengi --chip-color değişkenidir: color-mix(in srgb, var(--chip-color) 20%, #fff) yazılabilir. @media kuralı iç parçaya tek '&' ile bağlanmaz — '@media (max-width: 500px)': { '&&': { '& &__title': {…} } } biçiminde yaz. Parça seçicileri 2026-10-01'e kadar yalnız &__header için çalışıyordu; eski notlar '& .ng-eventcalendar__chip' yazıyorsa o biçim de çalışır ama gereksizdir."
|
|
2019
2375
|
}
|
|
2020
2376
|
},
|
|
2021
2377
|
importwizard: {
|
|
@@ -2030,12 +2386,21 @@ export const componentKnowledge = {
|
|
|
2030
2386
|
"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.",
|
|
2031
2387
|
"Geri düğmesi durumu KORUR (parsed/mapping silinmez); ✕ düğmesi (cancel olayı) her şeyi sıfırlar — rows/errors/fileName/total/currentStep düğümde de boşaltılır.",
|
|
2032
2388
|
"change olayı her adım değişiminde yayılır (dosya okundu → 1, önizleme → 2, geri → 1/0); iptal change yaymaz, cancel yayar.",
|
|
2033
|
-
"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."
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2389
|
+
"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.",
|
|
2390
|
+
"Reddedilen dosya (tür, boyut, boş dosya, yalnız başlıklı dosya, okunamayan xlsx) hiçbir olay yaymaz ve adımı, önceki dosya adını DEĞİŞTİRMEZ: neden yalnız bileşenin içinde drop alanının altındaki uyarıdır (role=alert). Sayfa akışı reddi göremez; boş dosya ('Dosya boş') ve yalnız başlıklı dosya ('başlıktan sonra veri satırı yok') artık ayrı iletiyle reddedilir, eskiden '0 satır' diye eşlemeye geçiyordu. Ayrıştırma yalnız UTF-8'dir: windows-1254 dosyada okunan metinde yedek karakter (U+FFFD) kalır; kolon eşleme adımında engellemeyen bir uyarı çıkar ('Dosya UTF-8 değil gibi görünüyor') ve içe aktarma yine yapılabilir — harfleri düzeltmek için dosyayı UTF-8 kaydedip yeniden yüklemek gerekir.",
|
|
2391
|
+
"Hepsi hatalı dosyada (temiz satır 0) İçe aktar (0) ETKİN kalır: complete rows: [] ve dolu errors ile yayılır (hatalı satırlar akışa ulaşır; akış boş rows'u döngüde 0 kez işler). Hem temiz hem hatasız satır yoksa (başlıksız/boş dosya zaten reddedilir) düğme kilitlidir.",
|
|
2392
|
+
"complete sonrası sihirbaz varsayılan olarak 3. adımda kalır ve İçe aktar etkin durur (aynı dosya ikinci kez aktarılabilir); currentStep salt okunurdur. resetAfterComplete: true ise complete yayıldıktan sonra sihirbaz ilk adıma döner: rows/errors/total/fileName çıktıları düğümde KALIR (akış okumaya devam eder), cancel yayılmaz, ama change { currentStep: 0, fileName: tamamlanan dosya, rowCount: 0 } yayılır (currentStep düğümde bayat kalmasın). Akış sürerken yine isDisabled (ya da isLoading) ile sar, bitince kullanıcıya sonucu ayrı bir metinle göster.",
|
|
2393
|
+
"Geri ile dosya adımına dönünce ayrıştırılmış dosya KAYBOLMAZ ve artık görünür: bırakma alanının üstünde 'dosya adı — N satır' satırı ve 'Bu dosyayla devam et' düğmesi çıkar (eşlemeye döner, eşleme korunur, change currentStep 1 yayılır). Yeni geçerli dosya bırakılırsa onun yerine geçer; reddedilen dosya satırı bozmaz.",
|
|
2394
|
+
"Önizleme tablosu yalnız ilk 10 temiz satırı gösterir (10'dan fazlaysa 'İlk 10 satır gösteriliyor' notu çıkar) ve hata listesi ilk 20 satırı ('… +N' ile); complete yükünde tam listeler vardır. errors[].message makine metnidir (code ile aynı: 'required' ya da 'maxRows (N)') — kullanıcıya okunur metin göstermek için code'dan türet; rowIndex dosya satır numarasıdır (başlık 1, ilk veri satırı 2).",
|
|
2395
|
+
"Metin prop'larında (uploadText, mapText, previewText, importText, backText) {{ }} yalnız code tipinde çözülür; statik değerde ham yazılır. previewText hem 3. adım başlığıdır hem Önizleme düğmesinin metni, mapText 2. adım başlığı, uploadText bırakma alanı metni (1. adım başlığı da dil sözlüğünden gelir). Boş bırakılırsa metinler uygulama diline göre tr/en/ar çizilir.",
|
|
2396
|
+
"Erişilebilirlik: her eşleme kutusunun adı hedef alanın etiketidir, ✕ düğmesi 'İçe aktarmayı iptal et' adını taşır, aktif adım aria-current='step' taşır, uyarılar role=alert/status ile duyurulur, isLoading kökte aria-busy yazar ve adım değişince odak yeni adımın ilk kullanılabilir öğesine gider. isDisabled görünümü yalnız soluklaşmadır (bırakma alanı 0.6, düğme ve kutular 0.5; ekran okuyucuya aria-disabled ve pasif öğeler)."
|
|
2397
|
+
],
|
|
2398
|
+
propNotes: {
|
|
2399
|
+
style: "Kök (CSS özellikleri doğrudan style'da) sihirbaz kabıdır: backgroundColor · padding · border · borderRadius · boxShadow · gap · maxHeight (kökü kırpar, gövde İÇİNDE kayar) · fontSize · fontFamily · color. fontSize ve color içerideki metinlere İNER (adım başlıkları, dosya satırı, eşleme ve önizleme tabloları, uyarı, hata listesi kökün boyutuna göre orantılıdır; ikincil metin kök renginin %75'idir); düğmeler ve eşleme kutuları kendi yüzeyini taşır, rengi inmez. Şemada bildirilen altı parça: &__steps (adım şeridi) · &__drop (bırakma alanı, yalnız 1. adım) · &__mapping (eşleme tablosu) · &__preview (önizleme kabı) · &__errors (hata listesi) · &__button (Geri, ✕, Önizleme, İçe aktar). Geri kalan parçalar için iç içe SINIF seçicisi yaz — '&__step-marker' gibi yazım kabul edilir ama ETKİSİZDİR: '& .ng-importwizard__step' (adım öğesi) · '& .ng-importwizard__step--active' (aktif adım; aria-current seçicisi de çalışır: '& .ng-importwizard__step[aria-current=\"step\"]') · '& .ng-importwizard__step--done' · '& .ng-importwizard__step-marker' · '& .ng-importwizard__file' (dosya/sayı satırı) · '& .ng-importwizard__note' (önizleme notu) · '& .ng-importwizard__resume' (geri dönünce yüklü dosya satırı) · '& .ng-importwizard__warning' · '& .ng-importwizard__req' (zorunlu yıldızı) · '& .ng-importwizard__error-count' · '& .ng-importwizard__nav' (düğme satırı) · '& .ng-importwizard__body'. Birincil düğme: '&__button.ng-importwizard__button--primary'. Durumlar: '&__button': { '&:hover': {…}, '&:disabled': {…}, '&:focus-visible': {…} }, '&__drop:focus-visible'. @media kuralı iç parçaya tek '&' ile bağlanmaz — '@media (max-width: 480px)': { '&&': { '&__steps': {…} } } biçiminde yaz. Koyu zeminde kontrast için sabit renkli '& .ng-importwizard__req' ve '& .ng-importwizard__error-count' ayrıca yazılır; $preset anahtarı kabul edilir ama etkisizdir.",
|
|
2400
|
+
targetFields: '[{ label, field, required }] — hedef şema; field boş satırlar ve TEKRARLI field adının ikinci satırı elenir, otomatik eşleme label/field üzerinden yürür. MCP ile düğüm eklerken HER ZAMAN yaz: varsayılan dört alan yalnız panelden bırakınca kopyalanır; yazılmayan ya da boş dizi olan düğmede eşleme tablosu boştur, Önizleme kilitli kalır ve "Hedef alan tanımlı değil" uyarısı çıkar.',
|
|
2037
2401
|
maxRows: '0 = sınırsız; aşan TEMİZ satırlar hata kaydına dönüşür.',
|
|
2038
|
-
maxFileSize: 'MB cinsinden dosya sınırı; 0 = sınırsız. Aşan dosya hiç okunmaz, uyarı çizilir.',
|
|
2402
|
+
maxFileSize: 'MB cinsinden dosya sınırı; 0 = sınırsız; kesirli değer geçerlidir (0.5 = yarım MB, eskiden 0 gibi sınırsız sayılıyordu). Aşan dosya hiç okunmaz, uyarı çizilir.',
|
|
2403
|
+
resetAfterComplete: "Varsayılan kapalı. Açıkken complete yayıldıktan sonra sihirbaz ilk adıma döner (rows/errors/total/fileName düğümde KALIR, cancel yayılmaz, change { currentStep: 0, … } yayılır). Kayıtlı sayfaların davranışı kapalıyken değişmez.",
|
|
2039
2404
|
isDisabled: 'Dosya seçimi, sürükle-bırak, eşleme kutuları ve bütün düğmeler kilitlenir; sihirbaz bulunduğu adımda durur.',
|
|
2040
2405
|
isLoading: "Gövdeyi soluklaştırır ama düğmeleri kilitlemez; complete akışı sürerken setter ile true yaz. Akış boyunca tıklamayı da engellemek için isDisabled kullan.",
|
|
2041
2406
|
currentStep: 'Salt OKUNUR çıktı (0 dosya, 1 eşleme, 2 önizleme); change ve cancel geri yazar, yazmak sihirbazı taşımaz.',
|
|
@@ -2049,26 +2414,32 @@ export const componentKnowledge = {
|
|
|
2049
2414
|
summary: 'Satırları durum kolonlarında sürüklenebilir kart olarak dizen pano; taşıma (cardMove), ekleme isteği (cardAdd) ve silme isteği (cardRemove) akışa bildirilir, kalıcılık akışın işidir.',
|
|
2050
2415
|
behavior: [
|
|
2051
2416
|
"cardMove/cardClick/cardAdd/cardRemove 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 / .column ile okunur.",
|
|
2052
|
-
"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.",
|
|
2417
|
+
"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 ya da isLoading kapandığı anda eski kolonuna döner.",
|
|
2053
2418
|
"Ekleme ve silme İYİMSER DEĞİLDİR: isAddable kolon altına '+ addText' düğmesi koyar ve yalnız cardAdd { column } yayar; isRemovable karta × düğmesi koyar ve yalnız cardRemove { id, row, column } yayar (cardClick yaymaz). Kart ancak akış satırı yazıp/silip rows'u tazeleyince eklenir/kaybolur — silmeden önce onay sormak akışın elindedir.",
|
|
2054
|
-
"Kolon eşleşmesi columns[].value ile TAM string eşitliğidir; sayı value metne çevrilir (2 ile '2' eşleşir). Eşleşmeyen satır ilk kolona değil 'atanmamış' kuyruğuna düşer (kesikli kenarlık; yalnız doluyken çizilir, başlığı unassignedText, ekleme düğmesi yok). Aynı value'lu ikinci kolon ve value'su boş kolon çizilmez.",
|
|
2419
|
+
"Kolon eşleşmesi columns[].value ile TAM string eşitliğidir; sayı value metne çevrilir (2 ile '2' eşleşir). Eşleşmeyen satır ilk kolona değil 'atanmamış' kuyruğuna düşer (kesikli kenarlık; yalnız doluyken çizilir, başlığı unassignedText, boşsa uygulama diline göre 'Atanmamış' / 'Unassigned' / 'غير مُسنَد', ekleme düğmesi yok). Aynı value'lu ikinci kolon ve value'su boş kolon çizilmez.",
|
|
2055
2420
|
"emptyText iki yerde çizilir: kartı olmayan her kolonun içinde (yalnız doluysa) ve hiç kolon yokken panonun yerinde (boşsa '—').",
|
|
2056
2421
|
"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.",
|
|
2057
2422
|
"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.",
|
|
2058
|
-
"Kart iki kiptedir: cardFields BOŞSA sabit şablon — titleField + subtitleField; cardFields DOLUYSA her satır bir alanı (iç içe yol) etiketiyle title/subtitle/meta/badge yuvasına ve text/number/date/datetime/money/pertance biçimine yerleştirir (biçim table/detailview ile ortak, dili locale ya da boşsa uygulama dili). Baş harf rozeti (showAvatar, varsayılan açık) İKİ kipte de çizilir ve harfini her zaman titleField'dan alır — cardFields kullanıp title alanı olmayan satırlarda rozet '?' olur: titleField'ı eşle ya da showAvatar:false yaz. Resim avatarı ve serbest component şablonu yoktur. Renk karta sol
|
|
2059
|
-
"
|
|
2060
|
-
"
|
|
2423
|
+
"Kart iki kiptedir: cardFields BOŞSA sabit şablon — titleField + subtitleField; cardFields DOLUYSA her satır bir alanı (iç içe yol) etiketiyle title/subtitle/meta/badge yuvasına ve text/number/date/datetime/money/pertance biçimine yerleştirir (biçim table/detailview ile ortak, dili locale ya da boşsa uygulama dili). Baş harf rozeti (showAvatar, varsayılan açık) İKİ kipte de çizilir ve harfini her zaman titleField'dan alır — cardFields kullanıp title alanı olmayan satırlarda rozet '?' olur: titleField'ı eşle ya da showAvatar:false yaz. Resim avatarı ve serbest component şablonu yoktur. Renk karta BAŞLANGIÇ kenarı şeridi (LTR'de sol, RTL'de sağ; atanmamış kuyruktaki kartlar dahil), kolona üst şerit olarak iner (ham CSS, semantik ad ya da token; tanınmayan değer sessizce birincil renge düşer). Baş harf rozeti ilk KARAKTERİ (emoji dahil) etkin dilin büyük harf kuralıyla yazar (tr: i→İ; diğer diller: i→I).",
|
|
2424
|
+
"Erişilebilirlik: her kolon role='group' ve aria-label=kolon etiketi taşır (atanmamış kuyruk: unassignedText, boşsa dile göre 'Atanmamış'). Odaklanan öğe kartın İÇİNDEKİ gövdedir (role='button', tabindex=0; kartın kendisi odaklanmaz) ve × düğmesi gövdenin KARDEŞİdir — iç içe etkileşimli öğe yoktur; Enter ve Space cardClick yayar, odakta 2px vurgu halkası çizilir. Avatar harfi ekran okuyucudan gizlidir. ekleme düğmesinin metni (addText boşsa) ile × düğmesinin aria-label/title'ı uygulama diline (locale boşsa) göre tr/en/ar çizilir.",
|
|
2425
|
+
"Klavyeyle taşıma (2026-10-01): odaktaki kartta Shift + Sol/Sağ ok kartı bitişik kolona taşır ve sürüklemeyle AYNI cardMove { id, row, from, to } yükünü yayar (iyimser katman da aynı). Ok GÖRSEL yöndür: sağdan sola yazılan panoda Shift+Sağ bir ÖNCEKİ kolona gider. Atanmamış kuyruk kolonların SONUNDA çizilir: kuyruktaki kart yalnız geri adımla (LTR'de Shift+Sol) SON kolona alınır, ileri adım yoktur; uçlarda hareket olmaz. Taşıma sonrası odak kartta kalır ve sonuç canlı bölgeye (role='status', aria-live='polite') '<başlık> kartı <kolon> kolonuna taşındı' olarak yazılır (tr/en/ar). Gövde aria-keyshortcuts='Shift+ArrowLeft Shift+ArrowRight' taşır; isDraggable:false ya da isLoading:true iken taşıma ve bu öznitelik YOKTUR. Alt/Ctrl/Meta ile birlikte ok tuşları taşıma sayılmaz.",
|
|
2426
|
+
"Uzun metin: kolon başlığı, kart başlığı ve alt başlığı, rozet ve ekleme düğmesi tek satırda ELİPSLE kesilir (başlıkta title tam metni taşır); meta öğeleri, kolon içi emptyText ve atanmamış metni satır kaydırır. Sayaç sağda kalır, uzun etiket onu itmez.",
|
|
2427
|
+
"Taşıma KALICILANMAZSA (akış hata verir, yazma reddedilir): iyimser katman iki durumda sıfırlanır — rows'un (id, kolon) imzası değişince ve isLoading true → false dönünce. Kalıcılama akışını isLoading true / false ile sar: yazma başarısız olup aynı veri yeniden okunsa bile (imza değişmez) kart yükleme kapanınca gerçek kolonuna döner; başarılı yazmada kart zaten yeni kolondadır. isLoading kullanmıyorsan geri almanın yolu hata dalında rows'u önce boş diziye, sonra gerçek listeye yazmaktır (iki ardışık yazma imzayı değiştirir). DİKKAT: yükleme bayrağını rows tazelenmeden ÖNCE kapatan bir akış kartı bir an eski kolonunda gösterir.",
|
|
2428
|
+
"Sürükleme yerel HTML5 DnD'dir; klavye yolu Shift+ok'tur (yukarı). isLoading:true iken sürükleme, klavyeyle taşıma, kart tıklaması, ekleme ve silme kilitlenir, hiçbir olay yayılmaz; kök aria-busy taşır, kart gövdeleri tabindex -1 + aria-disabled olur (klavye odağına girmez), ekleme düğmesi pasif, × aria-disabled'dır — yükleme bayrağını her dalda false'a döndür.",
|
|
2429
|
+
"Kart <elementId>__card-<id>, kolon <elementId>__col-<value> data-element-id'si taşır (id = idField değeri; idField yoksa ya da değeri boşsa id 'card-<sıra>' olur, yani adres '__card-card-<sıra>'; atanmamış kuyruk bölümünün, ekleme ve × düğmelerinin kimliği YOKTUR — onlar için sayfa adresi page_screenshot actions ile verilemez): cardClick page_screenshot actions 'click' ile, cardMove 'drag' (target kart, to kolon) ile uçtan uca doğrulanır — actionsReport flowRuns/requests taşımanın akışı gerçekten koşturduğunu gösterir."
|
|
2061
2430
|
],
|
|
2062
2431
|
propNotes: {
|
|
2063
2432
|
rows: 'Kart satırları; alan adları columnField/titleField/subtitleField/idField/colorField ile çözülür (boşsa column/title/subtitle/id/color; nokta ayraçlı iç içe yol çalışır).',
|
|
2064
2433
|
columns: "[{ label, value, color, wipLimit }] — value boş ya da yinelenen kolonlar elenir (ilki kalır); value satır eşleşmesinin anahtarıdır, sayı olabilir.",
|
|
2065
|
-
cardFields: "[{ field, label, slot: title|subtitle|meta|badge, format: text|number|date|datetime|money|pertance }] — boş dizi sabit kartı korur; alanı ya da değeri boş satır atlanır, slot'suz alan meta'ya düşer.",
|
|
2434
|
+
cardFields: "[{ field, label, slot: title|subtitle|meta|badge, format: text|number|date|datetime|money|pertance, currency }] — boş dizi sabit kartı korur; alanı ya da değeri boş satır atlanır, slot'suz alan meta'ya düşer. currency yalnız money biçiminde okunur: ISO 4217 kodu ('USD', 'EUR'; büyük/küçük harf fark etmez); boş ya da geçersiz değer TRY'ye düşer (₺, eski davranış). Simgenin yeri ve ayıraçlar locale'e göre kalır ($1,250.00 en · €1.250,00 tr).",
|
|
2435
|
+
unassignedText: "Atanmamış kuyruğunun başlığı; boşsa uygulama diline göre 'Atanmamış' / 'Unassigned' / 'غير مُسنَد' (eskiden '?' idi). Kuyruk yalnız bilinmeyen kolonlu kart varken çizilir.",
|
|
2066
2436
|
emptyText: "Kartsız kolonun içindeki metin (boşsa hiçbir şey) ve kolon yokken pano metni (boşsa '—').",
|
|
2067
|
-
addText: "Ekleme düğmesinin metni ('+ ' önekiyle); boşsa 'Add card'. Yalnız isAddable açıkken panelde görünür.",
|
|
2437
|
+
addText: "Ekleme düğmesinin metni ('+ ' önekiyle); boşsa uygulama diline göre 'Kart ekle' / 'Add card' / 'إضافة بطاقة'. Yalnız isAddable açıkken panelde görünür.",
|
|
2068
2438
|
isAddable: 'Varsayılan kapalı; açınca her kolonun altında ekleme düğmesi, basınca cardAdd { column }.',
|
|
2069
|
-
isRemovable: 'Varsayılan kapalı; açınca her kartın
|
|
2439
|
+
isRemovable: 'Varsayılan kapalı; açınca her kartın başlangıç-karşıtı üst köşesinde (LTR sağ, RTL sol) × düğmesi, basınca cardRemove { id, row, column }. Erişilebilir adı uygulama diline göre yazılır; isLoading iken pasiftir.',
|
|
2070
2440
|
isDraggable: 'Varsayılan açık; kapatınca taşıma kapanır (kart tıklaması, ekleme ve silme bağımsızdır).',
|
|
2071
|
-
locale: "cardFields'in money/date biçim dili; boşsa uygulama dili."
|
|
2441
|
+
locale: "cardFields'in money/date/number biçim dili, baş harf rozetinin büyük harf kuralı ve varsayılan ekleme/silme metinleri (tr/en/ar); boşsa uygulama dili. Para birimi locale'den değil cardFields[].currency'den gelir (boşsa ₺).",
|
|
2442
|
+
style: "Kök (CSS özellikleri doğrudan style'da) pano kabıdır: backgroundColor · padding · border · color · fontFamily · fontSize kartlara MİRAS iner (parçaların boyutu köke göre orantılıdır: kök 20px ise başlık ≈ 18.6px; tek parçayı değiştirmek için &__card-title/&__card-subtitle/&__card-meta'ya yaz). maxHeight kökü kırpar ve kartlar kolon İÇİNDE kayar; gap kökte etkisizdir, kolonlar arası boşluk '&__board' { gap }. Parçalar: &__board · &__column · &__column-header · &__column-title · &__count · &__cards · &__card · &__avatar · &__card-text · &__card-title · &__card-subtitle · &__card-meta · &__card-meta-item · &__card-meta-label · &__card-main (odaklanan gövde: role=button) · &__card-badges · &__badge · &__add · &__remove · &__column-empty · &__empty (kolon yokken pano metni) · &__loader. Durumlar iç içe yazılır: '&__card': { '&:hover': {…}, '&[draggable=\"true\"]': {…} }, odak halkası '&__card-main': { '&:focus-visible': {…}, '&[aria-disabled=\"true\"]': {…} } (kartın kendisi odaklanmaz, :focus-visible orada eşleşmez). Kolon ve kart rengi --column-color (kolon ve başlığında) ve --card-color (kartta) değişkenleridir. Kolon varsayılanı flex 1 0 200px, genişlik 200–320px: dikey şeritler için '&__board' { flexDirection: 'column' } ve '&__column' { maxWidth: 'none' }. Parça seçicileri 2026-10-01'e kadar HİÇBİR elemana bağlanmıyordu; eski notlar '& .ng-kanban__card' yazıyorsa o biçim de çalışır ama gereksizdir."
|
|
2072
2443
|
}
|
|
2073
2444
|
},
|
|
2074
2445
|
signature: {
|
|
@@ -2099,16 +2470,24 @@ export const componentKnowledge = {
|
|
|
2099
2470
|
"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.",
|
|
2100
2471
|
"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.",
|
|
2101
2472
|
"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 görünür adımın optional olmasını ister.",
|
|
2102
|
-
"Akıştan adım sürme: setter ile currentStep yaz — değer aralığa kırpılır, gizli bir adımı gösteriyorsa sonraki (yoksa önceki) görünür adım açılır; bu çözüm geri yazılmaz ve olay yaymaz. DİKKAT: gizli adım varken 'currentStep - 1' yazmak takılır (gizli adıma düşen değer yeniden ileri, bulunduğun adıma çözülür) — akıştan geri/ileri giderken hedefi görünür bir adımın indeksi olarak kendin hesapla. Görünür adım hiç yoksa başlık, düğmeler VE içerik çizilmez. Hatalı/başarısız adım görseli yoktur;
|
|
2473
|
+
"Akıştan adım sürme: setter ile currentStep yaz — değer aralığa kırpılır, gizli bir adımı gösteriyorsa sonraki (yoksa önceki) görünür adım açılır; bu çözüm geri yazılmaz ve olay yaymaz. DİKKAT: gizli adım varken 'currentStep - 1' yazmak takılır (gizli adıma düşen değer yeniden ileri, bulunduğun adıma çözülür) — akıştan geri/ileri giderken hedefi görünür bir adımın indeksi olarak kendin hesapla. Görünür adım hiç yoksa başlık, düğmeler VE içerik çizilmez. Hatalı/başarısız adım görseli yoktur; engellenmişken İleri düğmesi soluk zeminli ve ikincil metinli çizilir, aria-disabled=\"true\" taşır (tıklanabilir kalır: tıklama validationFail yayar; Playwright gibi 'enabled' bekleyen araçlar aria-disabled düğmeye click'te zaman aşımına düşer — force:true ver). Tamamlanma işareti (✓ ve ekran okuyucuya 'Tamamlandı') aktif adımdan ÖNCEKİ her görünür adımdadır: ileri sıçramada atlanan optional adım da ✓ alır (✓ = 'geçildi', 'ziyaret edildi' değil).",
|
|
2103
2474
|
"Adım i'nin içeriği children[i]'dir (type:'view'); steps öğe sayısı ile view sayısı eşit olmalı. Adım içeriği adımdan çıkınca SÖKÜLÜR ve dönünce yeniden kurulur: içindeki component'lerin mount akışları HER girişte yeniden koşar — Geri ile dönülen adımda mount'ta değer yazan bir akış kullanıcının girdiğini EZER. Değerini makineye geri yazan girdiler değeri korur; kaydırma, tablo sayfası gibi yerel durum kaybolur. Adım girdilerini mount'ta doldurma; ilk değeri stepper'ın mount'unda ya da önceki adımın İleri akışında yaz.",
|
|
2104
2475
|
"Koşullu adım: steps[].isHidden:true adımı başlıkta çizmez, numaralandırmaz ve İleri/Geri/başlık gezinmesinde atlar (İleri son görünür adımda Bitir olur). Öğe alanlarında {{ }} çözülmediği için (CQ-117) koşula bağlamak için akışta setter ile steps dizisinin TAMAMINI yeniden yaz.",
|
|
2105
|
-
"isLoading:true iken İleri/Geri/Bitir ve başlık tıklamaları devre dışıdır (kaydetme akışında çift finish önlenir) — gönderim akışının başında isLoading'i true, sonunda (hata dalında da) false yaz; true kalırsa sihirbaz kilitli kalır. steps dizi değilse (null yazan akış) başlık ve düğmeler çizilmez, sayfa düşmez.",
|
|
2476
|
+
"isLoading:true iken İleri/Geri/Bitir ve başlık tıklamaları devre dışıdır (kaydetme akışında çift finish önlenir) — gönderim akışının başında isLoading'i true, sonunda (hata dalında da) false yaz; true kalırsa sihirbaz kilitli kalır. steps dizi değilse (null yazan akış) başlık ve düğmeler çizilmez, sayfa düşmez. Yüklenirken kök aria-busy=\"true\" taşır ve adım içeriği inert'tir: tıklanmaz VE Tab ile girdilerine inilmez.",
|
|
2477
|
+
"Varsayılan metinler dile göre gelir: previousText/nextText/finishText/optionalText BOŞ bırakılırsa ekran diline göre sözlükten (tr: Geri · İleri · Bitir · İsteğe bağlı; en: Back · Next · Finish · Optional; ar: السابق · التالي · إنهاء · اختياري) çizilir — metni her dil için elle yazma. Dolu metin her zaman kazanır.",
|
|
2478
|
+
"showNavigation:false iken Geri/İleri/Bitir hiç çizilmez; Bitir de yoktur, yani finish olayı kullanıcı arayüzünden TETİKLENEMEZ — kendi düğmenle akışı sür ya da gezinmeyi açık bırak. Başlık tıklaması allowClickNavigation'a göre sürer. allowClickNavigation'ın tanınmayan değeri backward sayılır.",
|
|
2479
|
+
"Yerleşim: çok adımda ya da dar ekranda başlık şeridi ezilmez, kendi içinde yatay kayar ve açık adım şeritte ortalanır (sayfa taşmaz). Dikey yönde içerik başlıkların ALTINDA durur; başlıklar solda, içerik sağda isteniyorsa kök style'a display:grid + gridTemplateColumns yaz ve '&__list' ile '&__panel'e gridColumn/gridRow ver ('&__nav' içerik sütununa).",
|
|
2106
2480
|
"Form validations sistemiyle entegrasyonu YOKTUR (kapı yalnız çözülen ifade değeridir). Studio kanvasında adımlar arası geçiş sağ paneldeki Steps listesinin yuvarlak işaretiyle ya da Element Tree'den yapılır (satırın kendisine tıklamak düzenleme çekmecesini açar)."
|
|
2107
2481
|
],
|
|
2108
2482
|
propNotes: {
|
|
2109
2483
|
surfaceStyle: NODE_SURFACE_NOTE,
|
|
2110
2484
|
steps: "[{ title, description, icon, optional, isHidden, canProceed }] — tabs'ın views deseni; her adım children'da AYNI SIRADA kendi view'ını taşır. canProceed yalnız statik 'true'/'false'; bağlanabilir kapı üst düzey canProceed.",
|
|
2111
|
-
optionalText: "optional:true adımın başlığındaki rozet metni; boşsa
|
|
2485
|
+
optionalText: "optional:true adımın başlığındaki rozet metni; boşsa ekran diline göre sözlük metni (tr 'İsteğe bağlı', en 'Optional', ar 'اختياري').",
|
|
2486
|
+
previousText: "Geri düğmesinin metni; boşsa ekran diline göre (Geri · Back · السابق). Uzun metin satır kırar, düğme satırı taşırmaz.",
|
|
2487
|
+
nextText: "İleri düğmesinin metni; boşsa ekran diline göre (İleri · Next · التالي). Son adımda finishText çizilir.",
|
|
2488
|
+
finishText: "Son adımdaki düğmenin metni; boşsa ekran diline göre (Bitir · Finish · إنهاء).",
|
|
2489
|
+
allowClickNavigation: "none | backward | all; tanınmayan değer backward sayılır. all + isLinear:true iken ileri sıçrama yalnız aradaki her görünür adım optional ve kapıları açıksa; isLinear:false her adımı serbest bırakır.",
|
|
2490
|
+
style: "Kök CSS özellikleri (fontFamily, fontSize, color, backgroundColor, padding, border, borderRadius…) çalışır; fontFamily ve fontSize başlık, açıklama, rozet, marker ve düğmelere İNER (parçaların boyutu köke göre orantılıdır: kök 20px ise açıklama ≈ 17px), color başlığa ve Geri düğmesine iner — açıklama ve rozet ikincil renkte kalır (tek parçayı boyamak için &__description / &__optional). Kökte maxHeight TEK BAŞINA kırpmaz (CSS gereği içerik taşar): kaydırmak için overflowY: auto da yaz. gap kökte etkisiz; başlıklar arası boşluk '&__list' { gap }. PARÇA SÖZLÜĞÜ (&__parça): list (başlık şeridi) · step (her adımın <li>'si) · head (adım düğmesi) · marker (numara/ikon dairesi) · text (başlık+açıklama bloğu) · title · optional (isteğe bağlı rozeti) · description · connector (adımlar arası çizgi) · panel (içerik kabı) · slot (içerik) · nav (Geri/İleri satırı) · nav-button (iki düğme; yalnız biri için '&__nav-button--previous' / '&__nav-button--next'). DURUM HEDEFLERİ: aktif/tamamlanan adım için '&__step--active' ve '&__step--done' (ya da '&__step[data-state=\"active\" | \"done\" | \"upcoming\"]', '[aria-current=\"step\"]'); '&__head:hover', '&__head:focus-visible', '&__head:disabled', '&__nav-button:hover' çalışır; engelli İleri için '&__nav-button[aria-disabled=\"true\"]'. İç içe seçici ('& .ng-stepper__marker'), '::before/::after' ve '@media' çalışır. Odak halkası varsayılan 2px (koyuda da görünür); değiştirirsen kontrastı ≥ 3:1 tut.",
|
|
2112
2491
|
canProceed: "Aktif adımın kapısı; ifadeye bağlanır. Yalnız false/'false' engeller.",
|
|
2113
2492
|
currentStep: "0 tabanlı aktif adım; setter hedefi, aralık dışı değer kırpılır. Studio'dan yeni bırakılan düğümde 0 yerine null KAYDEDİLİR (frontend CQ-091, ortak mapper falsy varsayılanı düşürüyor): bileşen null'ı ilk adım sayar ama {{ <stepper>.currentStep }} / self.currentStep kullanıcı ilk kez adım değiştirene kadar null okur — ifadede {{ <stepper>.currentStep || 0 }} yaz. Şemayı kendin yazıyorsan currentStep: 0'ı açıkça ver."
|
|
2114
2493
|
}
|
|
@@ -2145,7 +2524,7 @@ export const APPEARANCE_TOKEN_SETS = {
|
|
|
2145
2524
|
},
|
|
2146
2525
|
heightType: {
|
|
2147
2526
|
values: ['fixed', 'auto', 'fill'],
|
|
2148
|
-
note: "'fixed' heightString'i okur, yoksa size.h×10px kullanır; 'fill' yüksekliği ebeveynin bıraktığı yerden alır."
|
|
2527
|
+
note: "'fixed' heightString'i okur, yoksa size.h×10px kullanır; 'fill' yüksekliği ebeveynin bıraktığı yerden alır. MOBİLDE (≤ 767 px) mobil bloğu olmayan her düğüme 'height: auto !important' yazılır (toplu mobil kural): yüksekliği satıra 'height' olarak yazılan 'fixed' düğüm (flex ya da CSS grid ebeveyninde, stretch yokken) 200 px yazılı olsa da 375 px'te içeriğine göre çizilir; stretch'li satırda yazılan 'min-height' etkilenmez; 12 kolonlu eski ebeveynde yükseklik grid-row aralığındandır. Yazılı yüksekliği mobilde de istiyorsan, yalnız heightType:'fixed' iken, appearance.className'e AYRILMIŞ 'ng-keep-height-mobile' belirtecini yaz (diğer sınıfları koru: className: 'hero ng-keep-height-mobile'); belirteç yoksa ya da heightType 'fixed' değilse davranış eskisi gibidir. Bu bir şema alanı değil serbest sınıf belirtecidir, doğrulayıcı ve veritabanı değişmez."
|
|
2149
2528
|
},
|
|
2150
2529
|
alignType: {
|
|
2151
2530
|
values: ['left', 'center', 'right'],
|
|
@@ -2197,7 +2576,7 @@ export const INTERNAL_ROLES_BY_TYPE = {
|
|
|
2197
2576
|
'row-<0 tabanlı sıra; sayfa değişince yeniden numaralanır>'
|
|
2198
2577
|
],
|
|
2199
2578
|
kanban: [
|
|
2200
|
-
"card-<kart id'si (idField; yoksa card-<sıra>)>",
|
|
2579
|
+
"card-<kart id'si (idField değeri; yoksa 'card-<sıra>' yani '__card-card-<sıra>')>",
|
|
2201
2580
|
"col-<kolon value'su> (bırakma hedefi)"
|
|
2202
2581
|
],
|
|
2203
2582
|
eventcalendar: [
|