@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
|
@@ -1,859 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bütün mobil komponentler için geçerli kurallar. Kayıt başına tekrarlanmaz;
|
|
3
|
-
* okuyucu (`component_get`) bu notları `mobileNotes`'a ekler
|
|
4
|
-
* (`platform/mobileRules.ts` `mobileComponentNotes`). Yerleşim (MOB-001) ve stil
|
|
5
|
-
* (MOB-002) notları kural koduyla birlikte orada durur, burada tekrarlanmaz.
|
|
6
|
-
*/
|
|
7
|
-
export const MOBILE_COMPONENT_NOTES = [
|
|
8
|
-
"Tasarım kipinde (Studio kanvası) alanlar yazılamaz ve düğmeler basılamaz: dokunuş kanvasın seçim jestidir.",
|
|
9
|
-
"Olay yükleri web ile AYNI sözleşmedir (`componentEvents.ts`): alanlar `change`/`changed`/`enter`/`focus`/`blur`, seçim bileşenleri `change` + `checked`/`unchecked`, katmanlar kapanışta `change { isOpen: false }` ve `open`/`close` yayar; `type: submit` düğme `click` yaymaz, üstteki `form`un `submit`ini tetikler (`formId` varsa o formun). Form doğrulaması web ile AYNIDIR (2026-09-28): alanların `validations`'ı ve formun koşullu `validations`'ı gönderimde koşar, geçersiz form `submit` YAYMAZ, alan `isInvalid`/`invalidText` alır, hatalar `form-validation-errors`'a yazılır; ilk gönderimden sonra her değişimde alan yeniden doğrulanır. Doğrulamayı akışta elle kurmayın. Mobile özgü `form.showValidState` dolu ve geçerli alana ✓ verir. `required` işaretsiz onay kutusunu değer sayar (web kuralı) — 'kabul et' formun koşullu kuralıdır: `{ element: 'kosullar', condition: '!kosullar.value', message }`.",
|
|
10
|
-
"Bileşenler shadcn/ui görünümünde çizilir (react-native-reusables ilkelleri, NativeWind); renk ve köşe yine PROJE TEMASINDAN gelir: `--ng-*` değişkenleri shadcn token'larına (`--primary`, `--secondary`, `--muted`, `--destructive`, `--border`, `--input`, `--ring`…) ve köşe ölçeğine köprüyle çevrilir (`shadcn-vars.ts`), koyu kip aynı köprünün ikinci çözümüdür. Tema değişince web ve mobil birlikte hareket eder; web sayfası kendi bileşen ailesiyle çizildiği için iki platformun görünüm farkı bilinçlidir. Ölçü (alan yüksekliği, punto, iç boşluk) temanın `--ng-form-*` değişkenlerinden gelir. Yazı AİLESİ köprüde yoktur: temanın ailesi alanlarda (metin, sayı, parola, açılır liste), başlıklarda (`app-bar`, `form`, `modal`/`drawer`, boş durum) ve sekme çubuğunda uygulanır; `text` ve düğme etiketi ata kabın `typographyStyle` ailesini, o da yoksa platform yazı tipini kullanır; alan, anahtar ve onay kutusu etiketleri HER ZAMAN platform yazı tipiyle çizilir.",
|
|
11
|
-
"Yükleme (`isLoading`) kabukta: bileşenin kendisi çizmiyorsa (`button`, `datatable`, `modal`, tarih seçicileri gibi kendi göstergesi olanlar hariç) kabuk çizer — çocuklu düğümde yarı saydam örtü + dönen gösterge, yaprak düğümde iskelet (plans/mobil-plantcare-acigi f-14, ADR 0010). Örtü dokunuşu tutar. Ayrı bir yükleme bileşeni gerekmez; sayfanın kendi iskeleti için `skeleton`.",
|
|
12
|
-
"Bileşenlerin kendi hareketi (açılır kabın gövdesi, çekmecenin kayması, alt sayfa yayı, toast ve FAB girişi, carousel noktası, belirsiz/çizgili ilerleme, dönen ikon, iskelet parıltısı — f-19) kanvasta ve cihazın/tarayıcının 'hareketi azalt' ayarında DURUR: bileşen son hâlini anında çizer. `page_screenshot` kareyi bu ayarla çeker (donuk kare, SCR-014); hareketi görmek için `motion: 'play'`.",
|
|
13
|
-
"Boyut panelinin en-boy oranı (`appearance.aspectRatio`, SAYI — 16:9 için `1.78`) boyu genişlikten türetir ve düğüm KABUĞUNA yazılır (zemin, kenar ve iç boşluk dahil görünen kutu tam oranda). Üç koşul: `heightType: 'auto'` (web ile aynı; `fixed`/`fill` ya da yazılmamış boy oranı ezer), genişlik BELLİ — `widthType: 'fill'` ya da `'fixed'` + `widthString` (içerik genişliğinde react-native-web boyu genişlikten, cihazın Yoga'sı genişliği boydan türetir; iki kutu ayrışmasın diye oran o durumda uygulanmaz), düğüm widget örneği değil. Web'den farkı AKIŞ KAPLARI: `container`, `form`, `safe-area`, `scroll-view` mobilde oran alır ve akışları oranlı boyu doldurur (`verticalAlign` `middle`/`bottom`/`stretch` web gibi çalışır). Öteki bırakılabilir tipler (`collapsible-container`, `repeater`, `tabs`, `tooltip`), sayfa kökü ve katmanlar (`modal`, `drawer`) oran almaz; `image` oranı kendi çizimine yazar."
|
|
14
|
-
];
|
|
15
|
-
/**
|
|
16
|
-
* Web sözlüğünün `STATE_FLAG_NOTES`'undan mobilde FARKLI olan bayraklar. `component_get` mobil
|
|
17
|
-
* uygulamada bunları web notlarının üstüne yazar; kaydı olmayan bayrak web notunu korur.
|
|
18
|
-
* Kaynak: `packages/ng-apps-ui-native/src/renderer/renderer.functions.ts` `aspectRatioStyle`.
|
|
19
|
-
*/
|
|
20
|
-
export const MOBILE_STATE_FLAG_NOTES = {
|
|
21
|
-
isDroppable: "Düğüm çocuk kabul eder ve iç dolgusunu padding kutusundan alır. Web'den farklı olarak mobilde AKIŞ KAPLARI (`container`, `form`, `safe-area`, `scroll-view`) appearance.aspectRatio'yu uygular — boy `auto` ve genişlik `fill`/`fixed` iken; kabın akışı oranlı boyu doldurur. Öteki bırakılabilir tipler (katlanır kap, liste, sekmeler, ipucu, katmanlar) oranı yok sayar."
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Hiza raporunun tip sınıfları (`layoutSummary.ts`, plans/mobil-mizanpaj-dili 01).
|
|
25
|
-
* Bırakılabilir: katalogda `isDroppable` olan tipler (parite: `mobile-component-parity.test.ts`);
|
|
26
|
-
* çocuksuz ve zeminsiz olanı kendi başına hiçbir şey çizmez. Akış dışı: ekrana ya da kabuğa
|
|
27
|
-
* sabit katmanlar, alt ağaçları hizaya girmez. İçerik genişlikli: genişliği içeriğinden gelen
|
|
28
|
-
* yapraklar, sağ kenar sapması sayılmaz.
|
|
29
|
-
*/
|
|
30
|
-
export const MOBILE_DROPPABLE_TYPES = ['carousel', 'collapsible-container', 'container', 'drawer', 'floating-container', 'form', 'grouped-list', 'modal', 'repeater', 'safe-area', 'scroll-view', 'stack', 'tabs', 'tooltip', 'widget-area'];
|
|
31
|
-
export const MOBILE_OUT_OF_FLOW_TYPES = ['app-bar', 'drawer', 'fab', 'floating-container', 'modal', 'toast'];
|
|
32
|
-
export const MOBILE_INTRINSIC_WIDTH_TYPES = ['avatar', 'badge', 'icon', 'rating', 'text', 'timer'];
|
|
33
|
-
/** Yalnız davranış ekleyen kap: çizimi çocuğundan ibarettir, kendi boşluğu içeriği içeri iter (mizanpaj S6). */
|
|
34
|
-
export const MOBILE_TRANSPARENT_WRAPPER_TYPES = ['tooltip'];
|
|
35
|
-
export const mobileComponentKnowledge = {
|
|
36
|
-
container: {
|
|
37
|
-
summary: 'Flex akışı; mobil sayfanın tek yerleşim kabı.',
|
|
38
|
-
differences: [
|
|
39
|
-
"`layout` düşer (flex-only), `hoverStyle` düşer (dokunmatikte hover durumu yoktur), `style` düşer.",
|
|
40
|
-
'Yüzey (zemin, köşe, kenarlık, gölge) düğüm kabuğunda derlenir; kabın kendisi yalnız yön, hizalama ve aralık (`gap`) taşır.',
|
|
41
|
-
"Hiza adları web ile aynı eşlenir: `verticalAlign: 'middle'` ve `horizontalAlign: 'center'` ortalar. Dikey hizanın kullanacağı boşluk kabın boyundan gelir — `heightType` `fill`, `fixed` ya da en-boy oranlı kapta akış kabuğun boyunu doldurur; boyu içerikten gelen SÜTUN kapta dikey hiza etkisizdir (satır kapta farklı boydaki kardeşleri yine hizalar). `stretch` de web gibi: ana eksende (sütunda `verticalAlign`, satırda `horizontalAlign`) çocukları eksen boyunca yayar, çapraz eksende gerer.",
|
|
42
|
-
'Kutu modeli web ile AYNI kural ve varsayılanlarla çizilir (`appearance.marginType/paddingType`, `normal` = 4 / 10 dp, `custom` kenar kenar): tipi yazılmamış düğüm `normal` dış boşluk, bırakılabilir kap `normal` iç boşluk alır — kenara yaslanacak kapta `none` yazın. `wrap: true` iken satırlar çapraz hizayı izler (web `flex-layout` ile aynı: `stretch` kabı doldurur, `top`/`left` üstten dizer).',
|
|
43
|
-
"`title`/`description` web gibi gövdenin üstünde başlık bandı çizer (sarmalayıcı kapta hiç); görünümü `headerStyle`tan (başlık rengi/boyu/kalınlığı, ayraç, dolgu, dış boşluk, asgari boy, hiza — token ve `calc` çözülür). `size: grow` her doğrudan çocuğa ana eksende pay verir (web `flex: 1 1 auto`; içerik boyundan büyür, eşit değil — eşit karo için çocuğa `widthType: fixed` + yüzde).",
|
|
44
|
-
"`click` (mobile-only olay, K1): bir akışa bağlıysa kap runtime'da basılır — bileşik kart (`card` çocuk almaz, kap alır). Basılı his soluklaşma + küçülme; içteki düğmenin basışı kabın `click`ini tetiklemez. Bağsız kap dokunuşu yutmaz. `ariaLabel` basılabilir kabın ekran okuyucu adıdır; cihazda rol `button`, web'de rol yazılmaz (react-native-web `button` rolünü `<button>` öğesine çevirir, içteki düğme iç içe `<button>` olurdu)."
|
|
45
|
-
]
|
|
46
|
-
},
|
|
47
|
-
'widget-area': {
|
|
48
|
-
summary: 'Konteyner widget`ının kökü; yerleşim sözleşmesi `container` ile aynıdır.',
|
|
49
|
-
differences: [
|
|
50
|
-
'`layout` düşer (flex-only), `style` düşer.',
|
|
51
|
-
'Özel sekme çubuğu (Ayarlar › Sekmeler › Özel widget, K14) bu kökü taşıyan mobil widget`tır: runtime onu `Widget.tabs = { items: [{ page, slug, label, icon, active }], activePage }` parametresiyle çizer, kök kimliği `__tabs`.'
|
|
52
|
-
]
|
|
53
|
-
},
|
|
54
|
-
'safe-area': {
|
|
55
|
-
summary: 'Güvenli alan kabı: içeriği durum çubuğu, çentik ve ev göstergesinden uzak tutar (D15).',
|
|
56
|
-
differences: [
|
|
57
|
-
'Web`de karşılığı YOKTUR — mobile özgü şema; yerleşim alanları mobil `container` ile aynıdır, varsayılan yön sütun.',
|
|
58
|
-
'Pay barındırıcının cihaz bilgisinden gelir (`host.device.insets`): cihazda gerçek güvenli alan, Studio kanvasında seçili cihaz ön ayarı, önizlemede çerçevenin cihazı. Tarayıcıda tam sayfa `/dev`de pay yoktur.',
|
|
59
|
-
'`edges`: all (dört kenar) · top · bottom · vertical. Tasarım kanvası ve önizleme payı KENDİLİĞİNDEN BIRAKMAZ. Üst pay TEK YERDE durur (MOB-015): kabuklu uygulamada kabukta (`safe-area top` içinde app-bar), kabuksuz sayfada ilk öğe olarak; kabuk payı veriyorsa sayfaya ikinci `top`/`all` konmaz. platform_guide(\'mobile-layout\').',
|
|
60
|
-
'Varsayılan sütun + `stretch` ve kenara yaslı: boşluk tipi yazılmamışsa dış/iç boşluk `none` sayılır (`safe-area`, `scroll-view`, `app-bar` — açıkça seçilen değer uygulanır).'
|
|
61
|
-
]
|
|
62
|
-
},
|
|
63
|
-
'scroll-view': {
|
|
64
|
-
summary: 'Kaydırılabilir kap; uzun içeriği kaydıran açık bir karardır.',
|
|
65
|
-
differences: [
|
|
66
|
-
'Web`de karşılığı YOKTUR. Sayfa kökü zaten kaydırır (barındırıcı sayfayı bir kaydırıcı içinde çizer); `scroll-view` gerekçeli İÇ kaydırıcıdır: çekerek yenile (`refreshable`), yapışkan başlık (`stickyHeader` / `states.isSticky`), yatay şerit (`horizontal`) ya da sabit boylu iç liste (`heightType: fixed`). Gerekçesiz ya da iç içe dikey kaydırıcı MOB-016 alır.',
|
|
67
|
-
'`horizontal` yatay kaydırır; yerleşim alanları içerik kabına uygulanır. Sona varınca `scrollEnd` yayılır.',
|
|
68
|
-
'`refreshable` YALNIZ dikey kaydırmada ve yalnız runtime kipinde çekerek yenileyi açar (`refresh` olayı); tasarım kanvasında jest çizilmez. Barındırıcı (Expo) kendi çekerek yenilesini bu durumda KAPATIR, yoksa iki gösterge üst üste biner.',
|
|
69
|
-
'`stickyHeader` (FlutterFlow StickyHeader) İLK çocuğu kaydırırken üstte tutar — tasarım kanvasında da; yalnız dikey kaydırmada (RN `stickyHeaderIndices`), `horizontal` açıkken yok sayılır ve panel alanı gizler.',
|
|
70
|
-
'Yapışkan çocuk bir `tabs` ise runtime`da yalnız ŞERİDİ yapışır, gövde kayan içerikle akar (bitki detayı: görsel, sekme şeridi, uzun gövde) — `tabs`a `states: { isSticky: true }` verin, kaydırıcıya `heightType: fixed`. Tasarım kanvasında sekme bölünmez.',
|
|
71
|
-
'`scroll { y, contentHeight, viewportHeight }` 100 ms seyreltmeyle YALNIZ `scroll` olayına akış bağlıyken yayılır; konum düğüme `scrollY` olarak da yazılır (bağ: `{{ kaydirici.scrollY }}`, şemada ilan edilmez). Akış bağlı değilken `scrollY` güncellenmez.',
|
|
72
|
-
'İlk çocuk dışındaki DOĞRUDAN çocuklar düğüm durumu `states.isSticky: true` ile yapışır (ör. listenin ortasındaki bölüm başlıkları; `stickyHeader` ile birlikte de çalışır). Studio panelinde bu bayrağın alanı YOKTUR — şemaya MCP yazar (`add_component` gövdesinde `states: { isSticky: true }`). Yalnız dikey; kaydırıcının boyu sınırlı olmalı (`heightType: fill` sayfa kaydırıcısı içinde içerik kadar uzar — `fixed` verin). Web önizlemede sonraki başlık öncekini itmez, üstüne biner; iOS`ta iter.'
|
|
73
|
-
],
|
|
74
|
-
propNotes: {
|
|
75
|
-
refreshable: 'Çekerek yenile; akış bir söz döndürürse gösterge onu bekler, döndürmezse 600 ms döner.',
|
|
76
|
-
stickyHeader: 'İlk çocuk yapışır: başlık olacak kabı ilk sıraya koyun ve ona kendi zeminini verin — yapışan kap saydamsa altından akan içerik görünür.'
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
text: {
|
|
80
|
-
summary: 'Metin; punto temanın tip ölçeğinden gelir.',
|
|
81
|
-
differences: [
|
|
82
|
-
'`wordBreak` düşer: React Native metni `numberOfLines`/`ellipsizeMode` ile sınırlar, CSS kırma kuralının karşılığı yoktur.',
|
|
83
|
-
"`lineClamp` (1–10) `numberOfLines` + sonda üç nokta olarak uygulanır (2026-09-27, f-05). Mobile-only `highlight`: aramaya bağlanan metin — eşleşen parçalar `font-semibold text-primary`; karşılaştırma uygulama diline göre katlanır (`tr`'de `I`↔`ı`, `İ`↔`i`). Satır içi bağlantı için `markdown` + `linkClick` kullanın.",
|
|
84
|
-
"Seviyenin mobil karşılığı varsa (`--ng-font-size-<seviye>-mobile`) o kullanılır; metin stili ATA KAPTAN MİRAS ALINMAZ (RN'de miras yoktur), kabuk tipografiyi bağlama yazar."
|
|
85
|
-
]
|
|
86
|
-
},
|
|
87
|
-
button: {
|
|
88
|
-
summary: "Tıklama kaynağı; shadcn `Button` ilkeli. `kind` semantik rengi, `variant` o rengin kullanımını seçer; mobil kırılım shadcn'in `secondary`/`ghost`/`link` varyantlarını ve `icon` boyunu, `tonal` varyantını, `iconPosition: top`u ve `ariaLabel`i ekler (web şeması değişmez).",
|
|
89
|
-
differences: [
|
|
90
|
-
'`isNewTabLink` düşer: mobilde sekme yoktur, bağlantı sistem tarayıcısına ya da derin bağlantıya gider (F5/F6).',
|
|
91
|
-
'`isLoading` açıkken `ActivityIndicator` ikonun yerinde döner (ikonsuz düğmede etiketin önünde).',
|
|
92
|
-
"İkon (`icon` + `iconPosition`) Material Symbols glifidir, etiketin ton rengini alır; `iconPosition: top` (mobile-only) ikonu etiketin üstüne koyar — `appearance` boyuyla (`heightType: fixed`) dikey karo, `variant: tonal` ile D01 hızlı eylem satırı. Rozet (`badgeValue`, `badgeColor` varsayılan `error`) `badge` ilkeliyle sağ üst köşede; `'•'` nokta, boş değer çizilmez. 2026-09-27'ye dek ikon ve rozet çizilmiyordu (f-04).",
|
|
93
|
-
"`size: icon` kare düğmedir (kenarı `md` yüksekliği), yalnız glif çizilir, `text` çizilmez. Ekran okuyucu adı sırayla `ariaLabel` → `text` → ikonun adı; ad vermeyen ikon düğmesi MOB-013 bilgi satırı üretir.",
|
|
94
|
-
"`type: link`: dokunuş `click` yayar ve dış `href` (http(s), mailto, tel, nokta taşıyan alan adı) sistem tarayıcısında açılır; uygulama içi yol (`/sayfa`) açılmaz — gezinme `click` akışında `redirect` ile.",
|
|
95
|
-
"Etiketin rengi düğmenin kendi kararıdır (`kind`/`variant` kontrastı): ata kabın `typographyStyle.color`ı etikete İNMEZ, punto da temanın form ölçüsünden gelir; aile ve kalınlık gibi öteki tipografi alanları iner."
|
|
96
|
-
],
|
|
97
|
-
propNotes: {
|
|
98
|
-
variant: "shadcn varyantına çevrilir: `solid` → `default` (`kind: error` iken `destructive`) · `outline` → `outline` (`--background` zemin, `--border` kenar) · `text` (web'in adı) ve `ghost` → `ghost` (zeminsiz) · `secondary` → `secondary` (nötr `--secondary` dolgu) · `link` → `link` (zeminsiz, etiket `--primary`). `tonal` (mobile-only) rolün açık zemini + rolün kendisinde etiket (`primary` → `--primary`/15, `error` → `--destructive`/15, `success`/`warning` → `--status-*`/15; `info` yüzey rengi olduğu için dolu zemin + ön plan etiketi). `secondary`, `ghost`, `link` ve `tonal` YALNIZ mobil şemada seçenektir.",
|
|
99
|
-
kind: "Rengin nerede göründüğü varyanta bağlıdır. `solid`: zemin `primary` → `--primary`, `error` → `--destructive`, `info`/`success`/`warning` → `--status-*`. `outline`: `primary` NÖTR kalır (`--border` kenar, ön plan rengi etiket), `error` ve durum renkleri kenarı ve etiketi boyar. `text`: `primary` nötr ön plan etiketi, `error` ve durum renkleri etiketi boyar (`ghost` `primary`/`error`'da aynı). `secondary`: nötr dolgu, `error` etiketi `--destructive` yapar. `link`: etiket `--primary`, `error` iken `--destructive`. BİLİNEN HATA: `info`/`success`/`warning` `ghost`, `secondary` ya da `link` ile verilirse zemin de etiket de aynı durum rengine boyanır ve etiket okunmaz — bu üç varyantta `kind`'ı `primary` ya da `error` bırakın.",
|
|
100
|
-
size: "`sm` → shadcn `sm`, `md` → `default`, `lg` → `lg`, boş (`''`) temanın varsayılanı (`--ng-form-default-size`); bu kademelerde yükseklik, punto ve yatay iç boşluk sınıftan değil temanın `--ng-form-height-*`/`--ng-form-font-size-*`/`--ng-form-padding-x-*` değişkenlerinden gelir. `icon` (yalnız mobil) için temada `--ng-form-*-icon` değişkeni YOKTUR: satır içi yükseklik tanımsız kalır, iç boşluk `spacing.md`'ye, punto taban puntoya düşer ve düğme ikon da çizmez — bu kademe bugün kullanışlı değildir."
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
form: {
|
|
104
|
-
summary: 'Alanları taşıyan kap; yerleşim sözleşmesi `container` ile aynıdır.',
|
|
105
|
-
differences: [
|
|
106
|
-
'`layout` düşer (flex-only).',
|
|
107
|
-
'Doğrulama ve `submit` akışı F5 runtime fazında bağlanır; tasarım kipinde form yalnız alanları dizer.'
|
|
108
|
-
]
|
|
109
|
-
},
|
|
110
|
-
'form-validation-errors': {
|
|
111
|
-
summary: 'Formun topladığı hataların listesi; renk temanın hata renginden gelir.',
|
|
112
|
-
differences: [
|
|
113
|
-
'Satır metni `label` + `message` birleşiminden çıkar; düz metin dizisi de kabul edilir.',
|
|
114
|
-
'`hideFormValidationMessage` başlığı gizlemez (web ile aynı): bayrağı form okur, alan altı metinleri boş yazar, liste başlığıyla kalır. Liste ve başlık ikisi de boşsa komponent HİÇ çizilmez (web kutuyu boş çizer).'
|
|
115
|
-
]
|
|
116
|
-
},
|
|
117
|
-
textinput: {
|
|
118
|
-
summary: 'Tek satırlık metin alanı; etiket/açıklama/hata kabuğu bütün alanlarda ortaktır.',
|
|
119
|
-
differences: [
|
|
120
|
-
"`inputMask` web'in `input-mask` modülüyle girişte uygulanır (`pattern:`/`date:`/`time:`… biçimlenir, `regex:`/`iban:` yalnız doğrulanır); değer MASKELİ yazılır (web gibi), imleç sonda. Telefon deseni (`(` ya da `+` taşıyan) klavyeyi telefon tuş takımına, rakamlı aileler sayı klavyesine çevirir.",
|
|
121
|
-
"`clearable`: değer doluyken ve alan düzenlenebilirken sağda × (`<elementId>__clear`); basış `change('')` + `changed('')`, odak alanda kalır.",
|
|
122
|
-
"Mobile-only (D11): `keyboardType` (`default|email|phone|number|decimal|url`; boşsa maskeden), `autoComplete` (`off|email|name|tel|username|postal-code|one-time-code` → iOS `textContentType`), `variant: search` (hap köşe, başta arama ikonu, odaktayken sağda uygulama dilinde \"Vazgeç\" `<elementId>__cancel`: değeri temizler, klavyeyi kapatır, `cancel` yayar), `isValid` (yeşil kenar + ✓; geçersizlik kazanır).",
|
|
123
|
-
'`prefixIcon`/`suffixIcon` alanın içinde glif olarak çizilir (ortak `FieldBox`); `autofocus` runtime\'da klavyeyi açar. 2026-09-27\'ye dek dördü de çizilmiyordu (f-05).',
|
|
124
|
-
'Sayaç kuralı web ile aynı: yalnız `showCounter` açık VE `maxChars` > 0 iken çizilir.'
|
|
125
|
-
]
|
|
126
|
-
},
|
|
127
|
-
textarea: {
|
|
128
|
-
summary: 'Çok satırlı metin alanı.',
|
|
129
|
-
differences: [
|
|
130
|
-
'Yükseklik açıkça verilir (React Native `TextInput` satır sayısını kendi ölçmez): `autoGrow` (web varsayılanı AÇIK) iken içerikle `minLines`–`maxLines` arasında büyür, kapalıyken sabit `lines`. 2026-09-27\'ye dek hep sabit boydu (f-05). Satır yüksekliği `punto × 1,45` stile yazılır ve satır tabanlı boylar iç boşluk + kenarlığı içerir: `maxLines: 5` beş tam satır gösterir (2026-09-29). `autofocus` runtime\'da klavyeyi açar.'
|
|
131
|
-
]
|
|
132
|
-
},
|
|
133
|
-
numberinput: {
|
|
134
|
-
summary: 'Sayısal klavye açan alan; değer `Intl.NumberFormat` ile biçimlenir.',
|
|
135
|
-
differences: [
|
|
136
|
-
'Klavye `allowDemicalPoints` açıkken `decimal-pad`, kapalıyken `number-pad`. Yazılan değer ayrıştırılabildiği anda `minValue`/`maxValue` aralığına kırpılarak yazılır. `prefixIcon`/`suffixIcon` alanın içinde, `autofocus` runtime\'da (f-05).',
|
|
137
|
-
'Web alanı artı/eksi düğmelerini HEP çizer; mobilde düz alan varsayılandır. Düğmeler `variant: stepper` ile gelir — YALNIZ mobil şemada (web şeması değişmez; FlutterFlow Count Controller): alanın iki yanında `-`/`+` (shadcn `outline` `icon`), alana elle yazmak açık kalır; web gibi salt okunur ve görüntüleme kipinde çizilmez, yüklenirken pasiftir. İç roller `<elementId>__decrement` / `<elementId>__increment` — `page_screenshot` `click` onlarla basar.'
|
|
138
|
-
],
|
|
139
|
-
propNotes: {
|
|
140
|
-
variant: "`input` (varsayılan) düz alan; `stepper` ± düğmeli. Basış web `stepBy` gibi değeri `step` kadar değiştirir ve sırayla `change` ile `changed` yayar (`{ value }`): boş değer 0'dan başlar, `step` yoksa ya da pozitif değilse 1; sonuç ve adım alanın GÖSTERDİĞİ basamağa oturur (tam sayı alanında adım en az 1, ondalıkta `decimalPlaces`), yani saklanan değer ekrandakiyle aynıdır; `minValue`/`maxValue`'ya kırpılır. Web kuralıyla `+` yalnız değer üst sınırın altındayken, `-` alt sınırın üstündeyken basılır (aralık dışındaki değerde ters yöne götüren düğme pasif); tasarım kipinde basılamaz."
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
password: {
|
|
144
|
-
summary: 'Gizli metin alanı; göster/gizle düğmesi alanın içindedir.',
|
|
145
|
-
differences: [
|
|
146
|
-
"`autofill` web değerleriyle çalışır: `current-password` → iOS `password` (Anahtar Zinciri), `new-password` → `newPassword` + parola kuralı (\"Güçlü parola\" önerisi), `off`.",
|
|
147
|
-
'Göster/gizle göz ikonudur (`visibility`/`visibility_off`), ekran okuyucu adı uygulama dilinden ("Göster"/"Gizle"). Kimliği `<elementId>__reveal` — `page_screenshot` `click` onunla basar. 2026-09-27\'ye dek sabit İngilizce "Show"/"Hide" metniydi.',
|
|
148
|
-
"Mobile-only: `showStrength` (altta dört parça + Zayıf/Orta/İyi/Güçlü; ölçütler: 8+ karakter, büyük+küçük harf, rakam, sembol; 8'den kısa parola en çok Zayıf), `isValid`. `maxChars`/`showCounter`/`prefixIcon`/`suffixIcon`/`autofocus` `textinput` kuralıyla uygulanır."
|
|
149
|
-
]
|
|
150
|
-
},
|
|
151
|
-
checkbox: {
|
|
152
|
-
summary: 'Onay kutusu; shadcn `Checkbox` ilkeli (`@rn-primitives/checkbox`), işaret Material Symbols glifidir. Kutu ölçüsü temanın form puntosundan çıkar.',
|
|
153
|
-
differences: [
|
|
154
|
-
'`isIndeterminate` `value`yu bastırır ve tire (`remove` glifi) çizer; belirsiz kutuya dokunmak onu seçili yapar.',
|
|
155
|
-
'Etikete dokunmak da kutuyu çevirir (basış satırın `Pressable`ında toplanır).',
|
|
156
|
-
'`page_screenshot` kutuyu `<elementId>__press` ile çevirir (düğmedeki gibi; kök kimliğe `click` kabuğa gider ve kutuyu ÇEVİRMEZ).',
|
|
157
|
-
'`labelPosition` yalnız `left`/`right`; `left` seçilince etiket ile kutu satırın iki ucuna yaslanır.',
|
|
158
|
-
'Düşenler: `autofocus` ve `focus`/`blur` olayları (onay kutusunun klavye odağı yok, tek sinyal değer değişimidir).'
|
|
159
|
-
]
|
|
160
|
-
},
|
|
161
|
-
switch: {
|
|
162
|
-
summary: 'Açma/kapama anahtarı; shadcn `Switch` ilkeli (`@rn-primitives/switch`) — üç barındırıcıda AYNI görünüm.',
|
|
163
|
-
differences: [
|
|
164
|
-
'`page_screenshot` anahtarı `<elementId>__press` ile çevirir (kök kimliğe `click` kabuğa gider).',
|
|
165
|
-
'Platformun kendi anahtarı (iOS/Android `Switch`) KULLANILMAZ: açıkken zemin `--primary`, kapalıyken `--input`, baş `--background`; kanvas, önizleme ve cihaz aynı bileşeni çizer.',
|
|
166
|
-
'`isReadonly` ve `isDisabled` anahtarı kilitler ve soldurur; `isDisabled` etiketi de soldurur. Tasarım kanvasında anahtar basılamaz olduğu için HER anahtar soluk çizilir — önizlemede ve cihazda değil.',
|
|
167
|
-
'Düşenler: `autofocus` ve `focus`/`blur` olayları (anahtarın klavye odağı yok, tek sinyal değer değişimidir).'
|
|
168
|
-
]
|
|
169
|
-
},
|
|
170
|
-
dropdown: {
|
|
171
|
-
summary: 'Seçim listesi; kısa liste alanın altında, uzun ya da aramalı liste alttan açılan sayfada açılır.',
|
|
172
|
-
differences: [
|
|
173
|
-
'`presentation` (mobile özgü): `auto` (varsayılan) sekiz ve daha az seçenekli, aramasız listeyi alanın hemen ALTINDA açar (altta yer yoksa ya da klavye açıksa üstte), öbürünü ekranın altından açılan sayfada; `sheet` hep sayfa, `inline` hep alan altı (arama varsa sayfa).',
|
|
174
|
-
'Sayfada dokuz ve daha çok seçenek ya da `search` akışa bağlıyken tepede arama kutusu durur (iç rol `<elementId>__search`): bağlıysa `search { searchText }` yayar ve listeyi akış yazar, değilse yerelde süzer. Açılış `focus`, kapanış `blur` yayar.',
|
|
175
|
-
'Seçenek görseli web `SelectItem` önceliğiyle: `prefixImage` > `prefixText` (zemini `color`) > `icon` (rengi `color`); seçiliyken kutuda da çizilir. Gizli seçenek (`isHidden`) çizilmez. `isViewmode` kutuyu kilitler, ok ve temizleme düğmesini kaldırır. Düşenler: `options[].tooltip`, `isExpanded`, `isSelectable` (ağaç ve üzerine gelme yok).',
|
|
176
|
-
'Tetikleyici shadcn `Input` görünümündedir (`--input` kenarı; yükseklik, köşe ve punto öteki alanlarla aynı `--ng-form-*` ölçüsü); liste `--popover` yüzeyinde, seçili satırda `check` glifi. Tetikleyici `role="combobox"` taşır (iç rol `<elementId>__trigger`, temizleme düğmesi `<elementId>__clear`), seçilebilir satırlar `role="option"` + `data-value`; liste katmanda açıldığı için `page_screenshot` `select` seçeneği belgede arar ve değerle ya da görünen metinle seçer.',
|
|
177
|
-
'Seçenekler normalize edilir: düz metin dizisi, nesne dizisi ve `optionType: "grouped"` çocukları tek biçime iner; grup başlığı seçilemez, etiketi olmayan seçenek değerini gösterir.'
|
|
178
|
-
]
|
|
179
|
-
},
|
|
180
|
-
'language-selector': {
|
|
181
|
-
summary: 'Dil değiştirici; `dropdown`un tam ekran `Modal` listesiyle çizilir, seçim uygulama çapında kalıcı olur.',
|
|
182
|
-
differences: [
|
|
183
|
-
"Çizim `dropdown`un kendisidir (plans/mobil-coklu-dil K4): tetikleyici `role=\"combobox\"` (iç rol `<elementId>__trigger`), liste tam ekran `Modal`da `role=\"option\"` + `data-value` satırları; temizleme düğmesi YOK (dil boş olamaz). `page_screenshot` `select: '<elementId>', value: 'en'` ile seçilir, seçenek metni dilin yerel adıdır (`LANGUAGE_NAMES`: `tr` → Türkçe, `en` → English).",
|
|
184
|
-
"Diller ve aktif dil makineden enjekte edilir (web `RenderComponent` ile aynı): `languages` = projenin dil listesi (`project_update(languages)`), `value` = `machine.getLanguage()`. Seçim `machine.setLanguage(value)` ile bütün düğümlere `reload` yayar (çeviriye bağlı prop'lar yerinde çözülür), sonra `change { value, selectedLabel }` sayfa akışına gider.",
|
|
185
|
-
"Seçim makineye VERİLEN depoya `zeyrek:<app>:lang` anahtarıyla yazılır: `/preview` ve `/dev|/view`'da tarayıcı `localStorage`, cihazda uygulamanın kv-store'u — uygulama yeniden açılınca o dille başlar. Cihazda barındırıcı seçimi uygulama çapında yayar (`onLanguageChange`): öteki sekmelerin ekranları ve sekme etiketleri de değişir; `?lang` yalnız web barındırıcısında vardır.",
|
|
186
|
-
"`displayMode` web'in etiket kuralıyla çizilir: `native` dilin yerel adı, `code` büyük harf kod (`TR`), `both` `Türkçe (TR)`; sözlükte olmayan kod büyük harfle kendisidir. Açılış/kapanış `focus`/`blur` yayar (`dropdown`dan).",
|
|
187
|
-
"Projede dil tanımlı değilse (`languages` boş) liste boş çizilir — önce `project_update(languages, defaultLanguage)`; `project_get` yanıtındaki `localization` bloğu runtime'ın çevirileri çözüp çözemeyeceğini söyler."
|
|
188
|
-
],
|
|
189
|
-
propNotes: {
|
|
190
|
-
label: 'Alan etiketi (`FieldShell`); boşsa yalnız tetikleyici çizilir.'
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
divider: {
|
|
194
|
-
summary: 'Çizgi; etiket verilirse çizgi etiketin iki yanına bölünür.',
|
|
195
|
-
differences: [
|
|
196
|
-
"Kesikli/noktalı desen `borderStyle` ile çizilir (arka planla çizilen düz çizgide desen görünmez); kalınlık kenarlığa yazılır.",
|
|
197
|
-
'Dikey kipte çizgi kabın yüksekliğini alır (`alignSelf: stretch`).'
|
|
198
|
-
]
|
|
199
|
-
},
|
|
200
|
-
spacer: {
|
|
201
|
-
summary: 'Boşluk; `flex` kipinde kalan alanı yer, `fixed` kipinde `size` kadar.',
|
|
202
|
-
differences: [
|
|
203
|
-
'Tasarım kipinde `showInEditor` açıkken kesikli çerçeveyle görünür olur; runtime`da iz bırakmaz (web ile aynı sözleşme).'
|
|
204
|
-
]
|
|
205
|
-
},
|
|
206
|
-
image: {
|
|
207
|
-
summary: 'Görsel; kaynak düz URL ya da platformun dosya nesnesi olabilir.',
|
|
208
|
-
differences: [
|
|
209
|
-
'RN `Image` kullanılır (expo-image değil): paket üç barındırıcıda da aynı kodla çalışır.',
|
|
210
|
-
"Kayıttan okunan FILE alanı `{ id, type: 'ref', value: <dosya id>, absolute_path: <url>, fileName }` döner: prop'a NESNENİN KENDİSİNİ verin (`{{ item.foto }}`) ya da `.absolute_path` yazın — `.value` dosya kimliğidir (GUID), görsel çizilmez (MOB-011). Çözüm web `getfileUrl` ile aynı: metin olduğu gibi, `type: 'file'` nesnede `data`/`value` (base64), öteki nesnelerde `absolute_path`/`url`.",
|
|
211
|
-
'Göreli dosya yolu (`/files/...`) runtime\'da API kökünün kaynağına çözülür (`resolveMediaUrl`; `video`, `audio`, `lottie`, `card`, `carousel`, `list-item`, `avatar`, `emptystate`, `file-field`, `photo-viewer`, `timeline` ve seçenek görselleri de): cihaz kök bilmez. Mutlak, `data:`/`blob:` adres olduğu gibi kalır; web önizlemede yol aynı kökten yüklenir.',
|
|
212
|
-
'Kaynak çözülemezse (boş prop, tanınmayan nesne) YER TUTUCU çizilir — boş kutu tasarımcıya "kaynak boş" demenin tek yolu.',
|
|
213
|
-
'Görselin boyu (`imageFrameStyle`, `video`/`lottie` ile aynı sıra): (1) boy kabuktan geliyorsa görsel kabuğu DOLDURUR — `heightType: fixed` + `px` boyda tam, `fixed` + `%` boyda ve `fill`de 96 dp taban boyun altına inmeden (ata içerik boyundaysa yüzde ve `fill` boy vermez); (2) değilse `appearance.aspectRatio` görselin kendisine yazılır: boy `auto` ve genişlik `fill`/`fixed` iken boy genişlikten türer; (3) ikisi de yoksa 96 dp taban boy (MOB-012 bilgi satırı). 2026-09-27\'ye dek (1) yoktu: `fixed` verilen görsel 96 dp çizilip altında boşluk bırakıyordu.',
|
|
214
|
-
'Düşenler: `isZoomable`, `isRotatable` (görsel kendisi büyütmez; tam ekran görüntüleyici ayrı iş, plans/mobil-plantcare-acigi f-14).',
|
|
215
|
-
'Mobile özgü alanlar: `fit` (`cover` varsayılan — web kuralı: `widthType: contain` sığdırır; `contain` sığdırır, `fill` gerer), `fallbackSrc` (kaynak boşsa ya da yüklenemezse çizilir; o da yoksa yer tutucu) ve `surfaceStyle` (köşe, kenar, gölge, opaklık; köşe görselin kendisine de yazılır, grupta köşe yoksa tema köşesi). Yuvarlak küçük resim: `surfaceStyle: { radius: "14px" }` + `appearance.aspectRatio: 1` — sarmalayıcı kap gerekmez.'
|
|
216
|
-
]
|
|
217
|
-
},
|
|
218
|
-
icon: {
|
|
219
|
-
summary: 'Tek glif; Material Symbols LİGATÜRÜ olarak çizilir.',
|
|
220
|
-
differences: [
|
|
221
|
-
'Glif bir metindir: ad (`home`) yazı tipi tarafından glife çevrilir, ayrı svg seti taşınmaz. Studio sayfası yazı tipini yüklü tutar; Expo uygulaması `expo-font` ile yükler (F6).',
|
|
222
|
-
'`isSpinning` (f-19): glif 1 sn`de tam tur döner; kanvasta ve "hareketi azalt"ta durur.',
|
|
223
|
-
'`isNewTabLink` düşer (button ile aynı gerekçe).',
|
|
224
|
-
"Etkileşim web `resolveIconInteraction`'ın karşılığı: dış `href` ikonu bağlantı, bağlı `click` düğme yapar; dokunuş `click` yayar, dış adres sistem tarayıcısında açılır, uygulama içi yol akışa kalır. `isDisabled` soldurur ve etkileşimi keser. Etkileşimli ikonun ekran okuyucu adı `ariaLabel`, yoksa ikonun adı. 2026-09-27'ye dek ikon basılamıyordu (f-04)."
|
|
225
|
-
]
|
|
226
|
-
},
|
|
227
|
-
card: {
|
|
228
|
-
summary: 'Görsel + başlık + açıklama + düğme.',
|
|
229
|
-
differences: [
|
|
230
|
-
'`imageFit` RN `resizeMode`a çevrilir: cover→cover, contain→contain, fill→stretch, none→center.',
|
|
231
|
-
'`surfaceStyle` (mobile özgü) kartın ÇERÇEVESİDİR: köşe, kenar, zemin, gölge sınıf tabanını ezer (`radius: "28px 28px 0 0"` üstü yuvarlak kart). Kabuk grubu ikinci kez çizmez.',
|
|
232
|
-
"`image` `image` bileşeniyle aynı çözümden geçer: kayıttaki FILE alanını nesne olarak verin (`{{ item.foto }}`) ya da `.absolute_path` yazın; `.value` dosya kimliğidir (GUID), görsel çizilmez (MOB-011).",
|
|
233
|
-
'Kartın TAMAMI dokunulabilir: gövdeye dokunmak `click` yayar. Kartın düğmesi (`buttonText`) web `Card.svelte` sırasıyla önce kendi `buttonClick`ini, ardından kartın `click`ini yayar (2026-09-27, f-02 H10) — düğmeye ayrı akış bağlamak için `buttonClick`i kullanın; `click` akışı iki dokunuşta da koşar. Liste satırına dokunmak repeater şablonundaki kartın `click`idir. Kart çocuk ALMAZ — satırın alanlarını `title`/`description` kod bağıyla (`{ type: \'code\', ref: \'{{ item.alan }}\' }`) verin.'
|
|
234
|
-
]
|
|
235
|
-
},
|
|
236
|
-
emptystate: {
|
|
237
|
-
summary: 'Liste boşken çizilen ikon + başlık + açıklama + eylemler.',
|
|
238
|
-
differences: [
|
|
239
|
-
'İkon `icon` komponentiyle aynı ligatür yolunu kullanır. `image` verilirse ikonun yerine görsel çizilir (web): kutu `size`a göre sm 140×100, md 220×160, lg 320×240, sığdırarak.',
|
|
240
|
-
'Metni olmayan ve gizli (`isHidden`) eylem kaydı çizilmez; kilitli (`isDisabled`) eylem basılmaz; eylem kimlikleri `__action-<sıra>`.',
|
|
241
|
-
"Eylemin dış `href`'i `actionClick` yayıldıktan sonra sistem tarayıcısında açılır (web: bağlantı gezinir ve olay yine yayılır); uygulama içi yol akışa kalır. Düşenler: `actions[].isNewTabLink` (mobilde sekme yoktur)."
|
|
242
|
-
]
|
|
243
|
-
},
|
|
244
|
-
slot: {
|
|
245
|
-
summary: 'Layout`un sayfa yuvası; runtime`da sayfanın şeması buraya enjekte edilir.',
|
|
246
|
-
differences: [
|
|
247
|
-
'Tasarım kipinde YER TUTUCU çizilir (kesikli kutu + ad): boş `View` yuvayı görünmez yapıyor, layout`ta yeri kestirilemiyordu.'
|
|
248
|
-
]
|
|
249
|
-
},
|
|
250
|
-
repeater: {
|
|
251
|
-
summary: 'Şablon düğümlerini satır başına tekrarlar; satır kimlikleri `__row-<i>`.',
|
|
252
|
-
differences: [
|
|
253
|
-
'`FlatList` v1`de KULLANILMAZ: sanallaştırma yalnız gerçek veriyle anlamlı, tasarım kipinde ölçüm haritasını bozar (kaplama görünmeyen satırın kutusunu bulamaz).',
|
|
254
|
-
'Tasarım kipinde şablon BİR kez çizilir. Runtime`da her satır web ile AYNI makine parametresiyle (`index`, `row`, `repeaterId`) çizilir: bağlı prop`lar `Row` / `RowIndex` / `item` okur. Satır yoksa (`rows` boş dizi ya da `null`) `emptyTitle`/`emptyDescription` doluysa `emptystate` çizilir; ikisi de boşsa hiçbir şey çizilmez (web ile aynı).',
|
|
255
|
-
'Satırdaki bir düğümün olayı ÖNCE tekrarlayıcıya `change { selectedIndex }` yazar (aynı satırsa yazmaz), sonra kendi akışını koşar (web sırası), çocuğun `click`inden sonra da `select` yayar. Akışta tıklanan satırın iki yolu var: `<tekrarlayıcı>.selectedItem` / `.selectedIndex` HER runtime sürümünde çalışır (önerilen); `Row` / `RowIndex` / `item` ARC-121 düzeltmesini (2026-09-27) taşıyan runtime`da da satırı verir ve `item`a yazmak YALNIZ o satırı günceller — daha eski runtime`da akış ifadesinde boştu (ölçüldü 2026-09-19).',
|
|
256
|
-
'Satır bağlamındaki bir akışın setter hedefi satırın şablonu DIŞINDAysa (bir modal, sayfa düzeyi bir metin) yazım SAYFA kapsamında olur; İÇİNDEyse satır bazlı depoya (`_repeaterValues`) yazılır — kapsamı olayın kaynağı değil hedefin AĞAÇTAKİ yeri belirler, `flow-trigger` üzerinden koşan aynı akış için de değişmez (ZM-08, `isElementInRepeaterTemplate`, 2026-09-26).',
|
|
257
|
-
'İç içe repeater zaten MCP tarafından reddedilir (`PAGE-013`) — başlıklar altında gruplu liste (güne göre görevler) için `grouped-list` kullanın; yoksa bir DIŞ repeater\'ın şablonuna İÇ satırdan yazan bir akışın yazımı dış satırın değil İÇ satırın kimliğiyle anahtarlanırdı — bilinen açık, `PAGE-013` riski düşük tutar.',
|
|
258
|
-
'`columnCount` > 1 iken satırlar yüzde genişlikle sarılır (RN`de CSS grid yok).',
|
|
259
|
-
'`direction: horizontal` (MOBİLE ÖZGÜ) satırları tek satırlı, göstergesiz yatay kaydırıcıda dizer — ana sayfanın bitki kartı şeridi. Öğe genişliği `itemWidth` (px; boşsa şablonun kendi `appearance` genişliği), aralık `horizontalSpacing`; `snap: item` kaydırmayı kart başına oturtur (web önizlemesinde CSS scroll-snap). `columnCount` yatayda yok sayılır. Şablon kabına `widthType: fill` verin ki kart `itemWidth`i doldursun.',
|
|
260
|
-
'GRUPLAMA bu bileşende YOKTUR: başlıklar altında liste (türe/zamana göre görevler) `grouped-list`tir — sayaç başlık şablonunda `Section.count`, toplu eylem başlıktaki bir `button` (akışı `Section.items` okur).',
|
|
261
|
-
'Çoklu seçim (MOBİLE ÖZGÜ): `selectionMode: multiple` satır başına onay kutusu çizer, dokunuş seçimi değiştirir ve `itemPress`/`change`/`select` YAYILMAZ; `selectionChange { selectedIndices, count }` yayılır. Seçim düğüme yazılır: `{{ <liste>.selectedItems.length }} seçildi`, `<liste>.selectedIndices`. `longPressSelects: true` uzun basışla kipi açar (basılan satır seçili). Kipi kapatmak: setter ile `selectionMode: \'single\'` + `selectedIndices: []` + `selectedItems: []`. Seçim başlığı ayrı bir `app-bar`dır, iki çubuk `isHidden` bağıyla yer değiştirir.',
|
|
262
|
-
'`swipeActions` (eylemin `icon`u etiketin üstünde glif olarak çizilir) ve `itemPressable` MOBİLE ÖZGÜDÜR (webde yok). Jest RN `Animated` + `PanResponder` ile kurulur — paket v1`de `reanimated`/`gesture-handler` yok — ve yalnız YATAY harekette yakalanır, böylece dikey kaydırma kaba kalır. Tasarım kipinde satırlar şablon olarak çizildiği için jest hiç bağlanmaz.',
|
|
263
|
-
'`swipe` ve `itemPress` yükleri satırı `row` alanında TAŞIR; akış ifadesindeki `Row`/`RowIndex` bağı ayrı bir konudur (ARC-121).',
|
|
264
|
-
'Düşenler: `autoRowSize` (mobil satır her zaman içeriğinin boyundadır).'
|
|
265
|
-
],
|
|
266
|
-
propNotes: {
|
|
267
|
-
itemPressable: 'Satıra dokunulabilir yapar; dokunuş önce `change { selectedIndex }`, sonra `itemPress` yayar.',
|
|
268
|
-
swipeActions: 'Sola kaydırınca açılan eylemler: `key` (zorunlu), `label`, `tone` (default · danger), `icon`. Her eylem 72 pt genişliktedir.',
|
|
269
|
-
direction: '`vertical` (varsayılan) · `horizontal` — yatay şerit; `columnCount` orada yok sayılır.',
|
|
270
|
-
itemWidth: 'Yatay öğenin genişliği (px). Boşsa şablonun kendi genişliği.',
|
|
271
|
-
snap: '`none` · `item` — kaydırma kart + aralık adımına oturur.',
|
|
272
|
-
emptyTitle: 'Satır yokken çizilen boş durumun başlığı (`emptystate` görünümü). Başlık da açıklama da boşsa boş durum çizilmez.',
|
|
273
|
-
emptyDescription: 'Boş durumun açıklaması.',
|
|
274
|
-
emptyIcon: 'Boş durumun ikonu (`{ name }`, varsayılan `package_2`).',
|
|
275
|
-
selectionMode: '`single` (varsayılan, bugünkü `selectedIndex`) · `multiple` (onay kutulu çoklu seçim, `selectionChange`) · `none` (seçim izlenmez).',
|
|
276
|
-
longPressSelects: 'Uzun basış çoklu seçim kipini açar ve basılan satırı seçer.'
|
|
277
|
-
}
|
|
278
|
-
},
|
|
279
|
-
modal: {
|
|
280
|
-
summary: 'Widget kökü; sayfa akışının dışında, üstte açılan katman.',
|
|
281
|
-
differences: [
|
|
282
|
-
'RN `Modal` kullanılır; genişlik web kademelerinden ekran ORANINA çevrilir (small 0.75 · medium 0.85 · large 0.95).',
|
|
283
|
-
'Görünüm temanın shadcn token`larından: perde `--overlay` yarı saydam, gövde `--background` zemin + `--border` kenar + büyük köşe + gölge. Açılış, kapanış ve olaylar değişmedi.',
|
|
284
|
-
'Gövdenin kapatma (×) düğmesinin iç rol kimliği `<elementId>__overlay` (adı tarihsel; `isDismissDisabled` açıkken çizilmez) — `page_screenshot` `click` onunla kapatır.',
|
|
285
|
-
'Tasarım kipinde HER ZAMAN açık ve YERİNDE (sayfa akışında) çizilir: kapalı bir widget`ın içi düzenlenemez; RN `Modal` react-native-web`de sayfanın tamamını kaplayan bir portal açtığı için kanvasta kullanılmaz.',
|
|
286
|
-
'`presentation` YALNIZ mobil şemadadır (web şeması değişmez; FlutterFlow BottomSheet): `center` ortadaki kutu, `sheet` alt sayfa, `fullscreen` tam ekran. Tasarım kipinde üçü de yerinde, kendi görünümüyle çizilir.',
|
|
287
|
-
"`actions` gövdenin altında düğme satırı olarak çizilir (web `ModalActions`; 2026-09-27'ye dek mobilde hiç yoktu, f-04): basılan eylem düğümün `action` olayını eylemin akışıyla yayar, `currentItem` eylemin kaydıdır; `type: submit` eylem `action` yaymaz, `formId`'deki formu gönderir; gizli eylem çizilmez, kilitli/yükleniyor eylem basılmaz. İç rol `<elementId>__action-<key>`. `isLoading` açıkken gövdenin yerinde gösterge döner ve eylem satırı gizlenir (web)."
|
|
288
|
-
],
|
|
289
|
-
propNotes: {
|
|
290
|
-
presentation: "`center` (varsayılan; kayıtlı modallar böyle kalır) web ile aynı kutu, genişlik `size`dan. `sheet`: ekranın altına yapışık, tam genişlik, üst köşeleri yuvarlak ve tutamaçlı; ekranın dibinden yayla gelir ve yayla oturur (damping 20, stiffness 180; 'hareketi azalt'ta anında). Tutamaç + başlık şeridinden aşağı sürükleyince — boyunun üçte biri ya da hızlı savurma — `change { isOpen: false }` ile kapanır; `isDismissDisabled` açıkken yerine döner. İçerik kendi kaydırmasını korur (sürükleme yalnız şeritte); alt sayfa en çok ekranın %90'ıdır, uzun içerik kesilir — kaydırmak için içine `scroll-view` koyun. Kapanış isteği tutmazsa (bir bağ `isOpen`'ı geri yazarsa) sayfa 300 ms sonra yerine döner. `fullscreen`: perdesiz tam ekran, çentik ve ev göstergesi payı dolguda; cihazda kayarak açılır. `size` yalnız `center`da anlamlıdır, panel diğer ikisinde gizler."
|
|
291
|
-
}
|
|
292
|
-
},
|
|
293
|
-
drawer: {
|
|
294
|
-
summary: 'Mobil ÇEKMECE (D14): expo-router Drawer navigator`ı yerine widget.',
|
|
295
|
-
differences: [
|
|
296
|
-
'RN `Modal` + kenara yaslı panel; panel kendi genişliği kadar kenardan 260 ms`de kayar, perde solar; kapanışta geri kayar, katman sonra kalkar (f-19). Kaydırarak kapatma jesti yok.',
|
|
297
|
-
'Görünüm temanın shadcn token`larından: perde `--overlay` yarı saydam, panel `--background` zemin + iç kenarda `--border` çizgisi + gölge.',
|
|
298
|
-
'`size` kademeleri ekran oranına iner (default 0.72 … full 1); `position` yalnız left/right.',
|
|
299
|
-
'Kaplamaya dokunuş kapatır (`__overlay` iç rolü), `isDismissDisabled` açıkken dokunuş yutulur.',
|
|
300
|
-
'`app-bar.menuTarget` bu widget`ı açar (`host.shell.openMenu` → makinede `isOpen: true`); kapanış `change { isOpen: false }` yazar, geçişte `open`/`close` yayılır.',
|
|
301
|
-
'Tasarım kipinde yerinde çizilir (modal ile aynı gerekçe).',
|
|
302
|
-
"`actions` panelin dibinde sol ve sağ grup olarak çizilir (`position: left` sola, yazılmamış ya da `right` sağa — web `filterActionsByPosition`) — olay sözleşmesi `modal` ile aynı. Seçenekli eylem (`options`) satırın altında bir liste açar; seçenek ANA eylemin akışını `currentItem` = seçenekle koşturur (web). İç roller `<elementId>__action-<key>` ve `<elementId>__action-<key>-<seçenek>`. `isLoading` açıkken gövde yerine gösterge döner, eylem satırı gizlenir."
|
|
303
|
-
]
|
|
304
|
-
},
|
|
305
|
-
'app-bar': {
|
|
306
|
-
summary: 'Ekranın üst çubuğu: başlık, sol uç (geri ya da çekmece menüsü) ve sağ eylemler.',
|
|
307
|
-
differences: [
|
|
308
|
-
'Web`de karşılığı YOKTUR — mobile özgü şema (web `header` sayfa akışının parçasıdır, bu ekranın kabuğudur).',
|
|
309
|
-
'`leading: auto` runtime`da `host.shell.canGoBack`tan çözülür: geri gidilebiliyorsa geri, gidilemiyorsa `menuTarget` varsa menü, yoksa boş. Tasarım kipinde çubuk boş kalmasın diye menü/geri çizilir.',
|
|
310
|
-
'İç roller `__back`, `__menu`, `__action-<key>` (K2 kalıbı); `page_screenshot` eylemleri bunları kullanır.',
|
|
311
|
-
'Üst güvenli alan payı çubuğun işi DEĞİLDİR: düz kanvas kararından (D15) sonra payı `safe-area` (`edges: top`) verir — app-bar\'ı onun içine koyun; `mobile_app_create` kabuğu böyle kurar. Ekranda tek app-bar olur, ilk çizilen öğe (MOB-017).',
|
|
312
|
-
'`subtitle` başlığın altındaki ikinci satırdır ("12 bitki · 3 oda"). `actions[].badge` eylemin köşe rozetidir: `•` okunmamış noktası, sayı ya da kısa metin; ton `badgeKind` (varsayılan error).',
|
|
313
|
-
'`variant: transparent` görselin üstünde yüzen çubuktur (bitki detayı): zemin/kenar yok, düğmeler 44 px yarı saydam yuvarlak, glif ve başlık beyaz. Çubuk kendi katmanını KURMAZ: `stack` → çocuk 0 görsel, çocuk 1 `fill`×`fill` `container` → içinde `app-bar`.',
|
|
314
|
-
'Seçim kipi başlığı ayrı bir `app-bar`dır: başlık `{{ (liste.selectedItems || []).length + \' seçildi\' }}`, normal çubukla `isHidden` bağıyla yer değiştirir. Selamlama başlığı (tarih + "Günaydın" + avatar) çubuğa değil sayfa içeriğine konur; çubuğun çocuk yuvası yoktur.'
|
|
315
|
-
],
|
|
316
|
-
propNotes: {
|
|
317
|
-
subtitle: 'Başlığın altındaki ikinci satır.',
|
|
318
|
-
variant: '`default` · `transparent` (görsel üstünde, `stack` ile).'
|
|
319
|
-
}
|
|
320
|
-
},
|
|
321
|
-
badge: {
|
|
322
|
-
summary: 'Sayaç ya da durum rozeti; taşma (99+) ve nokta kipi var.',
|
|
323
|
-
differences: [
|
|
324
|
-
'`isPulsing` DÜŞÜRÜLDÜ: nabız animasyonu web CSS keyframe`idir, mobilde karşılığı yoktur.',
|
|
325
|
-
'İkon İSTEĞE BAĞLIDIR ve verilmediğinde ÇİZİLMEZ — ortak ikon çözücü boş prop`ta `star`a düştüğü için bu slug prop`un gerçekten verilip verilmediğine kendisi bakar.'
|
|
326
|
-
],
|
|
327
|
-
propNotes: {
|
|
328
|
-
color: 'Renk SINIFTAN gelir (`bg-status-*`); `custom` seçilirse `customColor` ham renktir (dolu rozette zemin, çerçevelide kenar + metin). `textColor`/`customTextColor` metni boyar. `click` bağlıysa rozet düğmedir.',
|
|
329
|
-
maxCount: 'Aşıldığında metin `<maxCount>+` olur (99 → `99+`). Web ikiziyle aynı beş altın vaka `badge-logic.spec.ts`te kilitli.'
|
|
330
|
-
}
|
|
331
|
-
},
|
|
332
|
-
avatar: {
|
|
333
|
-
summary: 'Kullanıcı avatarı: görsel, baş harf yedeği ve `+N` grup kipi.',
|
|
334
|
-
differences: [
|
|
335
|
-
'Grup kipinde üst üste binme `spacing` YÜZDESİdir (web "Group overlap (%)"; boşsa %30) ve negatif kenar boşluğuyla çizilir; web`in `z-index` katmanı yerine çizim SIRASI belirler. 2026-09-28`e dek mobil `spacing`i okumuyordu.',
|
|
336
|
-
'Web anlamıyla (2026-09-28): baş harf zemini `color` (ya da `isColorful` ile addan deterministik), `hasRing` 2 px halka (`ringColor`), `status` (online · away · busy · offline) sağ altta nokta, köşe rozeti `badgeValue` (99+) ya da MOBİLE ÖZGÜ `badgeIcon` (glif, ör. `photo_camera` — profil fotoğrafı düzenleme rozeti; doluysa metne üstündür, renk `badgeColor`). `click` bağlıysa avatar düğmedir. Grup boşsa `emptyText`.',
|
|
337
|
-
"`src` (ve grup kipinde öğelerin görseli) `image` ile aynı çözümden geçer: kayıttaki FILE alanını nesne olarak verin (`{{ item.foto }}`) ya da `.absolute_path` yazın; `.value` dosya kimliğidir, görsel yerine baş harfler çizilir (MOB-011)."
|
|
338
|
-
]
|
|
339
|
-
},
|
|
340
|
-
progress: {
|
|
341
|
-
summary: 'İlerleme göstergesi: çubuk, halka ya da parçalı çubuk; eşiklere göre renk değiştirir.',
|
|
342
|
-
differences: [
|
|
343
|
-
'`variant: bar | circle | segmented`. `circle` halkadır (ana sayfa "3/5 görev" özeti): çap `size`dan, çizgi `thickness` (px); ortada değer (`labelFormat: fraction` → "3 / 5") ve MOBİLE ÖZGÜ `circleCaption` alt satırı. `segmented` MOBİLE ÖZGÜ: `segments` (2–10) parçadan `floor(yüzde × parça)` kadarı dolu, aralık `segmentGap` — sihirbaz adımları, parola gücü.',
|
|
344
|
-
'Renk: eşik listesi (`thresholds`) web kuralıyla — yüzdeyi geçmeyen EN YÜKSEK eşik kazanır, liste sırası değil; liste boşsa gizli `colorMap`. `color: custom` + `customColor` ham renk, `trackColor`/`customTrackColor` iz, `thickness` çubuk/parça boyu. Parçalı çubukta dolu parçalar da eşik rengini alır (parola gücü: kırmızı → sarı → yeşil).',
|
|
345
|
-
'Olaylar web ile aynı: `click` bağlıysa gösterge düğmedir; `complete` değer en üste İLK ulaşınca bir kez (düşüp yeniden ulaşınca yine bir kez).',
|
|
346
|
-
'`isIndeterminate` (f-19): çubukta %40`lık dilim 1.2 sn`de kayar, halkada çeyrek yay döner; yüzde yazılmaz, `complete` yayılmaz, parçalı kip çubuk çizilir. `isStriped`: dolgunun üstünde eğik şerit kayar. İkisi de kanvasta ve "hareketi azalt"ta durur (dilim solda, şerit sabit).',
|
|
347
|
-
'Kutu satırın tamamını kaplar (`width: 12`).'
|
|
348
|
-
],
|
|
349
|
-
propNotes: {
|
|
350
|
-
variant: '`bar` (varsayılan) · `circle` · `segmented` (mobile).',
|
|
351
|
-
segments: 'Parçalı çubukta parça sayısı (2–10, varsayılan 5).',
|
|
352
|
-
circleCaption: 'Halkada değerin altındaki satır ("görev").'
|
|
353
|
-
}
|
|
354
|
-
},
|
|
355
|
-
radio: {
|
|
356
|
-
summary: 'Tek seçimli seçenek listesi.',
|
|
357
|
-
differences: [
|
|
358
|
-
'`autofocus` DÜŞÜRÜLDÜ: mobilde odak kavramı yoktur.',
|
|
359
|
-
'Dizilim mobile özgü alanlarla: `columns` 2–5 ızgaradır (üç ve daha çok sütunda kart karo olur: görsel/ikon üstte, gösterge yok, seçim kenardan okunur), yoksa `direction: horizontal` sarar, varsayılan alt alta.',
|
|
360
|
-
'`variant: card` kenarlıklı karo (seçili kenar vurgu rengi). Seçenek alanları (mobil): `caption` ikinci satır, `icon`, `image` (76 px küçük resim), `isDisabled`. Seçim seçeneği ÖZGÜN tipinde yayar (`34` sayı kalır).',
|
|
361
|
-
'Seçeneğin iç rol kimliği `<elementId>__option-<değer>` (runtime\'da `data-element-id`) — `page_screenshot` `click` seçeneğe onunla basar.'
|
|
362
|
-
]
|
|
363
|
-
},
|
|
364
|
-
checkboxgroup: {
|
|
365
|
-
summary: 'Seçili değerleri bir liste oluşturan onay kutusu grubu.',
|
|
366
|
-
differences: [
|
|
367
|
-
'`autofocus` ve `columnCount` DÜŞÜRÜLDÜ: çok sütun telefon genişliğinde dokunma hedefini bozar; yerine `direction: horizontal` sarmalı kullanılır.',
|
|
368
|
-
'Kutu satırın tamamını kaplar (`width: 12`).',
|
|
369
|
-
'`variant: card`, `options[].caption`/`icon`, `gap`, `align` ve `isViewmode` web gibi çizilir (radyonun kart parçası ortak). Seçim seçenekleri ÖZGÜN tipinde yayar.',
|
|
370
|
-
'İç roller `<elementId>__option-<değer>` ve (`showSelectAll` açıkken) `<elementId>__select-all` — `page_screenshot` `click` onlarla basar.',
|
|
371
|
-
'Düşenler: `focus`/`blur` olayları (grubun klavye odağı yok, tek sinyal değer değişimidir).'
|
|
372
|
-
]
|
|
373
|
-
},
|
|
374
|
-
'choice-chips': {
|
|
375
|
-
summary: 'Dokunma için boyutlandırılmış, satır sarmalı seçilebilir çip dizisi. Web`de karşılığı YOKTUR.',
|
|
376
|
-
differences: [
|
|
377
|
-
'Mobile özgü şema: web`de bu işi `checkboxgroup`/`radio` görür; dokunmatikte çip dizisi daha az yer kaplar.',
|
|
378
|
-
'`multiple` açıkken `value` DİZİDİR (akış dizi yazar ve okur); panelde virgüllü metin (`"a, b"`) yazılabilir, okunurken diziye açılır. Kapalıyken tek değer. Seçim seçeneği ÖZGÜN tipinde yayar (`34` sayı kalır).',
|
|
379
|
-
'`variant: segmented` aynı seçenekleri hap şeritte çizer (ml | L, İç / Dış); `chips` (varsayılan) çip dizisidir. `scrollable` çipleri tek satırda yatay kaydırır (göstergesiz), kapalıyken sarar. Seçili çipte ✓ (`showCheck`, varsayılan açık). `kind: neutral` seçili çipi ön plan renginde doldurur (koyu filtre şeridi).',
|
|
380
|
-
'Seçenek alanları: `icon` (isteğe bağlı, verilmezse çizilmez), `badge` (sayaç; `99+` sınırlı, `0` çizilmez) + `badgeKind`, `isDisabled` (soluk, seçilemez).',
|
|
381
|
-
'Çipin iç rol kimliği `<elementId>__chip-<değer>` — `page_screenshot` `click` çipe onunla basar.'
|
|
382
|
-
]
|
|
383
|
-
},
|
|
384
|
-
'collapsible-container': {
|
|
385
|
-
summary: 'Başlığa dokununca açılıp kapanan kap; çocuklar gövdeye iner.',
|
|
386
|
-
differences: [
|
|
387
|
-
'Bırakılabilir bir KAPTIR (`isDroppable`), gövdesi çocuklardır.',
|
|
388
|
-
'Gövde 220 ms`de açılıp kapanır (yükseklik ölçülen içeriğin oranı; alttaki kardeşler kayarak iner), ok 180° döner — ok yalnız `openButtonIcon`/`closeButtonIcon` yazılmamışsa döner, yazılmışlar yer değiştirir. `description` başlığın altında soluk ikinci satırdır (web). Kanvasta ve "hareketi azalt"ta anında.',
|
|
389
|
-
'Başlığa basmak web ile AYNI olayı yayar (`expanded`/`collapsed { isOpen }`); makine `isOpen`\'ı yazar ve gövde açılıp kapanır. Tetikleyicinin iç rol kimliği `<elementId>__trigger` — `page_screenshot` `click` onunla basar.',
|
|
390
|
-
'Düşenler: `openButtonVariant`, `closeButtonVariant` (mobil başlığın tamamı dokunulur ve ok çizer, ayrı aç/kapat düğmesi yok).'
|
|
391
|
-
]
|
|
392
|
-
},
|
|
393
|
-
slider: {
|
|
394
|
-
summary: 'En küçük ve en büyük değer arasında sayısal kaydırıcı.',
|
|
395
|
-
differences: [
|
|
396
|
-
'`marks`, `showTicks` ve `autofocus` DÜŞÜRÜLDÜ.',
|
|
397
|
-
'Jest `PanResponder` ile çözülür ve YALNIZ YATAY sürüklemeyi yakalar: dokunuşu başlangıçta yakalasaydı sayfa kaydırması değeri değiştirirdi (ölçüldü — kaydırma 40`ı 100 yapıyordu).',
|
|
398
|
-
'Sürüklerken `change`, parmak kalkınca `changed` yayılır; akış genelde `changed`e bağlanır. İze dokunuş değeri o noktaya getirir (`change` + `changed`). Jest `modal`/çekmece içinde de çalışır.',
|
|
399
|
-
'Düşenler: `focus`/`blur` olayları (sürgünün klavye odağı yok; sürükleme ve bırakma olayları yeter).',
|
|
400
|
-
'`color`/`customColor` dolguyu ve başın kenarını boyar (web `--slider-color`).'
|
|
401
|
-
]
|
|
402
|
-
},
|
|
403
|
-
tabs: {
|
|
404
|
-
summary: 'Başlıkların altında içerik gösteren sekme kabı.',
|
|
405
|
-
differences: [
|
|
406
|
-
'İçerik modeli web ile AYNI: her sekmenin gövdesi SIRADAKİ çocuk düğümdür — etkin sekmenin (`selected` anahtarı) `tabs` dizisindeki sırası hangi çocuğun çizileceğini seçer; gizli/pasif sekme sırayı kaydırmaz.',
|
|
407
|
-
'Basılan sekme web ile AYNI olayı yayar (`tab { selected }`); makine `selected`\'ı yazar ve gövde değişir. Sekmenin iç rol kimliği `<elementId>__tab-<anahtar>` (runtime\'da `data-element-id`) — `page_screenshot` `tab` onu anahtarla bulur.',
|
|
408
|
-
'Sekme başlıkları taşarsa yatay kaydırılır; telefonda sarmalanmaz.',
|
|
409
|
-
'`variant` web gibi çizilir: `default` alt çizgi, `container` (varsayılan) kutulu şerit + çerçeveli gövde; mobile özgü `segmented` hap şerittir (Bugün / Yaklaşan / Geciken). `headerAlign` sola/ortaya/sağa yaslar, `stretch` sekmeleri eşit yayar.',
|
|
410
|
-
'Sekme sayaç rozeti taşır (`tabs[].badge` + `badgeKind`; `99+` sınırlı, `0` çizilmez) — "Geciken 3" için rozeti akışın sayısına bağla.'
|
|
411
|
-
]
|
|
412
|
-
},
|
|
413
|
-
tooltip: {
|
|
414
|
-
summary: 'DOKUNUŞLA açılan ipucu balonu; çocuklar tetikleyicidir. Web`de karşılığı YOKTUR.',
|
|
415
|
-
differences: [
|
|
416
|
-
'Web`de ipucu hover ile açılır; dokunmatikte hover yoktur (MOB-002), bu yüzden jest DOKUNUŞTUR — ikinci dokunuş kapatır, dışarı dokunmak da kapatır.',
|
|
417
|
-
'Bırakılabilir bir KAPTIR: tetikleyici çocuklarıdır, yani her şeye (düğme, ikon, kart) ipucu takılabilir.',
|
|
418
|
-
'Saydam sarmalayıcıdır: boşluk tipi yazılmamışsa dış ve iç boşluk `none` sayılır (2026-09-29, `FLUSH_SPACING_TYPES`), içerik kardeşleriyle aynı kenarda başlar. Önceden varsayılan 4 + 10 içeriği 14 dp içeri itiyordu; gateway yeni tooltip\'e yine `paddingType: none` + `widthType: fill` yazar (eski derlemeler için). platform_guide(\'mobile-layout\').',
|
|
419
|
-
'TASARIM KİPİNDE BALON ÇİZİLMEZ: kanvasta açık balon ölçümü ve seçim kutusunu kaydırırdı. Tasarımcı metni panelden düzenler.',
|
|
420
|
-
'Balon sayfa ağacının DIŞINA, barındırıcının katmanına çizilir (`modal`/`drawer` ile aynı çerçeve) — kaydırma kabı ya da kırpan kap onu kesmesin diye.'
|
|
421
|
-
],
|
|
422
|
-
propNotes: {
|
|
423
|
-
side: 'Balonun tetikleyiciye göre yanı. Seçilen yan ekrana sığmazsa balon ÇEVRİLMEZ, yalnız ekran içine kaydırılır.'
|
|
424
|
-
}
|
|
425
|
-
},
|
|
426
|
-
markdown: {
|
|
427
|
-
summary: 'Markdown metnini çizer: başlık, paragraf, liste, bağlantı, kod, alıntı, ayraç, tablo, görsel. Web`de karşılığı YOKTUR — web `html` ayrı bileşendir ve HTML çalıştırır.',
|
|
428
|
-
differences: [
|
|
429
|
-
'Metin `marked` ile ayrıştırılır ve bileşenin kendi ilkelleriyle çizilir: HTML üretilmez, hiçbir şey çalıştırılmaz. Satır içi HTML etiketi düşer (içindeki metin kalır), blok HTML etiketsiz metne iner; `&` gibi varlıklar çözülür — kod aralığında çözülmez, orada ham metindir.',
|
|
430
|
-
'HTML gibi: yumuşak satır sonu boşluktur ve ardışık boşluklar teke iner, yalnız sert kırılma (satır sonunda iki boşluk) satır kırar. GFM görev maddesi (`- [ ]`, `- [x]`) nokta yerine ☐/☑ çizilir (sıralı listede numaranın yanında); sıralı liste yazıldığı sayıdan başlar (`0.` dahil).',
|
|
431
|
-
'Başlık puntoları `text` bileşeninin tip ölçeğinden (`h1`–`h4`; 5 ve 6 `h4` puntosunda), renkler token sınıflarından: kod `--muted` zemin, bağlantı `--primary`, alıntı ve tablo `--border` çizgi. Düğümün `typographyStyle`ı her metne iner; puntosu ve satır yüksekliği GÖVDE metnindir, başlık kendi puntosunu korur.',
|
|
432
|
-
'Görsel yalnız tek başına bir paragrafta ve http(s) adresiyle çizilir (tam genişlik, 180 dp yükseklik, `contain`); satır içindeki görsel alt metnine iner.',
|
|
433
|
-
'Bağlantıya dokunuş `linkClick { href }` yayar (ham adres); `linkOpensExternal` açıkken (varsayılan) yalnız http(s), mailto ve tel adresi sistem tarayıcısında açılır — `javascript:` ya da göreli adres açılmaz ama olay yine gelir, gezinmeye akış karar verir. Tasarım kipinde bağlantı basılamaz; boş içerik tasarımda yer tutucu, runtime`da hiçbir şey çizer.'
|
|
434
|
-
],
|
|
435
|
-
propNotes: {
|
|
436
|
-
content: "Markdown metni (CommonMark + GFM tablo ve üstü çizili); bağlanabilir: `{ type: 'code', ref: '{{ ... }}' }`.",
|
|
437
|
-
linkOpensExternal: 'false iken bağlantı yalnız `linkClick` yayar, hiçbir şey açmaz — gezinmeyi akış yapar (ör. `redirect`).'
|
|
438
|
-
}
|
|
439
|
-
},
|
|
440
|
-
calendar: {
|
|
441
|
-
summary: 'Satır içi ay takvimi: tek gün ya da aralık seçer. Web`de katalog bileşeni DEĞİLDİR (web `calendar` yalnız `datepicker`ın açılır ızgarası); ızgara kuralı onunla aynı modülden.',
|
|
442
|
-
differences: [
|
|
443
|
-
'Prop adları web `datepicker`ınkiler (`value`, `minDate`, `maxDate`, `locale`) ve `change` yükü onun biçimidir (`yyyy-MM-ddT00:00:00`, yerel duvar saati, dilim eki yok) — iki bileşen akışlarda birbirinin yerine geçer. Gelen değer web `datepicker`ın `toDate` kuralıyla okunur: yalın `yyyy-MM-dd` yerel gündür; dilim taşıyan metin (`…Z`, `+00:00` — platform statik tarih değerini UTC`ye çevirip kaydeder) yerel güne çevrilir; sayı zaman damgası da okunur.',
|
|
444
|
-
'Izgara altı haftadır (42 gün); hafta Türkçede Pazartesi, İngilizcede Pazar başlar. `locale` boşsa uygulamanın dili; Türkçe olmayan dil İngilizceye, bilinmeyen dil Türkçeye düşer.',
|
|
445
|
-
'İç roller: `<elementId>__prev` ve `<elementId>__next` (ay), `<elementId>__day-yyyy-MM-dd` (gün) — `page_screenshot` `click` onlarla basar. Ay dışındaki güne basış o aya da geçer.',
|
|
446
|
-
'Salt okunurken aylar gezilir ama gün seçilmez; pasifken ikisi de kapalı. Değer akıştan başka bir aya yazılınca takvim o aya döner. Tasarım kipinde statik ay çizilir, basılamaz.'
|
|
447
|
-
],
|
|
448
|
-
propNotes: {
|
|
449
|
-
mode: "`single` (varsayılan) ya da `range`. Aralıkta ilk basış başlangıç (`value`), ikinci basış bitiş (`endValue`); başlangıçtan önceki gün ya da tamamlanmış aralığa basış yeni aralık başlatır. `change` iki alanı birlikte yazar.",
|
|
450
|
-
endValue: "Aralığın bitişi; yalnız `mode: 'range'` iken okunur ve panelde görünür.",
|
|
451
|
-
minDate: 'Sınırdan önceki günler soluk ve basılamaz, sınırın kendisi seçilebilir; `maxDate` simetrik.',
|
|
452
|
-
markedDates: "İşaretli günler: `[{ date: 'yyyy-MM-dd' }]` (düz tarih metni dizisi de okunur) — günün altında nokta; seçili günde nokta zıt renktedir."
|
|
453
|
-
}
|
|
454
|
-
},
|
|
455
|
-
otpinput: {
|
|
456
|
-
summary: 'Tek kullanımlık kod kutuları; kurallar web ile AYNI modülden (`otp-logic`): temizleme, tamamlanma, ayraç, yeniden gönder sayacı.',
|
|
457
|
-
differences: [
|
|
458
|
-
'Web her kutuyu ayrı alan yapar; mobilde yazıyı kutuların üstündeki TEK görünmez alan alır (`<elementId>__input`): yapıştırma, SMS`ten otomatik doldurma (`oneTimeCode`) ve silme klavyenin kendi davranışıdır, kutular yalnız gösterir. Alan uzunluk sınırı taşımaz — ayraçlı yapıştırma (`123-456`) temizlenip kutu sayısına kesilir, rakam kaybolmaz — ve imleç hep sondadır. `page_screenshot` `set` o alana yazar.',
|
|
459
|
-
'`change` ve `complete` web gibi yalnız GERÇEK değişimde yayılır (`complete` kodu dolduran değişimle birlikte); kabul edilmeyen karakter ve fazlası düşer.',
|
|
460
|
-
'Kilitler web ile aynı: pasif, salt okunur, görünüm ve yükleniyor kipleri yazmayı kapatır; görünüm kipinde kutular düz metne iner ve yeniden gönder çizilmez. Sayaç bağlanınca başlar, `<elementId>__resend` basınca `resend` yayar ve yeniden başlar; tasarım kipinde sayaç koşmaz.',
|
|
461
|
-
'`style` düşer (ham CSS); kutu ölçüsü form yüksekliği, punto form puntosunun 1,2 katı, boşluk puntoya oranlı (web `--otp-gap`).'
|
|
462
|
-
]
|
|
463
|
-
},
|
|
464
|
-
qrcode: {
|
|
465
|
-
summary: 'QR kodu: `data` kodlanır, `quietZone` sessiz bölgedir (modül birimi, varsayılan 1).',
|
|
466
|
-
differences: [
|
|
467
|
-
'Matris `toqr` ile üretilir ve düz görünümlerle çizilir (`react-native-svg` yok); hata düzeltme `M` sabittir ve web\'in `errorCorrectionLevel` prop\'u mobil şemadan düşer; renk web gibi siyah üstüne beyaz — koyu temada da (okuyucular ters kodu her zaman okumaz).',
|
|
468
|
-
'Kare kutunun kenarı: genişliği belli düğümde (`widthType: fill` ya da `fixed`) düğümün genişliği, içerik genişliğinde (`auto` ya da `widthType` hiç yazılmamış) 200 dp; genişlik ölçülemezse de (kanvasta satır kabındaki `fill`) 200 dp — cihaz o düğümü tam genişlik çizer. Sabit px boy kenarı sınırlar. Modül ölçüsü tam sayıya iner, artan birkaç piksel ortalanır. Belirli boy için `appearance.widthType: fixed` + `widthString`.',
|
|
469
|
-
'Veri boşsa ya da QR`a sığmıyorsa (yaklaşık 2,3 KB üstü) yer tutucu çizilir. `quietZone` web ile aynı `common` grubundadır (eski adı `padding` ortak çizim katmanının CSS boşluğuyla çakışıyordu, CQ-272).',
|
|
470
|
-
"`click` bir akışa bağlıysa kod runtime'da basılır (web gibi); bağlı değilse dokunuşu yutmaz. QR'a sığmayan veri `error { errorText }`ü makine başına bir kez yayar (satırdaki seçim değişimi yeniden yaydırmaz)."
|
|
471
|
-
],
|
|
472
|
-
propNotes: {
|
|
473
|
-
quietZone: 'Sessiz bölge, MODÜL birimiyle (piksel değil); varsayılan 1, panel aralığı web şemasıyla aynı 1–10 (çizer 16\'ya kadar kabul eder). Okuyucular için 2–4 önerilir.'
|
|
474
|
-
}
|
|
475
|
-
},
|
|
476
|
-
stack: {
|
|
477
|
-
summary: 'Çocuklarını üst üste bindiren kap (FlutterFlow Stack). Web`de karşılığı YOKTUR.',
|
|
478
|
-
differences: [
|
|
479
|
-
'İLK çocuk taban katmandır: akışta durur ve yığının boyunu verir. Sonraki her çocuk onun ÜSTÜNE biner; dizi sırası çizim sırasıdır (sonraki üstte).',
|
|
480
|
-
'Üst katmanlar yığının `alignment`ıyla (9 nokta) hizalanır; kaydırmayı çocuğun kendi kenar boşluğu verir (ör. `bottom-right` + sağ/alt margin 8). Hizalama ÇOCUKTA değil yığındadır — `appearance.stackAlign` diye bir alan YOKTUR.',
|
|
481
|
-
'Farklı köşelerde katman için çocuk kap iki eksende `fill` olur (yığını kaplar) ve içeriğini kendi `horizontalAlign`/`verticalAlign`ı ile yerleştirir.',
|
|
482
|
-
'Katmanın boş alanı dokunuşu alttaki katmana geçirir. Çocuklar `blocks` taşımaz (MOB-001 aynen geçerli).',
|
|
483
|
-
'Bindirme tarifleri (ölçüldü f-08, oyun alanı `bindirme`): sağlık rozeti = `alignment: top-right` + oranlı görsel taban + rozet (margin 8); görsel üstü düğmeler ve alttaki hap = iki `fill`×`fill` kap katmanı (biri `verticalAlign: top` + satır `space-between`, öbürü `bottom`/`right`); açıklama bandı = `bottom-left` + yarı saydam zeminli `fill` genişlikte kap; arka plan görseli = `fit: fill` sabit boylu görsel taban + ortalanmış içerik. Taban oranlı görselse (`aspectRatio`) yığının boyu doğru çıkar.'
|
|
484
|
-
],
|
|
485
|
-
propNotes: {
|
|
486
|
-
alignment: "Üst katmanların yeri: `top-left` (varsayılan) · `top-center` · `top-right` · `center-left` · `center` · `center-right` · `bottom-left` · `bottom-center` · `bottom-right`. Yığının boyu kutudan geliyorsa (`fixed`, `fill`, oran) taban da bu noktaya hizalanır."
|
|
487
|
-
}
|
|
488
|
-
},
|
|
489
|
-
'list-item': {
|
|
490
|
-
summary: 'Liste satırı (FlutterFlow ListTile): baş ikon ya da görsel · başlık · alt başlık · son metin ve ikon; basılabilir. Web`de karşılığı YOKTUR.',
|
|
491
|
-
differences: [
|
|
492
|
-
'Satıra dokunuş `click` yayar (yük yok). Pasifken soluk ve basılamaz; tasarım kipinde basış kanvasın seçim jestidir.',
|
|
493
|
-
'Baş tarafta `leadingImage` `leadingIcon`dan önce gelir (40 dp yuvarlak görsel; yüklenmezse başlığın baş harfleri). Boş ikon çizilmez.',
|
|
494
|
-
"`leadingImage` `image` ile aynı çözümden geçer: kayıttaki FILE alanını nesne olarak verin (`{{ item.foto }}`) ya da `.absolute_path` yazın; `.value` dosya kimliğidir (GUID), görsel çizilmez (MOB-011).",
|
|
495
|
-
'Ölçüler Material liste satırı: tek satır 56, alt başlıklı 72; `dense` 48 / 60. Renkler token sınıflarından (başlık `--foreground`, alt başlık ve son taraf `--muted-foreground`, basılıyken `--accent`).',
|
|
496
|
-
'Son tarafta anahtar YOKTUR: anahtarlı satır `container` (satır) + `text` + `switch` ile kurulur. Tekrarlayıcı içinde satır olarak kullanılır — `repeater` satırının akışı tıklanan satırı `<tekrarlayıcı>.selectedItem` ile okur.'
|
|
497
|
-
]
|
|
498
|
-
},
|
|
499
|
-
carousel: {
|
|
500
|
-
summary: 'Parmakla kaydırılan sayfalar (FlutterFlow Carousel ve PageView): çocuk sayfalar ya da web gibi `items` görselleri.',
|
|
501
|
-
differences: [
|
|
502
|
-
'Prop adları ve olaylar web kaydırıcısınınki: `activeIndex` etkin sayfadır, kaydırma/oklar/noktalar/otomatik oynatma yalnız `slideChange { activeIndex }` yayar ve şerit prop değişince kayar (web gibi denetimli).',
|
|
503
|
-
'Mobilde bırakılabilir: çocuğu varsa her ÇOCUK bir sayfadır ve `items` okunmaz (`tabs` gövde modeli); çocuksuz kaydırıcı `items` görsellerini çizer. Kanvasta yalnız `activeIndex` sayfası çizilir — sayfa seçici paneldeki bu alandır.',
|
|
504
|
-
'Görsel sayfaya dokunuş web gibi yalnız bağlantısı ya da akışı olan sayfada `slideClick { currentItem, index }` yayar; dış adres (http(s), mailto, tel, alan adı) sistem tarayıcısında açılır, uygulama içi yol (`/sayfa`) açılmaz — gezinmeyi `slideClick` akışı yapar.',
|
|
505
|
-
'Aktif nokta 24 dp`lik hapa uzar (genişlik 200 ms`de kayar); sayfa geçişi `transitionDuration` ms (web varsayılanı 260); `isDraggable: false` parmakla kaydırmayı kapatır, ok/nokta/otomatik geçiş kalır (f-19).',
|
|
506
|
-
'Düşenler: `style`, `pauseOnHover` (sürükleme oynatmayı zaten durdurur), `transition` (sayfalar kayar). Ek: `peek`. Oklar `<elementId>__prev`/`__next`, noktalar `<elementId>__dot-<n>` iç rolleri — `page_screenshot` `click` onlarla basar.',
|
|
507
|
-
'Boy kutudan gelmiyorsa görsel sayfa 16:9, çocuk sayfalar en uzununun boyunda. Genişlik belli değilse (Studio`dan bırakılan düğümün `widthType`ı yok) cihaz genişliği kullanılır; kaydırıcıya `widthType: fill` verin.',
|
|
508
|
-
'Düşenler: `slidesPerView`, `slidesToScroll`, `isCentered`, `autoWidth`, `orientation` (mobil kaydırıcı tek sayfa kaydırır, komşu sayfa `peek` ile görünür), `lazyLoad`, `lazyLoadEager` (RN görseli görünür olunca yükler).'
|
|
509
|
-
],
|
|
510
|
-
propNotes: {
|
|
511
|
-
peek: 'Komşu sayfaların kenardan görünen payı (dp); en çok genişliğin dörtte biri, sayfalar araya küçük boşluk alır. 0 (varsayılan) tam genişlik sayfa.'
|
|
512
|
-
}
|
|
513
|
-
},
|
|
514
|
-
fab: {
|
|
515
|
-
summary: 'Yüzen eylem düğmesi (FlutterFlow FloatingActionButton): ekranın alt köşesinde durur, sayfa kaydırılırken yerinde kalır. Web`de karşılığı YOKTUR.',
|
|
516
|
-
differences: [
|
|
517
|
-
'Sayfanın NERESİNE konursa konsun runtime`da barındırıcının ekran katmanına taşınır: kenardan 16 dp, sekme çubuğu varsa onun üstünde, yoksa ev göstergesinin üstünde. Düğümün kendi yeri akışta boş kalır — sayfa kök kabının sonuna koyun.',
|
|
518
|
-
'Dokunuş `click` yayar. `page_screenshot` düğmeyi `<elementId>__press` ile bulur (düğüm kabuğu runtime`da boştur).',
|
|
519
|
-
'Renk `kind`den, `button` ile aynı eşleme (dolu varyant); yuvarlak, kenarı `size`dan (`default` 56 · `large` 60 dp). `extended` açık ve `label` doluysa etiket ikonun yanında yazılır. Ekran okuyucu adı sırayla `ariaLabel` → `label` → ikonun adı.',
|
|
520
|
-
'Kanvasta yerinde, kesikli bir halka içinde çizilir ve basılamaz. Runtime`da 0.8`den büyüyerek ve solarak belirir (200 ms, f-19).'
|
|
521
|
-
],
|
|
522
|
-
propNotes: {
|
|
523
|
-
position: '`bottom-right` (varsayılan) · `bottom-center` · `bottom-left`.',
|
|
524
|
-
icon: 'Material Symbols adı; boşsa `add`.'
|
|
525
|
-
}
|
|
526
|
-
},
|
|
527
|
-
eventcalendar: {
|
|
528
|
-
summary: 'Etkinlik takvimi (web ikizi): satırları ay ızgarasında renkli nokta, hafta şeridinde gün ve gün çizelgesinde saat bloğu olarak çizer.',
|
|
529
|
-
differences: [
|
|
530
|
-
'Alan adları web ile AYNI: `rows` + eşleme alanları (`titleField`, `startField`, `endField`, `colorField`, `idField`, `allDayField`); eşleme, gün süzme ve gün yerleşimi web modüllerinden gelir. Renk anlamsal ad (`primary`, `success`, `warning`, `error`) ya da ham renk. Varsayılan temada `info` bir renk değil nötr yüzeydir (#F8F8F8) — etkinlikte görünmez, kullanmayın.',
|
|
531
|
-
'`defaultView: month | week | day`. Ay: günde en çok `maxVisibleEvents` (varsayılan 3) nokta, fazlası `+`; seçili gün dolgulu, altında `dayCountLabel` sayacı (`{n} görev`); geçmiş günler `pastDimmed` ile soluk. Hafta: 7 günlük şerit, yatay kaydırma haftayı değiştirir. Gün: `startHour`–`endHour` saat satırları, çakışan bloklar yan yana, süresiz satır 30 dk, `doneField` doluysa blok soluk, bugünde "şimdi" çizgisi.',
|
|
532
|
-
'MOBİLE ÖZGÜ: `pastDimmed`, `showTodayButton`, `legend` (açık `{label, color}` listesi — satırlardan türetilmez), `dayCountLabel`, `doneField`.',
|
|
533
|
-
'Olaylar web sözleşmesiyle, yük `event.data`da (düğüme yazılmaz): `dateClick { date, rows }` (mobilde günün satırları da gelir — seçili günün görevlerini alttaki `repeater`a setter ile `event.data.rows` yazın), `eventClick { id, title, row }` (gün çizelgesinde), `monthChange { month, year, view, start, end }` (oklar, kaydırma ve Bugün — her görünümde), `viewChange { view, start, end }`.',
|
|
534
|
-
'Düşenler: `isEditable`/`isCreatable` ve `eventMove`/`eventCreate` (sürükleme jesti), `agendaDays` (liste görünümü `grouped-list` ile), `isLoading`.'
|
|
535
|
-
],
|
|
536
|
-
propNotes: {
|
|
537
|
-
rows: 'Etkinlik satırları; genelde sorguya kod bağıyla: `{ type: \'code\', ref: \'{{ q_gorevler.data }}\' }`.',
|
|
538
|
-
defaultDate: '`yyyy-MM-dd`; açılışta seçili gün ve görünen dönem.',
|
|
539
|
-
legend: 'Renk açıklaması: `[{ label: \'Sulama\', color: \'primary\' }]`.',
|
|
540
|
-
dayCountLabel: 'Seçili günün sayaç kalıbı, `{n}` sayıdır. Boşsa uygulama dilinde "{n} etkinlik".'
|
|
541
|
-
}
|
|
542
|
-
},
|
|
543
|
-
'grouped-list': {
|
|
544
|
-
summary: 'Gruplu liste (FlutterFlow GroupedListView): düz `rows`u `groupBy` alanına göre bölümlere ayırır, her bölümü bir başlık ve öğeleriyle çizer. İç içe repeater (PAGE-013) yerine gün/kategori başlıklı liste budur. Web`de karşılığı YOKTUR.',
|
|
545
|
-
differences: [
|
|
546
|
-
'Çocuklar KONUMSAL şablondur: çocuk 0 bölüm başlığı, çocuk 1 öğe şablonu; fazlası çizilmez. Tasarım kanvasında iki şablon bir kez, alt alta çizilir.',
|
|
547
|
-
'Öğe repeater satırıyla AYNI params`ı alır (`index` = `rows` içindeki DÜZ indeks, `row`, `repeaterId`): bağlı prop`larda `Row`, `RowIndex`, `{{ item.<alan> }}` iki yönlü bağ; akışta tıklanan satır `<liste>.selectedItem`; satır kapsamlı yazım (`_repeaterValues`) repeater`daki gibi.',
|
|
548
|
-
'Başlık ifadelerde `Section` okur: `{ key, title, count, items }` — ör. `{{ Section.title }} · {{ Section.count }}`. Başlık satır kapsamı TAŞIMAZ (salt okunur, `Row`/`item` boş). `Section` ayrılmış addır: aynı adlı komponent ifade bağlamından süzülür.',
|
|
549
|
-
'Gruplama: tarih/saat değeri cihazın yerel gününe (`YYYY-AA-GG`) indirgenir, diğer değer metne; başlık = anahtar (biçimli başlık için `Section.key` ile ifade yazın). Alanı boş/eksik satırlar en sondaki `otherSectionTitle` bölümüne düşer.',
|
|
550
|
-
'Yapışkan başlık (`stickySectionHeaders`) yalnız boyu kabuktan gelen listede çalışır ve cihazda/önizlemede SINIRLI boy ister: `appearance.heightType: fixed` + `heightString` verin. `auto`da liste düz akıştır; sayfanın kaydırıcısı içindeki `fill` içerik kadar uzar, iç kaydırıcı oluşmaz, başlık yapışmaz.',
|
|
551
|
-
'Öğe şablonu basılabilir bir bileşense (`list-item`, `button`) dokunuş onun `click`ine gider ve `itemPress` yayılmaz (repeater ile aynı); `itemPress` için şablonu basılamayan bir kap yapın ya da akışı `list-item.click`e bağlayın (satır seçimi yine olur).',
|
|
552
|
-
'Çoklu seçim `repeater` ile AYNI sözleşmedir: `selectionMode: multiple` (onay kutusu, dokunuş seçer, `itemPress` yayılmaz), `longPressSelects`, `selectionChange { selectedIndices, count }`, düğümde `selectedIndices`/`selectedItems` — gruplu görev listesinde toplu Ertele/Tamamla.',
|
|
553
|
-
'v1`de yok: `columnCount`, sanallaştırma, başlıktan yazan akış. Studio`nun satır farkında yerleri (Bind modalı `Row` önerisi, setter satır hedefi) yalnız `repeater`ı tanır — `grouped-list` içinde `Row`/`item` ifadesini elle yazın.'
|
|
554
|
-
],
|
|
555
|
-
propNotes: {
|
|
556
|
-
rows: 'Düz satır dizisi (repeater `rows` ile aynı biçim); genellikle bir sorgu/microservice sonucuna kod bağıyla verilir: `{ type: \'code\', ref: \'{{ q_tasks.data }}\' }`.',
|
|
557
|
-
groupBy: 'Bölüm anahtarının alan yolu, noktalı olabilir (`dueDate`, `plant.room`). Boşsa tek bölüm.',
|
|
558
|
-
sectionOrder: '`asc` (varsayılan, sayısal farkında) · `desc` · `asis` (verideki ilk görülme sırası).',
|
|
559
|
-
otherSectionTitle: 'Alanı boş satırların bölüm başlığı; varsayılan `Other`.',
|
|
560
|
-
stickySectionHeaders: 'Başlıklar kaydırırken üstte kalır — yalnız `heightType: fixed` (ya da sınırlı boylu `fill`/oran) listede; başlık kabına kendi zeminini verin.',
|
|
561
|
-
itemPressable: 'Öğeye dokunulabilir yapar; dokunuş önce `change { selectedIndex }`, sonra `itemPress { index, row }` yayar.',
|
|
562
|
-
swipeActions: 'repeater ile aynı: `key` (zorunlu), `label`, `tone` (default · danger), `icon`; sola kaydırınca açılır, `swipe { key, index, row }` yayar.',
|
|
563
|
-
itemSpacing: 'Öğeler arası dikey boşluk (dp), varsayılan 0.',
|
|
564
|
-
selectionMode: 'repeater ile aynı: `single` · `multiple` · `none`.',
|
|
565
|
-
longPressSelects: 'Uzun basış çoklu seçim kipini açar.'
|
|
566
|
-
}
|
|
567
|
-
},
|
|
568
|
-
'floating-container': {
|
|
569
|
-
summary: 'Ekrana sabit kap: çocuklarını ekranın dokuz noktasından birine sabitler, sayfa kayarken yerinde kalır (FAB`dan fazlası: alt eylem çubuğu, üst şerit, köşe rozeti). Web`de karşılığı YOKTUR.',
|
|
570
|
-
differences: [
|
|
571
|
-
'Mobil şemalarda `style.position`/`zIndex` yoktur (MOB-002); ekrana sabit içerik bu kapla kurulur. Sayfanın NERESİNE konursa konsun runtime`da çocukları barındırıcının ekran katmanına taşınır; kapsayıcının (`scroll-view`, `card`) kırpmasından etkilenmez. Düğümün kendi yeri akışta boş kalır — sayfa kök kabının sonuna koyun.',
|
|
572
|
-
'Katmanın dibi sekme çubuğunun tepesidir (çubuk yoksa alt güvenli alan); üst çapa üst güvenli alandan ölçülür. `aboveTabBar` diye bir prop YOKTUR — kap sekme çubuğunun üstüne çıkamaz.',
|
|
573
|
-
'App-bar sayfa içeriğidir ve sayfayla kayar: üst çapalı kap app-bar`ın üstüne biner. App-bar`ı sabit (kaydırmayı alttaki `scroll-view` yapan) sayfada app-bar`ın altına `offsetY` ile inin (ör. 72).',
|
|
574
|
-
'Yüzey ve kenar boşluğu prop`u YOKTUR: zemin, köşe, gölge ve iç boşluğu İÇERİDEKİ kaba verin (ör. `container` + `surfaceStyle`). Çerçevenin boş alanı dokunuşu alttaki sayfaya geçirir.',
|
|
575
|
-
'Kanvasta yerinde, kesikli çerçeve içinde sütun olarak çizilir. Yalnız alt köşede tek bir yuvarlak düğme için hazır `fab` yeter; etiketli çubuk, birden çok düğme ya da üst/orta çapa için `floating-container`.'
|
|
576
|
-
],
|
|
577
|
-
propNotes: {
|
|
578
|
-
anchor: '9 nokta (`stack.alignment` sözlüğü): `top-left` · `top-center` · `top-right` · `center-left` · `center` · `center-right` · `bottom-left` · `bottom-center` · `bottom-right` (varsayılan).',
|
|
579
|
-
offsetX: 'Çapalı kenardan içeri yatay pay (dp), varsayılan 16; orta eksende +sağa. `fullWidth` açıkken yok sayılır ve panelde gizlenir.',
|
|
580
|
-
offsetY: 'Çapalı kenardan içeri dikey pay (dp), varsayılan 16; orta eksende +aşağı.',
|
|
581
|
-
fullWidth: 'Çerçeve yan güvenli alanlar arasında satırı kaplar — alt eylem çubuğu (`bottom-center`) ya da üst şerit (`top-center`) için.',
|
|
582
|
-
respectSafeArea: 'Varsayılan açık: çentik/ev göstergesi payı bırakılır. Kapatınca çerçeve ekran kenarına kadar iner.'
|
|
583
|
-
}
|
|
584
|
-
},
|
|
585
|
-
timer: {
|
|
586
|
-
summary: 'Geri sayım ya da kronometre (FlutterFlow Timer). Web`de karşılığı YOKTUR.',
|
|
587
|
-
differences: [
|
|
588
|
-
'Akış bileşenin yöntemini çağıramaz, yalnız prop yazar: başlat/duraklat `isRunning` (setter), sıfırlama `value` yazmaktır (geri sayımda ör. `duration`, kronometrede 0).',
|
|
589
|
-
'Çalışırken her saniye `tick { value }` yayar ve makine `value`yu yazar; geri sayım 0`a inince `finish { isRunning: false }` yayar. Sayaç duvar saatinden hesaplanır, aralık gecikse de kaymaz.',
|
|
590
|
-
'Gösterim `format`la (`mm:ss` saati dakikaya katar, `HH:mm:ss`, `ss`); punto `text` bileşeninin `h2` ölçeğinden, `typographyStyle` üstüne biner. Tasarım kipinde durur.'
|
|
591
|
-
],
|
|
592
|
-
propNotes: {
|
|
593
|
-
value: 'Gösterilen saniye; boşsa geri sayımda `duration`, kronometrede 0. Sayaç her tikte yazar — akışın yazdığı başka bir değer sayacı o değerden yeniden kurar.',
|
|
594
|
-
duration: 'Geri sayımın başlangıcı (saniye, varsayılan 60); yalnız `mode: countdown`da panelde görünür.'
|
|
595
|
-
}
|
|
596
|
-
},
|
|
597
|
-
rating: {
|
|
598
|
-
summary: 'Yıldızla puanlama; kurallar web ile AYNI modülden (`rating-logic`): yarım yıldız, aynı puana dokununca temizleme, puan metni.',
|
|
599
|
-
differences: [
|
|
600
|
-
'Yıldıza dokunuş `change { value }` yayar; `allowHalf` açıkken yıldızın SOL yarısı ayrı dokunma alanıdır ve yarım puan verir. İç roller: `<elementId>__star-<n>` (1`den; tam puan — yarım açıkken yıldızın sağ yarısı) ve `<elementId>__star-<n>-half` (sol yarı) — `page_screenshot` `click` onlarla basar.',
|
|
601
|
-
'Ekran okuyucuda yıldız şeridi TEK ayarlanabilir öğedir: değeri okunur, yukarı/aşağı kaydırma web`in ok tuşu adımıyla arttırır/azaltır (yarım açıkken 0,5). Pasif (`isDisabled`) soluk çizilir.',
|
|
602
|
-
'Cihazın ikon yazı tipi dolgusuzdur: varsayılan yıldız Unicode ★ ile iki hâlde de dolu çizilir, hâl RENKLE ayrışır (`inactiveColor` `default` kenar rengi, öteki tonlar soluk). Seçilen `icon` glif olarak kalır ve dolu/boş yalnız renkle ayrışır.',
|
|
603
|
-
'Düşenler: `style`, `autofocus` ve `focus`/`blur` olayları (yıldız şeridinin klavye odağı yok, tek sinyal değer değişimidir).'
|
|
604
|
-
]
|
|
605
|
-
},
|
|
606
|
-
'multi-select': {
|
|
607
|
-
summary: 'Çoklu seçim: alanda kaldırılabilir çipler, dokununca alttan açılan onay kutulu liste; değer ve olaylar web ile aynı.',
|
|
608
|
-
differences: [
|
|
609
|
-
'Değer `{ label, value }` DİZİSİDİR (düz değer ve `{ id, text }` de okunur); her dokunuş `change { value }` yayar, yük `id`/`text` ikizlerini taşır — web `multi-select.functions.ts`in kuralları mobilde ikizlendi.',
|
|
610
|
-
'Liste alttan açılır (`dropdown` emsali): gruplu listede (`optionType: grouped`) çocuklu satır `isSelectable` değilse başlıktır, gruplar hep açıktır (`isExpanded` okunmaz). Arama kutusu `search` olayına akış bağlıysa `search { searchText }` yayar ve listeyi akış yazar, değilse yerelde süzer. Liste açılınca `focus`, kapanınca (`Done` ya da perde) `blur`; arama doluyken kapanırsa ve `search` akışa bağlıysa web gibi `search { searchText: "" }` de yayılır (yeniden açılan liste eski sonuçla kalmasın).',
|
|
611
|
-
'Üst sınır web gibi formun `maxItems` doğrulamasıdır, seçim kesilmez. Alanda en çok üç çip, gerisi "+n". İç roller `__trigger`, `__clear`, `__done`; satırlar `role="option"` + `data-value`.',
|
|
612
|
-
'Yerel arama (akış bağlı değilken) `dropdown` gibi veri dilinin yereliyle ve işaretsiz katlanır: İngilizce uygulamada "in" "India"yı, "suk" "Sükkülent"i bulur (2026-09-29; öncesinde hep `tr-TR`).',
|
|
613
|
-
'Satırın görseli web `SelectItem` önceliğiyle: `prefixImage` > `prefixText` (zemini `color`) > `icon` (rengi `color`). Düşenler: `options[].tooltip`, `isExpanded` (gruplar hep açık, üzerine gelme yok).'
|
|
614
|
-
]
|
|
615
|
-
},
|
|
616
|
-
toast: {
|
|
617
|
-
summary: 'Geçici bildirim tetikleyicisi; tetikleme sözleşmesi web ile aynı (akış `isOpen`ı açar, bileşen bildirimi gösterip `isOpen`ı kapatır).',
|
|
618
|
-
differences: [
|
|
619
|
-
'Bildirim uygulamanın toast deposuna eklenir ve SAYFADAN BAĞIMSIZ yaşar: "Kaydedildi" gösterip `redirect` yapan akışta hedef sayfada görünmeye devam eder. Düğümün kendisi runtime`da hiçbir şey çizmez; kanvasta örnek balon yerinde çizilir.',
|
|
620
|
-
'Web`in dokuz `position`ı telefonda üçe iner: `top-*`/`top-full` üst, `center` orta, öteki hepsi (varsayılan `bottom-right`) alt; bildirim ekran genişliğindedir. Alttaki bildirim sekme çubuğunun üstünde durur.',
|
|
621
|
-
'Açık `modal`, çekmece ya da `dropdown`/`multi-select` listesi varken bildirim onun ÜSTÜNDE çizilir (modaldaki formun tipli uyarısı, çoklu seçimin her dokunuşunda koşan akışın uyarısı görünür); saydam `tooltip` balonunun altında sayfadaki yerinde kalır. Klavye açıkken alttaki bildirim klavyenin üstüne çıkar.',
|
|
622
|
-
'`duplicates` web kuralıyla (f-19): anahtar yazılmış `dedupeKey`, yoksa tür + başlık + içerik; `ignore` görünen ya da `delay`i dolmamış aynı bildirimi yığmaz, `count` görünen kartta ×N yazar ve süreyi baştan başlatır, `allow` yığar. Atılan ya da sayılan tetikleme `open` YAYMAZ (web). Şemanın varsayılanı `allow` yazılmamış sayılır (web `ToastTrigger` gibi; Studio onu düğüme yazar): o zaman `dedupeKey`li bildirim `ignore`, anahtarsız `allow`. `open` bildirim ekrana eklenince yayılır — `delay`li bildirimde gecikme dolunca. Bir konumda en çok üç bildirim, fazlası en eskisini kapatır. Süre web`in tür varsayılanı (bilgi/başarı 4 sn, uyarı 6, hata 8, yükleniyor kalıcı); EYLEMLİ bildirim en az 6 sn kalır. Kart 24 dp aşağıdan (üstteki yukarıdan) solarak girer (250 ms).',
|
|
623
|
-
'Olaylar web`inki: `open`, `close`, `click` (gövde), `actionClick { text, index }` (eylemin kendi akışıyla). Düşenler: `style`, `pauseOnHover`, `showCopyButton` (pano native modül ister), `allowHtml` (metin olduğu gibi), `priority`.',
|
|
624
|
-
'Akışın `alert` adımındaki tipli uyarılar (success/info/warning/error) cihazda da aynı depo üzerinden toast olur ve beklemez; düz uyarı onay bekleyen diyalogdur.'
|
|
625
|
-
]
|
|
626
|
-
},
|
|
627
|
-
video: {
|
|
628
|
-
summary: 'Video oynatıcı; prop ve olaylar web ikizininki (`src`, `poster`, `autoplay`, `loop`, `muted`, `controls`; `play`/`pause`/`ended`/`click`).',
|
|
629
|
-
differences: [
|
|
630
|
-
'Cihazda `expo-video` (denetimler platformun kendi oynatıcısı), Studio kanvası ve önizlemede HTML5 `<video>`. Kanvasta oynatılmaz ve dokunuş almaz — dokunuş seçim jestidir, denetimler yalnız görünür.',
|
|
631
|
-
'Kutu: boyu kabuktan gelen video (`heightType: fixed` + ölçülebilir `heightString`, ya da `fill`) kabuğu doldurur; genişliği belli video (`widthType: fill`, ya da `fixed` + `widthString`) boyunu orandan alır — panelin `appearance.aspectRatio`su, yoksa 16:9; genişliği belli değilse boy 200 dp. Studio`dan bırakılan video `heightType: fixed` alır ama ölçüsü yoktur: 16:9 için `widthType: fill` verin. Video kutuyu `cover` ile doldurur (web ikizi gibi).',
|
|
632
|
-
'`autoplay` yalnız oynatıcı kurulurken (sayfa açılışı, kaynak değişimi) uygulanır; tarayıcı sesli otomatik oynatmayı engelleyebilir (`muted` açın). `ended` `loop` açıkken yayılmaz. `click` yalnız `controls: false` iken yayılır — denetimler açıkken dokunuş oynatıcınındır.',
|
|
633
|
-
'Cihazda afiş yerel bir özellik değildir: `poster` ilk oynatmaya dek videonun üstünde çizilir ve denetimler açıkken ortasındaki oynat düğmesi oynatmayı başlatır. Düşen: `style`.',
|
|
634
|
-
'Cihazda sayfa odağı kaybedince (yığında arkaya düşünce, başka sekmeye geçince) video durur ve `pause` yayar; dönüşte kendiliğinden sürmez. Döngü sınırındaki ve ara belleğe almadaki kısa duruşlar `pause`/`play` yaymaz (web `<video loop>` gibi).'
|
|
635
|
-
]
|
|
636
|
-
},
|
|
637
|
-
audio: {
|
|
638
|
-
summary: 'Ses oynatıcı (FlutterFlow AudioPlayer): oynat/duraklat düğmesi, başlık, ilerleme izi ve süre. Web`de karşılığı YOKTUR.',
|
|
639
|
-
differences: [
|
|
640
|
-
'Cihazda `expo-audio`, kanvas ve önizlemede HTML5 `<audio>`; denetim iki yerde aynı çizimdir. Cihazda iOS`un sessiz anahtarına uymaz (müzik uygulamalarının davranışı).',
|
|
641
|
-
'Akış yöntem çağıramaz, prop yazar: çalma `isPlaying`dir — açılışta `true` otomatik oynatmadır, akış `true`/`false` yazarak başlatır ve durdurur, bitmiş ses baştan çalar. Kullanıcı denetimle başlatıp durdurunca `play`/`pause` `{ isPlaying }` yayar ve makine prop`u yazar; ses bitince önce `pause`, ardından `ended { isPlaying: false }` (`loop` açıkken `ended` yok). Tarayıcı sesli otomatik oynatmayı reddederse `pause { isPlaying: false }` yayılır.',
|
|
642
|
-
'İzde dokunulan yere atlanır. İç roller `<elementId>__toggle` (oynat/duraklat) ve `<elementId>__track` (iz) — `page_screenshot` `click` onlarla basar.',
|
|
643
|
-
'`showControls: false` bileşeni görünmez yapar ama ses çalar (arka plan sesi, akışla çalınan efekt); kanvasta kesikli yer tutucu çizilir. Tasarım kipinde çalmaz.',
|
|
644
|
-
'Ara belleğe alma (yavaş ağ, izde tamponlanmamış noktaya atlama) duruş sayılmaz, `pause` yaymaz. `ended` akışı aynı turda yeniden `isPlaying: true` yazarsa ses baştan çalar (akışla tekrar). Cihazda sayfa odağı kaybedince (yığında arkaya düşünce) ses durur ve `pause { isPlaying: false }` yayar; dönüşte kendiliğinden sürmez. Kaynak değişince yeni kaynak baştan yüklenir, `isPlaying` açıksa çalar.'
|
|
645
|
-
],
|
|
646
|
-
propNotes: {
|
|
647
|
-
src: 'Ses dosyasının adresi ya da platform dosyası (mp3, m4a, aac, wav). Canlı yayın adresinin süresi bilinmez: iz ilerlemez, süre 0:00 yazar.',
|
|
648
|
-
isPlaying: 'Çalıyor mu: akışın yazdığı `true` çalar, `false` durdurur. Kullanıcının denetimi ve bitiş bu prop`u geri yazar.',
|
|
649
|
-
title: 'Denetimin üstündeki başlık (tek satır); boşsa çizilmez.'
|
|
650
|
-
}
|
|
651
|
-
},
|
|
652
|
-
lottie: {
|
|
653
|
-
summary: 'Lottie animasyonu (FlutterFlow Lottie Animation): Lottie JSON ya da dotLottie (`.lottie`). Web`de karşılığı YOKTUR.',
|
|
654
|
-
differences: [
|
|
655
|
-
'Cihazda `lottie-react-native`, kanvas ve önizlemede `@lottiefiles/dotlottie-react`: çizici ve WASM`ı ayrı parçadır, yalnız `lottie` düğümü olan sayfada yüklenir ve WASM paketin kendisinden sunulur (CDN`e gidilmez). Kanvasta da oynar.',
|
|
656
|
-
'Akış prop yazar: `isPlaying: false` yerinde durdurur, `true` kaldığı yerden sürdürür. Döngüsüz (`loop: false`) animasyon bitince `finish { isPlaying: false }` yayar; akış yeniden `true` yazınca baştan oynar — `finish` akışının kendisi aynı turda `true` yazsa da (akışla tekrar). Tasarım kipinde açık kalan `isPlaying` bitişi tekrar ettirmez.',
|
|
657
|
-
'Kutu `video` ile aynı kuraldan, varsayılan oran olmadan: kabuktan gelen boy ya da (genişlik belliyken) panelin `aspectRatio`su, yoksa 150 dp; animasyon kutuya `contain` ile sığar. Dokunuş almaz, `click` olayı yoktur.'
|
|
658
|
-
],
|
|
659
|
-
propNotes: {
|
|
660
|
-
src: "Animasyonun adresi (`.json` Lottie, `.lottie` dotLottie — cihazda adreste `.lottie` GEÇMELİ, uzantısız dosya JSON sanılır), platform dosyası ya da JSON'un kendisi METİN olarak (yapıştırılan ya da ifadenin ürettiği metin, ör. `{{ JSON.stringify(...) }}`). NESNE olarak bağlanan animasyon kaynak DEĞİLDİR (runtime prop eşleyicisi iç içe düz nesneyi bozuyor) — yer tutucu çizilir. Katman dizisi (`layers`) taşımayan JSON da kaynak sayılmaz.",
|
|
661
|
-
speed: 'Oynatma hızı çarpanı (1 = normal); 0,1–10 aralığına kırpılır, geçersiz değer 1.'
|
|
662
|
-
}
|
|
663
|
-
},
|
|
664
|
-
signature: {
|
|
665
|
-
summary: 'İmza pedi; prop ve olaylar web ikizininki (`value` PNG data URL ya da ham SVG, `penColor`, `penWidth`, `outputFormat`, `clearText`; `change { value }`, `clear`).',
|
|
666
|
-
differences: [
|
|
667
|
-
'Cihazda mürekkep `react-native-svg`, jest `PanResponder`; kanvas ve önizlemede DOM `<svg>`. Her tamamlanan vuruşta değer web gibi `change { value }` ile yazılır: `self.value` de `event.data.value` da dolu gelir. PNG cihazda görünmez bir `Svg`nin anlık görüntüsüdür (ekran ölçeğinde), web`de `<canvas>`ın; ikisi aynı SVG belgesinin çizimidir ve kalem rengi boşsa ekranda tema metin rengi, değerde somut `#111111` olur.',
|
|
668
|
-
'Vuruş sürerken sayfanın ve `scroll-view`un kaydırması kilitlidir: dikey vuruş sayfayı sürüklemez (web`de pedin `touch-action: none`ı); parmak kalkınca sayfa normal kayar.',
|
|
669
|
-
'Temizle düğmesi (`<elementId>__clear`, `clearText`, boşsa "Clear") çizim ya da değer varken ve alan kilitsizken görünür; basınca önce `change { value: \'\' }`, sonra `clear`. Ped `<elementId>__pad`. Tasarım kipinde çizilmez, Temizle basılmaz.',
|
|
670
|
-
'Boyu kabuktan gelen düğümde (`heightType: fixed` ya da `fill`) ped kabuğu doldurur; yoksa taban yükseklik boya göre 72/96/128 dp. Kayıtlı `value` PNG ise görsel, SVG (ham işaretleme ya da `data:image/svg+xml`) ise vektör olarak çizilir; tanınmayan metin çizilmez. Düşen: `style`.',
|
|
671
|
-
'iOS`ta sistem jesti imzadan önce gelir: iOS 26`da yığına itilmiş sayfada pede SAĞA atılan vuruş sayfayı kapatır (iOS 26`nın içerikten geri kaydırması — platform davranışı, ölçüldü), `modal` sunumlu sayfada aşağı vuruş sayfayı kapatabilir (ölçülmedi). İmzayı sekme kökündeki ya da itilmemiş sayfaya koyun.'
|
|
672
|
-
]
|
|
673
|
-
},
|
|
674
|
-
webview: {
|
|
675
|
-
summary: 'Uygulama içinde web sayfası (`src`) ya da satır içi HTML (`html`) — FlutterFlow WebView. Web`in `iframe`inin mobil karşılığıdır; web`de bu slug YOKTUR.',
|
|
676
|
-
differences: [
|
|
677
|
-
'Cihazda `react-native-webview`; kanvas ve önizlemede web `iframe`inin korumalı alanıyla `<iframe>` (betik, form, açılır pencere; `allow-same-origin` yok — çerez ya da depolama isteyen site önizlemede eksik çalışabilir, cihazda tam). Kanvasta dokunuş almaz. Android`de görünüm kendi içeriğini sayfanın kaydırma kabı içinde de kaydırır.',
|
|
678
|
-
'Gezinme varsayılan KAPALI (güvenlik kararı): ilk yükleme ve yönlendirmeleri (ilk `load`a kadar), alt çerçeveler ve aynı belgedeki çapalar serbesttir; yüklemeden sonra başka belgeye giden gezinme `navigate { url }` yayar ve ENGELLENİR. Adres sistemde (http(s) tarayıcıda, `mailto:`/`tel:`/`sms:` ilgili uygulamada) YALNIZ kullanıcının dokunduğu bağlantıda açılır — betiğin gezinmesi (`location`, zamanlayıcı, programla tıklama) ve form gönderimi yalnız olay yayar, uygulama şemaları (ör. `whatsapp://`) hiç açılmaz. `allowNavigation: true` gezinmeyi görünümün içinde yapar, `navigate` yine yayılır. Yeni pencere (`target="_blank"`, `window.open`) görünümde açılmaz: `navigate` yayılır, kullanıcının dokunduğu bağlantıysa (izin açıkken de) sistemde açılır.',
|
|
679
|
-
'Kuralın bilinen boşlukları: ilk `load`dan ÖNCE her gezinme serbesttir (betik ya da hızlı dokunuş dahil); aynı adrese yapılan form gönderimi aynı belge sayılır; Android POST isteğini kurala hiç getirmez ve karar 250 ms içinde verilemezse yüklemeye izin verir (olay yine yayılır). Web`de köprü yalnız `html` içeriğinde ve yalnız gerçek bağlantı dokunuşunu görür: betiğin gezinmesi, form gönderimi ve açılır pencere çerçevenin içinde ya da yeni sekmede kalır; başka kökenli `src` sayfasında köprü hiç yoktur.',
|
|
680
|
-
'Sayfadan akışa: `window.ReactNativeWebView.postMessage(metin)` → `message { data }` (metin olduğu gibi, `self.data`; JSON`u akış ayrıştırır). İki yönlü köprü (`html` ile ortak, 2026-09-28): `window.ngApps.emit(name, data)` → `message` olayı, akış `event.name`/`event.data` alır; akışın setter`la yazdığı `message` prop`u sayfada `window.ngApps.on(name, fn)` ile alınır (`{ name, data }` nesnesi olduğu gibi, başka değer `name: \'message\'` ile). Cihazda köprü `src` sayfasına da girer; web`de yalnız `html` içeriğinde çalışır, başka kökenli `src` sayfasında YOKTUR.',
|
|
681
|
-
'Kutu `lottie` kuralından: kabuktan gelen boy ya da (genişlik belliyken) panelin `aspectRatio`su, yoksa 300 dp. `load` her tamamlanan yüklemede (izin verilen gezinmeden sonra da) yayılır. Cihazda yüklenemeyen sayfa (ağ hatası) `error` yayar ve yer tutucu çizer; web`de tarayıcı engellenen ya da bulunamayan çerçevede de `load` atar, `error` pratikte gelmez (web `iframe` gibi).'
|
|
682
|
-
],
|
|
683
|
-
propNotes: {
|
|
684
|
-
src: 'Mutlak adres (`https://…`); `javascript:`, `data:`, `vbscript:`, `file:` şemaları boşa düşer (web `iframe` süzgeci). Göreli adres cihazda yüklenmez. `html` doluysa yok sayılır.',
|
|
685
|
-
html: 'Satır içi HTML belgesi; doluysa `src`nin önüne geçer. Cihazda `about:blank` kökeninde, web`de kökensiz korumalı `srcdoc` olarak çizilir; sayfa içi çapa (`#bolum`) yerinde kaydırır.',
|
|
686
|
-
allowNavigation: 'Açıkken bağlantılar görünümün İÇİNDE açılır; kapalıyken (varsayılan) gezinme engellenir ve kullanıcının dokunduğu bağlantı sistemde açılır. İki durumda da `navigate { url }` yayılır.',
|
|
687
|
-
injectedJs: 'Belge yüklenince koşan JavaScript (ör. `window.ReactNativeWebView.postMessage(document.title)`); cihazda iki içerikte, web`de yalnız `html`de. Gömülen sayfada tam yetkiyle koşar — yalnız güvenilen içerikte kullanın.',
|
|
688
|
-
message: 'Akıştan sayfaya ileti: setter ile yazılır, sayfa `window.ngApps.on(name, fn)` ile dinler (`\'*\'` hepsini alır). `{ name, data }` nesnesi olduğu gibi gider, başka değer `name: \'message\'` ile; aynı değer bir kez iletilir, belge yeniden yüklenince son değer yeniden gider.',
|
|
689
|
-
title: 'Erişilebilirlik etiketi (ekran okuyucu; web`de `<iframe title>`).'
|
|
690
|
-
}
|
|
691
|
-
},
|
|
692
|
-
html: {
|
|
693
|
-
summary: 'Web `html`in ikizi: katalogda karşılığı olmayan küçük görünüm (özel rozet, SVG, biçimli metin) için mobildeki geçici çözüm kapısı. `content` `context` ile Mustache`tan geçer; belge kendi korumalı çerçevesinde çizilir.',
|
|
694
|
-
differences: [
|
|
695
|
-
'İçerik sayfanın DOM`unda değil KENDİ belgesinde çizilir: cihazda `react-native-webview` (`about:blank` kökeni), kanvas ve önizlemede `<iframe srcdoc sandbox="allow-scripts">` (`allow-same-origin` yok). Belge uygulamanın çerezine, jetonuna ve sayfanın bileşenlerine ULAŞAMAZ — güvenlik kararı. Kanvasta çizilir ama dokunuş almaz.',
|
|
696
|
-
'Tema belgenin `:root`una yazılır: shadcn değişkenleri (`--primary`, `--foreground`, `--border`, `--muted-foreground` … HSL üçlüsü, `hsl(var(--primary))` ile okunur), `--radius-sm|md|lg` ve platformun `--ng-*` değişkenleri. Açık/koyu kip değişince belge yeniden kurulur. Gövde tema yazı yığınıyla, `color: hsl(var(--foreground))` ve saydam zeminle gelir.',
|
|
697
|
-
'Boy içeriğe göre: belge içerik kutusunu `ResizeObserver` ile bildirir, kabuk o boyu alır (bildirim gelene kadar 48 dp). `heightType: fill` ya da `px`/`%`/sayı ölçülü `fixed` kabuk boyunu korur, içerik belgede kayar. Studio`nun ölçüsüz `fixed`i içeriğe göre boy alır. `100vh` ile boylanan içerikte büyüme döngüsü durdurulur — o içerikte boyu `fixed` verin.',
|
|
698
|
-
'Bağlantılar görünümde AÇILMAZ: kullanıcının dokunduğu `<a href>` sistem tarayıcısında (`mailto:`/`tel:`/`sms:` ilgili uygulamada) açılır, betiğin gezinmesi hiçbir şey açmaz (`webview`in `allowNavigation: false` kuralı).',
|
|
699
|
-
'Akışla iki yön: belgede `fireEvent(key, data)` web gibi `actions` satırının akışını koşturur (akış `event.name` = key, `event.data` = veri; eşleşmeyen anahtar ve akışsız satır console uyarısıdır). `window.ngApps.emit(name, data)` → `message` olayı (`event.name`/`event.data`). Akışın setter`la yazdığı `message` prop`u belgede `window.ngApps.on(name, fn)` ile alınır.',
|
|
700
|
-
'Web`in belge içi yardımcıları: `loadScript` web gibi çalışır, `onCleanup` tanımlı ama boş (içerik değişince belge baştan kurulur), `fireEvent`in üçüncü argümanı yok sayılır (her belge tek bileşendir). `style` web anlamıyla içerik sarmalayıcısına kapsamlıdır (üst düzey bildirim sarmalayıcıya, `.hucre{…}` gibi iç kural onun altına); nesne biçimli `style` çizilmez.',
|
|
701
|
-
'Kapsam dışı: React Native harici bileşen protokolü v2 (çalışma anında JS paketi, Hermes, imza) — MOB-006; kalıcı ihtiyaç ayrı iştir.'
|
|
702
|
-
],
|
|
703
|
-
propNotes: {
|
|
704
|
-
content: 'Belgenin gövdesi (HTML, `<script>` ve `<style>` serbest). `{{ … }}` taşıyorsa `context` ile Mustache`tan geçer; hata olursa ham içerik çizilir.',
|
|
705
|
-
style: 'Belgenin stil bloğuna eklenen CSS; tema değişkenlerini okuyabilir (`.rozet{background:hsl(var(--primary))}`).',
|
|
706
|
-
message: 'Akıştan belgeye ileti: setter ile yazılır, belge `window.ngApps.on(name, fn)` ile dinler (`\'*\'` hepsini alır). `{ name, data }` nesnesi olduğu gibi gider, başka değer `name: \'message\'` ile. DURUMDUR: aynı değer ikinci kez iletilmez (tekrar için veriye sayaç koyun), belge yeniden kurulunca son değer yeniden iletilir.',
|
|
707
|
-
actions: 'Web ile aynı: `key` + akış. Belgedeki `fireEvent(key, data)` satırın akışını koşturur; `text` panelin satır etiketidir.'
|
|
708
|
-
}
|
|
709
|
-
},
|
|
710
|
-
chart: {
|
|
711
|
-
summary: 'Grafik; prop`lar, on altı tip (scatter dahil) ve kalan olaylar web ikizininki. Seçenek ve olay eşlemesi web`in modülünden gelir (`buildChartOption`, `chart-events.ts`): iki platform aynı ECharts seçeneğini çizer, aynı olayları yayar.',
|
|
712
|
-
differences: [
|
|
713
|
-
'Cihazda ECharts `@wuba/react-native-echarts`in SVG motoruyla (`react-native-svg`) çizilir, kanvas ve önizlemede ECharts`ın kendi tuvaliyle. Tema renkleri ve yazı ailesi temanın `--ng-*` değişkenlerinden; cihazda yazı yığının ilk ailesidir, yüklü değilse platform yazı tipi.',
|
|
714
|
-
'Düşenler: `style`; `isExportable` ve `exportFileName` (CSV/PNG indirme, tablo görünümü, tam ekran — dosya kaydetmek ayrı native modül ister); `showTypeSwitcher` ve `showRefresh` ile `refresh` olayı (tip akışla `chartType` yazılarak, yenileme sayfanın kaydırarak yenilemesiyle); `isDrillDown` ile `breadcrumbClick` (tıklanan noktanın satırı `dataPointClick { row }` ile yine gelir).',
|
|
715
|
-
'Kutu: kabuktan gelen boy (`heightType: fixed` ölçülü ya da `fill`) ya da panelin `aspectRatio`su, yoksa 240 dp; `caption` web`deki gibi kutunun altında metindir ve grafik alanından pay alır. Durum web`in sırasıyla: yükleniyor (ortada dönen gösterge — web kutuyu boş bırakır, ARC-177), hata (`errorText` + Yeniden dene düğmesi `<elementId>__retry`, `retry` yayar), veri yok (`emptyText`).',
|
|
716
|
-
'Dokunuş: noktaya dokunmak YALNIZ `dataPointClick` (seri), kategori ekseninin etiketine dokunmak YALNIZ `axisLabelClick` (yatay çubukta etiketler y ekseninde), legend maddesi `legendClick`; hedef çizgisi, bant ve eksen başlığı olay değildir, `selectionChange` yalnız `selectionMode` açıkken gelir (web ile aynı). Dokunulan noktada ipucu açılır; sayfa kaydırılınca açık kalır, grafiğin başka yerine dokununca yer değiştirir. Grafiğin üstünden dikey kaydırma sayfayı kaydırır; 4 px`ten uzun sürükleme tıklama sayılmaz.',
|
|
717
|
-
'Olay yükü düğüme yazılınca grafik yeniden KURULMAZ: seçim, gizlenen legend serisi ve yakınlaştırma korunur; seçenek girdinin içeriği değişince (bağlı veri yenilenince) yeniden uygulanır ve son legend seçimi korunur (web ile aynı). Bozuk bağlı veri bileşeni düşürmez: çözülemezse `emptyText`, seçenek kurulamazsa önceki çizim kalır. Başlık/alt başlık varken çizim alanı (ızgara; radar ve radyalde merkez) başlığın altına iner; eksen başlığı eksenin ortasına, etiketlerin dışına yazılır ve tuvalde kalır — ikisi web ile aynı. Prop varsayılanları web ile tek kaynaktır.'
|
|
718
|
-
]
|
|
719
|
-
},
|
|
720
|
-
datepicker: {
|
|
721
|
-
summary: 'Tek gün seçici; kutuya dokununca cihazda işletim sisteminin seçicisi (iOS satır içi takvim, Android iletişim kutusu), önizlemede (`/preview`, `/dev`) tarayıcının seçicisi açılır — kanvasta alan kilitlidir. Değer, sınır ve olaylar web ikizininki.',
|
|
722
|
-
differences: [
|
|
723
|
-
'Kutu `dropdown` tetikleyicisinin görünümündedir (`role="combobox"`, iç rol `<elementId>__trigger`, temizleme `<elementId>__clear`); X değer varken, alan kilitli değilken ve yüklenmiyorken çizilir. `isLoading` ikonun yerinde dönen gösterge çizer, kilit değildir (kutu açılır — web gibi).',
|
|
724
|
-
'Seçici: iOS`ta alttan açılan sayfada satır içi takvim — gün seçilip Tamam/Done (`<elementId>__done`) ile yazılır, dışına dokunmak vazgeçer (seçimde yazılmaz: seçili güne yeniden dokunmak değer bildirmez, takvimin ay/yıl çarkı bildirir — ikisi iOS 26.2 simülatöründe ölçüldü, 09 adım 4); Android`de sistem iletişim kutusu (Android cihazda ölçülmedi). Önizlemede kutunun içindeki görünmez `<input type="date">` tarayıcının seçicisini açar (`showPicker()`).',
|
|
725
|
-
'Otomasyon: `page_screenshot` `set` KÖKE değil `<elementId>__input`a yazılır, HTML biçimiyle — `yyyy-MM-dd` (`2026-08-01`). Kök `set` kutunun `role="combobox"`u yüzünden açılır kutu yoluna girer ve "açılır kutu AÇILMADI" der; biçimsiz değer (`1 Ağu 2026`, saatli metin) tarayıcıda boşalır ve yok sayılır — alan yalnız X`le (`__clear`) boşalır.',
|
|
726
|
-
'Değer web gibi yerel duvar saati `yyyy-MM-ddTHH:mm:ss` (seçimde `T00:00:00`); `minDate`/`maxDate` gün sınırıdır — seçici dışını kapatır, yazılan değer sınır gününe çekilir; `valueOffset`/`displayOffset` web kuralı. `focus` seçici açılınca, `blur` kapanınca gelir.',
|
|
727
|
-
'Kutu metni web`in deseniyle (`tr` `d MMM yyyy`, diğerleri `MMM d, yyyy`); dil alanın `locale`i, yoksa uygulama dili. Düşen: `style`.',
|
|
728
|
-
'Mobile özgü alanlar (f-11): `presentation: calendar` kutuya basınca alttan TAKVİM SAYFASI açar (işletim sistemi seçicisi değil — Pazartesi başlangıcı, dolu seçili gün, halkalı bugün, sınır dışı pasif gün koddan; iç roller `__prev`, `__next`, `__day-yyyy-MM-dd`, `__done`); `closeOnSelect` (varsayılan açık) seçimle kapatır. `quickPicks` gün ofseti çipleri (`[{ days: 0 }, { days: -1 }, { days: -2 }]` → Bugün / Dün / 2 gün önce; iç rol `__pick-<ofset>`), sınır dışı çip pasif; `system` kipinde alanın altında satırdır. `displayFormat` kutudaki kalıptır (`dd.MM.yyyy` → `24.09.2026`), değer ISO kalır. Android sistem seçicisi cihaz dilini izler — dil denetimi gerekiyorsa `presentation: calendar`.'
|
|
729
|
-
]
|
|
730
|
-
},
|
|
731
|
-
daterangepicker: {
|
|
732
|
-
summary: 'Tarih aralığı seçici (web ikizi): tek kutuda iki uç, basış alttan takvim sayfası açar ve iki güne basılarak aralık seçilir. `change` web gibi `{ valueFrom, valueTo }`.',
|
|
733
|
-
differences: [
|
|
734
|
-
'İşletim sisteminin seçicisi aralık seçmediği için her zaman takvim sayfasıdır (`datepicker` `presentation: calendar` ile aynı sayfa ve iç roller: `__trigger`, `__clear`, `__prev`, `__next`, `__day-yyyy-MM-dd`, `__done`).',
|
|
735
|
-
'İlk basış başlangıç (`valueTo: null` yazılır), ikinci basış bitiş; başlangıçtan önceki gün seçilirse uçlar YER DEĞİŞTİRİR, tamamlanmış aralığa basış yeniden başlatır. Uçlar `minDate`/`maxDate` gün sınırına çekilir, `valueOffset` eklenir; aralık tamamlanınca dokunulmayan uç web `toRangeValue` gibi SAKLANDIĞI GİBİ yazılır (akışın yazdığı saat korunur). Takvim `displayOffset`le gösterilen günü işaretler. `closeOnSelect` (varsayılan açık) bitişte kapatır.',
|
|
736
|
-
'Kutu metni `başlangıç – bitiş` (`displayFormat` ya da dilin kalıbı), boşken `startPlaceholder – endPlaceholder`; X iki ucu birden `null` yapar. Düşen: `style`.'
|
|
737
|
-
]
|
|
738
|
-
},
|
|
739
|
-
timepicker: {
|
|
740
|
-
summary: 'Saat seçici (`HH:mm`); cihazda işletim sisteminin saat çarkı/kutusu, önizlemede tarayıcının seçicisi. `change` web gibi `{ value, selectedLabel }`.',
|
|
741
|
-
differences: [
|
|
742
|
-
'Web`in listesi yerine işletim sisteminin seçicisi: iOS`ta alttan açılan sayfada çark + Tamam/Done, Android`de sistem saat kutusu; önizlemede `<input type="time">` tarayıcı seçicisi. Çark izinli en yakın saatte açılır — kaydırmadan Tamam yazılanı görünenle aynı tutar. Kutu, temizleme ve otomasyon `datepicker` ile aynı (`set` `<elementId>__input`a `HH:mm`). Web listesi gibi `isLoading` iken açılmaz.',
|
|
743
|
-
'Sistem seçicisi tek tek saati KAPATAMAZ: `minTime`/`maxTime` dışındaki, `disabledTimes`taki ya da adım dışı seçim İZİNLİ EN YAKIN saate yaslanır (eşitlikte erken olan; iOS çarkı sınırı zaten uygular); izinli saat yoksa hiçbir şey yazılmaz. Web`de bu saatler listede kapalı görünür. Ters sınır (`22:00`–`06:00`) seçiciye verilmez — her saat kapalı sayılır, web gibi.',
|
|
744
|
-
'`format: 12h` web gibi yalnız gösterimdir (kutu ve `selectedLabel` `01:00 PM`, değer `13:00`); iOS çarkı dilin kendi saat düzeniyle açılır (Türkçe 24, İngilizce 12 saat); Android saat kutusuna `format` verilir (Android cihazda ölçülmedi). `clearable: false` X`i kaldırır.',
|
|
745
|
-
'Düşenler: `style`, `emptyText` (web listesinin aramasındaki "sonuç yok" metni; sistem seçicisinde arama yok).'
|
|
746
|
-
],
|
|
747
|
-
propNotes: {
|
|
748
|
-
minutesStep: 'Çarkın adımı, adımı bölen en büyük desteklenen aralıktır (60 → 30`luk çark); seçim yine adıma yaslanır.'
|
|
749
|
-
}
|
|
750
|
-
},
|
|
751
|
-
datetimepicker: {
|
|
752
|
-
summary: 'Tarih + saat tek kutuda; cihazda iOS satır içi takvim + saat tek sayfada (Tamam/Done ile gösterilen an yazılır — boş alan şimdiyle, adımın ızgarasında açılır), Android önce tarih sonra saat (saatten vazgeçmek hiçbir şey yazmaz — kodla, Android cihazda ölçülmedi); önizlemede `<input type="datetime-local">`.',
|
|
753
|
-
differences: [
|
|
754
|
-
'Web`in iki kutusu (tarih + saat) mobilde TEK kutudur: metin tarih ve saati birlikte gösterir (İngilizcede 12 saat, diğer dillerde 24; saat metni platformun Intl`iyle — cihaz `3:00 PM`, web `03:00 PM`); boşken `placeholder` görünür.',
|
|
755
|
-
'Seçilen an saniyesi sıfırlanıp web`in saat başı ızgarasına (`minutesStep`; 45 dakikada :00 ve :45, saatten uzun adımda saat başları) ve `minDate`/`maxDate` an sınırına çekilir, `valueOffset` eklenir: `yyyy-MM-ddTHH:mm:ss`. Android`de saat kutusundan vazgeçmek hiçbir şey yazmaz (web: boş alanda yalnız gün seçmek yaymaz, CQ-237).',
|
|
756
|
-
'Kutu, temizleme, otomasyon (`set` `<elementId>__input`a `yyyy-MM-ddTHH:mm`) ve `focus`/`blur` `datepicker` ile aynı. Düşenler: `style`, `timePlaceholder` (web`in ayrı saat kutusunun metni).'
|
|
757
|
-
]
|
|
758
|
-
},
|
|
759
|
-
fileInput: {
|
|
760
|
-
summary: 'Dosya alanı; kutuya ya da Gözat`a dokununca cihazda `source`un seçicisi (varsayılan belge seçici), önizlemede tarayıcının dosya penceresi açılır — kanvasta alan kilitlidir. Değer, kapılar ve `change` web ikizininki: base64 veri URL`si düğüme yazılır ve Table microservice`in FILE parametresiyle kaydedilir (değeri olduğu gibi gövdeye verin — platform_guide(\'mobile\') §Dosya ve fotoğraf); fotoğrafı istemci küçültür (`maxImageDimension`), `maxFileSizeMb` varsayılanı 10.',
|
|
761
|
-
differences: [
|
|
762
|
-
'Seçici `source` ile seçilir (yalnız mobilde): `files` belge seçicisi (bütün türleri gösterir; izin listesi seçimden SONRA uygulanır ve web`in tür uyarısını çizer), `library` fotoğraf arşivi, `camera` kamera (izin istenir, verilmezse hiçbir şey olmaz), `ask` her seferinde sorar. Önizlemede görünmez `<input type="file">` açılır (`library`/`camera` `accept="image/*"`); otomasyon `<elementId>__input`a dosya verir. Seçici açıkken ve okuma sürerken alan meşguldür: ikinci seçici açılmaz, satır silme ve temizleme bekler.',
|
|
763
|
-
'Değer web gibi `{ value: base64 veri URL`si, fileName, type: "file" }` (çoklu kipte dizi, yeni seçim üstüne eklenir; boşaltma `{ type: "ref", value: null }`, çoklu kipte `[{ type: "ref", value: null }]`) — backend `TableFileParameter { value, type: ref|file|document, fileName }` biçiminin aynısı: `file` depoya yazılır, `ref` var olan dosyayı bağlar, `null` alanı boşaltır. Base64 sayfa durumunda ve istek gövdesinde taşındığı için `maxFileSizeMb` (mobil varsayılan 10) sıfırlanmaz. Kamera/galeri fotoğrafı uzun kenarı `maxImageDimension`a (varsayılan 1600 px; 0 = kapalı) indirilip JPEG olarak yeniden kodlanır — boyut kapısı küçültülmüş dosyaya bakar; belge seçiciden gelen dosyaya dokunulmaz. Fotoğraf arşivinden gelen HEIC iOS`ta JPEG`e çevrilir (`.jpg` — web`de Safari`nin yaptığı gibi), fotoğraflar `quality` ile sıkıştırılır. Görsel seçimler alanda küçük resimle görünür.',
|
|
764
|
-
'Tür/boyut/adet kapısı web kuralıdır (tek uyarı, tür ihlali önce; uyarı metni uygulama dilinde). İç roller: kutu `<elementId>__field`, Gözat `__browse`, temizle `__clear`, çoklu kipte satır silme `__file-<n>__delete`. `isReadonly`/`isViewmode` Gözat`ı ve X`i gizler.',
|
|
765
|
-
'Düşen: `style`.',
|
|
766
|
-
'f-13 (mobile özgü görünüm ve düzenleme): görsel dosya satırda 48 px küçük resimdir; tekli değerde satır "Değiştir" (`__file-0__change`, seçici yeniden açılır, değer yerinde değişir) ve kaldır taşır. `variant: tile` 1:1 kesikli "+ Ekle" karosu (`__add`) ve üç sütunlu küçük resim ızgarasıdır: dolu karoya basış değiştirir (`__file-<n>__change`), köşedeki × siler (`__file-<n>__delete`). `enableCrop` + `cropAspectRatio` cihazda sistem kırpıcısını açar (yalnız tek seçimde; iOS serbest oranı kesin uygulamaz; önizlemede kırpma yok), `rotateOnPick` (0/90/180/270) seçilen fotoğrafı döndürür. Kamera izni verilmezse değer değişmez, alanın altında Ayarlar bağlantılı not çıkar (`__settings`); alan geçersiz sayılmaz. Fotoğraf arşivi izin istemez (iOS PHPicker, Android sistem seçicisi).'
|
|
767
|
-
],
|
|
768
|
-
propNotes: {
|
|
769
|
-
source: 'Dosyanın geldiği yer: `files` (belgeler, varsayılan), `library` (fotoğraf arşivi), `camera`, `ask` (Kamera / Fotoğraflar / Dosyalar sorulur). `library` ve `camera` yalnız fotoğraf verir.',
|
|
770
|
-
quality: 'Fotoğrafın JPEG sıkıştırma kalitesi, 0,1–1 (varsayılan 0,8); `source: files` iken panelde gizlidir. Belgeye dokunmaz.',
|
|
771
|
-
maxImageDimension: 'Kamera/galeri fotoğrafının uzun kenarı için üst sınır, px (varsayılan 1600; 0 = küçültme yok). Küçük görsel büyütülmez; belge seçici dosyalarına uygulanmaz. YALNIZ mobil şemadadır.'
|
|
772
|
-
}
|
|
773
|
-
},
|
|
774
|
-
filebutton: {
|
|
775
|
-
summary: 'Ataşlı dosya düğmesi; dokununca varsayılan olarak kaynak sorulur (Kamera / Fotoğraflar / Dosyalar), önizlemede tarayıcının dosya penceresi açılır — kanvasta düğme kilitlidir. Değer, kapılar ve `change` web ikizininki: Table microservice`in FILE parametresiyle kaydedilir (değeri olduğu gibi gövdeye verin — platform_guide(\'mobile\') §Dosya ve fotoğraf); fotoğrafı istemci küçültür (`maxImageDimension`), `maxFileSizeMb` varsayılanı 10.',
|
|
776
|
-
differences: [
|
|
777
|
-
'`source` varsayılanı `ask`: iOS`ta eylem sayfası, Android`de üç düğmeli uyarı (dışına dokunmak vazgeçer; Android cihazda ölçülmedi); `files`/`library`/`camera` doğrudan açar. Vazgeçmek değeri değiştirmez; seçici açıkken ve okuma sürerken düğme meşguldür (ikinci seçici açılmaz, satır silme bekler). Simülatörde kamera açılır ama görüntü üretmez — çekim gerçek cihazda sınanır.',
|
|
778
|
-
'Değer web gibi `{ type: "file", value: base64 veri URL`si, fileName, ref: "" }` (çoklu kipte dizi, yeni seçim üstüne eklenir; boşaltma `null`, çoklu kipte `[]`) — backend `TableFileParameter` biçimi, FILE parametresine dönüştürmeden verilir. Tür ve sınır web gibi İKİ bağımsız uyarıdır; `maxFileSizeMb` mobil varsayılanı 10. Kamera/galeri fotoğrafı `maxImageDimension`a (varsayılan 1600 px; 0 = kapalı) küçültülüp JPEG olarak yeniden kodlanır, sınır küçültülmüş dosyaya bakar. HEIC fotoğraf iOS`ta JPEG`e çevrilir (`.jpg`); kameradan gelen fotoğrafın özgün adı olmadığı için geçici dosya adıyla yazılır. Görsel seçimler küçük resimle listelenir.',
|
|
779
|
-
'İç roller: düğme `<elementId>__button`, satır silme `__file-<n>__delete`, çoklu kipte "Tümünü temizle" `__clear`. Açıklama yalnız dosya yokken görünür (web gibi).',
|
|
780
|
-
'Düşen: `style`.',
|
|
781
|
-
'f-13 (mobile özgü): `fileInput` ile aynı 48 px önizleme, tekli "Değiştir", `variant: tile` karo ızgarası, `enableCrop` + `cropAspectRatio`, `rotateOnPick` ve izin notu. `size: icon` yalnız ikonlu yuvarlak düğmedir (`icon`, yoksa kaynağa göre `photo_camera`/`attach_file`) — avatar kamera rozeti: `stack` (`alignment: bottom-right`) + `avatar` taban + `size: icon` `filebutton` katmanı; `change` akışı setter ile değeri `avatar.src`e yazar.'
|
|
782
|
-
],
|
|
783
|
-
propNotes: {
|
|
784
|
-
source: 'Dosyanın geldiği yer: `ask` (varsayılan; Kamera / Fotoğraflar / Dosyalar sorulur), `files`, `library`, `camera`. `library` ve `camera` yalnız fotoğraf verir.',
|
|
785
|
-
quality: 'Fotoğrafın JPEG sıkıştırma kalitesi, 0,1–1 (varsayılan 0,8); `source: files` iken panelde gizlidir.',
|
|
786
|
-
maxImageDimension: 'Kamera/galeri fotoğrafının uzun kenarı için üst sınır, px (varsayılan 1600; 0 = küçültme yok). Belge seçici dosyalarına uygulanmaz. YALNIZ mobil şemadadır.'
|
|
787
|
-
}
|
|
788
|
-
},
|
|
789
|
-
map: {
|
|
790
|
-
summary: 'Harita ve işaretçiler (FlutterFlow GoogleMap). Web`de karşılığı YOKTUR.',
|
|
791
|
-
differences: [
|
|
792
|
-
'Cihazda `react-native-maps`: iOS Apple Haritalar, Android Google Haritalar (Expo Go`da anahtarsız; geliştirme/EAS derlemesinde Android Google anahtarı ve konum izin metinleri gerekir — ARC-128). Kanvas ve önizlemede Leaflet + OpenStreetMap karoları (anahtarsız, köşede OSM atfı; OSM`nin ortak karo sunucusu yoğun trafiğe açık değildir). Kanvasta dokunuş almaz ve sürüklenmez; karolar ve işaretçiler çizilir.',
|
|
793
|
-
'Görünüm üç sayıdır: `latitude`, `longitude`, `zoom` (web harita ölçeği 1–19, kesirli olabilir; cihazda Apple/Google bölgesine çevrilir). Nesne `center` prop`u YOKTUR: bağlanan düz nesne runtime`da bozulur (ARC-117).',
|
|
794
|
-
'Akış `latitude`/`longitude`/`zoom` yazınca harita oraya gider (web`de anında, cihazda kısa canlandırmayla) ve `regionChange` YAYMAZ. Kullanıcı sürükleyip yakınlaştırınca bıraktığı görünüm `regionChange { latitude, longitude, zoom }` ile düğüme geri yazılır (`carousel.activeIndex` gibi: prop`a bağlı ifade o an ezilir). Kutu ya da pencere boyunun değişmesi olay sayılmaz.',
|
|
795
|
-
'İşaretçiye dokunmak `markerClick { markerId }` yayar ve başlığı ya da açıklaması varsa balon açar. Harita işaretçiye ORTALANMAZ; kenardaki işaretçinin balonu sığmazsa harita sığdıracak kadar kayar ve bu kayma `regionChange` yayar (iOS ve web`de ölçüldü). Üst üste binen işaretçilerde iOS`ta `markerId` açılan balonunkinden farklı olabilir (ARC-130). İşaretçi rengi temanın ana rengidir. Döndürme ve eğme kapalıdır (ölçek kuzey yukarı görünümün ölçeğidir).',
|
|
796
|
-
'`interactive: false` sürüklemeyi ve yakınlaştırmayı kapatır, işaretçiler dokunulabilir kalır ve sayfa haritanın üstünden kayar. Açıkken haritanın üstündeki dikey sürükleme haritayı kaydırır, sayfayı değil.',
|
|
797
|
-
'"Haritada aç" (adres önizlemesi): işaretçi dışına dokunuş `press { latitude, longitude, mapsUrl }` yayar ve düğüme yalnız `mapsUrl` yazılır. Yer tek işaretçiyse o işaretçi (adıyla), değilse görünümün merkezidir. Akış `redirect` `isRaw: true`, `path: \'<harita>.mapsUrl\'` ile açar: iOS Apple Haritalar, Android `geo:` (kullanıcının harita uygulaması), web Google Haritalar. Ayrı bir adım yoktur.',
|
|
798
|
-
'Kutu `webview` kuralından: kabuktan gelen boy ya da panelin `aspectRatio`su, yoksa 300 dp.'
|
|
799
|
-
],
|
|
800
|
-
propNotes: {
|
|
801
|
-
latitude: 'Merkezin enlemi (−90…90; Mercator sınırı ±85,05`e kırpılır). Sayı metni de okunur (`41,0082`); geçersiz ya da boş değer varsayılana (İstanbul) düşer.',
|
|
802
|
-
longitude: 'Merkezin boylamı; −180…180 dışındaki değer sarılır (190 → −170).',
|
|
803
|
-
zoom: 'Web harita ölçeği: 1 kıtalar, 19 bina; kesirli olabilir, aralık dışı kırpılır. Dünyadan geniş görünüm cihazda sığdırılır (iOS 180°/360°`ten geniş bölgeyi reddeder) ve Apple Haritalar küçük kutuda daha uzağa açılmaz: 402×300 kutuda `zoom: 1`, kullanıcı hareketinden sonra `zoom: 2` olarak yazılır (yazılan her zaman gerçek ölçektir).',
|
|
804
|
-
markers: '[{ id, latitude, longitude, title, description }] — bağlı sorgunun satırları da olur; `latitude`/`longitude`u sayı (ya da sayı metni) olmayan satır çizilmez. `id` boşsa sırası kimliktir (`markerClick { markerId }`).',
|
|
805
|
-
interactive: 'Sürükleme ve yakınlaştırma (varsayılan açık); kapalıyken işaretçiler yine dokunulur.',
|
|
806
|
-
showUser: 'Kullanıcının konumunu çizer. Cihazda iOS izni MapKit sorar, Android`de bileşen çalışma anı izni ister; web`de tarayıcı konum izni. Yalnız runtime`da. "Konumum" düğmesi yoktur (Android`inki kamerayı `regionChange` yaymadan taşırdı); konuma gitmek akışın `latitude`/`longitude` yazmasıdır.'
|
|
807
|
-
}
|
|
808
|
-
},
|
|
809
|
-
datatable: {
|
|
810
|
-
summary: 'Veri tablosu (FlutterFlow DataTable); prop`lar ve akış sözleşmesi web ikizininki: sıralama ya da sayfa değişince sorgu prop`ları (`sortField`/`sortType`/`offset`) düğüme yazılır ve `mount` yeniden koşar, satır eylemi önce `selectedRow`u yazar sonra eylemin kendi akışını koşturur (yazım web gibi sessizdir, `silentUpdate: [elementId]`: tablo yeniden çizilmez, kaydırma konumu korunur). Hücre biçimi, görünür kolonlar, sıralama döngüsü ve sayfa hesabı web`in modülünden gelir (`renderCell`, `buildViewColumns`, `nextSort`, `computePageState`): iki platform aynı veriden aynı metni üretir.',
|
|
811
|
-
differences: [
|
|
812
|
-
'`variant: table` (varsayılan) yatay kaydırılan tablodur: başlık satırı, sıralanabilir kolonda başlığa dokunuş (`<elementId>__sort-<kolon>`, yön oku başlıkta), eylem sütunu satırın sonunda; dikey kaydırma sayfanındır, tablonun üstünden başlayan dikey kaydırma sayfayı kaydırır; kolonların toplamı çerçeveden darsa kolonlar web gibi çerçeveye yayılır (`table-layout: fixed`). `variant: cards` satır başına kart çizer: ilk görünür görsel kolon kartın başına, ilk görsel olmayan kolon başlığa, kalanlar etiket-değer satırlarına; kart kipinde sıralama başlığı yoktur (sıralama akışla yazılır).',
|
|
813
|
-
'Eylemler web paletiyle (`solid` birincil, `information` kenarlı, `transparent` hayalet, `error`/`danger` yıkıcı, `warning`, `dark`): `actionType: button` satırda düğmeler (`<elementId>__action-<satır>-<sıra>`), `dropdown` ⋯ düğmesi (`<elementId>__more-<satır>`) alttan açılan eylem sayfası (`<elementId>__sheet-action-<sıra>`; cihazda `modal` ile aynı katman). Satırın `_actions` dizisi web gibi eylemi ezer, `isHidden` gizler, `isDisabled` kilitler.',
|
|
814
|
-
'Sayfalama (`isPaginated`): ‹ `1–10 / 57` › çubuğu (`<elementId>__page-prev`, `__page-next`); metin dil bağımsızdır. Web`in sayfa numarası kutusu ve sayfa başına satır seçimi yok (`limit` panelden ya da akıştan; düğümde hiç yazılmamışsa web gibi 10). Başlık doluyken yanındaki yenile düğmesi (`<elementId>__refresh`) `mount`u koşturur.',
|
|
815
|
-
'Düşenler: `style`, `actionsPinned` (sabit eylem sütunu). Okunmayanlar: kolonların `isFilterable`ı ve gizli `filters` — filtre düzenleyicisi mobilde yok, akışın yazdığı `filters` sorguya olduğu gibi gider; özet satırı yok. Satır sanallaştırma yok: uzun veri için yol `limit`tir (100 satır × 6 kolon cihazda geliştirme kipinde ~0,7 sn`de çizildi).',
|
|
816
|
-
'Hücre: metin tablo kipinde tek satırda kırpılır (`multiLine` ise `lineClamp` kadar satır), kart kipinde sarar; etiket rengi temadan çözülür, üstündeki metin koyu/açık seçilir; `image` kolonu `imageHeight` karesi; `file` ve `url` dokunuşla sistemde açılır (kanvasta kilitli); `progress` her zaman çubuktur (daire kipi çubuk çizilir). Yükleniyor (`isLoading`) satırların yerine ortada dönen gösterge; satır yokken gövde web`in boş satırı kadar (120) boş kalır, ileti yazılmaz. Bırakılamaz — web ikizi bırakılabilir bildirir ama çocuk çizmez.'
|
|
817
|
-
],
|
|
818
|
-
propNotes: {
|
|
819
|
-
variant: 'Mobile özgü: `table` (varsayılan) ya da `cards`. Web şemasında yoktur; adı kapların `layout` prop`uyla karışmasın diye `variant`.'
|
|
820
|
-
}
|
|
821
|
-
},
|
|
822
|
-
skeleton: {
|
|
823
|
-
summary: 'Yükleme yer tutucusu (plans/mobil-plantcare-acigi f-14): blok, daire ya da metin satırları; 1.4 sn opaklık nabzıyla parlar. Web`de karşılığı yoktur (web `isLoading`i bileşenin kendisi çizer).',
|
|
824
|
-
differences: [
|
|
825
|
-
'`shape: rect` (varsayılan; kabuk boy veriyorsa onu doldurur, yoksa 96 dp) · `circle` (48 dp) · `text` (`lines` satır, sonuncusu kısa). `isLoading` (varsayılan açık; yazılmamışsa açık sayılır) `false` olunca kalkar; `delayMs` (varsayılan 300, en çok 5000) kadar süren yükleme iskelet göstermez. Tasarım kipinde her zaman çizilir.',
|
|
826
|
-
'Sayfanın genel iskeleti için bağla: `isLoading: {{ q_liste.isLoading }}` ve yanındaki içeriğe `isHidden` — tek düğümün yüklemesini zaten kabuk çizer (genel not).',
|
|
827
|
-
'Parıltı kanvasta ve "hareketi azalt"ta durur, iskelet sabit renkte kalır. Olay yok.'
|
|
828
|
-
],
|
|
829
|
-
propNotes: {
|
|
830
|
-
shape: '`rect` · `circle` · `text`.',
|
|
831
|
-
lines: 'Metin kipinde satır sayısı (1–10, varsayılan 3); öteki kiplerde panel gizler.',
|
|
832
|
-
delayMs: 'ms; bu süreden kısa yükleme iskelet göstermez (titreşme olmasın).'
|
|
833
|
-
}
|
|
834
|
-
},
|
|
835
|
-
'dropdown-button': {
|
|
836
|
-
summary: 'Menü açan düğme (bağlam menüsü ⋮): web ikizinin prop ve olayları; menü tetikleyiciye çapalı 230 dp`lik katmandır.',
|
|
837
|
-
differences: [
|
|
838
|
-
'Menü tetikleyicinin altında (sığmazsa üstünde) açılır, ekranın içinde kalır; arka plan hafif kararır, dışarı dokunuş kapatır. Başlık (`optionsTitle`), ikonlu satırlar, `isDanger` kırmızı, `isDisabled` soluk ve basılmaz.',
|
|
839
|
-
'Satıra basış menüyü kapatır ve `clickItem { currentItem }` yayar; satırın kendi `flow`u varsa ÖNCE o akış koşar (web). Düğmenin kendisine basış `click`. İç roller `<elementId>__press` (düğme) ve `<elementId>__item-<key>` (satır) — `page_screenshot` `click` onlarla basar.',
|
|
840
|
-
'Satır ikonu düz ad olmalı (`"icon": "edit"`): statik dizi satırındaki iç içe nesne mobilde okunmaz. Düşenler: `style`.'
|
|
841
|
-
]
|
|
842
|
-
},
|
|
843
|
-
timeline: {
|
|
844
|
-
summary: 'Zaman çizelgesi (bakım geçmişi): gün başlıkları, renkli ikon düğümü + dikey çizgi, saat ve meta satırı, not balonu, küçük resimler; web ikizinin prop ve olayları.',
|
|
845
|
-
differences: [
|
|
846
|
-
'Dikey tek düzen. Satırlar `groupByDate` (MOBİLE ÖZGÜ, varsayılan açık) ile gün başlıklarına ayrılır ("Bugün", "Dün", yoksa `dateFormat`); kapalıyken tek liste. `items[].images` (MOBİLE ÖZGÜ): adres dizisi (`["a.jpg", "b.jpg"]`, statik satırda da kabul edilir — ARC-152) ya da virgülle ayrılmış metin (`"a.jpg, b.jpg"`); bağla gelen satırda `[{ src }]` de okunur. Satırın altında küçük resimler.',
|
|
847
|
-
'Satıra dokunuş `clickItem { currentItem, index }` yayar; öğenin kendi `flow`u da koşar (web: bağlı akış önce başlatılır). `maxCount` aşılınca "Tümünü göster" (`<elementId>__show-more`) kalanı açar ve `showMore` yayar. `showMoreText`/`emptyText` yazılmamışsa uygulama dilinden gelir ("Tümünü göster" / "Henüz kayıt yok"). Satır iç rolü `<elementId>__item-<index>`.',
|
|
848
|
-
'Düşenler: `orientation` (mobil yalnız dikey), `style`.'
|
|
849
|
-
]
|
|
850
|
-
},
|
|
851
|
-
'photo-viewer': {
|
|
852
|
-
summary: 'Tam ekran fotoğraf galerisi (plans/mobil-plantcare-acigi f-14, D06): kaydırılan fotoğraf, alt yazı ve tarih, küçük resim şeridi; paylaş ve sil akışa bildirilir. Web`de karşılığı YOKTUR.',
|
|
853
|
-
differences: [
|
|
854
|
-
'`isOpen` açıkken siyah katman: üstte kapat, tarih, "2 / 11" sayacı; ortada fotoğraf (sola/sağa kaydırma, çift dokunuş 2×, cihazda iki parmakla yakınlaştırma — yakınken kaydırma kilitli); altta küçük resimler. Kanvasta yerinde çizilir.',
|
|
855
|
-
'Satırlar genelde sorgudan: görsel, alt yazı ve tarih alanlarını `srcField`, `captionField`, `dateField` söyler (boşsa `src`, `caption`, `date`). Gösterilen fotoğraf `index`; akış açmadan önce yazar (`index: 1`, `isOpen: true`).',
|
|
856
|
-
'Olaylar: `change { index }` (düğümün `index`ine de yazılır), `close` (`isOpen` kapanır), `share { row, index }`, `delete { row, index }`. Paylaş ve sil düğmeleri YALNIZ o olay bir akışa bağlıysa çizilir; bileşen kendisi paylaşmaz, silmez. İç roller `<elementId>__close`, `__share`, `__delete`, `__thumb-<n>`.'
|
|
857
|
-
]
|
|
858
|
-
}
|
|
859
|
-
};
|