@atezer/figma-mcp-bridge 1.7.23 → 1.7.25

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.
Files changed (119) hide show
  1. package/.claude-plugin/plugin.json +37 -0
  2. package/.cursor-plugin/plugin.json +21 -0
  3. package/CHANGELOG.md +30 -0
  4. package/README.md +4 -3
  5. package/agents/ds-auditor.md +29 -0
  6. package/agents/screen-builder.md +29 -0
  7. package/agents/token-syncer.md +26 -0
  8. package/assets/logo.png +0 -0
  9. package/commands/add-library.md +122 -0
  10. package/commands/ds-add.md +255 -0
  11. package/commands/ds-sync.md +314 -0
  12. package/commands/implement.md +43 -0
  13. package/commands/install-library.md +73 -0
  14. package/commands/setup.md +26 -0
  15. package/commands/test.md +39 -0
  16. package/commands/update.md +25 -0
  17. package/dist/core/config.d.ts +1 -5
  18. package/dist/core/config.d.ts.map +1 -1
  19. package/dist/core/config.js +11 -111
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/plugin-bridge-server.d.ts.map +1 -1
  22. package/dist/core/plugin-bridge-server.js +1 -2
  23. package/dist/core/plugin-bridge-server.js.map +1 -1
  24. package/dist/core/response-guard.d.ts +1 -1
  25. package/dist/core/response-guard.js +1 -1
  26. package/dist/core/types/index.d.ts +2 -98
  27. package/dist/core/types/index.d.ts.map +1 -1
  28. package/dist/core/version.d.ts +1 -1
  29. package/dist/core/version.js +1 -1
  30. package/dist/local-plugin-only.d.ts.map +1 -1
  31. package/dist/local-plugin-only.js +14 -13
  32. package/dist/local-plugin-only.js.map +1 -1
  33. package/f-mcp-plugin/README.md +8 -15
  34. package/f-mcp-plugin/manifest.json +1 -3
  35. package/hooks/hooks.json +26 -0
  36. package/package.json +15 -31
  37. package/skills/BRAND_PROFILE_SCHEMA.md +113 -0
  38. package/skills/SKILL_INDEX.md +194 -0
  39. package/skills/TOOL_MAPPING.md +111 -0
  40. package/skills/ai-handoff-export/SKILL.md +254 -0
  41. package/skills/apply-figma-design-system/SKILL.md +104 -0
  42. package/skills/audit-figma-design-system/SKILL.md +278 -0
  43. package/skills/code-design-mapper/SKILL.md +370 -0
  44. package/skills/component-documentation/SKILL.md +190 -0
  45. package/skills/design-drift-detector/SKILL.md +407 -0
  46. package/skills/design-system-rules/SKILL.md +407 -0
  47. package/skills/design-token-pipeline/SKILL.md +619 -0
  48. package/skills/ds-impact-analysis/SKILL.md +266 -0
  49. package/skills/figjam-diagram-builder/SKILL.md +172 -0
  50. package/skills/figma-a11y-audit/SKILL.md +587 -0
  51. package/skills/figma-canvas-ops/SKILL.md +325 -0
  52. package/skills/figma-screen-analyzer/SKILL.md +235 -0
  53. package/skills/fix-figma-design-system-finding/SKILL.md +117 -0
  54. package/skills/fmcp-project-rules/SKILL.md +93 -0
  55. package/skills/generate-figma-library/SKILL.md +598 -0
  56. package/skills/generate-figma-screen/SKILL.md +689 -0
  57. package/skills/implement-design/SKILL.md +473 -0
  58. package/skills/ux-copy-guidance/SKILL.md +373 -0
  59. package/skills/visual-qa-compare/SKILL.md +166 -0
  60. package/dist/browser/base.d.ts +0 -50
  61. package/dist/browser/base.d.ts.map +0 -1
  62. package/dist/browser/base.js +0 -6
  63. package/dist/browser/base.js.map +0 -1
  64. package/dist/browser/local.d.ts +0 -81
  65. package/dist/browser/local.d.ts.map +0 -1
  66. package/dist/browser/local.js +0 -283
  67. package/dist/browser/local.js.map +0 -1
  68. package/dist/core/console-monitor.d.ts +0 -82
  69. package/dist/core/console-monitor.d.ts.map +0 -1
  70. package/dist/core/console-monitor.js +0 -428
  71. package/dist/core/console-monitor.js.map +0 -1
  72. package/dist/core/design-system-manifest.d.ts +0 -272
  73. package/dist/core/design-system-manifest.d.ts.map +0 -1
  74. package/dist/core/design-system-manifest.js +0 -261
  75. package/dist/core/design-system-manifest.js.map +0 -1
  76. package/dist/core/enrichment/enrichment-service.d.ts +0 -52
  77. package/dist/core/enrichment/enrichment-service.d.ts.map +0 -1
  78. package/dist/core/enrichment/enrichment-service.js +0 -272
  79. package/dist/core/enrichment/enrichment-service.js.map +0 -1
  80. package/dist/core/enrichment/index.d.ts +0 -8
  81. package/dist/core/enrichment/index.d.ts.map +0 -1
  82. package/dist/core/enrichment/index.js +0 -8
  83. package/dist/core/enrichment/index.js.map +0 -1
  84. package/dist/core/enrichment/relationship-mapper.d.ts +0 -106
  85. package/dist/core/enrichment/relationship-mapper.d.ts.map +0 -1
  86. package/dist/core/enrichment/relationship-mapper.js +0 -352
  87. package/dist/core/enrichment/relationship-mapper.js.map +0 -1
  88. package/dist/core/enrichment/style-resolver.d.ts +0 -80
  89. package/dist/core/enrichment/style-resolver.d.ts.map +0 -1
  90. package/dist/core/enrichment/style-resolver.js +0 -327
  91. package/dist/core/enrichment/style-resolver.js.map +0 -1
  92. package/dist/core/figma-api.d.ts +0 -137
  93. package/dist/core/figma-api.d.ts.map +0 -1
  94. package/dist/core/figma-api.js +0 -274
  95. package/dist/core/figma-api.js.map +0 -1
  96. package/dist/core/figma-desktop-connector.d.ts +0 -242
  97. package/dist/core/figma-desktop-connector.d.ts.map +0 -1
  98. package/dist/core/figma-desktop-connector.js +0 -1042
  99. package/dist/core/figma-desktop-connector.js.map +0 -1
  100. package/dist/core/figma-reconstruction-spec.d.ts +0 -162
  101. package/dist/core/figma-reconstruction-spec.d.ts.map +0 -1
  102. package/dist/core/figma-reconstruction-spec.js +0 -387
  103. package/dist/core/figma-reconstruction-spec.js.map +0 -1
  104. package/dist/core/figma-tools.d.ts +0 -21
  105. package/dist/core/figma-tools.d.ts.map +0 -1
  106. package/dist/core/figma-tools.js +0 -2920
  107. package/dist/core/figma-tools.js.map +0 -1
  108. package/dist/core/snippet-injector.d.ts +0 -24
  109. package/dist/core/snippet-injector.d.ts.map +0 -1
  110. package/dist/core/snippet-injector.js +0 -97
  111. package/dist/core/snippet-injector.js.map +0 -1
  112. package/dist/core/types/enriched.d.ts +0 -213
  113. package/dist/core/types/enriched.d.ts.map +0 -1
  114. package/dist/core/types/enriched.js +0 -6
  115. package/dist/core/types/enriched.js.map +0 -1
  116. package/dist/local.d.ts +0 -73
  117. package/dist/local.d.ts.map +0 -1
  118. package/dist/local.js +0 -2605
  119. package/dist/local.js.map +0 -1
