forlogic-core 1.16.4 → 1.16.6
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/dist/README.md +116 -116
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/docs/DESIGN_SYSTEM.md +12 -0
- package/package.json +4 -2
- package/dist/assets/AccordionDoc-BnfxyOi9.js +0 -31
- package/dist/assets/ActionButtonDoc-b4F_J8gn.js +0 -47
- package/dist/assets/AlertDoc-PkiHguSJ.js +0 -37
- package/dist/assets/AppHeaderDoc-CsFMZGV0.js +0 -67
- package/dist/assets/AppSidebarDoc-Bg71N-zq.js +0 -196
- package/dist/assets/AuthDoc-DDm57y_J.js +0 -192
- package/dist/assets/AvatarDoc-C6wiZIZR.js +0 -11
- package/dist/assets/BadgeDoc-Bsg7cfm0.js +0 -36
- package/dist/assets/BaseFormDoc-DeIlV273.js +0 -169
- package/dist/assets/BodyContentDoc-Q3DGvyN9.js +0 -83
- package/dist/assets/BreadcrumbDoc-ChsVFjMF.js +0 -75
- package/dist/assets/ButtonDoc-C7Q31Bh3.js +0 -41
- package/dist/assets/ButtonGroupDoc-Bn5vhjBq.js +0 -7
- package/dist/assets/CalendarDoc-iVjNyxyr.js +0 -81
- package/dist/assets/CardDoc-D511dll7.js +0 -49
- package/dist/assets/ChartDoc-CQyYOEHL.js +0 -111
- package/dist/assets/CheckboxDoc-Cjsy4XAq.js +0 -55
- package/dist/assets/ColorPickerDoc-hnYJUWpF.js +0 -10
- package/dist/assets/ColorsFoundationDoc-B8Z4tAyZ.js +0 -13
- package/dist/assets/ComboTreeDoc-ChEbW4a3.js +0 -21
- package/dist/assets/ComboboxDoc-CHWeGE_F.js +0 -134
- package/dist/assets/ComponentDocTemplate-BtOCnlM2.js +0 -1
- package/dist/assets/ContextMenuDoc-C3mFO_Yx.js +0 -182
- package/dist/assets/ContextsDoc-ChEbQxom.js +0 -184
- package/dist/assets/CreateCrudPageDoc-C9tXisCF.js +0 -106
- package/dist/assets/CrudActionBarDoc-Cp1L4gpO.js +0 -112
- package/dist/assets/CrudGridDoc-D-kSFBAQ.js +0 -85
- package/dist/assets/CrudOverviewDoc-CeLBwg-B.js +0 -14
- package/dist/assets/CrudPrimitivesDoc-B2u1vZog.js +0 -164
- package/dist/assets/CrudTableDoc-CvV-II_X.js +0 -95
- package/dist/assets/DataListDoc-BLRii0jB.js +0 -13
- package/dist/assets/DesignSystemHome-TE0Ubaup.js +0 -1
- package/dist/assets/DialogDoc--LC5Jvat.js +0 -981
- package/dist/assets/DropdownMenuDoc-oPlEriRY.js +0 -175
- package/dist/assets/EmptyStateDoc-rNqfWKok.js +0 -35
- package/dist/assets/EnvironmentsDoc-CT7l5s2u.js +0 -96
- package/dist/assets/ErrorBoundaryDoc-rPHOUygA.js +0 -111
- package/dist/assets/ExampleCard-DfuMYM6E.js +0 -1
- package/dist/assets/FormDoc-B0L_QaCT.js +0 -81
- package/dist/assets/FoundationOverview-Dbb8rBsU.js +0 -1
- package/dist/assets/GridDoc-ifcGA2Yw.js +0 -28
- package/dist/assets/HooksDoc-CUOT_3Du.js +0 -665
- package/dist/assets/HoverCardDoc-CdTU2QkI.js +0 -31
- package/dist/assets/I18nDoc-CMEvFqsz.js +0 -232
- package/dist/assets/IconPickerDoc-DF9hEwnJ.js +0 -10
- package/dist/assets/IconsFoundationDoc-D4Y0wKbm.js +0 -33
- package/dist/assets/InputDoc-d_IL4dsq.js +0 -211
- package/dist/assets/LabelDoc-Dr64ISiJ.js +0 -42
- package/dist/assets/LeadershipDoc-BnrTuaeV.js +0 -416
- package/dist/assets/MediaDoc-CLuVprAr.js +0 -459
- package/dist/assets/MenubarDoc-CW7L4QJ4.js +0 -165
- package/dist/assets/ModulesDialogDoc-CUb_g4X-.js +0 -71
- package/dist/assets/NavigationMenuDoc-Csc0U6bV.js +0 -116
- package/dist/assets/OnboardingDialogDoc-3RtjNH1O.js +0 -55
- package/dist/assets/PaginationDoc-BGurD4xQ.js +0 -27
- package/dist/assets/PaginationDoc-DqFyou6O.js +0 -98
- package/dist/assets/PlacesDoc-Dyx8gsqb.js +0 -226
- package/dist/assets/PopoverDoc-DHF-ItUX.js +0 -64
- package/dist/assets/ProgressDoc-DXKV-fkI.js +0 -29
- package/dist/assets/QualiexUserFieldDoc-BbP7w-Pu.js +0 -149
- package/dist/assets/RadioGroupDoc-D845uweM.js +0 -57
- package/dist/assets/RadiusDoc-vN4tTsay.js +0 -7
- package/dist/assets/RequiredFieldsCounterDoc-TzR9r-U9.js +0 -58
- package/dist/assets/ResizableDoc-Bkfz_25O.js +0 -104
- package/dist/assets/RichTextEditorDoc-BUQrg7M8.js +0 -24
- package/dist/assets/ScrollAreaDoc-B6ODYHMX.js +0 -28
- package/dist/assets/SecurityDoc-Chbt6w1s.js +0 -204
- package/dist/assets/SelectDoc-BhcpBIAO.js +0 -80
- package/dist/assets/SeparatorDoc-C3fhatb0.js +0 -4
- package/dist/assets/ServicesDoc-_uao-HA_.js +0 -308
- package/dist/assets/ShadowsDoc-DpkO_TZQ.js +0 -9
- package/dist/assets/SignDoc-BJtnoT6I.js +0 -66
- package/dist/assets/SkeletonDoc-BZS07PJh.js +0 -54
- package/dist/assets/SliderDoc-D2ApV3XT.js +0 -41
- package/dist/assets/SpacingDoc-PNrU24B2.js +0 -12
- package/dist/assets/SplitButtonDoc-D5tUF2Ja.js +0 -53
- package/dist/assets/StepSelectorDoc-Cj0ALYar.js +0 -41
- package/dist/assets/SwitchDoc-DtsT8oh_.js +0 -56
- package/dist/assets/TableDoc-BC-jQnXu.js +0 -128
- package/dist/assets/TableOfContents-DBMJMbI4.js +0 -1
- package/dist/assets/TabsDoc-DtXJ0xY5.js +0 -42
- package/dist/assets/TextareaDoc-nuW5tqBQ.js +0 -46
- package/dist/assets/ToastDoc-D1aX5zda.js +0 -157
- package/dist/assets/ToggleDoc-ILass4CS.js +0 -51
- package/dist/assets/TooltipDoc-lPbdWe_9.js +0 -58
- package/dist/assets/TruncatedCellDoc-DOAzbF2F.js +0 -12
- package/dist/assets/TypographyFoundationDoc-3ZD-rQZw.js +0 -7
- package/dist/assets/UtilitiesDoc-D7lkYhuz.js +0 -145
- package/dist/assets/blocks-Jy49RoqJ.js +0 -1
- package/dist/assets/calendar-days-Cvf2zLJl.js +0 -1
- package/dist/assets/circle-plus-MnG9kjyq.js +0 -1
- package/dist/assets/circle-x-B9ouupla.js +0 -1
- package/dist/assets/crown-BweN5jpI.js +0 -1
- package/dist/assets/date-picker-ttyYeYvC.js +0 -1
- package/dist/assets/disabled-menu-item-WlpPOqxg.js +0 -1
- package/dist/assets/drawer-DvU6_eK5.js +0 -3
- package/dist/assets/file-pen-line-C0VV-QjF.js +0 -1
- package/dist/assets/git-branch-DCjGGwvF.js +0 -1
- package/dist/assets/globe-BdFDFP_k.js +0 -1
- package/dist/assets/grip-vertical-CgXp0oI-.js +0 -1
- package/dist/assets/hash-BAYi_wfk.js +0 -1
- package/dist/assets/index-BtX5DZqb.js +0 -310
- package/dist/assets/index-C1So5Sai.css +0 -1
- package/dist/assets/life-buoy-BydIgTyJ.js +0 -1
- package/dist/assets/lucide-react-ZIMhRYmb.js +0 -1
- package/dist/assets/monitor-B6txWJPg.js +0 -1
- package/dist/assets/package-DNe3FsCh.js +0 -1
- package/dist/assets/pen-CzTmQ16z.js +0 -1
- package/dist/assets/pin-CJJgLEBz.js +0 -1
- package/dist/assets/radio-group-Btv_BY60.js +0 -1
- package/dist/assets/server-XQDXtrjm.js +0 -1
- package/dist/assets/share-2-Dz_89MJb.js +0 -1
- package/dist/assets/step-selector-D0_Y1dow.js +0 -1
- package/dist/assets/text-align-start-WsHo7CNJ.js +0 -1
- package/dist/assets/trash-CeK-mWnM.js +0 -1
- package/dist/assets/useMockCrud-RV9z9n5x.js +0 -1
- package/dist/assets/user-check-CrbWcnPN.js +0 -1
- package/dist/assets/user-plus-Dce9DbqQ.js +0 -1
- package/dist/index.html +0 -35
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import{j as e,C as a,bB as s,a$ as i,B as o,f as t,aA as r,b7 as n,aC as c,bZ as d,bu as l}from"./index-BtX5DZqb.js";import{C as u}from"./ComponentDocTemplate-BtOCnlM2.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function m(){return e.jsx("div",{className:"space-y-6",children:e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-green-500/10",children:e.jsx(d,{className:"h-5 w-5 text-green-500"})}),e.jsx("h4",{className:"font-semibold",children:"AuthProvider"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Context provider que gerencia estado de autenticação global"})]}),e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-blue-500/10",children:e.jsx(s,{className:"h-5 w-5 text-blue-500"})}),e.jsx("h4",{className:"font-semibold",children:"ProtectedRoute"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Componente que protege rotas e redireciona usuários não autenticados"})]}),e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-orange-500/10",children:e.jsx(l,{className:"h-5 w-5 text-orange-500"})}),e.jsx("h4",{className:"font-semibold",children:"TokenManager"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Gerenciador de tokens JWT com validação e refresh automático"})]}),e.jsxs(a,{className:"p-4 border-2",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[e.jsx("div",{className:"p-2 rounded-lg bg-purple-500/10",children:e.jsx(i,{className:"h-5 w-5 text-purple-500"})}),e.jsx("h4",{className:"font-semibold",children:"Multi-Tenant"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Suporte a múltiplas unidades/empresas com troca dinâmica"})]})]})})}function p(){return e.jsxs(a,{className:"p-4 space-y-3",children:[e.jsx("h4",{className:"font-medium",children:"Estado de Autenticação (AuthState):"}),e.jsxs("div",{className:"text-sm space-y-2",children:[e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"user"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"User | null"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"companies"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"Company[]"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"alias"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"string | null"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"isAuthenticated"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"boolean"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"isLoading"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"boolean"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"selectedUnit"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"SelectedUnit | null"})]}),e.jsxs("div",{className:"flex justify-between py-1 border-b",children:[e.jsx("code",{className:"text-xs",children:"placeId / placeName"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"string | null"})]}),e.jsxs("div",{className:"flex justify-between py-1",children:[e.jsx("code",{className:"text-xs",children:"activePlaceId / activePlaceName"}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"string | null"})]})]})]})}function x(){return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-primary text-primary-foreground text-sm font-medium",children:"1"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Usuário acessa rota protegida"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"ProtectedRoute verifica isAuthenticated"})]})]}),e.jsx("div",{className:"w-8 border-l-2 border-dashed h-4 ml-4"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-primary text-primary-foreground text-sm font-medium",children:"2"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Redirecionamento para OAuth"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Dev: Token local | Prod: Qualiex OAuth"})]})]}),e.jsx("div",{className:"w-8 border-l-2 border-dashed h-4 ml-4"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-primary text-primary-foreground text-sm font-medium",children:"3"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Callback processa tokens"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"CallbackPage valida e armazena tokens"})]})]}),e.jsx("div",{className:"w-8 border-l-2 border-dashed h-4 ml-4"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex items-center justify-center w-8 h-8 rounded-full bg-green-500 text-white text-sm font-medium",children:"✓"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("p",{className:"font-medium text-sm",children:"Usuário autenticado"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Token Supabase gerado, dados carregados"})]})]})]})}function v(){return e.jsx(u,{title:"Autenticação (Auth)",description:"Sistema completo de autenticação OAuth integrado com Qualiex. Inclui gerenciamento de tokens, rotas protegidas, suporte multi-tenant e troca de unidades.",installation:`import {
|
|
2
|
-
useAuth,
|
|
3
|
-
AuthProvider,
|
|
4
|
-
ProtectedRoute,
|
|
5
|
-
LoginPage,
|
|
6
|
-
CallbackPage
|
|
7
|
-
} from 'forlogic-core';`,component:e.jsx(m,{}),usage:`// App.tsx - Setup básico
|
|
8
|
-
import { CoreProviders, ProtectedRoute } from 'forlogic-core';
|
|
9
|
-
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
|
10
|
-
|
|
11
|
-
function App() {
|
|
12
|
-
return (
|
|
13
|
-
<CoreProviders>
|
|
14
|
-
<BrowserRouter>
|
|
15
|
-
<Routes>
|
|
16
|
-
<Route path="/callback" element={<CallbackPage />} />
|
|
17
|
-
<Route path="/login" element={<LoginPage />} />
|
|
18
|
-
<Route
|
|
19
|
-
path="/*"
|
|
20
|
-
element={
|
|
21
|
-
<ProtectedRoute>
|
|
22
|
-
<MainApp />
|
|
23
|
-
</ProtectedRoute>
|
|
24
|
-
}
|
|
25
|
-
/>
|
|
26
|
-
</Routes>
|
|
27
|
-
</BrowserRouter>
|
|
28
|
-
</CoreProviders>
|
|
29
|
-
);
|
|
30
|
-
}`,examples:[{title:"useAuth Hook",description:"Hook principal para acessar dados de autenticação e funções de controle.",preview:e.jsx(p,{}),code:`import { useAuth } from 'forlogic-core';
|
|
31
|
-
|
|
32
|
-
function UserProfile() {
|
|
33
|
-
const {
|
|
34
|
-
user, // Dados do usuário logado
|
|
35
|
-
alias, // Alias da empresa/unidade ativa
|
|
36
|
-
companies, // Lista de empresas disponíveis
|
|
37
|
-
selectedUnit, // Unidade atualmente selecionada
|
|
38
|
-
isAuthenticated, // true se está logado
|
|
39
|
-
isLoading, // true durante inicialização
|
|
40
|
-
logout, // Função para fazer logout
|
|
41
|
-
switchUnit, // Função para trocar de unidade
|
|
42
|
-
placeId, // ID do local do usuário
|
|
43
|
-
placeName, // Nome do local do usuário
|
|
44
|
-
} = useAuth();
|
|
45
|
-
|
|
46
|
-
if (isLoading) return <div>Carregando...</div>;
|
|
47
|
-
if (!isAuthenticated) return <div>Não autenticado</div>;
|
|
48
|
-
|
|
49
|
-
return (
|
|
50
|
-
<div>
|
|
51
|
-
<p>Olá, {user?.name}</p>
|
|
52
|
-
<p>Empresa: {selectedUnit?.name} ({alias})</p>
|
|
53
|
-
<p>Local: {placeName}</p>
|
|
54
|
-
<button onClick={logout}>Sair</button>
|
|
55
|
-
</div>
|
|
56
|
-
);
|
|
57
|
-
}`},{title:"Fluxo de Autenticação",description:"Sequência completa desde acesso até autenticação.",preview:e.jsx(x,{}),code:`// O fluxo é gerenciado automaticamente:
|
|
58
|
-
|
|
59
|
-
// 1. ProtectedRoute detecta usuário não autenticado
|
|
60
|
-
// 2. AuthService.loginProd() redireciona para Qualiex OAuth
|
|
61
|
-
// 3. Usuário faz login no Qualiex
|
|
62
|
-
// 4. Callback recebe tokens na URL
|
|
63
|
-
// 5. CallbackPage processa e valida tokens
|
|
64
|
-
// 6. AuthService.initialize() carrega dados do usuário
|
|
65
|
-
// 7. Token Supabase é gerado via SupabaseTokenService
|
|
66
|
-
// 8. Usuário é redirecionado para página original
|
|
67
|
-
|
|
68
|
-
// Em desenvolvimento, usa tokens de dev:
|
|
69
|
-
// AuthService.loginDev() gera token via edge function dev-tokens`},{title:"ProtectedRoute",description:"Componente que protege rotas e gerencia redirecionamentos.",preview:e.jsxs(a,{className:"p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:"h-5 w-5 text-green-500"}),e.jsx("span",{className:"font-medium",children:"Proteção Automática"})]}),e.jsxs("ul",{className:"text-sm text-muted-foreground space-y-1",children:[e.jsx("li",{children:"• Verifica isAuthenticated do AuthContext"}),e.jsx("li",{children:"• Mostra loading durante inicialização"}),e.jsx("li",{children:"• Redireciona para login se não autenticado"}),e.jsx("li",{children:"• Valida tokens periodicamente (5 min)"}),e.jsx("li",{children:"• Força logout se tokens expirarem"})]})]}),code:`import { ProtectedRoute } from 'forlogic-core';
|
|
70
|
-
|
|
71
|
-
// Proteger todas as rotas da aplicação
|
|
72
|
-
function App() {
|
|
73
|
-
return (
|
|
74
|
-
<Routes>
|
|
75
|
-
{/* Rotas públicas */}
|
|
76
|
-
<Route path="/login" element={<LoginPage />} />
|
|
77
|
-
<Route path="/callback" element={<CallbackPage />} />
|
|
78
|
-
|
|
79
|
-
{/* Rotas protegidas */}
|
|
80
|
-
<Route
|
|
81
|
-
path="/*"
|
|
82
|
-
element={
|
|
83
|
-
<ProtectedRoute>
|
|
84
|
-
<MainLayout>
|
|
85
|
-
<Routes>
|
|
86
|
-
<Route path="/" element={<HomePage />} />
|
|
87
|
-
<Route path="/settings" element={<SettingsPage />} />
|
|
88
|
-
</Routes>
|
|
89
|
-
</MainLayout>
|
|
90
|
-
</ProtectedRoute>
|
|
91
|
-
}
|
|
92
|
-
/>
|
|
93
|
-
</Routes>
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ProtectedRoute mostra automaticamente:
|
|
98
|
-
// - Loading durante isLoading
|
|
99
|
-
// - Redirecionamento para OAuth se !isAuthenticated
|
|
100
|
-
// - Conteúdo protegido se autenticado`},{title:"Troca de Unidade (Multi-Tenant)",description:"Suporte a múltiplas empresas/unidades com troca dinâmica.",preview:e.jsxs(a,{className:"p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(i,{className:"h-5 w-5 text-blue-500"}),e.jsx("span",{className:"font-medium",children:"Unidades Disponíveis:"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between p-2 border rounded bg-accent/50",children:[e.jsx("span",{className:"text-sm font-medium",children:"Empresa A"}),e.jsx(o,{variant:"secondary",children:"Ativa"})]}),e.jsxs("div",{className:"flex items-center justify-between p-2 border rounded hover:bg-accent/30 cursor-pointer",children:[e.jsx("span",{className:"text-sm",children:"Empresa B"}),e.jsx(t,{size:"sm",variant:"ghost",children:"Trocar"})]})]})]}),code:`import { useAuth } from 'forlogic-core';
|
|
101
|
-
|
|
102
|
-
function UnitSelector() {
|
|
103
|
-
const { companies, alias, switchUnit, isLoading } = useAuth();
|
|
104
|
-
|
|
105
|
-
const handleSwitch = async (company: Company) => {
|
|
106
|
-
await switchUnit(company);
|
|
107
|
-
// Automaticamente:
|
|
108
|
-
// 1. Gera novo token Supabase com novo alias
|
|
109
|
-
// 2. Limpa cache de queries (React Query)
|
|
110
|
-
// 3. Atualiza placeId/placeName
|
|
111
|
-
// 4. Dispara re-fetch de dados
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
return (
|
|
115
|
-
<Select
|
|
116
|
-
value={alias || ''}
|
|
117
|
-
onValueChange={(value) => {
|
|
118
|
-
const company = companies.find(c => c.alias === value);
|
|
119
|
-
if (company) handleSwitch(company);
|
|
120
|
-
}}
|
|
121
|
-
disabled={isLoading}
|
|
122
|
-
>
|
|
123
|
-
<SelectTrigger>
|
|
124
|
-
<SelectValue placeholder="Selecione a unidade" />
|
|
125
|
-
</SelectTrigger>
|
|
126
|
-
<SelectContent>
|
|
127
|
-
{companies.map(company => (
|
|
128
|
-
<SelectItem key={company.id} value={company.alias}>
|
|
129
|
-
{company.name}
|
|
130
|
-
</SelectItem>
|
|
131
|
-
))}
|
|
132
|
-
</SelectContent>
|
|
133
|
-
</Select>
|
|
134
|
-
);
|
|
135
|
-
}`},{title:"LoginPage",description:"Página de login pronta para uso com suporte a dev/prod.",preview:e.jsxs(a,{className:"p-6 text-center space-y-4 max-w-sm mx-auto",children:[e.jsx("h3",{className:"text-xl font-bold",children:"Acesso ao Sistema"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Faça login para acessar o sistema"}),e.jsx(t,{className:"w-full",children:"Entrar com Qualiex"})]}),code:`import { LoginPage } from 'forlogic-core';
|
|
136
|
-
|
|
137
|
-
// Uso direto - página pronta
|
|
138
|
-
<Route path="/login" element={<LoginPage />} />
|
|
139
|
-
|
|
140
|
-
// A LoginPage detecta automaticamente o ambiente:
|
|
141
|
-
// - Desenvolvimento: "Login Desenvolvimento" (usa dev-tokens)
|
|
142
|
-
// - Produção: "Entrar com Qualiex" (OAuth)
|
|
143
|
-
|
|
144
|
-
// Para customizar, crie sua própria página:
|
|
145
|
-
import { AuthService, isDevEnvironment } from 'forlogic-core';
|
|
146
|
-
|
|
147
|
-
function CustomLoginPage() {
|
|
148
|
-
const handleLogin = async () => {
|
|
149
|
-
if (isDevEnvironment()) {
|
|
150
|
-
await AuthService.loginDev();
|
|
151
|
-
} else {
|
|
152
|
-
AuthService.loginProd();
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
return (
|
|
157
|
-
<div>
|
|
158
|
-
<h1>Meu Login Customizado</h1>
|
|
159
|
-
<Button onClick={handleLogin}>Entrar</Button>
|
|
160
|
-
</div>
|
|
161
|
-
);
|
|
162
|
-
}`},{title:"CallbackPage",description:"Página de callback que processa tokens OAuth.",preview:e.jsxs(a,{className:"p-6 text-center space-y-4 max-w-sm mx-auto",children:[e.jsx("div",{className:"h-8 w-8 border-4 border-primary border-t-transparent rounded-full animate-spin mx-auto"}),e.jsx("h3",{className:"font-semibold",children:"Processando Autenticação"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Processando tokens e redirecionando..."})]}),code:`import { CallbackPage } from 'forlogic-core';
|
|
163
|
-
|
|
164
|
-
// Adicionar rota para callback OAuth
|
|
165
|
-
<Route path="/callback" element={<CallbackPage />} />
|
|
166
|
-
|
|
167
|
-
// A CallbackPage automaticamente:
|
|
168
|
-
// 1. Extrai tokens da URL (query string ou hash)
|
|
169
|
-
// 2. Valida tokens com o AuthService
|
|
170
|
-
// 3. Gera token Supabase
|
|
171
|
-
// 4. Redireciona para página de origem (se salva)
|
|
172
|
-
// 5. Mostra erro com opção de retry se falhar
|
|
173
|
-
|
|
174
|
-
// A URL de callback deve ser configurada no Qualiex:
|
|
175
|
-
// https://seu-app.com/callback`},{title:"Configuração de Ambiente",description:"Variáveis de ambiente necessárias para autenticação.",preview:e.jsxs(r,{children:[e.jsx(n,{className:"h-4 w-4 text-green-500"}),e.jsx(c,{children:e.jsxs("div",{className:"space-y-1 text-sm",children:[e.jsx("p",{className:"font-medium",children:"Variáveis obrigatórias:"}),e.jsxs("code",{className:"block text-xs bg-muted p-2 rounded mt-2",children:["VITE_SUPABASE_URL",e.jsx("br",{}),"VITE_SUPABASE_PUBLISHABLE_KEY",e.jsx("br",{}),"VITE_QUALIEX_API_URL",e.jsx("br",{}),"VITE_QUALIEX_APP_ID"]})]})})]}),code:`# .env - Variáveis de ambiente
|
|
176
|
-
|
|
177
|
-
# Supabase
|
|
178
|
-
VITE_SUPABASE_URL=https://xyz.supabase.co
|
|
179
|
-
VITE_SUPABASE_PUBLISHABLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
|
180
|
-
VITE_SUPABASE_PROJECT_ID=xyz
|
|
181
|
-
|
|
182
|
-
# Qualiex OAuth
|
|
183
|
-
VITE_QUALIEX_API_URL=https://api.qualiex.com
|
|
184
|
-
VITE_QUALIEX_APP_ID=minha-aplicacao
|
|
185
|
-
|
|
186
|
-
# Ambiente (opcional)
|
|
187
|
-
VITE_ENV=development # ou production
|
|
188
|
-
|
|
189
|
-
# A lib detecta automaticamente o ambiente:
|
|
190
|
-
// isDevEnvironment() retorna true se:
|
|
191
|
-
// - VITE_ENV === 'development'
|
|
192
|
-
// - ou hostname inclui 'localhost' ou 'preview'`}],props:[{name:"useAuth().user",type:"User | null",default:"null",description:"Dados do usuário autenticado."},{name:"useAuth().companies",type:"Company[]",default:"[]",description:"Lista de empresas/unidades disponíveis."},{name:"useAuth().alias",type:"string | null",default:"null",description:"Alias da empresa/unidade ativa."},{name:"useAuth().isAuthenticated",type:"boolean",default:"false",description:"Indica se usuário está autenticado."},{name:"useAuth().isLoading",type:"boolean",default:"true",description:"Indica se está inicializando."},{name:"useAuth().selectedUnit",type:"SelectedUnit | null",default:"null",description:"Unidade atualmente selecionada."},{name:"useAuth().logout",type:"() => void",default:"-",description:"Função para fazer logout."},{name:"useAuth().switchUnit",type:"(company: Company) => Promise<void>",default:"-",description:"Função para trocar de unidade."},{name:"useAuth().placeId",type:"string | null",default:"null",description:"ID do local do usuário."},{name:"useAuth().placeName",type:"string | null",default:"null",description:"Nome do local do usuário."},{name:"ProtectedRoute.children",type:"ReactNode",default:"-",description:"Conteúdo protegido a ser renderizado."}],accessibility:["Loading states são anunciados para leitores de tela.","Botões de login seguem padrões de acessibilidade.","Feedback de erro é apresentado de forma clara.","Focus management correto durante redirecionamentos."],notes:["**CoreProviders** já inclui AuthProvider - não precisa configurar separadamente.","Tokens são validados automaticamente a cada **5-10 minutos**.","Troca de unidade limpa automaticamente o cache do **React Query**.","Em **desenvolvimento**, use a edge function `dev-tokens` para gerar tokens de teste.","A URL de callback (/callback) deve estar configurada no **Qualiex OAuth**.","Locale fixo em **pt-BR** — preferências do usuário serão implementadas futuramente via API externa."]})}export{v as AuthDoc};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{j as a,ac as t,ad as r,ae as e}from"./index-BtX5DZqb.js";import{C as s}from"./ComponentDocTemplate-BtOCnlM2.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function n(){return a.jsx(s,{title:"Avatar",description:"Um elemento de imagem com fallback para representar o usuário.",component:a.jsxs("div",{className:"flex gap-4 items-center",children:[a.jsxs(t,{children:[a.jsx(r,{src:"https://github.com/shadcn.png",alt:"@shadcn"}),a.jsx(e,{children:"CN"})]}),a.jsx(t,{children:a.jsx(e,{children:"JD"})})]}),usage:`import { Avatar, AvatarImage, AvatarFallback } from "forlogic-core"
|
|
2
|
-
|
|
3
|
-
<Avatar>
|
|
4
|
-
<AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
|
|
5
|
-
<AvatarFallback>CN</AvatarFallback>
|
|
6
|
-
</Avatar>`,examples:[{title:"Com Imagem",preview:a.jsxs(t,{children:[a.jsx(r,{src:"https://github.com/shadcn.png",alt:"User"}),a.jsx(e,{children:"CN"})]}),code:`<Avatar>
|
|
7
|
-
<AvatarImage src="..." />
|
|
8
|
-
<AvatarFallback>CN</AvatarFallback>
|
|
9
|
-
</Avatar>`},{title:"Apenas Fallback",preview:a.jsx(t,{children:a.jsx(e,{children:"JD"})}),code:`<Avatar>
|
|
10
|
-
<AvatarFallback>JD</AvatarFallback>
|
|
11
|
-
</Avatar>`}],props:[{name:"src",type:"string",default:"-",description:"A URL da fonte da imagem (AvatarImage)."},{name:"alt",type:"string",default:"-",description:"Texto alternativo para a imagem (AvatarImage)."}],accessibility:["Texto alternativo adequado para imagens","Fallback garante que o conteúdo seja sempre exibido","Estrutura HTML semântica"]})}export{n as AvatarDoc};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import{j as a,B as e}from"./index-BtX5DZqb.js";import{C as n}from"./ComponentDocTemplate-BtOCnlM2.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function t(){return a.jsx(n,{title:"Badge",description:"Exibe um badge ou um componente que se parece com um badge.",component:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{children:"Default"}),a.jsx(e,{variant:"secondary",children:"Secondary"}),a.jsx(e,{variant:"info",children:"Info"}),a.jsx(e,{variant:"success",children:"Success"}),a.jsx(e,{variant:"warning",children:"Warning"}),a.jsx(e,{variant:"danger",children:"Danger"}),a.jsx(e,{variant:"outline",children:"Outline"}),a.jsx(e,{variant:"sharp",children:"Sharp"})]}),usage:`import { Badge } from "forlogic-core"
|
|
2
|
-
|
|
3
|
-
<Badge>Badge</Badge>
|
|
4
|
-
<Badge variant="secondary">Secondary</Badge>
|
|
5
|
-
<Badge variant="info">Info</Badge>
|
|
6
|
-
<Badge variant="success">Success</Badge>
|
|
7
|
-
<Badge variant="warning">Warning</Badge>
|
|
8
|
-
<Badge variant="danger">Danger</Badge>
|
|
9
|
-
<Badge variant="outline">Outline</Badge>
|
|
10
|
-
<Badge variant="sharp">Sharp</Badge>`,examples:[{title:"Todas as Variantes",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{children:"Default"}),a.jsx(e,{variant:"secondary",children:"Secondary"}),a.jsx(e,{variant:"info",children:"Info"}),a.jsx(e,{variant:"success",children:"Success"}),a.jsx(e,{variant:"warning",children:"Warning"}),a.jsx(e,{variant:"danger",children:"Danger"}),a.jsx(e,{variant:"outline",children:"Outline"}),a.jsx(e,{variant:"sharp",children:"Sharp"})]}),code:`<Badge>Default</Badge>
|
|
11
|
-
<Badge variant="secondary">Secondary</Badge>
|
|
12
|
-
<Badge variant="info">Info</Badge>
|
|
13
|
-
<Badge variant="success">Success</Badge>
|
|
14
|
-
<Badge variant="warning">Warning</Badge>
|
|
15
|
-
<Badge variant="danger">Danger</Badge>
|
|
16
|
-
<Badge variant="outline">Outline</Badge>
|
|
17
|
-
<Badge variant="sharp">Sharp</Badge>`},{title:"Variantes Semânticas",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{variant:"info",children:"Informativo"}),a.jsx(e,{variant:"success",children:"Aprovado"}),a.jsx(e,{variant:"warning",children:"Pendente"}),a.jsx(e,{variant:"danger",children:"Rejeitado"})]}),code:`<Badge variant="info">Informativo</Badge>
|
|
18
|
-
<Badge variant="success">Aprovado</Badge>
|
|
19
|
-
<Badge variant="warning">Pendente</Badge>
|
|
20
|
-
<Badge variant="danger">Rejeitado</Badge>`},{title:"Casos de Uso - Status",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{variant:"success",children:"Active"}),a.jsx(e,{variant:"warning",children:"Pending"}),a.jsx(e,{variant:"danger",children:"Inactive"}),a.jsx(e,{variant:"info",children:"Processing"})]}),code:`<Badge variant="success">Active</Badge>
|
|
21
|
-
<Badge variant="warning">Pending</Badge>
|
|
22
|
-
<Badge variant="danger">Inactive</Badge>
|
|
23
|
-
<Badge variant="info">Processing</Badge>`},{title:"Casos de Uso - Contadores",preview:a.jsxs("div",{className:"flex flex-wrap gap-4 items-center",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm",children:"Inbox"}),a.jsx(e,{variant:"secondary",children:"12"})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm",children:"Notifications"}),a.jsx(e,{variant:"danger",children:"3"})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm",children:"Updates"}),a.jsx(e,{variant:"info",children:"New"})]})]}),code:`<div className="flex items-center gap-2">
|
|
24
|
-
<span>Inbox</span>
|
|
25
|
-
<Badge variant="secondary">12</Badge>
|
|
26
|
-
</div>
|
|
27
|
-
<div className="flex items-center gap-2">
|
|
28
|
-
<span>Notifications</span>
|
|
29
|
-
<Badge variant="danger">3</Badge>
|
|
30
|
-
</div>
|
|
31
|
-
<div className="flex items-center gap-2">
|
|
32
|
-
<span>Updates</span>
|
|
33
|
-
<Badge variant="info">New</Badge>
|
|
34
|
-
</div>`},{title:"Casos de Uso - Tags",preview:a.jsxs("div",{className:"flex flex-wrap gap-2",children:[a.jsx(e,{variant:"outline",children:"React"}),a.jsx(e,{variant:"outline",children:"TypeScript"}),a.jsx(e,{variant:"outline",children:"Tailwind CSS"}),a.jsx(e,{variant:"outline",children:"Supabase"})]}),code:`<Badge variant="outline">React</Badge>
|
|
35
|
-
<Badge variant="outline">TypeScript</Badge>
|
|
36
|
-
<Badge variant="outline">Tailwind CSS</Badge>`}],props:[{name:"variant",type:'"default" | "secondary" | "info" | "success" | "warning" | "danger" | "outline" | "sharp"',default:'"default"',description:"O estilo visual do badge."}],accessibility:["HTML semântico com taxas de contraste adequadas","Funciona com leitores de tela","Pode ser tornado interativo com labels ARIA adequadas se necessário"]})}export{t as BadgeDoc};
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import{j as e,C as v,a as j,b as g,d as f,cd as k,ce as T,cf as b,cg as N,r as C,L as t,I as n,cL as A,S as L,f as w,i as O,cX as E,cY as I,cZ as P,c_ as B,c$ as F,e as V,cm as M,cK as $,P as q,dS as z,dU as U,dV as _,dW as Z,u as D}from"./index-BtX5DZqb.js";import{L as H}from"./lucide-react-ZIMhRYmb.js";import"./hash-BAYi_wfk.js";import"./blocks-Jy49RoqJ.js";import"./calendar-days-Cvf2zLJl.js";import"./circle-plus-MnG9kjyq.js";import"./circle-x-B9ouupla.js";import"./life-buoy-BydIgTyJ.js";import"./share-2-Dz_89MJb.js";import"./crown-BweN5jpI.js";import"./monitor-B6txWJPg.js";import"./file-pen-line-C0VV-QjF.js";import"./git-branch-DCjGGwvF.js";import"./globe-BdFDFP_k.js";import"./grip-vertical-CgXp0oI-.js";import"./package-DNe3FsCh.js";import"./pin-CJJgLEBz.js";import"./pen-CzTmQ16z.js";import"./server-XQDXtrjm.js";import"./text-align-start-WsHo7CNJ.js";import"./trash-CeK-mWnM.js";import"./user-check-CrbWcnPN.js";import"./user-plus-Dce9DbqQ.js";function R(){const[l,m]=C.useState({name:"",email:"",bio:"",active:!0}),[s,h]=C.useState({}),d=(c,y)=>{m(S=>({...S,[c]:y})),s[c]&&h(S=>({...S,[c]:""}))},p=()=>{const c={};return l.name.trim()||(c.name="Nome é obrigatório"),l.email.trim()?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(l.email)||(c.email="E-mail inválido"):c.email="E-mail é obrigatório",h(c),Object.keys(c).length===0},a=()=>{p()?(D.success("Formulário enviado com sucesso!"),console.log("Dados:",l)):D.error("Corrija os erros antes de enviar")};return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"basic-name",children:"Nome *"}),e.jsx(n,{id:"basic-name",value:l.name,onChange:c=>d("name",c.target.value),placeholder:"Digite o nome",className:s.name?"border-destructive":""}),s.name&&e.jsx("p",{className:"text-sm text-destructive",children:s.name})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"basic-email",children:"E-mail *"}),e.jsx(n,{id:"basic-email",type:"email",value:l.email,onChange:c=>d("email",c.target.value),placeholder:"email@exemplo.com",className:s.email?"border-destructive":""}),s.email&&e.jsx("p",{className:"text-sm text-destructive",children:s.email})]}),e.jsxs("div",{className:"space-y-2 md:col-span-2",children:[e.jsx(t,{htmlFor:"basic-bio",children:"Biografia"}),e.jsx(A,{id:"basic-bio",value:l.bio,onChange:c=>d("bio",c.target.value),placeholder:"Conte sobre você..."})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(L,{id:"basic-active",checked:l.active,onCheckedChange:c=>d("active",c)}),e.jsx(t,{htmlFor:"basic-active",children:"Ativo"})]})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(w,{variant:"outline",onClick:()=>m({name:"",email:"",bio:"",active:!0}),children:"Limpar"}),e.jsx(w,{onClick:a,children:"Salvar"})]})]})}function W(){const[l,m]=C.useState({name:"",email:"",age:"",description:"",status:"",category:"",active:!0,newsletter:!1,birthDate:"",color:"#3b82f6",icon:"Star"}),s=(a,c)=>{m(y=>({...y,[a]:c}))},h=[{value:"active",label:"Ativo"},{value:"inactive",label:"Inativo"},{value:"pending",label:"Pendente"}],d=[{value:"tech",label:"Tecnologia"},{value:"finance",label:"Finanças"},{value:"health",label:"Saúde"},{value:"education",label:"Educação"}],p=H[l.icon]||O;return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-semibold mb-3 text-muted-foreground uppercase tracking-wide",children:"Campos de Texto"}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"all-name",children:"Nome (text)"}),e.jsx(n,{id:"all-name",value:l.name,onChange:a=>s("name",a.target.value),placeholder:"Digite o nome"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"all-email",children:"E-mail (email)"}),e.jsx(n,{id:"all-email",type:"email",value:l.email,onChange:a=>s("email",a.target.value),placeholder:"email@exemplo.com"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"all-age",children:"Idade (number)"}),e.jsx(n,{id:"all-age",type:"number",value:l.age,onChange:a=>s("age",a.target.value),placeholder:"25",min:0,max:150})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"all-date",children:"Data de Nascimento (date)"}),e.jsx(n,{id:"all-date",type:"date",value:l.birthDate,onChange:a=>s("birthDate",a.target.value)})]}),e.jsxs("div",{className:"space-y-2 md:col-span-2",children:[e.jsx(t,{htmlFor:"all-desc",children:"Descrição (textarea)"}),e.jsx(A,{id:"all-desc",value:l.description,onChange:a=>s("description",a.target.value),placeholder:"Descrição detalhada...",rows:3})]})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-semibold mb-3 text-muted-foreground uppercase tracking-wide",children:"Campos de Seleção"}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{children:"Status (select)"}),e.jsxs(E,{value:l.status,onValueChange:a=>s("status",a),children:[e.jsx(I,{children:e.jsx(P,{placeholder:"Selecione o status"})}),e.jsx(B,{children:h.map(a=>e.jsx(F,{value:a.value,children:a.label},a.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{children:"Categoria (select)"}),e.jsxs(E,{value:l.category,onValueChange:a=>s("category",a),children:[e.jsx(I,{children:e.jsx(P,{placeholder:"Selecione a categoria"})}),e.jsx(B,{children:d.map(a=>e.jsx(F,{value:a.value,children:a.label},a.value))})]})]})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-semibold mb-3 text-muted-foreground uppercase tracking-wide",children:"Campos Booleanos"}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"flex items-center justify-between p-3 border rounded-lg",children:[e.jsx(t,{htmlFor:"all-active",children:"Ativo (switch)"}),e.jsx(L,{id:"all-active",checked:l.active,onCheckedChange:a=>s("active",a)})]}),e.jsxs("div",{className:"flex items-center gap-2 p-3 border rounded-lg",children:[e.jsx(V,{id:"all-newsletter",checked:l.newsletter,onCheckedChange:a=>s("newsletter",!!a)}),e.jsx(t,{htmlFor:"all-newsletter",className:"cursor-pointer",children:"Receber newsletter (checkbox)"})]})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-semibold mb-3 text-muted-foreground uppercase tracking-wide",children:"Campos Visuais"}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{children:"Cor (color-picker)"}),e.jsx(M,{value:l.color,onChange:a=>s("color",a)})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{children:"Ícone (icon-picker)"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx($,{value:l.icon,onChange:a=>s("icon",a)}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[e.jsx(p,{className:"h-5 w-5",style:{color:l.color}}),e.jsx("span",{children:l.icon})]})]})]})]})]}),e.jsxs("div",{className:"p-4 bg-muted/50 rounded-lg",children:[e.jsx("h4",{className:"text-sm font-semibold mb-2",children:"Dados do Formulário:"}),e.jsx("pre",{className:"text-xs overflow-x-auto",children:JSON.stringify(l,null,2)})]})]})}function G(){const[l,m]=C.useState({username:"",password:"",confirmPassword:"",email:"",phone:"",cpf:"",age:"",website:"",terms:!1}),[s,h]=C.useState({}),[d,p]=C.useState({}),a=(r,i)=>{m(o=>({...o,[r]:i})),p(o=>({...o,[r]:!0})),c(r,i)},c=(r,i)=>{let o="";switch(r){case"username":i?i.length<3?o="Mínimo 3 caracteres":i.length>20?o="Máximo 20 caracteres":/^[a-zA-Z0-9_]+$/.test(i)||(o="Apenas letras, números e _"):o="Usuário é obrigatório";break;case"password":i?i.length<8?o="Mínimo 8 caracteres":/[A-Z]/.test(i)?/[a-z]/.test(i)?/[0-9]/.test(i)||(o="Deve conter número"):o="Deve conter letra minúscula":o="Deve conter letra maiúscula":o="Senha é obrigatória";break;case"confirmPassword":i?i!==l.password&&(o="Senhas não conferem"):o="Confirmação é obrigatória";break;case"email":i?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i)||(o="E-mail inválido"):o="E-mail é obrigatório";break;case"phone":i&&!/^\(\d{2}\)\s?\d{4,5}-?\d{4}$/.test(i)&&(o="Formato: (11) 99999-9999");break;case"cpf":i&&i.replace(/\D/g,"").length!==11&&(o="CPF deve ter 11 dígitos");break;case"age":if(i){const u=parseInt(i);isNaN(u)||u<18?o="Idade mínima: 18 anos":u>120&&(o="Idade inválida")}break;case"website":i&&!/^https?:\/\/.+\..+$/.test(i)&&(o="URL inválida (ex: https://site.com)");break;case"terms":i||(o="Você deve aceitar os termos");break}return h(u=>({...u,[r]:o})),!o},y=()=>{let r=!0;return Object.keys(l).forEach(i=>{const o=l[i];c(i,o)||(r=!1),p(u=>({...u,[i]:!0}))}),r},S=()=>{y()?D.success("Cadastro realizado com sucesso!"):D.error("Corrija os erros antes de enviar")},x=r=>d[r]?s[r]?"border-destructive":"border-green-500":"";return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-username",children:"Usuário *"}),e.jsx(n,{id:"val-username",value:l.username,onChange:r=>a("username",r.target.value),placeholder:"seu_usuario",className:x("username")}),d.username&&s.username&&e.jsx("p",{className:"text-sm text-destructive",children:s.username}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"3-20 caracteres, letras, números e _"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-email",children:"E-mail *"}),e.jsx(n,{id:"val-email",type:"email",value:l.email,onChange:r=>a("email",r.target.value),placeholder:"email@exemplo.com",className:x("email")}),d.email&&s.email&&e.jsx("p",{className:"text-sm text-destructive",children:s.email})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-password",children:"Senha *"}),e.jsx(n,{id:"val-password",type:"password",value:l.password,onChange:r=>a("password",r.target.value),placeholder:"••••••••",className:x("password")}),d.password&&s.password&&e.jsx("p",{className:"text-sm text-destructive",children:s.password}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Mín. 8 chars, maiúscula, minúscula e número"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-confirm",children:"Confirmar Senha *"}),e.jsx(n,{id:"val-confirm",type:"password",value:l.confirmPassword,onChange:r=>a("confirmPassword",r.target.value),placeholder:"••••••••",className:x("confirmPassword")}),d.confirmPassword&&s.confirmPassword&&e.jsx("p",{className:"text-sm text-destructive",children:s.confirmPassword})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-phone",children:"Telefone"}),e.jsx(n,{id:"val-phone",value:l.phone,onChange:r=>a("phone",r.target.value),placeholder:"(11) 99999-9999",className:x("phone")}),d.phone&&s.phone&&e.jsx("p",{className:"text-sm text-destructive",children:s.phone})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-cpf",children:"CPF"}),e.jsx(n,{id:"val-cpf",value:l.cpf,onChange:r=>a("cpf",r.target.value),placeholder:"000.000.000-00",className:x("cpf")}),d.cpf&&s.cpf&&e.jsx("p",{className:"text-sm text-destructive",children:s.cpf})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-age",children:"Idade"}),e.jsx(n,{id:"val-age",type:"number",value:l.age,onChange:r=>a("age",r.target.value),placeholder:"25",min:18,className:x("age")}),d.age&&s.age&&e.jsx("p",{className:"text-sm text-destructive",children:s.age})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"val-website",children:"Website"}),e.jsx(n,{id:"val-website",value:l.website,onChange:r=>a("website",r.target.value),placeholder:"https://meusite.com",className:x("website")}),d.website&&s.website&&e.jsx("p",{className:"text-sm text-destructive",children:s.website})]})]}),e.jsxs("div",{className:"flex items-center gap-2 p-3 border rounded-lg",children:[e.jsx(V,{id:"val-terms",checked:l.terms,onCheckedChange:r=>a("terms",!!r)}),e.jsx(t,{htmlFor:"val-terms",className:"cursor-pointer",children:"Aceito os termos de uso e política de privacidade *"})]}),d.terms&&s.terms&&e.jsx("p",{className:"text-sm text-destructive",children:s.terms}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(w,{variant:"outline",onClick:()=>{m({username:"",password:"",confirmPassword:"",email:"",phone:"",cpf:"",age:"",website:"",terms:!1}),h({}),p({})},children:"Limpar"}),e.jsx(w,{onClick:S,children:"Cadastrar"})]})]})}function J(){const[l,m]=C.useState(!1),[s,h]=C.useState({title:"",priority:"medium",assignee:"",dueDate:"",description:""}),d=(a,c)=>{h(y=>({...y,[a]:c}))},p=()=>{D.success("Tarefa criada com sucesso!"),m(!1),h({title:"",priority:"medium",assignee:"",dueDate:"",description:""})};return e.jsxs(e.Fragment,{children:[e.jsxs(w,{onClick:()=>m(!0),children:[e.jsx(q,{className:"h-4 w-4 mr-2"}),"Nova Tarefa"]}),e.jsx(z,{open:l,onOpenChange:m,children:e.jsxs(U,{size:"md",children:[e.jsx(_,{showSeparator:!0,children:e.jsx(Z,{children:"Nova Tarefa"})}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"modal-title",children:"Título *"}),e.jsx(n,{id:"modal-title",value:s.title,onChange:a=>d("title",a.target.value),placeholder:"Digite o título da tarefa"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{children:"Prioridade"}),e.jsxs(E,{value:s.priority,onValueChange:a=>d("priority",a),children:[e.jsx(I,{children:e.jsx(P,{})}),e.jsxs(B,{children:[e.jsx(F,{value:"low",children:"🟢 Baixa"}),e.jsx(F,{value:"medium",children:"🟡 Média"}),e.jsx(F,{value:"high",children:"🔴 Alta"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"modal-due",children:"Data Limite"}),e.jsx(n,{id:"modal-due",type:"date",value:s.dueDate,onChange:a=>d("dueDate",a.target.value)})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"modal-assignee",children:"Responsável"}),e.jsx(n,{id:"modal-assignee",value:s.assignee,onChange:a=>d("assignee",a.target.value),placeholder:"Nome do responsável"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(t,{htmlFor:"modal-desc",children:"Descrição"}),e.jsx(A,{id:"modal-desc",value:s.description,onChange:a=>d("description",a.target.value),placeholder:"Descreva a tarefa...",rows:3})]})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx(w,{variant:"outline",onClick:()=>m(!1),children:"Cancelar"}),e.jsx(w,{onClick:p,disabled:!s.title.trim(),children:"Criar Tarefa"})]})]})})]})}function fe(){return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold",children:"BaseForm"}),e.jsx("p",{className:"text-lg text-muted-foreground mt-2",children:"Formulário dinâmico baseado em configuração de seções e campos, suportando múltiplos tipos de campo, validação e layouts flexíveis."})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Formulário Básico"})}),e.jsx(f,{children:e.jsxs(k,{defaultValue:"preview",children:[e.jsxs(T,{children:[e.jsx(b,{value:"preview",children:"Preview"}),e.jsx(b,{value:"code",children:"Código"})]}),e.jsx(N,{value:"preview",className:"pt-4",children:e.jsx(R,{})}),e.jsx(N,{value:"code",className:"pt-4",children:e.jsx("pre",{className:"bg-muted p-4 rounded-lg text-sm overflow-x-auto",children:`const [formData, setFormData] = useState({
|
|
2
|
-
name: '', email: '', bio: '', active: true
|
|
3
|
-
});
|
|
4
|
-
const [errors, setErrors] = useState({});
|
|
5
|
-
|
|
6
|
-
const validate = () => {
|
|
7
|
-
const newErrors = {};
|
|
8
|
-
if (!formData.name.trim()) newErrors.name = 'Nome é obrigatório';
|
|
9
|
-
if (!formData.email.trim()) newErrors.email = 'E-mail é obrigatório';
|
|
10
|
-
else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.email)) {
|
|
11
|
-
newErrors.email = 'E-mail inválido';
|
|
12
|
-
}
|
|
13
|
-
setErrors(newErrors);
|
|
14
|
-
return Object.keys(newErrors).length === 0;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
<Input
|
|
18
|
-
value={formData.name}
|
|
19
|
-
onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}
|
|
20
|
-
className={errors.name ? 'border-destructive' : ''}
|
|
21
|
-
/>
|
|
22
|
-
{errors.name && <p className="text-sm text-destructive">{errors.name}</p>}`})})]})})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Todos os Tipos de Campo"})}),e.jsx(f,{children:e.jsxs(k,{defaultValue:"preview",children:[e.jsxs(T,{children:[e.jsx(b,{value:"preview",children:"Preview"}),e.jsx(b,{value:"code",children:"Código"})]}),e.jsx(N,{value:"preview",className:"pt-4",children:e.jsx(W,{})}),e.jsx(N,{value:"code",className:"pt-4",children:e.jsx("pre",{className:"bg-muted p-4 rounded-lg text-sm overflow-x-auto",children:`// Tipos suportados pelo BaseForm:
|
|
23
|
-
|
|
24
|
-
const sections = [{
|
|
25
|
-
id: 'main',
|
|
26
|
-
title: 'Cadastro',
|
|
27
|
-
fields: [
|
|
28
|
-
// Texto
|
|
29
|
-
{ name: 'name', label: 'Nome', type: 'text', required: true },
|
|
30
|
-
{ name: 'email', label: 'E-mail', type: 'email', required: true },
|
|
31
|
-
|
|
32
|
-
// Número
|
|
33
|
-
{ name: 'age', label: 'Idade', type: 'number', min: 0, max: 150 },
|
|
34
|
-
|
|
35
|
-
// Textarea
|
|
36
|
-
{ name: 'description', label: 'Descrição', type: 'textarea', rows: 3 },
|
|
37
|
-
|
|
38
|
-
// Select
|
|
39
|
-
{
|
|
40
|
-
name: 'status',
|
|
41
|
-
label: 'Status',
|
|
42
|
-
type: 'select',
|
|
43
|
-
options: [
|
|
44
|
-
{ value: 'active', label: 'Ativo' },
|
|
45
|
-
{ value: 'inactive', label: 'Inativo' }
|
|
46
|
-
]
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
// Data
|
|
50
|
-
{ name: 'birthDate', label: 'Nascimento', type: 'date' },
|
|
51
|
-
|
|
52
|
-
// Booleanos
|
|
53
|
-
{ name: 'active', label: 'Ativo', type: 'switch' },
|
|
54
|
-
{ name: 'newsletter', label: 'Newsletter', type: 'checkbox' },
|
|
55
|
-
|
|
56
|
-
// Visuais
|
|
57
|
-
{ name: 'color', label: 'Cor', type: 'color-picker' },
|
|
58
|
-
{ name: 'icon', label: 'Ícone', type: 'icon-picker' }
|
|
59
|
-
]
|
|
60
|
-
}];`})})]})})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Validação Completa"})}),e.jsx(f,{children:e.jsxs(k,{defaultValue:"preview",children:[e.jsxs(T,{children:[e.jsx(b,{value:"preview",children:"Preview"}),e.jsx(b,{value:"code",children:"Código"})]}),e.jsx(N,{value:"preview",className:"pt-4",children:e.jsx(G,{})}),e.jsx(N,{value:"code",className:"pt-4",children:e.jsx("pre",{className:"bg-muted p-4 rounded-lg text-sm overflow-x-auto",children:`// Validação em tempo real com feedback visual
|
|
61
|
-
|
|
62
|
-
const validateField = (field, value) => {
|
|
63
|
-
let error = '';
|
|
64
|
-
|
|
65
|
-
switch (field) {
|
|
66
|
-
case 'username':
|
|
67
|
-
if (!value) error = 'Usuário é obrigatório';
|
|
68
|
-
else if (value.length < 3) error = 'Mínimo 3 caracteres';
|
|
69
|
-
else if (!/^[a-zA-Z0-9_]+$/.test(value)) error = 'Apenas letras, números e _';
|
|
70
|
-
break;
|
|
71
|
-
|
|
72
|
-
case 'password':
|
|
73
|
-
if (!value) error = 'Senha é obrigatória';
|
|
74
|
-
else if (value.length < 8) error = 'Mínimo 8 caracteres';
|
|
75
|
-
else if (!/[A-Z]/.test(value)) error = 'Deve conter letra maiúscula';
|
|
76
|
-
else if (!/[0-9]/.test(value)) error = 'Deve conter número';
|
|
77
|
-
break;
|
|
78
|
-
|
|
79
|
-
case 'email':
|
|
80
|
-
if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) error = 'E-mail inválido';
|
|
81
|
-
break;
|
|
82
|
-
|
|
83
|
-
case 'phone':
|
|
84
|
-
if (!/^\\(\\d{2}\\)\\s?\\d{4,5}-?\\d{4}$/.test(value)) {
|
|
85
|
-
error = 'Formato: (11) 99999-9999';
|
|
86
|
-
}
|
|
87
|
-
break;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
setErrors(prev => ({ ...prev, [field]: error }));
|
|
91
|
-
return !error;
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
// Classe condicional baseada em estado
|
|
95
|
-
const getFieldClass = (field) => {
|
|
96
|
-
if (!touched[field]) return '';
|
|
97
|
-
return errors[field] ? 'border-destructive' : 'border-green-500';
|
|
98
|
-
};`})})]})})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Formulário em Modal"})}),e.jsx(f,{children:e.jsxs(k,{defaultValue:"preview",children:[e.jsxs(T,{children:[e.jsx(b,{value:"preview",children:"Preview"}),e.jsx(b,{value:"code",children:"Código"})]}),e.jsx(N,{value:"preview",className:"pt-4",children:e.jsx(J,{})}),e.jsx(N,{value:"code",className:"pt-4",children:e.jsx("pre",{className:"bg-muted p-4 rounded-lg text-sm overflow-x-auto",children:`<Dialog open={open} onOpenChange={setOpen}>
|
|
99
|
-
<DialogContent size="md">
|
|
100
|
-
<DialogHeader showSeparator>
|
|
101
|
-
<DialogTitle>Nova Tarefa</DialogTitle>
|
|
102
|
-
</DialogHeader>
|
|
103
|
-
|
|
104
|
-
<div className="space-y-4 py-4">
|
|
105
|
-
<div className="space-y-2">
|
|
106
|
-
<Label>Título *</Label>
|
|
107
|
-
<Input
|
|
108
|
-
value={formData.title}
|
|
109
|
-
onChange={e => updateField('title', e.target.value)}
|
|
110
|
-
/>
|
|
111
|
-
</div>
|
|
112
|
-
|
|
113
|
-
<div className="grid gap-4 md:grid-cols-2">
|
|
114
|
-
<div className="space-y-2">
|
|
115
|
-
<Label>Prioridade</Label>
|
|
116
|
-
<Select value={formData.priority} onValueChange={v => updateField('priority', v)}>
|
|
117
|
-
<SelectTrigger><SelectValue /></SelectTrigger>
|
|
118
|
-
<SelectContent>
|
|
119
|
-
<SelectItem value="low">🟢 Baixa</SelectItem>
|
|
120
|
-
<SelectItem value="medium">🟡 Média</SelectItem>
|
|
121
|
-
<SelectItem value="high">🔴 Alta</SelectItem>
|
|
122
|
-
</SelectContent>
|
|
123
|
-
</Select>
|
|
124
|
-
</div>
|
|
125
|
-
|
|
126
|
-
<div className="space-y-2">
|
|
127
|
-
<Label>Data Limite</Label>
|
|
128
|
-
<Input type="date" value={formData.dueDate} onChange={...} />
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
</div>
|
|
132
|
-
|
|
133
|
-
<div className="flex justify-end gap-2">
|
|
134
|
-
<Button variant="outline" onClick={() => setOpen(false)}>Cancelar</Button>
|
|
135
|
-
<Button onClick={handleSubmit}>Criar Tarefa</Button>
|
|
136
|
-
</div>
|
|
137
|
-
</DialogContent>
|
|
138
|
-
</Dialog>`})})]})})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Uso com BaseForm (Biblioteca)"})}),e.jsx(f,{children:e.jsx("pre",{className:"bg-muted p-4 rounded-lg text-sm overflow-x-auto",children:`import BaseForm from 'forlogic-core/crud/components/BaseForm';
|
|
139
|
-
|
|
140
|
-
const sections = [
|
|
141
|
-
{
|
|
142
|
-
id: 'basic',
|
|
143
|
-
title: 'Informações Básicas',
|
|
144
|
-
fields: [
|
|
145
|
-
{ name: 'name', label: 'Nome', type: 'text', required: true },
|
|
146
|
-
{ name: 'email', label: 'E-mail', type: 'email', required: true },
|
|
147
|
-
{ name: 'bio', label: 'Biografia', type: 'textarea' },
|
|
148
|
-
{ name: 'active', label: 'Ativo', type: 'switch' },
|
|
149
|
-
],
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
id: 'advanced',
|
|
153
|
-
title: 'Configurações',
|
|
154
|
-
condition: (data) => !!data.name, // Só habilita quando nome preenchido
|
|
155
|
-
fields: [
|
|
156
|
-
{ name: 'role', label: 'Perfil', type: 'select', options: [...] },
|
|
157
|
-
{ name: 'notifications', label: 'Notificações', type: 'switch' },
|
|
158
|
-
],
|
|
159
|
-
},
|
|
160
|
-
];
|
|
161
|
-
|
|
162
|
-
<BaseForm
|
|
163
|
-
title="Novo Usuário"
|
|
164
|
-
sections={sections}
|
|
165
|
-
initialData={data}
|
|
166
|
-
open={isOpen}
|
|
167
|
-
onSubmit={handleSubmit}
|
|
168
|
-
onCancel={() => setIsOpen(false)}
|
|
169
|
-
/>`})})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Tipos de Campo Suportados"})}),e.jsx(f,{children:e.jsx("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:[{type:"text",desc:"Input de texto padrão"},{type:"email",desc:"Input de e-mail com validação"},{type:"number",desc:"Input numérico com min/max/step"},{type:"textarea",desc:"Área de texto multilinha"},{type:"select",desc:"Seleção com opções"},{type:"multiselect",desc:"Seleção múltipla"},{type:"switch",desc:"Toggle on/off"},{type:"checkbox",desc:"Checkbox simples"},{type:"date",desc:"Seletor de data"},{type:"color-picker",desc:"Seletor de cor avançado"},{type:"icon-picker",desc:"Seletor de ícones Lucide"},{type:"user-select",desc:"Seletor de usuário Qualiex"},{type:"group",desc:"Agrupamento de campos"},{type:"custom",desc:"Componente customizado"}].map(l=>e.jsxs("div",{className:"p-3 border rounded-lg",children:[e.jsx("code",{className:"text-sm font-mono text-primary",children:l.type}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:l.desc})]},l.type))})})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Props do BaseForm"})}),e.jsx(f,{children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"text-left p-2",children:"Prop"}),e.jsx("th",{className:"text-left p-2",children:"Tipo"}),e.jsx("th",{className:"text-left p-2",children:"Descrição"})]})}),e.jsx("tbody",{children:[["title","string","Título do dialog/formulário"],["sections","FormSection[]","Array de seções com campos"],["initialData","T","Dados iniciais do formulário"],["open","boolean","Controla visibilidade do dialog"],["onSubmit","(data: T) => void","Callback ao submeter"],["onCancel","() => void","Callback ao cancelar"],["submitButtonText","string","Texto do botão de submit"],["isLoading","boolean","Estado de carregamento"]].map(([l,m,s])=>e.jsxs("tr",{className:"border-b",children:[e.jsx("td",{className:"p-2 font-mono text-xs",children:l}),e.jsx("td",{className:"p-2 font-mono text-xs text-muted-foreground",children:m}),e.jsx("td",{className:"p-2",children:s})]},l))})]})})})]}),e.jsxs(v,{children:[e.jsx(j,{children:e.jsx(g,{children:"Acessibilidade"})}),e.jsx(f,{children:e.jsxs("ul",{className:"list-disc list-inside space-y-2 text-sm text-muted-foreground",children:[e.jsx("li",{children:"Todos os campos possuem labels associados via htmlFor/id"}),e.jsx("li",{children:"Mensagens de erro vinculadas aos campos via aria-describedby"}),e.jsx("li",{children:'Campos obrigatórios marcados com aria-required="true"'}),e.jsx("li",{children:"Navegação por teclado entre campos (Tab/Shift+Tab)"}),e.jsx("li",{children:"Foco visual destacado em todos os elementos interativos"}),e.jsx("li",{children:"Switch e Checkbox acessíveis via teclado (Space para toggle)"}),e.jsx("li",{children:"Feedback de validação anunciado por leitores de tela"}),e.jsx("li",{children:"Contraste adequado para mensagens de erro (WCAG AA)"})]})})]})]})}export{fe as BaseFormDoc};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import{j as e,el as o,em as a,C as t,c7 as n,B as r,f as i,G as s}from"./index-BtX5DZqb.js";import{C as l}from"./ComponentDocTemplate-BtOCnlM2.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function p(){return e.jsx(l,{title:"BodyContent",description:"Container principal de página com breadcrumb, background neutro e suporte a múltiplos containers de conteúdo.",component:e.jsx("div",{className:"w-full max-w-4xl",children:e.jsx(o,{breadcrumbs:[{label:"Módulo",href:"#"},{label:"Seção",href:"#"},{label:"Página Atual"}],className:"rounded-lg overflow-hidden",children:e.jsx(a,{title:"Título do Container",subtitle:"Subtítulo com informações adicionais",children:e.jsx("p",{className:"text-muted-foreground",children:"Este é o conteúdo principal do container. Aqui você pode adicionar qualquer tipo de conteúdo como formulários, tabelas, cards, etc."})})})}),usage:`import { BodyContent, ContentContainer } from 'forlogic-core';
|
|
2
|
-
|
|
3
|
-
<BodyContent
|
|
4
|
-
breadcrumbs={[
|
|
5
|
-
{ label: 'Módulo', href: '/modulo' },
|
|
6
|
-
{ label: 'Seção', href: '/modulo/secao' },
|
|
7
|
-
{ label: 'Página Atual' }, // Sem href = página atual
|
|
8
|
-
]}
|
|
9
|
-
>
|
|
10
|
-
<ContentContainer
|
|
11
|
-
title="Título do Container"
|
|
12
|
-
subtitle="Subtítulo com informações adicionais"
|
|
13
|
-
>
|
|
14
|
-
<p>Conteúdo principal aqui...</p>
|
|
15
|
-
</ContentContainer>
|
|
16
|
-
</BodyContent>`,props:[{name:"breadcrumbs",type:"BreadcrumbItemConfig[]",description:"Array de itens do breadcrumb. Último item é tratado como página atual."},{name:"children",type:"ReactNode",description:"Conteúdo principal (geralmente ContentContainers)"},{name:"className",type:"string",description:"Classes CSS adicionais para o container externo"},{name:"title",type:"string",description:"[ContentContainer] Título do container (opcional)"},{name:"subtitle",type:"string",description:"[ContentContainer] Subtítulo do container (opcional)"},{name:"hasHeader",type:"boolean",default:"true",description:"[ContentContainer] Se deve renderizar header separado do conteúdo"},{name:"label",type:"string",description:"[BreadcrumbItemConfig] Texto exibido no breadcrumb"},{name:"href",type:"string",description:"[BreadcrumbItemConfig] Link de navegação. Se omitido, renderiza como página atual."},{name:"asChild",type:"boolean",description:"[BreadcrumbItemConfig] Se true, usa children como elemento de link (para React Router)"}],examples:[{title:"Uso Básico",description:"Container simples com breadcrumb e título",code:`<BodyContent
|
|
17
|
-
breadcrumbs={[
|
|
18
|
-
{ label: 'Home', href: '/' },
|
|
19
|
-
{ label: 'Usuários' },
|
|
20
|
-
]}
|
|
21
|
-
>
|
|
22
|
-
<ContentContainer title="Lista de Usuários">
|
|
23
|
-
<p>Conteúdo da página...</p>
|
|
24
|
-
</ContentContainer>
|
|
25
|
-
</BodyContent>`,preview:e.jsx("div",{className:"w-full max-w-3xl",children:e.jsx(o,{breadcrumbs:[{label:"Home",href:"#"},{label:"Usuários"}],className:"rounded-lg overflow-hidden",children:e.jsx(a,{title:"Lista de Usuários",children:e.jsx("p",{className:"text-muted-foreground",children:"Conteúdo da página..."})})})})},{title:"Sem Breadcrumb",description:"Quando não há necessidade de navegação hierárquica",code:`<BodyContent>
|
|
26
|
-
<ContentContainer
|
|
27
|
-
title="Dashboard"
|
|
28
|
-
subtitle="Visão geral do sistema"
|
|
29
|
-
>
|
|
30
|
-
<div className="grid grid-cols-3 gap-4">
|
|
31
|
-
<Card>...</Card>
|
|
32
|
-
<Card>...</Card>
|
|
33
|
-
<Card>...</Card>
|
|
34
|
-
</div>
|
|
35
|
-
</ContentContainer>
|
|
36
|
-
</BodyContent>`,preview:e.jsx("div",{className:"w-full max-w-3xl",children:e.jsx(o,{className:"rounded-lg overflow-hidden",children:e.jsx(a,{title:"Dashboard",subtitle:"Visão geral do sistema",children:e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs(t,{className:"p-4 text-center",children:[e.jsx("p",{className:"text-2xl font-bold",children:"128"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Usuários"})]}),e.jsxs(t,{className:"p-4 text-center",children:[e.jsx("p",{className:"text-2xl font-bold",children:"45"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Projetos"})]}),e.jsxs(t,{className:"p-4 text-center",children:[e.jsx("p",{className:"text-2xl font-bold",children:"12"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Tarefas"})]})]})})})})},{title:"Múltiplos Containers",description:"Vários containers de conteúdo na mesma página",code:`<BodyContent
|
|
37
|
-
breadcrumbs={[
|
|
38
|
-
{ label: 'Configurações', href: '/config' },
|
|
39
|
-
{ label: 'Perfil' },
|
|
40
|
-
]}
|
|
41
|
-
>
|
|
42
|
-
<ContentContainer title="Informações Pessoais">
|
|
43
|
-
<p>Dados do usuário...</p>
|
|
44
|
-
</ContentContainer>
|
|
45
|
-
|
|
46
|
-
<ContentContainer title="Preferências">
|
|
47
|
-
<p>Configurações de preferência...</p>
|
|
48
|
-
</ContentContainer>
|
|
49
|
-
|
|
50
|
-
<ContentContainer title="Segurança">
|
|
51
|
-
<p>Opções de segurança...</p>
|
|
52
|
-
</ContentContainer>
|
|
53
|
-
</BodyContent>`,preview:e.jsx("div",{className:"w-full max-w-3xl",children:e.jsxs(o,{breadcrumbs:[{label:"Configurações",href:"#"},{label:"Perfil"}],className:"rounded-lg overflow-hidden",children:[e.jsx(a,{title:"Informações Pessoais",children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"w-16 h-16 rounded-full bg-primary/10 flex items-center justify-center",children:e.jsx(n,{className:"w-8 h-8 text-primary"})}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:"João Silva"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"joao@empresa.com"})]})]})}),e.jsx(a,{title:"Preferências",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{children:"Notificações por email"}),e.jsx(r,{children:"Ativo"})]})}),e.jsx(a,{title:"Segurança",children:e.jsx(i,{variant:"outline",size:"sm",children:"Alterar senha"})})]})})},{title:"Container sem Header",description:"Quando o conteúdo não precisa de título/subtítulo separado",code:`<BodyContent breadcrumbs={[{ label: 'Relatórios' }]}>
|
|
54
|
-
<ContentContainer hasHeader={false}>
|
|
55
|
-
<div className="flex items-center gap-2 mb-4">
|
|
56
|
-
<FileText className="w-5 h-5" />
|
|
57
|
-
<h2 className="text-lg font-semibold">Relatório Mensal</h2>
|
|
58
|
-
</div>
|
|
59
|
-
<p>Conteúdo do relatório...</p>
|
|
60
|
-
</ContentContainer>
|
|
61
|
-
</BodyContent>`,preview:e.jsx("div",{className:"w-full max-w-3xl",children:e.jsx(o,{breadcrumbs:[{label:"Relatórios"}],className:"rounded-lg overflow-hidden",children:e.jsxs(a,{hasHeader:!1,children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[e.jsx(s,{className:"w-5 h-5 text-primary"}),e.jsx("h2",{className:"text-lg font-semibold",children:"Relatório Mensal"})]}),e.jsx("p",{className:"text-muted-foreground",children:"Conteúdo do relatório com header customizado dentro do container."})]})})})},{title:"Com React Router Link",description:"Usando asChild para integrar com Link do React Router",code:`import { Link } from 'react-router-dom';
|
|
62
|
-
|
|
63
|
-
<BodyContent
|
|
64
|
-
breadcrumbs={[
|
|
65
|
-
{
|
|
66
|
-
label: 'Home',
|
|
67
|
-
href: '/',
|
|
68
|
-
asChild: true,
|
|
69
|
-
children: <Link to="/">Home</Link>
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
label: 'Módulo',
|
|
73
|
-
href: '/modulo',
|
|
74
|
-
asChild: true,
|
|
75
|
-
children: <Link to="/modulo">Módulo</Link>
|
|
76
|
-
},
|
|
77
|
-
{ label: 'Página Atual' },
|
|
78
|
-
]}
|
|
79
|
-
>
|
|
80
|
-
<ContentContainer title="Conteúdo">
|
|
81
|
-
<p>Navegação com React Router...</p>
|
|
82
|
-
</ContentContainer>
|
|
83
|
-
</BodyContent>`,preview:e.jsx("div",{className:"w-full max-w-3xl",children:e.jsx(o,{breadcrumbs:[{label:"Home",href:"#"},{label:"Módulo",href:"#"},{label:"Página Atual"}],className:"rounded-lg overflow-hidden",children:e.jsx(a,{title:"Navegação com React Router",children:e.jsx("p",{className:"text-muted-foreground",children:"Os links do breadcrumb podem usar o componente Link do React Router para navegação SPA sem recarregamento de página."})})})})}],accessibility:['O breadcrumb usa a tag nav com aria-label="breadcrumb" para identificação por leitores de tela','A página atual no breadcrumb é marcada com aria-current="page"',"Os containers usam estrutura semântica com headings (h2) para títulos",'Separadores do breadcrumb são marcados com aria-hidden="true"'],notes:["O background externo usa a cor Escala Neutra 100 (#F5F5F5) para separar visualmente do conteúdo","Os ContentContainers têm background branco (#FFFFFF) com sombra sutil e border-radius","Use múltiplos ContentContainers para agrupar conteúdos relacionados na mesma página","O último item do breadcrumb é automaticamente tratado como página atual (sem link)","Para integração com React Router, use asChild=true e passe o Link como children","O espaçamento entre containers segue o padrão do Design System (space-y-6)"]})}export{p as BodyContentDoc};
|