@appaflytech/zeyrek-ai-mcp 0.0.30 → 0.0.32
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/README.md +5 -5
- package/dist/config.js +0 -37
- package/dist/index.js +0 -2
- package/dist/knowledge/backendConstraints.js +1 -18
- package/dist/knowledge/boxSections.js +184 -0
- package/dist/knowledge/componentCatalog.js +232 -562
- package/dist/knowledge/componentEvents.js +21 -141
- package/dist/knowledge/layoutSummary.js +2 -140
- package/dist/knowledge/normalize.js +67 -236
- package/dist/knowledge/outlines.js +0 -36
- package/dist/knowledge/policy.js +4 -18
- package/dist/knowledge/reservedTables.js +0 -79
- package/dist/knowledge/rules.js +21 -319
- package/dist/knowledge/schemaGuard.js +0 -11
- package/dist/knowledge/styleResolve.js +38 -55
- package/dist/knowledge/themeResolve.js +3 -3
- package/dist/observability/trace.js +3 -6
- package/dist/platform/diagnostics.js +4 -10
- package/dist/platform/domSummary.js +1 -1
- package/dist/platform/errors.js +10 -162
- package/dist/platform/http.js +8 -29
- package/dist/platform/responses.js +5 -39
- package/dist/platform/{capture/capture.js → screenshot.js} +519 -105
- package/dist/platform/secrets.js +1 -17
- 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-detail-profile.json +1 -2
- package/dist/resources/examples/page-dynamic-form.json +2 -3
- package/dist/resources/examples/page-flex-sections.json +1 -1
- package/dist/resources/examples/page-html-embed.json +1 -1
- package/dist/resources/examples/workflow-basic.json +2 -8
- package/dist/resources/guides/component.md +4 -91
- package/dist/resources/guides/entity.md +8 -50
- package/dist/resources/guides/expressions.md +5 -14
- package/dist/resources/guides/functions.md +1 -1
- package/dist/resources/guides/getting-started.md +1 -38
- package/dist/resources/guides/layout.md +58 -55
- package/dist/resources/guides/microservice.md +2 -81
- package/dist/resources/guides/middleware.md +2 -44
- package/dist/resources/guides/page.md +75 -454
- package/dist/resources/guides/theme.md +2 -8
- package/dist/resources/guides/translation.md +1 -1
- package/dist/resources/guides/workflow.md +1 -58
- package/dist/resources/rules.js +5 -11
- package/dist/resources/schema-fingerprint.json +5 -7
- package/dist/resources/schemas/CreateEntityCommand.json +0 -118
- package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
- package/dist/resources/schemas/CreateQueryCommand.json +0 -4
- package/dist/resources/schemas/CreateWorkflowCommand.json +1 -143
- package/dist/resources/schemas/DataJobDto.json +1 -6
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
- package/dist/resources/schemas/MicroserviceDto.json +3 -15
- package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
- package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -22
- package/dist/resources/schemas/StepDto.json +1 -22
- package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
- package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
- package/dist/resources/schemas/UpdateViewCommand.json +2 -0
- package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -143
- package/dist/server.js +1 -27
- package/dist/tools/access.js +2 -369
- package/dist/tools/applications.js +3 -60
- package/dist/tools/common.js +0 -7
- package/dist/tools/components.js +14 -118
- package/dist/tools/datasources.js +3 -3
- package/dist/tools/dependencies.js +1 -1
- package/dist/tools/deployments.js +2 -2
- package/dist/tools/designSchemaPatch.js +18 -34
- package/dist/tools/dtos.js +5 -36
- package/dist/tools/entities.js +12 -79
- package/dist/tools/externalComponents.js +5 -26
- package/dist/tools/flows.js +14 -122
- package/dist/tools/folders.js +1 -1
- package/dist/tools/imports.js +2 -5
- package/dist/tools/layouts.js +17 -50
- package/dist/tools/merges.js +1 -1
- package/dist/tools/microservices.js +25 -77
- package/dist/tools/pages.js +112 -465
- package/dist/tools/platformInfo.js +8 -27
- package/dist/tools/projects.js +9 -71
- package/dist/tools/rows.js +13 -69
- package/dist/tools/schemaOps.js +1 -61
- package/dist/tools/screenWrite.js +8 -37
- package/dist/tools/screens.js +5 -95
- package/dist/tools/templates.js +1 -26
- package/dist/tools/translations.js +1 -1
- package/dist/tools/variables.js +5 -11
- package/dist/tools/workflows.js +5 -10
- 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 -859
- package/dist/knowledge/mobileComponentEvents.js +0 -239
- 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/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 -243
- 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 -672
- 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 -495
- 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/UpdateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
- package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
- 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/modules.js +0 -48
- package/dist/tools/organizationStructure.js +0 -137
- package/dist/tools/profileWrite.js +0 -92
|
@@ -31,20 +31,8 @@ export const TABLE_COLUMN_TYPE_NOTE = "KOLON TİPİ SÖZLÜĞÜ (bekler → çiz
|
|
|
31
31
|
"tag: metin → appearance renginde TEK rozet; renk kolonun appearance prop'undan gelir (satır bazında rows[i]._columns[<indeks>].appearance ile ezilir), serbest hex ALMAZ. " +
|
|
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
|
-
/**
|
|
35
|
-
* KORUMALI DEĞER (f-31, kompleks proje) — table · datatable · detailview · text ortak davranışı.
|
|
36
|
-
* Kaynak: `packages/ng-apps-ui/src/shared/protected-value.functions.ts`,
|
|
37
|
-
* `shared/components/protected-value/ProtectedValue.svelte`, `packages/ng-apps-flow/src/access/`.
|
|
38
|
-
*/
|
|
39
|
-
export const PROTECTED_VALUE_NOTE = "KORUMALI DEĞER (kompleks proje, f-31): table-source uçtan gelen satır `__protected: { <alanSlug>: 'masked' | 'plain' }` metası taşır; hidden alan satırda HİÇ YOKTUR. " +
|
|
40
|
-
"'masked' alan kilit ikonuyla MASKE METNİNİ ('*******8901') çizer; satırın kimliği bulunursa ve runtime erişim özeti yüklüyse yanında 'Göster' çıkar: gerekçe diyaloğu → POST /{project}/runtime/{app}/reveal → değer 30 SANİYE görünür, sonra kendiliğinden yeniden maskelenir. Değeri BOŞ maskeli hücrede kilit kalır, 'Göster' ÇIKMAZ. " +
|
|
41
|
-
"Tasarımcı kanvasında 'View as user' ile seçilen kullanıcının özeti de yüklenir: 'Göster' o kullanıcıya sunulacağı yerde ETKİSİZ çizilir (tıklama bileşeni seçer, diyalog açılmaz; gerçek açma önizlemede); kullanıcı seçili değilken tasarımcının project.data.reveal izni karar verir. " +
|
|
42
|
-
"'Göster' kuralı moda göre: 'off' (basit proje HEP 'off') ya da özet yüklenemediyse ÇIKMAZ (backend her reveal'i 403 AccessRevealDeniedException ile reddeder); 'shadow'da ÇIKAR (özet her şeyi açık döner, backend reveal'i yine denetler — yetkisiz kullanıcı ret mesajını görür); 'enforce'ta yalnız entity'nin actions'ında reveal varsa. Page.can('reveal', …) bu kuralın yerini tutmaz: 'enforce' dışında hep true'dur. " +
|
|
43
|
-
"Açılan değer prop'a, akışa, olaya, yerel depoya ya da URL'e YAZILMAZ; olay yayılmaz, akış bağlanamaz. 403/404/422/429 mesajları bileşenin dil sözlüğündendir. 'plain' alan düz değerdir, normal çizilir. " +
|
|
44
|
-
"Maskeli değeri forma isMasked'sız BAĞLAMA: güncelleme formunda textinput'un value'su kaydın alanına, isMasked'ı satır metasına birlikte bağlanır (textinput.propNotes.isMasked). Gizleme arayüzdür; yetki backend'de denetlenir. Izgaralarda (bağlı datatable, Studio satır listesi) maskeli hücre politika yazma izni veriyorsa KÖR ÜZERİNE YAZILIR (ADR 0007): editör boş açılır, yalnız yazılan değer gider; table bileşeninde hâlâ düzenlenmez.";
|
|
45
|
-
export const REVEAL_ENTITY_NOTE = "Maskeli değerin açılacağı entity: slug ('musteriler') ya da id. BOŞSA runtime erişim özetinden bulunur — satırın korumalı alanlarını okunur alan olarak taşıyan TEK entity. İki entity aynı alan adını taşıyorsa ya da mod 'shadow' iken (özet alan listesi boş) bulunamaz ve 'Göster' ÇIKMAZ; o durumda doldur. Korumasız veride etkisizdir.";
|
|
46
34
|
export const STYLE_GROUP_NOTES = {
|
|
47
|
-
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).",
|
|
48
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.",
|
|
49
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.",
|
|
50
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).",
|
|
@@ -63,6 +51,8 @@ const NODE_SURFACE_NOTE = STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOT
|
|
|
63
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.";
|
|
64
52
|
/** layout ve navigations'ın ORTAK menü satırı grubu (frontend style-group-schemas.ts navigationStyleGroup + navigation-style-logic.ts). */
|
|
65
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).";
|
|
66
56
|
export const componentKnowledge = {
|
|
67
57
|
html: {
|
|
68
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.',
|
|
@@ -89,7 +79,7 @@ export const componentKnowledge = {
|
|
|
89
79
|
}
|
|
90
80
|
},
|
|
91
81
|
table: {
|
|
92
|
-
summary: '
|
|
82
|
+
summary: 'Etkileşimli veri ızgarası: satır seçimi, çift tık, hücre içi düzenleme, kolon filtreleme/sıralama, araç çubuğunda arama — her etkileşim AYRI olay olarak akışa bağlanır.',
|
|
93
83
|
behavior: [
|
|
94
84
|
'Süzme/sıralama/arama/sayfalama sunucu taraflıdır: filters/sortField/searchText/offset akışla uca gider, dönen satırlar rows prop’una setter ile yazılır.',
|
|
95
85
|
'AKIŞ BAĞLANMAZSA KONTROL ÇİZİLİR AMA SATIR DEĞİŞMEZ: showSort başlığa ok, filterMode filtre satırı/paneli, isSearchable arama kutusu koyar; tablo rows’u KENDİSİ sıralamaz, süzmez, aramaz, sayfalamaz. İlgili olay (sort · filter · search · pagination) mount akışıyla aynı sorguya bağlanmadıysa ok döner, kutu dolar, satırlar yerinde kalır. Üçünün de yazdığı offset 0’a döner.',
|
|
@@ -99,13 +89,11 @@ export const componentKnowledge = {
|
|
|
99
89
|
"totalRows yazılmazsa (0/boş) tablo elindeki satırlardan fazlasını bilemez: sayfalayıcı TEK SAYFA kalır ve gösterge o satırları sayar ('12 / 12'); ileri oku pasiftir. limit sayfa boyu listesinde (10·20·30·40·50) yoksa (25, 100) listeye eklenir. rows/filters/selectedRows akıştan null ya da dizi olmayan bir değerle gelirse boş liste sayılır, tablo çökmez (selectedRows'a tek satır nesnesi yazma — dizi yaz).",
|
|
100
90
|
"isPaginated:true + akışta limit/offset parametreleri + pagination olayı üçlüsü birlikte kurulmalı; biri eksikse tablo tek sayfa kalır (platform_guide('page') Kural 1c).",
|
|
101
91
|
"SATIR BAZLI GÖRÜNÜM EZMESİ: bir satır kendi _columns DİZİSİNİ taşıyabilir — rows[i]._columns[<kolonun columns dizisindeki İNDEKSİ>] = { appearance:'error', isBold:true, options:[...] } kolon tanımıyla birleşir (column-view.ts resolveColumn → Table.svelte <TableCell {column}>). İndeks TANIM sırasıdır: buildViewColumns index'i isHidden kolonlar elenmeden ÖNCE atar, görünür sıra değil. Kullanıcı kolon menüsünden kolon gizlese bile indeksler kaymaz (hideColumns buildViewColumns'dan SONRA uygulanır). Ezilebilen alanlar appearance · options · isBold; CSV export'u da ezmeyi uygular. Aynı kalıp _actions[i] ile satır bazlı aksiyon ezmesinde de çalışır (rowActions). ŞEMA PROP'U DEĞİLDİR — component_get prop listesinde görünmez, satır verisinin içinde taşınır.",
|
|
102
|
-
"Koşullu/satır bazlı renk table'da _columns ile kurulur ve style prop'unu KAYBETTİRMEZ — datatable'ın colorMap'i statiktir. Hem CSS hem satıra göre renk isteyen tablo table'dır; renk için datatable'a mecbur değilsin."
|
|
103
|
-
PROTECTED_VALUE_NOTE + " Tabloda: maskeli hücre DÜZENLENMEZ (çift tık/Enter editör açmaz) ve hover ipucu vermez; satır kimliği `id`, yoksa isKey kolonu."
|
|
92
|
+
"Koşullu/satır bazlı renk table'da _columns ile kurulur ve style prop'unu KAYBETTİRMEZ — datatable'ın colorMap'i statiktir. Hem CSS hem satıra göre renk isteyen tablo table'dır; renk için datatable'a mecbur değilsin."
|
|
104
93
|
],
|
|
105
94
|
propNotes: {
|
|
106
95
|
surfaceStyle: NODE_SURFACE_NOTE,
|
|
107
96
|
rows: 'Satır dizisi; mount/filter/sort/pagination akışlarının setter adımıyla doldurulur.',
|
|
108
|
-
revealEntity: REVEAL_ENTITY_NOTE,
|
|
109
97
|
appearance: "YÜKSEKLİK/GENİŞLİK ELLE HESAPLANMAZ (ölçüldü 2026-09-05, f11-repro). heightType:'auto' tablo içeriği kadar uzar — satır sayısı × satır yüksekliği hesabı gerekmez. heightType:'fixed' gövdeyi KAYDIRIR (grid-container overflow:auto), satır kaybolmaz; kare'de görünmeyen satır kırpılmış değil kaydırılmıştır. KOLONLAR KARTI TAŞIRMAZ: genişlik toplamı kabı aşarsa tablo kendi içinde YATAY kaydırır; kabın scrollWidth'i değişmez. KAYDIRMA ÇUBUKLARI VARSAYILAN GİZLİDİR (kaydırma Shift+tekerlek, trackpad, dokunma ve klavyeyle çalışır) ve sağda gizli kolon olduğunu gösteren tek işaret sabitlenmiş aksiyon kolonunun (actionsPinned) sol çizgisidir — kolonları sağa taşan tabloda kullanıcının görmesi için showScrollbar:true yaz. Toplam kaptan KÜÇÜKSE kolonlar orantılı büyütülüp kap tam doldurulur (stretchColumns) — bu yüzden 'kolonu daraltayım da sığsın' yamalarına gerek yok. Tek gerçek tuzak yerleşim tarafındadır: FLEX ebeveynde blocks[].size yok sayılır, ölçü appearance'tan gelir; IZGARA ebeveynde tersi (gateway PAGE-019 ile uyarır).",
|
|
110
98
|
totalRows: "Toplam kayıt: Number(Steps.<adım>?.headers?.[\"total-count\"] ?? 0) guard'lı ifadesiyle yazılır. Yazılmazsa sayfalayıcı tek sayfa kalır ve gösterge eldeki satırları sayar.",
|
|
111
99
|
rowSelection: "none | single | multi — seçim self.selectedRow / self.selectedRows prop'larından okunur. none 'satır seçilemez' DEMEK DEĞİL: satır tıklaması yine selectedRow'a yazar ve select'i çalıştırır, yalnız vurgu yoktur.",
|
|
@@ -128,59 +116,28 @@ export const componentKnowledge = {
|
|
|
128
116
|
"Liste→form geçişi satır AKSİYONUYLA kurulur: actions:[{ text, kind, icon, flow:{ type:'flow', ref:<flowId> } }]. doubleClick/select bağlamak 200 döner ama bağ ölüdür (gateway PAGE-008 keser).",
|
|
129
117
|
"Aksiyona tıklanınca komponent ÖNCE tıklanan satırı kendi selectedRow prop'una yazar, SONRA akışı çalıştırır (Table.svelte:72 setNode + onEmit) — akışta satır '<elementId>.selectedRow.<alan>' ile okunur. selectedRow katalogda hidden'dır; setter ile yazılmaz, komponent doldurur.",
|
|
130
118
|
"style prop'u 2026-08-27'de EKLENDİ: parçalar &__toolbar · &__title · &__head · &__th · &__body · &__row · &__td. table'ın aksine tek yazım kuralı vardır — hepsi designerCss'ten geçer, yani camelCase yazılır ve iç seçici alır. (Bu tarihten önce datatable stillendirilemiyordu; eski notlar 'style YOKTUR' diyorsa güncel değildir.)",
|
|
131
|
-
"Satır bazlı
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
"
|
|
136
|
-
PROTECTED_VALUE_NOTE + " Datatable'da satır kimliği keyField alanıdır (varsayılan `id`; bağlı tabloda runtime kaynağın birincil anahtarını yazar, isKey yok); maskeli hücre biçimlendirilmez, kolon tipinden bağımsız kilitli maske çizilir. KÖR ÜZERİNE YAZMA (2026-09-26, ADR 0007): BAĞLI tabloda kolonun capability.canWrite'ı açıksa (politika canWrite ∧ tanımın editable listesi — maskeli okumak yazmayı kapatmaz) maskeli hücre satır/hücre düzenlemesinde BOŞ editörle açılır, yer tutucu 'Değiştirmek için yeni değer girin'; yalnız YAZILAN değer taslağa ve update isteğine girer, boş bırakılan ya da yazılıp silinen maske hiç gitmez. Maskeli hücre hücre seçimine girmez (yazılan değer başka satırlara yayılmaz) ve toplu düzenleme maskeli kolonu SUNMAZ. Bağlı OLMAYAN tabloda maskeli hücre düzenlenmez (değişiklik elle yazılan save akışına gider). Eski değeri görerek düzeltmek için önce 'Göster' (açılan değer editöre ön doldurulmaz).",
|
|
137
|
-
"DÜZENLEME (2026-09-17, f-21; satır bazlı): editMode none|row|batch. Satır ✏ düğmesi ya da çift tıkla düzenlemeye açılır ve YAZILABİLİR HÜCRELERİNİN HEPSİ aynı anda editör olur (tek hücre editörü yok); ilişki hücresi lookup panelini açar. Enter satırı bitirir, Escape vazgeçer. row kipinde satır sonundaki ✓ o satırı kaydeder (hatasızsa satır kapanır), batch'te ✓ yalnız satırı kapatır ve üst çubukta 'N değişiklik · Kaydet · Vazgeç' kalır; kapanmış ama kaydedilmemiş satırda ✓/✕ görünür. canAddRow yeni satırı açar (newRowDefaults ile dolu, düzenlemede açılır; üstteki '+ Satır' düğmesi 2026-09-18'de KALKTI — yerine addRowButton ile satırların altında/üstünde mavi '+ Satır ekle' satırı ve addRowShortcut açıkken tablo odaktayken Ctrl/Cmd+Enter; buton alttayken yeni satır da en alta eklenir), canDeleteRow satır sonunda onaylı Sil. Kaydet 'save' olayı yayar ve changeset'i self.changeset'e yazar. BAĞLI TABLODA (rows connectData, behavior.edit açık) editMode/canEditRow/canAddRow/canDeleteRow/newRowDefaults/keyField'ı runtime tanım ∧ yazma kabiliyetinden YAZAR, yazmayı connect-data ucuna kendisi yapar (create → update → delete; hatalar self.rowErrors, satır taslakta kalır) — save için AKIŞ YAZILMAZ. Hücre yalnız capability.canWrite (policy ∧ editable) açıksa düzenlenir; bağlı olmayan tabloda kolonun editable işareti (columns[].editable). image/file/progress/link hücresi, bağlı olmayan tablonun maskeli hücresi ve anahtarı (keyField; bağlı tabloda kaynağın birincil anahtarı, yoksa id) olmayan ya da sayfada tekrar eden satır düzenlenmez/silinmez. Kaydı süren satırın ✓/Sil/Kaydet düğmesi pasiftir (çift kayıt yok); atomic tanımda toplu yazmada düşen satırın komşuları 'Kaydedilmedi' işaretiyle taslakta kalır (hiçbiri yazılmadı; writeMode partial'da komşular yazılır, yalnız düşen satır kırmızı kalır); ✕ satırın hatasını da siler. Hücre seçimi (selectedCells, cellSelectionChange) yalnız düzenleme kipinde. Kanvasta düzenleme pasiftir. GÜNCELLEME (2026-09-18): tasarımcıda batch seçeneğinin etiketi 'Cell'dir (değer batch kalır). Yazılabilir ilişki hücresi TEK tıkta yalnız seçilir; ÇİFT tık düzenler: row kipinde satırın bütün yazılabilir hücreleri açılır, Cell (batch) kipinde kayıtlı satırın YALNIZ çift tıklanan hücresi editör olur (Enter ya da alandan çıkmak değeri taslakta bırakıp kapatır, Escape yalnız editörü kapatır; ✏ ve yeni satır iki kipte de bütün satırı açar); ilişki hücresinde seçim paneli açılır; düzenlenen satırda ilişki hücresi bir seçici düğmedir (değer + ok). batch kipinde çift tıklanan hücre aynı kolondaki çoklu hücre seçiminin içindeyse yazılan değer seçili BÜTÜN hücrelere gider (row kipinde yalnız o satır). batch kipinde Sil onaysızdır ve satırı 'SİL' rozetiyle, üstü çizili olarak silinecek diye İŞARETLER (↶ ile geri alınır); silme kayıtta changeset.deleted'a girer. Yeni satır 'YENİ' rozeti ve yeşil zemin alır; değişen hücrede köşe işareti ve altında üstü çizili eski değer vardır. Üst çubuk KALKTI: tablonun altında 'N değişiklik · N yeni · N silinecek · N hata' özeti, 'Tümünü geri al' ve 'Değişiklikleri kaydet (N)' durur. Filtre özetinde ve filtre çubuğunda lookup'tan seçilen ilişki değeri kimliğiyle değil görünen alanıyla yazılır; filtre çubuğunda ilişki kolonu doğrudan seçim paneliyle açılır ve seçim hemen uygulanır. GÜNCELLEME (2026-09-19): editMode'a cell (hücre başına kayıt; tanımda saveMode 'cell') eklendi; tasarımcıda batch'in etiketi artık 'Batch', 'Cell' etiketi yeni cell kipidir. cell kipinde kayıtlı satırın çift tıklanan hücresi tek başına açılır ve ✓/✕ editörün kendi çerçevesinin sağ ucunda, ayraçtan sonra iki ikon düğmedir (arama kutusunun temizle düğmesi gibi) (satır ✏ düğmesi yoktur): ✓ ya da Enter yalnız o alanı hemen kaydeder (update patch'inde tek alan), ✕ ya da Escape vazgeçer; alandan çıkmak editörü kapatmaz. Aynı anda tek hücre açıktır, başka hücreye geçmek açık hücrenin kaydedilmemiş değerini atar; kayıt hata verirse hücre açık kalır ve hata altında görünür. İlişki hücresinde panel kapanınca hücre açık kalır, seçim ✓ ile yazılır. Yeni satır, Sil (onaylı) ve toplu düzenleme row kipindeki gibi hemen kaydedilir; edit kolonu yalnız canAddRow ya da canDeleteRow açıksa görünür. Çoklu hücre seçiminin içindeki hücre açılırsa (batch ve cell) değer seçili bütün hücrelere yazılır; cell kipinde ✓ hepsini tek changeset'te kaydeder, ✕ hepsinden vazgeçer. Edit kolonu (✏ 🗑) sağa yapışıktır (sticky), genişliği boştaki düğmelere göredir; ✏/🗑 hover'da görünür. Çakışan işlemler kilitlidir: toplu satır seçimi varken çift tık/✏ düzenleme açmaz, Satır ekle (ve Ctrl+Enter) gizlenir, ✏/🗑 görünmez; düzenleme açıkken satır seçim kutuları devre dışıdır ve ✏/🗑 görünmez. Escape ilişki hücresinde (lookup paneli açıkken de) düzenlemeyi kapatır.",
|
|
138
|
-
"LOOKUP (2026-09-17, f-23): bağlı tabloda YAZILABİLİR relation hücresi lookup panelini açar (hedef tablo op:lookup ile, arama + 'Daha fazla'), seçim yalnız düzenlenen satırda; salt okunur tabloda, editable dışı alanda ya da güncellenemeyen satırda hücre HİÇBİR ŞEY açmaz (2026-09-21 — eski gezinme paneli kaldırıldı). Panelin 'Detaylı ara…' bağlantısı tanımın lookup.mode'una göre pencere ya da sağ çekmece açar (mode yazılmamışsa pencere, 2026-09-19) ve paneldeki arama metniyle başlar: kolonlar lookup.fields (türetilmişte anahtar dışı alanlar), arama, lookup.behavior.filterable alanlarında VE koşulları, başlıktan sıralama, sayfalar; o2m/self tekil seçim ('Seç' ya da çift tık), m2m onay kutuları + 'Uygula'; 'Temizle' alan zorunluysa (describe isRequired) gizli; yazma yetkisi yoksa panel yalnız gezinme. Seçilen hedef hücreye yerel yazılır, kayıt { alan: '<id>' } / m2m ['<id>', …] olarak gider. Filtre panelinde relation kolonunun değeri 'Seç…' ile aynı panelden seçilir (in/notin çoklu), chip'te görünen ad. Hedefin görünen alanı metin (ve korumasız) ise sunucu ilişkiye contains/icontains da sunar (2026-09-21): bu işleçte değer seçilmez, YAZILIR ve hedefin görünen alanında aranır ({ field:'city', operator:'icontains', value:'ist' } → EXISTS … title ILIKE '%ist%'); gelişmiş panelde, column modundaki işleç düğmesinde ve bar hapının editöründe (işleç seçimi + kayıt seçimi ya da metin) çıkar; bar ile gelişmiş panel birlikteyken panel çubuğun ÜSTÜNDE açılır, çubuk hep tablonun hemen üstündedir. Hedef tabloyu okuyamayan (targetReadable:false) hücre gri “—” + kilit çizer ve panel açmaz. Hedefin maskeli alanı ayrıntılı aramada maske olarak (Göster ile) çizilir.",
|
|
139
|
-
"TOPLU (2026-09-17, f-22): bulkActions none|edit|delete|both açık ve editMode none değilken başa onay kutusu kolonu gelir (başlıkta sayfadaki satırları seç); anahtarlı sunucu satırları seçilir, seçim self.selectedRows'a yazılır ve rowSelectionChange yayılır. Seçim çubuğu: 'N seçili · Toplu düzenle · Sil · Temizle'. Toplu düzenle bir FORMDUR ve sağdan açılan bir ÇEKMECEDE (drawer, 2026-09-19) alanlar alt alta listelenir; altta Vazgeç · Uygula, arka plan/×/Escape uygulamadan kapatır: yazılabilen her kolon için editör (anahtar üçlü seçim, ilişki alanında lookup paneli); yalnız doldurulan alanlar uygulanır, boş bırakılan değişmez; ilişki alanının ×'i temizler (o2m null, m2m boş liste — hücre editörüyle aynı); row kipinde bütün doldurulan alanlar tek save (tek update isteği, bulk), batch'te taslağa girer. Sil onaylı, tek delete. Hatasız yazılan satırlar seçimden düşer, hatalılar kırmızı ve seçili kalır; 1000 satır üstünde toplu eylem kapanır. BAĞLI TABLODA bulkActions'ı runtime yazar: tanım edit.bulk ∧ meta.write.bulk, update → edit, delete → delete. Hücre seçimi (Shift/Ctrl/Alt, selectedCells, cellSelectionChange) tek başına değer doldurmaz; batch kipinde seçimin içindeki bir hücre çift tıkla düzenlenirse değer seçili hücrelerin hepsine yazılır (2026-09-18), çok alanı birlikte değiştirmek toplu düzenle formuyla yapılır. Kilitli (yazılamayan) hücre seçime girmez.",
|
|
140
|
-
"YERLEŞİM VE FİLTRE MODLARI (2026-09-18; 2026-09-21'den beri gelişmiş oluşturucu filterMode değil advancedFilter anahtarıdır ve column/bar ile birlikte açılabilir): advancedFilter (koşul oluşturucu: tümü/herhangi biri, VE/VEYA, grup; kurallar tutamaçtan sürüklenip grubun içine/dışına taşınır; Uygula yalnız her kuralın kolonu ve değeri doluyken görünür, Sıfırla yalnız uygulanmış filtre ya da taslakta kural varken; ziyaretçi filtreyi adıyla kaydedebilir — tanıma yazılmaz, tarayıcıda element id'siyle saklanır (localStorage ZY_DataTableFilters_<elementId>), üst çubukta Filtre düğmesinin yanındaki 'Kayıtlı filtreler' açılır menüsünden (filterPosition left'te sağında, right'ta solunda) panel açılmadan seçilip uygulanır, kanvasta yoktur; filtre yokken panel boş bir kuralla açılır; 'Filtre (n)' düğmesiyle açılır, Ctrl+Enter uygular — düğme ARAÇ GRUBUNUN PARÇASI DEĞİLDİR (2026-09-18): araçlar nerede olursa olsun tablonun üstündeki çubukta durur, filterPosition left'te başlığın hemen ardına, right'ta sağ kenara) · column (başlığın altında kolon başına filtre satırı: metinde işleç menüsü, sayı/tarihte min–max (bağlı tablonun birincil anahtarı hariç: tek değer, eşittir), boolean Tümü/Evet/Hayır, enum/tag'de çoklu seçim, relation'da lookup) · bar (tablo üstünde kolon başına açılır düğme + panel) · none. ÜÇ MOD DA AYNI filters sözleşmesini yazar ve mount'u tetikler — bağlı tabloda işleçler capability.operators'tan gelir (aralık yalnız gte+lte sunulursa), enabled:false kolon hiçbir modda çıkmaz; column/bar ekranı her zaman filters prop'undan kurulur (sunucu 422 ile reddedince geri yazılan filtre görünür). showFilterSummary aktif filtre + sıralamayı kaldırılabilir chip'ler olarak gösterir; bar modunda çizilmez (aktif filtreler barın haplarında durur ve oradan düzenlenir), sonuç sayısı ne barda ne özette yazılır — footer'daki kayıt özeti taşır. Başlık (title) boşsa üst çubuk yalnız araçlar üstteyse ya da advanced filtre düğmesi varsa çizilir; başlıksız tabloda filterMode bar iken üst köşedeki araçlar ayrı çubuk açmaz, filtre çubuğunun ucuna oturur. Araçlar (showRefresh · showExport: bu sayfanın CSV'si · showColumnManager: 'Column settings' menüsü — kolon gizle/göster ve sürükleyerek (ya da tutamaçta ↑/↓) sırala, tanıma yazılmaz; seçim tarayıcıda element id'siyle saklanır (localStorage ZY_DataTableColumns_<elementId>) ve tablo aynı kolonlarla açılır, Reset kaydı siler, kanvas okumaz; üçü de yalnız ikon + tooltip) toolsPosition ile dört köşeden birine oturur; footer (sol altta kayıt özeti '1–10 / 24 kayıt · 1 seçili' — showRecordSummary ile kapatılır —, sayfa başına, «ilk ‹önceki sayfa numaraları sonraki› son» düğmeleri) footerPosition ile tablonun altında ya da üstündedir; sayfalama paginationPosition ile kayıt sayısının ardında (left) ya da sağ kenardadır, stickyFooter footer'ı sayfa kaydırmasında görünür kenara yapıştırır. stickyHeader başlığı tablonun KENDİ kaydırmasında üstte tutar (sabit yükseklikli tablo); kolonun isPinned'i kolonu başa alıp yatay kaydırmada solda sabitler. size sm|md|lg satır yüksekliğini, hücre boşluğunu ve yazı boyunu değiştirir. YENİ BIRAKILAN TABLO (2026-09-18): başlıksız, filterMode bar, araçlar sağ üstte (filtre çubuğunun ucunda), isPaginated açık, sayfalama sağ altta, kayıt özeti sol altta, stickyHeader açık, size md, Status kolonu solid tag; bu değerler yalnız şema varsayılanıdır — prop'u hiç yazılmamış eski düğüm eski görünüşünü korur (advanced, sağ üst araçlar, sağda sayfalama, yapışkan başlık kapalı). paginationMode pages (numaralı) | infinite (gövde sona kaydırıldıkça sonraki sayfa offset=yüklenen satır sayısıyla istenir ve satırlar birikir; kendi yüksekliğiyle uzayan tabloda footer'da 'Daha fazla' düğmesi). Gövde durumları: yükleniyor (iskelet), kayıt yok, filtre sonucu boş (Filtreleri kaldır), hata (loadError; Tekrar dene mount'u yeniden çalıştırır, satır varken tablo üstünde şerit)."
|
|
141
|
-
],
|
|
142
|
-
propNotes: {
|
|
143
|
-
surfaceStyle: NODE_SURFACE_NOTE + " Datatable'ın kabı VARSAYILAN olarak kendi 1px çerçevesini, 6px köşesini ve yüzey zeminini çizer (filtre çubuğu + ızgara + footer'ı saran çerçeve). Grupta bir kenarlık yazılınca (borderTop/Right/Bottom/Left — 'none' dahil) kap KENDİ çerçevesini bırakır: çerçeveyi kaldırmak için dört yöne 'none' yaz; düz çizgi yazmak ikinci çerçeve eklemez. radius yazılınca kap köşeyi düğüm kutusundan alır, background yazılınca kabın zemini saydamlaşır (2026-09-18).",
|
|
144
|
-
editMode: "none | row | cell | batch (tasarımcı etiketleri Row / Cell / Batch). Bağlı tabloda runtime tanımın behavior.edit.saveMode'undan yazar; elle yazmak bağlı tabloda etkisizdir. Bağlı olmayan tabloda save olayındaki self.changeset'i akış yazar.",
|
|
145
|
-
operation: "Salt okunur, save'den ÖNCE yazılır (2026-09-21): kaydı doğuran işlem — rowAdd · rowEdit · cellEdit · rowDelete · bulkEdit · bulkDelete · batchSave (batch kipinin 'Değişiklikleri kaydet'i, karışık changeset). Ayrı olay YOKTUR: tek save akışı Condition'da self.operation ile ayırır.",
|
|
146
|
-
editedRows: "Salt okunur, save'den önce yazılır: eklenen/düzenlenen satırların TAM hâli (sunucu satırı + yama; yeni satırda girilen değerler) — changeset.updated yalnız yamayı taşır. Kolonlara bağlıdır: akış editörü self.editedRows[0].<kolon> önerir.",
|
|
147
|
-
deletedRows: "Salt okunur, save'den önce yazılır: silinen satırların TAM hâli (tek silmede bir öğe) — changeset.deleted yalnız { rowId, id } taşır.",
|
|
148
|
-
editedCell: "Salt okunur, save'den önce yazılır: yalnız operation cellEdit iken { rowId, field, value, previousValue }, diğer işlemlerde null.",
|
|
149
|
-
bulkPatch: "Salt okunur, save'den önce yazılır: yalnız operation bulkEdit iken toplu formun seçili satırlara yazdığı { <kolon>: değer }, diğerlerinde null.",
|
|
150
|
-
rowErrors: "Salt okunur: [{ rowId, field?, message }] — bağlantı son kaydın satır hatalarını yazar; field varsa o hücre kırmızı çerçeve + mesaj.",
|
|
151
|
-
selectedCells: "Salt okunur: { column, rowIds[], anchorRowId } — aynı kolonda çoklu hücre seçimi (D-25); farklı kolona tıklamak seçimi sıfırlar. Doldurma f-22.",
|
|
152
|
-
revealEntity: REVEAL_ENTITY_NOTE,
|
|
153
|
-
columns: "Kolon tipleri: text · number · date · datetime · time · switch · tag · email · url · link · image · file · progress · relation · html. HTML (2026-09-18) html bileşeninin modelini hücreye taşır: satır değeri { content, style } — content ham HTML'dir ve SATIRIN alanlarıyla Mustache'ten geçer ('<b>{{name}}</b>'), style o hücreye scoped CSS bloğudur (emotion; 'color:red; b { … }' iç seçici alır, designerCss/!important YOK); bağlı kaynaktan düz metin gelirse content sayılır. İşaretleme TEMİZLENMEDEN basılır (html bileşeniyle aynı güven modeli; <script> hücrede ÇALIŞMAZ, satır içi on* handler'lar çalışır) — son kullanıcının yazdığı bir alanı html kolonuna eşleme. Satır içi düzenlenmez (editable gizli); sıralama/filtre/CSV etiketsiz metni görür. Studio Rows editöründe html kolonu için 'HTML content' + 'Style' iki metin alanı çıkar. RELATION (Connect Data) ilişki alanının hedef nesnesini ({ id, ad }) görünen alanıyla metin olarak, m2m dizisini ilk 3 chip + “+N” olarak çizer; hedef tabloyu okuyamayan kullanıcıya gri “—” + kilit basar. BAĞLI TABLO: rows connectData ile bağlıysa runtime her kolona gizli capability yazar (işleçler, sortable, enabled, relation, enum) — sıralama/filtre anahtarını ve filtre işleç listesini sunucu belirler, enum değerleri etiket+renkle çizilir; capability elle yazılmaz. Her tipin ne beklediği/ne çizdiği table'ın kolon sözlüğüyle AYNIDIR (component_get('table') → knowledge.propNotes.columns), İKİ İSTİSNA dışında: burada image/file düz URL kabul etmez (aşağıdaki image notu) ve renk satır bazında değil colorMap ile kurulur. PROGRESS (2026-08-27) hücrenin içine çubuk ya da halka çizer: progressVariant bar|circle · max (varsayılan 100) · progressLabel none|percent|fraction|value · progressColor + customProgressColor · thresholds [{from,color}] (yüzdeyi geçmeyen en yüksek eşik kazanır) · captionField BAŞKA bir satır alanının metnini çubuğun ÜSTÜNE yazar, yani ad ve çubuk tek hücrede durur. Sıralama/dışa aktarım ham sayıyı görür, çizimi değil. KİŞİ HÜCRESİ (2026-09-18): text kolonunda showAvatar metnin önüne baş harfli renkli daire çizer (renk addan türer, aynı ad hep aynı renk); avatarField BAŞKA bir satır alanından görsel okur (dosya nesnesi ya da URL; yüklenemezse baş harfe düşer) — ayrı image kolonu açmadan 'avatar + ad' tek hücrede durur. TAG appearance subtle: açık zemin + koyu yazı + renkli nokta (durum rozeti); colorMap'te semantik ad (success/warning/info) tema token'ına çözülür — DİKKAT: temalarda info neredeyse beyazdır (#F8F8F8), mavi için primary kullan; çok açık bir renk subtle'da gri rozete sınırlanır; colorMap satırının mode'u solid ise o değer kolonun görünümünden bağımsız renkli zemin + beyaz yazıyla çizilir (varsayılan soft = kolonun appearance'ı). SWITCH kolonu (2026-09-18) kontrol değil durum işaretidir: booleanStyle icon (varsayılan; true yeşil dolu daire + ✓, false kırmızı dolu daire + ×) · text (dile göre Evet/Hayır, Hayır kırmızı) · switch (eski toggle görünümü); booleanFalseColor muted false'u sönük griye çeker (varsayılan error/kırmızı — false'un sorun olmadığı alanlarda muted kullan). number kolonu eşit genişlikli rakamla çizilir; url kolonu adresi protokolsüz gösterir. HİZA (2026-09-18): kolonun align alanı left|center|right başlığı ve hücreyi birlikte hizalar (avatar+metin ve halka progress da kayar); boş = her tipte solda (number dahil — tutarları sağa yaslamak için align:right yaz); bağlı tablonun birincil anahtar kolonu (capability.isKey) yeni bağlamada 80px dar gelir.",
|
|
119
|
+
"Satır bazlı görünüm ezmesi (_columns / _actions) da YOKTUR — o table'a özgüdür. Renklendirme burada yalnız kolonun colorMap/autoColor sözlüğüyle, yani satırdan bağımsız kurulur."
|
|
120
|
+
],
|
|
121
|
+
propNotes: {
|
|
122
|
+
surfaceStyle: NODE_SURFACE_NOTE,
|
|
123
|
+
columns: "Kolon tipleri: text · number · date · datetime · time · switch · tag · email · url · link · image · file · progress. Her tipin ne beklediği/ne çizdiği table'ın kolon sözlüğüyle AYNIDIR (component_get('table') → knowledge.propNotes.columns), İKİ İSTİSNA dışında: burada image/file düz URL kabul etmez (aşağıdaki image notu) ve renk satır bazında değil colorMap ile kurulur. PROGRESS (2026-08-27) hücrenin içine çubuk ya da halka çizer: progressVariant bar|circle · max (varsayılan 100) · progressLabel none|percent|fraction|value · progressColor + customProgressColor · thresholds [{from,color}] (yüzdeyi geçmeyen en yüksek eşik kazanır) · captionField BAŞKA bir satır alanının metnini çubuğun ÜSTÜNE yazar, yani ad ve çubuk tek hücrede durur. Sıralama/dışa aktarım ham sayıyı görür, çizimi değil.",
|
|
154
124
|
image: "IMAGE/FILE kolonu düz URL string'i KABUL ETMEZ: hücre `{ absolute_path, display_name }` (ya da `fileName`) alanlarını taşıyan bir DOSYA NESNESİ (veya nesne dizisi) bekler — `DisplayCellView.svelte:10` `file.absolute_path ?? ''` okur, düz string verilince kaynak boş kalır ve hücre SESSİZCE boş çizilir (09-04 Y-21). Satır verisi bir metin kolonunda URL taşıyorsa kolonu 'url'/'link' yap ya da veriyi { absolute_path: '<url>', display_name: '<ad>' } biçimine çevir; entity'nin FILE alanı zaten bu şekli döner.",
|
|
155
125
|
actions: "Satır aksiyonları. kind sözlüğü BUTON'unkinden farklıdır: error · information · solid · transparent · dark · danger · warning (butonda success/error/info/primary/warning). Yanlış sözlükten değer invalid-enum-value verir.",
|
|
156
126
|
selectedRow: "Salt okunur: satır aksiyonu tıklanınca komponentin kendisi doldurur; akış ifadesinde '<elementId>.selectedRow' ile okunur.",
|
|
157
|
-
colorMap: "Kolon içi değer→renk sözlüğü: [{ value:'Active', color:'#16a34a' }]. STATİKTİR — hücrenin kendi değerine bakar, satırın başka alanına göre hesaplanamaz. Satıra göre koşullu renk gerekiyorsa ya table + _columns ezmesi kullan ya da satır verisinde rengi taşı ({ label, color }) — render sırası: veri objesindeki color → colorMap[etiket] → autoColor. TAG HÜCRE ŞEKLİ: metin, { label, color? } ya da { value, color? } (label yoksa value okunur; ikisi de yoksa obje ham JSON basılır) veya bunların dizisi. RENK (veri objesinde de colorMap'te de): semantik ad primary · info · success · warning · error TEMA TOKEN'INA çözülür (tema değişince izler, ham hex yazmaya gerek yok); hex/rgb/'var(--ng-…)'/CSS renk adı olduğu gibi geçer; başka bir değer (yazım hatası, çözülmemiş '{{ }}') o kademeyi ATLAR ve sıradakine düşer. Veri objesindeki variant OKUNMAZ — outline/solid kolonun appearance'ından gelir. Solid rozetin
|
|
127
|
+
colorMap: "Kolon içi değer→renk sözlüğü: [{ value:'Active', color:'#16a34a' }]. STATİKTİR — hücrenin kendi değerine bakar, satırın başka alanına göre hesaplanamaz. Satıra göre koşullu renk gerekiyorsa ya table + _columns ezmesi kullan ya da satır verisinde rengi taşı ({ label, color }) — render sırası: veri objesindeki color → colorMap[etiket] → autoColor. TAG HÜCRE ŞEKLİ: metin, { label, color? } ya da { value, color? } (label yoksa value okunur; ikisi de yoksa obje ham JSON basılır) veya bunların dizisi. RENK (veri objesinde de colorMap'te de): semantik ad primary · info · success · warning · error TEMA TOKEN'INA çözülür (tema değişince izler, ham hex yazmaya gerek yok); hex/rgb/'var(--ng-…)'/CSS renk adı olduğu gibi geçer; başka bir değer (yazım hatası, çözülmemiş '{{ }}') o kademeyi ATLAR ve sıradakine düşer. Veri objesindeki variant OKUNMAZ — outline/solid kolonun appearance'ından gelir. Solid rozetin yazı rengi token'da CSS ile siyah/beyaz seçilir.",
|
|
158
128
|
tableStyle: "zebra | plain — satır zemini varyantı; CSS DEĞİL. Serbest CSS için ayrı `style` prop'u vardır (parça bazlı).",
|
|
159
|
-
style: "Parça bazlı CSS: &__toolbar · &__title · &
|
|
160
|
-
filterMode: "column | bar | none — satır içi filtre arayüzü; gelişmiş koşul oluşturucu ondan bağımsız advancedFilter anahtarıdır, ikisi birlikte açılabilir. Hepsi aynı filters dizisini yazar, akış/bağlantı farkı görmez. column/bar modunda VE/VEYA ve grup kurulamaz (kök kurallar and ile bağlanır); oradan uygulanan filtre yalnız o kolonun kök kurallarını değiştirir, gelişmiş paneldeki grup/or kuralları KORUNUR ve kolon/bar kuralları panelde kural olarak görünür. Bar'ın 'Filtreleri temizle'si yalnız bar kurallarını kaldırır. Eski düğümdeki filterMode=advanced (advancedFilter yazılmamışken) gelişmiş oluşturucu olarak okunur.",
|
|
161
|
-
advancedFilter: "boolean (şema varsayılanı false) — gelişmiş koşul oluşturucu ('Filtre (n)' düğmesi + panel), filterMode'dan bağımsız. Yazılmamış eski düğümde filterMode=advanced ya da boşsa açık sayılır.",
|
|
162
|
-
paginationMode: "pages | infinite — yalnız isPaginated açıkken. infinite'te akış/bağlantı yine TEK sayfa döner; birikimi komponent yapar (offset 0 sıfırlar). totalRows yazılmazsa 'daha var mı' bilinemez ve yükleme durur.",
|
|
163
|
-
toolsPosition: "top-right | top-left | bottom-right | bottom-left — yenile/dışa aktar/kolon menüsü grubunun köşesi (advanced Filtre düğmesi bu grupta DEĞİLDİR, bkz. filterPosition). Alt köşede footer alttaysa onun içine, üstteyse tablonun altındaki ayrı çubuğa oturur.",
|
|
164
|
-
filterPosition: "left | right — yalnız advancedFilter açıkken: 'Filtre (n)' düğmesi hep tablonun üstündeki çubuktadır; left'te başlığın hemen sağına (başlık yoksa sol kenara), right'ta sağ kenara (üstteki araçlardan önce) oturur.",
|
|
165
|
-
paginationPosition: "left | right — footer'da sayfa başına + sayfa numaralarının yeri: left kayıt sayısının ardı (yeni tablonun varsayılanı), right sağ kenar (prop yazılmamış eski düğüm).",
|
|
166
|
-
stickyHeader: "Başlık satırı (ve column modundaki filtre satırı) tablonun KENDİ dikey kaydırmasında üstte kalır — tablo sabit yükseklikliyken anlamlıdır; kendi yüksekliğiyle uzayan tablo sayfayla kaydığından etkisizdir.",
|
|
167
|
-
stickyFooter: "Footer sayfa kaydırmasında görünür kenara yapışır (footerPosition top'ta üste, bottom'da alta) — kendi yüksekliğiyle uzayan uzun tabloda sayfalamayı erişilir tutar.",
|
|
168
|
-
size: "sm | md | lg — satır yüksekliği (hücre dikey boşluğu 6/12/16px), gövde yazısı (12/13/14px) ve başlık yüksekliği (32/40/48px). Varsayılan md.",
|
|
169
|
-
footerPosition: "bottom | top — toplam kayıt + sayfalama çubuğu; üstteyken stickyFooter ile sayfa kaydırmasında üstte kalabilir.",
|
|
170
|
-
addRowButton: "bottom | top | none — canAddRow açıkken '+ Satır ekle' satırının yeri; none'da yeni satır yalnız Ctrl/Cmd+Enter (addRowShortcut) ile açılır.",
|
|
171
|
-
showExport: "Görünen kolonlar × eldeki satırlar CSV'si (bu sayfa; infinite'te o ana kadar yüklenenler) — sunucudaki tüm sonuç DEĞİL.",
|
|
172
|
-
loadError: "Salt okunur: Connect Data bağlantısının son okuma hatası (başarılı okuma temizler). Satır yoksa gövde hata durumu + 'Tekrar dene', satır varsa üstte şerit. Bağlı olmayan tabloda akış yazabilir."
|
|
129
|
+
style: "Parça bazlı CSS: &__toolbar · &__title · &__head · &__th · &__body · &__row · &__td. designerCss her bildirime !important ekler, yani komponentin kendi çerçeve/ayraç varsayılanlarını ezer — Figma tipi düz tablo bununla kurulur."
|
|
173
130
|
}
|
|
174
131
|
},
|
|
175
132
|
form: {
|
|
176
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.",
|
|
177
134
|
behavior: [
|
|
135
|
+
LAYOUT_ABSENT_NOTE,
|
|
178
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).",
|
|
179
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 ve uca olduğu gibi verilebilir. Page.components.<form>.isValid mount'ta ve her değişimde SESSİZCE yeniden hesaplanır (gizli alanlar muaf, form düzeyi kurallar dahil) — mesaj göstermez; submit düğmesini {{ !Page.components.<form>.isValid }} ile kilitlemenin yolu budur. İkisini setter ile YAZMA, sonraki değişimde ezilir.",
|
|
180
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).",
|
|
181
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).",
|
|
182
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.",
|
|
183
|
-
"KORUMALI ALAN (f-31): maskeli değer forma ASLA isMasked'sız value olarak bağlanmaz — güncelleme formunda korumalı alanın textinput'u value'yu kaydın alanına, isMasked'ı satır metasına birlikte bağlar (textinput.propNotes.isMasked). isMasked:true iken BOŞ bırakılan alan required doğrulamasına TAKILMAZ; kullanıcı yazarsa sıradan alan gibi doğrulanır. Boş değerin GÖNDERİLMEMESİ submit akışının isteği nasıl kurduğuna bağlıdır: microservice çağrısının parametre bağı null/'' değeri gövdeye koymaz (saklı değer korunur); gövde akış kodunda ya da setter göreviyle elle kuruluyorsa null GİDER — canWrite yoksa 403 AccessFieldWriteDeniedException, varsa saklı değer SİLİNİR. O durumda boş maskeli alanı gövdeden çıkar.",
|
|
184
141
|
"Formu temizlemek için akış kodunda resetForm('<form adı>') çağrılır (2026-09-15): alanlar başlangıç değerine döner, form gönderilmemiş hâline geçer, hata işaretleri ve form-validation-errors listesi silinir. Alanları setter ile tek tek null'a çekmek YANLIŞ yoldur: form bir kez gönderildiyse her change doğrulamayı yeniden koşturur ve boş form 'zorunlu alan' mesajlarıyla açılır. Gönderim sonrası otomatik temizlik isteniyorsa isClearFormInputsAfterSubmit aynı sıfırlamayı yapar.",
|
|
185
142
|
"isLoading AÇIKKEN alanlar DOM'dan kalkar, yerine yükleme animasyonu çizilir: kapanınca çocuklar yeniden mount olur ve onların mount olayları İKİNCİ kez çalışır; makinedeki değerler korunur. title boş bırakılırsa başlık bandı hiç çizilmez. Kanvas toolbar'ı (2026-09-18): isClearFormInputsAfterSubmit · isLoading · isHidden — yerleşim grubunu container toolbar'ı zaten çizer."
|
|
186
143
|
],
|
|
@@ -196,34 +153,48 @@ export const componentKnowledge = {
|
|
|
196
153
|
}
|
|
197
154
|
},
|
|
198
155
|
box: {
|
|
199
|
-
summary: "Evrensel bırakma kutusu: container'dan farkı kutu modelinin border-box
|
|
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.",
|
|
200
157
|
behavior: [
|
|
158
|
+
LAYOUT_ABSENT_NOTE,
|
|
201
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).",
|
|
202
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).",
|
|
203
|
-
"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.",
|
|
204
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).",
|
|
205
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.",
|
|
206
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.",
|
|
207
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ı."
|
|
208
167
|
],
|
|
209
168
|
propNotes: {
|
|
210
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.",
|
|
211
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.",
|
|
212
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.",
|
|
213
183
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
214
184
|
hoverStyle: STYLE_GROUP_NOTES.hoverStyle,
|
|
215
|
-
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.",
|
|
216
|
-
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).",
|
|
217
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."
|
|
218
188
|
}
|
|
219
189
|
},
|
|
220
190
|
'box-section': {
|
|
221
|
-
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.",
|
|
222
192
|
behavior: [
|
|
193
|
+
LAYOUT_ABSENT_NOTE,
|
|
223
194
|
'Yüzeysiz sarmalayıcıdır: kendi zemini/kenarlığı yoktur, yalnız bölge ayracını çizer (header altına, footer üstüne).',
|
|
224
195
|
"Palette GÖRÜNMEZ (isHide) ve SİLİNEMEZ (isDeletable:false) — kaldırmanın tek yolu box'ın ilgili anahtarını kapatmaktır.",
|
|
225
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.",
|
|
226
|
-
"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).",
|
|
227
198
|
"role prop'u ('header' | 'footer') bölgenin kimliğidir ve gizlidir; elle değiştirmek yerleşimi bozar.",
|
|
228
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."
|
|
229
200
|
],
|
|
@@ -240,11 +211,12 @@ export const componentKnowledge = {
|
|
|
240
211
|
"Kanvas toolbar'ı: direction · variant · thickness · color · isHidden."
|
|
241
212
|
],
|
|
242
213
|
propNotes: {
|
|
243
|
-
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).',
|
|
244
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.",
|
|
245
217
|
variant: "'solid' | 'dashed' | 'dotted'.",
|
|
246
218
|
thickness: 'Çizgi kalınlığı px; en az 1. Kesikli/noktalı desende parça boyu da bununla büyür.',
|
|
247
|
-
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).",
|
|
248
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.",
|
|
249
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.'
|
|
250
222
|
}
|
|
@@ -252,7 +224,7 @@ export const componentKnowledge = {
|
|
|
252
224
|
spacer: {
|
|
253
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.',
|
|
254
226
|
behavior: [
|
|
255
|
-
"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').",
|
|
256
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ı.",
|
|
257
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.",
|
|
258
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).',
|
|
@@ -260,8 +232,10 @@ export const componentKnowledge = {
|
|
|
260
232
|
],
|
|
261
233
|
propNotes: {
|
|
262
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.",
|
|
263
|
-
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.",
|
|
264
|
-
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."
|
|
265
239
|
}
|
|
266
240
|
},
|
|
267
241
|
popover: {
|
|
@@ -335,23 +309,19 @@ export const componentKnowledge = {
|
|
|
335
309
|
'people listesi @bahsetme önerilerini besler; submit yükündeki mentions bu listeye göre çözülmüş adlardır. Listede olmayan @ad düz metin kalır.',
|
|
336
310
|
'ownOnly açıkken düzenleme/silme yalnız currentUser’ın kendi yorumlarında görünür — yetki KONTROLÜ değil, arayüz filtresidir; asıl kontrol uçtadır.',
|
|
337
311
|
'Kilitler: isDisabled yazma kutusunu soluk (yazılamaz) gösterir; isReadonly ve isViewmode kutuyu hiç çizmez. Üçünde de yanıtla/düzenle/sil gizlenir, beğeni sayacı görünür ama tıklanmaz (like yayılmaz).',
|
|
338
|
-
'Tekrarlanan id’de ilk satır id’sini korur, sonrakiler "<id>#<sıra>" olur ve olay yükleri bu uydurma id’yi taşır (uç tanımaz) — id benzersiz verilmeli.'
|
|
339
|
-
"Süreç kapsamı (scope task | instance, targetId): rows platform yorumlarıdır (Page.bpm.instance(id).comments() — { id, body, authorUserId, postedAt }) ve users listesiyle adlara çevrilir. submit yükündeki process alanı { scope, targetId, visibility, body, mentionUserIds } taşır: @Ad metinde @<kullanıcı id>'sine çevrilmiştir — bahsetme metnin başında ya da boşluktan sonra başlar, ad tam kelime olarak eşleşir (@Alican, Ali değildir), büyük/küçük harf Türkçe kuralla yok sayılır, uzun ad önce; iki kullanıcının paylaştığı ad çevrilmez. Akış Page.bpm.instance(targetId).comment(process.body, process.visibility) ya da Page.bpm.task(targetId).comment(...) çağırır. Bahsedilen kişiye platform metinsiz bildirim yollar (iç yorumda yalnız dış katılımcı olan kişiye hiç). visibility boşsa sürecin commentVisibility'si uygulanır; internal dış katılımcıdan gizler. Süreç kapsamında yanıt, beğeni, düzenleme ve silme kapalıdır (platformda karşılığı yok)."
|
|
312
|
+
'Tekrarlanan id’de ilk satır id’sini korur, sonrakiler "<id>#<sıra>" olur ve olay yükleri bu uydurma id’yi taşır (uç tanımaz) — id benzersiz verilmeli.'
|
|
340
313
|
],
|
|
341
314
|
propNotes: {
|
|
342
315
|
rows: '[{ id, author, text, createdAt, parentId, avatar, likeCount, likedByMe }] — parentId dolu olan satır yanıttır. createdAt ISO metni, "YYYY-AA-GG" ya da Unix zaman damgası (10 hane saniye / 13 hane milisaniye) olabilir; boş author+text satırı atlanır.',
|
|
343
316
|
currentUser: 'Yorum sahipliğini ve ownOnly filtresini belirleyen ad; tüm olay yüklerindeki author budur (yorumun sahibi DEĞİL, işlemi yapan). Boşsa düzenleme/silme ownOnly açıkken gizlenir.',
|
|
344
317
|
people: '@bahsetme önerileri: virgülle ayrılmış metin ya da ad dizisi ({{ users.map((u) => u.name) }}).',
|
|
345
|
-
placeholder: 'Boşsa dile göre "Yorum yaz… (@ ile birini an)" gösterilir; yanıt kutusu da aynı metni kullanır.'
|
|
346
|
-
users: "[{ id, name }] — süreç yorumunda bahsedilebilecek kullanıcılar; öneriler people ile birleşir.",
|
|
347
|
-
scope: "'' (serbest) | task | instance — süreç görevine ya da örneğine yorum.",
|
|
348
|
-
targetId: 'Süreç kapsamında görev ya da örnek kimliği; submit yükünün process.targetId alanına geçer.',
|
|
349
|
-
visibility: "'' (sürecin commentVisibility'si, varsayılan) | all | internal — süreç yorumunun görünürlüğü."
|
|
318
|
+
placeholder: 'Boşsa dile göre "Yorum yaz… (@ ile birini an)" gösterilir; yanıt kutusu da aynı metni kullanır.'
|
|
350
319
|
}
|
|
351
320
|
},
|
|
352
321
|
aibox: {
|
|
353
|
-
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.",
|
|
354
323
|
behavior: [
|
|
324
|
+
LAYOUT_ABSENT_NOTE,
|
|
355
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).",
|
|
356
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.",
|
|
357
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.",
|
|
@@ -364,15 +334,15 @@ export const componentKnowledge = {
|
|
|
364
334
|
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
365
335
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
366
336
|
hoverStyle: STYLE_GROUP_NOTES.hoverStyle,
|
|
367
|
-
|
|
368
|
-
|
|
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).",
|
|
369
340
|
style: STYLE_GROUP_NOTES.styleEscape + " Parça olarak yalnız '&__body' bildirilmiştir çünkü markup'ta gerçekten o eleman vardır."
|
|
370
341
|
}
|
|
371
342
|
},
|
|
372
343
|
container: {
|
|
373
344
|
summary: "Genel kapsayıcı (TİPLİ stil modeli: surfaceStyle · typographyStyle · hoverStyle · headerStyle); children'ını ya FLEX akışıyla (yeni kapsayıcıların varsayılanı) ya da 12 kolonluk IZGARA ile dizer. Her sayfanın kökünde silinemeyen page_container bundandır ve o da aynı düzen prop'larını alır.",
|
|
374
345
|
behavior: [
|
|
375
|
-
"ÇERÇEVE TABANDA VARDIR: tema her container'a kart yüzeyi (1px --ng-border-primary çerçeve) verir. Tasarımda çerçevesi olmayan kutu için container DEĞİL box kullan. container zorunluysa çerçeveyi surfaceStyle ile kapat — { borderTop:'none', borderRight:'none', borderBottom:'none', borderLeft:'none' } (zemin de istenmiyorsa background:'transparent'); style'a ham border yazma. Düzen kaplarında bu yapılmazsa ekran iç içe çerçevelerle çizilir (kullanıcı bildirimi, qm qms-dokumanlar 2026-09-30; platform_guide('page') §Kap seçimi).",
|
|
376
346
|
"states.isWrapper:true iken salt düzen elemanıdır: title ve __header bloğu ÇİZİLMEZ, zemin/çerçeve taşımaz ve gövdesi dolgusuzdur — kart başlığı gerekiyorsa içine text komponenti koy (platform_guide('page') Bilinen sınırlar). Bu kip artık bileşenin kendi CSS'inde: tipli alanlar (surfaceStyle) sayfa köküne de zemin/çerçeve verebilir.",
|
|
377
347
|
"KATMAN SIRASI (K4): tema componentStyles → $preset TABANDIR; tipli grup alanları temayı alan alan EZER; düğümün serbest style'ı SON SÖZDÜR. Yüzey/tipografi/hover/başlık kararlarını style'a ham CSS olarak yazma — alanı varsa gruba yaz.",
|
|
378
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.",
|
|
@@ -385,8 +355,8 @@ export const componentKnowledge = {
|
|
|
385
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.",
|
|
386
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).",
|
|
387
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.",
|
|
388
|
-
"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
|
|
389
|
-
"
|
|
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)."
|
|
390
360
|
],
|
|
391
361
|
propNotes: {
|
|
392
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.",
|
|
@@ -398,11 +368,14 @@ export const componentKnowledge = {
|
|
|
398
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.",
|
|
399
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.",
|
|
400
370
|
size: "'shrink' (çocuklar flex: 0 1 auto, varsayılan) | 'grow' (flex: 1 1 auto — çocuklar boşluğu paylaşır).",
|
|
401
|
-
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).
|
|
402
|
-
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ı.",
|
|
403
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).",
|
|
404
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.",
|
|
405
|
-
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."
|
|
406
379
|
}
|
|
407
380
|
},
|
|
408
381
|
repeater: {
|
|
@@ -459,8 +432,7 @@ export const componentKnowledge = {
|
|
|
459
432
|
placeholder: 'Seçim yokken kutuda duran metin; aynı zamanda yükleniyor satırının metnidir.',
|
|
460
433
|
searchText: "Gizli durum prop'u: bileşen OKUMAZ, `search` olayıyla yazar. Uzak aramada sorguyu akışta self.searchText ile oku.",
|
|
461
434
|
selectedLabel: "Gizli durum prop'u: `change` seçilen option'ın label metnini buraya yazar (temizlemede boş metin). Yalnız kullanıcı seçimiyle dolar — value'yu akıştan yazmak burayı GÜNCELLEMEZ.",
|
|
462
|
-
isLoading: 'Uzak arama/doldurma sürerken akıştan açılır; alan kilitlenmez, yalnız spinner ve yükleniyor satırı çizilir.'
|
|
463
|
-
loadError: "Salt okunur: Connect Data bağlantısının son okuma hatası (başarılı okuma temizler). Doluyken açılan liste 'sonuç yok' yerine bu metni gösterir — okuma izni yoksa (403) platformun yerelleştirilmiş 'Bu kaynağa erişim izniniz yok.' metni (39/02 U-2). Bağlı olmayan dropdown'da akış yazabilir."
|
|
435
|
+
isLoading: 'Uzak arama/doldurma sürerken akıştan açılır; alan kilitlenmez, yalnız spinner ve yükleniyor satırı çizilir.'
|
|
464
436
|
}
|
|
465
437
|
},
|
|
466
438
|
'multi-select': {
|
|
@@ -519,7 +491,6 @@ export const componentKnowledge = {
|
|
|
519
491
|
"inputMask seçiliyse yazılan metin anında maskeye biçimlenir ve value biçimli halidir ('0(555) 123 45 67' gibi); ham rakam istiyorsan akışta ayıkla. Maske dışı karakterler sessizce düşer."
|
|
520
492
|
],
|
|
521
493
|
propNotes: {
|
|
522
|
-
isMasked: "KORUMALI ALAN (f-31): value her zamanki gibi kaydın alanına bağlanır, isMasked yanına satır metasına: {{ Steps.<satırıOkuyanAdım>.data.__protected?.<alan> === 'masked' }}. true iken bağlı value maske metni sayılır ve GÖSTERİLMEZ: alan BOŞ başlar, yer tutucu uygulama dilinde 'Değiştirmek için yeni değer girin' olur (placeholder prop'u o sürece gösterilmez) ve mount SONRASI value null'a yazılır, maske metni düğümde kalmaz (tasarım kanvasında yazılmaz). Bu yazım şemada OLMAYAN 'maskCleared' emit'iyle yapılır — akış bağlanamaz, change/changed ÇALIŞMAZ. Kullanıcı yazınca sıradan girdidir; value girdinin yazmadığı bir değere dönerse (forma başka satır seçildi, akış alanı sıfırladı) yeni kaydın maskesi yine gizlenir ve null'a çekilir. Yalnız isMasked bağlamak da çalışır ama plain satırda da alan boş kalır. Boş değer yalnız microservice parametre bağında gövdeden DÜŞER (saklı değer korunur); akış kodunda ya da setter göreviyle elle kurulan gövdede null GİDER — canWrite yoksa 403 AccessFieldWriteDeniedException, varsa saklı değer SİLİNİR. Formda boş bırakılan maskeli alan required'a takılmaz. value'yu maskeli kayda bağlayıp isMasked vermemek maskeyi geri gönderir — yapma.",
|
|
523
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.',
|
|
524
495
|
inputMask: "Hazır maske anahtarı (pattern:/date:/time:/regex:…); serbest desen için 'custom:' öneki ('custom:(###) ###-####').",
|
|
525
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.",
|
|
@@ -628,7 +599,7 @@ export const componentKnowledge = {
|
|
|
628
599
|
'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.',
|
|
629
600
|
'Kilitli (isDisabled/isReadonly/isViewmode) ya da isLoading olan kutu hiçbir olay yaymaz; focus/blur de susar.',
|
|
630
601
|
'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.',
|
|
631
|
-
'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.
|
|
602
|
+
'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.',
|
|
632
603
|
'Birden çok seçenek gerekiyorsa checkbox yığmak yerine checkboxgroup kullan: değeri string[] ve seç-tümü/sayaç onda hazır.'
|
|
633
604
|
],
|
|
634
605
|
propNotes: {
|
|
@@ -827,7 +798,7 @@ export const componentKnowledge = {
|
|
|
827
798
|
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.",
|
|
828
799
|
text: 'Butonun üzerindeki metin (varsayılan "Attach File"); ikon sabittir. Alanın başlığı ayrı bir prop\'tur: label.',
|
|
829
800
|
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).',
|
|
830
|
-
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.
|
|
801
|
+
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.',
|
|
831
802
|
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.',
|
|
832
803
|
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.',
|
|
833
804
|
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ı).",
|
|
@@ -947,6 +918,8 @@ export const componentKnowledge = {
|
|
|
947
918
|
"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.",
|
|
948
919
|
"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.",
|
|
949
920
|
"isLoading açıkken içerik yerine iskelet çizilir ve hiçbir tıklama olayı yayılmaz.",
|
|
921
|
+
"İÇ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).",
|
|
922
|
+
"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.",
|
|
950
923
|
'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.'
|
|
951
924
|
],
|
|
952
925
|
propNotes: {
|
|
@@ -955,7 +928,12 @@ export const componentKnowledge = {
|
|
|
955
928
|
imageWidth: 'Görselin bant İÇİNDEKİ genişliği (px). Yazılmazsa bandın tamamı; dar yazılırsa görsel bantta ortalanır.',
|
|
956
929
|
imageFit: "cover|contain|fill|none — CSS object-fit. Temizlenirse 'cover'.",
|
|
957
930
|
isLoading: 'Akışın ya da tasarımcının açtığı iskelet: içerik yerine parlayan kutular çizilir, click/buttonClick yayılmaz.',
|
|
958
|
-
title:
|
|
931
|
+
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.",
|
|
932
|
+
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.',
|
|
933
|
+
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.",
|
|
934
|
+
isHidden: 'Ortak katman görünürlüğü: true iken kart DOM’a girmez.',
|
|
935
|
+
style: STYLE_GROUP_NOTES.styleEscape +
|
|
936
|
+
" 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."
|
|
959
937
|
}
|
|
960
938
|
},
|
|
961
939
|
'qm-card': { summary: 'QM gösterge kartı; click yayar.' },
|
|
@@ -971,12 +949,14 @@ export const componentKnowledge = {
|
|
|
971
949
|
"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."
|
|
972
950
|
],
|
|
973
951
|
propNotes: {
|
|
974
|
-
surfaceStyle:
|
|
975
|
-
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.",
|
|
952
|
+
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.",
|
|
953
|
+
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).",
|
|
976
954
|
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.",
|
|
955
|
+
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).",
|
|
977
956
|
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).",
|
|
978
957
|
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).',
|
|
979
|
-
hideTabs: 'Başlık satırını gizler; içerik yalnız selected ile değişir.'
|
|
958
|
+
hideTabs: 'Başlık satırını gizler; içerik yalnız selected ile değişir.',
|
|
959
|
+
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.'
|
|
980
960
|
}
|
|
981
961
|
},
|
|
982
962
|
'collapsible-container': {
|
|
@@ -989,7 +969,7 @@ export const componentKnowledge = {
|
|
|
989
969
|
"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)."
|
|
990
970
|
],
|
|
991
971
|
propNotes: {
|
|
992
|
-
title:
|
|
972
|
+
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).",
|
|
993
973
|
description: 'Başlığın altındaki ikinci satır. Boş bırakılırsa hiç çizilmez.',
|
|
994
974
|
openButtonText: 'Bölüm KAPALIYKEN düğmede yazan metin; açıkken de close karşılığı yazılmamışsa bu kullanılır.',
|
|
995
975
|
closeButtonText: 'Bölüm AÇIKKEN düğmede yazan metin. Yalnız bunu yazmak kapalı durumu etkilemez: orada varsayılan +/− göstergesi çizilir.',
|
|
@@ -999,10 +979,10 @@ export const componentKnowledge = {
|
|
|
999
979
|
closeButtonVariant: 'Açık durumun düğme rengi; aynı seçenekler.',
|
|
1000
980
|
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.',
|
|
1001
981
|
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.',
|
|
1002
|
-
isLoading:
|
|
982
|
+
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).",
|
|
1003
983
|
isHidden: 'Düğümü hiç kurmaz: kapalı bir bölüm değil, olmayan bir bölümdür (ortak katman).',
|
|
1004
984
|
style: 'BEM parçaları: &__header (başlık şeridi) ve &__body (gövde).',
|
|
1005
|
-
surfaceStyle:
|
|
985
|
+
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."
|
|
1006
986
|
}
|
|
1007
987
|
},
|
|
1008
988
|
'tree-view': {
|
|
@@ -1012,10 +992,9 @@ export const componentKnowledge = {
|
|
|
1012
992
|
"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.",
|
|
1013
993
|
'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.',
|
|
1014
994
|
"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).",
|
|
1015
|
-
"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 (
|
|
995
|
+
"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.",
|
|
1016
996
|
"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).",
|
|
1017
997
|
"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.",
|
|
1018
|
-
"BAĞLI VERİ (2026-09-17, f-32): data connectData'ya bağlanabilir; children rolü ÜST KAYIT alanıdır (parent_id ya da self ilişki). Runtime satırları toTree ile iç içe children'a çevirir (üstü boş/listede yok → kök, döngüdeki satır köke, derinlik 10), sayfalamayı kapatır ve ilk 1000 satırı okur (CD-009). Anahtar kaynağın birincil anahtarıdır; query/workflow kaynağında yoktur, o zaman key (yoksa value) rolünün alanı kullanılır — anahtarsız satırlar köke düşer. Bağlantı yazmaz; seçim yine click olayıdır.",
|
|
1019
998
|
'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.',
|
|
1020
999
|
'isLoading iskelet satır çizer; veri (ya da arama sonucu) boşsa emptyText basılır. data içindeki null / düz değer öğeler atlanır.',
|
|
1021
1000
|
'Satır ikonu icon > image > varsayılan klasör ikonu sırasıyla seçilir; satırdaki isHidden satırı hiç çizmez, isDisabled satır tıklamasını ve kutusunu kilitler (dalı yine açılıp gezilebilir).'
|
|
@@ -1042,8 +1021,7 @@ export const componentKnowledge = {
|
|
|
1042
1021
|
"EMEKLİ prop'lar: isBold, align, color, customColor şemada YOK — yazılırsa unknown-prop ile reddedilir. Karşılıkları: typographyStyle.fontWeight ('600'), textAlign, textColor (semantik renk için tema token'ı: var(--ng-status-success) gibi). Kayıtlı eski sayfalarda bu prop'lar render anında takma adla çözülür (resolvedStyle bunu gösterir), yeni yazımda kullanılmaz.",
|
|
1043
1022
|
"Hover grubu yok (metnin hover semantiği yok); surfaceStyle etiket/vurgulu paragraf içindir (zemin, köşe, çerçeve, gölge) ve contentOverflow alanı yoktur (taşma hedefi yok). METNİN taşması surfaceStyle'ın işi değildir, lineClamp prop'unundur.",
|
|
1044
1023
|
"Olay YOKTUR: şema events sözlüğü boştur, componentEvents kaydı da yoktur. Metne tıklamayı akışa bağlamak isteyen düğümü button ya da bir kaba sarar.",
|
|
1045
|
-
"KATMAN SIRASI (K4): tema componentStyles → $preset TABANDIR; tipli grup alanları temayı alan alan EZER; düğümün serbest style'ı SON SÖZDÜR. Grubun karşılamadığı kararı style kanalına (custom properties) yaz."
|
|
1046
|
-
PROTECTED_VALUE_NOTE + " Metinde: yalnız record + recordField birlikte verilince devreye girer; maskeliyken content YOK SAYILIR ve record[recordField] (maske metni) çizilir."
|
|
1024
|
+
"KATMAN SIRASI (K4): tema componentStyles → $preset TABANDIR; tipli grup alanları temayı alan alan EZER; düğümün serbest style'ı SON SÖZDÜR. Grubun karşılamadığı kararı style kanalına (custom properties) yaz."
|
|
1047
1025
|
],
|
|
1048
1026
|
propNotes: {
|
|
1049
1027
|
content: "Düz metin; {{ }} ile ifadeye bağlanır. 0 ve false BASILIR (bkz. behavior). Biçimli içerik (kalın parça, liste, link) metnin içinde DEĞİL ayrı komponentte kurulur: html ya da texteditor.",
|
|
@@ -1051,10 +1029,7 @@ export const componentKnowledge = {
|
|
|
1051
1029
|
isLoading: 'Metnin yerine nabız atan bir iskelet çubuğu çizer ve aria-busy yazar; content hiç basılmaz. Veri gelene kadar gösterilecek yer tutucu içindir, akıştan setter ile açılıp kapatılır.',
|
|
1052
1030
|
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
1053
1031
|
typographyStyle: STYLE_GROUP_NOTES.typographyStyle + ' ' + STYLE_GROUP_NOTES.colorTokens,
|
|
1054
|
-
style: STYLE_GROUP_NOTES.styleEscape
|
|
1055
|
-
record: "KORUMALI DEĞER İÇİN: content'in bağlandığı SATIR nesnesi ({{ musteriTablosu.selectedRow }}); recordField ile birlikte verilir. Korumasız metinde boş bırak.",
|
|
1056
|
-
recordField: "record içindeki alan slug'ı ('tckn'). Satırın __protected metası bu alanı 'masked' işaretlerse metin kilitli maske olarak çizilir.",
|
|
1057
|
-
revealEntity: REVEAL_ENTITY_NOTE
|
|
1032
|
+
style: STYLE_GROUP_NOTES.styleEscape
|
|
1058
1033
|
}
|
|
1059
1034
|
},
|
|
1060
1035
|
image: {
|
|
@@ -1124,11 +1099,10 @@ export const componentKnowledge = {
|
|
|
1124
1099
|
'color yalnız status adıdır: primary|info|success|warning|error; başka her şey (hex dahil) nötr gri çizer. variant: solid (varsayılan, açık zemin) | outline (renkli kenarlık). isActive:true zemini belirginleştirir (hover seçili etiketi değiştirmez) — filtre çipi gibi seçili etiketi göstermek için akıştan yaz.',
|
|
1125
1100
|
"Düğümün olaylarında clickItem satırı varsa etiketler düğme olur (el imleci, hover, klavyeyle odak) — satıra akış seçilmemiş olsa bile; clickItem satırı yoksa salt metindir. Yayında event.data = { currentItem, index }, öğe ayrıca self.currentItem'a yazılır. index values dizisindeki GERÇEK yerdir (atlanan öğeler kaydırmaz) — akış values[index].isActive'i değiştirip values'u geri yazarak seçimi çevirebilir. Bileşen isActive'i kendisi DEĞİŞTİRMEZ.",
|
|
1126
1101
|
"Eski şemada öğe anahtarı active'di ve runtime okumuyordu (2026-09-16 düzeltildi); kayıtlı sayfalardaki active:true artık etkilidir ama paneldeki Active anahtarı onu KAPALI gösterir (isActive okur); yeni yazımda isActive kullan, eski öğeyi kapatmak için isActive:false yaz.",
|
|
1127
|
-
'Etiket eklemek/silmek gereken ekranda tag-input kullan; tags değer yazmaz, change yaymaz.'
|
|
1128
|
-
"isDisabled:true (yalnız boolean true) etiketi soluk çizer ve tıklanamaz yapar: düğme disabled olur, clickItem çalışmaz. Sayısı 0 olan süzgeç çipi için akıştan yaz (2026-09-30)."
|
|
1102
|
+
'Etiket eklemek/silmek gereken ekranda tag-input kullan; tags değer yazmaz, change yaymaz.'
|
|
1129
1103
|
],
|
|
1130
1104
|
propNotes: {
|
|
1131
|
-
values: "[{ label, color?, variant?, isActive
|
|
1105
|
+
values: "[{ label, color?, variant?, isActive? }] ya da düz metin dizisi. color: primary|info|success|warning|error; variant: solid|outline.",
|
|
1132
1106
|
currentItem: "Gizli prop: son tıklanan öğe (values'taki nesnenin tamamı, düz metin dizisinde metnin kendisi). index yalnız event.data'da.",
|
|
1133
1107
|
style: "Kök düğüm ve '&__tag' alt anahtarı (her etiket)."
|
|
1134
1108
|
}
|
|
@@ -1145,10 +1119,11 @@ export const componentKnowledge = {
|
|
|
1145
1119
|
'İ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.'
|
|
1146
1120
|
],
|
|
1147
1121
|
propNotes: {
|
|
1148
|
-
header:
|
|
1149
|
-
content:
|
|
1122
|
+
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.",
|
|
1123
|
+
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).",
|
|
1150
1124
|
showIcon: 'Tür ikonunu çizer. false iken ikon kolonu hiç oluşturulmaz (metin sola yaslanır) ve panelde icon alanı gizlenir.',
|
|
1151
|
-
|
|
1125
|
+
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.",
|
|
1126
|
+
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).",
|
|
1152
1127
|
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.',
|
|
1153
1128
|
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.',
|
|
1154
1129
|
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.',
|
|
@@ -1177,11 +1152,13 @@ export const componentKnowledge = {
|
|
|
1177
1152
|
breadcrumb: {
|
|
1178
1153
|
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.',
|
|
1179
1154
|
behavior: [
|
|
1155
|
+
"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.",
|
|
1156
|
+
"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.",
|
|
1180
1157
|
'Üç 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.',
|
|
1181
1158
|
"Öğ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.",
|
|
1182
1159
|
'currentTitle tıklanabilir değildir (aria-current="page"); kip etiketi (Yeni/Düzenle) gibi kullanılacaksa akış bu prop’a setter ile yazar.',
|
|
1183
1160
|
"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.",
|
|
1184
|
-
'İ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
|
|
1161
|
+
'İ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.',
|
|
1185
1162
|
'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.'
|
|
1186
1163
|
],
|
|
1187
1164
|
propNotes: {
|
|
@@ -1195,8 +1172,10 @@ export const componentKnowledge = {
|
|
|
1195
1172
|
}
|
|
1196
1173
|
},
|
|
1197
1174
|
'page-header': {
|
|
1198
|
-
summary: 'Sayfa başlığı bandı: links dizisinden çizilen kırıntı izi + ALTINDA
|
|
1175
|
+
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.',
|
|
1199
1176
|
behavior: [
|
|
1177
|
+
"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').",
|
|
1178
|
+
"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.",
|
|
1200
1179
|
'İ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.',
|
|
1201
1180
|
"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).",
|
|
1202
1181
|
'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.',
|
|
@@ -1205,6 +1184,7 @@ export const componentKnowledge = {
|
|
|
1205
1184
|
'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).'
|
|
1206
1185
|
],
|
|
1207
1186
|
propNotes: {
|
|
1187
|
+
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.",
|
|
1208
1188
|
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.",
|
|
1209
1189
|
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).",
|
|
1210
1190
|
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.',
|
|
@@ -1215,16 +1195,22 @@ export const componentKnowledge = {
|
|
|
1215
1195
|
}
|
|
1216
1196
|
},
|
|
1217
1197
|
header: {
|
|
1218
|
-
summary: "Uygulama üst çubuğu (layout parçası): logo,
|
|
1198
|
+
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.",
|
|
1219
1199
|
behavior: [
|
|
1220
1200
|
"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.)",
|
|
1221
1201
|
"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.",
|
|
1222
1202
|
"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.",
|
|
1223
|
-
"navigation öğesi
|
|
1203
|
+
"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.",
|
|
1204
|
+
"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.",
|
|
1205
|
+
"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).",
|
|
1206
|
+
"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)."
|
|
1224
1207
|
],
|
|
1225
1208
|
propNotes: {
|
|
1226
|
-
activeNavHref: "Vurgulanacak bağlantının
|
|
1227
|
-
navigation: "[{ title, href, icon }] — tek
|
|
1209
|
+
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.",
|
|
1210
|
+
navigation: "[{ title, href (bağlantı seçici), icon: { name, color }, children: [aynı şekil] }] — children tek düzey açılır alt menüdür.",
|
|
1211
|
+
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.",
|
|
1212
|
+
style: "Parçalar: &__logo, &__title, &__navigations, &__navigations-item, &__navigations-item-suffix, &__submenu, &__submenu-item, &__menu-toggle, &__user, &__user-icon, &__user-short, &__user-name.",
|
|
1213
|
+
userShortName: "Doluysa ad yerine rozet, boşsa account_circle ikonu çizilir. userName boşsa kullanıcı alanı hiç çizilmez."
|
|
1228
1214
|
}
|
|
1229
1215
|
},
|
|
1230
1216
|
sidebar: {
|
|
@@ -1234,28 +1220,56 @@ export const componentKnowledge = {
|
|
|
1234
1220
|
"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.",
|
|
1235
1221
|
"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).",
|
|
1236
1222
|
"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.",
|
|
1237
|
-
"
|
|
1223
|
+
"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.",
|
|
1224
|
+
"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.",
|
|
1225
|
+
"KAYDIRMA (SB-002): kök ekran yüksekliğindedir ve taşmaz; uzun menü içerik alanının İÇİNDE kayar.",
|
|
1238
1226
|
"Menü olay YAYMAZ (şemada yalnız mount), satır tıklaması akış tetiklemez — gezinme ham <a href> ile tam sayfa yükleyerek olur.",
|
|
1239
1227
|
"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.",
|
|
1240
|
-
"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."
|
|
1228
|
+
"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.",
|
|
1229
|
+
"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.",
|
|
1230
|
+
"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.",
|
|
1231
|
+
"isHidden:true sidebar'ı ve menüsünü tamamen kaldırır (dar ekrandaki menü düğmesi dahil).",
|
|
1232
|
+
"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."
|
|
1241
1233
|
],
|
|
1242
1234
|
propNotes: {
|
|
1235
|
+
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).",
|
|
1236
|
+
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.",
|
|
1237
|
+
subtle: "Başlığın altındaki kısa açıklama; yalnız title ya da logo doluyken çizilir.",
|
|
1238
|
+
isHidden: "true → sidebar tamamen kalkar.",
|
|
1243
1239
|
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.",
|
|
1244
|
-
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).
|
|
1245
|
-
style: "
|
|
1240
|
+
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).",
|
|
1241
|
+
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.",
|
|
1242
|
+
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.",
|
|
1243
|
+
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."
|
|
1244
|
+
}
|
|
1245
|
+
},
|
|
1246
|
+
'auth-layout': {
|
|
1247
|
+
summary: 'Giriş ekranı kabuğu: logo kolonu + form slotu; primaryClick/secondaryClick olayları yayar.',
|
|
1248
|
+
behavior: [
|
|
1249
|
+
"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.",
|
|
1250
|
+
"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.",
|
|
1251
|
+
"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)."
|
|
1252
|
+
],
|
|
1253
|
+
propNotes: {
|
|
1254
|
+
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.",
|
|
1255
|
+
style: "Serbest CSS kaçış kanalı; parçalar: &__background (sol, resimli kolon), &__content (sağ, formlu kolon), &__title (başlık).",
|
|
1256
|
+
backdrop: "Varsayılan boş — paketle gelen yedek resim kullanılır.",
|
|
1257
|
+
primaryDisabled: 'Birincil düğmeyi ve Enter ile gönderimi birlikte kapatır.'
|
|
1246
1258
|
}
|
|
1247
1259
|
},
|
|
1248
|
-
'auth-layout': { summary: 'Giriş ekranı kabuğu: logo kolonu + form slotu; primaryClick/secondaryClick olayları yayar.', propNotes: { surfaceStyle: NODE_SURFACE_NOTE } },
|
|
1249
1260
|
layout: {
|
|
1250
1261
|
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.',
|
|
1251
1262
|
behavior: [
|
|
1252
1263
|
"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.",
|
|
1253
1264
|
"Öğ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.",
|
|
1254
1265
|
"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.",
|
|
1255
|
-
"İÇ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
|
|
1266
|
+
"İÇ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ı.",
|
|
1267
|
+
"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).",
|
|
1268
|
+
"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."
|
|
1256
1269
|
],
|
|
1257
1270
|
propNotes: {
|
|
1258
|
-
surfaceStyle:
|
|
1271
|
+
surfaceStyle: STYLE_GROUP_NOTES.surfaceStyle + ' ' + STYLE_GROUP_NOTES.colorTokens +
|
|
1272
|
+
" 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.",
|
|
1259
1273
|
navigationStyle: NAVIGATION_STYLE_NOTE,
|
|
1260
1274
|
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.",
|
|
1261
1275
|
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ı."
|
|
@@ -1282,17 +1296,24 @@ export const componentKnowledge = {
|
|
|
1282
1296
|
"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.",
|
|
1283
1297
|
"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.",
|
|
1284
1298
|
"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).",
|
|
1299
|
+
"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).",
|
|
1300
|
+
"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).",
|
|
1301
|
+
"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.",
|
|
1302
|
+
"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.",
|
|
1303
|
+
"Ç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.",
|
|
1304
|
+
"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.",
|
|
1305
|
+
"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.",
|
|
1285
1306
|
'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ı).'
|
|
1286
1307
|
],
|
|
1287
1308
|
propNotes: {
|
|
1288
|
-
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.",
|
|
1309
|
+
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.",
|
|
1289
1310
|
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).",
|
|
1290
1311
|
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.",
|
|
1291
1312
|
displayMode: "'full' ikon+metin · 'rail' yalnız ikon (alt seviyeler kademeli flyout) · 'text' yalnız metin.",
|
|
1292
1313
|
nestingMode: "Derin seviyeler nasıl açılır: 'inline' | 'drill' | 'cascade'. Rail'de her zaman cascade'e zorlanır.",
|
|
1293
1314
|
inlineDepth: 'Bir panelde yerinde gösterilecek seviye sayısı; daha derini drill/flyout/alt drawer ile açılır.',
|
|
1294
1315
|
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).",
|
|
1295
|
-
cascadeLayout: "Alt drawer'ların dizilişi: 'side' yan yana | 'stack' üst üste. Sığmazsa ve mobilde otomatik stack.",
|
|
1316
|
+
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.",
|
|
1296
1317
|
activeHref: 'Vurgulanacak satırın adresi; boş bırakılırsa tarayıcıdaki adres karar verir.',
|
|
1297
1318
|
isHidden: 'Komponentin tamamını gizler (ortak katman prop’u); öğe bazlı gizleme navigations[].isHidden’dır.',
|
|
1298
1319
|
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.",
|
|
@@ -1304,7 +1325,7 @@ export const componentKnowledge = {
|
|
|
1304
1325
|
sidebarSide: "Panelin ekranın hangi kenarında duracağı: 'left' | 'right'. sidebar, hybrid ve dual düzenlerinde anlamlı; diğerlerinde panel yoktur.",
|
|
1305
1326
|
sidebarStyle: "'docked' panel kenara yapışır ve tek kenarlık taşır; 'floating' onu dört yanı boşluklu, köşeli ve gölgeli bir karta çevirir. sidebar, hybrid ve dual düzenlerinde anlamlı.",
|
|
1306
1327
|
width: "Panel genişliği (px, 160–480). Rail modunda YOK SAYILIR — orada genişlik satır yüksekliği ve ikon kutusundan hesaplanır (navigation-tokens.ts railWidth). Drawer menü tipinde de okunmaz; onun genişliği drawerWidth’tir.",
|
|
1307
|
-
collapsible: "Panelin başlığına daraltma düğmesi koyar; ziyaretçi menüyü rail’e indirip geri açabilir
|
|
1328
|
+
collapsible: "Panelin başlığına daraltma düğmesi koyar; ziyaretçi menüyü rail’e indirip geri açabilir. Rail zaten daraltılmış olduğu için orada, drawer’da da anlamsızdır.",
|
|
1308
1329
|
levelStyle: "Derin seviyelerin TİPOGRAFİSİ: 'uniform' her seviye aynı punto; 'tapered' 2. seviyeden itibaren satır kısalır ve yazı bir tık küçülüp soluklaşır, böylece derinlik göz kararıyla okunur. Girintiyi DEĞİŞTİRMEZ (o indent/maxIndent’in işi). Rail’de karşılığı yoktur.",
|
|
1309
1330
|
nestedStyle: "Çocuğu olan satır nasıl çizilsin: 'indent' normal bir satırdır (açılır/kapanır); 'subheader' küçük bir BÖLÜM BAŞLIĞI olur ve çocukları hep açık durur. Düz menüde her dal böyledir. Akordiyonda (2026-09-25) yalnız ADRESSİZ ve isExpandable İŞARETLENMEMİŞ iç öğe başlığa döner, çocukları başlıkla aynı hizada çizilir — «Yetki yönetimi» (isExpandable: true) açılır modül kalır, içindeki «Organizasyon» etikettir. Varsayılan 'indent' kayıtlı menüleri değiştirmez.",
|
|
1310
1331
|
hMenuStyle: "Header’da bir üst öğenin alt menüsü nasıl açılır: 'dropdown' altında küçük panel; 'mega' çubuğun tamamı boyunca çok kolonlu panel; 'tabs' alt öğeler ikinci bir satırda sekme çubuğu olur (açılır panel yok). Yalnız header düzeninde geçerlidir.",
|
|
@@ -1339,14 +1360,14 @@ export const componentKnowledge = {
|
|
|
1339
1360
|
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.",
|
|
1340
1361
|
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.",
|
|
1341
1362
|
launcherMode: "'popover' ızgara küçük bir panelde açılır; 'page' tüm sayfayı kaplar. Yalnız launcher düzeninde geçerlidir.",
|
|
1342
|
-
tileCols: "Izgaradaki kolon sayısı (2–6). Yalnız launcher düzeninde geçerlidir.",
|
|
1363
|
+
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.",
|
|
1343
1364
|
tileStyle: "Karo görünümü: 'icon' yalın ikon + ad; 'card' zeminli, kenarlıklı kart. Yalnız launcher düzeninde geçerlidir.",
|
|
1344
1365
|
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.",
|
|
1345
1366
|
footerDepth: "Kolonlarda gösterilecek seviye sayısı (1–9). Yalnız footerStyle columns iken anlamlı — sıkışık dizilişte tek seviye vardır.",
|
|
1346
1367
|
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.",
|
|
1347
|
-
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.",
|
|
1368
|
+
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.",
|
|
1348
1369
|
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.",
|
|
1349
|
-
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.",
|
|
1370
|
+
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.",
|
|
1350
1371
|
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.",
|
|
1351
1372
|
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.",
|
|
1352
1373
|
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.",
|
|
@@ -1373,7 +1394,7 @@ export const componentKnowledge = {
|
|
|
1373
1394
|
dividers: "Kök GRUPLAR arasına ayraç çizgisi koyar. Grup içi satırları ayırmaz.",
|
|
1374
1395
|
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.",
|
|
1375
1396
|
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.",
|
|
1376
|
-
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.",
|
|
1397
|
+
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.",
|
|
1377
1398
|
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.",
|
|
1378
1399
|
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.",
|
|
1379
1400
|
bgColor: "Menünün zemini. Boş bırakılırsa theme’in değeri geçerli kalır.",
|
|
@@ -1398,14 +1419,17 @@ export const componentKnowledge = {
|
|
|
1398
1419
|
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.",
|
|
1399
1420
|
behavior: [
|
|
1400
1421
|
"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.",
|
|
1401
|
-
"
|
|
1402
|
-
"
|
|
1422
|
+
"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.",
|
|
1423
|
+
"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.",
|
|
1424
|
+
"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.",
|
|
1425
|
+
"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.",
|
|
1426
|
+
"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.",
|
|
1403
1427
|
"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."
|
|
1404
1428
|
],
|
|
1405
1429
|
propNotes: {
|
|
1406
|
-
surfaceStyle:
|
|
1430
|
+
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.',
|
|
1407
1431
|
sidebarOpen: 'Yan panelin açık olup olmadığı; canlı durumdur, bağlanabilir.',
|
|
1408
|
-
mobileBehavior: "'drawer' (varsayılan;
|
|
1432
|
+
mobileBehavior: "'drawer' (varsayılan; mobilde kapalı başlar) | 'stack' (mobilde açık başlar).",
|
|
1409
1433
|
style: "&__body ve &__overlay parçaları uygulanır."
|
|
1410
1434
|
}
|
|
1411
1435
|
},
|
|
@@ -1414,14 +1438,18 @@ export const componentKnowledge = {
|
|
|
1414
1438
|
behavior: [
|
|
1415
1439
|
"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.",
|
|
1416
1440
|
"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ü).",
|
|
1417
|
-
"
|
|
1441
|
+
"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.",
|
|
1442
|
+
"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.",
|
|
1443
|
+
"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).",
|
|
1444
|
+
"top/bottom şeridi ızgaradaki alanının tam yüksekliğini alır (REG-004, 2026-09-29; önce içeriği kadar çiziliyordu).",
|
|
1445
|
+
"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.",
|
|
1418
1446
|
"appearance.hideOn, dockMobile'ı HER ZAMAN yener; dockMobile:'hidden' yalnız bölge-yerel kısayoldur."
|
|
1419
1447
|
],
|
|
1420
1448
|
propNotes: {
|
|
1421
|
-
surfaceStyle:
|
|
1422
|
-
dock: "left | right | top | bottom | fill — biçim/yön
|
|
1449
|
+
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').",
|
|
1450
|
+
dock: "left | right | top | bottom | fill — biçim/yön; masaüstünde konum blocks[]'ten gelir, mobilde sırayı dock belirler.",
|
|
1423
1451
|
dockMobile: "inherit (varsayılan; masaüstünü izler) | left | right | top | bottom | drawer (içeriğin üstüne biner) | hidden.",
|
|
1424
|
-
isCollapsible:
|
|
1452
|
+
isCollapsible: "Bölgenin kapanabilir olup olmadığı; false iken bölge shell kapanınca da açık kalır (mobil drawer hariç).",
|
|
1425
1453
|
isCollapsed: 'Kapalı başlar; bir Durum değişkenine bağlanabilir.',
|
|
1426
1454
|
style: '&__body parçası uygulanır.'
|
|
1427
1455
|
}
|
|
@@ -1435,20 +1463,6 @@ export const componentKnowledge = {
|
|
|
1435
1463
|
]
|
|
1436
1464
|
},
|
|
1437
1465
|
view: { summary: 'Tabs/switcher altındaki görünüm kapsayıcısı; children gruplamaya yarar.' },
|
|
1438
|
-
'datatable-cell': {
|
|
1439
|
-
summary: 'datatable kolonunun HÜCRE ŞABLONU: tablonun çocuğu olan çerçevesiz kapsayıcı; içindeki bileşenler o kolonun hücresine HER SATIRDA çizilir ve satırı item olarak okur.',
|
|
1440
|
-
behavior: [
|
|
1441
|
-
"YALNIZ bir datatable'ın DOĞRUDAN çocuğu olarak anlamlıdır ve toolbox'ta yoktur (isHide). column prop'u tablonun columns[].name değerlerinden biri olmalıdır; eşleşmeyen ya da boş column ile düğüm hiçbir yerde çizilmez. Aynı column ile iki şablon varsa yalnız İLKİ çizilir.",
|
|
1442
|
-
"Şablonu olan kolonun hücresinde kolonun type/format ayarları (tag, progress, tarih biçimi…) ÇİZİLMEZ — hücreyi şablon doldurur; sıralama, filtre ve CSV yine satırın ham değerini kullanır. O hücre satır içi düzenlemeye açılmaz; maskeli (korumalı) hücrede şablon değil kilitli maske çizilir.",
|
|
1443
|
-
"İçindeki düğümlerin KOD bağlamalarında item o satırdır: {{ item.title }}. item SALT OKUNURDUR (repeater'daki gibi satıra geri yazmaz). Bağlı (connectData) tabloda item sunucudan gelen satırdır; ilişki alanı nesnedir ({{ item.kategori.ad }}).",
|
|
1444
|
-
'Kapsayıcıdır (isDroppable): içine text, image, tag, button, container… bırakılır. Satır başına bir kopya çizildiği için ağır bileşen (chart, iç içe tablo) koyma; sayfa boyu × kolon sayısı kadar örnek oluşur.',
|
|
1445
|
-
"HÜCRENİN KAPSAYICISIDIR (2026-09-21): container'ın yerleşim prop'larını taşır — layout flex (varsayılan, 2026-09-22; direction row) | grid (12 kolonluk ızgara); flex'te direction/horizontalAlign/verticalAlign/gap/wrap. Kapsayıcısı çerçevesiz ve SAYDAMDIR (satırın zemini görünür; style.background ezer). Tasarımcı yarattığında iç/dış boşluğu yoktur (appearance paddingType/marginType none) ve element id'si kolon adıyla başlar (<kolon>-cell…). Tek başına silinemez (isDeletable false); şablonu kaldırmak kolonu kendi biçimine (tag, progress…) döndürür. Tasarımcı yeni hücreye kolonun değerine kodla bağlı bir text koyar ({{ item.<kolon> }}, ilişkide {{ item.<kolon>.<görünen alan> }})."
|
|
1446
|
-
],
|
|
1447
|
-
propNotes: {
|
|
1448
|
-
column: "Şablonun ait olduğu kolonun name'i (columns[].name). Zorunlu; tasarımcıda kolon başlığındaki tasarım düğmesi yazar.",
|
|
1449
|
-
layout: "flex (varsayılan, direction row) | grid — container'ınkiyle aynı anlam; flex'te direction, horizontalAlign, verticalAlign, gap ve wrap açıktır, grid'de gizlenir."
|
|
1450
|
-
}
|
|
1451
|
-
},
|
|
1452
1466
|
'widget-area': {
|
|
1453
1467
|
summary: 'Widget’ların yerleştirildiği alan: widget şemasının KÖK düğümü (widgetType: container).',
|
|
1454
1468
|
behavior: [
|
|
@@ -1597,7 +1611,9 @@ export const componentKnowledge = {
|
|
|
1597
1611
|
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.',
|
|
1598
1612
|
behavior: [
|
|
1599
1613
|
"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.",
|
|
1600
|
-
"Öğ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
|
|
1614
|
+
"Öğ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.",
|
|
1615
|
+
"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.",
|
|
1616
|
+
"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.",
|
|
1601
1617
|
'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.',
|
|
1602
1618
|
'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.'
|
|
1603
1619
|
],
|
|
@@ -1606,7 +1622,12 @@ export const componentKnowledge = {
|
|
|
1606
1622
|
maxVisibleItems: 'Satır içinde kalacak öğe sayısı (varsayılan 1).',
|
|
1607
1623
|
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.',
|
|
1608
1624
|
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.',
|
|
1609
|
-
isLoading: 'İçerik yerine iskelet çizer (iz çubuğu + başlık çubuğu). Akış izi yazana kadar açık tutulur.'
|
|
1625
|
+
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.',
|
|
1626
|
+
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.",
|
|
1627
|
+
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.",
|
|
1628
|
+
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.",
|
|
1629
|
+
isHidden: 'Düğümü hiç çizmez (ortak katman). Öğe bazlı gizleme items[].isHidden’dır.',
|
|
1630
|
+
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."
|
|
1610
1631
|
}
|
|
1611
1632
|
},
|
|
1612
1633
|
carousel: {
|
|
@@ -1649,16 +1670,13 @@ export const componentKnowledge = {
|
|
|
1649
1670
|
}
|
|
1650
1671
|
},
|
|
1651
1672
|
chart: {
|
|
1652
|
-
summary: 'ECharts tabanlı grafik (bar/line/area/pie/donut + waterfall, histogram, pareto, bullet, tornado, radial, funnel, gauge, radar, funnelflow, scatter).
|
|
1673
|
+
summary: 'ECharts tabanlı grafik (bar/line/area/pie/donut + waterfall, histogram, pareto, bullet, tornado, radial, funnel, gauge, radar, funnelflow, scatter). VERİ ÇEKMEZ: satırlar rows prop’una akışla yazılır.',
|
|
1653
1674
|
behavior: [
|
|
1654
1675
|
"Veri prop'u data DEĞİL rows'tur (data eski adıdır, yalnız geriye uyumluluk için duruyor). Kategori categoryField, değerler series[].valueField ile çözülür.",
|
|
1655
1676
|
'seriesField + valueField birlikte verilirse satırlar "kategori+seri başına bir satır" sayılıp geniş biçime pivotlanır; series dizisi o zaman prop’tan değil veriden türetilir.',
|
|
1656
1677
|
'aggregate/sort/topN/nullMode veriyi çizimden ÖNCE dönüştürür — aynı işi akışta yapmana gerek yok.',
|
|
1657
1678
|
'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.',
|
|
1658
1679
|
'isExportable "tablo olarak gör" + dışa aktarma araç çubuğunu açar; showRefresh refresh olayını yayan bir yenile düğmesi ekler.',
|
|
1659
|
-
"BAĞLI VERİ (2026-09-17, f-31): rows birincil bağlanabilir prop (fieldProps: rol seçimi categoryField/seriesField/valueField'a da yazılır). Ham tablo satırlarında seriesField + valueField + aggregate: toplama pivottan ÖNCE kategori+seri çifti başına yapılır (yığın grafik doğru toplam). funnelSources ikinci yuva (name, count). SERİ BAŞINA KAYNAK: series[i].data kendi başına bağlanır (prop yolu series.<i>.data, roller category + value); noktalar kategoriye göre rows'a birleşir, değer serinin valueField'ına (boşsa series_<i>). aggregate birleşmeden önce BİR kez uygulanır (count nokta sayısı); aggregate yoksa aynı kategorinin son noktası kazanır. Seri öğesi bağlanınca statik örnek rows aynı commit'te boşalır. rows da bağlıysa iki kaynak birleşir, uyarı yok; ilk bağlantı (rows) birincildir, series okumaları yükleniyor durumuna dokunmaz.",
|
|
1660
|
-
"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).",
|
|
1661
|
-
'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).',
|
|
1662
1680
|
"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.",
|
|
1663
1681
|
'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.',
|
|
1664
1682
|
'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.',
|
|
@@ -1667,7 +1685,7 @@ export const componentKnowledge = {
|
|
|
1667
1685
|
'PANELDE GÖRÜNMEYEN AYAR ÖLÜ AYAR DEĞİL: barStyle, useDecalPatterns, sampling, isLarge, isZoomable, selectionMode, dataLabels ve legend artık yalnız kendi builder’larının OKUDUĞU tiplerde görünür. Bir ayarı panelde bulamıyorsan seçtiğin chartType onu okumuyor demektir — zorlamak yerine tipi değiştir.'
|
|
1668
1686
|
],
|
|
1669
1687
|
propNotes: {
|
|
1670
|
-
rows: 'Satır dizisi
|
|
1688
|
+
rows: 'Satır dizisi; mount/filter akışlarının setter hedefi.',
|
|
1671
1689
|
legend: "{ show, position, orient, showValues }. position artık DÖRT yön: top | bottom | left | right (2026-08-27). Yana yaslanan legend her zaman dikey çizilir — yatay seçilse bile ezilir, çünkü yandaki yatay legend grafiğin üstüne biner. showValues YALNIZ pasta/halkada iş görür: seri adının yanına dilim değerini yazar.",
|
|
1672
1690
|
centerLabel: "{ show, text, subtext } — YALNIZ donut. text boş bırakılırsa dilim değerlerinin TOPLAMI yazılır (valueFormat uygulanır), yani 'ortadaki toplam' için ayrı bir setter gerekmez. Pastada delik olmadığı için görünmez ve panelde gizlidir.",
|
|
1673
1691
|
categoryField: 'Kategori ekseni alan adı (varsayılan "label"). SCATTER’DA x ekseninin SAYISAL kolonudur (y = series[0].valueField) — eski xField adı geriye uyumluluk için ayrılmış durumda, onu kullanma.',
|
|
@@ -1710,7 +1728,7 @@ export const componentKnowledge = {
|
|
|
1710
1728
|
emptystate: {
|
|
1711
1729
|
summary: 'Boş ekran/liste bloğu: görsel ya da ikon + başlık + açıklama + aksiyon düğmeleri. Olayları mount ve actionClick.',
|
|
1712
1730
|
behavior: [
|
|
1713
|
-
"
|
|
1731
|
+
"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.",
|
|
1714
1732
|
'image verilirse icon ÇİZİLMEZ (görsel ikonu ezer); ikisi birden gösterilmez.',
|
|
1715
1733
|
'isDisabled aksiyon tıklamayı yutar: ne kendi flow’u çalışır ne actionClick yayılır.',
|
|
1716
1734
|
'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.',
|
|
@@ -1719,11 +1737,16 @@ export const componentKnowledge = {
|
|
|
1719
1737
|
'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.'
|
|
1720
1738
|
],
|
|
1721
1739
|
propNotes: {
|
|
1722
|
-
image: 'Drive dosyası ya da URL; verildiğinde icon yok sayılır.',
|
|
1723
|
-
|
|
1740
|
+
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).',
|
|
1741
|
+
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.",
|
|
1742
|
+
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.',
|
|
1743
|
+
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.',
|
|
1744
|
+
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.",
|
|
1745
|
+
style: "Köke uygulanır. Parçalar: '&__icon', '&__image', '&__title', '&__description', '&__actions'.",
|
|
1746
|
+
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).',
|
|
1724
1747
|
align: 'left | center | right — metin, ikon ve düğmeler birlikte hizalanır.',
|
|
1725
|
-
icon: '
|
|
1726
|
-
iconColor:
|
|
1748
|
+
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.",
|
|
1749
|
+
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).",
|
|
1727
1750
|
isLoading: 'Akış veriyi getirene kadar iskelet. Bileşen geri yazmaz, yalnız akış sürer.',
|
|
1728
1751
|
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.'
|
|
1729
1752
|
}
|
|
@@ -1855,19 +1878,31 @@ export const componentKnowledge = {
|
|
|
1855
1878
|
progress: {
|
|
1856
1879
|
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.',
|
|
1857
1880
|
behavior: [
|
|
1858
|
-
"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).",
|
|
1881
|
+
"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.",
|
|
1859
1882
|
'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.',
|
|
1860
1883
|
'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.'
|
|
1861
1884
|
],
|
|
1862
1885
|
propNotes: {
|
|
1863
1886
|
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.',
|
|
1864
|
-
value:
|
|
1887
|
+
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).",
|
|
1888
|
+
max: 'Yüzdenin paydası (varsayılan 100, en az 1). Temizlenirse 100 sayılır.',
|
|
1889
|
+
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.',
|
|
1890
|
+
showTrack: 'Dolgunun arkasındaki izi çizer (varsayılan true). Kapalıyken çubukta iz saydam olur, dairede iz çemberi hiç çizilmez.',
|
|
1891
|
+
isHidden: 'Ortak katman görünürlüğü: true iken gösterge DOM’a girmez.',
|
|
1892
|
+
variant: 'bar (varsayılan) | circle. Dairede okuma ortadadır; labelPosition ve isStriped okunmaz. Daire çapı size ile değişir: 56 / 84 / 112px.',
|
|
1893
|
+
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.',
|
|
1894
|
+
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).",
|
|
1895
|
+
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.',
|
|
1896
|
+
trackColor: 'İzin rengi; boşsa tema yüzey tonu. custom seçilirse customTrackColor okunur. showTrack kapalıyken okunmaz ve panelde gizlenir.',
|
|
1897
|
+
customTrackColor: 'Yalnız trackColor custom iken okunur.',
|
|
1898
|
+
style: "Köke uygulanır. Parçalar: '&__caption' (label), '&__track' (iz), '&__fill' (dolgu), '&__label' (değer okuması).",
|
|
1899
|
+
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.',
|
|
1865
1900
|
showLabel: 'DEĞER okumasını açar (40% · 3/10 · 40) — label prop’unu değil. Panel başlığı "Show value".',
|
|
1866
1901
|
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.',
|
|
1867
1902
|
colorMap: '{ "0": "error", "50": "warning", "80": "success" } — thresholds’un ESKİ biçimi, panelde gizli, yalnız thresholds boşken okunur. Yeni iş thresholds yazar.',
|
|
1868
1903
|
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.',
|
|
1869
1904
|
isStriped: 'Yalnız barda; dairede stroke üzerinde görünmez.',
|
|
1870
|
-
labelPosition: 'DEĞER okumasının yeri (
|
|
1905
|
+
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).'
|
|
1871
1906
|
}
|
|
1872
1907
|
},
|
|
1873
1908
|
rating: {
|
|
@@ -1885,18 +1920,22 @@ export const componentKnowledge = {
|
|
|
1885
1920
|
result: {
|
|
1886
1921
|
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.',
|
|
1887
1922
|
behavior: [
|
|
1888
|
-
'
|
|
1923
|
+
"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.",
|
|
1889
1924
|
'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ı).',
|
|
1890
1925
|
'Görsel slotu hiç boş kalmaz: image doluyken ikon çizilmez, ama adres yüklenemezse durum ikonuna geri dönülür.',
|
|
1891
1926
|
'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.',
|
|
1892
1927
|
'mount ortak katmandan gelir ve sayfa açılınca bir kez yayılır; sonucu dolduran akışın kancası budur.'
|
|
1893
1928
|
],
|
|
1894
1929
|
propNotes: {
|
|
1895
|
-
icon:
|
|
1930
|
+
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ı.",
|
|
1931
|
+
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.",
|
|
1932
|
+
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.',
|
|
1933
|
+
isHidden: 'Ortak katman görünürlüğü: true iken blok DOM’a girmez, mount da yayılmaz.',
|
|
1934
|
+
style: "Köke uygulanır. Parçalar: '&__icon' (ikon çipi), '&__image', '&__title', '&__subtitle', '&__actions'.",
|
|
1896
1935
|
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.',
|
|
1897
1936
|
status: 'Hem rengi hem varsayılan ikonu belirler; tanınmayan/boş değer info okunur.',
|
|
1898
1937
|
align: 'İçeriğin yatay hizası: metin, ikon ve düğmeler birlikte döner.',
|
|
1899
|
-
size: '
|
|
1938
|
+
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).',
|
|
1900
1939
|
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.',
|
|
1901
1940
|
isLoading: 'Sonuç henüz belli değilken açılır: blok iskelete döner, actionClick yayılmaz. Akışın kendisi kapatmalı — kendiliğinden kapanmaz.'
|
|
1902
1941
|
}
|
|
@@ -1925,11 +1964,8 @@ export const componentKnowledge = {
|
|
|
1925
1964
|
'Tipli stil grupları kartın PARÇALARINA iner: typographyStyle.textColor başlık + değer + alt başlığı birlikte boyar (trend anlam rengini, alt satır bağlantı rengini korur), fontSize kartın bütün puntolarını orantılı ölçekler, hoverStyle.background tıklanabilir yüzeyde ve alt satırda da geçerlidir. Kartın ipucu için prop yoktur; düğümün ortak appearance.tooltip alanı kullanılır.'
|
|
1926
1965
|
],
|
|
1927
1966
|
propNotes: {
|
|
1928
|
-
value: 'Sayı ya da metin; sayıysa valueFormat uygulanır.
|
|
1929
|
-
|
|
1930
|
-
valueAggregate: "Bağlı rows'tan ana değer: first (varsayılan; ilk satırın value'su — tek değer döndüren query/microservice), count (kaynağın meta.total'ı → totalRows, 1000'i aşan kaynakta da tam), sum · avg · min · max (okunan satırlar). Bağlama bu prop'u yazmaz; page_schema_patch set_prop ile seçilir.",
|
|
1931
|
-
totalRows: 'Gizli; runtime bağlantısı yazar (count özeti okur). Elle yazılmaz.',
|
|
1932
|
-
sparkline: 'Sayı dizisi; kendi min/max’ına göre ölçeklenir (sıfır tabanlı değil). Connect Data ile de bağlanır (ikincil prop, prop: sparkline) — araç çubuğundaki Connect data artık ana değeri (rows) bağlar.',
|
|
1967
|
+
value: 'Sayı ya da metin; sayıysa valueFormat uygulanır.',
|
|
1968
|
+
sparkline: 'Sayı dizisi; kendi min/max’ına göre ölçeklenir (sıfır tabanlı değil).',
|
|
1933
1969
|
trend: 'Değişim miktarı; işareti yönü ve rengi belirler, birimini trendFormat söyler. 0 nötrdür ve panelden temizlenemez.',
|
|
1934
1970
|
trendFormat: 'percent (varsayılan) yüzde işaretiyle yazar; value işareti korur, birim yazmaz — mutlak değişim gösteren KPI için.',
|
|
1935
1971
|
isNewTabLink: 'Yalnız footerHref doluyken anlamlı: target="_blank" + rel="noreferrer noopener". Yeni sekmede footerFlow akışı da tamamlanır.',
|
|
@@ -2021,29 +2057,43 @@ export const componentKnowledge = {
|
|
|
2021
2057
|
}
|
|
2022
2058
|
},
|
|
2023
2059
|
toast: {
|
|
2024
|
-
summary: 'Geçici bildirim TETİKLEYİCİSİ:
|
|
2060
|
+
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.',
|
|
2025
2061
|
behavior: [
|
|
2026
2062
|
"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.",
|
|
2027
2063
|
'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.',
|
|
2028
|
-
"
|
|
2064
|
+
"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.",
|
|
2065
|
+
"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.",
|
|
2066
|
+
"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).",
|
|
2029
2067
|
'Toast alanını runtime her uygulamada bir kez kurar — ikinci bir toast komponenti eklemek bildirimleri ÇİFTLEMEZ, her tetikleyici kendi toast’ını atar.',
|
|
2030
2068
|
"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.",
|
|
2031
2069
|
"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.",
|
|
2032
|
-
"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
|
|
2070
|
+
"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."
|
|
2033
2071
|
],
|
|
2034
2072
|
propNotes: {
|
|
2035
|
-
isOpen: 'Setter ile true yaz → bir toast; komponent false’a geri döner.',
|
|
2073
|
+
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).',
|
|
2036
2074
|
kind: 'default | info | success | error | warning | loading.',
|
|
2037
2075
|
position: '9 çapa: top/bottom × left/center/right, center, top-full/bottom-full (tam genişlik bant).',
|
|
2038
2076
|
actions: '[{ text, flow, keepOpen, showCountdown }] — en çok 2 düğme.',
|
|
2039
2077
|
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.",
|
|
2040
2078
|
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.',
|
|
2041
|
-
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.",
|
|
2079
|
+
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.",
|
|
2042
2080
|
duration: 'ms; 0 ya da boş = türün varsayılan süresi. Hiç kapanmaması için isSticky.',
|
|
2043
2081
|
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.",
|
|
2044
2082
|
showProgress: "Yalnız süreli toast'ta çizilir: isSticky ya da kind loading iken ilerleme çubuğu zaten yok.",
|
|
2045
2083
|
pauseOnHover: "Yalnız süreli toast'ta anlamlı: duraklatılacak bir sayaç yoksa (isSticky, loading) etkisizdir.",
|
|
2046
|
-
isHidden: 'Açıkken komponent hiç kurulmaz: toast ATILMAZ. Gizli bir tetikleyici değil, kapalı bir tetikleyicidir — isOpen true yazmak da bir şey göstermez.'
|
|
2084
|
+
isHidden: 'Açıkken komponent hiç kurulmaz: toast ATILMAZ. Gizli bir tetikleyici değil, kapalı bir tetikleyicidir — isOpen true yazmak da bir şey göstermez.',
|
|
2085
|
+
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.',
|
|
2086
|
+
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.",
|
|
2087
|
+
isSticky: 'true iken toast kendiliğinden kapanmaz ve ilerleme çubuğu çizilmez; duration yok sayılır (panelde de gizlenir).',
|
|
2088
|
+
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.",
|
|
2089
|
+
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.",
|
|
2090
|
+
showCopyButton: 'Kartta kopyala düğmesi çizer: başlık + içerik panoya gider (başlık varsa ilk satırda).',
|
|
2091
|
+
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.",
|
|
2092
|
+
delay: 'ms; toast bu kadar bekledikten sonra çıkar, open olayı da o zaman yayılır. Boş = hemen.',
|
|
2093
|
+
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.',
|
|
2094
|
+
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.",
|
|
2095
|
+
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.",
|
|
2096
|
+
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."
|
|
2047
2097
|
}
|
|
2048
2098
|
},
|
|
2049
2099
|
// — 2026-08-27 eşleme turu: components-new dalıyla gelen 6 yeni komponent.
|
|
@@ -2059,12 +2109,10 @@ export const componentKnowledge = {
|
|
|
2059
2109
|
"fields[].field nokta ayraçlı iç içe yol alır (department.title, items.0.name); yol kopuksa hücre '-' basar, patlamaz. Aynı alanı iki satırda iki ayrı formatla göstermek geçerlidir (2026-09-16'dan önce sayfayı düşürüyordu).",
|
|
2060
2110
|
"format: money/pertance/date/datetime/number biçimlenir, 'text' ham String basar. number dilin ayıraçlarını kullanır (tr 84.500), sayıya çevrilemezse ham metne düşer; money her zaman TRY'dir; pertance (yazımı böyle) <=1'i oran, >1'i yüzde sayar; geçersiz tarih ham metne düşer. boolean değeri ✓/✗ işaretine çevirir — yalnız false/0/'false'/'0' hayırdır, tanınmayan dolu metin evettir (table'ın 'switch' kolon tipinin detailview'daki adı 'boolean').",
|
|
2061
2111
|
"locale boşken uygulama diline CANLI bağlıdır (dil değişince yeniden biçimler); size boş kaydedilir ve 'md' varsayılanı komponentin içinde çözülür.",
|
|
2062
|
-
"columns 1-4'tür ama sınırı zorlayan tek yüzey kanvas toolbar'ıdır: sağ panel büyük değeri uyarı ikonuyla KABUL EDER ve öyle kaydeder, runtime yine 1-4'e kırpar ve kesirli değeri tam sayıya indirir — yani 8 yazılmış bir sayfa 4 kolon çizer. link formatı görünen metni ham bırakır ama href'i düzeltir: şemasız değer https:// alır, e-posta gibi duran değer mailto: olur, '/...' ve '#...' olduğu gibi kalır; BEYAZ LİSTE dışındaki şema (javascript:, data:…) hiç bağlantı olmaz, değer düz metin basılır."
|
|
2063
|
-
PROTECTED_VALUE_NOTE + " Künyede: kaydın __protected metası bir alanı maskeli işaretlerse o alanın format'ı UYGULANMAZ, kilitli maske çizilir; nokta ayraçlı iç içe yollar metaya bakılmadan normal çizilir (meta kök alan slug'ı taşır)."
|
|
2112
|
+
"columns 1-4'tür ama sınırı zorlayan tek yüzey kanvas toolbar'ıdır: sağ panel büyük değeri uyarı ikonuyla KABUL EDER ve öyle kaydeder, runtime yine 1-4'e kırpar ve kesirli değeri tam sayıya indirir — yani 8 yazılmış bir sayfa 4 kolon çizer. link formatı görünen metni ham bırakır ama href'i düzeltir: şemasız değer https:// alır, e-posta gibi duran değer mailto: olur, '/...' ve '#...' olduğu gibi kalır; BEYAZ LİSTE dışındaki şema (javascript:, data:…) hiç bağlantı olmaz, değer düz metin basılır."
|
|
2064
2113
|
],
|
|
2065
2114
|
propNotes: {
|
|
2066
2115
|
record: 'Gösterilecek TEK kayıt (nesne); akıştan beslenecekse setter hedefi budur. Boş nesne = boş durum.',
|
|
2067
|
-
revealEntity: REVEAL_ENTITY_NOTE,
|
|
2068
2116
|
fields: "[{ label, field, format, icon, isHidden }] — field boş satırlar elenir, isHidden satır çizilmez (table kolonlarındaki isHidden ile aynı iş), label boşsa field kullanılır, icon ETİKETİN yanına çizilir.",
|
|
2069
2117
|
labelPosition: "top (varsayılan) | left — left'te etiket sütunu minmax(96px, %38) ile ayrılır.",
|
|
2070
2118
|
columns: "Izgara kolon sayısı, 1-4. Kanvas toolbar'ı sınıra çeker; sağ panel büyük değeri uyarı ikonuyla kabul eder, runtime yine 1-4'e kırpar.",
|
|
@@ -2079,7 +2127,6 @@ export const componentKnowledge = {
|
|
|
2079
2127
|
"startField'ı geçersiz/boş satır SESSİZCE atılır; end geçersizse start'a eşitlenir, ters aralık start'a kırpılır; id yoksa event-<index> üretilir.",
|
|
2080
2128
|
"Taşıma ve boyutlandırma iyimserdir: eventMove sonrası komponent rows'u DEĞİŞTİRMEZ; akış yeni tarihi uca yazıp rows'u tazeleyince (id:start:end imzası değişince) iyimser katman sıfırlanır — kalıcılaştırılmayan değişiklik, veri değiştiği anda geri döner (kanban ile aynı sözleşme).",
|
|
2081
2129
|
"Veri tazeleme kancası monthChange (oklar/Bugün, HER görünümde) ve viewChange'dir; ikisi de görünen aralığı start/end ('yyyy-MM-dd', iki uç dahil) olarak taşır — sorguyu month/year'a değil start/end'e bağla: ajanda ve hafta ay sınırını aşar, ay ızgarası da komşu ayların günlerini gösterir. end TARİH-YALNIZ ve DAHİLDİR: filtreyi KESİŞİM olarak yaz — etkinlikBaşlangıç < (end + 1 gün) VE etkinlikBitiş >= start; `başlangıç <= end` saatli kolonda son günün saatli kayıtlarını, `başlangıç >= start VE bitiş <= end` kenardan taşan kayıtları düşürür. İlk mount'ta yayılmazlar; açılış aralığını defaultDate/defaultView belirler. month 1-TABANLIDIR.",
|
|
2082
|
-
"BAĞLI VERİ (2026-09-17, f-31): rows bağlıysa (roller title, start, end, color, id; start/end tarih rolü) runtime listeyi görünen ayın çevresiyle okur — yalnız start alanı behavior.filterable'daysa (değilse süzmeden ilk sayfa): start gte ayın 1'i − 7 gün, lt sonraki ayın 1'i + max(7, agendaDays) gün; sayfalanmaz, en çok 1000 olay. İlk okuma defaultDate'in ayıyla (boşsa bugün), monthChange aralık değişince yeniden okur. Aralıktan önce başlayan olay gelmez. Akış yazmak gerekmez.",
|
|
2083
2130
|
"isCreatable:true iken tıklama dateClick YERİNE eventCreate yayar: ay hücresi tek günlük allDay:true, hafta/gün boş slotu 60 dakikalık saatli taslak. Basılı tutup sürüklemek aralık seçer: ayda birden çok gün (allDay:true, end son gün dahil), hafta/gün kolonunda aynı günün birden çok saat slotu, etkinlik bloklarının üstünden de (end son slotun sonu) — bırakınca TEK eventCreate. Sürükleyerek seçim fare/kalemle çalışır; dokunmatikte yalnız tek hücre tıklaması oluşturur. Basış sürerken isLoading açılır ya da isCreatable kapanırsa bırakış olay yaymaz. isCreatable kapalıyken slot tıklaması hiçbir şey yapmaz.",
|
|
2084
2131
|
"isEditable ile sürükleyerek taşıma: ay görünümünde ve tüm-gün şeridinde gün kayar (saat korunur), hafta/gün kolonunda saat 30 dakikaya yuvarlanır; tüm-gün etkinlik saat KAZANMAZ. Hafta/gün görünümünde saatli bloğun üst/alt kenarından boyutlandırma da vardır (30 dk adım, en az 30 dk) ve AYNI eventMove olayını yayar. Ajanda listesinde sürükleme yoktur.",
|
|
2085
2132
|
"Tüm-gün kararı: satırın allDayField (varsayılan 'allDay') bayrağı true ise her zaman tüm gün; false ise yalnız aralıkta saat bilgisi varsa saatli sayılır (tarih-yalnız / 00:00→00:00 satır false'la da şeritte kalır, görünmez olmaz); değer true/false, 'true'/'false', 1/0; bayrak yoksa süresi >=24 saat ya da 00:00→00:00 olan etkinlik tüm gün sayılır. Tüm gün etkinlik saat ızgarası yerine üst şeride çizilir; çok günlü etkinlik ay görünümünde kapladığı HER güne ayrı çip düşer (sürekli bant yok).",
|
|
@@ -2087,13 +2134,11 @@ export const componentKnowledge = {
|
|
|
2087
2134
|
"defaultDate ve defaultView DEĞİŞTİKÇE uygulanır (panelde ya da akıştan yazınca takvim o tarihe/görünüme gider, olay yaymaz); aynı değerle tekrar gelen render kullanıcının gezindiği yeri sıfırlamaz — aynı tarihe tekrar gitmek için değerin değişmesi gerekir.",
|
|
2088
2135
|
"isLoading: takvim soluklaşır, üstte yükleyici; etkinlik tıklaması (Enter dahil), gün/slot tıklaması, aralık seçimi, taşıma ve boyutlandırma OLAY YAYMAZ. Gezinme okları ve görünüm düğmeleri açık kalır (monthChange/viewChange yayılır) — ay değiştirirken yeniden çekme sürebilir.",
|
|
2089
2136
|
"Hafta başlangıcı dile bağlıdır: en Pazar, diğer her dil (tr dahil) Pazartesi — ay ızgarası, gün başlıkları ve hafta görünümü aynı kuralı izler; locale boşsa uygulama dili. startHour/endHour saat penceresini belirler (0–23 / 1–24, endHour en az startHour+1'e kırpılır); pencereye kısmen taşan blok en az 15 dakikalık yükseklikle çizilir.",
|
|
2090
|
-
"Etkinlik her görünümde <elementId>__event-<id> data-element-id'si taşır; bırakma hedefleri ay hücresi ve hafta/gün kolonu <elementId>__day-<yyyy-MM-dd>, tüm gün hücresi __allday-<yyyy-MM-dd>, saat dilimi __slot-<yyyy-MM-dd>T<HH> (YEREL tarih). eventClick 'click' ile, eventMove page_screenshot actions 'drag' (target etkinlik, to gün/slot) ile doğrulanır; slota bırakma o saatin ortasına düşer ve 30 dakikaya yuvarlanır. Çok günlü etkinlik aynı kimliği her gününde taşır, hedef ilk eşleşmedir."
|
|
2091
|
-
"source 'bpm-tasks' iken rows süreç görevleridir (Page.bpm.tasks.calendar(from, to).data): alan eşlemesi okunmaz; state planned görev plannedStartAt'tan dueAt'e uzanır (bilgi rengi), açık görev termin gününde gün boyu kayıt olur — saat penceresi dışındaki termin de hafta/gün görünümünde gün boyu şeridinde görünür (termini geçmişse hata, değilse uyarı rengi; renk dakikada bir tazelenir). Başlık name'in uygulama dilidir. Süreç görevleri sürüklenmez/boyutlanmaz (isEditable yok sayılır). eventClick satırı taskId ile taşır; akış Page.bpm.task(taskId) açar. Aralık en çok 92 gün."
|
|
2137
|
+
"Etkinlik her görünümde <elementId>__event-<id> data-element-id'si taşır; bırakma hedefleri ay hücresi ve hafta/gün kolonu <elementId>__day-<yyyy-MM-dd>, tüm gün hücresi __allday-<yyyy-MM-dd>, saat dilimi __slot-<yyyy-MM-dd>T<HH> (YEREL tarih). eventClick 'click' ile, eventMove page_screenshot actions 'drag' (target etkinlik, to gün/slot) ile doğrulanır; slota bırakma o saatin ortasına düşer ve 30 dakikaya yuvarlanır. Çok günlü etkinlik aynı kimliği her gününde taşır, hedef ilk eşleşmedir."
|
|
2092
2138
|
],
|
|
2093
2139
|
propNotes: {
|
|
2094
2140
|
rows: 'Etkinlik satırları; monthChange/viewChange akışlarının setter hedefi. Alan adları titleField/startField/endField/colorField/idField/allDayField ile çözülür (nokta ayraçlı iç içe yol çalışır; boşsa title/start/end/color/id/allDay).',
|
|
2095
2141
|
allDayField: "Tüm-gün bayrağının kolonu (boşsa 'allDay'). Tanınan değer true/false, 'true'/'false', 1/0; başka değer ya da kolon yoksa aralıktan çıkarılır. true saatli kaydı şeride alır; false 24 saati aşan saatli kaydı ızgarada tutar ama saatsiz (gece yarısı → gece yarısı) kaydı ızgaraya ALMAZ — şeritte kalır.",
|
|
2096
|
-
source: "rows (varsayılan, alan eşlemesi) | bpm-tasks (süreç görevleri: { id, name, dueAt, plannedStartAt, state }).",
|
|
2097
2142
|
colorField: "Geçerli CSS rengi olduğu gibi kullanılır, semantik durum adı tema değişkenine çözülür, tanınmayan değer accent'e düşer. 'info' beyaz temada görünmezdir — ham renk ver.",
|
|
2098
2143
|
maxVisibleEvents: 'Ay hücresinde görünen çip sayısı (varsayılan 3); fazlası +n olur (+n ayrı tıklanmaz, hücre tıklaması sayılır).',
|
|
2099
2144
|
defaultDate: "Açılış tarihi (yyyy-MM-dd; katalog varsayılanı örnek veriyle aynı ay olan '2026-08-01'). Gün korunur: hafta/gün/ajanda o günden açılır. Değiştikçe takvim oraya gider; boşsa bugün. 'bugün' için sabit tarih YAZMAYIN, boş bırakın; ifadeyle bağlanacaksa code prop'u '{{ }}' içinde yazılır: { type: 'code', ref: \"{{ new Date().toISOString().slice(0, 10) }}\" } — parantezsiz ifade metin olarak gelir (PAGE-032 reddeder).",
|
|
@@ -2136,7 +2181,6 @@ export const componentKnowledge = {
|
|
|
2136
2181
|
behavior: [
|
|
2137
2182
|
"cardMove/cardClick/cardAdd/cardRemove yükü BİLİNÇLİ olarak yalnız params ile gider (self'e yazılsa id/from/to çöp prop olur ve tetiklenen render iyimser katmanı aynı karede silerdi): akışta event.data.id / .row / .from / .to / .column ile okunur.",
|
|
2138
2183
|
"Taşıma iyimserdir: komponent rows'u DEĞİŞTİRMEZ; cardMove akışı yeni kolonu uca yazıp rows'u tazeler — (id:kolon) imzası değişince iyimser katman sıfırlanır. Kalıcılaştırılmayan taşıma, veri değiştiği anda eski kolonuna döner.",
|
|
2139
|
-
"BAĞLI VERİ (2026-09-17, f-31): rows bağlıysa (roller title, subtitle, column, color, id) cardMove'da runtime kolon alanını kendisi yazar: tek update { <column rolü alanı>: to, <birincil anahtar> } — tanımda edit.update açık, kolon alanı editable'da ve describe write.update true ise; akış yazılmaz. Yazılamayan ya da reddedilen taşımada liste yeniden okunur ve kart kayıtlı kolonuna döner. id rolü başka alana eşlense de satırın birincil anahtarı ezilmez. columns ikinci yuva (value, label): aynı ya da başka tabloya ayrı bağlanır; ikincil okuma kanbanın isLoading durumuna dokunmaz.",
|
|
2140
2184
|
"Ekleme ve silme İYİMSER DEĞİLDİR: isAddable kolon altına '+ addText' düğmesi koyar ve yalnız cardAdd { column } yayar; isRemovable karta × düğmesi koyar ve yalnız cardRemove { id, row, column } yayar (cardClick yaymaz). Kart ancak akış satırı yazıp/silip rows'u tazeleyince eklenir/kaybolur — silmeden önce onay sormak akışın elindedir.",
|
|
2141
2185
|
"Kolon eşleşmesi columns[].value ile TAM string eşitliğidir; sayı value metne çevrilir (2 ile '2' eşleşir). Eşleşmeyen satır ilk kolona değil 'atanmamış' kuyruğuna düşer (kesikli kenarlık; yalnız doluyken çizilir, başlığı unassignedText, ekleme düğmesi yok). Aynı value'lu ikinci kolon ve value'su boş kolon çizilmez.",
|
|
2142
2186
|
"emptyText iki yerde çizilir: kartı olmayan her kolonun içinde (yalnız doluysa) ve hiç kolon yokken panonun yerinde (boşsa '—').",
|
|
@@ -2199,225 +2243,6 @@ export const componentKnowledge = {
|
|
|
2199
2243
|
canProceed: "Aktif adımın kapısı; ifadeye bağlanır. Yalnız false/'false' engeller.",
|
|
2200
2244
|
currentStep: "0 tabanlı aktif adım; setter hedefi, aralık dışı değer kırpılır. Studio'dan yeni bırakılan düğümde 0 yerine null KAYDEDİLİR (frontend CQ-091, ortak mapper falsy varsayılanı düşürüyor): bileşen null'ı ilk adım sayar ama {{ <stepper>.currentStep }} / self.currentStep kullanıcı ilk kez adım değiştirene kadar null okur — ifadede {{ <stepper>.currentStep || 0 }} yaz. Şemayı kendin yazıyorsan currentStep: 0'ı açıkça ver."
|
|
2201
2245
|
}
|
|
2202
|
-
},
|
|
2203
|
-
'task-inbox': {
|
|
2204
|
-
summary: 'Süreç görev kutusu: sekmeler (bana atanan · grubumun · vekâleten · başlattıklarım · tamamladıklarım · planlı), SLA renk çipi, satır/toplu üstlenme; veriyi KENDİSİ çekmez, rows akıştan (process.task.list sistem ucu, microservice adımı) gelir.',
|
|
2205
|
-
guide: 'bpm',
|
|
2206
|
-
behavior: [
|
|
2207
|
-
"Veri yolu: mount/tabChange akışı `process.task.list` sistem ucunu ({ tab, applicationSlug }) microservice adımıyla çağırır ve Steps.<adım>.data'yı rows'a yazar; sekme sayacı dizinin uzunluğudur (sistem ucu totalData döndürmez). Komponent uç çağırmaz.",
|
|
2208
|
-
"tabChange setter'dır: activeTab self'e yazılır; akış event.data.tab ile yeni sekmeyi okur ve rows'u tazeler. Seçim sekme değişince sıfırlanır.",
|
|
2209
|
-
"SLA çipi dueAt varsa çizilir: createdAt→dueAt penceresinin %50'sine kadar yeşil, %90'a kadar sarı, sonrası kırmızı; süre geçince metin 'Süresi geçti' olur. createdAt yoksa yalnız geçti/geçmedi ayrımı yapılır.",
|
|
2210
|
-
"Üstlen düğmesi ve toplu seçim YALNIZ group sekmesinde, isClaimable !== false ve state open olan satırlarda görünür; claim yükünde version gider — akış process.task.claim { id, version } çağırır, 409'da (TaskAlreadyClaimed) rows'u tazeler.",
|
|
2211
|
-
"claim/bulkClaim/taskClick yükü BİLİNÇLİ olarak yalnız params ile gider (self'e yazılmaz): akışta event.data.taskId / .row / .taskIds ile okunur.",
|
|
2212
|
-
"Satırlarda sekme (tab) alanı varsa yalnız aktif sekmenin satırları gösterilir; yoksa bütün rows aktif sekmeye ait sayılır. pageSize ilk N satırı keser (sayfalama yok).",
|
|
2213
|
-
"Sekme başlıkları tabs boşsa uygulama dilinden gelir; tabs doluysa id/label/count aynen kullanılır (sayaçlar akışın işidir, canlı soket sayacı b-24 ile gelir).",
|
|
2214
|
-
"planned sekmesi plannedStart'ı gelmemiş görevleri listeler; satır state planned iken 'Başlangıç: 3 gün sonra' yazar (açılmış görevde plannedStartAt kalsa da yazı çıkmaz). Planlı görev üstlenilemez/tamamlanamaz, eylem listesi boştur; tarihi gelince platform açar.",
|
|
2215
|
-
"scope realm iken satırda applicationName rozeti çizilir (üç uygulamanın görevleri tek listede); akış process.task.list { tab, scope: 'realm' } okur. 'app' kapsamı platformda 'application'dır: applicationId verilmezse akış sayfanın uygulama slug'ını applicationSlug olarak gönderir (machine.context.state.appName) ve kutu o uygulamanın görevleriyle uygulamasız (proje düzeyi) süreçlerin görevlerini gösterir. Realm kutusu yalnız okumadır; eylemler aynı process.task.* uçlarından.",
|
|
2216
|
-
"Sekmeler rol tablist'tir: sağ/sol ok bir sonraki/önceki sekmeyi ister (tabChange) ve odağı o sekmeye taşır; yalnız etkin sekme Tab sırasındadır.",
|
|
2217
|
-
"Doğal dil araması (showSearch:true): kutu 'bu ay geciken satınalmalar' gibi metni search { q } olayıyla yayar; akış process.task.list { tab, q } sonucunu rows'a yazar; sistem ucu appliedFilter DÖNDÜRMEZ — rozetler gerekiyorsa appliedFilter Page.bpm.tasks(tab, { q }) yanıtından okunur. Rozetler platformun anladığı süzgeçtir: süreç (processNames ile adı), termini geçmiş, açılış aralığı (bitiş günü dahil gösterilir), öncelik ≥ N. 'Süzgeci kaldır' clearFilter yayar ve kutuyu boşaltır; tek rozet kaldırılamaz (sunucu yalnız q kabul eder)."
|
|
2218
|
-
],
|
|
2219
|
-
propNotes: {
|
|
2220
|
-
rows: "[{ id, title, processName, subjectLabel, subjectHref, from, createdAt, dueAt, state, nextStep, isClaimable, version, applicationName?, plannedStartAt?, tab? }] — bpm/tasks satırının düzleştirilmiş hâli (applicationName ← applicationName, plannedStartAt ← plannedStartAt); version claim için gerekir.",
|
|
2221
|
-
activeTab: "mine | group | delegated | started | done | planned; tabChange'in setter hedefi.",
|
|
2222
|
-
tabs: '[{ id, label, count }] — boşsa altı varsayılan sekme uygulama dilinde çizilir.',
|
|
2223
|
-
scope: "app | realm — tabChange yüküyle akışa geçer; realm'de satırda uygulama rozeti çizilir.",
|
|
2224
|
-
timeZone: "IANA saat dilimi (ör. 'Europe/Istanbul') — süzgeç rozetlerindeki açılış aralığı bu dilimde yazılır; boşken tarayıcının dilimi kullanılır. Platform appliedFilter'ın from/to alanlarını UTC gönderir."
|
|
2225
|
-
}
|
|
2226
|
-
},
|
|
2227
|
-
'task-actions': {
|
|
2228
|
-
summary: "İş nesnesinin açık süreç görevi için karar çubuğu: approval'da Onayla/Reddet, user-task'ta düğümün özel eylemleri ya da Tamamla, izin varsa Bilgi iste ve Yeniden ata. Görev yoksa ya da kapalıysa hiç çizilmez.",
|
|
2229
|
-
guide: 'bpm',
|
|
2230
|
-
behavior: [
|
|
2231
|
-
"task akıştan gelir (process.task.get { id } sonucu); state open/claimed/unassigned dışındaysa (waiting-info dahil) çubuk görünmez. kind 'provide-info' görevde yalnız Bilgi gönder çıkar.",
|
|
2232
|
-
"Eylem düğmesi yorum penceresini açar (showComment:true ya da eylem yorum isterse). reject, request-info, provide-info, reassign ve isCommentRequired:true eylemlerde yorum boşken Gönder kilitlidir; reassign yeni atanan kimliğini de ister.",
|
|
2233
|
-
"action yükü YALNIZ params ile gider: event.data = { action, taskId, version, comment?, payload?, targetUserId? }. Akış eylemi sistem ucuna yönlendirir: claim → process.task.claim, unclaim → process.task.unclaim, request-info → process.task.request-info { question: comment }, provide-info → process.task.provide-info { answer: comment }, reassign → process.task.reassign { targetUserId, reason: comment }, start-assessment → process.task.assessment.start, sign → process.task.sign, diğerleri → process.task.complete { action, payload, version, comment }.",
|
|
2234
|
-
"Hata gösterimi error prop'udur: akış 409/422 sonrası error'a { status, code, message } yazar; 409 ya da TaskAlreadyClaimed her zaman 'başkası üstlendi — görev yenilendi' cümlesiyle çizilir, TaskCommentRequired ve UndoWindowClosed kendi cümleleriyle.",
|
|
2235
|
-
"Özel eylemler actions[] ile verilir ({ id, label, completes, isCommentRequired, tone }); approval görevinde Onayla/Reddet'in ardına eklenir. actions boşken task'a bağlı get() yanıtının customActions'ı ({ id, label: { tr, en }, completes }) etiketiyle kullanılır — genel sayfada akış eşleme yazmaz.",
|
|
2236
|
-
"Görev formu: fields ([{ key, label, type, isRequired }]) ya da boşken get() yanıtının formFields'i (düğüm form.dtoId DTO'sunun alanları) çubuğun üstünde çizilir; tip string/textarea → metin, number/float → sayı, bool → onay kutusu, date/datetime/time → tarih. Zorunlu alan boşken karar veren düğmeler (reject, request-info, reassign, provide-info dışındakiler) kilitlidir; değerler action yükünün payload'una key adıyla (sayılar sayı olarak) girer. Görev kapalıyken form çizilmez.",
|
|
2237
|
-
"İmzalı adım (task.signature ya da get() yanıtındaki signature): tamamlayan eylem 'İmzala' (approval'da 'İmzala ve onayla') olur, Reddet ve completes:false özel eylemler kalır. Pencere anlamı salt okunur gösterir, parola zorunlu, e-posta oturumdaki ilk imza için; yük payload.signature = { meaning, email?, password }. Akış process.task.sign { id, meaning, password, email, fileId, comment, payload (signature dışındaki form), version } çağırır — parola parametre ifadesinde event.data.payload.signature'dan okunur, state'e yazılmaz; imzasız tamamlama 422 SignatureRequired, yanlış parola 401 ReauthenticationRequired.",
|
|
2238
|
-
"Çevrimdışı: bağlantı yokken offline 'disabled' adımda ve imzalı adımda düğmeler kilitlenir ve nedeni yazılır; diğer eylemler Page.bpm.task(id).complete ile kuyruğa alınır ({ queued: true }) ve Page.bpm.offline.sync() ile POST bpm/tasks/sync'e gider. pendingCount (Page.bpm.offline.count()) 'Gönderilecek: N' satırını çizer; çakışma satırları Page.bpm.offline.list() ve resolve(clientActionId, 'retry' | 'discard') ile çözülür.",
|
|
2239
|
-
"Yardımcı (showAssistant:true): 'Özetle' assistantSummary { taskId }, 'Sor' kutusu assistantAsk { taskId, question } yayar; akış Page.bpm.task(taskId).assistant(question?) sonucunu assistant'a yazar (istek sürerken { isLoading: true }, hata { error } — ikisi de panelde görünür). Panel 'AI önerisi' rozeti, özet/yanıt, yalnız çubuğun sunduğu önerilen eylem (düğme adıyla), gerekçe ve adımdaki önceki sonuç sayılarını çizer; KARAR DÜĞMESİ YOKTUR (K-33). 'Gerekçeyi yorum taslağına al' yalnız yorum penceresinin başlangıç metnini doldurur; kararı kullanıcı çubuktan verir.",
|
|
2240
|
-
"Okuma sınavı (assessment prop'u doluyken ya da get() yanıtı assessment kuralı taşırken): yalnız Bilgi iste / Yeniden ata düğmeleri kalır, okuma kanıtı eylemi geçen denemeyi bekler. Sınav YALNIZ görev eyleme açıkken çizilir (state open/claimed/unassigned); kapalı ya da bilgi bekleyen görevde sınav bölümü hiç görünmez. questions boşken 'Sınava başla' action { action: 'start-assessment', taskId } yayar — akış process.task.assessment.start { id } sonucunu assessment'e OLDUĞU GİBİ yazar: cevapsız sorular, passScore (soru sayısına kırpılmış), attempts (adımın izin verdiği hak) ve bu kullanıcının son denemesinin lastScore/isPassed'i sunucudan gelir. Sorular kart olarak çizilir (options doluysa seçenek, boşsa metin), 'Deneme N / M · geçme notu P / T' ve cevap sayacı görünür; tüm sorular cevaplanınca 'Cevapları gönder' action { action: 'submit-assessment', taskId, payload: { answers } } yayar — akış process.task.complete { action, payload } çağırır. YÜKTE version YOKTUR: sınavı açmak görevi üstlenir ve sürümü ilerletir, panelin çizildiği sürüm bayattır. Geçerse görev kapanır; kalırsa hak varsa görev açık kalır ve sonraki başlatma yeni denemeyi verir. Denemeler kullanıcı başına sayılır; sınavı yalnız görevin atandığı kişi açıp gönderebilir (başkası 403)."
|
|
2241
|
-
],
|
|
2242
|
-
propNotes: {
|
|
2243
|
-
task: "process.task.get sonucu olduğu gibi ({ task, actions, signature, offline }: düğmeler sunucunun actions listesini izler) ya da görev satırı { id, kind: user-task | approval | provide-info, state, version, requestInfo, allowReassign, signature: { meaning, level, reauth }, offline: allowed | disabled }. signature.meaning yoksa diyalog anlam seçtirir; reauth:false ise parola sorulmaz.",
|
|
2244
|
-
pendingCount: "Çevrimdışı kuyrukta bekleyen eylem sayısı (Page.bpm.offline.count()); 0 iken satır çizilmez.",
|
|
2245
|
-
actions: '[{ id, label, completes, isCommentRequired, tone }] — tanımdaki actions[] ile aynı id. Boş bırakılırsa get() yanıtının customActions\'ı kullanılır.',
|
|
2246
|
-
fields: "[{ key, label, type: string | textarea | number | date | datetime | time | bool, isRequired }] — boşsa get() yanıtının formFields'i (DTO alanları: key = slug, label = ad).",
|
|
2247
|
-
error: "{ status, code, message } — akışın son eylem hatası; boşken mesaj çizilmez.",
|
|
2248
|
-
showAssistant: 'Yardımcı paneli; varsayılan false.',
|
|
2249
|
-
assistant: "{ text, suggestedAction, rationale, similarOutcomes: { sonuç: sayı }, isLoading, error } — Page.bpm.task(id).assistant(question?) yanıtı (sunucu isAiSuggestion taşır) ve akışın yükleniyor/hata bayrakları.",
|
|
2250
|
-
assessment: "Okuma sınavı denemesi: null ise sınav yok; {} ise 'Sınava başla'; process.task.assessment.start sonucu { id, number, passScore, questions: [{ id, text, options }], attempts, lastScore, isPassed } olduğu gibi — attempts/lastScore/isPassed SUNUCUDAN gelir, akış kendi sayacını tutmaz. Adımın sınav isteyip istemediği ayrıca get() yanıtının assessment alanıdır ({ count, passScore, attempts }); deneme açılmadan önce paneli o kural açar. Cevaplar yeni deneme id'sinde sıfırlanır."
|
|
2251
|
-
}
|
|
2252
|
-
},
|
|
2253
|
-
'read-proof-matrix': {
|
|
2254
|
-
summary: 'Kontrollü dokümanın okuma kanıtı matrisi: okuyucu × revizyon; okudu · bekliyor · sınavı geçemedi · atlandı · geçersiz (eskiyen revizyonun okuması) · ayrıldı rozetleri süreç defterinden hesaplanır; revizyon başına sayılar ve bekleyenlere hatırlatma. Veriyi KENDİSİ çekmez.',
|
|
2255
|
-
guide: 'bpm',
|
|
2256
|
-
behavior: [
|
|
2257
|
-
"Veri yolu: her revizyonun dağıtım süreç örneği için akış process.instance.timeline { id: instanceId } çağırır ve revisions'a [{ label, number, state: effective | superseded | draft, instanceId, events }] setter yazar; readers'a kullanıcı listesinden [{ userId, name, isActive }].",
|
|
2258
|
-
"Hücre durumu defterden: task-created payload.assignee dağıtımı verir; havuz görevinde assignee boştur (yalnız candidates yazılır) ve kopyayı task-claimed olayının aktörü (actorUserId) sahiplenir; task-reassigned kopyayı payload.from'dan payload.to'ya taşır — devreden kişi o kopyadan düşer, devralan bekleyen olur. read-proof payload.userId (ya da aktör, yoksa kopyanın o anki sahibi) okumayı ve payload.at tarihini verir; outcome assessment-failed ile kapanan görev 'sınavı geçemedi', task-cancelled/task-superseded 'atlandı'; state superseded revizyondaki okuma 'geçersiz'; dağıtımda olup okumayan isActive:false kişi 'ayrıldı', diğerleri 'bekliyor'; dağıtımda olmayan 'dağıtımda değil'.",
|
|
2259
|
-
"Satır sırası readers listesidir; defterde görünüp listede olmayanlar kimlikleriyle sona (alfabetik) eklenir. Sütun başlığı revizyon etiketi, durum rozeti ve 'X okudu · Y bekliyor · Z geçersiz' özetidir.",
|
|
2260
|
-
"showRemind:true ve bekleyen okuyucu varken sütunda 'Okumayanlara hatırlat (N)' düğmesi remind yayar: event.data = { revision, instanceId, userIds }; akış bildirim gönderir. Ayrılanlar userIds'e girmez.",
|
|
2261
|
-
"revisions ya da okuyucu yoksa emptyText (varsayılan 'Okuma kaydı yok'); isLoading iken 'Yükleniyor…' role=status."
|
|
2262
|
-
],
|
|
2263
|
-
propNotes: {
|
|
2264
|
-
revisions: "[{ label, number, state, instanceId, events: [{ kind, taskId, actorUserId, payload, occurredAt }] }] — events process.instance.timeline yanıtının events'i olduğu gibi.",
|
|
2265
|
-
readers: '[{ userId, name, isActive }] — isActive:false okumayanı ayrıldı sayar.',
|
|
2266
|
-
showRemind: 'Hatırlat düğmesi; varsayılan true.'
|
|
2267
|
-
}
|
|
2268
|
-
},
|
|
2269
|
-
'process-timeline': {
|
|
2270
|
-
summary: 'Süreç örneğinin defteri (kim, ne, hangi karar, yorum) ardından sıradaki ve gelecek adımlar; bölge yeniden başlatma turları ve geçersizleşen görevler işaretli.',
|
|
2271
|
-
guide: 'bpm',
|
|
2272
|
-
behavior: [
|
|
2273
|
-
"Veri process.instance.timeline { id } yanıtından bağlanır: rows ← events, currentNodes ← currentNodes, nextNodes ← nextNodes. Defter satırı adımı sunucunun eklediği nodeName ile (düz metin) gösterir, adı olmayan adımda nodeId kalır. actorName akışta kullanıcı adıyla (process.user.list) doldurulmazsa actorUserId gösterilir.",
|
|
2274
|
-
'Olaylar sequence sırasıyla çizilir; region-restarted her görüldüğünde yeni tur başlar ve "N. tur" ayırıcısı basılır.',
|
|
2275
|
-
'task-superseded olan görevin bütün satırları üstü çizili "Geçersizleşti" etiketiyle çizilir; showSuperseded:false iken listeden çıkar.',
|
|
2276
|
-
'currentNodes "Sırada", nextNodes "Gelecek adım" rozetiyle çizilir; sıradaki bir adım gelecekler arasında tekrar edilmez. showFuture:false gelecek adımları gizler.',
|
|
2277
|
-
'clickItem yükü yalnız params ile gider: event.data = { currentItem, index }.',
|
|
2278
|
-
"showVerify:true 'Hash doğrula' düğmesini çizer ve verifyLedger olayını yayar; akış process.instance.ledger.verify { id } sonucunun isValid'ini ledgerStatus ('valid' | 'broken'), brokenAtSequence'ini brokenAtSequence'e yazar, rozet 'Defter geçerli' ya da 'Defter N. satırda bozuk' olur. showExport:true 'Defteri indir (CSV)' düğmesiyle exportLedger yayar; akış Page.bpm.instance(id).exportLedger() sonucunu ({ fileName, contentType, text (BOM'lu), dataUrl }) dataUrl ile dosyaya kaydeder. Komponent uç çağırmaz."
|
|
2279
|
-
],
|
|
2280
|
-
propNotes: {
|
|
2281
|
-
ledgerStatus: "'' (denetlenmedi, rozet yok) | 'valid' | 'broken' — verifyLedger akışının yazdığı sonuç.",
|
|
2282
|
-
brokenAtSequence: "number | null — ledgerStatus 'broken' iken ilk bozuk satırın sequence'i.",
|
|
2283
|
-
rows: '[{ sequence, kind, nodeId, nodeName, taskId, actorName, occurredAt, payload: { outcome, comment, body } }] — bpm/instances/{id}/timeline events dizisi; nodeName düz metin (eski kayıtlardan çok dilli sözlük de gelebilir; komponent ikisini de okur). comment-added satırının metni yanıtın comments dizisindedir: akış payload.commentId ile eşleyip payload.body olarak ekler (okunamayan iç yorum comments içinde gelmez).',
|
|
2284
|
-
users: '[{ id, name }] — yorum metnindeki @<kullanıcı id> bahsetmelerini adla gösterir; boşsa id kalır.',
|
|
2285
|
-
currentNodes: "[{ id, name }] — name çok dilli sözlük ({ tr, en }) ya da düz metin olabilir.",
|
|
2286
|
-
nextNodes: "[{ id, name, adaptationLabel }] — adaptationLabel uyarlamanın eklediği/değiştirdiği adımı işaretler."
|
|
2287
|
-
}
|
|
2288
|
-
},
|
|
2289
|
-
'process-monitor': {
|
|
2290
|
-
summary: 'Süreç izleme panosu: açık · SLA geçen · hatalı · sahipsiz · askıda · son 30 günde kapanan sayaçları, örnek tablosu, hatalı satırda Yeniden dene/Adımı atla, sahipsiz satırda Ata, seçili örneklerde toplu yeniden ata · termin uzat · askıya al · adıma atla · iptal ve son toplu işlem için Geri al. Veriyi KENDİSİ çekmez.',
|
|
2291
|
-
guide: 'bpm',
|
|
2292
|
-
behavior: [
|
|
2293
|
-
"Veri yolu: mount/filter akışı process.instance.list (query alanları) ile örnekleri okuyup rows'a setter yazar. bpm/instances özet satırı id, definitionId, definitionSlug, state, subjectRowId, initiatorUserId, priority, startedAt, completedAt, outcome, slaDueAt yanında definitionName (düz metin) ve currentNodes ([{ id, name }] — bekleyen adımlar, düz metin adıyla çizilir) taşır. tokens, lastError, versionNumber/overrideId akışta process.instance.get { id } ile, assigneeName/unitId kendi okumalarıyla, openTaskIds/unassignedTaskIds process.task.list { tab: 'all' } ile eklenir. tokens eklenmezse atla/adıma atla yükünde nodeId/fromNodeIds olmaz. Komponent uç çağırmaz.",
|
|
2294
|
-
"Sayaç kutuları tıklanınca filter'a yazar ve filter olayını yayar; tablo kutunun saydığı satırları gösterir (Açık: yalnız açıklar, Kapanan 30g: son 30 günde kapananlar — scope). Kutuların altındaki süzgeç çubuğu durum, süreç, birim (satırlarda varsa), öncelik ve yalnız gecikenleri yazar. Yükteki query yalnız sunucu alanlarını (definitionId, applicationId, state, subjectRowId, initiatorUserId) taşır; unitId, priority, slaBreached, unassigned ve scope sayfada süzülür.",
|
|
2295
|
-
"SLA durumu slaDueAt'ten hesaplanır: açık örnekte termin geçtiyse 'SLA geçti', değilse 'Süresinde'; kapalı örnekte ve terminsiz örnekte gösterilmez.",
|
|
2296
|
-
"Satır eylemleri: state faulted → Yeniden dene + Adımı atla; açık ve unassignedTaskIds dolu → Ata. Adımı atla, askıya al, adıma atla ve iptal gerekçesiz gönderilemez; yeniden ata ve ata hedef kullanıcı, termin uzat yeni tarih, adıma atla hedef adım ister.",
|
|
2297
|
-
"Toplu eylem yalnız uygun durumdaki seçili örneklere gider: yeniden ata/termin uzat açık görevi olan açık örnekler (taskIds dolar), askıya al yalnız running (sunucu başkasını askıya almaz), adıma atla running/faulted, iptal bütün açık örnekler. Uygun örnek yoksa düğme kilitlidir.",
|
|
2298
|
-
"Geri al bandı lastBatchOperation kind reassign ya da extend-due, state completed ve undoneAt boşken çizilir; undo olayı batchOperationId taşır, akış process.batch.undo { id } çağırır.",
|
|
2299
|
-
"instanceAction/bulkAction/undo/clickItem/filter yükleri YALNIZ params ile gider (self'e yazılmaz; filter prop'u komponent içinde de güncellenir)."
|
|
2300
|
-
],
|
|
2301
|
-
propNotes: {
|
|
2302
|
-
rows: "[{ id, definitionSlug, definitionName, currentNodes, state, priority, startedAt, completedAt, slaDueAt } (bpm/instances özet satırı) + akışın eklediği { definitionName, versionNumber, overrideId, lastError, tokens:[{ nodeId, state }] (instance(id).get()), unitId, assigneeName, openTaskIds, unassignedTaskIds }].",
|
|
2303
|
-
filter: "{ definitionId, applicationId, state (all | running | suspended | faulted | completed), subjectRowId, initiatorUserId, unitId, priority, slaBreached, unassigned }. Sayaç kutusu durumu ve slaBreached/unassigned anahtarlarını birlikte yazar; süreç, birim ve öncelik korunur.",
|
|
2304
|
-
lastBatchOperation: "{ id, kind, state, undoneAt } — akışın son toplu işlem yanıtı (process.batch.execute ya da process.batch.undo sonucu).",
|
|
2305
|
-
allowBulk: "false iken seçim kutuları ve toplu çubuk çizilmez; satır eylemleri kalır.",
|
|
2306
|
-
holds: "[{ scope: process | instance | user, scopeKey, isActive }] — Page.bpm.legalHolds() sonucu; etkin örnek (kimlik) ya da süreç (definitionSlug) bekletmesi satıra 'Yasal bekletmede' rozeti koyar. Kişi bekletmesi satırda işaretlenmez (katılımcılar satırda yok).",
|
|
2307
|
-
predictedRemaining: "[{ instanceId, remainingHours, sampleSize }] — Page.bpm.analytics(slug, 'prediction', { from, to }).prediction; açık örnekte sampleSize > 0 ve remainingHours doluysa satıra '~N sa kaldı' rozeti (tam saate yuvarlanır; 0 — süre aşılmış tahmin — '1 saatten az kaldı'). Kapanmış örnekte ve örneksiz tahminde rozet yok. Tahmin süreç başınadır: akış panodaki her süreç için ayrı çağırır; tahmin görünümü pencereden önce başlayıp hâlâ açık olan örnekleri de kapsar."
|
|
2308
|
-
}
|
|
2309
|
-
},
|
|
2310
|
-
'process-variants': {
|
|
2311
|
-
summary: 'Süreç madenciliği varyant listesi: yol (adım zinciri), örnek sayısı ve payı (en sık varyanta göre çubuk), ortalama çevrim saati; seçili varyant vurgulu; tanım dışı geçişler (adıma atlama, adım atlama, sürüme taşıma) listesi ve XES / OCEL indir düğmeleri. Veriyi KENDİSİ çekmez.',
|
|
2312
|
-
guide: 'bpm',
|
|
2313
|
-
behavior: [
|
|
2314
|
-
"Veri yolu: mount akışı Page.bpm.analytics(slug, 'variants', { from, to }).variants sonucunu variants'a, Page.bpm.analytics(slug, 'conformance', …).conformance sonucunu conformance'a setter yazar. Heatmap bu komponentte değil: Page.bpm.analytics(slug, 'heatmap', …).chart.heatmapSeries / visitSeries chart rows'una bağlanır (yanıtın view alanı görünüm adıdır).",
|
|
2315
|
-
"Varyant satırı path dizisini (ya da tasarımcı örneğinde 'a, b, c' / 'a → b' metnini) okur; boş yol çizilmez. Çubuk genişliği payın en sık varyanta oranıdır (en sık 100%).",
|
|
2316
|
-
"Satıra tıklamak value'yu yolun '>' ile birleşmiş anahtarına yazar (setter) ve select olayını yayar; aynı anahtar kayıtlı sayfada vurguyu geri getirir.",
|
|
2317
|
-
"Sapma satırları zaman sırasıyla (metin değil zaman karşılaştırılır, eşitlikte sunucu sırası); instance-jumped 'kontrol → onay' biçiminde hedefi gösterir. Örnek kimliği düğmesi clickInstance yayar.",
|
|
2318
|
-
"download olayı yalnız { format: xes | ocel } taşır; akış Page.bpm.exportLog(slug, format, { from, to }) ile { fileName, contentType, text, dataUrl } alır ve dataUrl'den kaydeder. showDownload false iken düğmeler çizilmez."
|
|
2319
|
-
],
|
|
2320
|
-
propNotes: {
|
|
2321
|
-
value: "string — seçili varyantın anahtarı: düğüm kimlikleri '>' ile birleşik (ör. 'baslangic>kontrol>bitis').",
|
|
2322
|
-
variants: "[{ path: string[], instanceCount, sharePercent, averageCycleHours, sampleInstanceIds }] — bpm/analytics/{slug}/variants yanıtının variants listesi olduğu gibi.",
|
|
2323
|
-
conformance: "[{ instanceId, kind: instance-jumped | node-skipped | instance-migrated, nodeId, targetNodeId, actorUserId, reason, occurredAt }] — bpm/analytics/{slug}/conformance yanıtının conformance listesi.",
|
|
2324
|
-
showDownload: "XES indir / OCEL indir düğmeleri; varsayılan true."
|
|
2325
|
-
}
|
|
2326
|
-
},
|
|
2327
|
-
'case-view': {
|
|
2328
|
-
summary: 'Çalışan vaka (CMMN) görünümü: kök aşama şeridi (bekleyen aşama kesik çizgili, sürenin vurgulu), sunucunun şu an izin verdiği eylemler (isteğe bağlı öğe ekleme, öğe başlatma / tamamlama / devre dışı bırakma), açık plan öğeleri ve görevleri, kilometre taşları, vaka dosyası ve vaka defteri. Veriyi KENDİSİ çekmez.',
|
|
2329
|
-
guide: 'bpm',
|
|
2330
|
-
behavior: [
|
|
2331
|
-
"Veri yolu: mount akışı Page.bpm.cases.get(caseInstanceId) çağırır ve yanıtın view alanını (state, planItems, availableActions, caseFile, events) aynı adlı prop'lara setter yazar; view adları vaka tanımından doldurur, tanım okunamazsa öğe kimliği görünür.",
|
|
2332
|
-
"Aşama şeridi yalnız kök aşamaları TANIMIN plan sırasıyla ve her aşamanın son tekrarıyla çizer: sıra planItems satırlarındaki index alanıdır (Page.bpm.cases.get view'i tanımdan doldurur), motorun öğeleri açtığı sıra değil; tanımda artık olmayan aşama (index null) sona gider. available (giriş koşulu bekleyen) aşama kesik çizgili ve pasiftir, active olan aria-current=step taşır, completed üstü çizili.",
|
|
2333
|
-
"Eylem düğmeleri yalnız availableActions satırlarıdır (sunucu hesaplar): discretionary 'Eylem ekle' altında, start / complete / disable / enable 'Eylemler' altında. Bilinmeyen eylem ya da plan öğesi kimliği olmayan öğe eylemi çizilmez. 'Kapanış'ı enable etmek sentry sağlanmadan 422 CaseSentryNotSatisfied döner; sunucu enable'ı zaten listelemez.",
|
|
2334
|
-
"action olayı { action, itemId, planItemId } taşır; akış Page.bpm.cases.act(caseInstanceId, event.data) ile güncel örneği alır ve view'i yeniden setter yazar. Açık öğenin görevi varsa 'Görevi aç' clickTask { taskId, planItemId, itemId } yayar; görev task-inbox / task-actions ile aynı görevdir (kind case-task).",
|
|
2335
|
-
"caseFile nesne ({ alan: değer }) ya da [{ id, value }] satırları olabilir; metin olmayan değer JSON olarak yazılır. showTimeline false iken defter çizilmez."
|
|
2336
|
-
],
|
|
2337
|
-
propNotes: {
|
|
2338
|
-
state: 'active | completed | terminated — vaka durumu rozeti.',
|
|
2339
|
-
planItems: "[{ id, itemId, name, type: stage | human-task | milestone, parentId, state: available | enabled | active | completed | terminated | disabled, taskId, occurrence, endedAt, index }] — bpm/case-instances/{id} planItems'ı; name metin ya da { tr, en } olabilir. index tanımın plan sırasıdır ve view ile gelir (tanımda olmayan öğede null); şerit onu izler.",
|
|
2340
|
-
availableActions: "[{ action: discretionary | start | complete | disable | enable, itemId, planItemId, name }] — sunucunun availableActions listesi; discretionary satırında planItemId yok.",
|
|
2341
|
-
caseFile: "{ alan: değer } ya da [{ id, value }] — vaka dosyası.",
|
|
2342
|
-
events: "[{ sequence, kind, itemId, actorUserId, occurredAt }] — case_instance_events defteri; kind case-started | plan-item-* | milestone-reached | discretionary-added | case-file-updated | case-completed.",
|
|
2343
|
-
showTimeline: 'Defter bölümü; varsayılan true.'
|
|
2344
|
-
}
|
|
2345
|
-
},
|
|
2346
|
-
'delegation-editor': {
|
|
2347
|
-
summary: 'Vekalet editörü: kendim ya da astım adına vekil, tarih aralığı ve isteğe bağlı süreç filtresiyle vekalet verir; etkin · başlayacak · biten vekaletleri kaynak rozetiyle (manuel · izin süreci · yönetici) listeler ve sonlandırır. Veriyi KENDİSİ çekmez.',
|
|
2348
|
-
guide: 'bpm',
|
|
2349
|
-
behavior: [
|
|
2350
|
-
"Veri yolu: mount akışı process.delegation.list { userId? } ile delegations'a, kullanıcı listesiyle users'a, süreç listesiyle processes'e setter yazar. subordinateUserIds doluysa 'Kimin adına' seçicisi çıkar (akış closure alt ağacından doldurur).",
|
|
2351
|
-
"save yükü: { fromUserId? (yalnız başkası adına), toUserId, startsAt (ISO), endsAt? (ISO), processSlugs (boş = tüm süreçler), reason? }; akış process.delegation.create (event.data alanları; boş processSlugs gönderilmez) çağırır, 409 DelegationOverlap / 422 DelegationChainNotAllowed mesajını error prop'una yazar.",
|
|
2352
|
-
"İstemci doğrulaması sunucu kuralını izler: vekil zorunlu, kişi kendine vekalet veremez, başlangıç zorunlu, bitiş başlangıçtan sonra; bunlar geçerliyse aynı kişi için kesişen aralık ve kesişen süreç (boş liste = hepsi) çakışma sayılır. Hatalar ilk Kaydet denemesinden sonra görünür.",
|
|
2353
|
-
"Satır sırası: etkin, başlayacak (başlangıca göre), biten (en yeni önce). Biten satırda Sonlandır yoktur; end yükü { delegationId } → process.delegation.end { id }.",
|
|
2354
|
-
"'Vekil yönetim yetkilerini devralmaz; başlatanın vekili o talebi onaylayamaz' notu her zaman görünür."
|
|
2355
|
-
],
|
|
2356
|
-
propNotes: {
|
|
2357
|
-
delegations: "[{ id, fromUserId, toUserId, startsAt, endsAt, processSlugs, source (manual | leave-process | manager), reason, endedAt }] — bpm/delegations yanıtı olduğu gibi.",
|
|
2358
|
-
users: "[{ id, name }] — vekil seçici ve satır adları; bulunmayan kimlik olduğu gibi yazılır.",
|
|
2359
|
-
subordinateUserIds: "string[] — yöneticinin adına vekalet verebileceği astlar; boşsa yalnız 'kendim'.",
|
|
2360
|
-
processes: "[{ slug, name }] — süreç filtresi onay kutuları; boşsa filtre çizilmez (vekalet tüm süreçleri kapsar).",
|
|
2361
|
-
error: "{ status, code, message } — akışın son kayıt hatası."
|
|
2362
|
-
}
|
|
2363
|
-
},
|
|
2364
|
-
'handover-wizard': {
|
|
2365
|
-
summary: 'Devir sihirbazı (3 adım): açık görev grupları ve grup başına hedef (üst yönetici · kişi · gruba geri bırak · yönetici kuyruğu) → başlattığı süreçler, yönettiği birimler, tuttuğu pozisyonlar, vekaletler → onay (zorla devret, devret ve pasifleştir). Veriyi KENDİSİ çekmez.',
|
|
2366
|
-
guide: 'bpm',
|
|
2367
|
-
behavior: [
|
|
2368
|
-
"Veri yolu: mount akışı process.handover.preview { userId } yanıtını preview'a yazar. preview değişince kararlar önerilen hedeften yeniden kurulur ve sihirbaz ilk adıma döner.",
|
|
2369
|
-
"Varsayılan hedef: suggestedTarget seçeneklerde varsa o; yoksa aday görevde group, atanmış görevde managerUserId varsa manager, yoksa admin-queue. Atanmış görevde manager seçeneği yalnız managerUserId doluyken çıkar; group yalnız aday görevlerde.",
|
|
2370
|
-
"Hedef 'user' seçilen grupta kişi seçilmeden İleri/Devret kilitlidir (zorla modda da). Zorla devret işaretliyken karar verilmeyen atanmış görev grupları sunucuda üst yöneticiye (yoksa yönetici kuyruğuna), aday görev grupları gruba gider (kişi adaylıktan çıkar; aday kalmazsa yönetici kuyruğu).",
|
|
2371
|
-
"apply yükü: { userId, decisions: [{ kind, key, target, targetUserId? (yalnız user) }], force, deactivate }; akış process.handover.apply { userId, decisions, force } çağırır. deactivate:true 'Devret ve pasifleştir' düğmesidir — platformda uygulama kullanıcısı pasifleştirme ucu henüz yok, akış bu bayrağı kendi adımına bağlar.",
|
|
2372
|
-
"stepChange yükü { step: tasks | ownership | confirm, index }. Adım başlıkları aria-current='step' taşır. İkinci adım bilgi amaçlıdır: başlattığı süreçler açık kalır, birim/pozisyon organizasyon ekranından atanır, vekaletler devirle sonlanır."
|
|
2373
|
-
],
|
|
2374
|
-
propNotes: {
|
|
2375
|
-
preview: "{ userId, managerUserId, items: [{ kind (assigned-tasks | candidate-tasks | started-instances | managed-units | held-positions | delegations), key (süreç slug'ı, birim/pozisyon kodu ya da *), count, suggestedTarget }] } — bpm/handovers/preview/{userId} yanıtı.",
|
|
2376
|
-
users: "[{ id, name }] — 'kişi' hedefi seçicisi; devredilen kullanıcı listeden çıkarılır.",
|
|
2377
|
-
lastHandover: "{ id, completedAt } — dolu olduğunda 'Devir tamamlandı' bandı çizilir.",
|
|
2378
|
-
allowDeactivate: "true iken son adımda 'Devret ve pasifleştir' düğmesi çıkar."
|
|
2379
|
-
}
|
|
2380
|
-
},
|
|
2381
|
-
'notification-center': {
|
|
2382
|
-
summary: 'Süreç bildirim merkezi: bildirim listesi (okunmamış kalın, okundu onayı gerekenler rozetli), okundu say · okudum · tümünü okundu say, bağlantıya git ve gönderim tercihleri (anında · günlük özet · yalnız SLA, sessiz saatler, saat dilimi). Veriyi KENDİSİ çekmez.',
|
|
2383
|
-
guide: 'bpm',
|
|
2384
|
-
behavior: [
|
|
2385
|
-
"Veri yolu: mount akışı process.notification.list sonucunu notifications'a, process.notification-preference.get sonucunu preference'a yazar. Liste en yeni önce sıralanır.",
|
|
2386
|
-
"Sayaç: okunmamışlar + okunmuş ama onay (ack) bekleyenler. Okundu onayı gereken satırda yalnız 'Okudum' (ack) düğmesi, okunmamış sıradan satırda 'Okundu say' (read) düğmesi çıkar.",
|
|
2387
|
-
"open yükü { notificationId, link?, taskId?, instanceId?, markRead }: markRead okunmamış satırda true'dur; akış gerekirse process.notification.read { id } çağırıp bağlantıya gider. read/ack yükü { notificationId }, markAllRead yükü { notificationIds } (yalnız okunmamışlar).",
|
|
2388
|
-
"Tercih formu preference'tan kurulur (HH:mm:ss → HH:mm); savePreference yükü sunucu biçimindedir: { mode, digestAt 'HH:mm:00', quietFrom/quietTo 'HH:mm:00' ya da sessiz saat kapalıyken null, timeZone }. Saat dilimi boşken, sessiz saatin bir ucu eksikken ya da saat SS:DD değilken Kaydet kilitlidir.",
|
|
2389
|
-
"Kanal seçimi ve üst çubuk soket rozeti bu bileşende yok: backend tercihinde kanal alanı yok; canlı sayaç için akış process-notifications hub'ına abone olmalı (runtime aboneliği henüz yok)."
|
|
2390
|
-
],
|
|
2391
|
-
propNotes: {
|
|
2392
|
-
notifications: "[{ id, title, body, link, category (task | sla | watch | mention …), taskId, instanceId, ackRequired, readAt, acknowledgedAt, createdAt }] — bpm/notifications data dizisi.",
|
|
2393
|
-
preference: "{ mode (immediate | digest | sla-only), digestAt, quietFrom, quietTo, timeZone } — bpm/notification-preferences yanıtı.",
|
|
2394
|
-
defaultTimeZone: "preference.timeZone boşken forma yazılan saat dilimi (IANA ya da sunucunun tanıdığı kimlik).",
|
|
2395
|
-
showPreferences: "false iken Tercihler düğmesi ve formu çizilmez."
|
|
2396
|
-
}
|
|
2397
|
-
},
|
|
2398
|
-
'approval-chain-editor': {
|
|
2399
|
-
summary: "Onay zinciri editörü (uygulama yöneticisi uyarlaması): Üstte sürüm · uyarlama (rev) · açık örnek çipleri; 'Onay zinciri' sekmesinde zaman çizelgesi: başlangıç olayı, bölgeden önceki tekil yol, 'Uyarlamaya açık bölge' kutusu (sayaç, adım kartları), bölgeden sonra ilk dallanmaya kadar kilitli adımlar (gri, kilit ikonlu) ve bitiş. Kartta ad + 'Kısmen açık'/'Eklendi' rozeti, kişi · politika · süre özeti, ↑ ↓ sıralama ve eklenen adımda × kaldır; adıma basınca host drawer'ın üstünde overlay'li ikinci drawer (medium) açılır: kim onaylar · referans kişi · politika · SLA · hatırlatma · aşılınca · kendi talebini onaylama (butonsuz, × ya da overlay ile kapanır). Tür başına '<tür> adımı ekle'; uyarlama varken açık örnek bandı; 'Simülasyon' sekmesinde kuralları simüle et ve sonuç kartı; alt çubukta varsayılana dön (yalnız kayıtlı uyarlama varken) · kaydedilmemiş değişiklik göstergesi · kaydet. Veriyi KENDİSİ çekmez.",
|
|
2400
|
-
guide: 'bpm',
|
|
2401
|
-
behavior: [
|
|
2402
|
-
"Veri yolu: mount akışı process.override.get { id: definitionId } yanıtını view'e yazar (baseModel = aktif sürüm, effectiveModel = uyarlama uygulanmış, editableScopes, override.patch/conflictState). Rol/pozisyon/birim/kullanıcı listeleri roles · positions · units · users prop'larına; açık örnek sayısı openInstanceCount'a.",
|
|
2403
|
-
"Zincir yalnız editable: open bölgeden kurulur (regionId boşsa ilk açık bölge). Kenarları sıralı zincir olmayan bölgede ekleme ve sıralama kapanır. Kural seçicisi bölgenin limits.assigneeRules kümesinden, adım türü limits.nodeTypes kümesinden gelir; limits.maxSteps dolunca ekleme kilitlenir.",
|
|
2404
|
-
"save yükü { definitionId, baseVersion, overrideRevision, patch }: patch aktif sürüme karşı TAM uyarlamadır — bu bölgenin işlemleri yeniden kurulur (değişen alanlar add/replace/remove, eklenen adım 'nodes/-', sıra değişince bölgenin edges'i replace); kayıtlı uyarlamanın bölge dışındaki ve editörün düzenlemediği alanlara ait işlemleri korunur (uyarlama çatışmalıysa ya da başka sürüme yazılmışsa korunmaz). Akış process.override.save { id: definitionId, baseVersion, overrideRevision, patch } çağırır, ardından process.override.get ile view'i tazeler. İstemci doğrulaması (ad, kim onaylar, izinli kural, ISO SLA, adım sınırı) geçmeden yayılmaz.",
|
|
2405
|
-
"simulate yükü { definitionId, subjectRowId?, overridePatch } — kaydedilmemiş uyarlamayla kuru koşu: process.override.simulate { id, subjectRowId, overridePatch } sonucunu simulation'a yazın; satırlar 'adım · kişiler · vekil' olarak çizilir.",
|
|
2406
|
-
"reset ve migrateOpen yükü { definitionId } → process.override.reset / process.override.migrate-open { id }. Kayıtlı uyarlama varken ve openInstanceCount > 0 iken zincir sekmesinde 'N açık örnek hâlâ eski zincirle ilerliyor' bandı çıkar; 'Yeni zincire taşı' düğmesi (migrateOpen) yalnız showFooter iken bandın içindedir; view.isReadOnly (Studio görünümü) iken alt düğmeler ve düzenleme kapalıdır.",
|
|
2407
|
-
"422 satırları insan diline çevrilir: error prop'una sistem ucunun hata kaydından kurulan nesne ({ status, code, message, data, errors } — Steps.<adım>.error doluyken gövde .data'dadır) ya da mapBpmError sonucu yazılır ({ errors: [{ code, path, message }] } ya da { data: { errors } }); RuleNotAllowed 'Sabit kişi kuralı bu süreçte izinli değil. İzinli kurallar: …', RegionLocked, ParamNotEditable, MaxStepsExceeded, NodeTypeNotAllowed. Diğer hatalarda error.message, yoksa ham reddin reason'ı ya da data.message'ı yazılır (409 bayat sürüm/revizyon, 403); akış get() ile yeniden okumalı. conflictState conflicted iken çatışma bandı ve conflictDetail çizilir."
|
|
2408
|
-
],
|
|
2409
|
-
propNotes: {
|
|
2410
|
-
view: "bpm/definitions/{id}/override yanıtı: { definitionId, slug, activeVersionNumber, overrideRevision, isReadOnly, override { revision, patch, conflictState, conflictDetail }, baseModel, effectiveModel, editableScopes [{ nodeId, parentRegionId, degree, editableParams, limits }] }.",
|
|
2411
|
-
regionId: 'Düzenlenecek açık bölgenin id\'si; boşsa ilk açık bölge (birden çok bölgede seçici çıkar).',
|
|
2412
|
-
roles: "[{ slug, name }] — role:<slug> kuralının değer seçicisi.",
|
|
2413
|
-
positions: "[{ code, name }] — position:<kod> kuralının değer seçicisi.",
|
|
2414
|
-
units: "[{ code, name }] — unit-members:<kod> ve ancestor-manager:<tip> değer seçicisi.",
|
|
2415
|
-
users: "[{ id, name }] — user:<id> değer seçicisi.",
|
|
2416
|
-
simulation: "{ steps: [{ nodeId, name, assignees [{ userId, name }], candidates, source (delegation → 'vekil'), note }] } — simulate sonucu.",
|
|
2417
|
-
openInstanceCount: "Uyarlamaya taşınabilecek açık örnek sayısı; üstteki çipte ve taşı bandında görünür, 0 iken ikisi de yok.",
|
|
2418
|
-
showFooter: "false iken alt çubuk (varsayılana dön · kaydedilmemiş göstergesi · kaydet) ve bandın taşı düğmesi çizilmez, kaydedilmemiş göstergesi üst çip satırına geçer; düğmeleri çevreleyen drawer/modal'ın actions'ı verir. Kaydet = drawer aksiyonu { type: 'submit', formId: <bu bileşenin elementId'si> } — editör gizli bir <form id=elementId> taşır, submit kendi doğrulamasıyla save olayını yayar. Varsayılana dön / taşı aksiyonları reset / migrate-open akışını definitionId'yi sayfa durumundan alarak doğrudan çağırır.",
|
|
2419
|
-
error: "Akışın son kayıt/simülasyon hatası: mapBpmError sonucu { status, code, message, errors? } ya da sistem ucunun hata kaydından kurulan { status, code, message, reason, data, errors } (eski Page.bpm reddi { code, reason, data } de okunur)."
|
|
2420
|
-
}
|
|
2421
2246
|
}
|
|
2422
2247
|
};
|
|
2423
2248
|
/**
|
|
@@ -2436,24 +2261,6 @@ export const componentKnowledge = {
|
|
|
2436
2261
|
* `ComponentHeightType` · `ComponentAlignType`) — platformun kabul ettiği kümenin tek tanımı
|
|
2437
2262
|
* orasıdır ve backend artık tanımadığı jetonu 400 ile reddeder.
|
|
2438
2263
|
*/
|
|
2439
|
-
/**
|
|
2440
|
-
* SATIR İÇİ stil alanları — `style` prop'unun KEBAB-CASE isteyen dalları (TB-129 · S2-39).
|
|
2441
|
-
*
|
|
2442
|
-
* Kural tek komponente özgü değil bir YAZIM SÖZLEŞMESİDİR: `style.root` emotion `css()` bloğudur ve
|
|
2443
|
-
* camelCase okur, `style.thead|th|tr|td` ise satır içi `style` attribute'una basılır
|
|
2444
|
-
* (`column-view.ts` `toStyleString` anahtarı OLDUĞU GİBİ yazar) — orada `fontSize` sessizce düşer,
|
|
2445
|
-
* `font-size` çalışır. Gateway'in F-06 çevirisi bu dalları da camelCase yapıp stili öldürüyordu
|
|
2446
|
-
* (ölçüm: otomotiv liste tablosu, 2026-09-20); artık bu sözlükteki alanların ALTINA hiç dokunulmaz.
|
|
2447
|
-
*
|
|
2448
|
-
* Sözlüğe yeni satır eklerken ölçüt: alanın değeri DOM'un `style` attribute'una string olarak mı
|
|
2449
|
-
* yazılıyor? Öyleyse buraya girer; emotion bloğuysa girmez.
|
|
2450
|
-
*/
|
|
2451
|
-
export const INLINE_STYLE_FIELDS_BY_TYPE = {
|
|
2452
|
-
table: ['thead', 'th', 'tr', 'td']
|
|
2453
|
-
};
|
|
2454
|
-
export function inlineStyleFields(componentType) {
|
|
2455
|
-
return componentType === undefined ? undefined : INLINE_STYLE_FIELDS_BY_TYPE[componentType];
|
|
2456
|
-
}
|
|
2457
2264
|
export const APPEARANCE_TOKEN_SETS = {
|
|
2458
2265
|
paddingType: {
|
|
2459
2266
|
values: ['none', 'normal', 'custom'],
|
|
@@ -2553,140 +2360,3 @@ export const knowledgeNote = 'knowledge alanı elle doğrulanmış davranış bi
|
|
|
2553
2360
|
export function knowledgeFor(slug) {
|
|
2554
2361
|
return slug ? componentKnowledge[slug] : undefined;
|
|
2555
2362
|
}
|
|
2556
|
-
/* ─────────────────────────── TB-123 · katalog doğrulaması ─────────────────────────── */
|
|
2557
|
-
/**
|
|
2558
|
-
* ENUM TİPLERİ — seçenek listesi gerçekten bir DEĞER KÜMESİ olan prop tipleri.
|
|
2559
|
-
*
|
|
2560
|
-
* Ölçüm (2026-09-20, 101 komponentlik uygulama sözlüğü): `dropdown` (180/180), `radio` (85/85) ve
|
|
2561
|
-
* `switcher` (78/78) prop'larının HEPSİ seçenek taşır ve seçeneklerin hepsi string'dir. `number`
|
|
2562
|
-
* tipinde ise `options` bir ENUM DEĞİL sınır çiftidir (`opacity` → [0, 100], `transitionMs` →
|
|
2563
|
-
* [0, 1000]) ve `component` tipinde izinli komponent tipi filtresidir — ikisi de denetlenmez.
|
|
2564
|
-
* `multiselect` kapalı bir küme taşır ama değeri dizidir; bilerek dışarıda bırakıldı (gateway'in
|
|
2565
|
-
* eksik denetimi platformun kendi duvarına düşer, fazla denetimi geçerli yazmayı bloklardı).
|
|
2566
|
-
*/
|
|
2567
|
-
const ENUM_PROP_TYPES = new Set(['dropdown', 'radio', 'switcher']);
|
|
2568
|
-
/**
|
|
2569
|
-
* Platformun komponent sözlüğünü (`GET /components/{app}`) doğrulama kurallarına indirger:
|
|
2570
|
-
* tip → (prop adı → enum değerleri | undefined). YALNIZ ÜST DÜZEY prop'lar girer; platformun
|
|
2571
|
-
* duvarı da yalnız onları denetliyor (ölçüm: `surfaceStyle.contentOverflow: 'clip'` geçti).
|
|
2572
|
-
*/
|
|
2573
|
-
export function catalogTypeRules(components) {
|
|
2574
|
-
const rules = new Map();
|
|
2575
|
-
for (const component of components) {
|
|
2576
|
-
const slug = typeof component.slug === 'string' ? component.slug : undefined;
|
|
2577
|
-
const declared = component.definition?.props;
|
|
2578
|
-
if (slug === undefined || !Array.isArray(declared))
|
|
2579
|
-
continue;
|
|
2580
|
-
const props = new Map();
|
|
2581
|
-
for (const entry of declared) {
|
|
2582
|
-
const name = typeof entry?.name === 'string' ? entry.name : undefined;
|
|
2583
|
-
if (name === undefined || name === '')
|
|
2584
|
-
continue;
|
|
2585
|
-
const options = ENUM_PROP_TYPES.has(String(entry.type ?? '')) && Array.isArray(entry.options)
|
|
2586
|
-
? entry.options.map(option => option?.value).filter((value) => typeof value === 'string')
|
|
2587
|
-
: undefined;
|
|
2588
|
-
props.set(name, options !== undefined && options.length > 0 ? options : undefined);
|
|
2589
|
-
}
|
|
2590
|
-
if (props.size > 0)
|
|
2591
|
-
rules.set(slug, { props });
|
|
2592
|
-
}
|
|
2593
|
-
return rules;
|
|
2594
|
-
}
|
|
2595
|
-
/**
|
|
2596
|
-
* Prop değerinin DENETLENEBİLİR hâli. Şemada prop'lar `{ type, ref, data }` sarmalında yaşar;
|
|
2597
|
-
* `static` sarmalın taşıdığı değer denetlenir, `code`/`translation`/`flow`/`property` sarmalları
|
|
2598
|
-
* çalışma zamanında çözülür ve sabit bir değerleri yoktur — onlara dokunulmaz.
|
|
2599
|
-
*/
|
|
2600
|
-
function staticPropValue(value) {
|
|
2601
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
2602
|
-
return value;
|
|
2603
|
-
const record = value;
|
|
2604
|
-
if (typeof record.type !== 'string')
|
|
2605
|
-
return value;
|
|
2606
|
-
if (record.type !== 'static')
|
|
2607
|
-
return undefined;
|
|
2608
|
-
return record.data ?? record.ref;
|
|
2609
|
-
}
|
|
2610
|
-
/**
|
|
2611
|
-
* TB-123 / S2-33 — tam şema yazan yolların (page_update · layout_update) katalog denetimi.
|
|
2612
|
-
*
|
|
2613
|
-
* Platformun doğrulama duvarı yalnız micro-op ucunda koşuyor: aynı geçersiz değer
|
|
2614
|
-
* `page_schema_patch`'te `invalid-enum-value` ile reddedilirken `page_update`'te 200 dönüyor ve
|
|
2615
|
-
* kusur ancak EKRANDA görülüyordu. Burası aynı kararı aynı kural kimlikleriyle, istek gitmeden
|
|
2616
|
-
* verir. Kural kimlikleri platformun kendi yanıtından alındı (ölçüm 2026-09-20).
|
|
2617
|
-
*
|
|
2618
|
-
* Katalog okunamazsa (`rules` boş) doğrulama SUSAR: bilinmeyen sözlük yüzünden geçerli bir yazmayı
|
|
2619
|
-
* bloklamak, denetimi atlamaktan kötüdür.
|
|
2620
|
-
*/
|
|
2621
|
-
export function schemaCatalogErrors(nodes, rules) {
|
|
2622
|
-
const errors = [];
|
|
2623
|
-
if (rules.size === 0)
|
|
2624
|
-
return errors;
|
|
2625
|
-
const visit = (node) => {
|
|
2626
|
-
if (!node || typeof node !== 'object')
|
|
2627
|
-
return;
|
|
2628
|
-
const record = node;
|
|
2629
|
-
const componentId = String(record.elementId ?? record.name ?? record.id ?? '?');
|
|
2630
|
-
const type = typeof record.type === 'string' ? record.type : undefined;
|
|
2631
|
-
const typeRules = type === undefined ? undefined : rules.get(type);
|
|
2632
|
-
if (typeRules !== undefined && record.props && typeof record.props === 'object' && !Array.isArray(record.props)) {
|
|
2633
|
-
for (const [name, raw] of Object.entries(record.props)) {
|
|
2634
|
-
if (!typeRules.props.has(name)) {
|
|
2635
|
-
errors.push({
|
|
2636
|
-
componentId,
|
|
2637
|
-
path: `props.${name}`,
|
|
2638
|
-
rule: 'unknown-prop',
|
|
2639
|
-
message: `'${type}' komponentinin '${name}' diye bir prop'u yok.`,
|
|
2640
|
-
suggestions: [...typeRules.props.keys()].sort()
|
|
2641
|
-
});
|
|
2642
|
-
continue;
|
|
2643
|
-
}
|
|
2644
|
-
const options = typeRules.props.get(name);
|
|
2645
|
-
const value = staticPropValue(raw);
|
|
2646
|
-
if (options === undefined || value === undefined || value === null || value === '')
|
|
2647
|
-
continue;
|
|
2648
|
-
if (options.includes(String(value)))
|
|
2649
|
-
continue;
|
|
2650
|
-
errors.push({
|
|
2651
|
-
componentId,
|
|
2652
|
-
path: `props.${name}`,
|
|
2653
|
-
rule: 'invalid-enum-value',
|
|
2654
|
-
message: `'${String(value)}' '${name}' için geçerli bir değer değil.`,
|
|
2655
|
-
suggestions: [...options]
|
|
2656
|
-
});
|
|
2657
|
-
}
|
|
2658
|
-
}
|
|
2659
|
-
if (record.appearance && typeof record.appearance === 'object' && !Array.isArray(record.appearance)) {
|
|
2660
|
-
for (const [name, value] of Object.entries(record.appearance)) {
|
|
2661
|
-
const tokens = APPEARANCE_TOKEN_SETS[name];
|
|
2662
|
-
if (tokens === undefined || value === undefined || value === null || value === '')
|
|
2663
|
-
continue;
|
|
2664
|
-
if (tokens.values.includes(String(value)))
|
|
2665
|
-
continue;
|
|
2666
|
-
errors.push({
|
|
2667
|
-
componentId,
|
|
2668
|
-
path: `appearance.${name}`,
|
|
2669
|
-
rule: 'invalid-appearance',
|
|
2670
|
-
message: `'${name}' için geçerli bir değer kullanın: ${tokens.values.join(', ')}. Gelen: '${String(value)}'.`,
|
|
2671
|
-
suggestions: [...tokens.values]
|
|
2672
|
-
});
|
|
2673
|
-
}
|
|
2674
|
-
}
|
|
2675
|
-
for (const child of Array.isArray(record.children) ? record.children : [])
|
|
2676
|
-
visit(child);
|
|
2677
|
-
};
|
|
2678
|
-
for (const node of Array.isArray(nodes) ? nodes : [])
|
|
2679
|
-
visit(node);
|
|
2680
|
-
return errors;
|
|
2681
|
-
}
|
|
2682
|
-
export function schemaCatalogMessage(errors, tool) {
|
|
2683
|
-
const lines = errors.map(error => {
|
|
2684
|
-
const accepted = error.suggestions === undefined || error.suggestions.length === 0
|
|
2685
|
-
? ''
|
|
2686
|
-
: ` → kabul edilenler: ${error.suggestions.join(' · ')}`;
|
|
2687
|
-
return `${error.componentId} ${error.path} [${error.rule}] ${error.message}${accepted}`;
|
|
2688
|
-
});
|
|
2689
|
-
return `${tool}: şema katalog doğrulamasından geçmedi (istek gönderilmedi) — ${lines.join(' | ')}. `
|
|
2690
|
-
+ 'Bu denetim page_schema_patch yolundaki platform duvarının aynısıdır (TB-123): geçersiz değer sessizce kaydedilip ekranda kaybolmasın diye tam şema yolunda da koşar. '
|
|
2691
|
-
+ "Değer kümelerini component_get('<tip>') ile doğrulayın.";
|
|
2692
|
-
}
|