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.
Files changed (124) hide show
  1. package/dist/README.md +116 -116
  2. package/dist/index.esm.js +1 -1
  3. package/dist/index.js +1 -1
  4. package/docs/DESIGN_SYSTEM.md +12 -0
  5. package/package.json +4 -2
  6. package/dist/assets/AccordionDoc-BnfxyOi9.js +0 -31
  7. package/dist/assets/ActionButtonDoc-b4F_J8gn.js +0 -47
  8. package/dist/assets/AlertDoc-PkiHguSJ.js +0 -37
  9. package/dist/assets/AppHeaderDoc-CsFMZGV0.js +0 -67
  10. package/dist/assets/AppSidebarDoc-Bg71N-zq.js +0 -196
  11. package/dist/assets/AuthDoc-DDm57y_J.js +0 -192
  12. package/dist/assets/AvatarDoc-C6wiZIZR.js +0 -11
  13. package/dist/assets/BadgeDoc-Bsg7cfm0.js +0 -36
  14. package/dist/assets/BaseFormDoc-DeIlV273.js +0 -169
  15. package/dist/assets/BodyContentDoc-Q3DGvyN9.js +0 -83
  16. package/dist/assets/BreadcrumbDoc-ChsVFjMF.js +0 -75
  17. package/dist/assets/ButtonDoc-C7Q31Bh3.js +0 -41
  18. package/dist/assets/ButtonGroupDoc-Bn5vhjBq.js +0 -7
  19. package/dist/assets/CalendarDoc-iVjNyxyr.js +0 -81
  20. package/dist/assets/CardDoc-D511dll7.js +0 -49
  21. package/dist/assets/ChartDoc-CQyYOEHL.js +0 -111
  22. package/dist/assets/CheckboxDoc-Cjsy4XAq.js +0 -55
  23. package/dist/assets/ColorPickerDoc-hnYJUWpF.js +0 -10
  24. package/dist/assets/ColorsFoundationDoc-B8Z4tAyZ.js +0 -13
  25. package/dist/assets/ComboTreeDoc-ChEbW4a3.js +0 -21
  26. package/dist/assets/ComboboxDoc-CHWeGE_F.js +0 -134
  27. package/dist/assets/ComponentDocTemplate-BtOCnlM2.js +0 -1
  28. package/dist/assets/ContextMenuDoc-C3mFO_Yx.js +0 -182
  29. package/dist/assets/ContextsDoc-ChEbQxom.js +0 -184
  30. package/dist/assets/CreateCrudPageDoc-C9tXisCF.js +0 -106
  31. package/dist/assets/CrudActionBarDoc-Cp1L4gpO.js +0 -112
  32. package/dist/assets/CrudGridDoc-D-kSFBAQ.js +0 -85
  33. package/dist/assets/CrudOverviewDoc-CeLBwg-B.js +0 -14
  34. package/dist/assets/CrudPrimitivesDoc-B2u1vZog.js +0 -164
  35. package/dist/assets/CrudTableDoc-CvV-II_X.js +0 -95
  36. package/dist/assets/DataListDoc-BLRii0jB.js +0 -13
  37. package/dist/assets/DesignSystemHome-TE0Ubaup.js +0 -1
  38. package/dist/assets/DialogDoc--LC5Jvat.js +0 -981
  39. package/dist/assets/DropdownMenuDoc-oPlEriRY.js +0 -175
  40. package/dist/assets/EmptyStateDoc-rNqfWKok.js +0 -35
  41. package/dist/assets/EnvironmentsDoc-CT7l5s2u.js +0 -96
  42. package/dist/assets/ErrorBoundaryDoc-rPHOUygA.js +0 -111
  43. package/dist/assets/ExampleCard-DfuMYM6E.js +0 -1
  44. package/dist/assets/FormDoc-B0L_QaCT.js +0 -81
  45. package/dist/assets/FoundationOverview-Dbb8rBsU.js +0 -1
  46. package/dist/assets/GridDoc-ifcGA2Yw.js +0 -28
  47. package/dist/assets/HooksDoc-CUOT_3Du.js +0 -665
  48. package/dist/assets/HoverCardDoc-CdTU2QkI.js +0 -31
  49. package/dist/assets/I18nDoc-CMEvFqsz.js +0 -232
  50. package/dist/assets/IconPickerDoc-DF9hEwnJ.js +0 -10
  51. package/dist/assets/IconsFoundationDoc-D4Y0wKbm.js +0 -33
  52. package/dist/assets/InputDoc-d_IL4dsq.js +0 -211
  53. package/dist/assets/LabelDoc-Dr64ISiJ.js +0 -42
  54. package/dist/assets/LeadershipDoc-BnrTuaeV.js +0 -416
  55. package/dist/assets/MediaDoc-CLuVprAr.js +0 -459
  56. package/dist/assets/MenubarDoc-CW7L4QJ4.js +0 -165
  57. package/dist/assets/ModulesDialogDoc-CUb_g4X-.js +0 -71
  58. package/dist/assets/NavigationMenuDoc-Csc0U6bV.js +0 -116
  59. package/dist/assets/OnboardingDialogDoc-3RtjNH1O.js +0 -55
  60. package/dist/assets/PaginationDoc-BGurD4xQ.js +0 -27
  61. package/dist/assets/PaginationDoc-DqFyou6O.js +0 -98
  62. package/dist/assets/PlacesDoc-Dyx8gsqb.js +0 -226
  63. package/dist/assets/PopoverDoc-DHF-ItUX.js +0 -64
  64. package/dist/assets/ProgressDoc-DXKV-fkI.js +0 -29
  65. package/dist/assets/QualiexUserFieldDoc-BbP7w-Pu.js +0 -149
  66. package/dist/assets/RadioGroupDoc-D845uweM.js +0 -57
  67. package/dist/assets/RadiusDoc-vN4tTsay.js +0 -7
  68. package/dist/assets/RequiredFieldsCounterDoc-TzR9r-U9.js +0 -58
  69. package/dist/assets/ResizableDoc-Bkfz_25O.js +0 -104
  70. package/dist/assets/RichTextEditorDoc-BUQrg7M8.js +0 -24
  71. package/dist/assets/ScrollAreaDoc-B6ODYHMX.js +0 -28
  72. package/dist/assets/SecurityDoc-Chbt6w1s.js +0 -204
  73. package/dist/assets/SelectDoc-BhcpBIAO.js +0 -80
  74. package/dist/assets/SeparatorDoc-C3fhatb0.js +0 -4
  75. package/dist/assets/ServicesDoc-_uao-HA_.js +0 -308
  76. package/dist/assets/ShadowsDoc-DpkO_TZQ.js +0 -9
  77. package/dist/assets/SignDoc-BJtnoT6I.js +0 -66
  78. package/dist/assets/SkeletonDoc-BZS07PJh.js +0 -54
  79. package/dist/assets/SliderDoc-D2ApV3XT.js +0 -41
  80. package/dist/assets/SpacingDoc-PNrU24B2.js +0 -12
  81. package/dist/assets/SplitButtonDoc-D5tUF2Ja.js +0 -53
  82. package/dist/assets/StepSelectorDoc-Cj0ALYar.js +0 -41
  83. package/dist/assets/SwitchDoc-DtsT8oh_.js +0 -56
  84. package/dist/assets/TableDoc-BC-jQnXu.js +0 -128
  85. package/dist/assets/TableOfContents-DBMJMbI4.js +0 -1
  86. package/dist/assets/TabsDoc-DtXJ0xY5.js +0 -42
  87. package/dist/assets/TextareaDoc-nuW5tqBQ.js +0 -46
  88. package/dist/assets/ToastDoc-D1aX5zda.js +0 -157
  89. package/dist/assets/ToggleDoc-ILass4CS.js +0 -51
  90. package/dist/assets/TooltipDoc-lPbdWe_9.js +0 -58
  91. package/dist/assets/TruncatedCellDoc-DOAzbF2F.js +0 -12
  92. package/dist/assets/TypographyFoundationDoc-3ZD-rQZw.js +0 -7
  93. package/dist/assets/UtilitiesDoc-D7lkYhuz.js +0 -145
  94. package/dist/assets/blocks-Jy49RoqJ.js +0 -1
  95. package/dist/assets/calendar-days-Cvf2zLJl.js +0 -1
  96. package/dist/assets/circle-plus-MnG9kjyq.js +0 -1
  97. package/dist/assets/circle-x-B9ouupla.js +0 -1
  98. package/dist/assets/crown-BweN5jpI.js +0 -1
  99. package/dist/assets/date-picker-ttyYeYvC.js +0 -1
  100. package/dist/assets/disabled-menu-item-WlpPOqxg.js +0 -1
  101. package/dist/assets/drawer-DvU6_eK5.js +0 -3
  102. package/dist/assets/file-pen-line-C0VV-QjF.js +0 -1
  103. package/dist/assets/git-branch-DCjGGwvF.js +0 -1
  104. package/dist/assets/globe-BdFDFP_k.js +0 -1
  105. package/dist/assets/grip-vertical-CgXp0oI-.js +0 -1
  106. package/dist/assets/hash-BAYi_wfk.js +0 -1
  107. package/dist/assets/index-BtX5DZqb.js +0 -310
  108. package/dist/assets/index-C1So5Sai.css +0 -1
  109. package/dist/assets/life-buoy-BydIgTyJ.js +0 -1
  110. package/dist/assets/lucide-react-ZIMhRYmb.js +0 -1
  111. package/dist/assets/monitor-B6txWJPg.js +0 -1
  112. package/dist/assets/package-DNe3FsCh.js +0 -1
  113. package/dist/assets/pen-CzTmQ16z.js +0 -1
  114. package/dist/assets/pin-CJJgLEBz.js +0 -1
  115. package/dist/assets/radio-group-Btv_BY60.js +0 -1
  116. package/dist/assets/server-XQDXtrjm.js +0 -1
  117. package/dist/assets/share-2-Dz_89MJb.js +0 -1
  118. package/dist/assets/step-selector-D0_Y1dow.js +0 -1
  119. package/dist/assets/text-align-start-WsHo7CNJ.js +0 -1
  120. package/dist/assets/trash-CeK-mWnM.js +0 -1
  121. package/dist/assets/useMockCrud-RV9z9n5x.js +0 -1
  122. package/dist/assets/user-check-CrbWcnPN.js +0 -1
  123. package/dist/assets/user-plus-Dce9DbqQ.js +0 -1
  124. 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};