# FreeHand komut dili (GPT için) · v1

Amaç: bir GPT, **JSON komut listesiyle** vektör belge kurar ve **SVG** alır. Kaynak: `/gpt/fh-belge-v1.mjs` (saf modül, ağ ve DOM yok). Örnek: `/gpt/fh-ornek-komutlar-v1.json`.

## Kurallar (hepsi doğrulanır)
1. **Atomik:** listede tek hata varsa belge DEĞİŞMEZ; hata `{i, kod, mesaj}` döner (`i` = hatalı komutun sırası).
2. **Adlar:** 1–40 karakter; harf, rakam, `_`, `-`, boşluk. Başka karakter reddedilir.
3. **Renk:** yalnız `#rrggbb`. Nesneler renge doğrudan değil **swatch (renk örneği) adıyla** bağlanır.
4. **Sayılar:** gerçek sayı (metin değil), sonlu, |x| ≤ 1.000.000.
5. **Yol (`d`):** yalnız `M L H V C S Q T A Z` komutları ve sayılar; `M` ile başlar; en çok 20.000 karakter.
6. **Sınırlar:** en çok 2000 komut, 5000 nesne, 64 katman.
7. Kilitli katmana ekleme/taşıma/silme yapılmaz (`KATMAN_KILITLI`). Gizli katman SVG'ye yazılmaz.

## Komutlar
| op | alanlar | etki |
|---|---|---|
| `swatch` | `ad`, `hex` | renk örneği ekler |
| `stil` | `ad`, `dolgu?`, `cizgi?`, `kalinlik?` | adlandırılmış stil; dolgu/çizgi = swatch adı ya da `"yok"` |
| `katman` | `ad` | yeni katman (üstte) |
| `kilit` / `gorunur` | `katman`, `deger` (true/false) | katmanı kilitler / gösterir-gizler |
| `ekle` | `katman`, `nesne` | nesne ekler; id otomatik `n1`, `n2`… |
| `tasi` | `id`, `dx`, `dy` | öteler |
| `olcekle` | `id`, `sx`, `sy?`, `cx?`, `cy?` | ölçekler (merkez varsayılan 0,0) |
| `dondur` | `id`, `aci` (derece), `cx?`, `cy?` | döndürür |
| `resimOpaklik` | `id`, `deger` (sonlu sayı, 0..1) | mevcut resmin opaklığını değiştirir; başka nesne türünü reddeder |
| `stilUygula` | `id`, `stil` | stil adı ya da satır içi stil |
| `grupla` | `idler` (≥2, aynı katman/düzey) | grup kurar |
| `sembol` | `ad`, `idler` | nesnelerin kopyasını sembol yapar |
| `hizala` | `idler` (≥2), `yon` (`sol`, `sag`, `ust`, `alt`, `ortala-x`, `ortala-y`) | nesneleri sınır kutularına göre hizalar |
| `sirala` | `id`, `yon` (`one`, `arkaya`, `bir-one`, `bir-arkaya`) | nesnenin katman listesindeki sırasını (z-order) değiştirir |
| `sil` | `id` | nesneyi siler |

Nesne türleri (`ekle` içinde `nesne.tur`):
- `yol {d}`: SVG yolu
- `dikdortgen {x,y,genislik,yukseklik,r?}`: dikdörtgen
- `elips {cx,cy,rx,ry}`: elips
- `ornek {sembol}`: sembol kopyası
- `metin {x,y,metin,punto?,fontAilesi?,hiza?}`: vektör metin etiketi (`hiza`: 'start'|'middle'|'end')
- `resim {x,y,genislik,yukseklik,href}`: raster/vektör görsel (`href`: data URI ya da güvenli dosya yolu)
Hepsinde isteğe bağlı `stil`.

## Kullanım
```js
import { yeniBelge, uygula, svgUret } from '/gpt/fh-belge-v1.mjs?v=b0eb95575643';
const sonuc = uygula(yeniBelge({ genislik: 400, yukseklik: 240 }), komutlar);
if (sonuc.hatalar.length) console.log(sonuc.hatalar);   // belge değişmedi
else console.log(svgUret(sonuc.belge));
```

## Güvenlik ve Doğrulama
Ham HTML/komut çalıştırmaz. SVG'ye yalnız doğrulanmış alanlar girer. Metinler XML-kaçışlı olarak basılır; kontrol karakterleri ve `javascript:` URL'leri engellenir. Çıktının "güzel" olduğunu söylemez: teknik olarak %100 geçerli ve standart SVG olduğunu garanti eder.
