@luminix/mui-cms 0.2.13 → 1.0.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.
@@ -0,0 +1,183 @@
1
+ # Facades
2
+
3
+ As facades são a interface pública dos serviços internos da biblioteca. Elas seguem o padrão `Reducible`, o que significa que qualquer método pode ser extendido via redutores.
4
+
5
+ ## Cms
6
+
7
+ Facade do `CmsService`. Gerencia rotas, menu, componentes e ações do painel.
8
+
9
+ ```ts
10
+ import { Cms } from '@luminix/mui-cms';
11
+ ```
12
+
13
+ ### Métodos
14
+
15
+ #### `Cms.getRoutes(): RouteObject[]`
16
+
17
+ Retorna as rotas registradas no painel (formato do `react-router-dom`).
18
+
19
+ #### `Cms.getMenuItems(): MenuItem[]`
20
+
21
+ Retorna os itens do menu lateral. Por padrão inclui o Dashboard e um item para cada modelo do manifesto.
22
+
23
+ #### `Cms.getComponents(): Record<string, React.ComponentType>`
24
+
25
+ Retorna o mapa de componentes registrados (ver [Componentes](componentes.md)).
26
+
27
+ #### `Cms.getComponent(name: string): React.ComponentType`
28
+
29
+ Retorna um componente pelo nome.
30
+
31
+ #### `Cms.getModelFormProps(item: ModelType): ModelFormProps`
32
+
33
+ Retorna as props do `ModelForm` para um item específico.
34
+
35
+ #### `Cms.getMassActions(ModelClass, currentTab): MassAction[]`
36
+
37
+ Retorna as ações em massa disponíveis para o modelo e aba ativos.
38
+
39
+ #### `Cms.getInstanceActions(ModelClass, currentTab): InstanceAction[]`
40
+
41
+ Retorna as ações de instância (por linha) disponíveis.
42
+
43
+ #### `Cms.getStaticActions(ModelClass, currentTab): StaticAction[]`
44
+
45
+ Retorna as ações estáticas (nível de listagem, ex.: "Criar novo").
46
+
47
+ ### Redutores disponíveis
48
+
49
+ | Redutor | Assinatura | Uso |
50
+ |---|---|---|
51
+ | `cmsRoutes` | `(routes, components, models) => routes` | Adicionar/modificar rotas |
52
+ | `componentMap` | `(map) => map` | Substituir componentes internos |
53
+ | `menuItems` | `(items, models) => items` | Personalizar o menu lateral |
54
+ | `wireModelFormProps` | `(props, item) => props` | Alterar props do formulário por modelo |
55
+ | `massActions` | `(actions, ModelClass, tab) => actions` | Adicionar/remover ações em massa |
56
+ | `instanceActions` | `(actions, ModelClass, tab) => actions` | Adicionar/remover ações de instância |
57
+ | `staticActions` | `(actions, ModelClass, tab) => actions` | Adicionar/remover ações estáticas |
58
+ | `model{Name}Columns` | `() => Column[]` | Definir colunas da tabela por modelo |
59
+ | `mass{Name}Actions` | idem massActions | Ações em massa específicas por modelo |
60
+ | `instance{Name}Actions` | idem instanceActions | Ações de instância específicas por modelo |
61
+ | `static{Name}Actions` | idem staticActions | Ações estáticas específicas por modelo |
62
+
63
+ > `{Name}` é o nome do modelo em StudlyCase. Ex.: `modelPostColumns`, `massPostActions`.
64
+
65
+ ---
66
+
67
+ ## Filter
68
+
69
+ Facade do `FilterService`. Gerencia os filtros avançados da tabela.
70
+
71
+ ```ts
72
+ import { Filter } from '@luminix/mui-cms';
73
+ ```
74
+
75
+ ### Métodos
76
+
77
+ #### `Filter.getInputType(type: string): string`
78
+
79
+ Converte o tipo PHP/Eloquent do atributo no tipo de input HTML correspondente.
80
+
81
+ | Tipo do modelo | Input retornado |
82
+ |---|---|
83
+ | `int`, `float`, `number` | `number` |
84
+ | `date` | `date` |
85
+ | `datetime`, `timestamp` | `datetime-local` |
86
+ | `bool`, `boolean` | `boolean` |
87
+ | `autocomplete` | `autocomplete` |
88
+ | demais | `text` |
89
+
90
+ #### `Filter.getOperators(): string[]`
91
+
92
+ Retorna a lista de operadores configurada em `luminix.admin.filter.operators`.
93
+
94
+ #### `Filter.getMatchingOperators(column: FilterColumn): InputOption[]`
95
+
96
+ Retorna os operadores aplicáveis a uma coluna específica, filtrando por tipo e nullable.
97
+
98
+ #### `Filter.getFilterableColumns(ModelClass): FilterColumn[]`
99
+
100
+ Retorna as colunas filtráveis do modelo (atributos não ocultos e relacionamentos).
101
+
102
+ #### `Filter.checkIfCanApplyFilters(columnsFilter: FilteredColumn[]): boolean`
103
+
104
+ Verifica se o estado atual dos filtros é válido para envio (retorna `true` se houver filtro incompleto).
105
+
106
+ ### Redutores disponíveis
107
+
108
+ | Redutor | Assinatura | Uso |
109
+ |---|---|---|
110
+ | `filterableColumns` | `(columns, ModelClass) => columns` | Adicionar/remover colunas filtráveis |
111
+
112
+ ---
113
+
114
+ ## Icon
115
+
116
+ Serviço de gerenciamento de ícones. **Não** é uma facade `Reducible`; é um singleton instanciado diretamente.
117
+
118
+ ```ts
119
+ import { Icon } from '@luminix/mui-cms';
120
+ ```
121
+
122
+ ### Ícones registrados por padrão
123
+
124
+ A biblioteca pré-registra os seguintes ícones do `@mui/icons-material`:
125
+
126
+ `Add`, `AddCircleOutline`, `ArrowDownward`, `ArrowDropDown`, `ArrowUpward`, `CategoryOutlined`, `ChevronLeft`, `ChevronRight`, `Close`, `DashboardOutlined`, `ExpandLess`, `ExpandMore`, `FilterList`, `FirstPage`, `HighlightOffOutlined`, `LastPage`, `Menu`, `MoreVert`, `PeopleOutlined`, `Search`, `SwapVert`
127
+
128
+ ### Métodos
129
+
130
+ #### `Icon.registerIcon(name, component)`
131
+
132
+ Registra um ícone individual:
133
+
134
+ ```ts
135
+ import { Icon } from '@luminix/mui-cms';
136
+ import { Star } from '@mui/icons-material';
137
+
138
+ Icon.registerIcon('Star', Star);
139
+ ```
140
+
141
+ #### `Icon.registerIcon(iconMap)`
142
+
143
+ Registra múltiplos ícones de uma vez:
144
+
145
+ ```ts
146
+ import { Star, Home } from '@mui/icons-material';
147
+
148
+ Icon.registerIcon({ Star, Home });
149
+ ```
150
+
151
+ #### `Icon.make(name: string): React.ComponentType`
152
+
153
+ Retorna o componente do ícone pelo nome.
154
+
155
+ #### `Icon.render(name: string, props?): React.ReactNode`
156
+
157
+ Renderiza o ícone como nó React:
158
+
159
+ ```ts
160
+ Icon.render('Star', { fontSize: 'small', color: 'primary' })
161
+ ```
162
+
163
+ #### `Icon.forModel(model: string, icon: string)`
164
+
165
+ Associa um ícone a um modelo. O nome do modelo deve ser o `schemaName` (snake_case):
166
+
167
+ ```ts
168
+ Icon.forModel('post', 'Article');
169
+ Icon.forModel('user', 'PeopleOutlined'); // já registrado por padrão
170
+ ```
171
+
172
+ #### `Icon.all(): string[]`
173
+
174
+ Lista os nomes de todos os ícones registrados.
175
+
176
+ ---
177
+
178
+ ## Próximos passos
179
+
180
+ - [Hooks](hooks.md) — hooks para uso em componentes customizados
181
+ - [Ações](acoes.md) — como definir ações para os modelos
182
+ - [Extensibilidade](extensibilidade.md) — redutores em profundidade
183
+ - [Volta ao índice](index.md)
package/docs/hooks.md ADDED
@@ -0,0 +1,307 @@
1
+ # Hooks
2
+
3
+ Todos os hooks abaixo são exportados de `@luminix/mui-cms` e devem ser usados dentro da árvore de componentes do `LuminixCms`.
4
+
5
+ ```ts
6
+ import { useNotify, useDialog, useTable, /* ... */ } from '@luminix/mui-cms';
7
+ ```
8
+
9
+ ---
10
+
11
+ ## Navegação e página
12
+
13
+ ### usePageTitle
14
+
15
+ Retorna o título atual da página.
16
+
17
+ ```ts
18
+ const title = usePageTitle(); // string
19
+ ```
20
+
21
+ ### useSetPageTitle
22
+
23
+ Recebe um `title` como argumento e define o título da página enquanto o componente está montado. Remove o título automaticamente no unmount.
24
+
25
+ ```ts
26
+ useSetPageTitle('Meus Posts');
27
+ ```
28
+
29
+ Não retorna valor.
30
+
31
+ ### useSearch
32
+
33
+ Torna a barra de busca visível enquanto o componente está montado. Esconde-a automaticamente no unmount.
34
+
35
+ ```ts
36
+ useSearch();
37
+ ```
38
+
39
+ Não recebe parâmetros nem retorna valor. Para ler o valor atual da busca (query string), use diretamente `useSearchParams` do `react-router-dom`.
40
+
41
+ ### useHasSearch
42
+
43
+ Retorna `true` se a barra de busca está visível no momento.
44
+
45
+ ```ts
46
+ const hasSearch = useHasSearch(); // boolean
47
+ ```
48
+
49
+ ### useBackButton
50
+
51
+ Torna o botão voltar visível enquanto o componente está montado. Esconde-o automaticamente no unmount.
52
+
53
+ ```ts
54
+ useBackButton();
55
+ ```
56
+
57
+ Não recebe parâmetros nem retorna valor.
58
+
59
+ ### useHasBackButton
60
+
61
+ Retorna `true` se o botão voltar está visível no momento.
62
+
63
+ ```ts
64
+ const hasBack = useHasBackButton(); // boolean
65
+ ```
66
+
67
+ ---
68
+
69
+ ## Estado da tabela
70
+
71
+ ### useTable
72
+
73
+ Retorna o valor completo do `TableContext`. Disponível dentro de componentes filhos do `TableProvider`.
74
+
75
+ ```ts
76
+ const {
77
+ columns, // Column[]
78
+ columnCount, // number
79
+ massActions, // MassAction[]
80
+ items, // Collection<Model> | undefined
81
+ loading, // boolean | undefined
82
+ error, // Error | null
83
+ Model, // typeof ModelType
84
+ selected, // Collection<Model>
85
+ } = useTable();
86
+ ```
87
+
88
+ ### useSelection
89
+
90
+ Retorna utilitários para gerenciar a seleção de linhas da tabela.
91
+
92
+ ```ts
93
+ const {
94
+ selected, // Collection<Model> — itens selecionados (reativo)
95
+ indeterminate, // boolean — true se parte dos itens está selecionada
96
+ allSelected, // boolean — true se todos os itens da página estão selecionados
97
+ isSelected, // (item: Model) => boolean
98
+ handleClearSelected, // () => void
99
+ handleSelectToggle, // (item: Model) => void
100
+ handleSelectToggleAll, // () => void
101
+ } = useSelection();
102
+ ```
103
+
104
+ ### useCurrentModel
105
+
106
+ Retorna a classe do modelo ativo na tela atual. Disponível dentro de um `ModelProvider`.
107
+
108
+ ```ts
109
+ const ModelClass = useCurrentModel(); // typeof ModelType
110
+ ```
111
+
112
+ ---
113
+
114
+ ## Notificações
115
+
116
+ ### useNotify
117
+
118
+ Retorna a função `notify` para exibir notificações toast.
119
+
120
+ ```ts
121
+ const notify = useNotify();
122
+
123
+ // forma simplificada
124
+ notify('Salvo com sucesso!');
125
+
126
+ // com objeto completo
127
+ notify({
128
+ message: 'Post publicado.',
129
+ severity: 'success', // 'success' | 'error' | 'warning' | 'info'
130
+ title: 'Sucesso', // opcional
131
+ actions: [ // opcional — botões de ação no toast
132
+ { label: 'Desfazer', callback: () => { /* ... */ } },
133
+ ],
134
+ });
135
+ ```
136
+
137
+ A assinatura completa:
138
+
139
+ ```ts
140
+ type NotifyFunction = (notification: string | Notification) => void;
141
+
142
+ type Notification = {
143
+ message: React.ReactNode;
144
+ severity?: 'success' | 'error' | 'warning' | 'info';
145
+ title?: React.ReactNode;
146
+ actions?: { label: React.ReactNode; callback: () => void }[];
147
+ };
148
+ ```
149
+
150
+ ### useNotifications
151
+
152
+ Acessa o estado interno do `NotificationContext`. Útil para criar providers de notificação customizados.
153
+
154
+ ```ts
155
+ const {
156
+ isOpen,
157
+ notify,
158
+ dismissNotification,
159
+ notifications, // Notification[]
160
+ current, // Notification | undefined — notificação sendo exibida
161
+ displacement, // string — deslocamento CSS atual do Snackbar
162
+ } = useNotifications();
163
+ ```
164
+
165
+ ### useDisplaceNotifications
166
+
167
+ Define o deslocamento (offset) do Snackbar de notificações. Útil para evitar sobreposição com elementos fixos como FABs ou rodapés.
168
+
169
+ ```ts
170
+ useDisplaceNotifications(value);
171
+ ```
172
+
173
+ - `value: string | number | false` — número de unidades de espaçamento MUI, string CSS ou `false` para restaurar o valor padrão.
174
+ - O deslocamento é restaurado automaticamente no unmount.
175
+
176
+ ```ts
177
+ // desloca 8 unidades de espaçamento MUI acima do padrão
178
+ useDisplaceNotifications(8);
179
+
180
+ // restaura o deslocamento padrão
181
+ useDisplaceNotifications(false);
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Diálogos
187
+
188
+ ### useDialog
189
+
190
+ Retorna a função `dialog` para abrir diálogos modais. Retorna uma `Promise` que resolve com o resultado da interação do usuário.
191
+
192
+ ```ts
193
+ const dialog = useDialog();
194
+
195
+ // forma simplificada — abre um alerta
196
+ const confirmed = await dialog('Tem certeza?');
197
+
198
+ // com objeto completo
199
+ const result = await dialog({
200
+ title: 'Confirmar exclusão',
201
+ message: 'Esta ação não pode ser desfeita.',
202
+ type: 'confirm', // 'alert' | 'confirm' | 'prompt'
203
+ dismissable: true, // permite fechar clicando fora
204
+ confirmText: 'Excluir',
205
+ cancelText: 'Cancelar',
206
+ // para type: 'prompt':
207
+ defaultValue: '',
208
+ textFieldProps: { label: 'Nome do arquivo' },
209
+ });
210
+ // result: true (confirmou) | false (cancelou) | string (prompt)
211
+ ```
212
+
213
+ A assinatura completa:
214
+
215
+ ```ts
216
+ type DialogFunction = (message: string | DialogMessage) => Promise<boolean | string>;
217
+
218
+ type DialogMessage = {
219
+ title?: React.ReactNode;
220
+ message: React.ReactNode;
221
+ type?: 'alert' | 'confirm' | 'prompt';
222
+ dismissable?: boolean;
223
+ confirmText?: string;
224
+ cancelText?: string;
225
+ defaultValue?: string; // valor inicial para type 'prompt'
226
+ dialogProps?: Partial<DialogProps>;
227
+ textFieldProps?: Partial<TextFieldProps>;
228
+ };
229
+ ```
230
+
231
+ ---
232
+
233
+ ## Layout
234
+
235
+ ### useLayoutConfig
236
+
237
+ Lê um valor da configuração de layout (`CmsConfig['layout']`) pelo caminho (dot notation).
238
+
239
+ ```ts
240
+ const drawerWidth = useLayoutConfig('drawer.width', 240);
241
+ const appBarColor = useLayoutConfig('appBar.color');
242
+ ```
243
+
244
+ Parâmetros:
245
+ - `path: string` — caminho no objeto de layout (ex.: `'drawer.width'`, `'appBar.height'`)
246
+ - `defaultValue?: unknown` — valor retornado se o caminho não estiver definido
247
+
248
+ ### useIsDesktopMode
249
+
250
+ Retorna `true` quando a largura da tela está acima do breakpoint configurado em `layout.breakpoint`.
251
+
252
+ ```ts
253
+ const isDesktop = useIsDesktopMode(); // boolean
254
+ ```
255
+
256
+ ### useMenu
257
+
258
+ Retorna o estado de abertura do Drawer lateral e funções para controlá-lo.
259
+
260
+ ```ts
261
+ const {
262
+ open, // boolean — true se o Drawer está aberto
263
+ handleDrawerOpen, // () => void
264
+ handleDrawerClose, // () => void
265
+ toggle, // () => void
266
+ } = useMenu();
267
+ ```
268
+
269
+ ---
270
+
271
+ ## Eventos e ações
272
+
273
+ ### useActionEvent
274
+
275
+ Monta o objeto `ActionCallbackEvent` — útil para chamar manualmente callbacks de ações em componentes customizados.
276
+
277
+ ```ts
278
+ const event = useActionEvent();
279
+
280
+ event.navigate('/posts');
281
+ event.refresh();
282
+ event.notify('Salvo!');
283
+ await event.dialog({ message: 'Confirmar?' });
284
+ event.t('chave.de.traducao');
285
+ ```
286
+
287
+ ### useHandleError
288
+
289
+ Retorna uma função que trata erros de requisição e os exibe como notificação.
290
+
291
+ ```ts
292
+ const handleError = useHandleError();
293
+
294
+ try {
295
+ await model.save();
296
+ } catch (err) {
297
+ handleError(err);
298
+ }
299
+ ```
300
+
301
+ ---
302
+
303
+ ## Próximos passos
304
+
305
+ - [Ações](acoes.md) — como definir ações estáticas, de instância e em massa
306
+ - [Extensibilidade](extensibilidade.md) — customizações via redutores
307
+ - [Volta ao índice](index.md)
package/docs/index.md ADDED
@@ -0,0 +1,25 @@
1
+ # Documentação — @luminix/mui-cms
2
+
3
+ Bem-vindo à documentação da biblioteca `@luminix/mui-cms`.
4
+
5
+ ## Páginas
6
+
7
+ | Página | Descrição |
8
+ |---|---|
9
+ | [Introdução](introducao.md) | O que é a biblioteca, visão geral do ecossistema Luminix |
10
+ | [Instalação](instalacao.md) | Como instalar e configurar o ambiente |
11
+ | [Configuração](configuracao.md) | Opções de configuração do layout e tema |
12
+ | [Componentes](componentes.md) | `LuminixCms`, `Link` e providers de contexto |
13
+ | [Facades](facades.md) | `Cms`, `Filter` e `Icon` |
14
+ | [Hooks](hooks.md) | Todos os hooks exportados pela biblioteca |
15
+ | [Ações](acoes.md) | Ações estáticas, de instância e em massa |
16
+ | [Extensibilidade](extensibilidade.md) | Como customizar via redutores |
17
+ | [Referência de tipos](tipos.md) | Tipos TypeScript exportados |
18
+
19
+ ---
20
+
21
+ ## Próximos passos
22
+
23
+ - Comece pela [Introdução](introducao.md) para entender o ecossistema.
24
+ - Se já conhece o Luminix, vá direto para [Instalação](instalacao.md).
25
+ - Para customizar o painel, consulte [Extensibilidade](extensibilidade.md).
@@ -0,0 +1,95 @@
1
+ # Instalação
2
+
3
+ ## Via luminix/admin (recomendado)
4
+
5
+ O caminho mais simples é usar o pacote Laravel `luminix/admin`, que instala e configura todas as dependências automaticamente:
6
+
7
+ ```bash
8
+ composer require luminix/admin
9
+ php artisan luminix:admin-ui
10
+ ```
11
+
12
+ O comando `luminix:admin-ui` publica os arquivos JavaScript em `resources/js/`, instala as dependências npm e configura o Vite. Após isso, basta compilar:
13
+
14
+ ```bash
15
+ npm run build
16
+ # ou, em desenvolvimento:
17
+ npm run dev
18
+ ```
19
+
20
+ O painel estará disponível em `/admin`.
21
+
22
+ > Consulte a documentação do `luminix/admin` para detalhes sobre middleware, permissões e configuração do servidor.
23
+
24
+ ---
25
+
26
+ ## Instalação manual
27
+
28
+ Se preferir integrar a biblioteca em um projeto React existente, instale as dependências:
29
+
30
+ ```bash
31
+ npm install @luminix/mui-cms \
32
+ @luminix/core \
33
+ @luminix/react \
34
+ @luminix/support \
35
+ @mui/material \
36
+ @mui/icons-material \
37
+ @emotion/react \
38
+ @emotion/styled \
39
+ @fontsource/roboto \
40
+ i18next \
41
+ react-i18next \
42
+ react-router-dom@6.25.1
43
+ ```
44
+
45
+ ### Ponto de entrada
46
+
47
+ ```tsx
48
+ // src/main.tsx
49
+ import '@fontsource/roboto/300.css';
50
+ import '@fontsource/roboto/400.css';
51
+ import '@fontsource/roboto/500.css';
52
+ import '@fontsource/roboto/700.css';
53
+
54
+ import React from 'react';
55
+ import ReactDOM from 'react-dom/client';
56
+ import { LuminixCms } from '@luminix/mui-cms';
57
+
58
+ ReactDOM.createRoot(document.getElementById('root')!).render(
59
+ <React.StrictMode>
60
+ <LuminixCms />
61
+ </React.StrictMode>
62
+ );
63
+ ```
64
+
65
+ ### Pré-requisitos no backend
66
+
67
+ A instalação manual requer que o backend Laravel já tenha os pacotes `luminix/backend` e `luminix/frontend` configurados, com `@luminixEmbed()` presente no template Blade que carrega o JavaScript.
68
+
69
+ ---
70
+
71
+ ## Dependências peer
72
+
73
+ | Pacote | Versão mínima |
74
+ |---|---|
75
+ | `react` | ^18.3.1 |
76
+ | `react-dom` | ^18.3.1 |
77
+ | `react-router-dom` | 6.25.1 |
78
+ | `@mui/material` | ^5.16.5 |
79
+ | `@mui/icons-material` | ^5.16.5 |
80
+ | `@emotion/react` | ^11.13.0 |
81
+ | `@emotion/styled` | ^11.13.0 |
82
+ | `@fontsource/roboto` | ^5.0.12 |
83
+ | `@luminix/core` | ^1.0.0 |
84
+ | `@luminix/react` | ^1.0.0 |
85
+ | `@luminix/support` | ^1.0.1 |
86
+ | `i18next` | ^23.12.2 |
87
+ | `react-i18next` | ^15.0.1 |
88
+
89
+ ---
90
+
91
+ ## Próximos passos
92
+
93
+ - [Configuração](configuracao.md) — personalize o tema e o layout
94
+ - [Componentes](componentes.md) — conheça o `LuminixCms` e os providers
95
+ - [Volta ao índice](index.md)
@@ -0,0 +1,72 @@
1
+ # Introdução
2
+
3
+ `@luminix/mui-cms` é a camada de interface do ecossistema Luminix: uma biblioteca de componentes React construída sobre o Material-UI que entrega um painel administrativo (CMS) completo e extensível, pronto para ser integrado a qualquer aplicação Laravel.
4
+
5
+ ## O ecossistema Luminix
6
+
7
+ O Luminix é composto por pacotes que cooperam em camadas bem definidas:
8
+
9
+ ```
10
+ Laravel (servidor)
11
+ ├── luminix/backend → Gera endpoints REST automáticos para modelos Eloquent
12
+ └── luminix/frontend → Injeta dados de boot no HTML via @luminixEmbed()
13
+
14
+ ↓ dados chegam ao navegador
15
+
16
+ JavaScript (cliente)
17
+ ├── @luminix/support → Utilitários, padrões Reducible/Macroable, cliente HTTP
18
+ ├── @luminix/core → Contêiner de app, sistema de modelos, roteamento
19
+ ├── @luminix/react → Hooks e componentes React base (formulários, paginação)
20
+ └── @luminix/mui-cms → Interface MUI: layout, tabelas, filtros, notificações
21
+ ```
22
+
23
+ O pacote `luminix/admin` (Laravel) orquestra toda a integração: publica os arquivos React, configura o Vite e serve o painel em `/admin`.
24
+
25
+ ## Responsabilidades de cada camada
26
+
27
+ ### luminix/backend
28
+ Aplica a trait `LuminixModel` nos modelos Eloquent e expõe automaticamente endpoints REST em `/luminix-api/*`. Suporta filtros avançados, paginação, ordenação, soft deletes e controle de acesso via Laravel Gates.
29
+
30
+ Documentação: `luminix/backend/docs/`
31
+
32
+ ### luminix/frontend
33
+ Fornece a diretiva Blade `@luminixEmbed()` que injeta no HTML o manifesto de modelos e rotas, configuração da aplicação, usuário autenticado e token CSRF — tudo o que o frontend JavaScript precisa para inicializar.
34
+
35
+ Documentação: `luminix/frontend/docs/`
36
+
37
+ ### @luminix/support
38
+ Base de infraestrutura: coleções, manipulação de strings/objetos/arrays, cliente HTTP com axios, container de aplicação e os padrões `Reducible` e `Macroable` usados em toda a stack.
39
+
40
+ Documentação: `@luminix/support/docs/`
41
+
42
+ ### @luminix/core
43
+ Fachadas de alto nível (`App`, `Auth`, `Config`, `Model`, `Route`) e o sistema de modelos com suporte a relacionamentos e queries encadeadas.
44
+
45
+ Documentação: `@luminix/core/docs/`
46
+
47
+ ### @luminix/react
48
+ Camada React: `LuminixProvider`, `ModelForm`, hooks de formulário (`useForm`), paginação (`usePagination`), requisições (`useQuery`) e acesso a coleções (`useCollection`).
49
+
50
+ Documentação: `@luminix/react/docs/`
51
+
52
+ ### @luminix/mui-cms _(esta biblioteca)_
53
+ Interface completa: layout responsivo com AppBar e Drawer, tabelas com filtros, ações (estáticas, de instância, em massa), sistema de notificações, diálogos e todas as extensões via redutores.
54
+
55
+ ### luminix/admin _(não documentado ainda)_
56
+ Pacote Laravel que integra tudo: publica os arquivos React em `resources/js/`, configura o Vite, registra as rotas do painel e serve a SPA em `/admin`. É o ponto de entrada recomendado para quem quer usar o Luminix CMS em um projeto Laravel sem precisar configurar cada peça manualmente.
57
+
58
+ ## Fluxo de dados
59
+
60
+ 1. O Laravel renderiza o HTML com `@luminixEmbed()` — que injeta boot data e manifesto.
61
+ 2. O JavaScript inicializa o contêiner de aplicação via `@luminix/core`.
62
+ 3. O `LuminixCms` monta a SPA com `react-router-dom` e Material-UI.
63
+ 4. O painel descobre os modelos pelo manifesto e gera rotas, menus e telas automaticamente.
64
+ 5. Toda requisição de dados passa pelo cliente HTTP de `@luminix/support` com o token CSRF já configurado.
65
+
66
+ ---
67
+
68
+ ## Próximos passos
69
+
70
+ - [Instalação](instalacao.md) — como instalar e configurar o ambiente de desenvolvimento
71
+ - [Configuração](configuracao.md) — tema MUI, layout e opções disponíveis
72
+ - [Volta ao índice](index.md)