# Możliwości i ograniczenia

## GS Loom: własny silnik GrowSite

GS Loom to własny silnik szablonów GrowSite. Paczka zawiera `loom.json`, HTML, osobne schematy JSON, słowniki, style i opcjonalne zasoby. Kompilator akceptuje kontrakt GS Loom i odrzuca nieobsługiwaną składnię szablonów.

## Dyrektywy i wyrażenia

| Zapis | Działanie |
| --- | --- |
| `gs-text="section.settings.title"` | Bezpiecznie zastępuje tekst elementu |
| `[[ section.settings.title ]]` | Interpoluje tekst lub wartość atrybutu |
| `gs-href`, `gs-src` | Wiąże adres z kontrolą protokołu |
| `gs-if`, `gs-else-if`, `gs-else` | Wybiera gałąź; alternatywy muszą być sąsiadami |
| `gs-repeat="item in content.items"` | Powtarza element; udostępnia `loop.index` i `loop.index0` |
| `gs-component="link"` | Osadza plik HTML z `snippets`, `components` lub `sections` |
| `gs-prop-label="block.settings.label"` | Przekazuje parametr komponentu |
| `gs-group="header"` | Renderuje grupę sekcji |
| `gs-slot="blocks"` | Renderuje dozwolone dzieci według `block_order` |
| `gs-block="_signature" gs-id="signature"` | Osadza blok statyczny |
| `gs-slot="layout"` | Wstawia treść strony do layoutu |
| `gs-attr-checked="enabled"` | Ustawia atrybut; false i null pomijają go |

Dyrektywy mogą działać na `<template>`, który nie tworzy dodatkowego kontenera. Wyrażenia obsługują ścieżki danych, indeksy tablic, literały, porównania, `and`/`or`, `not`, konkatenację `+` oraz `warunek ? tak : nie`. Wartości false i null są fałszywe; pusty tekst można sprawdzić przez porównanie z `blank`.

Dostępne funkcje: `safe_url(value)`, `split(value, separator)`, `first(list)`, `slice(value, start, length)`, `str(value)`, `t(key)`, `asset_url(name)` i `date(value, "%Y")`. Nie można wywoływać dowolnych metod JavaScript. `gs-set` z `gs-value` pozwala nazwać wynik wyrażenia w lokalnym zakresie.

## Pluginy i zachowanie istniejących stron

`gs-form`, `gs-menu`, `gs-blog` i `gs-comments` korzystają z integracji GrowSite. Instant zachowuje swój widok formularza. Victorie używa wspólnego renderera dokumentów i powiązania instancji formularzy. Paylio zachowuje cennik i FAQ w module interakcji paczki. Nie deklarujemy automatycznej obsługi koszyka ani rezerwacji, których platforma nie udostępnia.

GrowSite Skeleton używa stałego klucza `growsite-skeleton`. Dane edytowalnych sekcji są zapisywane w `content.loom`, a dane globalne w `theme_settings.loom`. Powiązania takie jak `loom.settings.title` wskazują pola tych dokumentów. Migracja nazewnictwa zachowuje identyfikatory katalogu, przypisania witryn i historię wersji.

## Granice i bezpieczeństwo

Silnik nie ma dostępu do sieci, systemu plików ani bazy danych. Zna wyłącznie pliki paczki i jawnie przekazane dane. Tekst i atrybuty są escapowane; dostęp do prototypów jest zabroniony. Limity obejmują 500 KB pliku, 2 miliony znaków źródeł paczki, 1000 elementów listy, 24 poziomy wywołań i budżet pracy renderera. Moduły `runtime/*.ts` są zaufanym kodem instalowanym i kompilowanym przez osobę utrzymującą aplikację, nie kodem klienta wpisywanym do pola.

Źródłem kontraktu są `scripts/loom-themes.mjs`, `packages/templates/src/lib/loom/runtime.ts` i `api/app/Rules/LoomDocument.php`. Asystent w panelu nie instaluje nowych paczek motywów automatycznie. Paczki tworzone z pomocą AI podlegają tej samej walidacji i testom co kod napisany ręcznie.
