Format sceny 1.0
Dokument JSON — version, document, objects, gradients, layers i workspaces. Kolory, jednostki, walidacja i limity.
Struktura dokumentu#
Scena to obiekt JSON z version, document, objects oraz opcjonalnymi gradients i layers. Nieznane właściwości są odrzucane ze strukturalnymi błędami schemy.
{
"version": "1.0",
"document": {
"width": 1200,
"height": 800,
"unit": "px",
"background": "#FFFFFF"
},
"objects": [],
"gradients": [],
"layers": []
}
Kanoniczna schema: schemas/vector-scene.schema.json.
Document#
| Właściwość | Typ | Wymagana | Opis |
|---|---|---|---|
width | integer | tak | Szerokość 1–16 384 |
height | integer | tak | Wysokość 1–16 384 |
unit | string | nie | px, pt, mm, cm, in; domyślnie px |
background | color | nie | Hex lub none |
gradients | array | nie | Definicje gradientów |
workspaces | array | nie | Nazwane regiony eksportu |
Kolory i paint#
Kolory akceptują:
#RGB,#RGBA,#RRGGBB,#RRGGBBAA,none,url(#gradientId)— referencja do gradientu.
{ "fill": "#0052FF", "stroke": "#17171780", "opacity": 0.9 }
Wspólne właściwości obiektów#
| Właściwość | Typ | Domyślnie |
|---|---|---|
id | string | wymagane |
name | string | opcjonalne |
layerId | string | opcjonalne |
type | string | wymagane |
fill | color / url(#id) / none | zależnie od kształtu |
stroke | color / url(#id) / none | zależnie od kształtu |
strokeWidth | number | 1 |
opacity | number 0–1 | 1 |
blendMode | string | normal |
visible | boolean | true |
transform | object | identity |
Transformacje#
{
"transform": {
"translateX": 100,
"translateY": 50,
"rotate": 45,
"scaleX": 1.5,
"scaleY": 1.5,
"skewX": 0,
"skewY": 0,
"originX": 200,
"originY": 200
}
}
Transformacje są afiniczne i składane w kolejności: translate → rotate → scale → skew, wokół punktu originX/originY. Grupy dziedziczą transformacje rodziców.
Workspaces#
Nazwane prostokątne regiony eksportu:
{
"workspaces": [
{ "id": "social", "name": "Social card", "x": 0, "y": 0, "width": 1200, "height": 630 },
{ "id": "icon", "x": 0, "y": 0, "width": 512, "height": 512 }
]
}
Eksport może celować w workspace zamiast całej sceny — patrz Proces eksportu.
Walidacja#
Walidacja jest dwuetapowa:
- Strukturalna — Ajv Draft 2020-12 + parser JSON C++23.
- Semantyczna — unikalne ID, warstwy, workspaces, gradienty, limity pamięci.
Błędy są strukturalne i wskazują konkretne pole:
{
"code": "invalid.color",
"path": "/objects/2/fill",
"message": "Expected hex color, none, or url(#id)"
}
Limity#
| Zasób | Limit |
|---|---|
| Źródło JSON | 4 MB |
| Wymiar dokumentu | 16 384 px |
| Obszar rastra | 67 108 864 px |
| Obiekty | 10 000 |
| Głębokość grup | 32 |
| Dane path | 1 000 000 znaków |
Renderer nie ładuje zewnętrznych zasobów
Akceptowane są tylko zadeklarowane właściwości, kolory hex, obsługiwane komendy path i lokalny tekst. Nie ma <image href="https://…">, zewnętrznych fontów ani sieciowych URL-i — to powierzchnia ataku, której silnik świadomie nie ma.