@atezer/figma-mcp-bridge 1.7.24 → 1.7.26
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/.claude-plugin/plugin.json +37 -0
- package/.cursor-plugin/plugin.json +21 -0
- package/CHANGELOG.md +37 -0
- package/README.md +4 -3
- package/agents/ds-auditor.md +35 -0
- package/agents/screen-builder.md +35 -0
- package/agents/token-syncer.md +32 -0
- package/assets/logo.png +0 -0
- package/commands/add-library.md +122 -0
- package/commands/ds-add.md +255 -0
- package/commands/ds-sync.md +314 -0
- package/commands/implement.md +43 -0
- package/commands/install-library.md +73 -0
- package/commands/setup.md +26 -0
- package/commands/test.md +39 -0
- package/commands/update.md +25 -0
- package/dist/core/audit-log.d.ts +4 -0
- package/dist/core/audit-log.d.ts.map +1 -1
- package/dist/core/audit-log.js +12 -0
- package/dist/core/audit-log.js.map +1 -1
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +6 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/plugin-bridge-connector.d.ts +16 -16
- package/dist/core/plugin-bridge-connector.d.ts.map +1 -1
- package/dist/core/plugin-bridge-connector.js +2 -1
- package/dist/core/plugin-bridge-connector.js.map +1 -1
- package/dist/core/plugin-bridge-server.d.ts +5 -3
- package/dist/core/plugin-bridge-server.d.ts.map +1 -1
- package/dist/core/plugin-bridge-server.js +34 -22
- package/dist/core/plugin-bridge-server.js.map +1 -1
- package/dist/core/response-cache.d.ts +16 -0
- package/dist/core/response-cache.d.ts.map +1 -0
- package/dist/core/response-cache.js +46 -0
- package/dist/core/response-cache.js.map +1 -0
- package/dist/core/response-guard.d.ts +1 -1
- package/dist/core/response-guard.d.ts.map +1 -1
- package/dist/core/response-guard.js +20 -14
- package/dist/core/response-guard.js.map +1 -1
- package/dist/core/types/figma.d.ts +6 -0
- package/dist/core/types/figma.d.ts.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/local-plugin-only.d.ts.map +1 -1
- package/dist/local-plugin-only.js +202 -140
- package/dist/local-plugin-only.js.map +1 -1
- package/f-mcp-plugin/manifest.json +1 -1
- package/hooks/hooks.json +26 -0
- package/package.json +8 -1
- package/skills/BRAND_PROFILE_SCHEMA.md +113 -0
- package/skills/SKILL_INDEX.md +194 -0
- package/skills/TOOL_MAPPING.md +111 -0
- package/skills/ai-handoff-export/SKILL.md +262 -0
- package/skills/apply-figma-design-system/SKILL.md +104 -0
- package/skills/audit-figma-design-system/SKILL.md +278 -0
- package/skills/code-design-mapper/SKILL.md +370 -0
- package/skills/component-documentation/SKILL.md +198 -0
- package/skills/design-drift-detector/SKILL.md +407 -0
- package/skills/design-system-rules/SKILL.md +407 -0
- package/skills/design-token-pipeline/SKILL.md +619 -0
- package/skills/ds-impact-analysis/SKILL.md +266 -0
- package/skills/figjam-diagram-builder/SKILL.md +180 -0
- package/skills/figma-a11y-audit/SKILL.md +587 -0
- package/skills/figma-canvas-ops/SKILL.md +325 -0
- package/skills/figma-screen-analyzer/SKILL.md +243 -0
- package/skills/fix-figma-design-system-finding/SKILL.md +117 -0
- package/skills/fmcp-project-rules/SKILL.md +93 -0
- package/skills/generate-figma-library/SKILL.md +598 -0
- package/skills/generate-figma-screen/SKILL.md +689 -0
- package/skills/implement-design/SKILL.md +473 -0
- package/skills/ux-copy-guidance/SKILL.md +381 -0
- package/skills/visual-qa-compare/SKILL.md +174 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fmcp-project-rules
|
|
3
|
+
description: F-MCP Bridge kullanım kuralları — Design Token Kuralı, Bağlı Token Kuralı, kütüphane yönetimi, otomatik yanıt kuralları. Tüm F-MCP skill'leri için geçerli temel kurallar. Her Figma işleminde bu kurallar otomatik olarak geçerlidir.
|
|
4
|
+
metadata:
|
|
5
|
+
mcp-server: user-figma-mcp-bridge
|
|
6
|
+
personas:
|
|
7
|
+
- designer
|
|
8
|
+
- designops
|
|
9
|
+
- uidev
|
|
10
|
+
- po
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# F-MCP Temel Kurallar
|
|
14
|
+
|
|
15
|
+
Bu skill, tüm F-MCP skill'leri ve komutları için geçerli olan temel kuralları tanımlar. Her Figma işleminde bu kurallar otomatik olarak uygulanır.
|
|
16
|
+
|
|
17
|
+
## Kullanıcı İstekleri — Otomatik Yanıt
|
|
18
|
+
|
|
19
|
+
### "F-MCP'yi güncelle" / "update" / "güncelle"
|
|
20
|
+
Terminal komutu verme. `bash scripts/update.sh` çalıştır, sonucu bildir:
|
|
21
|
+
> Güncelleme tamamlandı (vX.Y.Z). Claude'u yeniden başlat ve Figma'da plugin'i kapat-aç.
|
|
22
|
+
|
|
23
|
+
### "F-MCP'yi kur" / "setup" / "kur" / "bunu kur" / GitHub linki verildi
|
|
24
|
+
Kullanıcı GitHub linki (github.com/atezer/FMCP) verip "kur" derse veya herhangi bir şekilde kurulum isterse:
|
|
25
|
+
|
|
26
|
+
1. Repo zaten clone edilmişse: `bash scripts/setup.sh` çalıştır
|
|
27
|
+
2. Repo clone edilmemişse: `git clone https://github.com/atezer/FMCP.git && cd FMCP && bash scripts/setup.sh`
|
|
28
|
+
3. Kullanıcıya sadece sonucu bildir.
|
|
29
|
+
|
|
30
|
+
Kullanıcıya ASLA terminal komutu söyleme, teknik adım açıklama. Her şeyi sen yap.
|
|
31
|
+
|
|
32
|
+
### Dil
|
|
33
|
+
Kullanıcı Türkçe konuşuyor. Tüm dosyalarda Türkçe karakterler (ş, ç, ğ, ö, ü, ı, İ) doğru kullanılmalı.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Design System Kütüphaneleri
|
|
38
|
+
|
|
39
|
+
Kullanıcı lokal olarak design system kütüphaneleri kaydedebilir. Kayıtlı kütüphaneler `.claude/libraries/` dizininde bulunur.
|
|
40
|
+
|
|
41
|
+
### Kullanım kuralları
|
|
42
|
+
|
|
43
|
+
1. **Skill çalıştırmadan önce** `.claude/libraries/` dizinini kontrol et. Kayıtlı kütüphane varsa oku.
|
|
44
|
+
2. **Varsayılan kütüphane:** Kullanıcı "hangi kütüphane?" demişse veya context'ten anlaşılamıyorsa, kayıtlı kütüphanelerden ilkini kullan.
|
|
45
|
+
3. **Figma file key'leri** kütüphane dosyasındaki tablolardan al — URL'den parse etme, doğrudan `File Key` alanını kullan.
|
|
46
|
+
4. **Token okuma** her zaman kütüphanenin WEB/ana dosyasından yapılır.
|
|
47
|
+
5. **Platform seçimi:** Web ekranı → WEB dosyası, Mobil ekran → Mobil dosyası (yoksa WEB fallback).
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Design Token Kuralı (TÜM skill'ler için geçerli — ZORUNLU)
|
|
52
|
+
|
|
53
|
+
Hiçbir skill gömülü/hardcoded design token değeri içeremez ve kullanamaz. Font ailesi, renk kodu, font boyutu, spacing, radius, gölge — hiçbir tasarım değeri skill içine yazılmaz.
|
|
54
|
+
|
|
55
|
+
**Her tasarım değeri çalışma anında tasarım sisteminden okunur:**
|
|
56
|
+
|
|
57
|
+
1. **Önce kayıtlı kütüphaneyi oku:** `.claude/libraries/` dizinindeki kütüphane dosyasını kontrol et. Font ailesi, variable collection'lar ve style listesi orada.
|
|
58
|
+
2. **Canlı değerleri Figma'dan al:**
|
|
59
|
+
- Font → `figma_get_styles()` text style'larından veya kütüphanenin `Font Ailesi` alanından
|
|
60
|
+
- Renkler → `figma_get_variables()` veya `figma_get_styles()` paint style'larından
|
|
61
|
+
- Boyutlar/spacing → `figma_get_variables()` variable collection'larından
|
|
62
|
+
- Gölgeler → `figma_get_styles()` effect style'larından
|
|
63
|
+
3. **Bulunamazsa kullanıcıya sor.**
|
|
64
|
+
4. **Kullanıcı "sen seç" derse:** Font için `Inter`, renkler için Figma varsayılanları kullan.
|
|
65
|
+
|
|
66
|
+
**Skill'lerdeki kod örnekleri:** Örneklerde geçen değerler (renk hex, font adı, piksel boyutu) yalnızca FORMAT gösterimidir. Çalışma anında bu değerler her zaman tasarım sisteminden okunmalıdır.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Bağlı Token Kuralı (ZORUNLU — tüm ekran/bileşen oluşturma işlemlerinde)
|
|
71
|
+
|
|
72
|
+
Figma'da oluşturulan hiçbir node'da **bağlanmamış (unbound) tasarım değeri** bulunmamalıdır. Her renk, spacing, padding, radius ve metin stili DS variable'ına veya text style'ına **bağlı (bound)** olmalıdır.
|
|
73
|
+
|
|
74
|
+
- **Renk (fill/stroke):** `figma.variables.importVariableByKeyAsync(key)` ile import et, `setBoundVariableForPaint()` ile bağla
|
|
75
|
+
- **Spacing/padding/radius/gap:** `setBoundVariable("paddingLeft", variable)` ile bağla
|
|
76
|
+
- **Metin stili:** `setTextStyleIdAsync(styleId)` ile DS text style'ını uygula
|
|
77
|
+
- **Metin rengi:** Text node fill'ini `setBoundVariableForPaint()` ile bağla
|
|
78
|
+
|
|
79
|
+
**Hardcoded değer kabul edilmez.** `node.fills = [{ type: "SOLID", color: {r,g,b} }]` veya `node.fontSize = 16` gibi doğrudan değer atamaları YASAKTIR. Tüm değerler DS'ten import edilip bağlanmalıdır.
|
|
80
|
+
|
|
81
|
+
Detaylı API kullanımı: `figma-canvas-ops` skill'inin **madde 10** bölümüne bak.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Mevcut kütüphaneler
|
|
86
|
+
|
|
87
|
+
Kayıtlı kütüphaneleri görmek için `.claude/libraries/` dizinini kontrol et. Her `.md` dosyası bir kütüphanedir. Kütüphane eklemek için `/add-library` komutunu kullan.
|
|
88
|
+
|
|
89
|
+
## Evolution Triggers
|
|
90
|
+
|
|
91
|
+
- Yeni DS kural kategorisi eklendiğinde bu skill güncellenmelidir.
|
|
92
|
+
- Yeni platform desteği (Flutter, React Native vb.) eklendiğinde platform seçimi kuralları genişletilmelidir.
|
|
93
|
+
- Kullanıcı geri bildirimine göre otomatik yanıt kuralları güncellenmelidir.
|
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: generate-figma-library
|
|
3
|
+
description: Kod tabanından Figma'da profesyonel design system kütüphanesi inşa eder. Variable collection, primitive/semantic token, bileşen (variant, auto-layout, property), sayfa yapısı ve tema desteği oluşturur. "DS kütüphanesi oluştur", "design system inşa et", "token'ları Figma'ya yaz", "bileşen kütüphanesi kur", "generate library", "Figma'da DS oluştur" ifadeleriyle tetiklenir. F-MCP Bridge ve figma_execute gerektirir.
|
|
4
|
+
metadata:
|
|
5
|
+
mcp-server: user-figma-mcp-bridge
|
|
6
|
+
personas:
|
|
7
|
+
- designops
|
|
8
|
+
- designer
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Generate Figma Library — Koddan DS Kütüphanesi İnşa
|
|
12
|
+
|
|
13
|
+
> **Design Token Kuralı:** Bu skill'deki kod örneklerinde geçen font adları, renk kodları, piksel boyutları yalnızca FORMAT gösterimidir. Çalışma anında tüm design token değerleri (font, renk, boyut, spacing, radius, gölge) kayıtlı kütüphaneden (`figma_get_variables`, `figma_get_styles`) veya kullanıcıdan okunmalıdır. Hardcoded token değeri kullanma. Detay: `project-context.md` → "Design Token Kuralı".
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
Bu skill, bir kod tabanından Figma'da profesyonel bir design system kütüphanesi oluşturur. Variable'lar (token), stiller, bileşenler (variant, auto-layout, property) ve sayfa yapısı dahil. Topluluk `figma-generate-library` skill'inden uyarlanmış, F-MCP Bridge araçlarına göre yeniden yazılmıştır.
|
|
18
|
+
|
|
19
|
+
**Bu ASLA tek seferde yapılacak bir iş değildir.** DS inşa etmek 20–100+ `figma_execute` çağrısı, birden fazla faz ve zorunlu kullanıcı onay noktaları gerektirir.
|
|
20
|
+
|
|
21
|
+
**Zorunlu:** Her `figma_execute` çağrısından önce [figma-canvas-ops](../figma-canvas-ops/SKILL.md) kılavuzundaki kuralları uygula.
|
|
22
|
+
|
|
23
|
+
## Skill Boundaries
|
|
24
|
+
|
|
25
|
+
- Bu skill: Figma'da **DS kütüphanesi** oluşturma/güncelleme
|
|
26
|
+
- DS bileşenleriyle **ekran** oluşturmak istiyorsan → [generate-figma-screen](../generate-figma-screen/SKILL.md)
|
|
27
|
+
- Mevcut ekranı DS'ye **hizalamak** istiyorsan → [apply-figma-design-system](../apply-figma-design-system/SKILL.md)
|
|
28
|
+
- Figma token'larını **kod dosyalarına** export etmek istiyorsan → [design-token-pipeline](../design-token-pipeline/SKILL.md)
|
|
29
|
+
|
|
30
|
+
## Prerequisites
|
|
31
|
+
|
|
32
|
+
- F-MCP Bridge plugin bağlı olmalı
|
|
33
|
+
- Kod tabanında token/bileşen bilgisi mevcut olmalı (CSS variables, Tailwind config, Swift Color extension, vb.)
|
|
34
|
+
|
|
35
|
+
## F-MCP skill koordinasyonu
|
|
36
|
+
|
|
37
|
+
- **Sonra:** `design-token-pipeline` (token export), `code-design-mapper` (bileşen eşleme), `design-system-rules` (kural üretimi)
|
|
38
|
+
- **Doğrulama:** `audit-figma-design-system` ile oluşturulan kütüphanenin tutarlılığını kontrol et
|
|
39
|
+
- **a11y:** `figma-a11y-audit` ile kontrast ve erişilebilirlik kontrolü
|
|
40
|
+
|
|
41
|
+
## F-MCP Avantajları
|
|
42
|
+
|
|
43
|
+
Bridge'de topluluk skill'inde olmayan toplu araçlar mevcut:
|
|
44
|
+
|
|
45
|
+
| Araç | Açıklama |
|
|
46
|
+
|---|---|
|
|
47
|
+
| `figma_batch_create_variables` | Toplu variable oluşturma |
|
|
48
|
+
| `figma_batch_update_variables` | Toplu variable güncelleme |
|
|
49
|
+
| `figma_setup_design_tokens` | Yapılandırılmış token kurulumu |
|
|
50
|
+
| `figma_arrange_component_set` | Variant grid düzenleme |
|
|
51
|
+
| `figma_create_variable_collection` | Collection oluşturma |
|
|
52
|
+
|
|
53
|
+
## Zorunlu Faz Sırası
|
|
54
|
+
|
|
55
|
+
Faz sırasını değiştirme veya atlama — yapısal bozulmalara neden olur.
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
Faz 0: KEŞİF (henüz yazma yok)
|
|
59
|
+
0a. Kod tabanını analiz et → token, bileşen, isimlendirme kurallarını çıkar
|
|
60
|
+
0b. Figma dosyasını incele → mevcut sayfa, variable, bileşen, stil
|
|
61
|
+
0c. v1 kapsamını kilitle → tam token seti + bileşen listesinde mutabık kal
|
|
62
|
+
✋ KULLANICI ONAYI: tam planı sun, onay bekle
|
|
63
|
+
|
|
64
|
+
Faz 1: TEMELLERİ KUR (token'lar — her zaman bileşenlerden önce)
|
|
65
|
+
1a. Variable collection ve modları oluştur
|
|
66
|
+
1b. Primitive variable'lar (ham değerler)
|
|
67
|
+
1c. Semantic variable'lar (alias, mod-bazlı)
|
|
68
|
+
1d. Tüm variable'larda scope ayarla
|
|
69
|
+
1e. Effect style ve text style oluştur
|
|
70
|
+
1f. Motion token'ları oluştur:
|
|
71
|
+
- duration/fast: 150 (ms)
|
|
72
|
+
- duration/normal: 250
|
|
73
|
+
- duration/slow: 400
|
|
74
|
+
- easing/standard: "ease-in-out"
|
|
75
|
+
- easing/decelerate: "ease-out"
|
|
76
|
+
- easing/accelerate: "ease-in"
|
|
77
|
+
NOT: Figma'da motion token'ları native variable olarak desteklenmez (FLOAT/STRING).
|
|
78
|
+
STRING variable olarak oluştur ve scope'u "ALL_SCOPES" ayarla.
|
|
79
|
+
Alternatif: Dokümantasyon sayfasında motion token tablosu olarak belgele.
|
|
80
|
+
1g. Shadow/elevation token'ları: shadow/sm, shadow/md, shadow/lg, shadow/xl
|
|
81
|
+
Effect style olarak oluştur (figma_execute ile dropShadow).
|
|
82
|
+
→ Çıkış kriteri: planlanan her token mevcut, FLOAT token scope'ları ayarlı, STRING token'lar (easing) scope gerektirmez, shadow effect style'lar oluşturulmuş
|
|
83
|
+
✋ KULLANICI ONAYI: variable özeti göster
|
|
84
|
+
|
|
85
|
+
Faz 2: DOSYA YAPISI (bileşenlerden önce)
|
|
86
|
+
2a. Sayfa iskeletini oluştur: Cover → Başlangıç → Temeller → Bileşenler → Yardımcılar
|
|
87
|
+
2b. Temel dokümantasyon sayfaları (renk swatchleri, tipografi örnekleri, spacing barları)
|
|
88
|
+
|
|
89
|
+
**60-30-10 Renk Kuralı:**
|
|
90
|
+
|
|
91
|
+
Palette hiyerarşisi (token yapısı):
|
|
92
|
+
- **%60 Nötr** — Arka plan, yüzey, kenarlık renkleri (neutral/50-900, surface/*)
|
|
93
|
+
- **%30 Birincil** — Marka rengi, birincil aksiyonlar, vurgulanan alanlar (primary/*, brand/*)
|
|
94
|
+
- **%10 Vurgu** — CTA butonları, bildirimler, hata/uyarı durumları (accent/*, semantic/*)
|
|
95
|
+
|
|
96
|
+
UI kullanım rehberi (alan dağılımı):
|
|
97
|
+
- Ekran alanının ~%60'ı nötr renklerle kaplanmalı (beyaz/gri arka plan, yüzeyler)
|
|
98
|
+
- Ekran alanının ~%30'u birincil marka rengi ve türevleriyle dolmalı (navigasyon, başlıklar, paneller)
|
|
99
|
+
- Ekran alanının ~%10'u dikkat çekici vurgu renkleriyle işaretlenmeli (CTA, badge, durum göstergeleri)
|
|
100
|
+
|
|
101
|
+
Bu oran kesin olmaktan çok yol göstericidir; tasarımın görsel dengesini sağlamak amaçlanır.
|
|
102
|
+
→ Çıkış kriteri: planlanan tüm sayfalar mevcut
|
|
103
|
+
✋ KULLANICI ONAYI: sayfa listesi + screenshot
|
|
104
|
+
|
|
105
|
+
Faz 3: BİLEŞENLER (bağımlılık sırasıyla, teker teker)
|
|
106
|
+
Her bileşen için (atomlar → moleküller → organizmalar):
|
|
107
|
+
3a. Bileşen sayfasını oluştur
|
|
108
|
+
3b. Base component: auto-layout + variable bağlama
|
|
109
|
+
3c. Variant kombinasyonları (combineAsVariants + grid layout)
|
|
110
|
+
3d. Durum kapsamı kontrolü: her bileşende en az 4 durum olmalı
|
|
111
|
+
Zorunlu: Default, Disabled
|
|
112
|
+
Bileşen tipine göre: Hover, Active/Pressed, Loading, Error, Focus
|
|
113
|
+
Etkileşimli bileşenler (Button, Input, Toggle, Checkbox):
|
|
114
|
+
minimum Default + Hover + Active + Disabled + Focus = 5 durum
|
|
115
|
+
Statik bileşenler (Card, Badge, Divider):
|
|
116
|
+
minimum Default + Disabled = 2 durum yeterli
|
|
117
|
+
3e. Component property ekle (TEXT, BOOLEAN, INSTANCE_SWAP)
|
|
118
|
+
3f. Sayfa dokümantasyonu (başlık, açıklama, kullanım notları)
|
|
119
|
+
3g. Doğrulama: figma_get_file_data + figma_capture_screenshot
|
|
120
|
+
→ Çıkış kriteri: variant sayısı doğru, tüm bağlamalar doğrulanmış, durum kapsamı yeterli
|
|
121
|
+
✋ KULLANICI ONAYI: her bileşen sonrası screenshot
|
|
122
|
+
|
|
123
|
+
Faz 4: ENTEGRASYON + QA
|
|
124
|
+
4a. İsteğe bağlı Code Connect eşleme (code-design-mapper)
|
|
125
|
+
4b. a11y denetimi (figma-a11y-audit): kontrast, minimum dokunma hedefi
|
|
126
|
+
4c. İsimlendirme denetimi: kopya yok, isimsiz node yok, tutarlı casing
|
|
127
|
+
4d. Bağlanmamış fill/stroke denetimi: hardcode kalmamış
|
|
128
|
+
4e. Son review: tüm sayfaların screenshot'ları
|
|
129
|
+
✋ KULLANICI ONAYI: tam onay
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Faz 0: Keşif (Detay)
|
|
133
|
+
|
|
134
|
+
### 0a. Kod tabanı analizi
|
|
135
|
+
|
|
136
|
+
Aşağıdakileri çıkar:
|
|
137
|
+
|
|
138
|
+
| Kaynak | Çıkarılacak |
|
|
139
|
+
|---|---|
|
|
140
|
+
| CSS Custom Properties / Sass variables | Renk, spacing, radius, shadow token'ları |
|
|
141
|
+
| Tailwind config | Tema token'ları, breakpoint'ler |
|
|
142
|
+
| Swift Color/Font extension | iOS token'ları |
|
|
143
|
+
| Android colors.xml / Compose Theme | Android token'ları |
|
|
144
|
+
| Bileşen dosyaları | Bileşen listesi, prop'lar, variant'lar |
|
|
145
|
+
|
|
146
|
+
### 0b. Figma dosyası inceleme
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
figma_get_status()
|
|
150
|
+
figma_get_file_data(depth=1)
|
|
151
|
+
figma_get_variables(verbosity="summary")
|
|
152
|
+
figma_get_styles()
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Mevcut yapıyı not al — çakışma riski varsa kullanıcıya sor.
|
|
156
|
+
|
|
157
|
+
## Faz 1: Temeller (Detay)
|
|
158
|
+
|
|
159
|
+
### Variable collection oluşturma
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
figma_create_variable_collection(name="Colors", modes=["Light", "Dark"])
|
|
163
|
+
figma_create_variable_collection(name="Spacing", modes=["Default"])
|
|
164
|
+
figma_create_variable_collection(name="Radius", modes=["Default"])
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Breakpoint / Ekran Boyut Token'ları (ZORUNLU)
|
|
168
|
+
|
|
169
|
+
Her DS kütüphanesinde ekran boyut token'ları olmalı. Responsive tasarımda hard-coded boyut KABUL EDİLMEZ:
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
Primitives:
|
|
173
|
+
screen/mobile-width: 390 (iPhone 14)
|
|
174
|
+
screen/mobile-height: 844
|
|
175
|
+
screen/tablet-width: 768 (iPad portrait)
|
|
176
|
+
screen/tablet-height: 1024
|
|
177
|
+
screen/web-width: 1440 (Desktop)
|
|
178
|
+
screen/web-height: 900
|
|
179
|
+
screen/tablet-padding: 120 (Tablet yan padding)
|
|
180
|
+
screen/web-padding: 480 (Web yan padding — centered card)
|
|
181
|
+
screen/top-padding-mobile: 80
|
|
182
|
+
screen/top-padding-tablet: 160
|
|
183
|
+
screen/bottom-padding: 40
|
|
184
|
+
|
|
185
|
+
Semantic:
|
|
186
|
+
layout/screen-mobile-width → screen/mobile-width
|
|
187
|
+
layout/screen-tablet-width → screen/tablet-width
|
|
188
|
+
layout/screen-web-width → screen/web-width
|
|
189
|
+
layout/screen-tablet-padding → screen/tablet-padding
|
|
190
|
+
layout/screen-web-padding → screen/web-padding
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Her ekran frame'inde şu binding'ler ZORUNLUDUR:
|
|
194
|
+
- `setBoundVariable("width", ...)` — genişlik
|
|
195
|
+
- `setBoundVariable("minHeight", ...)` — minimum yükseklik
|
|
196
|
+
- `setBoundVariable("paddingLeft/Right", ...)` — yan padding
|
|
197
|
+
- `setBoundVariable("paddingTop/Bottom", ...)` — üst/alt padding
|
|
198
|
+
|
|
199
|
+
Figma'da "Fixed width (390)" veya "Fixed height (900)" yerine variable ikonu görünmelidir. **Hard-coded boyut değeri KABUL EDİLMEZ.**
|
|
200
|
+
|
|
201
|
+
### Kritik Kural: Tüm Görünüm Değerleri Token'a Bağlı Olmalı (ZORUNLU)
|
|
202
|
+
|
|
203
|
+
Bir bileşen oluşturulurken aşağıdaki TÜM değerler semantic variable'a bağlanmalıdır. Hardcoded değer KABUL EDİLMEZ:
|
|
204
|
+
|
|
205
|
+
| Özellik | Bağlama Yöntemi | Örnek Token |
|
|
206
|
+
|---------|-----------------|-------------|
|
|
207
|
+
| Fill (arka plan) | `setBoundVariable("fills", ...)` | button/primary/bg |
|
|
208
|
+
| Text fill (yazı rengi) | Text node'da `setBoundVariable("fills", ...)` | button/primary/text |
|
|
209
|
+
| Stroke (kenarlık rengi) | `setBoundVariable("strokes", ...)` | button/primary/border |
|
|
210
|
+
| **Stroke width (kenarlık kalınlığı)** | `setBoundVariable("strokeWeight", ...)` | button/border-width |
|
|
211
|
+
| Corner radius | `setBoundVariable("topLeftRadius", ...)` vb. | button/radius |
|
|
212
|
+
| Padding | `setBoundVariable("paddingLeft", ...)` vb. | button/padding-x |
|
|
213
|
+
| Item spacing (gap) | `setBoundVariable("itemSpacing", ...)` | button/gap |
|
|
214
|
+
| Min height | `setBoundVariable("minHeight", ...)` | button/minHeight |
|
|
215
|
+
| Font size | Text Style oluştur + `setBoundVariable("fontSize", ...)` | button/fontSize |
|
|
216
|
+
|
|
217
|
+
**Özellikle gözden kaçan özellikler:**
|
|
218
|
+
- `strokeWeight` — Outline buton gibi kenarlığı olan variantlarda kenarlık kalınlığı variable'a bağlanmalı
|
|
219
|
+
- `fontSize` — Figma'da fontFamily/fontWeight variable olarak bağlanamaz, Text Style ile yönetilir
|
|
220
|
+
- Text Style oluştur → fontSize'i variable'a bağla → tüm text node'lara `setTextStyleIdAsync` ile uygula
|
|
221
|
+
|
|
222
|
+
### Kritik Kural: Text Hizalama (ZORUNLU)
|
|
223
|
+
|
|
224
|
+
Text node'un `textAlignHorizontal` değeri, bileşenin amacına göre ayarlanmalı:
|
|
225
|
+
|
|
226
|
+
| Bileşen Tipi | textAlignHorizontal | Neden |
|
|
227
|
+
|-------------|---------------------|-------|
|
|
228
|
+
| Button, Tag, Badge | CENTER | Yazı butonun ortasında olmalı |
|
|
229
|
+
| Input, Textarea | LEFT | Kullanıcı metni soldan yazar |
|
|
230
|
+
| Card title, List item | LEFT | Okuma yönü sol→sağ |
|
|
231
|
+
| Dialog title | LEFT veya CENTER | Tasarım kararına bağlı |
|
|
232
|
+
| Table header/cell | LEFT | Tablo verisi sola hizalı |
|
|
233
|
+
|
|
234
|
+
**Kural:** `textAlignHorizontal` ASLA varsayılan LEFT olarak bırakılmamalı — bileşen tipine göre bilinçli seçilmeli.
|
|
235
|
+
Text Style içerisinde hizalama AYARLANAMAZ (Figma kısıtlaması) — her text node'da ayrı ayarlanmalı.
|
|
236
|
+
|
|
237
|
+
### Kritik Kural: Bileşen Sizing (ZORUNLU)
|
|
238
|
+
|
|
239
|
+
Bileşenler ve instance'lar ASLA `Fixed width` olarak bırakılmamalı (özel durum hariç):
|
|
240
|
+
|
|
241
|
+
| Durum | layoutSizingHorizontal | Neden |
|
|
242
|
+
|-------|----------------------|-------|
|
|
243
|
+
| Button, Tag, Badge | HUG | İçeriğe göre boyutlanır, yazı ortalanır |
|
|
244
|
+
| Input, Textarea | FILL | Parent genişliğine uyar |
|
|
245
|
+
| Card | FILL veya FIXED | Responsive grid'e göre |
|
|
246
|
+
| Icon wrapper | HUG | İkon boyutuna göre |
|
|
247
|
+
|
|
248
|
+
**Kural:** `Fixed width` kullanırsan yazının ortalanmış görünmesini engeller — buton "Kaydet" yazısından geniş kalır ve yazı sola yapışır. HUG kullanırsan buton yazıya sarılır ve auto-layout CENTER düzgün çalışır.
|
|
249
|
+
|
|
250
|
+
**Doğrulama:** Faz 4 (4d) adımında `boundVariables`, stroke, fontSize, text style, text hizalama VE sizing mode kontrol edilmeli.
|
|
251
|
+
|
|
252
|
+
### Toplu variable oluşturma (F-MCP avantajı)
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Kritik Kural: Semantic Token = Alias (ZORUNLU)
|
|
256
|
+
|
|
257
|
+
**Her semantic token, bir primitive token'a alias (VARIABLE_ALIAS) olarak bağlanmalıdır.** Hiçbir semantic token'da direkt sabit değer (literal value) olmamalıdır.
|
|
258
|
+
|
|
259
|
+
Eğer semantic token için uygun bir primitive yoksa, **önce primitive oluştur, sonra alias bağla:**
|
|
260
|
+
|
|
261
|
+
```js
|
|
262
|
+
// figma_execute — Primitives'te karşılık yoksa önce oluştur
|
|
263
|
+
const primColl = (await figma.variables.getLocalVariableCollectionsAsync()).find(c => c.name === "Primitives");
|
|
264
|
+
const newPrim = figma.variables.createVariable("size/touch-min-ios", primColl, "FLOAT");
|
|
265
|
+
newPrim.setValueForMode(primColl.modes[0].modeId, 44);
|
|
266
|
+
newPrim.description = "iOS minimum touch target. 44pt per Apple HIG.";
|
|
267
|
+
newPrim.scopes = ["WIDTH_HEIGHT"];
|
|
268
|
+
|
|
269
|
+
// Sonra semantic'i alias olarak bağla
|
|
270
|
+
const semVar = await figma.variables.getVariableByIdAsync("<SEMANTIC_VAR_ID>");
|
|
271
|
+
semVar.setValueForMode(semModeId, { type: "VARIABLE_ALIAS", id: newPrim.id });
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Bu kural, token sisteminin tutarlılığını garanti eder: primitive değişince tüm semantic'ler otomatik güncellenir.
|
|
275
|
+
|
|
276
|
+
### Toplu variable oluşturma (F-MCP avantajı)
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
figma_batch_create_variables(
|
|
280
|
+
collectionId="<id>",
|
|
281
|
+
variables=[
|
|
282
|
+
// Aşağıdaki değerler FORMAT örneğidir — çalışma anında DS'den okunur
|
|
283
|
+
{ name: "primary/50", type: "COLOR", values: { "Light": "#EEF2FF", "Dark": "#312E81" } },
|
|
284
|
+
{ name: "primary/100", type: "COLOR", values: { "Light": "#E0E7FF", "Dark": "#3730A3" } },
|
|
285
|
+
...
|
|
286
|
+
]
|
|
287
|
+
)
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Hata yönetimi:** `figma_batch_create_variables` kısmi başarı dönebilir. Yanıttaki `{ created, failed }` alanlarını kontrol et:
|
|
291
|
+
- `failed` boş değilse: hata mesajını oku, eksik variable'ları tekil `figma_create_variable` ile oluştur
|
|
292
|
+
- `created` dizisinden variable ID'lerini kaydet — sonraki adımlarda (scope atama, alias bağlama) kullanılacak
|
|
293
|
+
|
|
294
|
+
Veya `figma_setup_design_tokens` ile yapılandırılmış kurulum (atomik: ya hepsi başarılı ya hiçbiri).
|
|
295
|
+
|
|
296
|
+
### Scope ayarlama
|
|
297
|
+
|
|
298
|
+
Variable oluşturduktan sonra scope'ları ayarla (ZORUNLU):
|
|
299
|
+
|
|
300
|
+
```js
|
|
301
|
+
// figma_execute içinde
|
|
302
|
+
const variable = await figma.variables.getVariableByIdAsync("<id>");
|
|
303
|
+
variable.scopes = ["FRAME_FILL", "SHAPE_FILL"];
|
|
304
|
+
return { id: variable.id, scopes: variable.scopes };
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Description ve Code Syntax (ZORUNLU)
|
|
308
|
+
|
|
309
|
+
Her variable'a description ve code syntax ekle. Bu, geliştirici handoff'unda kritik bilgi sağlar:
|
|
310
|
+
|
|
311
|
+
```js
|
|
312
|
+
// figma_execute içinde — description
|
|
313
|
+
const variable = await figma.variables.getVariableByIdAsync("<id>");
|
|
314
|
+
variable.description = "Primary button background. WCAG AA on white (4.56:1).";
|
|
315
|
+
|
|
316
|
+
// Code syntax — 3 platform
|
|
317
|
+
variable.setVariableCodeSyntax("WEB", "var(--btn-primary-bg)");
|
|
318
|
+
variable.setVariableCodeSyntax("ANDROID", "R.color.btn_primary_bg");
|
|
319
|
+
variable.setVariableCodeSyntax("iOS", "ButtonColor.primary.bg");
|
|
320
|
+
return { id: variable.id, description: variable.description };
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**İsimlendirme kuralları (Code Syntax):**
|
|
324
|
+
- **Web:** CSS custom property: `var(--token-name)` (kebab-case)
|
|
325
|
+
- **Android:** Resource reference: `R.color.token_name` veya `R.dimen.token_name` (snake_case)
|
|
326
|
+
- **iOS:** Swift constant: `Color.tokenName` veya `Spacing.tokenName` (camelCase)
|
|
327
|
+
|
|
328
|
+
### Text ve effect style'lar
|
|
329
|
+
|
|
330
|
+
> **Font kuralı:** Hardcoded font kullanma. Önce kayıtlı kütüphanenin text style'larından font ailesini oku. Bulunamazsa kullanıcıya sor. Kullanıcı "sen seç" derse `Inter` kullan.
|
|
331
|
+
|
|
332
|
+
```js
|
|
333
|
+
// FONT_FAMILY ve FONT_STYLE'ı kütüphaneden veya kullanıcıdan al
|
|
334
|
+
const FONT_FAMILY = "KütüphanedenOkunanFont"; // ör: "Source Sans Pro", "Inter", vb.
|
|
335
|
+
const style = figma.createTextStyle();
|
|
336
|
+
style.name = "Heading/H1";
|
|
337
|
+
await figma.loadFontAsync({ family: FONT_FAMILY, style: "Bold" });
|
|
338
|
+
style.fontName = { family: FONT_FAMILY, style: "Bold" };
|
|
339
|
+
style.fontSize = 32;
|
|
340
|
+
style.lineHeight = { value: 40, unit: "PIXELS" };
|
|
341
|
+
return { styleId: style.id, name: style.name };
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Faz 3: Bileşenler (Detay)
|
|
345
|
+
|
|
346
|
+
### Base component
|
|
347
|
+
|
|
348
|
+
```js
|
|
349
|
+
const component = figma.createComponent();
|
|
350
|
+
component.name = "Button";
|
|
351
|
+
component.layoutMode = "HORIZONTAL";
|
|
352
|
+
component.primaryAxisSizingMode = "AUTO";
|
|
353
|
+
component.counterAxisSizingMode = "AUTO";
|
|
354
|
+
component.paddingTop = component.paddingBottom = 12;
|
|
355
|
+
component.paddingLeft = component.paddingRight = 24;
|
|
356
|
+
component.cornerRadius = 8;
|
|
357
|
+
component.itemSpacing = 8;
|
|
358
|
+
|
|
359
|
+
// Metin ekle — FONT_FAMILY'yi kütüphaneden veya kullanıcıdan al
|
|
360
|
+
await figma.loadFontAsync({ family: FONT_FAMILY, style: "Medium" });
|
|
361
|
+
const label = figma.createText();
|
|
362
|
+
label.characters = "Button";
|
|
363
|
+
label.fontName = { family: FONT_FAMILY, style: "Medium" };
|
|
364
|
+
label.fontSize = 14;
|
|
365
|
+
component.appendChild(label);
|
|
366
|
+
|
|
367
|
+
return { componentId: component.id };
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Variant'lar
|
|
371
|
+
|
|
372
|
+
```js
|
|
373
|
+
const variants = [];
|
|
374
|
+
const sizes = ["Small", "Medium", "Large"];
|
|
375
|
+
const types = ["Primary", "Secondary", "Ghost"];
|
|
376
|
+
|
|
377
|
+
for (const size of sizes) {
|
|
378
|
+
for (const type of types) {
|
|
379
|
+
const variant = existingComponent.clone();
|
|
380
|
+
variant.name = `Size=${size}, Type=${type}`;
|
|
381
|
+
// Boyut ve stil ayarlamaları...
|
|
382
|
+
variants.push(variant);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const componentSet = figma.combineAsVariants(
|
|
387
|
+
[existingComponent, ...variants],
|
|
388
|
+
figma.currentPage
|
|
389
|
+
);
|
|
390
|
+
componentSet.name = "Button";
|
|
391
|
+
|
|
392
|
+
// ZORUNLU: Component set'e auto-layout ekle — yoksa variantlar üst üste biner
|
|
393
|
+
componentSet.layoutMode = "VERTICAL"; // veya "HORIZONTAL"
|
|
394
|
+
componentSet.primaryAxisSizingMode = "AUTO";
|
|
395
|
+
componentSet.counterAxisSizingMode = "AUTO";
|
|
396
|
+
componentSet.itemSpacing = 16;
|
|
397
|
+
|
|
398
|
+
return { componentSetId: componentSet.id, variantCount: variants.length + 1 };
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**KRİTİK:** Variantları birleştirmek için `figma_arrange_component_set` kullan:
|
|
402
|
+
|
|
403
|
+
```
|
|
404
|
+
figma_arrange_component_set(nodeIds=["<VARIANT_1_ID>", "<VARIANT_2_ID>", ...])
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
Bu araç sadece `combineAsVariants` çağırır. API sonucu native UI ile birebir aynı değildir — aşağıdaki düzeltme adımlarını `figma_execute` ile SONRASINDA uygula:
|
|
408
|
+
|
|
409
|
+
```js
|
|
410
|
+
// figma_execute — arrange_component_set SONRASI calistir
|
|
411
|
+
const cs = await figma.getNodeByIdAsync("<COMPONENT_SET_ID>");
|
|
412
|
+
|
|
413
|
+
// 1. Stroke ekle (API eklemiyor, native ekliyor)
|
|
414
|
+
cs.strokes = [{
|
|
415
|
+
type: 'SOLID', visible: true, opacity: 1, blendMode: 'NORMAL',
|
|
416
|
+
color: { r: 0.541, g: 0.220, b: 0.961 }
|
|
417
|
+
}];
|
|
418
|
+
|
|
419
|
+
// 2. Auto-layout ekle (native değerler)
|
|
420
|
+
cs.layoutMode = "HORIZONTAL";
|
|
421
|
+
cs.primaryAxisSizingMode = "AUTO";
|
|
422
|
+
cs.counterAxisSizingMode = "AUTO";
|
|
423
|
+
cs.primaryAxisAlignItems = "MIN";
|
|
424
|
+
cs.counterAxisAlignItems = "CENTER";
|
|
425
|
+
cs.itemSpacing = 30;
|
|
426
|
+
cs.paddingLeft = 20; cs.paddingRight = 20;
|
|
427
|
+
cs.paddingTop = 20; cs.paddingBottom = 20;
|
|
428
|
+
|
|
429
|
+
// 3. Property 1 → Variant rename
|
|
430
|
+
for (const child of cs.children) {
|
|
431
|
+
child.name = child.name.replace("Property 1=", "Variant=");
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Component property
|
|
436
|
+
|
|
437
|
+
```js
|
|
438
|
+
// figma_execute içinde
|
|
439
|
+
const component = await figma.getNodeByIdAsync("<id>");
|
|
440
|
+
component.addComponentProperty("label", "TEXT", "Button");
|
|
441
|
+
component.addComponentProperty("showIcon", "BOOLEAN", true);
|
|
442
|
+
return { properties: component.componentPropertyDefinitions };
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Code-Only Props Katmanı (Nathan Curtis Yaklaşımı)
|
|
446
|
+
|
|
447
|
+
Görsel olmayan ama geliştirici için kritik olan property'ler (accessibilityLabel, heading level, slot config, minLength, maxRows vb.) Figma'da **gizli bir katman** içinde tanımlanır. Bu, Figma'yı bileşen tanımının tek doğruluk kaynağı yapar.
|
|
448
|
+
|
|
449
|
+
**Adım 1: Gizli katman oluştur**
|
|
450
|
+
|
|
451
|
+
Component'in kök katmanının alt öğesi olarak, (0,0) konumunda, 0.01x0.01 boyutunda, içeriği kırpılmış bir frame ekle:
|
|
452
|
+
|
|
453
|
+
```js
|
|
454
|
+
// figma_execute — Code-only props katmanı oluştur
|
|
455
|
+
const component = await figma.getNodeByIdAsync("<COMPONENT_ID>");
|
|
456
|
+
|
|
457
|
+
const codeOnlyFrame = figma.createFrame();
|
|
458
|
+
codeOnlyFrame.name = "Code only props";
|
|
459
|
+
codeOnlyFrame.resize(0.01, 0.01);
|
|
460
|
+
codeOnlyFrame.x = 0;
|
|
461
|
+
codeOnlyFrame.y = 0;
|
|
462
|
+
codeOnlyFrame.clipsContent = true;
|
|
463
|
+
codeOnlyFrame.fills = [];
|
|
464
|
+
component.appendChild(codeOnlyFrame);
|
|
465
|
+
// KRİTİK: ABSOLUTE positioning — yoksa auto-layout gap'te boşluk yaratır
|
|
466
|
+
codeOnlyFrame.layoutPositioning = "ABSOLUTE";
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
**Adım 2: Her property için bir katman ekle**
|
|
470
|
+
|
|
471
|
+
```js
|
|
472
|
+
await figma.loadFontAsync({ family: FONT_FAMILY, style: "Regular" });
|
|
473
|
+
|
|
474
|
+
// Erişilebilirlik etiketi
|
|
475
|
+
const a11yLabel = figma.createText();
|
|
476
|
+
a11yLabel.characters = "Label";
|
|
477
|
+
a11yLabel.name = "accessibilityLabel";
|
|
478
|
+
a11yLabel.fontSize = 10;
|
|
479
|
+
codeOnlyFrame.appendChild(a11yLabel);
|
|
480
|
+
|
|
481
|
+
// Component property'ye bağla
|
|
482
|
+
component.addComponentProperty("accessibilityLabel", "TEXT", "Button label");
|
|
483
|
+
a11yLabel.componentPropertyReferences = { characters: "accessibilityLabel#<KEY>" };
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
**Adım 3: Görünürlük kontrolü**
|
|
487
|
+
|
|
488
|
+
- Ürün tasarımcısının görmesi gereken props → **katman görünür** (Properties panelinde çıkar)
|
|
489
|
+
- Sadece geliştirici için → **katman gizli** (`a11yLabel.visible = false;`) — Properties panelinde görünmez ama spec data'da çıkar
|
|
490
|
+
|
|
491
|
+
**Yaygın Code-Only Prop Örnekleri:**
|
|
492
|
+
|
|
493
|
+
| Bileşen | Code-Only Prop | Type | Açıklama |
|
|
494
|
+
|---------|---------------|------|----------|
|
|
495
|
+
| Button | accessibilityLabel | TEXT | Ekran okuyucu etiketi |
|
|
496
|
+
| Heading | as | VARIANT (h1-h6) | HTML tag seviyesi |
|
|
497
|
+
| Heading | level | VARIANT (1-6) | Görsel hiyerarşi seviyesi |
|
|
498
|
+
| Input | minLength | TEXT | Min karakter (doğrulama) |
|
|
499
|
+
| Input | maxLength | TEXT | Max karakter (doğrulama) |
|
|
500
|
+
| Textarea | minRows | TEXT | Min satır yüksekliği |
|
|
501
|
+
| Textarea | maxRows | TEXT | Max satır yüksekliği |
|
|
502
|
+
| Image | src | TEXT | Görsel kaynağı URL |
|
|
503
|
+
| Image | altText | TEXT | Alternatif metin |
|
|
504
|
+
| CheckboxGroup | items anyOf | TEXT | İzin verilen alt bileşenler |
|
|
505
|
+
| CheckboxGroup | minItems | TEXT | Min seçim sayısı |
|
|
506
|
+
|
|
507
|
+
**Spec Data Çıktısı (YAML):**
|
|
508
|
+
```yaml
|
|
509
|
+
components:
|
|
510
|
+
button:
|
|
511
|
+
props:
|
|
512
|
+
label:
|
|
513
|
+
type: string
|
|
514
|
+
accessibilityLabel:
|
|
515
|
+
type: string
|
|
516
|
+
disabled:
|
|
517
|
+
type: boolean
|
|
518
|
+
default: false
|
|
519
|
+
heading:
|
|
520
|
+
props:
|
|
521
|
+
children:
|
|
522
|
+
type: string
|
|
523
|
+
as:
|
|
524
|
+
type: string
|
|
525
|
+
enum: [h1, h2, h3, h4, h5, h6]
|
|
526
|
+
default: h2
|
|
527
|
+
level:
|
|
528
|
+
type: number
|
|
529
|
+
enum: [1, 2, 3, 4, 5, 6]
|
|
530
|
+
default: 2
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**Kural:** Code-only props, `ai-handoff-export` skill'inin HANDOFF.md çıktısında otomatik olarak listelenmeli. `figma-a11y-audit` skill'i bu props'ları erişilebilirlik denetiminde kullanmalı.
|
|
534
|
+
|
|
535
|
+
## Türkçe Karakter Kuralı (ZORUNLU)
|
|
536
|
+
|
|
537
|
+
Tüm Türkçe metin içeriklerinde (Figma text node, kod string, dokümantasyon) doğru Unicode karakterler kullanılmalıdır. ASCII karşılıkları YASAKTIR:
|
|
538
|
+
|
|
539
|
+
| Doğru | Yanlış | Doğru | Yanlış |
|
|
540
|
+
|-------|--------|-------|--------|
|
|
541
|
+
| ş | s | Ş | S |
|
|
542
|
+
| ı | i | İ | I |
|
|
543
|
+
| ö | o | Ö | O |
|
|
544
|
+
| ü | u | Ü | U |
|
|
545
|
+
| ç | c | Ç | C |
|
|
546
|
+
| ğ | g | Ğ | G |
|
|
547
|
+
|
|
548
|
+
Son adım: Üretilen tüm Türkçe metinleri karakter kontrolünden geçir.
|
|
549
|
+
|
|
550
|
+
## Performans Kuralları
|
|
551
|
+
|
|
552
|
+
- Her `figma_execute` çağrısı küçük ve odaklı olmalı — tek bir işlem (1 collection, 1 bileşen, vb.)
|
|
553
|
+
- `figma_batch_create_variables` tercih et — 10+ variable için tekil çağrılardan çok daha verimli
|
|
554
|
+
- `figma_get_variables` ilk çağrıdan sonra sonucu yeniden kullan
|
|
555
|
+
- Screenshot doğrulamayı her faz sonunda yap, her adımda değil
|
|
556
|
+
|
|
557
|
+
## Dark Mode Token Stratejisi
|
|
558
|
+
|
|
559
|
+
DS kütüphanesinde dark mode desteği **zorunludur**. İki yaklaşım:
|
|
560
|
+
|
|
561
|
+
### Professional+ Plan (Önerilen):
|
|
562
|
+
Semantic collection'a "Dark" mode ekle:
|
|
563
|
+
```
|
|
564
|
+
figma_add_mode(collectionId="<SEMANTIC_ID>", modeName="Dark")
|
|
565
|
+
```
|
|
566
|
+
Sonra her semantic token'ın Dark mode değerini ayarla:
|
|
567
|
+
```js
|
|
568
|
+
// figma_execute
|
|
569
|
+
const semVar = await figma.variables.getVariableByIdAsync("<SEM_VAR_ID>");
|
|
570
|
+
semVar.setValueForMode(darkModeId, { type: "VARIABLE_ALIAS", id: darkPrimVarId });
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### Free Plan Workaround:
|
|
574
|
+
Ayrı "Primitives Dark" collection oluştur:
|
|
575
|
+
1. Aynı token isimleriyle (color/blue/600, color/gray/900 vb.) dark değerler ata
|
|
576
|
+
2. Geliştirici kodda tema'ya göre hangi collection'ı kullanacağını seçer
|
|
577
|
+
3. FLOAT token'lar (spacing, radius, fontSize) aynı değerde kalır
|
|
578
|
+
|
|
579
|
+
### Dark Renk Paleti Rehberi:
|
|
580
|
+
| Light | Dark | Kural |
|
|
581
|
+
|-------|------|-------|
|
|
582
|
+
| Beyaz arka plan | Çok koyu gri (#0F1114) | Saf siyah değil, yumuşak koyu |
|
|
583
|
+
| Koyu metin (#111827) | Açık metin (#F3F4F6) | Ters çevir ama saf beyaz değil |
|
|
584
|
+
| Gri border (#E5E7EB) | Koyu border (#272A30) | Daha az belirgin |
|
|
585
|
+
| Mavi/600 (#2563EB) | Mavi/500 açık (#609EF6) | Daha parlak mavi (koyu yüzeyde okunur) |
|
|
586
|
+
|
|
587
|
+
## Marka Profili Entegrasyonu
|
|
588
|
+
|
|
589
|
+
`.fmcp-brand-profile.json` varsa:
|
|
590
|
+
- `typography` → Display ve body font seçimi Faz 1'de text style oluştururken referans alınır
|
|
591
|
+
- `aestheticDirection` → Faz 2'de dokümantasyon sayfalarının görsel tonunu belirler
|
|
592
|
+
|
|
593
|
+
## Evolution Triggers
|
|
594
|
+
|
|
595
|
+
- Bridge'e yeni batch araçları (ör. batch style oluşturma) eklenirse Faz 1 güncellenmeli
|
|
596
|
+
- Yeni component property türleri desteklenirse Faz 3 güncellenmeli
|
|
597
|
+
- Çoklu dosya desteği eklenirse Faz 2 genişletilmeli
|
|
598
|
+
- `figma_setup_design_tokens` parametreleri değişirse Faz 1 güncellenmeli
|