Metadata-Version: 2.4
Name: evenis
Version: 0.3.0
Summary: Python-only fullstack UI framework: UI, состояние, анимации и бэкенд — только на Python.
Author: evenis
License: MIT
Project-URL: Homepage, https://example.com/evenis
Keywords: ui,framework,fullstack,spa,virtual-dom,fastapi
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: User Interfaces
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Provides-Extra: server
Requires-Dist: fastapi>=0.100; extra == "server"
Requires-Dist: uvicorn>=0.23; extra == "server"
Requires-Dist: websockets>=11; extra == "server"
Requires-Dist: pyjwt>=2.6; extra == "server"

# evenis

**Python-only fullstack UI framework.** Весь UI, состояние, анимации и бэкенд
описываются только на Python — ни строчки HTML/CSS/JS в пользовательском коде.
Компилятор выдаёт SPA с настоящим Virtual DOM, а бэкенд-функции автоматически
становятся API.

```python
import evenis as ui
from evenis.server import server, action, LiveState

@server
async def get_users():
    return await User.all()           # → GET /__evenis/api/get_users

@action
async def add_user(name: str):
    ...                               # → POST /__evenis/api/add_user
    return await User.all()

online = LiveState(0, name="online")  # WebSocket-состояние

app = ui.App(title="App", state={"users": []})

@app.page("/", load=get_users.load(into="users"))
def home():
    return ui.Column(
        ui.Text("Онлайн: {{ online }}"),
        ui.For("users", lambda u, i: ui.Text(u.attr("name"))),
        ui.PrimaryButton("Добавить", on_click=add_user(into="users", name="{{ draft }}")),
    )
```

## Установка

```bash
pip install evenis            # ядро (сборка статических SPA)
pip install "evenis[server]"  # + fullstack (FastAPI/WebSocket)
```

## Запуск

```bash
python -m evenis build app.py            # собрать статический сайт в dist/
python -m evenis dev   app.py --port 8000  # dev-сервер + hot reload
python -m evenis serve app.py --port 8000  # fullstack: фронт + API + WebSocket
```

## Возможности

- **Только Python** — никакого HTML/CSS/JS в пользовательском коде.
- **Virtual DOM** — обновляется только изменившийся узел, фокус в полях сохраняется.
- **Компоненты и раскладка** — `Button`, `Card`, `Input`, `Row`, `Column`, `Grid`,
  `AdaptiveLayout` (сам выбирает число колонок), `Motion`.
- **Состояние** — реактивный store, `computed`-сигналы, декларативные действия,
  middleware-pipeline.
- **Анимации** — Motion, FLIP layout-переходы, настраиваемые кривые и длительности.
- **Fullstack** — `@server` / `@action` превращают функции в API, `LiveState` —
  в WebSocket-состояние с push-обновлениями. Транспорт выбирается автоматически.

## Примеры

См. каталог `examples/`: `hello_world.py`, `dashboard.py`, `ecommerce.py`,
`demo_app.py`, `fullstack.py`, `docs_site.py` (эта документация, написанная на
самом evenis).

MIT License.