@@ -0,0 +1,689 @@
1
+ ---
2
+ name: generate-figma-screen
3
+ description: Kod veya açıklamadan Figma'da tam ekran/sayfa oluşturur. Yayınlanmış design system bileşenlerini arayıp instance olarak yerleştirir; hardcode değer yerine DS token'larını kullanır. "Figma'da ekran oluştur", "kodu Figma'ya çevir", "landing page çiz", "ekran tasarla", "generate screen", "UI'ı Figma'ya aktar" ifadeleriyle tetiklenir. F-MCP Bridge ve figma_execute gerektirir.
4
+ metadata:
5
+ mcp-server: user-figma-mcp-bridge
6
+ personas:
7
+ - designer
8
+ - uidev
9
+ ---
10
+
11
+ # Generate Figma Screen — Kod/Açıklamadan Figma Ekranı
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 veya metin açıklamasından Figma'da tam sayfa/ekran oluşturur. Temel ilke: hardcode hex renk ve piksel değerleri yerine **yayınlanmış design system** bileşenlerini (component instance), değişkenlerini (variable) ve stillerini (text/effect style) kullanmak.
18
+
19
+ Topluluk `figma-generate-design` skill'inden uyarlanmış, F-MCP Bridge araçlarına göre yeniden yazılmıştır.
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 **ekran** oluşturma/güncelleme (DS bileşen instance'ları ile)
26
+ - Figma'dan **kod** üretmek istiyorsan → [implement-design](../implement-design/SKILL.md)
27
+ - Yeniden kullanılabilir **bileşen/variant** oluşturmak istiyorsan → [generate-figma-library](../generate-figma-library/SKILL.md)
28
+ - Code Connect eşlemesi istiyorsan → [code-design-mapper](../code-design-mapper/SKILL.md)
29
+
30
+ ## Prerequisites
31
+
32
+ - F-MCP Bridge plugin bağlı olmalı
33
+ - Hedef Figma dosyasında yayınlanmış DS bileşenleri (veya team library erişimi) olmalı
34
+ - Kaynak: kod dosyaları veya ekran açıklaması
35
+
36
+ ## F-MCP skill koordinasyonu
37
+
38
+ - **Önce (isteğe bağlı):** `audit-figma-design-system` ile mevcut ekranın DS uyumunu kontrol et
39
+ - **Birlikte:** `figma-canvas-ops` (her `figma_execute` öncesi zorunlu)
40
+ - **Sonra:** `figma-a11y-audit` ile erişilebilirlik kontrolü; `design-drift-detector` ile kod parity'si
41
+
42
+ ## Required Workflow
43
+
44
+ **Bu adımları sırayla uygula. Adım atlama.**
45
+
46
+ ### Step 1: Plugin Bağlantısını Doğrula
47
+
48
+ ```
49
+ figma_get_status()
50
+ ```
51
+
52
+ ### Step 2: Ekranı Anla
53
+
54
+ Figma'ya dokunmadan önce ne inşa edileceğini anla:
55
+
56
+ 1. Koddan oluşturuluyorsa ilgili kaynak dosyaları oku — sayfa yapısı, bölümler, kullanılan bileşenler
57
+ 2. Ekranın ana bölümlerini listele (Header, Hero, Content, Footer vb.)
58
+ 3. Her bölüm için gereken UI bileşenlerini belirle (Button, Input, Card, Nav vb.)
59
+
60
+ ### Step 2.5: Tasarım Yönü Belirleme
61
+
62
+ DS bileşenlerini keşfetmeden ÖNCE, ne inşa edileceğinin estetik yönünü belirle.
63
+
64
+ #### Marka Profili Kontrolü
65
+
66
+ Proje kökünde `.fmcp-brand-profile.json` varsa:
67
+ - `aestheticDirection` → estetik yön zaten tanımlı, kullan
68
+ - `typography.displayFont` / `typography.bodyFont` → font seçimi zaten tanımlı, kullan
69
+ - `typography.rationale` → seçim gerekçesi mevcut
70
+
71
+ #### Profil Yoksa Kullanıcıya Sor
72
+
73
+ **Amaç:** Bu ekran hangi sorunu çözüyor? Kim kullanıyor?
74
+
75
+ **Estetik Yön:** Aşağıdakilerden birini seç veya tanımla:
76
+
77
+ | Yön | Karakteristik | Örnek Referans |
78
+ |-----|--------------|----------------|
79
+ | Brutal minimal | Çok beyaz alan, tek font, siyah-beyaz + tek accent | Stripe, Linear |
80
+ | Maksimalist | Yoğun renk, bold tipografi, katmanlı | Spotify Wrapped, Figma |
81
+ | Retro-futuristik | Neon + karanlık, monospace, grid | Vercel, Terminal |
82
+ | Organik / doğal | Yumuşak köşeler, sıcak renkler, el yapımı his | Notion, Calm |
83
+ | Lüks / rafine | Serif font, düşük kontrast, çok whitespace | Apple, Aesop |
84
+ | Playful / oyunsu | Renkli, yuvarlak, büyük tipografi | Duolingo, Slack |
85
+ | Editorial / dergi | Grid bazlı, image-heavy, typographic | Medium, NYT |
86
+ | Brutalist / ham | Kırık grid, mono font, minimal dekorasyon | Bloomberg, Craigslist |
87
+ | Soft / pastel | Hafif renkler, yumuşak gölgeler, rounded | Headspace, Airbnb |
88
+ | Industrial / utiliteryen | Fonksiyonel, data-dense, utility-first | GitHub, Grafana |
89
+
90
+ **Kısıtlamalar:** Teknik gereksinimler (framework, performans, a11y)
91
+
92
+ **Farklılaşma:** Bu ekranı unutulmaz yapan tek şey ne?
93
+
94
+ > **DS bileşen kütüphanesi olan projelerde:** Estetik yön DS'nin belirlediği sınırlar içinde olmalı. DS font, renk ve spacing kararlarını zaten vermiştir. Bu adım DS'yi *aşmak* için değil, DS bileşenlerini *nasıl compose edeceğini* yönlendirmek içindir.
95
+
96
+ #### Tipografi Stratejisi
97
+
98
+ | Durum | Font Seçimi |
99
+ |-------|-------------|
100
+ | Marka profili var | `typography.displayFont` + `typography.bodyFont` kullan |
101
+ | DS font'ları var | DS font'larını kullan (Inter DS font'uysa Inter DOĞRU — Anti-pattern DEĞİL) |
102
+ | Ne DS ne profil var | Ayırt edici display font seç (Satoshi, Clash Display, General Sans vb.) + okunaklı body font |
103
+
104
+ - Display font: başlıklar, hero text, sayfa title
105
+ - Body font: paragraflar, açıklamalar, form etiketleri
106
+ - Font çifti kararını raporda belirt (neden bu çift?)
107
+
108
+ ### Step 3: Design System Keşfi (Cache-First Stratejisi)
109
+
110
+ Üç şey gerekiyor: **bileşenler**, **variable'lar**, **stiller**.
111
+
112
+ **CACHE-FIRST KURALI (ZORUNLU):** Figma API'ye gitmeden önce `.claude/libraries/<ds>.md` dosyasını kontrol et. Cache varsa:
113
+ - Text style key'leri → cache'den oku (API çağrısı yapma)
114
+ - Variable key'leri → cache'den oku
115
+ - Component key'leri + override notları → cache'den oku
116
+ - Font ailesi → cache'den oku
117
+
118
+ Cache yoksa veya eksikse → keşif yap, sonucu cache'e yaz. **Bu, sonraki oturumlarda token tüketimini %60-70 düşürür.**
119
+
120
+ #### Kütüphane Cache Şablonu
121
+
122
+ Her DS kütüphanesi `.claude/libraries/<ds>.md` dosyasında şu bölümleri içermeli:
123
+
124
+ ```markdown
125
+ ### Text Style Key Cache (importStyleByKeyAsync ile kullan)
126
+ | Style Adı | Font | Size | Key |
127
+ |-----------|------|------|-----|
128
+ | heading/h1 | Bold | 32 | `abc123...` |
129
+ | body/regular | Regular | 14 | `def456...` |
130
+
131
+ ### Effect Style Key Cache
132
+ | Style Adı | Key |
133
+ |-----------|-----|
134
+ | shadow/card | `ghi789...` |
135
+
136
+ ### Sık Kullanılan Variable Key Cache
137
+ **Renkler:**
138
+ | Variable | Key |
139
+ |----------|-----|
140
+ | bg/primary | `jkl012...` |
141
+
142
+ **Boyutlar:**
143
+ | Variable | Key |
144
+ |----------|-----|
145
+ | spacing/md | `mno345...` |
146
+
147
+ ### Sık Kullanılan Component Key Cache
148
+ | Bileşen | Key | Override Notları |
149
+ |---------|-----|------------------|
150
+ | Button | `pqr678...` | `Label#id` → TEXT property |
151
+ | Input | `stu901...` | Label → nested text (findOne) |
152
+ ```
153
+
154
+ **Cache oluşturma:** İlk ekran oluşturmada `figma_get_styles`, `figma_get_variables(summary)` ve `componentProperties` ile key'leri topla, `.claude/libraries/<ds>.md`'ye yaz. Sonraki oturumlarda direkt cache'den oku.
155
+
156
+ #### 3a: Bileşen keşfi
157
+
158
+ **Tercih: önce mevcut ekranları incele.** Dosyada aynı DS'yi kullanan ekranlar varsa, `figma_execute` ile mevcut instance'ları tara:
159
+
160
+ ```js
161
+ const frame = figma.currentPage.findOne(n => n.name === "Mevcut Ekran");
162
+ const uniqueSets = new Map();
163
+ frame.findAll(n => n.type === "INSTANCE").forEach(inst => {
164
+ const mc = inst.mainComponent;
165
+ const cs = mc?.parent?.type === "COMPONENT_SET" ? mc.parent : null;
166
+ const key = cs ? cs.key : mc?.key;
167
+ const name = cs ? cs.name : mc?.name;
168
+ if (key && !uniqueSets.has(key)) {
169
+ uniqueSets.set(key, { name, key, isSet: !!cs, sampleVariant: mc.name });
170
+ }
171
+ });
172
+ return [...uniqueSets.values()];
173
+ ```
174
+
175
+ Mevcut ekran yoksa `figma_search_components` ve `figma_get_design_system_summary` kullan. **Geniş ara** — birden fazla terim dene:
176
+
177
+ ```
178
+ figma_search_components(query="button", currentPageOnly=false)
179
+ figma_search_components(query="input", currentPageOnly=false)
180
+ figma_search_components(query="card", currentPageOnly=false)
181
+ ```
182
+
183
+ #### 3b: Variable keşfi
184
+
185
+ ```
186
+ figma_get_variables(verbosity="summary")
187
+ ```
188
+
189
+ Renk, spacing, radius token'larını not al. Gerekirse `verbosity="full"` ile detay al.
190
+
191
+ #### 3c: Stil keşfi
192
+
193
+ ```
194
+ figma_get_styles()
195
+ ```
196
+
197
+ Text style ve effect style'ları not al.
198
+
199
+ #### 3d: DS Variable Key'lerini Hazırla (ZORUNLU)
200
+
201
+ Ekran oluşturmadan önce kullanılacak tüm DS token'larının **variable key'lerini** topla. Bu adım atlanamaz.
202
+
203
+ 1. **Kütüphane dosyasını oku:** `.claude/libraries/` dizinindeki kütüphane dosyasından font ailesi, variable collection ve text style bilgilerini al.
204
+ 2. **DS dosyasında variable key'lerini çek:** Ekranda kullanılacak renk, spacing, text style token'larının key'lerini DS dosyasında `figma_execute` ile oku:
205
+ ```js
206
+ // DS dosyasında çalıştır (fileKey = DS dosyasının file key'i)
207
+ const varIds = ["VariableID:...", "VariableID:..."];
208
+ const result = [];
209
+ for (const id of varIds) {
210
+ const v = await figma.variables.getVariableByIdAsync(id);
211
+ if (v) result.push({ name: v.name, key: v.key, type: v.resolvedType });
212
+ }
213
+ return result;
214
+ ```
215
+ 3. **Text style ID'lerini çek:** DS dosyasında text style'ları al:
216
+ ```js
217
+ // DS dosyasında çalıştır
218
+ const styles = await figma.getLocalTextStylesAsync();
219
+ return styles.map(s => ({ id: s.id, name: s.name, key: s.key }));
220
+ ```
221
+ 4. **Font ailesi:** Kütüphane dosyasındaki `Font Ailesi` alanından oku. Bulunamazsa kullanıcıya sor. Kullanıcı "sen seç" derse `Inter` kullan.
222
+
223
+ Bu adımda toplanan key'ler, sonraki adımlarda `importVariableByKeyAsync` ile hedef dosyaya import edilecek.
224
+
225
+ ### Step 4: Boş Alan Bul ve Wrapper Frame Oluştur
226
+
227
+ ```js
228
+ const children = figma.currentPage.children;
229
+ let maxX = 0;
230
+ children.forEach(c => {
231
+ const right = c.x + c.width;
232
+ if (right > maxX) maxX = right;
233
+ });
234
+
235
+ // DS'den arka plan ve spacing variable'larını import et
236
+ const bgVar = await figma.variables.importVariableByKeyAsync("SURFACE_BG_KEY");
237
+ const paddingVar = await figma.variables.importVariableByKeyAsync("SPACING_KEY");
238
+
239
+ const frame = figma.createFrame();
240
+ frame.name = "Ekran Adı";
241
+ frame.x = maxX + 100;
242
+ frame.y = 0;
243
+ frame.resize(1440, 900); // Masaüstü varsayılan; mobil için 390x844
244
+ frame.layoutMode = "VERTICAL";
245
+ frame.primaryAxisSizingMode = "AUTO";
246
+ frame.counterAxisSizingMode = "FIXED";
247
+
248
+ // Arka plan rengini DS variable'ına BAĞLA (hardcoded renk YAZMA)
249
+ const fills = [{type: "SOLID", color: {r:1,g:1,b:1}}]; // geçici
250
+ const boundFill = figma.variables.setBoundVariableForPaint(fills[0], "color", bgVar);
251
+ frame.fills = [boundFill];
252
+
253
+ // Padding'i DS variable'ına BAĞLA
254
+ frame.setBoundVariable("paddingLeft", paddingVar);
255
+ frame.setBoundVariable("paddingRight", paddingVar);
256
+ frame.setBoundVariable("paddingTop", paddingVar);
257
+ frame.setBoundVariable("paddingBottom", paddingVar);
258
+
259
+ return { frameId: frame.id, position: { x: frame.x, y: frame.y } };
260
+ ```
261
+
262
+ ### Step 5: Bölüm Bölüm İnşa Et
263
+
264
+ **Her bölümü ayrı bir `figma_execute` çağrısında oluştur.** Tek çağrıda tüm ekranı oluşturmaya ÇALIŞMA.
265
+
266
+ Sıra: Üstten alta — Header → Hero → Content → Footer
267
+
268
+ Her bölüm için:
269
+
270
+ 1. `figma_execute` ile bölüm frame'ini oluştur, DS bileşen instance'larını yerleştir
271
+ 2. **Tüm renkleri `setBoundVariableForPaint` ile DS variable'ına bağla** — hardcoded renk kullanma
272
+ 3. **Tüm spacing/padding/radius değerlerini `setBoundVariable` ile bağla** — hardcoded sayı kullanma
273
+ 4. **Metin node'larına text style ata:** `setTextStyleIdAsync` ile DS text style'ını uygula — hardcoded fontSize/fontName kullanma
274
+ 5. Oluşturulan node ID'lerini return et
275
+ 6. `figma_capture_screenshot` ile görsel doğrulama — boundVariables bağlı mı kontrol et
276
+
277
+ **Metin oluşturma kalıbı (DS'e bağlı):**
278
+
279
+ ```js
280
+ await figma.loadFontAsync({ family: "DS_FONT", style: "Regular" });
281
+ const textColorVar = await figma.variables.importVariableByKeyAsync("TEXT_COLOR_KEY");
282
+
283
+ const text = figma.createText();
284
+ text.characters = "Metin içeriği";
285
+
286
+ // Text style uygula (fontSize, fontName, lineHeight hep style'dan gelir)
287
+ await text.setTextStyleIdAsync("TEXT_STYLE_ID");
288
+
289
+ // Metin rengini DS variable'ına bağla
290
+ const textFills = [...text.fills];
291
+ const boundTextFill = figma.variables.setBoundVariableForPaint(textFills[0], "color", textColorVar);
292
+ text.fills = [boundTextFill];
293
+ ```
294
+
295
+ **Loading State Karar Ağacı:**
296
+
297
+ Dinamik içerik barındıran her öğe için uygun loading pattern'ını belirle:
298
+
299
+ | Beklenen Yüklenme Süresi | Loading Pattern | Kullanım |
300
+ |--------------------------|----------------|----------|
301
+ | < 1 saniye | Yok (anlık) | Statik içerik, önbellekli veri |
302
+ | 1-3 saniye | Spinner | Buton, küçük widget, tek alan |
303
+ | 3-10 saniye | Skeleton | Kart, liste, metin bloğu, görsel |
304
+ | > 10 saniye | Progress bar | Dosya yükleme, toplu işlem |
305
+
306
+ **Skeleton türleri:**
307
+ - Metin bloğu → `skeleton-text` (tam genişlik × 16px, 2-3 satır)
308
+ - Başlık → `skeleton-title` (200px × 24px)
309
+ - Avatar/ikon → `skeleton-circle` (pulse animasyonlu daire)
310
+ - Kart → `skeleton-card` (başlık + 2 satır metin + görsel alanı)
311
+ - Tablo/liste → `skeleton-row` (satır bazlı tekrarlayan skeleton)
312
+
313
+ **Instance oluşturma kalıbı:**
314
+
315
+ ```js
316
+ // figma_instantiate_component aracını kullan veya figma_execute içinde:
317
+ const component = figma.root.findOne(
318
+ n => n.type === "COMPONENT" && n.name === "Button"
319
+ );
320
+ const instance = component.createInstance();
321
+ parentFrame.appendChild(instance);
322
+ // FILL boyutlandırmayı appendChild'DAN SONRA ayarla
323
+ instance.layoutSizingHorizontal = "FILL";
324
+ ```
325
+
326
+ **Tercihen `figma_instantiate_component` aracını kullan** — daha güvenli ve basit.
327
+
328
+ ### Step 5.1: Gestalt İlkeleri ile Spacing Kararları (ZORUNLU)
329
+
330
+ Tek bir `itemSpacing` ile tüm bölümü dizme — **YANLIŞ**. Spacing kararlarında tüm tasarım ilkelerini sentezle:
331
+
332
+ **Gestalt Proximity:** İlişkili öğeler yakın, ilişkisiz öğeler uzak.
333
+ ```
334
+ Card içi mantıksal gruplar (nested frame ile):
335
+ ├── Header Group (title + subtitle) → iç gap: küçük (sp-050 ~ sp-100)
336
+ ├── Form Group (inputs + checkbox) → iç gap: küçük-orta (sp-100 ~ sp-150)
337
+ ├── Action Group (button + register link) → iç gap: küçük (sp-100 ~ sp-150)
338
+ ├── Social Group (divider + social buttons + legal) → iç gap: küçük-orta (sp-150)
339
+ └── Gruplar arası gap: BÜYÜK (sp-300 ~ sp-400)
340
+ ```
341
+
342
+ **Similarity:** Aynı işlevi gören öğeler aynı text style, renk ve boyutta olmalı.
343
+ **Hierarchy:** Büyük/bold = önemli (başlık, CTA), küçük/light = ikincil (legal text, açıklama).
344
+ **Contrast:** CTA butonu ve önemli öğeler arka plandan ayrışmalı.
345
+ **Alignment:** Tutarlı hizalama ile düzen hissi — tüm child'lar `layoutSizingHorizontal="FILL"` (appendChild SONRA).
346
+ **White Space:** Nefes aldıran boşluklar — ne çok sıkışık ne çok dağınık.
347
+
348
+ ### Step 5.15: DS Bileşen Kullanım Kuralı (ZORUNLU)
349
+
350
+ **Önce DS'te o işlevi karşılayan bileşen variant'ını ara. DS'te varsa bileşeni kullan, yoksa raw node oluştur.**
351
+
352
+ | İhtiyaç | YANLIŞ (raw node) | DOĞRU (DS bileşen) |
353
+ |---------|-------------------|---------------------|
354
+ | Link text | Text node + Text/link rengi | Button(Type=Link) instance |
355
+ | İkon göstermek | Rectangle + SVG path | İkon component instance |
356
+ | Ayırıcı çizgi | Rectangle 1px yükseklik | Divider component instance |
357
+ | Placeholder input | Text node + gri renk | Input component doğru variant |
358
+ | Toggle | Checkbox + custom logic | Switch component instance |
359
+
360
+ **Kural:** Ekrana koyacağın her UI öğesi için şu soruyu sor: "DS'te bu işlevi karşılayan bileşen var mı?"
361
+ - **Evet →** DS bileşenini kullan, variant/property'lerini ayarla (öncelikli)
362
+ - **Hayır →** Raw node oluştur (DS'te yoksa geçerli yol)
363
+
364
+ **Uygulama:** Ekran oluşturmadan önce (Step 3) DS bileşen kataloğunu tara. `.claude/libraries/<ds>.md` dosyasındaki bileşen listesini kontrol et. Link, divider, hint, badge gibi yardımcı öğeler için de mutlaka bileşen ara.
365
+
366
+ ### Step 5.16: Auto-Layout Sizing Kuralları (ZORUNLU)
367
+
368
+ **Tüm child node'lar `layoutSizingHorizontal = "FILL"` olmalı (appendChild SONRASI).** `layoutAlign = "STRETCH"` kullanma — tutarsız davranır.
369
+
370
+ ```js
371
+ // DOĞRU: appendChild sonra FILL
372
+ parentFrame.appendChild(child);
373
+ child.layoutSizingHorizontal = "FILL";
374
+
375
+ // YANLIŞ: layoutAlign = "STRETCH"
376
+ child.layoutAlign = "STRETCH"; // tutarsız, kullanma
377
+ ```
378
+
379
+ **İstisnalar:**
380
+ - **Horizontal row içindeki text node'lar:** `layoutSizingHorizontal = "HUG"` — FILL yaparsan text kesilir
381
+ - **Logo instance:** HUG veya FIXED — doğal boyutunda kalsın
382
+ - **layoutGrow = 1:** Horizontal row'da eşit genişlik paylaşımı için (divider'lar gibi)
383
+
384
+ **Card yapısı:**
385
+ ```
386
+ Screen: VERTICAL, counterAxis=CENTER, layoutSizingVertical=HUG
387
+ ├── Logo: HUG (doğal boyut)
388
+ ├── Card: FILL (appendChild SONRA) ← ekran padding ile genişlik kontrol edilir
389
+ │ ├── Title text: FILL
390
+ │ ├── Form Group: FILL
391
+ │ │ ├── Input instance: FILL
392
+ │ │ ├── Input instance: FILL
393
+ │ │ └── Horizontal Row: FILL
394
+ │ │ ├── Checkbox: HUG
395
+ │ │ └── Button(Link): HUG
396
+ │ ├── Action Group: FILL
397
+ │ │ ├── Button(Primary): FILL
398
+ │ │ └── Horizontal Row: FILL
399
+ │ │ ├── Text: HUG
400
+ │ │ └── Button(Link): HUG
401
+ │ └── Social Group: FILL
402
+ │ ├── Divider Row: FILL
403
+ │ ├── Social Button: FILL
404
+ │ └── Legal text: FILL
405
+ └── Bottom text: FILL
406
+ ```
407
+
408
+ **Responsive:** Ekran genişliği FIXED (1280/768/375) veya Breakpoints/Screen token'a bound. Mode (Web/Tablet/Mobil) padding ve gap değerlerini kontrol eder → card otomatik uyar.
409
+
410
+ **Mode adı eşleşmesi DİKKAT:** `indexOf("Web")` "Mobil & Web Mobil"i de yakalar. `indexOf("Desktop")` kullan.
411
+
412
+ ### Step 5.2: Instance Override Rehberi (ZORUNLU)
413
+
414
+ **Component PROPERTY (TEXT/BOOLEAN/VARIANT tipi) → `setProperties`:**
415
+ ```js
416
+ btn.setProperties({"Value#44:2": "Buton Metni"});
417
+ ```
418
+
419
+ **NESTED TEXT (property olarak expose edilmemiş) → `findOne`:**
420
+ ```js
421
+ var label = instance.findOne(function(n){
422
+ return n.type==="TEXT" && n.name==="Label";
423
+ });
424
+ if(label){
425
+ await figma.loadFontAsync(label.fontName);
426
+ label.characters = "Yeni Metin";
427
+ }
428
+ ```
429
+
430
+ **Kural:** Property mi nested mi bilmiyorsan → önce `componentProperties` oku. Orada yoksa `findOne` kullan. Hiçbir instance'ta "Label", "Value", "Button" gibi default text bırakma.
431
+
432
+ ### Step 5.3: API Gotcha Tablosu (EZBERLE)
433
+
434
+ | İşlem | DOĞRU API | YANLIŞ (HATA VERİR) |
435
+ |-------|-----------|---------------------|
436
+ | Fill/stroke renk bind | `setBoundVariableForPaint(paint, "color", var)` | `setBoundVariable("fills", 0, var)` |
437
+ | Text style ata | `await node.setTextStyleIdAsync(style.id)` | `node.fontSize = 24` veya fontSize variable |
438
+ | Effect style ata | `await node.setEffectStyleIdAsync(style.id)` | `node.effectStyleId = style.id` |
439
+ | Dark mode set | Library API chain → collection OBJECT | String collection ID |
440
+ | Sayfa geçişi | `await figma.setCurrentPageAsync(page)` | `figma.currentPage = page` |
441
+ | FILL sizing | appendChild SONRA `layoutSizingHorizontal = "FILL"` | appendChild ÖNCE |
442
+ | Function adı | `async function g(k){}` | Arrow fn ile `import` keyword (reserved) |
443
+
444
+ ### Step 5.4: Referans Sadakati
445
+
446
+ Kullanıcı referans ekran (screenshot, canlı site) paylaştıysa:
447
+ - Card genişliği, renk tonu, border stili, spacing oranlarını kopyala
448
+ - Kendi yorumunu ekleme — referansa sadık kal
449
+ - Emin olmadığın kararlardan önce kullanıcıya sor
450
+
451
+ ### Step 5.5: Görsel Derinlik ve Detay (İsteğe Bağlı)
452
+
453
+ Estetik yön belirlendiyse (Step 2.5), bölüm inşa sırasında şu detaylar eklenebilir:
454
+
455
+ **Spatial Composition:**
456
+ - Asimetrik layout: her bölüm aynı grid'e sıkışmasın
457
+ - Overlap: öğeler arasında kasıtlı örtüşme (hero image + text overlay)
458
+ - Negatif alan: dramatik boşluk CTA'yı öne çıkarır
459
+
460
+ **Arka Plan ve Atmosfer:**
461
+ - Düz renk yerine: subtle gradient, noise doku, geometrik pattern
462
+ - Katmanlı transparan: overlay + backdrop-blur efektleri
463
+ - Gölge derinliği: elevation token'larını kullan (sm → xl)
464
+
465
+ **Dekoratif Detaylar:**
466
+ - Border: dekoratif border (dashed, gradient border)
467
+ - İkon: mono-weight ikon seti tutarlılığı
468
+ - Mikro detaylar: buton iç gölge, kart hover efekti ipucu
469
+
470
+ > **NOT:** Bu öneriler DS bileşen kütüphanesi varsa DS'nin izin verdiği ölçüde uygulanır. DS token'ları dışında hardcoded değer eklenmez.
471
+
472
+ ### Step 6: Görsel Doğrulama
473
+
474
+ ```
475
+ figma_capture_screenshot(nodeId="wrapper-frame-id")
476
+ ```
477
+
478
+ Screenshot'ı incele:
479
+ - Bölümler doğru sırada mı?
480
+ - Spacing ve hizalama tutarlı mı?
481
+ - Renk ve tipografi DS'ye uygun mu?
482
+
483
+ **Anti-Pattern Kontrolü** (screenshot'a bakarak):
484
+ - ❌ Generic font mu kullanılmış? (DS font'u yokken Inter/Roboto/Arial)
485
+ - ❌ Mor gradient + beyaz arka plan? (klişe AI estetiği)
486
+ - ❌ Tahmin edilebilir grid? (12-col, hep aynı padding, her bölüm aynı)
487
+ - ❌ Her ekran birbirinin kopyası mı? (aynı layout, renk, font)
488
+ - ❌ "Bu bir AI'ın ürettiği gibi mi görünüyor?" → Evet ise revizyona dön
489
+
490
+ Sorun varsa hedefli `figma_execute` ile düzelt.
491
+
492
+ ### Step 7: Güncelleme Senaryosu
493
+
494
+ Mevcut bir ekranı güncellerken:
495
+
496
+ 1. `figma_get_file_data` ile mevcut yapıyı oku
497
+ 2. `figma_get_design_context` ile değişecek bölümü analiz et
498
+ 3. Yalnızca değişen bölümü yeniden oluştur veya güncelle
499
+ 4. Tüm ekranı baştan oluşturmaktan kaçın
500
+
501
+ ## Türkçe Karakter Kuralı (ZORUNLU)
502
+
503
+ 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:
504
+
505
+ | Doğru | Yanlış | Doğru | Yanlış |
506
+ |-------|--------|-------|--------|
507
+ | ş | s | Ş | S |
508
+ | ı | i | İ | I |
509
+ | ö | o | Ö | O |
510
+ | ü | u | Ü | U |
511
+ | ç | c | Ç | C |
512
+ | ğ | g | Ğ | G |
513
+
514
+ Son adım: Üretilen tüm Türkçe metinleri karakter kontrolünden geçir.
515
+
516
+ ## Performans Kuralları
517
+
518
+ - Aynı oturumda `figma_get_variables(verbosity="full")` birden fazla çağırma — ilk sonucu kullan. `verbosity="full"` 500K+ karakter üretir, **asla full kullanma** — `summary` yeterli.
519
+ - `figma_search_components`: varsayılan `currentPageOnly=true`; `false` yalnızca gerektiğinde (timeout riski)
520
+ - Her `figma_execute` çağrısı küçük ve odaklı olmalı — 50+ satır kod riski yüksek
521
+ - **Asla 3 paralel agent çalıştırma** — gereksiz token tüketir. Key'ler `.claude/libraries/` dosyasında cache'liyse agent bile gereksiz.
522
+ - **Performans bütçesi:** Ekran başına ≤5 figma_execute (3 core + 1 hata buffer + 1 doğrulama), <130K token hedefi. Cache'li çalışmada <100K.
523
+ - **Timeout:** 1-5 node → 5000ms | 6-12 node → 10000ms | 13+ node → 15-30000ms veya işlemi böl
524
+
525
+ ## Responsive Boyut Presetleri (ZORUNLU)
526
+
527
+ Her ekran **minimum 3 boyutta** oluşturulmalı:
528
+
529
+ | Cihaz | Genişlik | Yükseklik | Padding | Notlar |
530
+ |-------|---------|-----------|---------|--------|
531
+ | Mobile | 390px | HUG | 24px | iPhone 14 referans. Touch target min 44px |
532
+ | Tablet | 768px | HUG | 120px | iPad referans. İçerik max 528px genişlik |
533
+ | Web | 1440px | HUG | 480px | Desktop referans. İçerik max 480px genişlik |
534
+
535
+ **Uygulama (3 adım):**
536
+
537
+ **Adım 1: Breakpoint token'ları oluştur (bir kerelik)**
538
+
539
+ Primitives collection'a ekran boyut token'ları ekle:
540
+ ```
541
+ screen/mobile-width: 390 screen/tablet-width: 768 screen/web-width: 1440
542
+ screen/tablet-padding: 120 screen/web-padding: 480
543
+ screen/top-padding-mobile: 80 screen/top-padding-tablet: 160
544
+ screen/bottom-padding: 40
545
+ ```
546
+
547
+ Semantic collection'a alias'lar ekle:
548
+ ```
549
+ layout/screen-mobile-width → screen/mobile-width
550
+ layout/screen-tablet-width → screen/tablet-width
551
+ layout/screen-web-width → screen/web-width
552
+ layout/screen-tablet-padding → screen/tablet-padding
553
+ layout/screen-web-padding → screen/web-padding
554
+ ```
555
+
556
+ **Adım 2: Ekranları oluştur ve klonla**
557
+
558
+ ```js
559
+ // figma_execute — Mobile (master)
560
+ const mobile = figma.createFrame();
561
+ mobile.name = "Screen / Mobile";
562
+ mobile.layoutMode = "VERTICAL";
563
+ // ... içerik ekle ...
564
+ ```
565
+
566
+ Tablet ve Web klonla → resize et.
567
+
568
+ **Adım 3: Ekran boyutlarını token'lara bağla (ZORUNLU)**
569
+
570
+ Her ekranın width ve padding'i variable'a bağlanmalı. Hard-coded değer KABUL EDİLMEZ:
571
+
572
+ ```js
573
+ // figma_execute — Token binding (her ekran için)
574
+ const semVars = {}; // semantic variable'ları yükle
575
+
576
+ // Mobile
577
+ const mobile = await figma.getNodeByIdAsync("<MOBILE_ID>");
578
+ mobile.setBoundVariable("width", semVars["layout/screen-mobile-width"]);
579
+ mobile.setBoundVariable("paddingLeft", semVars["layout/page-padding"]);
580
+ mobile.setBoundVariable("paddingRight", semVars["layout/page-padding"]);
581
+ mobile.setBoundVariable("paddingTop", semVars["layout/screen-top-padding-mobile"]);
582
+ mobile.setBoundVariable("paddingBottom", semVars["layout/screen-bottom-padding"]);
583
+
584
+ // Tablet
585
+ const tablet = await figma.getNodeByIdAsync("<TABLET_ID>");
586
+ tablet.setBoundVariable("width", semVars["layout/screen-tablet-width"]);
587
+ tablet.setBoundVariable("paddingLeft", semVars["layout/screen-tablet-padding"]);
588
+ tablet.setBoundVariable("paddingRight", semVars["layout/screen-tablet-padding"]);
589
+ tablet.setBoundVariable("paddingTop", semVars["layout/screen-top-padding-tablet"]);
590
+
591
+ // Web
592
+ const web = await figma.getNodeByIdAsync("<WEB_ID>");
593
+ web.setBoundVariable("width", semVars["layout/screen-web-width"]);
594
+ web.setBoundVariable("paddingLeft", semVars["layout/screen-web-padding"]);
595
+ web.setBoundVariable("paddingRight", semVars["layout/screen-web-padding"]);
596
+ ```
597
+
598
+ **Min Height bağlama (ZORUNLU):**
599
+
600
+ Ekranın minimum yüksekliği de token'a bağlanmalı. Figma'da "Fixed height (900)" yerine "Add min height..." → "Apply variable..." kullanılmalı:
601
+
602
+ ```js
603
+ // Her ekran için minHeight bağla
604
+ mobile.setBoundVariable("minHeight", primVars["screen/mobile-height"]); // 844
605
+ tablet.setBoundVariable("minHeight", primVars["screen/tablet-height"]); // 1024
606
+ web.setBoundVariable("minHeight", primVars["screen/web-height"]); // 900
607
+ ```
608
+
609
+ **Kural:** Figma'da tüm boyut değerleri (width, minHeight, padding) "Apply variable..." ile token bağlı görünmeli. Hard-coded değer KABUL EDİLMEZ. Bu, breakpoint değiştiğinde tüm ekranların otomatik güncellenmesini sağlar.
610
+
611
+ ## Dark Mode (ZORUNLU)
612
+
613
+ Her ekran **Light ve Dark** tema olarak oluşturulmalı.
614
+
615
+ ### Free Plan (1 mode sınırı):
616
+ Ayrı "Primitives Dark" collection oluştur, aynı token isimleriyle dark değerler ver. Ekranı klonla ve dark renkleri uygula:
617
+
618
+ ```js
619
+ // figma_execute — Dark mode uygulama
620
+ const lightScreen = await figma.getNodeByIdAsync("<LIGHT_NODE_ID>");
621
+ const darkScreen = lightScreen.clone();
622
+ darkScreen.name = lightScreen.name + " / Dark";
623
+ // Arka planı dark yapSet background and traverse children to apply dark palette
624
+ ```
625
+
626
+ ### Professional+ Plan (çoklu mode):
627
+
628
+ Light ekranı klonla, collection OBJECT ile mode set et. **String ID çalışmaz — library API chain zorunlu:**
629
+
630
+ ```js
631
+ // 1. Collection object al
632
+ var colls = await figma.teamLibrary.getAvailableLibraryVariableCollectionsAsync();
633
+ var semCol = colls.find(function(c){ return c.name.indexOf("Semantic Colors") !== -1; });
634
+ var vars = await figma.teamLibrary.getVariablesInLibraryCollectionAsync(semCol.key);
635
+ var firstVar = await figma.variables.importVariableByKeyAsync(vars[0].key);
636
+ var localColl = await figma.variables.getVariableCollectionByIdAsync(firstVar.variableCollectionId);
637
+ var darkMode = localColl.modes.find(function(m){ return m.name === "Dark"; });
638
+
639
+ // 2. Dark ekrana set et
640
+ dark.setExplicitVariableModeForCollection(localColl, darkMode.modeId);
641
+ ```
642
+
643
+ ### Semantic Sizes Mode Binding (ZORUNLU)
644
+
645
+ Her ekran frame'inde Semantic Sizes collection'a da mode set edilmeli. Figma Appearance panelinde hem renk hem boyut mode'u görünmeli:
646
+
647
+ ```js
648
+ // Semantic Sizes collection object al (aynı chain)
649
+ var sizeColls = await figma.teamLibrary.getAvailableLibraryVariableCollectionsAsync();
650
+ var semSize = sizeColls.find(function(c){ return c.name.indexOf("Semantic Sizes") !== -1; });
651
+ var sizeVars = await figma.teamLibrary.getVariablesInLibraryCollectionAsync(semSize.key);
652
+ var sizeFirst = await figma.variables.importVariableByKeyAsync(sizeVars[0].key);
653
+ var localSizeColl = await figma.variables.getVariableCollectionByIdAsync(sizeFirst.variableCollectionId);
654
+
655
+ var webMode = localSizeColl.modes.find(function(m){ return m.name.indexOf("Web Desktop") !== -1; });
656
+ var tabletMode = localSizeColl.modes.find(function(m){ return m.name.indexOf("Tablet") !== -1; });
657
+ var mobilMode = localSizeColl.modes.find(function(m){ return m.name.indexOf("Mobil") !== -1; });
658
+
659
+ // Her ekrana size mode set et
660
+ webScreen.setExplicitVariableModeForCollection(localSizeColl, webMode.modeId);
661
+ tabletScreen.setExplicitVariableModeForCollection(localSizeColl, tabletMode.modeId);
662
+ mobileScreen.setExplicitVariableModeForCollection(localSizeColl, mobilMode.modeId);
663
+ ```
664
+
665
+ **Sonuç:** Her ekranın Figma Appearance panelinde:
666
+ - Semantic Colors → Light / Dark
667
+ - Semantic Sizes → Web Desktop / Tablet / Mobil & Web Mobil
668
+ - W alanı → breakpoint token'ına bound
669
+
670
+ ### Toplam Ekran Matrisi:
671
+ ```
672
+ Mobile Light | Mobile Dark
673
+ Tablet Light | Tablet Dark
674
+ Web Light | Web Dark
675
+ = 6 ekran minimum
676
+ ```
677
+
678
+ ## Çıktı Formatı
679
+
680
+ - Oluşturulan tüm ekranların Figma node ID'leri (6 ekran)
681
+ - DS uyum özeti (kaç instance, kaç variable bağlı)
682
+ - Responsive doğrulama: her boyutta screenshot
683
+ - Dark/Light tema screenshot karşılaştırma
684
+
685
+ ## Evolution Triggers
686
+
687
+ - Bridge'e asset arama veya otomatik ekran üretme aracı eklenirse paralel iş akışı eklenmeli
688
+ - Yeni bileşen instance araçları eklenirse Step 5 kalıbı güncellenmeli
689
+ - Mobil platform desteği genişletilirse boyut presetleri eklenmeli