@appaflytech/zeyrek-ai-mcp 0.0.33 → 0.0.34
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 +248 -108
- package/dist/knowledge/componentEvents.js +22 -24
- package/dist/knowledge/layoutSummary.js +2 -140
- package/dist/knowledge/normalize.js +126 -117
- package/dist/knowledge/rules.js +19 -291
- package/dist/knowledge/styleResolve.js +38 -55
- package/dist/knowledge/themeResolve.js +3 -3
- 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 +5 -13
- 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 +171 -256
- package/dist/resources/guides/theme.md +2 -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 +6 -79
- 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
|
@@ -32,7 +32,7 @@ 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)
|
|
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
36
|
typographyStyle: "{ textColor, fontFamily('var(--ng-font)' tema gövde | 'var(--ng-font-heading)' tema başlık | 'monospace' — token tema fontunu izler; serbest Google fontu yazma, tema yüklemez ve sessizce düşer), fontSize(CSS uzunluğu: '15px'|'1.1em'; çıplak sayı px sayılır), fontWeight(400|500|600|700), fontStyle(normal|italic), textDecoration(none|underline|line-through), lineHeight(TEK alan, üç yazım: oran '1.4' | yüzde '140%' | uzunluk '24px'; eski kayıtlardaki çıplak 140 yüzde sayılır), letterSpacing(CSS uzunluğu, negatif meşru: '-0.4px'), textAlign(left|center|right|justify) }. Komponentin içeriğine miras kalır.",
|
|
37
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.",
|
|
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).",
|
|
@@ -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.',
|
|
@@ -130,8 +132,9 @@ export const componentKnowledge = {
|
|
|
130
132
|
form: {
|
|
131
133
|
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
134
|
behavior: [
|
|
135
|
+
LAYOUT_ABSENT_NOTE,
|
|
133
136
|
"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
|
|
137
|
+
"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
138
|
"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
139
|
"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
140
|
"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 +148,53 @@ export const componentKnowledge = {
|
|
|
145
148
|
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
149
|
title: "Başlık bandının metni; boş bırakılırsa bant ve alt çizgisi hiç çizilmez.",
|
|
147
150
|
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;
|
|
151
|
+
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.",
|
|
152
|
+
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
153
|
}
|
|
151
154
|
},
|
|
152
155
|
box: {
|
|
153
156
|
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
157
|
behavior: [
|
|
158
|
+
LAYOUT_ABSENT_NOTE,
|
|
155
159
|
"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
160
|
"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.",
|
|
161
|
+
"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
162
|
"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.",
|
|
163
|
+
"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
164
|
"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
165
|
"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
166
|
"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
167
|
],
|
|
163
168
|
propNotes: {
|
|
164
169
|
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.",
|
|
170
|
+
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ı.",
|
|
171
|
+
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.",
|
|
172
|
+
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.",
|
|
173
|
+
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.",
|
|
174
|
+
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.",
|
|
175
|
+
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.",
|
|
176
|
+
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.",
|
|
177
|
+
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.",
|
|
178
|
+
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
179
|
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.",
|
|
180
|
+
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.",
|
|
181
|
+
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
182
|
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
183
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
168
184
|
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).",
|
|
185
|
+
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).",
|
|
186
|
+
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
187
|
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
188
|
}
|
|
173
189
|
},
|
|
174
190
|
'box-section': {
|
|
175
|
-
summary: "box'ın başlık/altlık bölgesi. AI BU DÜĞÜMÜ DOĞRUDAN
|
|
191
|
+
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
192
|
behavior: [
|
|
193
|
+
LAYOUT_ABSENT_NOTE,
|
|
177
194
|
'Yüzeysiz sarmalayıcıdır: kendi zemini/kenarlığı yoktur, yalnız bölge ayracını çizer (header altına, footer üstüne).',
|
|
178
195
|
"Palette GÖRÜNMEZ (isHide) ve SİLİNEMEZ (isDeletable:false) — kaldırmanın tek yolu box'ın ilgili anahtarını kapatmaktır.",
|
|
179
196
|
"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
|
|
197
|
+
"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
198
|
"role prop'u ('header' | 'footer') bölgenin kimliğidir ve gizlidir; elle değiştirmek yerleşimi bozar.",
|
|
182
199
|
"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
200
|
],
|
|
@@ -194,11 +211,12 @@ export const componentKnowledge = {
|
|
|
194
211
|
"Kanvas toolbar'ı: direction · variant · thickness · color · isHidden."
|
|
195
212
|
],
|
|
196
213
|
propNotes: {
|
|
197
|
-
label: 'Çizginin ortasındaki metin; yalnız yatayda çizilir. Sayı gelirse metne çevrilir.',
|
|
214
|
+
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
215
|
direction: "'horizontal' (varsayılan) | 'vertical'. Dikey çizginin kendi genişliği yoktur, hücresinde ortalanır.",
|
|
216
|
+
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
217
|
variant: "'solid' | 'dashed' | 'dotted'.",
|
|
200
218
|
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.",
|
|
219
|
+
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
220
|
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
221
|
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
222
|
}
|
|
@@ -206,7 +224,7 @@ export const componentKnowledge = {
|
|
|
206
224
|
spacer: {
|
|
207
225
|
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
226
|
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').",
|
|
227
|
+
"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
228
|
"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
229
|
"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
230
|
'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 +232,10 @@ export const componentKnowledge = {
|
|
|
214
232
|
],
|
|
215
233
|
propNotes: {
|
|
216
234
|
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.'
|
|
235
|
+
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).",
|
|
236
|
+
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.',
|
|
237
|
+
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.",
|
|
238
|
+
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
239
|
}
|
|
220
240
|
},
|
|
221
241
|
popover: {
|
|
@@ -299,8 +319,9 @@ export const componentKnowledge = {
|
|
|
299
319
|
}
|
|
300
320
|
},
|
|
301
321
|
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.",
|
|
322
|
+
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
323
|
behavior: [
|
|
324
|
+
LAYOUT_ABSENT_NOTE,
|
|
304
325
|
"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
326
|
"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
327
|
"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 +334,9 @@ export const componentKnowledge = {
|
|
|
313
334
|
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
314
335
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
315
336
|
hoverStyle: STYLE_GROUP_NOTES.hoverStyle,
|
|
316
|
-
|
|
317
|
-
|
|
337
|
+
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ı.",
|
|
338
|
+
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).',
|
|
339
|
+
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
340
|
style: STYLE_GROUP_NOTES.styleEscape + " Parça olarak yalnız '&__body' bildirilmiştir çünkü markup'ta gerçekten o eleman vardır."
|
|
319
341
|
}
|
|
320
342
|
},
|
|
@@ -326,14 +348,15 @@ export const componentKnowledge = {
|
|
|
326
348
|
"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
349
|
"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
350
|
"page_container'ın isLoading prop'u sayfa açılış akışının yükleniyor bayrağıdır.",
|
|
351
|
+
"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
352
|
"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
353
|
"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
354
|
"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
355
|
"ÜÇÜ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
356
|
"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
357
|
"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
|
-
"
|
|
358
|
+
"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')).",
|
|
359
|
+
"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
360
|
],
|
|
338
361
|
propNotes: {
|
|
339
362
|
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,11 +368,14 @@ export const componentKnowledge = {
|
|
|
345
368
|
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
369
|
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
370
|
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.",
|
|
371
|
+
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.",
|
|
372
|
+
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
373
|
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
374
|
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."
|
|
375
|
+
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.",
|
|
376
|
+
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.",
|
|
377
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
378
|
+
" 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
379
|
}
|
|
354
380
|
},
|
|
355
381
|
repeater: {
|
|
@@ -422,7 +448,7 @@ export const componentKnowledge = {
|
|
|
422
448
|
'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
449
|
"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
450
|
'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."
|
|
451
|
+
"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
452
|
],
|
|
427
453
|
propNotes: {
|
|
428
454
|
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 +469,7 @@ export const componentKnowledge = {
|
|
|
443
469
|
"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
470
|
'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
471
|
'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)."
|
|
472
|
+
"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
473
|
],
|
|
448
474
|
propNotes: {
|
|
449
475
|
value: 'Seçili etiketler: [{ value, color? }]. Renk hex (#rrggbb); verilmezse etiket gri çizilir.',
|
|
@@ -462,11 +488,11 @@ export const componentKnowledge = {
|
|
|
462
488
|
behavior: [
|
|
463
489
|
"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
490
|
"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
|
|
491
|
+
"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
492
|
],
|
|
467
493
|
propNotes: {
|
|
468
494
|
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:(###) ###-####').",
|
|
495
|
+
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
496
|
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
497
|
suffixIcon: "Alanın içinde sağda çizilen ikon; × ve spinner'ın sağında durur. Viewmode'da hiç çizilmez.",
|
|
472
498
|
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 +537,9 @@ export const componentKnowledge = {
|
|
|
511
537
|
"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
538
|
"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
539
|
"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."
|
|
540
|
+
"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.",
|
|
541
|
+
"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).",
|
|
542
|
+
"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
543
|
],
|
|
516
544
|
propNotes: {
|
|
517
545
|
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 +554,23 @@ export const componentKnowledge = {
|
|
|
526
554
|
incrementalinput: {
|
|
527
555
|
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
556
|
behavior: [
|
|
529
|
-
|
|
557
|
+
"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).",
|
|
558
|
+
"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
559
|
'İ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
560
|
'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
|
-
|
|
561
|
+
"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.",
|
|
562
|
+
"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
563
|
'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
564
|
'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
565
|
],
|
|
536
566
|
propNotes: {
|
|
537
|
-
value:
|
|
538
|
-
prefix:
|
|
539
|
-
separator:
|
|
540
|
-
counter:
|
|
541
|
-
digitcount:
|
|
567
|
+
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).",
|
|
568
|
+
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).",
|
|
569
|
+
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.",
|
|
570
|
+
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).",
|
|
571
|
+
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
572
|
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 (
|
|
573
|
+
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
574
|
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
575
|
prefixIcon: "Alanın İÇİNDE solda çizilen salt görsel ikon ({ name: 'tag' }); value'ya karışmaz. Viewmode'da çizilmez.",
|
|
546
576
|
suffixIcon: "Alanın içinde sağda çizilen ikon; yükleniyor spinner'ının sağında durur. Viewmode'da çizilmez.",
|
|
@@ -573,8 +603,9 @@ export const componentKnowledge = {
|
|
|
573
603
|
'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
604
|
'Kilitli (isDisabled/isReadonly/isViewmode) ya da isLoading olan kutu hiçbir olay yaymaz; focus/blur de susar.',
|
|
575
605
|
'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.'
|
|
606
|
+
'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.',
|
|
607
|
+
'Birden çok seçenek gerekiyorsa checkbox yığmak yerine checkboxgroup kullan: değeri string[] ve seç-tümü/sayaç onda hazır.',
|
|
608
|
+
"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
609
|
],
|
|
579
610
|
propNotes: {
|
|
580
611
|
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 +624,8 @@ export const componentKnowledge = {
|
|
|
593
624
|
'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
625
|
'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
626
|
'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.'
|
|
627
|
+
'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.',
|
|
628
|
+
"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
629
|
],
|
|
598
630
|
propNotes: {
|
|
599
631
|
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 +755,7 @@ export const componentKnowledge = {
|
|
|
723
755
|
fileUpload: {
|
|
724
756
|
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
757
|
behavior: [
|
|
726
|
-
"Komponentin YAYDIĞI value her zaman DİZİDİR
|
|
758
|
+
"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
759
|
'Ç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
760
|
'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
761
|
'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 +764,7 @@ export const componentKnowledge = {
|
|
|
732
764
|
'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
765
|
],
|
|
734
766
|
propNotes: {
|
|
735
|
-
value: "Panelde GİZLİ (.hide()):
|
|
767
|
+
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
768
|
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
769
|
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
770
|
isMultiple: 'Kapalıyken yeni seçim eskisinin YERİNE geçer, listeye eklenmez.',
|
|
@@ -750,7 +782,7 @@ export const componentKnowledge = {
|
|
|
750
782
|
'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
783
|
],
|
|
752
784
|
propNotes: {
|
|
753
|
-
value:
|
|
785
|
+
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
786
|
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
787
|
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
788
|
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 +801,10 @@ export const componentKnowledge = {
|
|
|
769
801
|
"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
802
|
],
|
|
771
803
|
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.",
|
|
804
|
+
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
805
|
text: 'Butonun üzerindeki metin (varsayılan "Attach File"); ikon sabittir. Alanın başlığı ayrı bir prop\'tur: label.',
|
|
774
806
|
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.
|
|
807
|
+
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
808
|
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
809
|
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
810
|
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ı).",
|
|
@@ -806,6 +838,8 @@ export const componentKnowledge = {
|
|
|
806
838
|
"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
839
|
"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
840
|
"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).",
|
|
841
|
+
"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.",
|
|
842
|
+
"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
843
|
"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
844
|
"İ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
845
|
],
|
|
@@ -890,6 +924,8 @@ export const componentKnowledge = {
|
|
|
890
924
|
"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
925
|
"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
926
|
"isLoading açıkken içerik yerine iskelet çizilir ve hiçbir tıklama olayı yayılmaz.",
|
|
927
|
+
"İÇ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).",
|
|
928
|
+
"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
929
|
'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
930
|
],
|
|
895
931
|
propNotes: {
|
|
@@ -898,7 +934,12 @@ export const componentKnowledge = {
|
|
|
898
934
|
imageWidth: 'Görselin bant İÇİNDEKİ genişliği (px). Yazılmazsa bandın tamamı; dar yazılırsa görsel bantta ortalanır.',
|
|
899
935
|
imageFit: "cover|contain|fill|none — CSS object-fit. Temizlenirse 'cover'.",
|
|
900
936
|
isLoading: 'Akışın ya da tasarımcının açtığı iskelet: içerik yerine parlayan kutular çizilir, click/buttonClick yayılmaz.',
|
|
901
|
-
title:
|
|
937
|
+
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.",
|
|
938
|
+
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.',
|
|
939
|
+
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.",
|
|
940
|
+
isHidden: 'Ortak katman görünürlüğü: true iken kart DOM’a girmez.',
|
|
941
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
942
|
+
" 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
943
|
}
|
|
903
944
|
},
|
|
904
945
|
'qm-card': { summary: 'QM gösterge kartı; click yayar.' },
|
|
@@ -914,12 +955,14 @@ export const componentKnowledge = {
|
|
|
914
955
|
"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
956
|
],
|
|
916
957
|
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.",
|
|
958
|
+
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.",
|
|
959
|
+
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
960
|
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.",
|
|
961
|
+
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
962
|
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
963
|
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.'
|
|
964
|
+
hideTabs: 'Başlık satırını gizler; içerik yalnız selected ile değişir.',
|
|
965
|
+
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
966
|
}
|
|
924
967
|
},
|
|
925
968
|
'collapsible-container': {
|
|
@@ -932,7 +975,7 @@ export const componentKnowledge = {
|
|
|
932
975
|
"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
976
|
],
|
|
934
977
|
propNotes: {
|
|
935
|
-
title:
|
|
978
|
+
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
979
|
description: 'Başlığın altındaki ikinci satır. Boş bırakılırsa hiç çizilmez.',
|
|
937
980
|
openButtonText: 'Bölüm KAPALIYKEN düğmede yazan metin; açıkken de close karşılığı yazılmamışsa bu kullanılır.',
|
|
938
981
|
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 +985,10 @@ export const componentKnowledge = {
|
|
|
942
985
|
closeButtonVariant: 'Açık durumun düğme rengi; aynı seçenekler.',
|
|
943
986
|
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
987
|
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:
|
|
988
|
+
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
989
|
isHidden: 'Düğümü hiç kurmaz: kapalı bir bölüm değil, olmayan bir bölümdür (ortak katman).',
|
|
947
990
|
style: 'BEM parçaları: &__header (başlık şeridi) ve &__body (gövde).',
|
|
948
|
-
surfaceStyle:
|
|
991
|
+
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
992
|
}
|
|
950
993
|
},
|
|
951
994
|
'tree-view': {
|
|
@@ -955,7 +998,7 @@ export const componentKnowledge = {
|
|
|
955
998
|
"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
999
|
'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
1000
|
"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 (
|
|
1001
|
+
"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ıç listesini statik yaz ya da akıştan self.checkedKeys = [...] ile ver.",
|
|
959
1002
|
"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
1003
|
"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
1004
|
'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.',
|
|
@@ -1082,10 +1125,11 @@ export const componentKnowledge = {
|
|
|
1082
1125
|
'İ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
1126
|
],
|
|
1084
1127
|
propNotes: {
|
|
1085
|
-
header:
|
|
1086
|
-
content:
|
|
1128
|
+
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.",
|
|
1129
|
+
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
1130
|
showIcon: 'Tür ikonunu çizer. false iken ikon kolonu hiç oluşturulmaz (metin sola yaslanır) ve panelde icon alanı gizlenir.',
|
|
1088
|
-
|
|
1131
|
+
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.",
|
|
1132
|
+
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
1133
|
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
1134
|
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
1135
|
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 +1158,13 @@ export const componentKnowledge = {
|
|
|
1114
1158
|
breadcrumb: {
|
|
1115
1159
|
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
1160
|
behavior: [
|
|
1161
|
+
"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.",
|
|
1162
|
+
"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
1163
|
'Üç 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
1164
|
"Öğ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
1165
|
'currentTitle tıklanabilir değildir (aria-current="page"); kip etiketi (Yeni/Düzenle) gibi kullanılacaksa akış bu prop’a setter ile yazar.',
|
|
1120
1166
|
"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
|
|
1167
|
+
'İ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
1168
|
'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
1169
|
],
|
|
1124
1170
|
propNotes: {
|
|
@@ -1132,8 +1178,10 @@ export const componentKnowledge = {
|
|
|
1132
1178
|
}
|
|
1133
1179
|
},
|
|
1134
1180
|
'page-header': {
|
|
1135
|
-
summary: 'Sayfa başlığı bandı: links dizisinden çizilen kırıntı izi + ALTINDA
|
|
1181
|
+
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
1182
|
behavior: [
|
|
1183
|
+
"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').",
|
|
1184
|
+
"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
1185
|
'İ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
1186
|
"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
1187
|
'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 +1190,7 @@ export const componentKnowledge = {
|
|
|
1142
1190
|
'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
1191
|
],
|
|
1144
1192
|
propNotes: {
|
|
1193
|
+
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
1194
|
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
1195
|
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
1196
|
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 +1201,22 @@ export const componentKnowledge = {
|
|
|
1152
1201
|
}
|
|
1153
1202
|
},
|
|
1154
1203
|
header: {
|
|
1155
|
-
summary: "Uygulama üst çubuğu (layout parçası): logo,
|
|
1204
|
+
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
1205
|
behavior: [
|
|
1157
1206
|
"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
1207
|
"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
1208
|
"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
|
|
1209
|
+
"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.",
|
|
1210
|
+
"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.",
|
|
1211
|
+
"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).",
|
|
1212
|
+
"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
1213
|
],
|
|
1162
1214
|
propNotes: {
|
|
1163
|
-
activeNavHref: "Vurgulanacak bağlantının
|
|
1164
|
-
navigation: "[{ title, href, icon }] — tek
|
|
1215
|
+
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.",
|
|
1216
|
+
navigation: "[{ title, href (bağlantı seçici), icon: { name, color }, children: [aynı şekil] }] — children tek düzey açılır alt menüdür.",
|
|
1217
|
+
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.",
|
|
1218
|
+
style: "Parçalar: &__logo, &__title, &__navigations, &__navigations-item, &__navigations-item-suffix, &__submenu, &__submenu-item, &__menu-toggle, &__user, &__user-icon, &__user-short, &__user-name.",
|
|
1219
|
+
userShortName: "Doluysa ad yerine rozet, boşsa account_circle ikonu çizilir. userName boşsa kullanıcı alanı hiç çizilmez."
|
|
1165
1220
|
}
|
|
1166
1221
|
},
|
|
1167
1222
|
sidebar: {
|
|
@@ -1171,28 +1226,56 @@ export const componentKnowledge = {
|
|
|
1171
1226
|
"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
1227
|
"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
1228
|
"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
|
-
"
|
|
1229
|
+
"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.",
|
|
1230
|
+
"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.",
|
|
1231
|
+
"KAYDIRMA (SB-002): kök ekran yüksekliğindedir ve taşmaz; uzun menü içerik alanının İÇİNDE kayar.",
|
|
1175
1232
|
"Menü olay YAYMAZ (şemada yalnız mount), satır tıklaması akış tetiklemez — gezinme ham <a href> ile tam sayfa yükleyerek olur.",
|
|
1176
1233
|
"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."
|
|
1234
|
+
"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.",
|
|
1235
|
+
"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.",
|
|
1236
|
+
"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.",
|
|
1237
|
+
"isHidden:true sidebar'ı ve menüsünü tamamen kaldırır (dar ekrandaki menü düğmesi dahil).",
|
|
1238
|
+
"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
1239
|
],
|
|
1179
1240
|
propNotes: {
|
|
1241
|
+
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).",
|
|
1242
|
+
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.",
|
|
1243
|
+
subtle: "Başlığın altındaki kısa açıklama; yalnız title ya da logo doluyken çizilir.",
|
|
1244
|
+
isHidden: "true → sidebar tamamen kalkar.",
|
|
1180
1245
|
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: "
|
|
1246
|
+
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).",
|
|
1247
|
+
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.",
|
|
1248
|
+
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.",
|
|
1249
|
+
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."
|
|
1250
|
+
}
|
|
1251
|
+
},
|
|
1252
|
+
'auth-layout': {
|
|
1253
|
+
summary: 'Giriş ekranı kabuğu: logo kolonu + form slotu; primaryClick/secondaryClick olayları yayar.',
|
|
1254
|
+
behavior: [
|
|
1255
|
+
"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.",
|
|
1256
|
+
"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.",
|
|
1257
|
+
"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)."
|
|
1258
|
+
],
|
|
1259
|
+
propNotes: {
|
|
1260
|
+
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.",
|
|
1261
|
+
style: "Serbest CSS kaçış kanalı; parçalar: &__background (sol, resimli kolon), &__content (sağ, formlu kolon), &__title (başlık).",
|
|
1262
|
+
backdrop: "Varsayılan boş — paketle gelen yedek resim kullanılır.",
|
|
1263
|
+
primaryDisabled: 'Birincil düğmeyi ve Enter ile gönderimi birlikte kapatır.'
|
|
1183
1264
|
}
|
|
1184
1265
|
},
|
|
1185
|
-
'auth-layout': { summary: 'Giriş ekranı kabuğu: logo kolonu + form slotu; primaryClick/secondaryClick olayları yayar.', propNotes: { surfaceStyle: NODE_SURFACE_NOTE } },
|
|
1186
1266
|
layout: {
|
|
1187
1267
|
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
1268
|
behavior: [
|
|
1189
1269
|
"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
1270
|
"Öğ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
1271
|
"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
|
|
1272
|
+
"İÇ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ı.",
|
|
1273
|
+
"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).",
|
|
1274
|
+
"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
1275
|
],
|
|
1194
1276
|
propNotes: {
|
|
1195
|
-
surfaceStyle:
|
|
1277
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens +
|
|
1278
|
+
" 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
1279
|
navigationStyle: NAVIGATION_STYLE_NOTE,
|
|
1197
1280
|
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
1281
|
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 +1297,29 @@ export const componentKnowledge = {
|
|
|
1214
1297
|
"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
1298
|
"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
1299
|
"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ı.",
|
|
1300
|
+
"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
1301
|
"İÇ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
1302
|
"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
1303
|
"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
1304
|
"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).",
|
|
1305
|
+
"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).",
|
|
1306
|
+
"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).",
|
|
1307
|
+
"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.",
|
|
1308
|
+
"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.",
|
|
1309
|
+
"Ç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.",
|
|
1310
|
+
"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.",
|
|
1311
|
+
"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
1312
|
'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
1313
|
],
|
|
1224
1314
|
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.",
|
|
1315
|
+
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
1316
|
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
1317
|
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
1318
|
displayMode: "'full' ikon+metin · 'rail' yalnız ikon (alt seviyeler kademeli flyout) · 'text' yalnız metin.",
|
|
1229
1319
|
nestingMode: "Derin seviyeler nasıl açılır: 'inline' | 'drill' | 'cascade'. Rail'de her zaman cascade'e zorlanır.",
|
|
1230
1320
|
inlineDepth: 'Bir panelde yerinde gösterilecek seviye sayısı; daha derini drill/flyout/alt drawer ile açılır.',
|
|
1231
1321
|
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.",
|
|
1322
|
+
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
1323
|
activeHref: 'Vurgulanacak satırın adresi; boş bırakılırsa tarayıcıdaki adres karar verir.',
|
|
1234
1324
|
isHidden: 'Komponentin tamamını gizler (ortak katman prop’u); öğe bazlı gizleme navigations[].isHidden’dır.',
|
|
1235
1325
|
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 +1366,14 @@ export const componentKnowledge = {
|
|
|
1276
1366
|
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
1367
|
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
1368
|
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.",
|
|
1369
|
+
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
1370
|
tileStyle: "Karo görünümü: 'icon' yalın ikon + ad; 'card' zeminli, kenarlıklı kart. Yalnız launcher düzeninde geçerlidir.",
|
|
1281
1371
|
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
1372
|
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
1373
|
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.",
|
|
1374
|
+
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
1375
|
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.",
|
|
1376
|
+
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
1377
|
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
1378
|
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
1379
|
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 +1400,7 @@ export const componentKnowledge = {
|
|
|
1310
1400
|
dividers: "Kök GRUPLAR arasına ayraç çizgisi koyar. Grup içi satırları ayırmaz.",
|
|
1311
1401
|
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
1402
|
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.",
|
|
1403
|
+
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
1404
|
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
1405
|
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
1406
|
bgColor: "Menünün zemini. Boş bırakılırsa theme’in değeri geçerli kalır.",
|
|
@@ -1335,14 +1425,17 @@ export const componentKnowledge = {
|
|
|
1335
1425
|
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
1426
|
behavior: [
|
|
1337
1427
|
"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
|
-
"
|
|
1428
|
+
"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.",
|
|
1429
|
+
"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.",
|
|
1430
|
+
"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.",
|
|
1431
|
+
"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.",
|
|
1432
|
+
"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
1433
|
"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
1434
|
],
|
|
1342
1435
|
propNotes: {
|
|
1343
|
-
surfaceStyle:
|
|
1436
|
+
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
1437
|
sidebarOpen: 'Yan panelin açık olup olmadığı; canlı durumdur, bağlanabilir.',
|
|
1345
|
-
mobileBehavior: "'drawer' (varsayılan;
|
|
1438
|
+
mobileBehavior: "'drawer' (varsayılan; mobilde kapalı başlar) | 'stack' (mobilde açık başlar).",
|
|
1346
1439
|
style: "&__body ve &__overlay parçaları uygulanır."
|
|
1347
1440
|
}
|
|
1348
1441
|
},
|
|
@@ -1351,14 +1444,18 @@ export const componentKnowledge = {
|
|
|
1351
1444
|
behavior: [
|
|
1352
1445
|
"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
1446
|
"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
|
-
"
|
|
1447
|
+
"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.",
|
|
1448
|
+
"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.",
|
|
1449
|
+
"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).",
|
|
1450
|
+
"top/bottom şeridi ızgaradaki alanının tam yüksekliğini alır (REG-004, 2026-09-29; önce içeriği kadar çiziliyordu).",
|
|
1451
|
+
"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
1452
|
"appearance.hideOn, dockMobile'ı HER ZAMAN yener; dockMobile:'hidden' yalnız bölge-yerel kısayoldur."
|
|
1356
1453
|
],
|
|
1357
1454
|
propNotes: {
|
|
1358
|
-
surfaceStyle:
|
|
1359
|
-
dock: "left | right | top | bottom | fill — biçim/yön
|
|
1455
|
+
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').",
|
|
1456
|
+
dock: "left | right | top | bottom | fill — biçim/yön; masaüstünde konum blocks[]'ten gelir, mobilde sırayı dock belirler.",
|
|
1360
1457
|
dockMobile: "inherit (varsayılan; masaüstünü izler) | left | right | top | bottom | drawer (içeriğin üstüne biner) | hidden.",
|
|
1361
|
-
isCollapsible:
|
|
1458
|
+
isCollapsible: "Bölgenin kapanabilir olup olmadığı; false iken bölge shell kapanınca da açık kalır (mobil drawer hariç).",
|
|
1362
1459
|
isCollapsed: 'Kapalı başlar; bir Durum değişkenine bağlanabilir.',
|
|
1363
1460
|
style: '&__body parçası uygulanır.'
|
|
1364
1461
|
}
|
|
@@ -1520,7 +1617,9 @@ export const componentKnowledge = {
|
|
|
1520
1617
|
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
1618
|
behavior: [
|
|
1522
1619
|
"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
|
|
1620
|
+
"Öğ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.",
|
|
1621
|
+
"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.",
|
|
1622
|
+
"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
1623
|
'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
1624
|
'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
1625
|
],
|
|
@@ -1529,7 +1628,12 @@ export const componentKnowledge = {
|
|
|
1529
1628
|
maxVisibleItems: 'Satır içinde kalacak öğe sayısı (varsayılan 1).',
|
|
1530
1629
|
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
1630
|
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.'
|
|
1631
|
+
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.',
|
|
1632
|
+
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.",
|
|
1633
|
+
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.",
|
|
1634
|
+
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.",
|
|
1635
|
+
isHidden: 'Düğümü hiç çizmez (ortak katman). Öğe bazlı gizleme items[].isHidden’dır.',
|
|
1636
|
+
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
1637
|
}
|
|
1534
1638
|
},
|
|
1535
1639
|
carousel: {
|
|
@@ -1579,8 +1683,6 @@ export const componentKnowledge = {
|
|
|
1579
1683
|
'aggregate/sort/topN/nullMode veriyi çizimden ÖNCE dönüştürür — aynı işi akışta yapmana gerek yok.',
|
|
1580
1684
|
'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
1685
|
'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
1686
|
"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
1687
|
'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
1688
|
'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.',
|
|
@@ -1601,7 +1703,7 @@ export const componentKnowledge = {
|
|
|
1601
1703
|
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
1704
|
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
1705
|
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.',
|
|
1706
|
+
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
1707
|
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
1708
|
colorRules: '[{ operator, value, valueTo, color }] — ilk eşleşen kural kazanır. radial/funnel/radar/funnelflow dışındaki her tipte uygulanır.'
|
|
1607
1709
|
}
|
|
@@ -1609,7 +1711,7 @@ export const componentKnowledge = {
|
|
|
1609
1711
|
checkboxgroup: {
|
|
1610
1712
|
summary: 'Değeri DİZİ olan çoklu kutu grubu (multi-select’in liste hâlinde açılmış hâli).',
|
|
1611
1713
|
behavior: [
|
|
1612
|
-
'Zorunluluk/en az-en çok seçim kuralları formun validations’ından gelir
|
|
1714
|
+
'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
1715
|
"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
1716
|
'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
1717
|
'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 +1734,7 @@ export const componentKnowledge = {
|
|
|
1632
1734
|
emptystate: {
|
|
1633
1735
|
summary: 'Boş ekran/liste bloğu: görsel ya da ikon + başlık + açıklama + aksiyon düğmeleri. Olayları mount ve actionClick.',
|
|
1634
1736
|
behavior: [
|
|
1635
|
-
"
|
|
1737
|
+
"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
1738
|
'image verilirse icon ÇİZİLMEZ (görsel ikonu ezer); ikisi birden gösterilmez.',
|
|
1637
1739
|
'isDisabled aksiyon tıklamayı yutar: ne kendi flow’u çalışır ne actionClick yayılır.',
|
|
1638
1740
|
'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 +1743,16 @@ export const componentKnowledge = {
|
|
|
1641
1743
|
'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
1744
|
],
|
|
1643
1745
|
propNotes: {
|
|
1644
|
-
image: 'Drive dosyası ya da URL; verildiğinde icon yok sayılır.',
|
|
1645
|
-
|
|
1746
|
+
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).',
|
|
1747
|
+
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.",
|
|
1748
|
+
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.',
|
|
1749
|
+
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.',
|
|
1750
|
+
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.",
|
|
1751
|
+
style: "Köke uygulanır. Parçalar: '&__icon', '&__image', '&__title', '&__description', '&__actions'.",
|
|
1752
|
+
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
1753
|
align: 'left | center | right — metin, ikon ve düğmeler birlikte hizalanır.',
|
|
1647
|
-
icon: '
|
|
1648
|
-
iconColor:
|
|
1754
|
+
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.",
|
|
1755
|
+
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
1756
|
isLoading: 'Akış veriyi getirene kadar iskelet. Bileşen geri yazmaz, yalnız akış sürer.',
|
|
1650
1757
|
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
1758
|
}
|
|
@@ -1777,26 +1884,39 @@ export const componentKnowledge = {
|
|
|
1777
1884
|
progress: {
|
|
1778
1885
|
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
1886
|
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).",
|
|
1887
|
+
"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.",
|
|
1781
1888
|
'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/video/statcard ile aynı desen). role="progressbar" içteki elemanda kalır.',
|
|
1782
1889
|
'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
1890
|
],
|
|
1784
1891
|
propNotes: {
|
|
1785
1892
|
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:
|
|
1893
|
+
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).",
|
|
1894
|
+
max: 'Yüzdenin paydası (varsayılan 100, en az 1). Temizlenirse 100 sayılır.',
|
|
1895
|
+
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.',
|
|
1896
|
+
showTrack: 'Dolgunun arkasındaki izi çizer (varsayılan true). Kapalıyken çubukta iz saydam olur, dairede iz çemberi hiç çizilmez.',
|
|
1897
|
+
isHidden: 'Ortak katman görünürlüğü: true iken gösterge DOM’a girmez.',
|
|
1898
|
+
variant: 'bar (varsayılan) | circle. Dairede okuma ortadadır; labelPosition ve isStriped okunmaz. Daire çapı size ile değişir: 56 / 84 / 112px.',
|
|
1899
|
+
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.',
|
|
1900
|
+
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).",
|
|
1901
|
+
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.',
|
|
1902
|
+
trackColor: 'İzin rengi; boşsa tema yüzey tonu. custom seçilirse customTrackColor okunur. showTrack kapalıyken okunmaz ve panelde gizlenir.',
|
|
1903
|
+
customTrackColor: 'Yalnız trackColor custom iken okunur.',
|
|
1904
|
+
style: "Köke uygulanır. Parçalar: '&__caption' (label), '&__track' (iz), '&__fill' (dolgu), '&__label' (değer okuması).",
|
|
1905
|
+
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
1906
|
showLabel: 'DEĞER okumasını açar (40% · 3/10 · 40) — label prop’unu değil. Panel başlığı "Show value".',
|
|
1788
1907
|
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
1908
|
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
1909
|
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
1910
|
isStriped: 'Yalnız barda; dairede stroke üzerinde görünmez.',
|
|
1792
|
-
labelPosition: 'DEĞER okumasının yeri (
|
|
1911
|
+
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
1912
|
}
|
|
1794
1913
|
},
|
|
1795
1914
|
rating: {
|
|
1796
1915
|
summary: 'Yıldız (ya da seçilen ikon) ile puanlama girişi.',
|
|
1797
1916
|
behavior: [
|
|
1798
1917
|
'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."
|
|
1918
|
+
"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.",
|
|
1919
|
+
"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
1920
|
],
|
|
1801
1921
|
propNotes: {
|
|
1802
1922
|
value: '0..max arası sayı; akıştan gelen değer bu aralığa kırpılır.',
|
|
@@ -1807,18 +1927,22 @@ export const componentKnowledge = {
|
|
|
1807
1927
|
result: {
|
|
1808
1928
|
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
1929
|
behavior: [
|
|
1810
|
-
'
|
|
1930
|
+
"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
1931
|
'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
1932
|
'Görsel slotu hiç boş kalmaz: image doluyken ikon çizilmez, ama adres yüklenemezse durum ikonuna geri dönülür.',
|
|
1813
1933
|
'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
1934
|
'mount ortak katmandan gelir ve sayfa açılınca bir kez yayılır; sonucu dolduran akışın kancası budur.'
|
|
1815
1935
|
],
|
|
1816
1936
|
propNotes: {
|
|
1817
|
-
icon:
|
|
1937
|
+
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ı.",
|
|
1938
|
+
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.",
|
|
1939
|
+
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.',
|
|
1940
|
+
isHidden: 'Ortak katman görünürlüğü: true iken blok DOM’a girmez, mount da yayılmaz.',
|
|
1941
|
+
style: "Köke uygulanır. Parçalar: '&__icon' (ikon çipi), '&__image', '&__title', '&__subtitle', '&__actions'.",
|
|
1818
1942
|
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
1943
|
status: 'Hem rengi hem varsayılan ikonu belirler; tanınmayan/boş değer info okunur.',
|
|
1820
1944
|
align: 'İçeriğin yatay hizası: metin, ikon ve düğmeler birlikte döner.',
|
|
1821
|
-
size: '
|
|
1945
|
+
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
1946
|
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
1947
|
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
1948
|
}
|
|
@@ -1828,7 +1952,8 @@ export const componentKnowledge = {
|
|
|
1828
1952
|
behavior: [
|
|
1829
1953
|
'change sürüklerken sürekli, changed yalnız bırakıldığında yayılır — pahalı akışı changed’e bağla.',
|
|
1830
1954
|
"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.'
|
|
1955
|
+
'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.',
|
|
1956
|
+
"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
1957
|
],
|
|
1833
1958
|
propNotes: {
|
|
1834
1959
|
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.',
|
|
@@ -1864,7 +1989,8 @@ export const componentKnowledge = {
|
|
|
1864
1989
|
'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
1990
|
'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
1991
|
'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).'
|
|
1992
|
+
'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).',
|
|
1993
|
+
"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
1994
|
],
|
|
1869
1995
|
propNotes: {
|
|
1870
1996
|
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.',
|
|
@@ -1940,29 +2066,43 @@ export const componentKnowledge = {
|
|
|
1940
2066
|
}
|
|
1941
2067
|
},
|
|
1942
2068
|
toast: {
|
|
1943
|
-
summary: 'Geçici bildirim TETİKLEYİCİSİ:
|
|
2069
|
+
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
2070
|
behavior: [
|
|
1945
2071
|
"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
2072
|
'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
|
-
"
|
|
2073
|
+
"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.",
|
|
2074
|
+
"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.",
|
|
2075
|
+
"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
2076
|
'Toast alanını runtime her uygulamada bir kez kurar — ikinci bir toast komponenti eklemek bildirimleri ÇİFTLEMEZ, her tetikleyici kendi toast’ını atar.',
|
|
1949
2077
|
"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
2078
|
"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
|
|
2079
|
+
"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
2080
|
],
|
|
1953
2081
|
propNotes: {
|
|
1954
|
-
isOpen: 'Setter ile true yaz → bir toast; komponent false’a geri döner.',
|
|
2082
|
+
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
2083
|
kind: 'default | info | success | error | warning | loading.',
|
|
1956
2084
|
position: '9 çapa: top/bottom × left/center/right, center, top-full/bottom-full (tam genişlik bant).',
|
|
1957
2085
|
actions: '[{ text, flow, keepOpen, showCountdown }] — en çok 2 düğme.',
|
|
1958
2086
|
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
2087
|
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.",
|
|
2088
|
+
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
2089
|
duration: 'ms; 0 ya da boş = türün varsayılan süresi. Hiç kapanmaması için isSticky.',
|
|
1962
2090
|
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
2091
|
showProgress: "Yalnız süreli toast'ta çizilir: isSticky ya da kind loading iken ilerleme çubuğu zaten yok.",
|
|
1964
2092
|
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.'
|
|
2093
|
+
isHidden: 'Açıkken komponent hiç kurulmaz: toast ATILMAZ. Gizli bir tetikleyici değil, kapalı bir tetikleyicidir — isOpen true yazmak da bir şey göstermez.',
|
|
2094
|
+
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.',
|
|
2095
|
+
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.",
|
|
2096
|
+
isSticky: 'true iken toast kendiliğinden kapanmaz ve ilerleme çubuğu çizilmez; duration yok sayılır (panelde de gizlenir).',
|
|
2097
|
+
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.",
|
|
2098
|
+
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.",
|
|
2099
|
+
showCopyButton: 'Kartta kopyala düğmesi çizer: başlık + içerik panoya gider (başlık varsa ilk satırda).',
|
|
2100
|
+
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.",
|
|
2101
|
+
delay: 'ms; toast bu kadar bekledikten sonra çıkar, open olayı da o zaman yayılır. Boş = hemen.',
|
|
2102
|
+
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.',
|
|
2103
|
+
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.",
|
|
2104
|
+
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.",
|
|
2105
|
+
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
2106
|
}
|
|
1967
2107
|
},
|
|
1968
2108
|
// — 2026-08-27 eşleme turu: components-new dalıyla gelen 6 yeni komponent.
|