@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.
- package/.claude-plugin/plugin.json +37 -0
- package/.cursor-plugin/plugin.json +21 -0
- package/CHANGELOG.md +30 -0
- package/README.md +4 -3
- package/agents/ds-auditor.md +29 -0
- package/agents/screen-builder.md +29 -0
- package/agents/token-syncer.md +26 -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/config.d.ts +1 -5
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -111
- package/dist/core/config.js.map +1 -1
- package/dist/core/plugin-bridge-server.d.ts.map +1 -1
- package/dist/core/plugin-bridge-server.js +1 -2
- package/dist/core/plugin-bridge-server.js.map +1 -1
- package/dist/core/response-guard.d.ts +1 -1
- package/dist/core/response-guard.js +1 -1
- package/dist/core/types/index.d.ts +2 -98
- package/dist/core/types/index.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 +14 -13
- package/dist/local-plugin-only.js.map +1 -1
- package/f-mcp-plugin/README.md +8 -15
- package/f-mcp-plugin/manifest.json +1 -3
- package/hooks/hooks.json +26 -0
- package/package.json +15 -31
- 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 +254 -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 +190 -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 +172 -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 +235 -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 +373 -0
- package/skills/visual-qa-compare/SKILL.md +166 -0
- package/dist/browser/base.d.ts +0 -50
- package/dist/browser/base.d.ts.map +0 -1
- package/dist/browser/base.js +0 -6
- package/dist/browser/base.js.map +0 -1
- package/dist/browser/local.d.ts +0 -81
- package/dist/browser/local.d.ts.map +0 -1
- package/dist/browser/local.js +0 -283
- package/dist/browser/local.js.map +0 -1
- package/dist/core/console-monitor.d.ts +0 -82
- package/dist/core/console-monitor.d.ts.map +0 -1
- package/dist/core/console-monitor.js +0 -428
- package/dist/core/console-monitor.js.map +0 -1
- package/dist/core/design-system-manifest.d.ts +0 -272
- package/dist/core/design-system-manifest.d.ts.map +0 -1
- package/dist/core/design-system-manifest.js +0 -261
- package/dist/core/design-system-manifest.js.map +0 -1
- package/dist/core/enrichment/enrichment-service.d.ts +0 -52
- package/dist/core/enrichment/enrichment-service.d.ts.map +0 -1
- package/dist/core/enrichment/enrichment-service.js +0 -272
- package/dist/core/enrichment/enrichment-service.js.map +0 -1
- package/dist/core/enrichment/index.d.ts +0 -8
- package/dist/core/enrichment/index.d.ts.map +0 -1
- package/dist/core/enrichment/index.js +0 -8
- package/dist/core/enrichment/index.js.map +0 -1
- package/dist/core/enrichment/relationship-mapper.d.ts +0 -106
- package/dist/core/enrichment/relationship-mapper.d.ts.map +0 -1
- package/dist/core/enrichment/relationship-mapper.js +0 -352
- package/dist/core/enrichment/relationship-mapper.js.map +0 -1
- package/dist/core/enrichment/style-resolver.d.ts +0 -80
- package/dist/core/enrichment/style-resolver.d.ts.map +0 -1
- package/dist/core/enrichment/style-resolver.js +0 -327
- package/dist/core/enrichment/style-resolver.js.map +0 -1
- package/dist/core/figma-api.d.ts +0 -137
- package/dist/core/figma-api.d.ts.map +0 -1
- package/dist/core/figma-api.js +0 -274
- package/dist/core/figma-api.js.map +0 -1
- package/dist/core/figma-desktop-connector.d.ts +0 -242
- package/dist/core/figma-desktop-connector.d.ts.map +0 -1
- package/dist/core/figma-desktop-connector.js +0 -1042
- package/dist/core/figma-desktop-connector.js.map +0 -1
- package/dist/core/figma-reconstruction-spec.d.ts +0 -162
- package/dist/core/figma-reconstruction-spec.d.ts.map +0 -1
- package/dist/core/figma-reconstruction-spec.js +0 -387
- package/dist/core/figma-reconstruction-spec.js.map +0 -1
- package/dist/core/figma-tools.d.ts +0 -21
- package/dist/core/figma-tools.d.ts.map +0 -1
- package/dist/core/figma-tools.js +0 -2920
- package/dist/core/figma-tools.js.map +0 -1
- package/dist/core/snippet-injector.d.ts +0 -24
- package/dist/core/snippet-injector.d.ts.map +0 -1
- package/dist/core/snippet-injector.js +0 -97
- package/dist/core/snippet-injector.js.map +0 -1
- package/dist/core/types/enriched.d.ts +0 -213
- package/dist/core/types/enriched.d.ts.map +0 -1
- package/dist/core/types/enriched.js +0 -6
- package/dist/core/types/enriched.js.map +0 -1
- package/dist/local.d.ts +0 -73
- package/dist/local.d.ts.map +0 -1
- package/dist/local.js +0 -2605
- package/dist/local.js.map +0 -1
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-token-pipeline
|
|
3
|
+
description: Figma variable'larını iOS (Swift Color/Font/Spacing), Android (colors.xml, dimens.xml, Compose Theme), ve Web (CSS, Tailwind, Sass, TS) formatlarında otomatik token dosyalarına dönüştürür. Ters yönde kod token dosyalarından Figma variable'ları da oluşturabilir. "export tokens", "token pipeline", "token'ları export et", "sync tokens", "generate token files", "token'ları Figma'ya yaz", "kod token'larını senkronla" ifadeleriyle tetiklenir. F-MCP Bridge plugin bağlantısı gerektirir. Bu özellik resmi Figma plugininde yoktur.
|
|
4
|
+
metadata:
|
|
5
|
+
mcp-server: user-figma-mcp-bridge
|
|
6
|
+
personas:
|
|
7
|
+
- uidev
|
|
8
|
+
- designops
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Design Token Pipeline (Multi-Platform)
|
|
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, Figma'daki design token'ları (variable'lar ve style'lar) **iOS, Android ve Web** platformlarının kullandığı formatlarda kod dosyalarına dönüştürür. Resmi Figma plugininde bu özellik yoktur.
|
|
18
|
+
|
|
19
|
+
**Önemli:** MCP araçları (`figma_get_variables`, `figma_get_styles`, `figma_get_token_browser`) ham variable ve style verisi döner. Platform-spesifik dosya formatlarına dönüşüm (Swift, XML, CSS vb.) **AI agent tarafından** yapılır. Araçlar doğrudan Swift/XML/CSS export etmez.
|
|
20
|
+
|
|
21
|
+
**Desteklenen çıktı formatları:**
|
|
22
|
+
|
|
23
|
+
| Platform | Format | Dosya |
|
|
24
|
+
|----------|--------|-------|
|
|
25
|
+
| **iOS** | Swift Color extension | `Colors.swift` |
|
|
26
|
+
| **iOS** | Swift Font extension | `Typography.swift` |
|
|
27
|
+
| **iOS** | Swift Spacing constants | `Spacing.swift` |
|
|
28
|
+
| **iOS** | Asset Catalog color set | `*.colorset/Contents.json` |
|
|
29
|
+
| **Android** | XML resources | `colors.xml`, `dimens.xml`, `styles.xml` |
|
|
30
|
+
| **Android** | Compose Color object | `AppColors.kt` |
|
|
31
|
+
| **Android** | Compose Typography | `AppTypography.kt` |
|
|
32
|
+
| **Android** | Compose Spacing | `AppSpacing.kt` |
|
|
33
|
+
| **Web** | CSS Custom Properties | `tokens.css` |
|
|
34
|
+
| **Web** | Tailwind config | `tailwind.config.js` |
|
|
35
|
+
| **Web** | TypeScript constants | `tokens.ts` |
|
|
36
|
+
| **Web** | Sass variables | `_tokens.scss` |
|
|
37
|
+
| **JSON** | W3C Design Tokens | `tokens.json` |
|
|
38
|
+
|
|
39
|
+
**Ek özellikler:**
|
|
40
|
+
- Mode desteği (Light/Dark tema — variable'ların `valuesByMode` alanından)
|
|
41
|
+
- Alias zinciri çözümleme (variable referansları `type: "VARIABLE_ALIAS"` olarak gelir, AI takip eder)
|
|
42
|
+
- Incremental güncelleme (mevcut dosyalar okunup, sadece değişenler güncellenir)
|
|
43
|
+
- Kategori bazlı export
|
|
44
|
+
- Cross-platform token değeri tutarlılık doğrulaması
|
|
45
|
+
|
|
46
|
+
REST API veya Figma access token gerekmez.
|
|
47
|
+
|
|
48
|
+
## Prerequisites
|
|
49
|
+
|
|
50
|
+
- F-MCP Bridge plugin bağlı olmalı
|
|
51
|
+
- Hedef platform(lar) ve styling yaklaşımları bilinmeli
|
|
52
|
+
|
|
53
|
+
## F-MCP skill koordinasyonu
|
|
54
|
+
|
|
55
|
+
- **Önce:** Figma’da token’lar tutarlı bağlıysa export daha güvenilir — isteğe bağlı **audit-figma-design-system**.
|
|
56
|
+
- **Sonra:** **design-drift-detector** ve **implement-design** bu dosyaları referans alır; **design-system-rules** güncellenebilir.
|
|
57
|
+
- **Etki analizi:** Bir token değişikliğinin yarıçapını ölçmek istiyorsan → **ds-impact-analysis**
|
|
58
|
+
- **Performans:** Aynı oturumda token verisi zaten çekildiyse (`figma_get_variables` / `figma_get_styles`) yeniden full çağırma; **audit-figma-design-system** içindeki “Zincir performansı” bölümüne uy.
|
|
59
|
+
|
|
60
|
+
## Required Workflow
|
|
61
|
+
|
|
62
|
+
### Step 1: Plugin Bağlantısını Doğrula
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
figma_get_status()
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Step 2: Token Envanterini Çek
|
|
69
|
+
|
|
70
|
+
Önce genel envanter için token browser:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
figma_get_token_browser(verbosity="full")
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Sonra detaylı variable verisi (`summary`: koleksiyon/sayı, `standard`: isim/tip, `full`: tüm değerler + mode'lar):
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
figma_get_variables(verbosity="full")
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Bu çağrı döner: `variableCollections` (koleksiyon adları, mode'lar, mode ID'leri) ve `variables` (her variable'ın `name`, `resolvedType`, `valuesByMode`). Alias'lar `valuesByMode` içinde `{type: "VARIABLE_ALIAS", id: "..."}` olarak gelir — hedef variable'ı ID ile bul ve son değere ulaş.
|
|
83
|
+
|
|
84
|
+
**Code Syntax desteği:** Variable'larda `codeSyntax` alanı varsa (Web, Android, iOS), token export sırasında bu değerleri platform-spesifik isimlendirme için kullan. Figma'da Code Syntax ayarlanmışsa, token dönüşümünde Figma'daki isimleri referans al:
|
|
85
|
+
- **Web:** `codeSyntax.WEB` → CSS custom property adı (ör. `var(--btn-primary-bg)`)
|
|
86
|
+
- **Android:** `codeSyntax.ANDROID` → Resource adı (ör. `R.color.btn_primary_bg`)
|
|
87
|
+
- **iOS:** `codeSyntax.iOS` → Swift sabit adı (ör. `ButtonColor.primary.bg`)
|
|
88
|
+
|
|
89
|
+
Code Syntax bilgisini okumak için `figma_execute` kullan:
|
|
90
|
+
```js
|
|
91
|
+
const v = await figma.variables.getVariableByIdAsync("<id>");
|
|
92
|
+
return { name: v.name, codeSyntax: v.codeSyntax };
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Stil verileri için:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
figma_get_styles(verbosity="full")
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Paint styles (renk), text styles (tipografi), effect styles (gölge vb.) döner.
|
|
102
|
+
|
|
103
|
+
### Step 3: Hedef Platformları ve Formatları Belirle
|
|
104
|
+
|
|
105
|
+
Kullanıcıdan hangi platformlara export edileceğini öğren. Birden fazla seçilebilir.
|
|
106
|
+
|
|
107
|
+
### Step 4: Platform-Spesifik Token Dosyaları Üret
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
#### iOS — Swift Extensions
|
|
112
|
+
|
|
113
|
+
**Colors.swift:**
|
|
114
|
+
|
|
115
|
+
```swift
|
|
116
|
+
import SwiftUI
|
|
117
|
+
|
|
118
|
+
// Auto-generated by F-MCP Design Token Pipeline
|
|
119
|
+
// Source: Figma — [File Name]
|
|
120
|
+
// Generated: 2026-03-12T10:30:00Z
|
|
121
|
+
|
|
122
|
+
extension Color {
|
|
123
|
+
enum DS {
|
|
124
|
+
// Primitives
|
|
125
|
+
static let blue50 = Color(hex: "#EFF6FF")
|
|
126
|
+
static let blue100 = Color(hex: "#DBEAFE")
|
|
127
|
+
static let blue500 = Color(hex: "#3B82F6")
|
|
128
|
+
static let blue900 = Color(hex: "#1E3A5A")
|
|
129
|
+
|
|
130
|
+
// Semantic
|
|
131
|
+
static let primary = blue500
|
|
132
|
+
static let background = Color(light: "#FFFFFF", dark: "#0A0A0A")
|
|
133
|
+
static let textPrimary = Color(light: "#1A1A1A", dark: "#FAFAFA")
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
extension Color {
|
|
138
|
+
init(hex: String) {
|
|
139
|
+
// hex → Color init implementation
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
init(light: String, dark: String) {
|
|
143
|
+
self.init(UIColor { traitCollection in
|
|
144
|
+
traitCollection.userInterfaceStyle == .dark
|
|
145
|
+
? UIColor(hex: dark) : UIColor(hex: light)
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Typography.swift:**
|
|
152
|
+
|
|
153
|
+
```swift
|
|
154
|
+
import SwiftUI
|
|
155
|
+
|
|
156
|
+
extension Font {
|
|
157
|
+
enum DS {
|
|
158
|
+
static let headingLarge = Font.custom("Inter", size: 24).weight(.bold)
|
|
159
|
+
static let headingMedium = Font.custom("Inter", size: 20).weight(.semibold)
|
|
160
|
+
static let bodyLarge = Font.custom("Inter", size: 16).weight(.regular)
|
|
161
|
+
static let bodyMedium = Font.custom("Inter", size: 14).weight(.regular)
|
|
162
|
+
static let bodySmall = Font.custom("Inter", size: 12).weight(.regular)
|
|
163
|
+
static let labelMedium = Font.custom("Inter", size: 14).weight(.medium)
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Spacing.swift:**
|
|
169
|
+
|
|
170
|
+
```swift
|
|
171
|
+
import Foundation
|
|
172
|
+
|
|
173
|
+
enum Spacing {
|
|
174
|
+
static let xs: CGFloat = 4
|
|
175
|
+
static let sm: CGFloat = 8
|
|
176
|
+
static let md: CGFloat = 16
|
|
177
|
+
static let lg: CGFloat = 24
|
|
178
|
+
static let xl: CGFloat = 32
|
|
179
|
+
static let xxl: CGFloat = 48
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
enum CornerRadius {
|
|
183
|
+
static let sm: CGFloat = 4
|
|
184
|
+
static let md: CGFloat = 8
|
|
185
|
+
static let lg: CGFloat = 12
|
|
186
|
+
static let full: CGFloat = 9999
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Dönüşüm kuralları (iOS):**
|
|
191
|
+
- Token adı → camelCase (ör. `color/primary/500` → `primary500`)
|
|
192
|
+
- COLOR → `Color(hex:)` veya Asset Catalog
|
|
193
|
+
- FLOAT → `CGFloat`
|
|
194
|
+
- Mode desteği → `UITraitCollection` veya Asset Catalog appearance
|
|
195
|
+
- Font → `Font.custom()` veya `Font.system()`
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
#### Android — XML Resources
|
|
200
|
+
|
|
201
|
+
**res/values/colors.xml:**
|
|
202
|
+
|
|
203
|
+
```xml
|
|
204
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
205
|
+
<!-- Auto-generated by F-MCP Design Token Pipeline -->
|
|
206
|
+
<resources>
|
|
207
|
+
<!-- Primitives -->
|
|
208
|
+
<color name="blue_50">#FFEFF6FF</color>
|
|
209
|
+
<color name="blue_100">#FFDBEAFE</color>
|
|
210
|
+
<color name="blue_500">#FF3B82F6</color>
|
|
211
|
+
<color name="blue_900">#FF1E3A5A</color>
|
|
212
|
+
|
|
213
|
+
<!-- Semantic -->
|
|
214
|
+
<color name="primary">@color/blue_500</color>
|
|
215
|
+
<color name="background">#FFFFFFFF</color>
|
|
216
|
+
<color name="text_primary">#FF1A1A1A</color>
|
|
217
|
+
</resources>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**res/values-night/colors.xml:**
|
|
221
|
+
|
|
222
|
+
```xml
|
|
223
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
224
|
+
<resources>
|
|
225
|
+
<color name="primary">@color/blue_400</color>
|
|
226
|
+
<color name="background">#FF0A0A0A</color>
|
|
227
|
+
<color name="text_primary">#FFFAFAFA</color>
|
|
228
|
+
</resources>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**res/values/dimens.xml:**
|
|
232
|
+
|
|
233
|
+
```xml
|
|
234
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
235
|
+
<resources>
|
|
236
|
+
<!-- Spacing -->
|
|
237
|
+
<dimen name="space_xs">4dp</dimen>
|
|
238
|
+
<dimen name="space_sm">8dp</dimen>
|
|
239
|
+
<dimen name="space_md">16dp</dimen>
|
|
240
|
+
<dimen name="space_lg">24dp</dimen>
|
|
241
|
+
<dimen name="space_xl">32dp</dimen>
|
|
242
|
+
|
|
243
|
+
<!-- Corner Radius -->
|
|
244
|
+
<dimen name="radius_sm">4dp</dimen>
|
|
245
|
+
<dimen name="radius_md">8dp</dimen>
|
|
246
|
+
<dimen name="radius_lg">12dp</dimen>
|
|
247
|
+
|
|
248
|
+
<!-- Typography -->
|
|
249
|
+
<dimen name="text_size_sm">12sp</dimen>
|
|
250
|
+
<dimen name="text_size_md">14sp</dimen>
|
|
251
|
+
<dimen name="text_size_lg">16sp</dimen>
|
|
252
|
+
</resources>
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
#### Android — Compose Theme Objects
|
|
256
|
+
|
|
257
|
+
**AppColors.kt:**
|
|
258
|
+
|
|
259
|
+
```kotlin
|
|
260
|
+
package com.app.ui.theme
|
|
261
|
+
|
|
262
|
+
import androidx.compose.ui.graphics.Color
|
|
263
|
+
|
|
264
|
+
// Auto-generated by F-MCP Design Token Pipeline
|
|
265
|
+
|
|
266
|
+
object AppColors {
|
|
267
|
+
// Primitives
|
|
268
|
+
val Blue50 = Color(0xFFEFF6FF)
|
|
269
|
+
val Blue100 = Color(0xFFDBEAFE)
|
|
270
|
+
val Blue500 = Color(0xFF3B82F6)
|
|
271
|
+
val Blue900 = Color(0xFF1E3A5A)
|
|
272
|
+
|
|
273
|
+
// Semantic — Light
|
|
274
|
+
val PrimaryLight = Blue500
|
|
275
|
+
val BackgroundLight = Color(0xFFFFFFFF)
|
|
276
|
+
val TextPrimaryLight = Color(0xFF1A1A1A)
|
|
277
|
+
|
|
278
|
+
// Semantic — Dark
|
|
279
|
+
val PrimaryDark = Color(0xFF60A5FA)
|
|
280
|
+
val BackgroundDark = Color(0xFF0A0A0A)
|
|
281
|
+
val TextPrimaryDark = Color(0xFFFAFAFA)
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**AppTypography.kt:**
|
|
286
|
+
|
|
287
|
+
```kotlin
|
|
288
|
+
package com.app.ui.theme
|
|
289
|
+
|
|
290
|
+
import androidx.compose.ui.text.TextStyle
|
|
291
|
+
import androidx.compose.ui.text.font.FontWeight
|
|
292
|
+
import androidx.compose.ui.unit.sp
|
|
293
|
+
|
|
294
|
+
object AppTypography {
|
|
295
|
+
val HeadingLarge = TextStyle(fontSize = 24.sp, fontWeight = FontWeight.Bold)
|
|
296
|
+
val HeadingMedium = TextStyle(fontSize = 20.sp, fontWeight = FontWeight.SemiBold)
|
|
297
|
+
val BodyLarge = TextStyle(fontSize = 16.sp, fontWeight = FontWeight.Normal)
|
|
298
|
+
val BodyMedium = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Normal)
|
|
299
|
+
val BodySmall = TextStyle(fontSize = 12.sp, fontWeight = FontWeight.Normal)
|
|
300
|
+
val LabelMedium = TextStyle(fontSize = 14.sp, fontWeight = FontWeight.Medium)
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**AppSpacing.kt:**
|
|
305
|
+
|
|
306
|
+
```kotlin
|
|
307
|
+
package com.app.ui.theme
|
|
308
|
+
|
|
309
|
+
import androidx.compose.ui.unit.dp
|
|
310
|
+
|
|
311
|
+
object AppSpacing {
|
|
312
|
+
val xs = 4.dp
|
|
313
|
+
val sm = 8.dp
|
|
314
|
+
val md = 16.dp
|
|
315
|
+
val lg = 24.dp
|
|
316
|
+
val xl = 32.dp
|
|
317
|
+
val xxl = 48.dp
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
object AppCornerRadius {
|
|
321
|
+
val sm = 4.dp
|
|
322
|
+
val md = 8.dp
|
|
323
|
+
val lg = 12.dp
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Dönüşüm kuralları (Android):**
|
|
328
|
+
- Token adı → snake_case (XML), PascalCase (Compose)
|
|
329
|
+
- COLOR → `#AARRGGBB` (XML), `Color(0xFFRRGGBB)` (Compose)
|
|
330
|
+
- FLOAT → `dp` (spacing/radius), `sp` (typography)
|
|
331
|
+
- Mode → `values-night/` qualifier (XML), Light/Dark suffix (Compose)
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
#### Web — CSS / Tailwind / Sass / TypeScript
|
|
336
|
+
|
|
337
|
+
Web formatları önceki versiyondaki gibi:
|
|
338
|
+
|
|
339
|
+
**CSS Custom Properties:**
|
|
340
|
+
```css
|
|
341
|
+
:root {
|
|
342
|
+
--color-primary: #3b82f6;
|
|
343
|
+
--space-md: 16px;
|
|
344
|
+
--radius-md: 8px;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
[data-theme="dark"] {
|
|
348
|
+
--color-primary: #60a5fa;
|
|
349
|
+
--color-background: #0a0a0a;
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**Tailwind Config:** Nested object formatında `theme.extend`
|
|
354
|
+
|
|
355
|
+
**TypeScript:** `as const` ile type-safe constant'lar
|
|
356
|
+
|
|
357
|
+
**Sass:** `$variable` formatında, `$map` destekli
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
#### JSON — W3C Design Tokens (Platformlar-arası)
|
|
362
|
+
|
|
363
|
+
```json
|
|
364
|
+
{
|
|
365
|
+
"$schema": "https://design-tokens.github.io/community-group/format/",
|
|
366
|
+
"color": {
|
|
367
|
+
"primary": {
|
|
368
|
+
"$type": "color",
|
|
369
|
+
"$value": "#3b82f6",
|
|
370
|
+
"$extensions": {
|
|
371
|
+
"mode": { "dark": "#60a5fa" },
|
|
372
|
+
"platforms": {
|
|
373
|
+
"ios": "Color.DS.primary",
|
|
374
|
+
"android": "@color/primary / AppColors.Primary",
|
|
375
|
+
"web": "var(--color-primary)"
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Step 5: Dosyaları Yaz
|
|
384
|
+
|
|
385
|
+
Her platform için oluşturulan dosyaları doğru konumlara yaz:
|
|
386
|
+
|
|
387
|
+
| Platform | Dosya | Konum |
|
|
388
|
+
|----------|-------|-------|
|
|
389
|
+
| iOS | Colors.swift | `[ios-root]/Sources/DesignSystem/` |
|
|
390
|
+
| iOS | Typography.swift | `[ios-root]/Sources/DesignSystem/` |
|
|
391
|
+
| iOS | Spacing.swift | `[ios-root]/Sources/DesignSystem/` |
|
|
392
|
+
| Android | colors.xml | `[android-root]/app/src/main/res/values/` |
|
|
393
|
+
| Android | colors.xml (night) | `[android-root]/app/src/main/res/values-night/` |
|
|
394
|
+
| Android | dimens.xml | `[android-root]/app/src/main/res/values/` |
|
|
395
|
+
| Android | AppColors.kt | `[android-root]/app/src/main/java/.../ui/theme/` |
|
|
396
|
+
| Android | AppTypography.kt | `[android-root]/app/src/main/java/.../ui/theme/` |
|
|
397
|
+
| Android | AppSpacing.kt | `[android-root]/app/src/main/java/.../ui/theme/` |
|
|
398
|
+
| Web | tokens.css | `[web-root]/src/styles/` |
|
|
399
|
+
| Web | tailwind.config.js | `[web-root]/` |
|
|
400
|
+
| JSON | tokens.json | proje kökü |
|
|
401
|
+
|
|
402
|
+
Dosya başına auto-generated uyarısı ekle.
|
|
403
|
+
|
|
404
|
+
### Step 6: Cross-Platform Doğrulama
|
|
405
|
+
|
|
406
|
+
Token dosyaları oluşturulduktan sonra platformlar arası değer tutarlılığını kontrol et:
|
|
407
|
+
|
|
408
|
+
**Önemli:** `codeTokens` içindeki token isimleri Figma'daki variable isimleriyle **tam eşleşmeli**. Figma'da `color/primary` varsa `codeTokens`'ta da `color/primary` kullan. Bu araç yalnızca token değerlerini karşılaştırır, platform-spesifik naming convention'larını anlamaz.
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
figma_check_design_parity(
|
|
412
|
+
codeTokens='{"color/primary": "#3b82f6", "spacing/md": "16", "radius/md": "8"}'
|
|
413
|
+
)
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
Ek olarak kendi doğrulamamızı da yap (üretilen dosyalar arasında değerleri karşılaştırarak):
|
|
417
|
+
|
|
418
|
+
```
|
|
419
|
+
Cross-Platform Token Tutarlılık Kontrolü:
|
|
420
|
+
┌─────────────────┬───────────┬───────────┬───────────┐
|
|
421
|
+
│ Token │ iOS │ Android │ Web │
|
|
422
|
+
├─────────────────┼───────────┼───────────┼───────────┤
|
|
423
|
+
│ primary │ #3B82F6 │ #3B82F6 │ #3b82f6 │ OK
|
|
424
|
+
│ spacing-md │ 16 pt │ 16 dp │ 16 px │ OK
|
|
425
|
+
│ radius-md │ 8 pt │ 8 dp │ 8 px │ OK
|
|
426
|
+
│ text-size-md │ 14 pt │ 14 sp │ 14 px │ OK
|
|
427
|
+
└─────────────────┴───────────┴───────────┴───────────┘
|
|
428
|
+
Sonuç: Tüm platformlarda token değerleri tutarlı ✓
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## Incremental Güncelleme
|
|
432
|
+
|
|
433
|
+
"Token'ları güncelle" / "sync tokens" dendiğinde:
|
|
434
|
+
|
|
435
|
+
1. Mevcut token dosyalarını oku (her platform için)
|
|
436
|
+
2. `figma_get_variables(verbosity="full")` ile güncel Figma verileri çek
|
|
437
|
+
3. Değişen token'ları tespit et
|
|
438
|
+
4. Sadece değişen token'ları her platformda güncelle
|
|
439
|
+
5. Auto-generated timestamp'i güncelle
|
|
440
|
+
6. Cross-platform tutarlılık kontrolü çalıştır
|
|
441
|
+
|
|
442
|
+
## Kategori Bazlı Export
|
|
443
|
+
|
|
444
|
+
- "Sadece renkleri export et" → COLOR variable'lar + paint style'lar
|
|
445
|
+
- "Spacing token'larını güncelle" → FLOAT variable'lar (space/spacing adlı)
|
|
446
|
+
- "Typography'yi export et" → text style'lar + font size/weight/line-height variable'lar
|
|
447
|
+
|
|
448
|
+
## Examples
|
|
449
|
+
|
|
450
|
+
### Örnek 1: 3 Platform Token Export
|
|
451
|
+
|
|
452
|
+
Kullanıcı: "Figma token'larını iOS, Android ve Web için export et"
|
|
453
|
+
|
|
454
|
+
**Akış:**
|
|
455
|
+
|
|
456
|
+
1. Figma verilerini çek
|
|
457
|
+
2. 3 platformun projelerini analiz et
|
|
458
|
+
3. iOS: `Colors.swift`, `Typography.swift`, `Spacing.swift` üret
|
|
459
|
+
4. Android: `colors.xml`, `dimens.xml`, `AppColors.kt`, `AppTypography.kt`, `AppSpacing.kt` üret
|
|
460
|
+
5. Web: `tokens.css`, `tailwind.config.js` update
|
|
461
|
+
6. JSON: `tokens.json` üret (referans)
|
|
462
|
+
7. Cross-platform doğrulama çalıştır
|
|
463
|
+
|
|
464
|
+
### Örnek 2: Sadece Android Token Güncelleme
|
|
465
|
+
|
|
466
|
+
Kullanıcı: "Android renk token'larını güncelle"
|
|
467
|
+
|
|
468
|
+
**Akış:**
|
|
469
|
+
|
|
470
|
+
1. Figma'dan güncel COLOR variable'ları çek
|
|
471
|
+
2. Mevcut `colors.xml` ve `AppColors.kt` dosyalarını oku
|
|
472
|
+
3. Değişen renkleri tespit et
|
|
473
|
+
4. Sadece değişen renkleri güncelle
|
|
474
|
+
5. `values-night/colors.xml` da güncelle (dark mode varsa)
|
|
475
|
+
|
|
476
|
+
## Common Issues and Solutions
|
|
477
|
+
|
|
478
|
+
### Sorun: Birim farkları (pt vs dp vs px)
|
|
479
|
+
|
|
480
|
+
**Çözüm:** Figma'daki sayısal değer her platformda aynı kalır, sadece birim değişir: iOS = pt, Android = dp/sp, Web = px. 16 her yerde 16'dır.
|
|
481
|
+
|
|
482
|
+
### Sorun: Android'de hem XML hem Compose token'ları gerekiyor
|
|
483
|
+
|
|
484
|
+
**Çözüm:** İkisini de üret. XML resources → legacy View system, Kotlin objects → Compose. Her iki set de aynı Figma değerlerinden türetilir.
|
|
485
|
+
|
|
486
|
+
### Sorun: iOS Asset Catalog mu Swift extension mı?
|
|
487
|
+
|
|
488
|
+
**Çözüm:** Kullanıcıya sor. Asset Catalog Interface Builder'da görsel seçim sağlar; Swift extension programmatic erişim sağlar. İkisi birlikte de kullanılabilir.
|
|
489
|
+
|
|
490
|
+
### Sorun: Figma'da mode 2'den fazla (ör. Light, Dark, HighContrast)
|
|
491
|
+
|
|
492
|
+
**Çözüm:** iOS: Asset Catalog'da "High Contrast" appearance ekle. Android: her mode için ayrı resource qualifier. Web: her mode için ayrı CSS class/data-attribute.
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
## Reverse Flow: Kod → Figma Variable
|
|
497
|
+
|
|
498
|
+
Mevcut akış yalnızca **Figma → Kod** yönünde çalışır. Bu bölüm ters yönü tanımlar: kod tabanındaki token tanımlarını Figma variable'larına yazmak.
|
|
499
|
+
|
|
500
|
+
### Ne zaman kullanılır
|
|
501
|
+
|
|
502
|
+
- Kod tabanında token'lar tanımlı ama Figma'da henüz variable yok
|
|
503
|
+
- Kod tabanındaki token güncellemelerini Figma'ya yansıtmak
|
|
504
|
+
- JSON contract/W3C Design Token dosyasını Figma'ya aktarmak
|
|
505
|
+
|
|
506
|
+
### Direction parametresi
|
|
507
|
+
|
|
508
|
+
- `--direction=figma-to-code` — Mevcut varsayılan akış (Figma → kod dosyaları)
|
|
509
|
+
- `--direction=code-to-figma` — Reverse flow (kod → Figma variable'ları)
|
|
510
|
+
|
|
511
|
+
### Reverse Flow Adımları
|
|
512
|
+
|
|
513
|
+
#### R-Step 1: Kaynak token dosyasını oku
|
|
514
|
+
|
|
515
|
+
Desteklenen kaynak formatları:
|
|
516
|
+
|
|
517
|
+
| Format | Dosya | Ayrıştırma |
|
|
518
|
+
|---|---|---|
|
|
519
|
+
| CSS Custom Properties | `tokens.css` | `--token-name: value` ayrıştır |
|
|
520
|
+
| Tailwind config | `tailwind.config.js` | `theme.extend.*` objelerini çıkar |
|
|
521
|
+
| JSON (W3C Design Tokens) | `tokens.json` | `$value`, `$type` alanları |
|
|
522
|
+
| Swift Color extension | `Colors.swift` | Renk tanımlarını ayrıştır |
|
|
523
|
+
| Android colors.xml | `colors.xml` | `<color name="">` elementleri |
|
|
524
|
+
| Sass variables | `_tokens.scss` | `$token-name: value` ayrıştır |
|
|
525
|
+
| TypeScript constants | `tokens.ts` | `export const` objelerini çıkar |
|
|
526
|
+
|
|
527
|
+
#### R-Step 2: Token'ları kategorize et
|
|
528
|
+
|
|
529
|
+
Kaynak dosyadan çıkarılan her token'ı sınıfla:
|
|
530
|
+
|
|
531
|
+
- **COLOR** — hex, rgb, hsl değerleri
|
|
532
|
+
- **FLOAT** — spacing, radius, font-size (px/dp/pt → sayısal değer)
|
|
533
|
+
- **STRING** — font family, font weight isimleri
|
|
534
|
+
|
|
535
|
+
#### R-Step 3: Mevcut Figma variable'larla karşılaştır
|
|
536
|
+
|
|
537
|
+
```
|
|
538
|
+
figma_get_variables(verbosity="full")
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
- Aynı isimde variable varsa: değer farkı kontrol et → güncelle veya atla
|
|
542
|
+
- Yeni token varsa: oluşturulacaklar listesi
|
|
543
|
+
- Figma'da olup kodda olmayan: rapor et (silme önerisi)
|
|
544
|
+
|
|
545
|
+
#### R-Step 4: Collection ve variable oluştur/güncelle
|
|
546
|
+
|
|
547
|
+
Yeni collection gerekiyorsa:
|
|
548
|
+
```
|
|
549
|
+
figma_create_variable_collection(name="Design Tokens", modes=["Light", "Dark"])
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
Toplu oluşturma (tercih):
|
|
553
|
+
```
|
|
554
|
+
figma_batch_create_variables(
|
|
555
|
+
collectionId="<id>",
|
|
556
|
+
variables=[
|
|
557
|
+
{ name: "color/primary", type: "COLOR", values: { "Light": "#2563EB", "Dark": "#60A5FA" } },
|
|
558
|
+
{ name: "spacing/md", type: "FLOAT", values: { "Light": 16 } },
|
|
559
|
+
...
|
|
560
|
+
]
|
|
561
|
+
)
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
Güncelleme:
|
|
565
|
+
```
|
|
566
|
+
figma_batch_update_variables(
|
|
567
|
+
updates=[
|
|
568
|
+
{ variableId: "<id>", values: { "Light": "#3B82F6" } },
|
|
569
|
+
...
|
|
570
|
+
]
|
|
571
|
+
)
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
#### R-Step 5: Scope ayarla
|
|
575
|
+
|
|
576
|
+
Her variable için uygun scope'u ayarla (figma_execute içinde):
|
|
577
|
+
|
|
578
|
+
```js
|
|
579
|
+
const variable = await figma.variables.getVariableByIdAsync("<id>");
|
|
580
|
+
// Renk token'ları
|
|
581
|
+
if (variable.resolvedType === "COLOR") {
|
|
582
|
+
variable.scopes = variable.name.includes("text")
|
|
583
|
+
? ["TEXT_FILL"]
|
|
584
|
+
: ["FRAME_FILL", "SHAPE_FILL"];
|
|
585
|
+
}
|
|
586
|
+
// Spacing token'ları
|
|
587
|
+
if (variable.resolvedType === "FLOAT" && variable.name.includes("spacing")) {
|
|
588
|
+
variable.scopes = ["GAP", "WIDTH_HEIGHT"];
|
|
589
|
+
}
|
|
590
|
+
return { id: variable.id, scopes: variable.scopes };
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
#### R-Step 6: Doğrulama
|
|
594
|
+
|
|
595
|
+
Oluşturulan variable'ları kontrol et:
|
|
596
|
+
|
|
597
|
+
```
|
|
598
|
+
figma_get_variables(verbosity="summary")
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
Sayı ve isimlerin kaynak ile eşleştiğini doğrula.
|
|
602
|
+
|
|
603
|
+
### Çıktı
|
|
604
|
+
|
|
605
|
+
- Oluşturulan variable sayısı ve listesi
|
|
606
|
+
- Güncellenen variable sayısı ve fark özeti
|
|
607
|
+
- Atlanılan (zaten güncel) token sayısı
|
|
608
|
+
- Figma'da olup kodda olmayan token raporu
|
|
609
|
+
|
|
610
|
+
## Marka Profili Entegrasyonu
|
|
611
|
+
|
|
612
|
+
`.fmcp-brand-profile.json` varsa:
|
|
613
|
+
- `targetPlatforms` → Yalnızca belirtilen platformlar için token dosyaları üret (tümünü üretme)
|
|
614
|
+
|
|
615
|
+
## Evolution Triggers
|
|
616
|
+
|
|
617
|
+
- Bridge'e yeni token araçları eklendiğinde (ör. toplu token import aracı) ilgili adımlar güncellenmeli
|
|
618
|
+
- W3C Design Tokens spec güncellendiğinde JSON formatı uyarlanmalı
|
|
619
|
+
- Yeni platform formatları (Flutter, .NET MAUI vb.) desteklendiğinde çıktı tablosu genişletilmeli
|