# Florial CHANGELOG — consumer upgrade notes

> **Standartinis update (VISADA tinka, leidžiamas kiekvieną deploy):**
>
> ```bash
> composer update
> php artisan migrate --force
> php artisan florial:upgrade --force
> php artisan themes:publish-assets
> php artisan vendor:publish --tag=package-assets --force
> php artisan optimize
> ```
>
> `florial:upgrade` yra **idempotentinis** ir absorbuoja beveik viską, ką dev serverio
> užduotys prideda: naujus permission'us / role'es (per `cms:sync-permissions`),
> naujus baseline seeder'ius, temų eilutes ir per-aplinkos temų default'us.
> Migracijas paima atskiras `migrate --force` (bėga PRIEŠ upgrade — schema turi
> egzistuoti anksčiau nei ją liečia seeder'iai).
>
> **Žemiau — TIK žingsniai, kurių ta komanda NEabsorbuoja** (naujas `.env`,
> Satis rebuild, breaking change, vienkartinis turinio seed'as). Jei užduoties čia
> nėra — vadinasi, standartinio update pakanka.

---

## PackageStructure Fazės 0–4 — chain'as UŽDARYTAS (išleista `v1.11.0`)

> **Vienas įrašas vietoj dvidešimt penkių.** Žemiau esantys per-task'iniai įrašai
> (task-15 … task-19, task-23) lieka — juose yra detalės, kurių ši santrauka
> nepakartoja. Čia — kas išleista, kokia versija ir ką PRIVALAI paleisti.

**Išleistos versijos (Satis jau jas turi):**

| Train | Paketai | Versija |
|---|---|---|
| `florial` | `va-florial/*` (11) + `va-themes/florial` | **`v1.11.0`** |
| `foundation` | `va-core/*`, `va-cross/*`, `va-modules/*`, `va-shop/*`, `va-themes/{protera,viartas-default}` | **`v1.5.2`** |

Chain'as leidosi **po vieną tag'ą per task'ą** (`v1.9.0` task-16 → `v1.10.0`/`v1.10.1`
task-17 → `v1.10.2` task-19 → `v1.10.3` task-20 → `v1.11.0` task-23), tad jei
atsinaujinai bet kada po 2026-08-21, jau turi viską.

**Ką chain'as pakeitė Florial pusėje:** registracijos controlleriai, landing'as, teisiniai
puslapiai, DUK ir kontaktai iškeliavo iš temos (landing + legal → **CMS Pages**, kontaktai →
**`va-modules/forms`**); 30 kabinetų ekranų persikėlė į `va-florial/*`; diagnostiniai
`/florial/testing/*` seam'ai iškelti iš shipping paketo; `delivery-status.css` persikėlė į
`va-florial/orders`. **Temoje neliko nė vieno route'o, controllerio ar migracijos.**

### 🔑 VIENINTELIS rankinis žingsnis

```bash
php artisan vendor:publish --tag=package-assets --force
```

Jis JAU stovi dokumentuotame update bloke (žr. viršų) ir `florial:upgrade` jį paleidžia
pati — tad **praktiškai standartinio update pakanka**. Įrašytas atskirai todėl, kad
praleidus jį `/uzsakymas/{token}` statuso puslapis render'inasi be JOKIO stiliaus, o
konsolėje klaidos nebus.

`vendor:publish --tag=lang --force` šiam chain'ui **NEREIKALINGAS** — perkelti vertimai
kraunami iš paketų per `loadTranslationsFrom()`, ne publish'inami. Ta eilutė deploy bloke
stovi dėl `va-core/translations` 1.1.0.

### ⚠️ Route NAME'ai dingo (task-16 / task-17) — jei kur nors `route('web.florial.…')`

`web.florial.landing.*` ir `web.florial.legal.*` **nebeegzistuoja** — puslapiai dabar
CMS Pages eilutės, adresuojamos per `template` stulpelį. Route paviršius: 4880 → 4859.
Nuorodos temos ir paketų viduje jau perrašytos (`Support\{PageLinks,LegalLinks,LandingLinks}`),
bet **consumer'io savo kodas, jei jis vardijo tuos name'us, mes `RouteNotFoundException`**.

### ⚠️ Dvi migracijos persikėlė į `va-core/themes` (task-22)

`cut_over_viartas_default_theme_path` + `cut_over_protera_theme_path` dabar atkeliauja su
`va-core/themes`. Vardai nepakito → nubėgusiam host'ui nieko. Florial consumer'is, kuris
`va-themes/protera` neinstaliavo, pamatys jas kaip pending — abi guarded (`hasTable` +
`hasColumn`), adresuoja `(slug, environment)`, tad Florial eilučių neranda ir nieko nekeičia.

### ⚠️ Pirmam install'ui — turinys ateina per baseline seeder'ius

`FlorialLandingPagesSeeder`, `FlorialLegalPagesSeeder` ir `FlorialContactFormSeeder` yra
`FlorialInstallSeeder` grandinėje, t. y. **`florial:upgrade --force` juos jau paleidžia**.
`--with-content` jiems NEREIKALINGAS (jis yra katalogo/demo turiniui).

---

## PackageStructure/task-23 — `delivery-status.css` iškeliavo į `va-florial/orders`

Viešo užsakymo statuso puslapio stilius **nebe-build'inamas šioje temoje**. Ekranas
(`florders::web.delivery-status`) gyvena `va-florial/orders` nuo task-19, ir dabar ten
gyvena ir jo CSS + Vite įrašas.

Iki šiol blade'as jį pasiekdavo per `class_exists(ThemeAsset::class)` soft-ref'ą, tad
**Florial install'as be šios temos tą puslapį render'ino be jokio stiliaus** — sąmoningai.
Nuo dabar `<link>` besąlyginis.

### Ką PRIVALAI padaryti

```bash
composer update                                        # ⚠️ va-florial/orders IR šitą temą — KARTU
php artisan vendor:publish --tag=package-assets --force # naujas: veža delivery-status.css
php artisan themes:publish-assets
php artisan optimize:clear
```

**🔑 PORA PRIVALO IŠKELIAUTI KARTU.** Naujas `va-florial/orders` (blade'as linkina
`vendor/va-florial/orders/assets/delivery-status.css`) su SENU publish'u = **404 ant
stylesheet'o** ir nestilizuotas puslapis. Nauja tema (be bundle'o) su SENU
`va-florial/orders` (blade'as vis dar per `ThemeAsset::bundle()`) = irgi 404.

### Jei sekei temos build'o išvestį

`public/build/assets/delivery-status.css` **nebegeneruojamas** — `vite.config.js` įrašo
nebėra. Host'e likusią seną publikuotą kopiją
(`public/vendor/va-themes/florial/build/assets/delivery-status.css`) galima trinti.


## PackageStructure/task-19 — 30 kabinetų ekranų persikėlė į `va-florial/*` paketus

- **⚠️ ŠIS RELEASE'AS PRIVALO IŠKELIAUTI KARTU SU `va-florial/{companies,subscriptions,`
  `sales,orders,core}`.** Ekranai iš temos DINGO, o jų nauji namai yra tuose penkiuose
  paketuose. Gavus naują temą su senais paketais, kiekvienas kabineto URL atsakys
  `View [theme::savitarna.company.dashboard] not found` — **500, ne 404**, t. y. garsiai,
  bet vis tiek per vėlai. Atnaujinkite visą Florial rinkinį vienu `composer update`.
- **Standartinio update PAKANKA** (jokios migracijos, jokio DB pokyčio, jokio CSS/JS
  build'o — `public/build` NEPAKITO). Po jo **BŪTINAS `php artisan optimize:clear`**:
  cache'inti blade'ai laiko įkompiliuotą seną kelią į temos katalogą.

- **Kas išėjo (30 failų):** įmonės kabinetas (13) → `va-florial/companies`
  (`flcompanies::savitarna.*`) · prenumeratoriaus kabinetas (4) → `va-florial/subscriptions`
  (`flsubs::savitarna.*`) · pardavėjo kabinetas (9) → `va-florial/sales`
  (`flsales::pardavimai.*`) · viešas pristatymo statusas (1) → `va-florial/orders`
  (`florders::web.delivery-status`) · `/savitarna/theme-check` placeholder'is (1) →
  `va-florial/core` (`florial::savitarna._placeholder`). Pilna lentelė — monorepo
  `.claude/tasks/PackageStructure/florial-blades.md`.

- **Kas NEPASIKEITĖ:** nė vienas URL, nė vienas route name'as, nė vienas CSS selektorius,
  nė vienas `data-*` hook'as. Su įdiegta tema render'inamas HTML **byte-identiškas**
  (patikrinta 20 autentifikuotų kabinetų render'ių).

- **⚠️ JEI OVERRIDE'INATE KABINETO EKRANĄ:** iki šio release'o jį keitėte redaguodami failą
  temoje. Nuo dabar tai OVERRIDE (`.claude/module-structure.md` §6.1) ir kelias yra
  `Resources/views/{paketo-alias}/{aplinka}/{vardas}.blade.php`, pvz.
  `Resources/views/flcompanies/savitarna/dashboard.blade.php`. **Senoje vietoje paliktas
  failas tiesiog nustos būti naudojamas — be klaidos ir be įspėjimo.**

- **NAUJA GALIMYBĖ:** `va-florial/*` paketai nuo dabar render'inasi ir BE temos.
  `va-florial/core` veža bazinį app-shell'ą, kurį jo `BareThemeFallback` middleware
  užkabina kaip `theme::` **tik tada, kai tas namespace'as tuščias** — ten, kur ši tema
  aktyvi, ji laimi kaip ir anksčiau. Praktiškai tai reiškia, kad savo temą galima rašyti
  palaipsniui: iki tol produktas veikia paprastu, bet gyvu apvalkalu, o ne 500.

---

## PackageStructure/task-18 — diagnostiniai `/florial/testing/*` endpoint'ai iškelti iš paketo

- **Standartinio update PAKANKA.** Jokios migracijos, jokio naujo `require`, jokio
  CSS/JS build'o. Po `composer update` verta paleisti `composer dump-autoload`
  (dingo septynios paketo psr-4 klasės) ir `php artisan optimize:clear`.
- **⚠️ PAŠALINTI SEPTYNI ENDPOINT'AI.** Iki šio release'o `va-themes/florial` vežė
  `src/Http/Controllers/Testing/` — septynis diagnostinius controllerius, kuriuos
  registruodavo `POST /florial/testing/{landing-content,setting,registered,`
  `package-price,faq,catalog-visibility,menu-label}`. Jie keliaudavo į kiekvieną
  consumer'io install'ą **temos viduje**, nors tema neturi teisės turėti nei
  controllerio, nei route'o (`.claude/module-structure.md` §5).

  Route'ai VISADA buvo gate'inti `APP_ENV=testing`, tad **prod ir dev deployment'uose
  jų nebuvo ir anksčiau** — pokytis matomas tik tam, kas savo suite'ą sukdavo su
  `APP_ENV=testing` ir rėmėsi šiais endpoint'ais. Tokiu atveju juos reikia atsikelti
  pas save (kodas — Viartas monorepo `tests/Support/Florial/`), nes iš paketo jie
  nebeateina.

- **Kas NEPASIKEITĖ:** joks viešas URL, joks route name'as, joks ekranas, joks stilius.
  Temos `src/Http/Controllers/` katalogo nebeliko visai.

---

## PackageStructure/task-17 — legal, DUK ir kontaktai persikėlė į CMS + Forms

- **⚠️ Standartinio update NEPAKANKA vienam dalykui:** pirmame deploy'e reikia, kad būtų
  sukurtos naujos Page eilutės IR kontaktų formos apibrėžimas. Abu yra **baseline**, tad
  `php artisan florial:upgrade --force` juos sukuria. Po to — `optimize:clear`
  (pasikeitė ir route lentelė, ir view cache).
- **⚠️ `composer update` PRIVALOMAS:** `va-florial/core` ir `va-themes/florial` įgijo
  naują HARD `require va-modules/forms`.
- **⚠️ BREAKING — dingo šeši route name'ai.** Jei tavo kode, laiško šablone ar Forge
  script'e kas nors juos vardija, `route()` mes `RouteNotFoundException`:

  | Dingęs vardas | Pakaitalas |
  |---|---|
  | `web.[{tag}.]florial.legal.privacy` | `ViartasThemes\Florial\Support\LegalLinks::url('privacy')` |
  | `web.[{tag}.]florial.legal.terms` | `LegalLinks::url('terms')` |
  | `web.[{tag}.]florial.legal.cookies` | `LegalLinks::url('cookies')` |
  | `web.[{tag}.]florial.legal.delivery` | `LegalLinks::url('delivery')` |
  | `web.[{tag}.]florial.legal.faq` | `LegalLinks::url('faq')` |
  | `web.[{tag}.]florial.legal.contacts` (+ `.store`) | `LegalLinks::url('contacts')`; POST → `route('web.forms.submit', ['slug' => 'florial-kontaktai'])` |

  URL'ai NEPAKITO — `/privatumas`, `/salygos`, `/slapukai`, `/pristatymo-salygos`,
  `/duk`, `/kontaktai` atsako kaip anksčiau, per Pages catch-all'ą.
- **⚠️ Kontaktų forma nuo dabar yra `va-modules/forms` įrašas** (`florial-kontaktai`).
  Žinutės **išsaugomos** (`form_submissions`) ir siunčiamos į `notify_email`
  (`config('cms.contact.recipient')` → `florial_setting('support_email')` →
  `labas@florial.lt`) — anksčiau jos tik patekdavo į log'ą. Puslapio išvaizda nepakito.
  Formą galima redaguoti `/admin/forms`; seeder'is yra `firstOrCreate`, tad admin'o
  redakcijos išgyvena kitą `florial:upgrade`.
- **Matomas pokytis, kuris yra pataisymas:** keturių teisinių puslapių
  `<meta name="description">` anksčiau kartodavo TITULĄ (Content raktas
  `legal.{doc}_title_seo` niekada nebuvo seed'intas). Dabar tai puslapio eilutės
  `excerpt` — seed'intas verbatim iš `legal.{doc}_hero_sub`. Teisinių tekstų kūnas
  NEPAKITO nė vienu simboliu (jie lieka Content CMS'e).
- **Naujas admin paviršius:** šeši puslapiai redaguojami `/admin/pages` (pavadinimas →
  `<title>` + OG, meta aprašas, publikavimo būsena, slug'as). Slug'o pervadinimas
  automatiškai perkelia footer'io, auth kortelės ir sutikimo etikečių nuorodas.
- **Deployment'uose, kur Florial NĖRA numatytoji `web` tema,** `/duk` ir `/kontaktai`
  eilutės sąmoningai NEseed'inamos (jas valdo kitas produktas) — lygiai kaip anksčiau
  tų route'ų nebūdavo.

## PackageStructure/task-16 — landing puslapiai persikėlė į CMS (`va-modules/pages`)

- **⚠️ Standartinio update NEPAKANKA vienam dalykui:** pirmame deploy'e reikia, kad
  būtų sukurtos keturios Page eilutės. Jos yra **baseline** (ne `--with-content`), tad
  `php artisan florial:upgrade --force` jas sukuria. Po to — `optimize:clear`
  (arba `optimize`): pasikeitė ir route lentelė, ir view cache.
- **Nulinis vizualus pokytis.** `/`, `/imonems`, `/erdvems`, `/privatiems` (+ `/en/…`,
  `/pl/…`) — tie patys URL'ai, o render'inamas HTML **byte-identiškas** (patikrinta
  before/after diff'u su aktyvia Florial tema, įskaitant `/` ir `/en`).
- **Kas pasikeitė:** landing'ai buvo TEMOS route'ai, rodantys į temos
  `LandingController`. Route'as yra naujas URL paviršius, ne override, ir tema jo
  turėti negali (`.claude/module-structure.md` §5) — pakeitus temą dingdavo visa
  rinkodaros svetainė. Dabar jie yra CMS puslapiai: eilutes seed'ina
  `va-florial/core` `FlorialLandingPagesSeeder`, serve'ina Pages catch-all, o tema
  tiekia tik `florial-*` ŠABLONUS (`Resources/views/pages/web/`) ir jų duomenis
  (`Support\LandingData`).
- **🔑 NAUJA GALIMYBĖ, dėl kurios visa tai daroma:** landing'ai nuo dabar redaguojami
  `/admin/pages` — pavadinimas (→ `<title>` + OG), meta aprašas (excerpt) ir du teksto
  slot'ai (`hero_title`, `hero_subtitle`). Slot'ai tušti pagal nutylėjimą, tad kol
  niekas nieko neredagavo, tekstas ateina iš Content CMS kaip anksčiau.
- **⚠️ Route NAME'ai DINGO.** `route('web.florial.landing.employees')` ir kt. nebeveikia
  — jei consumer'is turi savo kodą, kuris juos vardija, jį reikia perrašyti į
  `ViartasThemes\Florial\Support\LandingLinks::url('employees')` (locale-aware) arba
  į `Page::getUrl()`.
- **Meniu (`web.main` / `web.footer`)** nuo dabar seed'inami su puslapio keliu ir be
  route hint'o; per-locale URL'ą (`/en/imonems`) `MenuLinks` išveda per Slug lentelę.
  `data-nav-item` raktai (`employees` / `spaces` / `subscribers`) NEPAKITĘ.
- **Naujas `require`: `va-modules/pages`** — ir `va-florial/core`, ir
  `va-themes/florial`. **Satis consumer'iui `composer update` PRIVALOMAS.**
- **⚠️ Tema ir `va-florial/core` privalo iškeliauti KARTU.** Nauja tema (be landing
  route'ų) su senu core (be seeder'io) = **404 visuose rinkodaros URL'uose**, tylus
  gedimas.
- Naujas šalutinis URL: **`/florial`** — ta pati pradžios puslapio eilutė savo adresu
  (Seglo `/seglo` precedentas). `/` elgsena nepakito: jis yra Florial tik tada, kai
  Florial yra `web` default tema.

---

## PackageStructure/task-15 — registracija persikėlė iš temos į paketus

- **Standartinio update PAKANKA**, bet `php artisan optimize:clear` (arba `optimize`)
  yra **PRIVALOMAS**: pasikeitė route'ų savininkas, tad cache'inti route'ai rodytų į
  `ViartasThemes\Florial\Http\Controllers\Register*Controller`, kurių nebėra —
  `Class not found` ant `/registracija/*`.
- **Nulinis funkcinis pokytis.** URL'ai (`/registracija/imonems`,
  `/registracija/prenumerata` + `/en/…`, `/pl/…`), route NAME'ai
  (`web.[{tag}.]florial.register.{company,subscriber}[.store]`), middleware ir
  render'inamas HTML — identiški (patikrinta before/after render diff'u: skiriasi tik
  CSRF token'as).
- **Naujas savininkas:** `va-florial/companies` (B2B) ir `va-florial/subscriptions`
  (B2C) — controlleris + FormRequest + bazinis ekranas + `Routes/web.php`.
  Namespace'ai: `flcompanies::web.register`, `flsubs::web.register`.
- **Priežastis:** POST handleriai rašo Company / Subscription + User. Tai aplikacijos
  logika, o route'as yra naujas URL paviršius, ne override — abu tema turėti negali
  (`.claude/module-structure.md` §5). Praktinė pasekmė: pakeitus temą dingdavo
  registracija.
- **Tema NIEKO nepraranda funkciškai** — ji tebeturi `florial::layouts.public`,
  `Http\Forms\Register*Form` (jos komponuoja temos laukų markup'ą) ir nuo dabar gali
  ekranus **override'inti**:
  `Resources/views/flcompanies/web/register.blade.php` ·
  `Resources/views/flsubs/web/register.blade.php`.
  ⚠️ Kelias privalo sutapti TIKSLIAI (`{alias}/{env}/{name}`) — plokščias failas
  temos šaknyje nebeveiks kaip override'as.
- **⚠️ Paketai ir tema privalo iškeliauti KARTU.** Consumer'is, gavęs naują temą (be
  route'ų) su senais paketais (be `Routes/web.php`), liks **be registracijos URL'ų
  visai** — 404, ne 500.
- **Naujų `require` NEATSIRADO** (dep-auditas: 0 HARD spragų, 0 ciklų). Formos
  resolvinamos SOFT (FQCN string + `class_exists`) su veidrodiniu rules fallback'u —
  paketas niekada hard-nepriklauso nuo temos (task-91 precedentas).

---

## task-107 — consumer deps + `deploy:sync` Florial žingsnis

- **Naujų `require` NEATSIRADO.** Dep-auditas (`.claude/tools/florial-dep-audit.php`,
  praplėstas trimis aptikimo sluoksniais) patvirtino, kad visi 12 Florial paketų
  deklaruoja viską, ką naudoja HARD; likusios 23 cross-paketo nuorodos yra task-95
  soft-ref'ai (string const + runtime resolve). **`composer update` dėl šito task'o
  NEPRIVALOMAS** — bet lieka privalomas dėl task-106 (`va-modules/menus`).
- ⚠️ **`deploy:sync` (`composer sync`) dabar pats leidžia `florial:upgrade --force`.**
  Host'ams, naudojantiems `composer sync`, atskiro rankinio žingsnio nebereikia.
  Consumer'io Forge skriptas nesikeičia (jis komandą kviečia eksplicitiškai) — dvigubas
  paleidimas nekenkia, komanda idempotentinė. **Keičiasi `va-core/core`** → foundation
  train'as tag'inamas PIRMAS, tik tada florial.
- ⚠️ **`florial:upgrade` nebeperima `web` numatytosios temos**, jei ją jau turi kita
  ĮDIEGTA tema. Vieno produkto install'e (ofisai) elgsena nepakito — kitos web temos ten
  neįdiegtos. Multi-produkto host'e tai apsauga: be jos kiekvienas `composer sync` būtų
  tyliai atėmęs `/` iš esamos temos. Kabinetų default'ai perimami kaip anksčiau.

## task-106 — DB-valdomas nav + footer

- ⚠️ **`.env`:** pridėk `MENUS_DB_DRIVEN=true`. Be jo viešas nav + footer lieka blade
  fallback'e ir **`/admin/menus` redagavimas ekrane nieko nekeičia** (tylus no-op, kuris
  skaitosi kaip sugedęs admin ekranas). Platformos default'as yra `false`, nes jis
  bendras visoms temoms — todėl jį įjungti reikia per consumer'io `.env`.
- ⚠️ **`composer update` PRIVALOMAS** — tema dabar deklaruoja naują priklausomybę
  `va-modules/menus` (iki šiol ji buvo naudojama nedeklaruota).
- ⚠️ **Vienkartinai:** `php artisan florial:upgrade --with-content --force` — jis užsėja
  naują **`web.footer`** meniu (Paslaugos · Pagalba · teisinė eilutė) ir perseed'ina
  `web.main` su per-locale nuorodomis. Be šito žingsnio footer'is toliau render'ins
  blade fallback'ą (t. y. atrodys taip pat, tik nebus redaguojamas).
- `php artisan florial:activate` nuo dabar ĮSPĖJA, jei `MENUS_DB_DRIVEN` išjungtas.
- Sekantis standartinis update (`themes:publish-assets` + `optimize`) yra būtinas —
  pasikeitė `components.css` (teisinės eilutės nuorodų stiliai).

## task-100 — demo-preview panelė + demo slaptažodis

- `/login` nebeturi „— ARBA DEMO PERŽIŪRA —" bloko su 4 kabinetų nuorodomis (ofisai
  prototipo UI, rodytas kiekvienam svečiui). Kabinetai pasiekiami įprastu prisijungimu.
  Standartinio update pakanka (`optimize` išvalo view cache).
- ⚠️ **Vienkartinis, TIK jei ankstesnis deploy'as leido `florial:install --with-content`
  arba `florial:seed-content --demo`:** demo subscriber (`florial-subscriber@viartas.lt`)
  turi **viešai žinomą** slaptažodį `florial-demo` — nuo task-100 seeder'is jo nebededa,
  bet `firstOrCreate` esamo user'io NEperhash'ina, tad seną reikia rotuoti rankomis:

  ```bash
  php artisan tinker --execute="\ViartasCore\Users\Models\User::where('email','florial-subscriber@viartas.lt')->delete();"
  ```

  (arba nustatyk naują slaptažodį per admin'ą — trynimas tinka tik jei demo prenumeratos
  nereikalingos.) Naujuose install'uose slaptažodis generuojamas atsitiktinai — paskyra
  sukuriama, bet neprisijungiama, kol admin'as jos neatstato.

## QA batch — demo tenant, no-company UX, sales-rep login, DB nav

- `florial:install/upgrade --with-content` DABAR seed'ina ir **demo tenant'ą**
  (įmonė + company_admin `imone@florial.lt` + darbuotojai + sales_rep
  `pardavejas@florial.lt` + B2C subscriber `florial-subscriber@viartas.lt`) — kabinetai
  pasiekiami iškart po install'o. Idempotentiška; trink rankomis kai atsiras realūs.
- **web.main** perseed'inamas į Florial landing'us + numetamas shop `web.brands`
  (`FlorialMenusSeeder`, content chain). Front nav DB-redaguojamas su `.env`
  `MENUS_DB_DRIVEN=true`; be jo — hardcoded (per-locale), 0 regresijos. Tik meniu be
  demo/turinio: `db:seed --class="ViartasThemes\Florial\Database\Seeders\FlorialMenusSeeder" --force`.
- Savitarna: erdvės/darbuotojo kūrimas be įmonės nebeduoda 404 (disable submit +
  onboarding + draugiškas redirect); planai rodomi (ne „Planų dar nėra").
- Admin sales-rep formoj — „prisijungimo vartotojas" select + `sales_rep` rolė →
  `pardavimai/imones` nebeduoda 403.
- Formų laukai: `aria-required` (native `required` sąmoningai paliktas išjungtas —
  server-authority sprendimas; ` *` žymė + server validacija jau buvo).
- **CKEditor (#9):** `form-builder` dabar deklaruoja `va-core/ckeditor` → puslapio
  „Turinys" WYSIWYG laukas rodo CKEditor (ne plika textarea su raw HTML). Ateina per
  `composer update`, assets per `vendor:publish --tag=package-assets`.

## task-99 — `florial:upgrade` + deploy un-gate

- **Vienkartinis:** atnaujink Forge deploy skriptą pagal [`INSTALL.md`](INSTALL.md)
  („Forge / production deploy"). Anksčiau `florial:install` buvo **marker-gated**
  (`if [ ! -f storage/app/.viartas-installed ]`) → bėgo TIK pirmą kartą, todėl
  vėlesnės užduotys consumer'io nepasiekdavo. Dabar `florial:upgrade --force`
  paleidžiamas **kiekvieną deploy**, o marker'is dengia tik tikrą first-time
  bootstrap'ą (`CmsBootSeeder`).
- Marker'io trinti NEREIKIA — jis toliau teisingai saugo pirmojo karto seed'ą.

## task-98 — Satis dist 404

- **Ops (ne app):** perkelk atnaujintą `deploy/satis.json` (`archive.skip-dev: false`)
  į Satis host'ą ir paleisk `php bin/satis build satis.json public/` (arba palauk
  cron'o). Be to `composer update` toliau klonuoja per git vietoj dist zip'o.
  Receptas: `.claude/runbooks/satis-dist-404.md`.

## task-96 / task-97 — viešų sekcijų turinys

- **Vienkartinis:** `php artisan florial:upgrade --with-content --force` — užpildo
  paketų galeriją, B2C / erdvių planus, Content copy, DUK ir atsiliepimus.
  ⚠️ Standartiniame update `--with-content` **nenaudojamas** sąmoningai: jis
  RE-ASSERT'ina seed'intus default'us, tad perrašytų per admin redaguotą katalogo
  copy / kainas (nuo QA batch — ir demo tenant'ą + `web.main` meniu). Leisk vieną
  kartą (arba kai CHANGELOG'as pasako, kad atsirado naujų viešų sekcijų duomenų).
- Kol tai nepaleista, sekcijos NElieka tuščios — homepage galerija rodo 6
  iliustruotas demo korteles (task-96 fallback).

## task-108 — inline CSS/JS iškėlimas + Bootstrap CDN → bundle

**Asset PUBLISH privalomas** (be jo admin layout'as liks be Bootstrap CSS/JS —
jsdelivr nuorodos pašalintos — o naujas `delivery-status.css` grąžins 404):

```bash
php artisan themes:publish-assets
php artisan vendor:publish --tag=va-themes-florial-assets --force
php artisan optimize:clear
```

**Consumer'iui (Satis) `npm` NEREIKIA** — `public/build/` yra commit'inamas paketo
repo'e, tad Bootstrap jau sukompiliuotas į `admin.{css,js}`. `npm ci && npm run build`
reikia TIK dirbant su temos šaltiniais monorepo'je (nauji dep'ai: `bootstrap@5.3.3`,
`bootstrap-icons@1.11.3` — tiksliai tos versijos, kurias serve'ino CDN).

Kas pasikeitė:

- `partials/public-forms-styles.blade.php` **IŠTRINTAS** — turinys perkeltas į
  `Resources/assets/css/forms.css`, kurį importuoja `landing.js` (NE `@import`
  į `landing.css`: CSS `@import` keliamas į failo viršų, o šitos taisyklės
  sąmoningai perrašo `components.css`).
- 4 dubliuoti brand-token `<style>` blokai → vienas
  `partials/critical-tokens.blade.php`, skaitantis reikšmes iš `variables.css`
  per `ViartasThemes\Florial\Support\BrandTokens`. Jokio hex'o daugiau nei
  vienoje vietoje.
- `delivery-status.blade.php` `<style>` blokas → `delivery-status.css`
  (atskiras Vite entry — ta tema sąmoningai neįsikelia `@font-face`).
- Registracijos + slaptažodžio atstatymo inline `<script>` blokai → `register.js`
  (įeina į `landing.js`). PHP reikšmės perduodamos per `data-delivery-zones` /
  `data-match-text` / `data-strength-labels`.
- **Bootstrap 5.3.3 + bootstrap-icons 1.11.3** — nauji npm dep'ai, sukompiliuoti
  į `admin.{css,js}`; jsdelivr `<link>`/`<script>` pašalinti. `window.bootstrap`
  eksponuojamas eksplicitiškai (`va-florial/core` roles view'as kuria Modal ranka).
