# Libro.az — проект

Аналог Taplink/Linktree для Азербайджана. Конструктор мульти-ссылок, QR-меню и витрина товаров.

## Стек

- **Backend:** PHP 8.3 / Laravel 11
- **Frontend:** Svelte 5 + Inertia.js + Tailwind CSS
- **Database:** MySQL 8.0+
- **Dev:** Docker (docker compose)

## Команды

```bash
make reset    # полный перезапуск: build + контейнеры + миграции
make fresh    # сброс БД + сиды
make build    # только сборка фронтенда
make up       # только запуск контейнеров
```

## Структура БД

```
users (id, name, email, password, role, plan_id, status)
plans (id, name, slug, price_azn, features[JSON], is_active)
pages (id, user_id, slug, title, type[default|mini_site|menu], theme_settings[JSON], blocks[JSON], is_active, views_count)
menus (id, user_id, name, slug, is_active, theme_settings[JSON])
shops (id, user_id, name, slug, is_active)
categories (id, menu_id|shop_id, name, sort_order, is_active)
products (id, page_id?, category_id?, menu_id?, shop_id?, name, description, price, image_url, is_available)
orders (id, page_id, customer_name, customer_phone, customer_address?, items[JSON], total_amount, status)
```

## Блоки (blocks)

Хранятся в JSON-колонке `pages.blocks`. Каждый блок: `{ id, type, data, order }`.

Типы блоков: `avatar, heading, text, button_link, social_links, spacer, divider, faq, image, video`

Блоки имеют общие настройки (в `data._*`):
- `_hidden` — скрыть блок
- `_bgColor` — цвет фона
- `_pt` / `_pb` — отступы сверху/снизу
- `_label` — имя блока
- `_scheduleStart` / `_scheduleEnd` — показ по расписанию
- `_daysOfWeek` — показ по дням недели

**Добавление нового типа блока — 3 шага:**
1. `UpdateBlocksRequest.php` — добавить тип в `in:...`
2. `Editor.svelte` — добавить в `palette`, `defaults`, превью, форму редактирования
3. `BlockRenderer.svelte` — добавить рендеринг для публичной страницы

## Хранение файлов

```
public/photo/{user_id}/{page_slug}/FILENAME.jpg
```

- Загрузка через `UploadController@upload` — POST `/profile/{user}/pages/{page}/upload`
- Поддерживаемые форматы: JPEG, PNG, JPG, GIF, WebP (до 10 МБ)
- Аватары и фоны страниц — в папке страницы
- Товары — в `public/photo/{user_id}/menu/`

## Мультиязычность

- JSON-файлы: `lang/az.json`, `lang/ru.json`, `lang/en.json`, `lang/tr.json`
- Основной язык: `az` (азербайджанский)
- **ВСЕ СТАТИЧЕСКИЕ ТЕКСТЫ** должны быть в `lang/az.json` и использоваться через `__('ключ')`
- На фронте: `import { __ } from '@/i18n.js'` → `{__('ключ', 'ключ')}`
- В PHP: `__('ключ')`
- Middleware `SetLocale` устанавливает язык из сессии/куки
- Смена языка: `POST /locale`

## Статические CSS-классы

**ВСЕГДА** добавляй уникальный статический класс к каждому HTML-элементу:

```
libro-{компонент}-{элемент}
```

Примеры:
- `libro-layout-main`, `libro-layout-profile`, `libro-layout-admin`
- `libro-nav`, `libro-nav-main`, `libro-sidebar`, `libro-sidebar-link`
- `libro-btn`, `libro-btn-primary`, `libro-btn-logout`
- `libro-block-palette-{type}`, `libro-block-item-{type}`
- `libro-block-preview-{type}`, `libro-block-editor-{type}`
- `libro-modal`, `libro-modal-block`, `libro-modal-content`
- `libro-editor`, `libro-editor-topbar`, `libro-editor-preview`
- `libro-phone`, `libro-phone-content`

## Роуты

```
/                              — главная
/register, /login, /logout    — auth
/profile/{user}/               — дашборд
/profile/{user}/pages          — страницы
/profile/{user}/pages/create   — создать страницу
/profile/{user}/pages/{page}/editor — редактор
/profile/{user}/pages/{page}/settings — настройки
/profile/{user}/menus          — меню
/profile/{user}/menus/{menu}   — детали меню
/profile/{user}/shops          — магазины
/profile/{user}/shops/{shop}   — детали магазина
/profile/{user}/statistics     — статистика
/profile/{user}/sales          — заявки
/profile/{user}/design         — дизайн
/profile/{user}/settings       — настройки профиля
/idareetme/giris               — вход в админку
/idareetme/                    — админ-панель
/{slug}                        — публичная страница
/menu/{slug}                   — публичное QR-меню
```

## Права доступа

- `Gate::viewProfile` — пользователь видит только свой профиль (`authUser->id === profileUser->id`)
- `AdminMiddleware` — только `role === 'admin'`
- `PagePolicy` — владелец страницы или админ

## Доступы (dev)

| Роль | Email | Пароль |
|------|-------|--------|
| Admin | admin@libro.az | admin123 |
| User | test@example.com | password |
