@dskripchenko/laravel-admin 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.de.md ADDED
@@ -0,0 +1,139 @@
1
+ # dskripchenko/laravel-admin
2
+
3
+ > 🌐 [English](README.md) · [Русский](README.ru.md) · **Deutsch** · [中文](README.zh.md)
4
+
5
+ Ein Laravel Admin-Panel-Konstruktor im Stil von Orchid mit einem Vue 3 SPA-Frontend.
6
+
7
+ [![npm](https://img.shields.io/npm/v/@dskripchenko/laravel-admin?label=%40dskripchenko%2Flaravel-admin)](https://www.npmjs.com/package/@dskripchenko/laravel-admin)
8
+ [![Packagist](https://img.shields.io/packagist/v/dskripchenko/laravel-admin)](https://packagist.org/packages/dskripchenko/laravel-admin)
9
+ [![License](https://img.shields.io/packagist/l/dskripchenko/laravel-admin)](LICENSE)
10
+
11
+ ```php
12
+ Admin::resources([UserResource::class, ArticleResource::class]);
13
+ Admin::screen([ContactScreen::class, SystemStatusScreen::class]);
14
+ Admin::menu()->add(
15
+ MenuNode::make('content', 'Inhalte')->icon('book')->children([
16
+ MenuNode::resource('articles'),
17
+ MenuNode::dashboard('analytics'),
18
+ ]),
19
+ );
20
+ ```
21
+
22
+ ## Was ist enthalten
23
+
24
+ - **CRUD-Pipeline** — deklarieren Sie ein Eloquent-Modell als
25
+ `Resource` und erhalten Sie List/Create/Edit/View-Screens automatisch.
26
+ - **Custom Screens** — Nicht-CRUD-Seiten (Formulare, Berichte,
27
+ Dashboards) mit `Admin::screen()`. Verwaltet State, Layout,
28
+ Command-Bar, Validierung, Permissions.
29
+ - **Hierarchisches Menü** — fluentes API
30
+ `Admin::menu()->add(MenuNode::...)`, beliebige Tiefe, automatische
31
+ Auflösung von `resource()`/`screen()`/`dashboard()`.
32
+ - **30+ Feldtypen** — Input/Number/Select/Combobox/DatePicker/
33
+ ColorPicker/FileUpload/Wysiwyg/Markdown/TranslatableInput/Repeater/
34
+ RelationSelect/Cascader/TreeSelect/Slug/KeyValue/TagsInput/...
35
+ - **15+ Layouts** — Rows/Columns/Tabs/Wizard+Step/Block/Modal/Drawer/
36
+ Wrapper/Infolist/Dashboard/Accordion/View/...
37
+ - **Tabellen** — sortierbare Spalten, Presets, Filter, Inline-Edit,
38
+ Summary, Saved Views, Group-by, Polling, Export (CSV/XLSX/PDF).
39
+ - **Dashboard** — 8 Widget-Typen (Stats/Chart/RecentList/Markdown/
40
+ Iframe/Table/Heatmap/Gauge), benutzerspezifische Layout-Overrides,
41
+ Drag/Resize, Polling.
42
+ - **Auth & RBAC** — Multi-Guard, AdminUser, Roles, 2FA TOTP, Profile,
43
+ Impersonation, Password-Reset, E-Mail-Verifikation.
44
+ - **Audit** — Append-Only-Log von Admin-Aktionen
45
+ (`AuditLog` + `Loggable`-Trait).
46
+ - **Settings** — Singleton-Konfigurationsscreens.
47
+ - **Notifications** — Bell-Badge + Drawer (Database-Notifications).
48
+ - **API-Tokens** — Sanctum-Integration im Profil (optional).
49
+ - **Theming** — Light/Dark + Benutzerpräferenz, `@dskripchenko/ui`
50
+ Design-Tokens.
51
+ - **i18n** — Locale-Resolver (5-Stufen-Priorität),
52
+ `TranslatableField`-Bridge für
53
+ `dskripchenko/laravel-translatable`.
54
+ - **Mandantenfähigkeit** — `TenantResolver` / `TenantContext` /
55
+ `TenantScoped`-Trait. Strategie ist host-seitig; wir liefern den
56
+ Vertrag.
57
+ - **Plugins** — `AdminPlugin`-Interface; Sister-Packs nutzen denselben
58
+ Hook.
59
+ - **Testing** — `ResourceTestCase`, `ScreenTestCase`,
60
+ `ActsAsAdmin`-Trait.
61
+ - **OpenAPI 3.0** — generiert aus Docblock-Tags `@input`/`@output`.
62
+
63
+ ## Installation
64
+
65
+ ```bash
66
+ composer require dskripchenko/laravel-admin
67
+ php artisan vendor:publish --tag=admin-config
68
+ php artisan migrate
69
+ ```
70
+
71
+ ```js
72
+ // resources/js/admin.js
73
+ import { createAdminApp } from '@dskripchenko/laravel-admin'
74
+ import '@dskripchenko/ui/styles/all.css'
75
+ import '@dskripchenko/laravel-admin/style.css'
76
+
77
+ const { app } = createAdminApp(window.__ADMIN_BOOTSTRAP__)
78
+ app.mount('#admin-app')
79
+ ```
80
+
81
+ ```bash
82
+ npm i @dskripchenko/laravel-admin @dskripchenko/ui
83
+ npm run build
84
+ ```
85
+
86
+ Öffnen Sie `/admin/login`. Siehe
87
+ [getting-started.md](docs/de/getting-started.md) für die erste Resource.
88
+
89
+ ## Dokumentation
90
+
91
+ - [Erste Schritte](docs/de/getting-started.md)
92
+ - [Architektur](docs/de/architecture.md)
93
+ - Konzepte: [Resources](docs/de/concepts/resources.md) ·
94
+ [Screens](docs/de/concepts/screens.md) ·
95
+ [Widgets & Dashboards](docs/de/concepts/widgets-and-dashboards.md) ·
96
+ [Menü](docs/de/concepts/menu.md) ·
97
+ [Actions](docs/en/concepts/actions.md) (en) ·
98
+ [Permissions](docs/en/concepts/permissions.md) (en) ·
99
+ [i18n](docs/en/concepts/i18n.md) (en) ·
100
+ [Mandanten](docs/en/concepts/tenancy.md) (en)
101
+ - [Felder-Referenz](docs/en/fields-reference.md) (en)
102
+ - [Layouts-Referenz](docs/en/layouts-reference.md) (en)
103
+ - [API-Referenz](docs/en/api-reference.md) (en)
104
+ - [Frontend-Erweiterung](docs/en/frontend-extension.md) (en)
105
+ - [Testen](docs/en/testing.md) (en)
106
+ - [Migration Guide](docs/en/migration-guide.md) (en)
107
+ - [Glossar](docs/de/glossary.md)
108
+
109
+ ## Stack
110
+
111
+ - **PHP** ^8.5
112
+ - **Laravel** ^12
113
+ - **Vue** ^3.4 + TypeScript + Pinia + Vue Router
114
+ - **Bundle** — `@dskripchenko/laravel-admin` ~62 KB gz (esm + cjs)
115
+ - **Kein Vendor-Lock-In** für Editor/Charts — bringen Sie Ihre eigenen
116
+ (Sister-Pack-Adapter: `quill`, `tinymce`)
117
+
118
+ ## Sister-Packs
119
+
120
+ Optionale Erweiterungen, installieren Sie nur was Sie brauchen:
121
+
122
+ | Paket | Zweck |
123
+ |---|---|
124
+ | `dskripchenko/laravel-admin-starter` | User/Role/Audit/Settings/Translations/Blocks Resources |
125
+ | `dskripchenko/laravel-admin-tinymce` | TinyMCE WYSIWYG-Adapter |
126
+ | `dskripchenko/laravel-admin-quill` | Quill WYSIWYG-Adapter |
127
+ | `dskripchenko/laravel-admin-search` | ⌘K Command Palette + Scout Suggest |
128
+ | `dskripchenko/laravel-admin-media` | Medienbibliothek (ohne Spatie/medialibrary) |
129
+ | `dskripchenko/laravel-admin-health` | Health-Checks (ohne Spatie/laravel-health) |
130
+ | `dskripchenko/laravel-admin-pulse` | Telemetrie (ohne laravel/pulse) |
131
+ | `dskripchenko/laravel-admin-jobs` | Failed-Jobs / Batches Viewer |
132
+
133
+ ## Mitwirken
134
+
135
+ Siehe [CONTRIBUTING.md](CONTRIBUTING.md). PRs willkommen.
136
+
137
+ ## Lizenz
138
+
139
+ [MIT](LICENSE) © Denis Skripchenko
package/README.md CHANGED
@@ -1,226 +1,135 @@
1
1
  # dskripchenko/laravel-admin
2
2
 
3
- Конструктор админок для Laravel: Resource-first CRUD, Vue 3 SPA, JSON-API транспорт. Подключается в любой существующий Laravel-проект без вмешательства в его routes/auth.
3
+ > 🌐 **English** · [Русский](README.ru.md) · [Deutsch](README.de.md) · [中文](README.zh.md)
4
4
 
5
- > **Статус:** in development. Архитектура зафиксирована, идёт реализация. См. `docs/ARCHITECTURE.md`.
5
+ A Laravel admin-panel constructor inspired by Orchid, with a Vue 3 SPA frontend.
6
6
 
7
- ## Tldr
7
+ [![npm](https://img.shields.io/npm/v/@dskripchenko/laravel-admin?label=%40dskripchenko%2Flaravel-admin)](https://www.npmjs.com/package/@dskripchenko/laravel-admin)
8
+ [![Packagist](https://img.shields.io/packagist/v/dskripchenko/laravel-admin)](https://packagist.org/packages/dskripchenko/laravel-admin)
9
+ [![License](https://img.shields.io/packagist/l/dskripchenko/laravel-admin)](LICENSE)
8
10
 
9
11
  ```php
10
- class UserResource extends Resource
11
- {
12
- public static string $model = \App\Models\User::class;
13
- public static string $icon = 'user';
14
-
15
- public function fields(): array
16
- {
17
- return [
18
- Field\Input::make('name')->required(),
19
- Field\Input::make('email')->type('email')->required()->unique(),
20
- Field\Switch::make('is_active'),
21
- ];
22
- }
23
-
24
- public function columns(): array
25
- {
26
- return [
27
- TC::make('id')->sort(),
28
- TC::make('name')->sort()->search(),
29
- TC::make('email')->copyable(),
30
- TC::make('is_active')->as('badge'),
31
- ];
32
- }
33
- }
12
+ Admin::resources([UserResource::class, ArticleResource::class]);
13
+ Admin::screen([ContactScreen::class, SystemStatusScreen::class]);
14
+ Admin::menu()->add(
15
+ MenuNode::make('content', 'Content')->icon('book')->children([
16
+ MenuNode::resource('articles'),
17
+ MenuNode::dashboard('analytics'),
18
+ ]),
19
+ );
34
20
  ```
35
21
 
36
- ```php
37
- // AppServiceProvider
38
- Admin::resources([UserResource::class]);
39
- ```
40
-
41
- Готово: SPA с list/create/edit/view/audit/permissions.
42
-
43
- ## Требования
44
-
45
- - PHP `^8.5`
46
- - Laravel `^12`
47
- - Redis или Memcached (для tag-aware кэша переводов; иначе soft-fallback)
48
- - Vue 3.4+, TypeScript, Vite (для frontend-сборки)
49
-
50
- ## Установка
22
+ ## What's inside
23
+
24
+ - **CRUD pipeline** — declare an Eloquent model as a `Resource`, get
25
+ list/create/edit/view screens for free.
26
+ - **Custom Screens** — non-CRUD pages (forms, dashboards, reports) with
27
+ `Admin::screen()`. Handles state, layout, command-bar, validation,
28
+ permissions.
29
+ - **Hierarchical menu** — fluent `Admin::menu()->add(MenuNode::...)`,
30
+ any depth, auto-resolve `resource()`/`screen()`/`dashboard()`.
31
+ - **30+ field types** — Input/Number/Select/Combobox/DatePicker/
32
+ ColorPicker/FileUpload/Wysiwyg/Markdown/TranslatableInput/Repeater/
33
+ RelationSelect/Cascader/TreeSelect/Slug/KeyValue/TagsInput/...
34
+ - **15+ layouts** — Rows/Columns/Tabs/Wizard+Step/Block/Modal/Drawer/
35
+ Wrapper/Infolist/Dashboard/Accordion/View/...
36
+ - **Tables** — sortable columns, presets, filters (input/date/switcher/
37
+ options/select-from-model), inline-edit, summary, saved views,
38
+ group-by, polling, exports (CSV/XLSX/PDF).
39
+ - **Dashboard** — 8 widget types (Stats/Chart/RecentList/Markdown/
40
+ Iframe/Table/Heatmap/Gauge), per-user layout overrides, drag/resize,
41
+ polling.
42
+ - **Auth & RBAC** — multi-guard, AdminUser, Roles, 2FA TOTP, profile,
43
+ impersonation, password reset, email verification.
44
+ - **Audit** — append-only log of admin actions (`AuditLog` + `Loggable`
45
+ trait).
46
+ - **Settings** — singleton-style configuration screens.
47
+ - **Notifications** — bell badge + drawer (Database notifications).
48
+ - **API tokens** — Sanctum integration in Profile (conditional).
49
+ - **Theming** — light/dark + per-user preference, `@dskripchenko/ui`
50
+ design tokens.
51
+ - **i18n** — locale resolver (5-step priority), `TranslatableField`
52
+ bridge for `dskripchenko/laravel-translatable`.
53
+ - **Tenancy** — `TenantResolver` / `TenantContext` / `TenantScoped`
54
+ trait. Strategy is host-side; we provide the contract.
55
+ - **Plugins** — `AdminPlugin` interface; sister-packs use the same hook.
56
+ - **Testing** — `ResourceTestCase`, `ScreenTestCase`, `ActsAsAdmin` trait.
57
+ - **OpenAPI 3.0** — generated from docblock `@input`/`@output` tags.
58
+
59
+ ## Install
51
60
 
52
61
  ```bash
53
62
  composer require dskripchenko/laravel-admin
54
- php artisan admin:install
63
+ php artisan vendor:publish --tag=admin-config
55
64
  php artisan migrate
56
- php artisan admin:user "Admin" admin@example.com secret
57
- npm install
58
- npm run admin:build
59
- ```
60
-
61
- После этого админка доступна на `/admin`.
62
-
63
- ## Frontend SPA (`@dskripchenko/laravel-admin` npm-пакет)
64
-
65
- Для host-проектов которые хотят встроить SPA в свой Vite-bundle вместо Blade-shell'а либо построить кастомный admin-фронт поверх готовых блоков.
66
-
67
- ### Установка
68
-
69
- ```bash
70
- npm install @dskripchenko/laravel-admin @dskripchenko/ui vue@^3.4 vue-router@^4.3 pinia axios
71
65
  ```
72
66
 
73
- ### Минимальный entry
74
-
75
- ```ts
76
- // resources/admin-spa/main.ts
77
- import { createApp } from 'vue'
78
- import { createPinia } from 'pinia'
79
-
80
- // (1) UI-кит: токены + темы + reset + global + Uid*-стили
67
+ ```js
68
+ // resources/js/admin.js
69
+ import { createAdminApp } from '@dskripchenko/laravel-admin'
81
70
  import '@dskripchenko/ui/styles/all.css'
82
- // (2) admin-каркас (impersonation banner, polling-dot, page utilities)
83
71
  import '@dskripchenko/laravel-admin/style.css'
84
72
 
85
- import {
86
- createAdminClient,
87
- setAdminClient,
88
- loadBootstrap,
89
- createAdminRouter,
90
- registerBuiltinComponents,
91
- registerBuiltinInfolistEntries,
92
- registerBuiltinWidgets,
93
- AdminShell,
94
- ResourceIndexPage,
95
- ResourceFormPage,
96
- ResourceViewPage,
97
- DashboardPage,
98
- } from '@dskripchenko/laravel-admin'
99
-
100
- // 1. HTTP-клиент с envelope/CSRF/error handling
101
- const client = createAdminClient({
102
- baseURL: '/api/admin',
103
- onUnauthenticated: () => router.push({ name: 'admin.login' }),
104
- })
105
- setAdminClient(client)
106
-
107
- // 2. Bootstrap (inline через <script> либо xhr через /system/bootstrap)
108
- const bootstrap = await loadBootstrap({ client })
109
-
110
- // 3. Pinia + hydrate stores
111
- const pinia = createPinia()
112
- const app = createApp(AdminShell)
113
- app.use(pinia)
114
-
115
- // 4. Регистрация builtin-компонентов в JSON-renderer'ы
116
- registerBuiltinComponents() // Field/Layout (text/textarea/number/select/...)
117
- registerBuiltinInfolistEntries() // Read-only display (text/badge/icon/keyvalue)
118
- registerBuiltinWidgets() // Dashboard widgets (stat/charts/heatmap/gauge)
119
-
120
- // 5. Router с динамическими роутами из manifest'а
121
- const router = createAdminRouter({
122
- base: '/admin',
123
- components: {
124
- login: () => import('./pages/Login.vue'),
125
- home: () => import('./pages/Home.vue'),
126
- forbidden: () => import('./pages/403.vue'),
127
- notFound: () => import('./pages/404.vue'),
128
- resourceIndex: ResourceIndexPage,
129
- resourceCreate: ResourceFormPage,
130
- resourceEdit: ResourceFormPage,
131
- screen: () => import('./pages/Screen.vue'),
132
- settings: () => import('./pages/Settings.vue'),
133
- dashboard: DashboardPage,
134
- },
135
- })
136
- app.use(router)
137
- app.mount('#admin')
73
+ const { app } = createAdminApp(window.__ADMIN_BOOTSTRAP__)
74
+ app.mount('#admin-app')
138
75
  ```
139
76
 
140
- ### Готовые компоненты-страницы
141
-
142
- - `LoginPage` + `LoginForm` + `TwoFactorForm` — auth + TOTP/recovery
143
- - `ResourceIndexPage` — список с filter-bar / bulk toolbar / pagination
144
- - `ResourceFormPage` — create/edit unified с sticky save-bar
145
- - `ResourceViewPage` — read-only display через Infolist
146
- - `DashboardPage` — 12-col widget grid
147
- - `ProfilePage` — sidebar nav + cards
148
- - `ImportWizardPage` — 4-step wizard
149
- - `NotificationsDrawer` — UidDrawer right с tabs
150
- - `FieldGalleryPage` — каталог field-типов (docs/playground)
151
-
152
- ### Расширение через registry
153
-
154
- ```ts
155
- import { registerField, registerWidget, registerInfolistEntry } from '@dskripchenko/laravel-admin'
156
- import MyCustomField from './fields/MyCustomField.vue'
157
-
158
- registerField('my-custom', MyCustomField)
159
- // теперь manifest узел { type: 'my-custom', name: 'x', ... } рендерится через MyCustomField
160
- ```
161
-
162
- ### Шрифты (опционально)
163
-
164
- UID design system предполагает Inter Variable + Inter Display. Library не bundle'ит шрифты в style.css (Vite lib-mode инлайнит base64 → 1.4 MB). Варианты:
165
-
166
- - `npm i @fontsource-variable/inter @fontsource/inter-display` + `import` (рекомендуется)
167
- - Google Fonts CDN
168
- - Self-hosted — копировать `node_modules/@dskripchenko/laravel-admin/resources/fonts/*.woff2` в `public/fonts/` + подключить `fonts.css`
169
-
170
- ### Скрипты разработки
171
-
172
77
  ```bash
173
- npm run lint # eslint flat config + vue-eslint-parser
174
- npm run typecheck # vue-tsc --noEmit
175
- npm test # vitest (jsdom)
176
- npm run build # vite build + vue-tsc --emitDeclarationOnly
177
- npm run build:analyze # с rollup-plugin-visualizer → dist/stats.html
178
- npm run size # size-limit budgets (ESM/CJS gzipped + CSS)
179
- npm run preflight # lint + typecheck + test + build (CI gate)
78
+ npm i @dskripchenko/laravel-admin @dskripchenko/ui
79
+ npm run build
180
80
  ```
181
81
 
182
- ## Документация
183
-
184
- - [ARCHITECTURE.md](docs/ARCHITECTURE.md) — архитектура и решения.
185
- - [docs/sister-packs/](docs/sister-packs/) — спецификации опциональных расширений.
186
- - [docs/design_handoff_laravel_admin/](docs/design_handoff_laravel_admin/) — UID design handoff (эталон вёрстки SPA).
82
+ Visit `/admin/login`. See [getting-started.md](docs/en/getting-started.md)
83
+ for the first resource.
84
+
85
+ ## Documentation
86
+
87
+ - [Getting started](docs/en/getting-started.md)
88
+ - [Architecture](docs/en/architecture.md)
89
+ - Concepts: [Resources](docs/en/concepts/resources.md) ·
90
+ [Screens](docs/en/concepts/screens.md) ·
91
+ [Widgets & Dashboards](docs/en/concepts/widgets-and-dashboards.md) ·
92
+ [Menu](docs/en/concepts/menu.md) ·
93
+ [Actions](docs/en/concepts/actions.md) ·
94
+ [Permissions](docs/en/concepts/permissions.md) ·
95
+ [i18n](docs/en/concepts/i18n.md) ·
96
+ [Tenancy](docs/en/concepts/tenancy.md)
97
+ - [Fields reference](docs/en/fields-reference.md)
98
+ - [Layouts reference](docs/en/layouts-reference.md)
99
+ - [API reference](docs/en/api-reference.md)
100
+ - [Frontend extension](docs/en/frontend-extension.md)
101
+ - [Testing](docs/en/testing.md)
102
+ - [Migration guide](docs/en/migration-guide.md)
103
+ - [Glossary](docs/en/glossary.md)
104
+
105
+ ## Stack
106
+
107
+ - **PHP** ^8.5
108
+ - **Laravel** ^12
109
+ - **Vue** ^3.4 + TypeScript + Pinia + Vue Router
110
+ - **Bundle** — `@dskripchenko/laravel-admin` ~62 KB gz (esm + cjs)
111
+ - **No vendor lock-in** for editor/charts — bring your own
112
+ (sister-pack adapters: `quill`, `tinymce`)
187
113
 
188
114
  ## Sister-packs
189
115
 
190
- | Пакет | Назначение |
191
- |---|---|
192
- | `dskripchenko/laravel-admin-starter` | Готовые системные Resource'ы |
193
- | `dskripchenko/laravel-admin-tinymce` / `*-quill` | Альтернативные WYSIWYG |
194
- | `dskripchenko/laravel-admin-search` | Глобальный поиск |
195
- | `dskripchenko/laravel-admin-media` | Медиа-библиотека |
196
- | `dskripchenko/laravel-admin-health` | Health-checks |
197
- | `dskripchenko/laravel-admin-pulse` | Лёгкая телеметрия |
198
- | `dskripchenko/laravel-admin-jobs` | Failed jobs viewer |
199
-
200
- ## Структура репозитория (dev)
116
+ Optional extensions, install only what you need:
201
117
 
202
- На время разработки до первого релиза проект ведётся как **монорепо**:
118
+ | Package | Purpose |
119
+ |---|---|
120
+ | `dskripchenko/laravel-admin-starter` | User/Role/Audit/Settings/Translations/Blocks resources |
121
+ | `dskripchenko/laravel-admin-tinymce` | TinyMCE WYSIWYG adapter |
122
+ | `dskripchenko/laravel-admin-quill` | Quill WYSIWYG adapter |
123
+ | `dskripchenko/laravel-admin-search` | ⌘K command palette + Scout suggest |
124
+ | `dskripchenko/laravel-admin-media` | Media library (no Spatie/medialibrary dependency) |
125
+ | `dskripchenko/laravel-admin-health` | Health checks (no Spatie/laravel-health dependency) |
126
+ | `dskripchenko/laravel-admin-pulse` | Telemetry sampler (no laravel/pulse dependency) |
127
+ | `dskripchenko/laravel-admin-jobs` | Failed jobs / batches viewer |
203
128
 
204
- ```
205
- laravel-admin/
206
- ├── src/ # основной пакет dskripchenko/laravel-admin
207
- ├── resources/ts/ # SPA-бандл @dskripchenko/laravel-admin
208
- ├── packages/ # sister-packs, локально
209
- │ ├── starter/
210
- │ ├── tinymce/
211
- │ ├── quill/
212
- │ ├── search/
213
- │ ├── media/
214
- │ ├── health/
215
- │ ├── pulse/
216
- │ └── jobs/
217
- └── docs/
218
- ```
129
+ ## Contributing
219
130
 
220
- - Composer: корневой `composer.json` содержит `repositories: [{ type: path, url: packages/* }]` — sister-packs резолвятся локально через симлинки. Это позволяет менять core и sister-packs одновременно без публикации dev-версий.
221
- - NPM: workspaces для `packages/tinymce` и `packages/quill` (только им нужны npm-зависимости). `npm install` из корня устанавливает зависимости всем сразу.
222
- - **Перед первым стабильным релизом** sister-packs выносятся в отдельные репозитории на github.com/dskripchenko и публикуются на packagist/npm независимо. На этот момент `repositories` в корневом `composer.json` удаляются, sister-packs ставятся обычным `composer require`.
131
+ See [CONTRIBUTING.md](CONTRIBUTING.md). PRs welcome.
223
132
 
224
133
  ## License
225
134
 
226
- MIT. См. [LICENSE](LICENSE).
135
+ [MIT](LICENSE) © Denis Skripchenko
package/README.ru.md ADDED
@@ -0,0 +1,135 @@
1
+ # dskripchenko/laravel-admin
2
+
3
+ > 🌐 [English](README.md) · **Русский** · [Deutsch](README.de.md) · [中文](README.zh.md)
4
+
5
+ Конструктор админ-панели для Laravel в духе Orchid — с собственным Vue 3 SPA-фронтендом.
6
+
7
+ [![npm](https://img.shields.io/npm/v/@dskripchenko/laravel-admin?label=%40dskripchenko%2Flaravel-admin)](https://www.npmjs.com/package/@dskripchenko/laravel-admin)
8
+ [![Packagist](https://img.shields.io/packagist/v/dskripchenko/laravel-admin)](https://packagist.org/packages/dskripchenko/laravel-admin)
9
+ [![License](https://img.shields.io/packagist/l/dskripchenko/laravel-admin)](LICENSE)
10
+
11
+ ```php
12
+ Admin::resources([UserResource::class, ArticleResource::class]);
13
+ Admin::screen([ContactScreen::class, SystemStatusScreen::class]);
14
+ Admin::menu()->add(
15
+ MenuNode::make('content', 'Контент')->icon('book')->children([
16
+ MenuNode::resource('articles'),
17
+ MenuNode::dashboard('analytics'),
18
+ ]),
19
+ );
20
+ ```
21
+
22
+ ## Что внутри
23
+
24
+ - **CRUD-pipeline** — объявите Eloquent-модель как `Resource` и
25
+ получите list/create/edit/view-страницы автоматически.
26
+ - **Кастомные Screen'ы** — формы, отчёты, дашборды и любые non-CRUD
27
+ страницы через `Admin::screen()`. State, layout, command-bar,
28
+ валидация, permissions.
29
+ - **Иерархическое меню** — fluent API `Admin::menu()->add(MenuNode::...)`,
30
+ любая глубина, auto-resolve `resource()`/`screen()`/`dashboard()`.
31
+ - **30+ типов полей** — Input/Number/Select/Combobox/DatePicker/
32
+ ColorPicker/FileUpload/Wysiwyg/Markdown/TranslatableInput/Repeater/
33
+ RelationSelect/Cascader/TreeSelect/Slug/KeyValue/TagsInput/...
34
+ - **15+ layout'ов** — Rows/Columns/Tabs/Wizard+Step/Block/Modal/Drawer/
35
+ Wrapper/Infolist/Dashboard/Accordion/View/...
36
+ - **Таблицы** — sortable/searchable колонки, presets, фильтры,
37
+ inline-edit, summary, saved views, group-by, polling, экспорт
38
+ (CSV/XLSX/PDF).
39
+ - **Dashboard** — 8 типов виджетов (Stats/Chart/RecentList/Markdown/
40
+ Iframe/Table/Heatmap/Gauge), per-user layout-override'ы, drag/resize,
41
+ polling.
42
+ - **Auth & RBAC** — multi-guard, AdminUser, Roles, 2FA TOTP, profile,
43
+ impersonation, password-reset, email-verification.
44
+ - **Audit** — append-only журнал админских действий
45
+ (`AuditLog` + trait `Loggable`).
46
+ - **Settings** — singleton-страницы конфигурации.
47
+ - **Уведомления** — bell-badge + drawer (Database notifications).
48
+ - **API-токены** — Sanctum в Profile (опционально).
49
+ - **Темы** — light/dark + per-user, дизайн-токены `@dskripchenko/ui`.
50
+ - **i18n** — locale-resolver (5 уровней приоритета),
51
+ `TranslatableField`-bridge с `dskripchenko/laravel-translatable`.
52
+ - **Tenancy** — `TenantResolver` / `TenantContext` / trait
53
+ `TenantScoped`. Стратегия — на стороне host'а, мы даём контракт.
54
+ - **Plugins** — интерфейс `AdminPlugin`; sister-pack'и используют тот же hook.
55
+ - **Тестирование** — `ResourceTestCase`, `ScreenTestCase`, trait
56
+ `ActsAsAdmin`.
57
+ - **OpenAPI 3.0** — генерируется из docblock-тегов `@input`/`@output`.
58
+
59
+ ## Установка
60
+
61
+ ```bash
62
+ composer require dskripchenko/laravel-admin
63
+ php artisan vendor:publish --tag=admin-config
64
+ php artisan migrate
65
+ ```
66
+
67
+ ```js
68
+ // resources/js/admin.js
69
+ import { createAdminApp } from '@dskripchenko/laravel-admin'
70
+ import '@dskripchenko/ui/styles/all.css'
71
+ import '@dskripchenko/laravel-admin/style.css'
72
+
73
+ const { app } = createAdminApp(window.__ADMIN_BOOTSTRAP__)
74
+ app.mount('#admin-app')
75
+ ```
76
+
77
+ ```bash
78
+ npm i @dskripchenko/laravel-admin @dskripchenko/ui
79
+ npm run build
80
+ ```
81
+
82
+ Открой `/admin/login`. См. [getting-started.md](docs/ru/getting-started.md)
83
+ для первого resource'а.
84
+
85
+ ## Документация
86
+
87
+ - [Быстрый старт](docs/ru/getting-started.md)
88
+ - [Архитектура](docs/ru/architecture.md)
89
+ - Концепции: [Resources](docs/ru/concepts/resources.md) ·
90
+ [Screens](docs/ru/concepts/screens.md) ·
91
+ [Widgets & Dashboards](docs/ru/concepts/widgets-and-dashboards.md) ·
92
+ [Menu](docs/ru/concepts/menu.md) ·
93
+ [Actions](docs/en/concepts/actions.md) (en) ·
94
+ [Permissions](docs/en/concepts/permissions.md) (en) ·
95
+ [i18n](docs/en/concepts/i18n.md) (en) ·
96
+ [Tenancy](docs/en/concepts/tenancy.md) (en)
97
+ - [Каталог полей](docs/en/fields-reference.md) (en)
98
+ - [Каталог layout'ов](docs/en/layouts-reference.md) (en)
99
+ - [API reference](docs/en/api-reference.md) (en)
100
+ - [Frontend-расширение](docs/en/frontend-extension.md) (en)
101
+ - [Тестирование](docs/en/testing.md) (en)
102
+ - [Migration guide](docs/en/migration-guide.md) (en)
103
+ - [Глоссарий](docs/ru/glossary.md)
104
+
105
+ ## Стек
106
+
107
+ - **PHP** ^8.5
108
+ - **Laravel** ^12
109
+ - **Vue** ^3.4 + TypeScript + Pinia + Vue Router
110
+ - **Bundle** — `@dskripchenko/laravel-admin` ~62 KB gz (esm + cjs)
111
+ - **Без vendor lock-in** для редактора/чартов — подключай свой
112
+ (sister-pack-адаптеры: `quill`, `tinymce`)
113
+
114
+ ## Sister-пакеты
115
+
116
+ Опциональные расширения, ставь только нужные:
117
+
118
+ | Пакет | Назначение |
119
+ |---|---|
120
+ | `dskripchenko/laravel-admin-starter` | Resources для User/Role/Audit/Settings/Translations/Blocks |
121
+ | `dskripchenko/laravel-admin-tinymce` | TinyMCE WYSIWYG-адаптер |
122
+ | `dskripchenko/laravel-admin-quill` | Quill WYSIWYG-адаптер |
123
+ | `dskripchenko/laravel-admin-search` | ⌘K command palette + Scout suggest |
124
+ | `dskripchenko/laravel-admin-media` | Медиа-библиотека (без Spatie/medialibrary) |
125
+ | `dskripchenko/laravel-admin-health` | Health checks (без Spatie/laravel-health) |
126
+ | `dskripchenko/laravel-admin-pulse` | Telemetry (без laravel/pulse) |
127
+ | `dskripchenko/laravel-admin-jobs` | Failed jobs / batches viewer |
128
+
129
+ ## Contributing
130
+
131
+ См. [CONTRIBUTING.md](CONTRIBUTING.md). PR'ы welcome.
132
+
133
+ ## Лицензия
134
+
135
+ [MIT](LICENSE) © Denis Skripchenko