forlogic-core 1.15.8 → 1.16.1

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 (193) hide show
  1. package/.note/memory/components/action-button-for-tables.md +23 -0
  2. package/.note/memory/components/alertdialog-permanent-deletion.md +47 -0
  3. package/.note/memory/components/baseform-custom-fields.md +60 -0
  4. package/.note/memory/components/baseform-usage.md +43 -0
  5. package/.note/memory/components/delete-confirmation-dialog.md +48 -0
  6. package/.note/memory/components/dialog-sizes-and-structure.md +31 -0
  7. package/.note/memory/components/dialog-variants.md +44 -0
  8. package/.note/memory/components/pagination-usage.md +28 -0
  9. package/.note/memory/documentation/consolidated-components-registry.md +18 -0
  10. package/.note/memory/features/crud-standardized-config-props.md +3 -0
  11. package/.note/memory/features/import/attachment-strategy.md +18 -0
  12. package/.note/memory/patterns/body-content-scroll-usage.md +59 -0
  13. package/.note/memory/patterns/crud-action-bar-3-zone-layout.md +3 -0
  14. package/.note/memory/patterns/crud-bulk-actions-dropdown-standard.md +3 -0
  15. package/.note/memory/patterns/crud-toolbar-layout.md +26 -0
  16. package/.note/memory/patterns/dialog-body-scroll-pattern.md +27 -0
  17. package/.note/memory/patterns/single-scroll-pattern.md +22 -0
  18. package/.note/memory/patterns/spa-navigation-pattern.md +19 -0
  19. package/.note/memory/rules/no-auto-index-rule.md +20 -0
  20. package/.note/memory/rules/no-delete-policy-rule.md +23 -0
  21. package/.note/memory/rules/no-env-modification-rule.md +19 -0
  22. package/.note/memory/rules/supabase-schema-rule.md +19 -0
  23. package/README.md +8 -4
  24. package/dist/README.md +7 -4
  25. package/dist/assets/AccordionDoc-BnfxyOi9.js +31 -0
  26. package/dist/assets/ActionButtonDoc-b4F_J8gn.js +47 -0
  27. package/dist/assets/AlertDoc-PkiHguSJ.js +37 -0
  28. package/dist/assets/AppHeaderDoc-CsFMZGV0.js +67 -0
  29. package/dist/assets/AppSidebarDoc-Bg71N-zq.js +196 -0
  30. package/dist/assets/AuthDoc-DDm57y_J.js +192 -0
  31. package/dist/assets/AvatarDoc-C6wiZIZR.js +11 -0
  32. package/dist/assets/BadgeDoc-Bsg7cfm0.js +36 -0
  33. package/dist/assets/BaseFormDoc-DeIlV273.js +169 -0
  34. package/dist/assets/BodyContentDoc-Q3DGvyN9.js +83 -0
  35. package/dist/assets/BreadcrumbDoc-ChsVFjMF.js +75 -0
  36. package/dist/assets/ButtonDoc-C7Q31Bh3.js +41 -0
  37. package/dist/assets/ButtonGroupDoc-Bn5vhjBq.js +7 -0
  38. package/dist/assets/CalendarDoc-iVjNyxyr.js +81 -0
  39. package/dist/assets/CardDoc-D511dll7.js +49 -0
  40. package/dist/assets/ChartDoc-CQyYOEHL.js +111 -0
  41. package/dist/assets/CheckboxDoc-Cjsy4XAq.js +55 -0
  42. package/dist/assets/ColorPickerDoc-hnYJUWpF.js +10 -0
  43. package/dist/assets/ColorsFoundationDoc-B8Z4tAyZ.js +13 -0
  44. package/dist/assets/ComboTreeDoc-ChEbW4a3.js +21 -0
  45. package/dist/assets/ComboboxDoc-CHWeGE_F.js +134 -0
  46. package/dist/assets/ComponentDocTemplate-BtOCnlM2.js +1 -0
  47. package/dist/assets/ContextMenuDoc-C3mFO_Yx.js +182 -0
  48. package/dist/assets/ContextsDoc-ChEbQxom.js +184 -0
  49. package/dist/assets/CreateCrudPageDoc-C9tXisCF.js +106 -0
  50. package/dist/assets/CrudActionBarDoc-Cp1L4gpO.js +112 -0
  51. package/dist/assets/CrudGridDoc-D-kSFBAQ.js +85 -0
  52. package/dist/assets/CrudOverviewDoc-CeLBwg-B.js +14 -0
  53. package/dist/assets/CrudPrimitivesDoc-B2u1vZog.js +164 -0
  54. package/dist/assets/CrudTableDoc-CvV-II_X.js +95 -0
  55. package/dist/assets/DataListDoc-BLRii0jB.js +13 -0
  56. package/dist/assets/DesignSystemHome-TE0Ubaup.js +1 -0
  57. package/dist/assets/DialogDoc--LC5Jvat.js +981 -0
  58. package/dist/assets/DropdownMenuDoc-oPlEriRY.js +175 -0
  59. package/dist/assets/EmptyStateDoc-rNqfWKok.js +35 -0
  60. package/dist/assets/EnvironmentsDoc-CT7l5s2u.js +96 -0
  61. package/dist/assets/ErrorBoundaryDoc-rPHOUygA.js +111 -0
  62. package/dist/assets/ExampleCard-DfuMYM6E.js +1 -0
  63. package/dist/assets/FormDoc-B0L_QaCT.js +81 -0
  64. package/dist/assets/FoundationOverview-Dbb8rBsU.js +1 -0
  65. package/dist/assets/GridDoc-ifcGA2Yw.js +28 -0
  66. package/dist/assets/HooksDoc-CUOT_3Du.js +665 -0
  67. package/dist/assets/HoverCardDoc-CdTU2QkI.js +31 -0
  68. package/dist/assets/I18nDoc-CMEvFqsz.js +232 -0
  69. package/dist/assets/IconPickerDoc-DF9hEwnJ.js +10 -0
  70. package/dist/assets/IconsFoundationDoc-D4Y0wKbm.js +33 -0
  71. package/dist/assets/InputDoc-d_IL4dsq.js +211 -0
  72. package/dist/assets/LabelDoc-Dr64ISiJ.js +42 -0
  73. package/dist/assets/LeadershipDoc-BnrTuaeV.js +416 -0
  74. package/dist/assets/MediaDoc-CLuVprAr.js +459 -0
  75. package/dist/assets/MenubarDoc-CW7L4QJ4.js +165 -0
  76. package/dist/assets/ModulesDialogDoc-CUb_g4X-.js +71 -0
  77. package/dist/assets/NavigationMenuDoc-Csc0U6bV.js +116 -0
  78. package/dist/assets/OnboardingDialogDoc-3RtjNH1O.js +55 -0
  79. package/dist/assets/PaginationDoc-BGurD4xQ.js +27 -0
  80. package/dist/assets/PaginationDoc-DqFyou6O.js +98 -0
  81. package/dist/assets/PlacesDoc-Dyx8gsqb.js +226 -0
  82. package/dist/assets/PopoverDoc-DHF-ItUX.js +64 -0
  83. package/dist/assets/ProgressDoc-DXKV-fkI.js +29 -0
  84. package/dist/assets/QualiexUserFieldDoc-BbP7w-Pu.js +149 -0
  85. package/dist/assets/RadioGroupDoc-D845uweM.js +57 -0
  86. package/dist/assets/RadiusDoc-vN4tTsay.js +7 -0
  87. package/dist/assets/RequiredFieldsCounterDoc-TzR9r-U9.js +58 -0
  88. package/dist/assets/ResizableDoc-Bkfz_25O.js +104 -0
  89. package/dist/assets/RichTextEditorDoc-BUQrg7M8.js +24 -0
  90. package/dist/assets/ScrollAreaDoc-B6ODYHMX.js +28 -0
  91. package/dist/assets/SecurityDoc-Chbt6w1s.js +204 -0
  92. package/dist/assets/SelectDoc-BhcpBIAO.js +80 -0
  93. package/dist/assets/SeparatorDoc-C3fhatb0.js +4 -0
  94. package/dist/assets/ServicesDoc-_uao-HA_.js +308 -0
  95. package/dist/assets/ShadowsDoc-DpkO_TZQ.js +9 -0
  96. package/dist/assets/SignDoc-BJtnoT6I.js +66 -0
  97. package/dist/assets/SkeletonDoc-BZS07PJh.js +54 -0
  98. package/dist/assets/SliderDoc-D2ApV3XT.js +41 -0
  99. package/dist/assets/SpacingDoc-PNrU24B2.js +12 -0
  100. package/dist/assets/SplitButtonDoc-D5tUF2Ja.js +53 -0
  101. package/dist/assets/StepSelectorDoc-Cj0ALYar.js +41 -0
  102. package/dist/assets/SwitchDoc-DtsT8oh_.js +56 -0
  103. package/dist/assets/TableDoc-BC-jQnXu.js +128 -0
  104. package/dist/assets/TableOfContents-DBMJMbI4.js +1 -0
  105. package/dist/assets/TabsDoc-DtXJ0xY5.js +42 -0
  106. package/dist/assets/TextareaDoc-nuW5tqBQ.js +46 -0
  107. package/dist/assets/ToastDoc-D1aX5zda.js +157 -0
  108. package/dist/assets/ToggleDoc-ILass4CS.js +51 -0
  109. package/dist/assets/TooltipDoc-lPbdWe_9.js +58 -0
  110. package/dist/assets/TruncatedCellDoc-DOAzbF2F.js +12 -0
  111. package/dist/assets/TypographyFoundationDoc-3ZD-rQZw.js +7 -0
  112. package/dist/assets/UtilitiesDoc-D7lkYhuz.js +145 -0
  113. package/dist/assets/blocks-Jy49RoqJ.js +1 -0
  114. package/dist/assets/calendar-days-Cvf2zLJl.js +1 -0
  115. package/dist/assets/circle-plus-MnG9kjyq.js +1 -0
  116. package/dist/assets/circle-x-B9ouupla.js +1 -0
  117. package/dist/assets/crown-BweN5jpI.js +1 -0
  118. package/dist/assets/date-picker-ttyYeYvC.js +1 -0
  119. package/dist/assets/disabled-menu-item-WlpPOqxg.js +1 -0
  120. package/dist/assets/drawer-DvU6_eK5.js +3 -0
  121. package/dist/assets/file-pen-line-C0VV-QjF.js +1 -0
  122. package/dist/assets/git-branch-DCjGGwvF.js +1 -0
  123. package/dist/assets/globe-BdFDFP_k.js +1 -0
  124. package/dist/assets/grip-vertical-CgXp0oI-.js +1 -0
  125. package/dist/assets/hash-BAYi_wfk.js +1 -0
  126. package/dist/assets/index-BtX5DZqb.js +310 -0
  127. package/dist/assets/index-C1So5Sai.css +1 -0
  128. package/dist/assets/life-buoy-BydIgTyJ.js +1 -0
  129. package/dist/assets/lucide-react-ZIMhRYmb.js +1 -0
  130. package/dist/assets/monitor-B6txWJPg.js +1 -0
  131. package/dist/assets/package-DNe3FsCh.js +1 -0
  132. package/dist/assets/pen-CzTmQ16z.js +1 -0
  133. package/dist/assets/pin-CJJgLEBz.js +1 -0
  134. package/dist/assets/radio-group-Btv_BY60.js +1 -0
  135. package/dist/assets/server-XQDXtrjm.js +1 -0
  136. package/dist/assets/share-2-Dz_89MJb.js +1 -0
  137. package/dist/assets/step-selector-D0_Y1dow.js +1 -0
  138. package/dist/assets/text-align-start-WsHo7CNJ.js +1 -0
  139. package/dist/assets/trash-CeK-mWnM.js +1 -0
  140. package/dist/assets/useMockCrud-RV9z9n5x.js +1 -0
  141. package/dist/assets/user-check-CrbWcnPN.js +1 -0
  142. package/dist/assets/user-plus-Dce9DbqQ.js +1 -0
  143. package/dist/auth/services/TokenManager.d.ts +5 -0
  144. package/dist/auth/services/TokenRegenerationService.d.ts +5 -3
  145. package/dist/auth/services/TokenService.d.ts +0 -4
  146. package/dist/bin/pull-docs.js +87 -64
  147. package/dist/components/modules/ModuleAccessGuard.d.ts +16 -0
  148. package/dist/components/modules/index.d.ts +2 -0
  149. package/dist/components/ui/chart.d.ts +1 -1
  150. package/dist/components/ui/color-picker.d.ts +4 -0
  151. package/dist/components/ui/combo-tree.d.ts +70 -0
  152. package/dist/components/ui/combobox.d.ts +1 -0
  153. package/dist/components/ui/dialog.d.ts +8 -0
  154. package/dist/components/ui/icon-picker.d.ts +2 -0
  155. package/dist/components/ui/input-group.d.ts +1 -1
  156. package/dist/components/ui/resizable.d.ts +1 -1
  157. package/dist/config/environments.d.ts +12 -0
  158. package/dist/config/index.d.ts +23 -9
  159. package/dist/contexts/ModuleContext.d.ts +34 -0
  160. package/dist/crud/components/SelectionCheckbox.d.ts +9 -0
  161. package/dist/crud/generateCrudConfig.d.ts +2 -2
  162. package/dist/docs/KNOWLEDGE.md +206 -0
  163. package/dist/exports/ui.d.ts +1 -0
  164. package/dist/hooks/useMediaQuery.d.ts +14 -0
  165. package/dist/hooks/useModuleAccess.d.ts +60 -0
  166. package/dist/hooks/usePageTitle.d.ts +7 -1
  167. package/dist/index.css +2 -2
  168. package/dist/index.css.map +1 -1
  169. package/dist/index.d.ts +9 -1
  170. package/dist/index.esm.js +1 -1
  171. package/dist/index.html +16 -11
  172. package/dist/index.js +1 -1
  173. package/dist/leadership/hooks/useLeadershipMutations.d.ts +0 -1
  174. package/dist/media/hooks/useMediaUpload.d.ts +0 -1
  175. package/dist/media/utils/imageHelpers.d.ts +1 -1
  176. package/dist/places/services/PlaceService.d.ts +1 -1
  177. package/dist/providers/CoreProviders.d.ts +20 -4
  178. package/dist/qualiex/services/qualiexApi.d.ts +22 -4
  179. package/dist/services/QualiexEnrichmentService.d.ts +0 -12
  180. package/dist/setup.d.ts +2 -0
  181. package/dist/sign/services/signService.d.ts +0 -6
  182. package/dist/types.d.ts +59 -10
  183. package/dist/utils/index.d.ts +2 -2
  184. package/docs/DESIGN_SYSTEM.md +12181 -0
  185. package/docs/KNOWLEDGE.md +206 -0
  186. package/docs/PUBLISH.md +168 -0
  187. package/package.json +16 -18
  188. package/dist/assets/index-D0RTIFH3.css +0 -1
  189. package/dist/assets/index-YMQXWoDk.js +0 -9868
  190. package/dist/auth/utils/AuthUtils.d.ts +0 -4
  191. package/dist/i18n/DatabaseBackend.d.ts +0 -9
  192. package/dist/i18n/components/TranslationLoader.d.ts +0 -10
  193. package/dist/services/TranslationService.d.ts +0 -20
package/README.md CHANGED
@@ -1094,7 +1094,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1094
1094
 
1095
1095
  ### 📚 Estatísticas da Documentação
1096
1096
 
1097
- **58 Componentes UI** | **6 Tokens** | **9 Ferramentas CRUD** | **8 Core/Utilitários**
1097
+ **61 Componentes UI** | **6 Tokens** | **9 Ferramentas CRUD** | **10 Core/Utilitários**
1098
1098
 
1099
1099
  ---
1100
1100
 
@@ -1119,7 +1119,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1119
1119
  - [Action Button](./docs/DESIGN_SYSTEM.md#actionbutton) - Botão compacto otimizado para ações em linhas de tabela e menus dropdown. OBRIGATÓRIO para todas as ações em tabelas CRUD.
1120
1120
  - [Alert](./docs/DESIGN_SYSTEM.md#alert) - Exibe uma mensagem de destaque para chamar a atenção do usuário. O componente inclui ícone automático baseado na variante.
1121
1121
  - [AppHeader](./docs/DESIGN_SYSTEM.md#appheader) - Header principal da aplicação com título dinâmico, busca global integrada ao CRUD, ações customizáveis e informações do usuário. Altura fixa de 56px (h-14).
1122
- - [AppSidebar](./docs/DESIGN_SYSTEM.md#appsidebar) - Sidebar de navegação principal da aplicação com suporte a menu colapsável, permissões, redimensionamento e navegação hierárquica.
1122
+ - [AppSidebar](./docs/DESIGN_SYSTEM.md#appsidebar) - Sidebar de navegação principal da aplicação com suporte a pin/unpin, permissões assíncronas, ações de módulo (SidebarActionTrigger), redimensionamento e navegação hierárquica.
1123
1123
  - [Assinatura Digital (Sign)](./docs/DESIGN_SYSTEM.md#sign) - Componente único multi-provider de assinatura digital com fluxo em 3 fases: Upload → Assinatura → Download. Suporta Clicksign (widget JavaScript embedded v2.1.0, API v3) e D4Sign (iframe embedded, API v1). O provedor é resolvido automaticamente pela configuração da unidade na tabela sign_configs.
1124
1124
  - [Avatar](./docs/DESIGN_SYSTEM.md#avatar) - Um elemento de imagem com fallback para representar o usuário.
1125
1125
  - [Badge](./docs/DESIGN_SYSTEM.md#badge) - Exibe um badge ou um componente que se parece com um badge.
@@ -1133,6 +1133,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1133
1133
  - [Checkbox](./docs/DESIGN_SYSTEM.md#checkbox) - Um controle que permite ao usuário alternar entre marcado e desmarcado.
1134
1134
  - [Color Picker](./docs/DESIGN_SYSTEM.md#colorpicker) - Seletor de cores com paleta predefinida e seletor customizado.
1135
1135
  - [Combobox](./docs/DESIGN_SYSTEM.md#combobox) - Componente versátil para seleção única ou múltipla com busca inteligente. Combina Popover e Command para autocomplete. O componente Command é usado internamente para fornecer funcionalidades de busca e navegação por teclado.
1136
+ - [ComboTree](./docs/DESIGN_SYSTEM.md#combotree) - Componente de seleção hierárquica (tree view) com busca recursiva, expansão por chevron e seleção por label.
1136
1137
  - [Context Menu](./docs/DESIGN_SYSTEM.md#contextmenu) - Exibe um menu ao usuário — como um conjunto de ações ou funções — acionado por um clique com o botão direito do mouse.
1137
1138
  - [DataList](./docs/DESIGN_SYSTEM.md#datalist) - Sistema de lista de dados com composição de componentes. Ideal para exibir informações estruturadas em formato de cards.
1138
1139
  - [Dialog](./docs/DESIGN_SYSTEM.md#dialog) - Uma janela sobreposta à janela principal ou a outra janela de diálogo, tornando o conteúdo abaixo inerte. Inclui variações para seleção, tabelas e formulários.
@@ -1161,6 +1162,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1161
1162
  - [RequiredFieldsCounter](./docs/DESIGN_SYSTEM.md#requiredfieldscounter) - Indica o progresso de preenchimento de campos obrigatórios em formulários com feedback visual e tooltips informativos.
1162
1163
  - [Resizable](./docs/DESIGN_SYSTEM.md#resizable) - Painéis redimensionáveis para criar layouts flexíveis e adaptáveis. Baseado em react-resizable-panels.
1163
1164
  - [Rich Text Editor](./docs/DESIGN_SYSTEM.md#richtexteditor) - Editor de texto rico construído com Tiptap, suportando formatação visual, edição de código HTML e preview. Ideal para formulários que precisam de conteúdo formatado.
1165
+ - [ScrollArea](./docs/DESIGN_SYSTEM.md#scrollarea) - Área de rolagem customizada com scrollbars estilizadas, baseada no Radix UI ScrollArea.
1164
1166
  - [Select](./docs/DESIGN_SYSTEM.md#select) - Exibe uma lista de opções para o usuário escolher—acionada por um botão.
1165
1167
  - [Separator](./docs/DESIGN_SYSTEM.md#separator) - Separa visual ou semanticamente o conteúdo.
1166
1168
  - [Slider](./docs/DESIGN_SYSTEM.md#slider) - Um input onde o usuário seleciona um valor dentro de um intervalo determinado.
@@ -1173,6 +1175,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1173
1175
  - [Toast](./docs/DESIGN_SYSTEM.md#toast) - Componente de notificação toast usando Sonner. Feedback temporário e não bloqueante que informa rapidamente o usuário sem competir visualmente com outros Toasts.
1174
1176
  - [Toggle](./docs/DESIGN_SYSTEM.md#toggle) - Botões de dois estados que podem estar ligados ou desligados, individualmente ou em grupo.
1175
1177
  - [Tooltip](./docs/DESIGN_SYSTEM.md#tooltip) - Um popup que exibe informações relacionadas a um elemento quando o elemento recebe foco do teclado ou o mouse passa sobre ele.
1178
+ - [Truncated Cell](./docs/DESIGN_SYSTEM.md#truncatedcell) - Componente utilitário que trunca texto longo e exibe tooltip automático quando o conteúdo está cortado.
1176
1179
 
1177
1180
  ### 🚀 Sistema CRUD
1178
1181
 
@@ -1182,8 +1185,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1182
1185
  - [CRUD Primitives](./docs/DESIGN_SYSTEM.md#crudprimitives) - Componentes de baixo nível para interfaces CRUD totalmente customizadas com controle total sobre layout e comportamento.
1183
1186
  - [CRUD System](./docs/DESIGN_SYSTEM.md#crudsystem) - Sistema completo para criação rápida de interfaces CRUD com validação, busca, paginação e muito mais.
1184
1187
  - [CrudActionBar](./docs/DESIGN_SYSTEM.md#crudactionbar) - Barra de ações unificada usada por todos os componentes CRUD (CrudTable, CrudGrid, createCrudPage) para garantir UX consistente.
1185
- - [CrudGrid](./docs/DESIGN_SYSTEM.md#crudgrid) - Componente para exibir dados em formato de grade (cards) com todas as funcionalidades CRUD.
1186
- Alternativa visual ao CrudTable para listagens com layout mais visual.
1188
+ - [CrudGrid](./docs/DESIGN_SYSTEM.md#crudgrid) - Componente para exibir dados em formato de grade (cards) com todas as funcionalidades CRUD. Alternativa visual ao CrudTable para listagens com layout mais visual.
1187
1189
  - [CrudTable](./docs/DESIGN_SYSTEM.md#crudtable) - Componente de tabela CRUD completo com ordenação, seleção, resize de colunas, ações em massa e paginação integrada com useCrud.
1188
1190
  - [Sistema CRUD](./docs/DESIGN_SYSTEM.md#crudoverview) - Componentes padronizados para operações Create, Read, Update e Delete com arquitetura em 3 níveis de abstração.
1189
1191
 
@@ -1191,9 +1193,11 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1191
1193
 
1192
1194
  - [Autenticação (Auth)](./docs/DESIGN_SYSTEM.md#auth) - Sistema completo de autenticação OAuth integrado com Qualiex. Inclui gerenciamento de tokens, rotas protegidas, suporte multi-tenant e troca de unidades.
1193
1195
  - [Contexts](./docs/DESIGN_SYSTEM.md#contexts) - Contexts globais da biblioteca forlogic-core para gerenciamento de estado da aplicação. Incluem LocaleContext para i18n, NavigationContext para navegação, PageMetadataContext para metadados de página e ModalStateContext para rastreamento de modais.
1196
+ - [Environments (Configuração por Project ID)](./docs/DESIGN_SYSTEM.md#environments) - Configurações de ambiente são extraídas automaticamente do arquivo auto-gerado pelo Lovable (src/integrations/supabase/client.ts) e injetadas pelo vite.config.ts. Não é necessário configurar variáveis Supabase no .env.
1194
1197
  - [ErrorBoundary](./docs/DESIGN_SYSTEM.md#errorboundary) - Componente de classe React que captura erros de renderização em componentes filhos, evitando que a aplicação inteira quebre.
1195
1198
  - [Hooks](./docs/DESIGN_SYSTEM.md#hooks) - Hooks utilitários da biblioteca forlogic-core para otimização, dados, formatação e UI. Todos os hooks seguem padrões React e são compatíveis com React Query quando aplicável.
1196
1199
  - [Internacionalização (i18n)](./docs/DESIGN_SYSTEM.md#i18n) - Sistema de internacionalização usando react-i18next com traduções carregadas de um arquivo JSON estático local (lib/i18n/translations.json). Suporta pt-BR, en-US e es-ES com gerenciamento de preferências do usuário.
1200
+ - [Controle de Acesso a Módulos](./docs/DESIGN_SYSTEM.md#moduleaccess) - Sistema para verificar e bloquear automaticamente o acesso do usuário a módulos da plataforma Qualiex. Inclui proteção automática de rotas via CoreProviders e hook para verificações programáticas.
1197
1201
  - [Segurança (Vite Config)](./docs/DESIGN_SYSTEM.md#security) - Plugin de segurança para Vite que aplica headers OWASP, CSP configurável, CORS seguro e proteções contra ataques comuns. Configuração centralizada para todos os projetos Forlogic.
1198
1202
  - [Services](./docs/DESIGN_SYSTEM.md#services) - Serviços utilitários da biblioteca forlogic-core para operações CRUD, envio de emails, tratamento de erros e gerenciamento de traduções. Todos os serviços são singletons prontos para uso.
1199
1203
  - [Utilities](./docs/DESIGN_SYSTEM.md#utilities) - Funções utilitárias essenciais exportadas pela biblioteca para manipulação de classes CSS, formatação de datas e valores monetários.
package/dist/README.md CHANGED
@@ -1094,7 +1094,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1094
1094
 
1095
1095
  ### 📚 Estatísticas da Documentação
1096
1096
 
1097
- **58 Componentes UI** | **6 Tokens** | **9 Ferramentas CRUD** | **8 Core/Utilitários**
1097
+ **61 Componentes UI** | **6 Tokens** | **9 Ferramentas CRUD** | **9 Core/Utilitários**
1098
1098
 
1099
1099
  ---
1100
1100
 
@@ -1119,7 +1119,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1119
1119
  - [Action Button](./docs/DESIGN_SYSTEM.md#actionbutton) - Botão compacto otimizado para ações em linhas de tabela e menus dropdown. OBRIGATÓRIO para todas as ações em tabelas CRUD.
1120
1120
  - [Alert](./docs/DESIGN_SYSTEM.md#alert) - Exibe uma mensagem de destaque para chamar a atenção do usuário. O componente inclui ícone automático baseado na variante.
1121
1121
  - [AppHeader](./docs/DESIGN_SYSTEM.md#appheader) - Header principal da aplicação com título dinâmico, busca global integrada ao CRUD, ações customizáveis e informações do usuário. Altura fixa de 56px (h-14).
1122
- - [AppSidebar](./docs/DESIGN_SYSTEM.md#appsidebar) - Sidebar de navegação principal da aplicação com suporte a menu colapsável, permissões, redimensionamento e navegação hierárquica.
1122
+ - [AppSidebar](./docs/DESIGN_SYSTEM.md#appsidebar) - Sidebar de navegação principal da aplicação com suporte a pin/unpin, permissões assíncronas, ações de módulo (SidebarActionTrigger), redimensionamento e navegação hierárquica.
1123
1123
  - [Assinatura Digital (Sign)](./docs/DESIGN_SYSTEM.md#sign) - Componente único multi-provider de assinatura digital com fluxo em 3 fases: Upload → Assinatura → Download. Suporta Clicksign (widget JavaScript embedded v2.1.0, API v3) e D4Sign (iframe embedded, API v1). O provedor é resolvido automaticamente pela configuração da unidade na tabela sign_configs.
1124
1124
  - [Avatar](./docs/DESIGN_SYSTEM.md#avatar) - Um elemento de imagem com fallback para representar o usuário.
1125
1125
  - [Badge](./docs/DESIGN_SYSTEM.md#badge) - Exibe um badge ou um componente que se parece com um badge.
@@ -1133,6 +1133,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1133
1133
  - [Checkbox](./docs/DESIGN_SYSTEM.md#checkbox) - Um controle que permite ao usuário alternar entre marcado e desmarcado.
1134
1134
  - [Color Picker](./docs/DESIGN_SYSTEM.md#colorpicker) - Seletor de cores com paleta predefinida e seletor customizado.
1135
1135
  - [Combobox](./docs/DESIGN_SYSTEM.md#combobox) - Componente versátil para seleção única ou múltipla com busca inteligente. Combina Popover e Command para autocomplete. O componente Command é usado internamente para fornecer funcionalidades de busca e navegação por teclado.
1136
+ - [ComboTree](./docs/DESIGN_SYSTEM.md#combotree) - Componente de seleção hierárquica (tree view) com busca recursiva, expansão por chevron e seleção por label.
1136
1137
  - [Context Menu](./docs/DESIGN_SYSTEM.md#contextmenu) - Exibe um menu ao usuário — como um conjunto de ações ou funções — acionado por um clique com o botão direito do mouse.
1137
1138
  - [DataList](./docs/DESIGN_SYSTEM.md#datalist) - Sistema de lista de dados com composição de componentes. Ideal para exibir informações estruturadas em formato de cards.
1138
1139
  - [Dialog](./docs/DESIGN_SYSTEM.md#dialog) - Uma janela sobreposta à janela principal ou a outra janela de diálogo, tornando o conteúdo abaixo inerte. Inclui variações para seleção, tabelas e formulários.
@@ -1161,6 +1162,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1161
1162
  - [RequiredFieldsCounter](./docs/DESIGN_SYSTEM.md#requiredfieldscounter) - Indica o progresso de preenchimento de campos obrigatórios em formulários com feedback visual e tooltips informativos.
1162
1163
  - [Resizable](./docs/DESIGN_SYSTEM.md#resizable) - Painéis redimensionáveis para criar layouts flexíveis e adaptáveis. Baseado em react-resizable-panels.
1163
1164
  - [Rich Text Editor](./docs/DESIGN_SYSTEM.md#richtexteditor) - Editor de texto rico construído com Tiptap, suportando formatação visual, edição de código HTML e preview. Ideal para formulários que precisam de conteúdo formatado.
1165
+ - [ScrollArea](./docs/DESIGN_SYSTEM.md#scrollarea) - Área de rolagem customizada com scrollbars estilizadas, baseada no Radix UI ScrollArea.
1164
1166
  - [Select](./docs/DESIGN_SYSTEM.md#select) - Exibe uma lista de opções para o usuário escolher—acionada por um botão.
1165
1167
  - [Separator](./docs/DESIGN_SYSTEM.md#separator) - Separa visual ou semanticamente o conteúdo.
1166
1168
  - [Slider](./docs/DESIGN_SYSTEM.md#slider) - Um input onde o usuário seleciona um valor dentro de um intervalo determinado.
@@ -1173,6 +1175,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1173
1175
  - [Toast](./docs/DESIGN_SYSTEM.md#toast) - Componente de notificação toast usando Sonner. Feedback temporário e não bloqueante que informa rapidamente o usuário sem competir visualmente com outros Toasts.
1174
1176
  - [Toggle](./docs/DESIGN_SYSTEM.md#toggle) - Botões de dois estados que podem estar ligados ou desligados, individualmente ou em grupo.
1175
1177
  - [Tooltip](./docs/DESIGN_SYSTEM.md#tooltip) - Um popup que exibe informações relacionadas a um elemento quando o elemento recebe foco do teclado ou o mouse passa sobre ele.
1178
+ - [Truncated Cell](./docs/DESIGN_SYSTEM.md#truncatedcell) - Componente utilitário que trunca texto longo e exibe tooltip automático quando o conteúdo está cortado.
1176
1179
 
1177
1180
  ### 🚀 Sistema CRUD
1178
1181
 
@@ -1182,8 +1185,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1182
1185
  - [CRUD Primitives](./docs/DESIGN_SYSTEM.md#crudprimitives) - Componentes de baixo nível para interfaces CRUD totalmente customizadas com controle total sobre layout e comportamento.
1183
1186
  - [CRUD System](./docs/DESIGN_SYSTEM.md#crudsystem) - Sistema completo para criação rápida de interfaces CRUD com validação, busca, paginação e muito mais.
1184
1187
  - [CrudActionBar](./docs/DESIGN_SYSTEM.md#crudactionbar) - Barra de ações unificada usada por todos os componentes CRUD (CrudTable, CrudGrid, createCrudPage) para garantir UX consistente.
1185
- - [CrudGrid](./docs/DESIGN_SYSTEM.md#crudgrid) - Componente para exibir dados em formato de grade (cards) com todas as funcionalidades CRUD.
1186
- Alternativa visual ao CrudTable para listagens com layout mais visual.
1188
+ - [CrudGrid](./docs/DESIGN_SYSTEM.md#crudgrid) - Componente para exibir dados em formato de grade (cards) com todas as funcionalidades CRUD. Alternativa visual ao CrudTable para listagens com layout mais visual.
1187
1189
  - [CrudTable](./docs/DESIGN_SYSTEM.md#crudtable) - Componente de tabela CRUD completo com ordenação, seleção, resize de colunas, ações em massa e paginação integrada com useCrud.
1188
1190
  - [Sistema CRUD](./docs/DESIGN_SYSTEM.md#crudoverview) - Componentes padronizados para operações Create, Read, Update e Delete com arquitetura em 3 níveis de abstração.
1189
1191
 
@@ -1191,6 +1193,7 @@ O comando usa credenciais públicas do Supabase do forlogic-core e não requer c
1191
1193
 
1192
1194
  - [Autenticação (Auth)](./docs/DESIGN_SYSTEM.md#auth) - Sistema completo de autenticação OAuth integrado com Qualiex. Inclui gerenciamento de tokens, rotas protegidas, suporte multi-tenant e troca de unidades.
1193
1195
  - [Contexts](./docs/DESIGN_SYSTEM.md#contexts) - Contexts globais da biblioteca forlogic-core para gerenciamento de estado da aplicação. Incluem LocaleContext para i18n, NavigationContext para navegação, PageMetadataContext para metadados de página e ModalStateContext para rastreamento de modais.
1196
+ - [Environments (Configuração por Project ID)](./docs/DESIGN_SYSTEM.md#environments) - Configurações de ambiente são extraídas automaticamente do arquivo auto-gerado pelo Lovable (src/integrations/supabase/client.ts) e injetadas pelo vite.config.ts. Não é necessário configurar variáveis Supabase no .env.
1194
1197
  - [ErrorBoundary](./docs/DESIGN_SYSTEM.md#errorboundary) - Componente de classe React que captura erros de renderização em componentes filhos, evitando que a aplicação inteira quebre.
1195
1198
  - [Hooks](./docs/DESIGN_SYSTEM.md#hooks) - Hooks utilitários da biblioteca forlogic-core para otimização, dados, formatação e UI. Todos os hooks seguem padrões React e são compatíveis com React Query quando aplicável.
1196
1199
  - [Internacionalização (i18n)](./docs/DESIGN_SYSTEM.md#i18n) - Sistema de internacionalização usando react-i18next com traduções carregadas de um arquivo JSON estático local (lib/i18n/translations.json). Suporta pt-BR, en-US e es-ES com gerenciamento de preferências do usuário.
@@ -0,0 +1,31 @@
1
+ import{W as l,j as e,X as re,Y,Z as ne,_ as ae,$,a0 as se,a1 as ie,a2 as ce,a3 as le,a4 as de,a5 as q,a6 as pe,r as j,l as S,a7 as me,a8 as ue,a9 as xe,f as fe,aa as Ce,ab as Ae}from"./index-BtX5DZqb.js";import{C as he}from"./ComponentDocTemplate-BtOCnlM2.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";var d="Accordion",ve=["Home","End","ArrowDown","ArrowUp","ArrowLeft","ArrowRight"],[D,be,ge]=re(d),[I]=pe(d,[ge,q]),k=q(),K=l.forwardRef((o,n)=>{const{type:t,...a}=o,s=a,r=a;return e.jsx(D.Provider,{scope:o.__scopeAccordion,children:t==="multiple"?e.jsx(we,{...r,ref:n}):e.jsx(ye,{...s,ref:n})})});K.displayName=d;var[z,je]=I(d),[G,Ie]=I(d,{collapsible:!1}),ye=l.forwardRef((o,n)=>{const{value:t,defaultValue:a,onValueChange:s=()=>{},collapsible:r=!1,...c}=o,[i,p]=Y({prop:t,defaultProp:a??"",onChange:s,caller:d});return e.jsx(z,{scope:o.__scopeAccordion,value:l.useMemo(()=>i?[i]:[],[i]),onItemOpen:p,onItemClose:l.useCallback(()=>r&&p(""),[r,p]),children:e.jsx(G,{scope:o.__scopeAccordion,collapsible:r,children:e.jsx(L,{...c,ref:n})})})}),we=l.forwardRef((o,n)=>{const{value:t,defaultValue:a,onValueChange:s=()=>{},...r}=o,[c,i]=Y({prop:t,defaultProp:a??[],onChange:s,caller:d}),p=l.useCallback(f=>i((u=[])=>[...u,f]),[i]),x=l.useCallback(f=>i((u=[])=>u.filter(w=>w!==f)),[i]);return e.jsx(z,{scope:o.__scopeAccordion,value:c,onItemOpen:p,onItemClose:x,children:e.jsx(G,{scope:o.__scopeAccordion,collapsible:!0,children:e.jsx(L,{...r,ref:n})})})}),[Ne,y]=I(d),L=l.forwardRef((o,n)=>{const{__scopeAccordion:t,disabled:a,dir:s,orientation:r="vertical",...c}=o,i=l.useRef(null),p=ce(i,n),x=be(t),u=le(s)==="ltr",w=de(o.onKeyDown,v=>{if(!ve.includes(v.key))return;const oe=v.target,N=x().filter(O=>!O.ref.current?.disabled),b=N.findIndex(O=>O.ref.current===oe),V=N.length;if(b===-1)return;v.preventDefault();let m=b;const R=0,_=V-1,P=()=>{m=b+1,m>_&&(m=R)},T=()=>{m=b-1,m<R&&(m=_)};switch(v.key){case"Home":m=R;break;case"End":m=_;break;case"ArrowRight":r==="horizontal"&&(u?P():T());break;case"ArrowDown":r==="vertical"&&P();break;case"ArrowLeft":r==="horizontal"&&(u?T():P());break;case"ArrowUp":r==="vertical"&&T();break}const te=m%V;N[te].ref.current?.focus()});return e.jsx(Ne,{scope:t,disabled:a,direction:s,orientation:r,children:e.jsx(D.Slot,{scope:t,children:e.jsx($.div,{...c,"data-orientation":r,ref:p,onKeyDown:a?void 0:w})})})}),g="AccordionItem",[Re,M]=I(g),U=l.forwardRef((o,n)=>{const{__scopeAccordion:t,value:a,...s}=o,r=y(g,t),c=je(g,t),i=k(t),p=ne(),x=a&&c.value.includes(a)||!1,f=r.disabled||o.disabled;return e.jsx(Re,{scope:t,open:x,disabled:f,triggerId:p,children:e.jsx(ae,{"data-orientation":r.orientation,"data-state":Z(x),...i,...s,ref:n,disabled:f,open:x,onOpenChange:u=>{u?c.onItemOpen(a):c.onItemClose(a)}})})});U.displayName=g;var W="AccordionHeader",Q=l.forwardRef((o,n)=>{const{__scopeAccordion:t,...a}=o,s=y(d,t),r=M(W,t);return e.jsx($.h3,{"data-orientation":s.orientation,"data-state":Z(r.open),"data-disabled":r.disabled?"":void 0,...a,ref:n})});Q.displayName=W;var E="AccordionTrigger",B=l.forwardRef((o,n)=>{const{__scopeAccordion:t,...a}=o,s=y(d,t),r=M(E,t),c=Ie(E,t),i=k(t);return e.jsx(D.ItemSlot,{scope:t,children:e.jsx(se,{"aria-disabled":r.open&&!c.collapsible||void 0,"data-orientation":s.orientation,id:r.triggerId,...i,...a,ref:n})})});B.displayName=E;var F="AccordionContent",X=l.forwardRef((o,n)=>{const{__scopeAccordion:t,...a}=o,s=y(d,t),r=M(F,t),c=k(t);return e.jsx(ie,{role:"region","aria-labelledby":r.triggerId,"data-orientation":s.orientation,...c,...a,ref:n,style:{"--radix-accordion-content-height":"var(--radix-collapsible-content-height)","--radix-accordion-content-width":"var(--radix-collapsible-content-width)",...o.style}})});X.displayName=F;function Z(o){return o?"open":"closed"}var _e=K,Pe=U,Te=Q,J=B,ee=X;const H=_e,C=j.forwardRef(({className:o,...n},t)=>e.jsx(Pe,{ref:t,className:S("border-b",o),...n}));C.displayName="AccordionItem";const A=j.forwardRef(({className:o,children:n,...t},a)=>e.jsx(Te,{className:"flex",children:e.jsxs(J,{ref:a,className:S("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",o),...t,children:[n,e.jsx(me,{className:"h-4 w-4 shrink-0 transition-transform duration-200"})]})}));A.displayName=J.displayName;const h=j.forwardRef(({className:o,children:n,...t},a)=>e.jsx(ee,{ref:a,className:"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",...t,children:e.jsx("div",{className:S("pb-4 pt-0",o),children:n})}));h.displayName=ee.displayName;function Oe(){const[o,n]=j.useState(!1);return e.jsxs(ue,{open:o,onOpenChange:n,className:"w-[350px] space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between space-x-4 px-4",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"@peduarte starred 3 repositories"}),e.jsx(xe,{asChild:!0,children:e.jsx(fe,{variant:"ghost",size:"sm",children:e.jsx(Ce,{className:"h-4 w-4"})})})]}),e.jsxs(Ae,{className:"space-y-2",children:[e.jsx("div",{className:"rounded-md border px-4 py-2 text-sm",children:"@radix-ui/primitives"}),e.jsx("div",{className:"rounded-md border px-4 py-2 text-sm",children:"@radix-ui/colors"}),e.jsx("div",{className:"rounded-md border px-4 py-2 text-sm",children:"@stitches/react"})]})]})}function Me(){return e.jsx(he,{title:"Accordion & Collapsible",description:"Componentes de expansão/colapso para revelar conteúdo. Accordion para múltiplos itens, Collapsible para item único.",component:e.jsxs(H,{type:"single",collapsible:!0,className:"w-full max-w-md",children:[e.jsxs(C,{value:"item-1",children:[e.jsx(A,{children:"Is it accessible?"}),e.jsx(h,{children:"Yes. It adheres to the WAI-ARIA design pattern."})]}),e.jsxs(C,{value:"item-2",children:[e.jsx(A,{children:"Is it styled?"}),e.jsx(h,{children:"Yes. It comes with default styles that matches the other components aesthetic."})]}),e.jsxs(C,{value:"item-3",children:[e.jsx(A,{children:"Is it animated?"}),e.jsx(h,{children:"Yes. It's animated by default, but you can disable it if you prefer."})]})]}),usage:`import {
2
+ Accordion,
3
+ AccordionContent,
4
+ AccordionItem,
5
+ AccordionTrigger,
6
+ } from "forlogic-core"
7
+
8
+ <Accordion type="single" collapsible>
9
+ <AccordionItem value="item-1">
10
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
11
+ <AccordionContent>
12
+ Yes. It adheres to the WAI-ARIA design pattern.
13
+ </AccordionContent>
14
+ </AccordionItem>
15
+ </Accordion>`,examples:[{title:"Multiple Items Open",description:"Permite que múltiplos itens sejam abertos ao mesmo tempo",preview:e.jsxs(H,{type:"multiple",className:"w-full max-w-md",children:[e.jsxs(C,{value:"item-1",children:[e.jsx(A,{children:"Section 1"}),e.jsx(h,{children:"Content for section 1"})]}),e.jsxs(C,{value:"item-2",children:[e.jsx(A,{children:"Section 2"}),e.jsx(h,{children:"Content for section 2"})]})]}),code:`<Accordion type="multiple">
16
+ <AccordionItem value="item-1">
17
+ <AccordionTrigger>Section 1</AccordionTrigger>
18
+ <AccordionContent>Content for section 1</AccordionContent>
19
+ </AccordionItem>
20
+ </Accordion>`},{title:"Collapsible",description:"Componente simples para expandir/colapsar um único item",preview:e.jsx(Oe,{}),code:`import {
21
+ Collapsible,
22
+ CollapsibleContent,
23
+ CollapsibleTrigger,
24
+ } from "forlogic-core"
25
+
26
+ <Collapsible>
27
+ <CollapsibleTrigger>Toggle</CollapsibleTrigger>
28
+ <CollapsibleContent>
29
+ Content goes here
30
+ </CollapsibleContent>
31
+ </Collapsible>`}],props:[{name:"type",type:'"single" | "multiple"',default:"-",description:"Accordion: Determina se um ou múltiplos itens podem ser abertos."},{name:"collapsible",type:"boolean",default:"false",description:'Accordion: Quando type é "single", permite fechar o item aberto.'},{name:"defaultValue",type:"string | string[]",default:"-",description:"O(s) valor(es) ativo(s) padrão."},{name:"value",type:"string | string[]",default:"-",description:"O(s) valor(es) ativo(s) controlado(s)."},{name:"open",type:"boolean",default:"-",description:"Collapsible: O estado aberto controlado."},{name:"defaultOpen",type:"boolean",default:"false",description:"Collapsible: O estado aberto padrão."},{name:"onOpenChange",type:"(open: boolean) => void",default:"-",description:"Collapsible: Manipulador quando o estado muda."}],accessibility:["Acessível por teclado - Espaço ou Enter para alternar","Teclas de seta para navegar entre itens do accordion","Suporte ARIA completo com roles e estados adequados","Gerenciamento de foco e indicadores de foco visíveis"],notes:["**Accordion** é ideal para FAQs e listas de perguntas frequentes","**Collapsible** é melhor para um único elemento expansível","Ambos suportam animações suaves de abertura/fechamento"]})}export{Me as AccordionDoc};
@@ -0,0 +1,47 @@
1
+ import{j as e,f as s,m as n,n as a,o as i,A as t,p as r,q as o,s as c,t as d}from"./index-BtX5DZqb.js";import{C as l}from"./ComponentDocTemplate-BtOCnlM2.js";import{T as m}from"./trash-CeK-mWnM.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function j(){return e.jsx(l,{title:"Action Button",description:"Botão compacto otimizado para ações em linhas de tabela e menus dropdown. OBRIGATÓRIO para todas as ações em tabelas CRUD.",component:e.jsxs("div",{className:"w-full space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium mb-2",children:"✅ Uso Correto - ActionButton"}),e.jsxs(a,{children:[e.jsx(i,{asChild:!0,children:e.jsx(t,{})}),e.jsxs(r,{align:"end",children:[e.jsxs(o,{onClick:()=>alert("Editar"),children:[e.jsx(c,{className:"mr-2 h-4 w-4"}),"Editar"]}),e.jsxs(o,{onClick:()=>alert("Visualizar"),children:[e.jsx(d,{className:"mr-2 h-4 w-4"}),"Visualizar"]}),e.jsxs(o,{onClick:()=>alert("Excluir"),className:"text-destructive",children:[e.jsx(m,{className:"mr-2 h-4 w-4"}),"Excluir"]})]})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium mb-2",children:"ActionButton com ícone customizado"}),e.jsx(t,{children:e.jsx(c,{size:12})})]}),e.jsxs("div",{className:"border-t pt-4",children:[e.jsx("h3",{className:"text-sm font-medium mb-2 text-destructive",children:"❌ Errado - Não use Button genérico"}),e.jsxs("div",{className:"flex gap-2 opacity-50",children:[e.jsx(s,{variant:"ghost",size:"icon",className:"h-8 w-8",disabled:!0,children:e.jsx(n,{className:"h-4 w-4"})}),e.jsx("span",{className:"text-sm text-muted-foreground self-center",children:"← Nunca use isto em tabelas"})]})]})]}),usage:`import {
2
+ ActionButton,
3
+ DropdownMenu,
4
+ DropdownMenuTrigger,
5
+ DropdownMenuContent,
6
+ DropdownMenuItem
7
+ } from "forlogic-core"
8
+ import { Edit, Trash } from 'lucide-react'
9
+
10
+ // ✅ CORRETO: Uso padrão em tabelas CRUD
11
+ <DropdownMenu>
12
+ <DropdownMenuTrigger asChild>
13
+ <ActionButton />
14
+ </DropdownMenuTrigger>
15
+ <DropdownMenuContent align="end">
16
+ <DropdownMenuItem onClick={() => handleEdit(item)}>
17
+ <Edit className="mr-2 h-4 w-4" />
18
+ Editar
19
+ </DropdownMenuItem>
20
+ <DropdownMenuItem onClick={() => handleDelete(item)}>
21
+ <Trash className="mr-2 h-4 w-4" />
22
+ Excluir
23
+ </DropdownMenuItem>
24
+ </DropdownMenuContent>
25
+ </DropdownMenu>
26
+
27
+ // ✅ CORRETO: Com ícone customizado
28
+ <ActionButton>
29
+ <Edit size={12} />
30
+ </ActionButton>`,examples:[{title:"❌ Errado - Não use Button genérico",preview:e.jsxs("div",{className:"flex gap-2 opacity-50",children:[e.jsx(s,{variant:"ghost",size:"icon",className:"h-8 w-8",disabled:!0,children:e.jsx(n,{className:"h-4 w-4"})}),e.jsx("span",{className:"text-sm text-muted-foreground self-center",children:"← Nunca use isto"})]}),code:`// ❌ NUNCA faça isso em tabelas CRUD
31
+ <Button variant="ghost" size="icon" className="h-8 w-8">
32
+ <MoreHorizontal className="h-4 w-4" />
33
+ </Button>
34
+
35
+ // ❌ NUNCA faça isso
36
+ <Button variant="outline" size="sm">
37
+ <EllipsisVertical size={12} />
38
+ </Button>`},{title:"✅ Correto - Sempre use ActionButton",preview:e.jsxs(a,{children:[e.jsx(i,{asChild:!0,children:e.jsx(t,{})}),e.jsxs(r,{align:"end",children:[e.jsx(o,{children:"Editar"}),e.jsx(o,{children:"Excluir"})]})]}),code:`// ✅ SEMPRE use ActionButton em tabelas
39
+ <DropdownMenu>
40
+ <DropdownMenuTrigger asChild>
41
+ <ActionButton />
42
+ </DropdownMenuTrigger>
43
+ <DropdownMenuContent align="end">
44
+ <DropdownMenuItem>Editar</DropdownMenuItem>
45
+ <DropdownMenuItem>Excluir</DropdownMenuItem>
46
+ </DropdownMenuContent>
47
+ </DropdownMenu>`}],props:[{name:"children",type:"ReactNode",default:"<EllipsisVertical />",description:"Conteúdo customizado (ícone padrão: três pontos verticais)."},{name:"className",type:"string",default:"-",description:"Classes CSS adicionais."},{name:"onClick",type:"() => void",default:"-",description:"Handler de clique."}],accessibility:["Tamanho compacto (height: 28px, padding: 8px)","Ícone padrão: EllipsisVertical (três pontos verticais)",'variant="action" com estilo consistente do tema',"Perfeito para menus de ação em linhas de tabela"],notes:["⚠️ OBRIGATÓRIO: Use ActionButton para TODAS as ações em linhas de tabela CRUD",'❌ PROIBIDO: Usar Button variant="ghost" ou variant="icon" para ações de tabela',"O ActionButton garante consistência visual e acessibilidade em todo o sistema","Para ações padrão (editar/excluir), considere usar TableRowActions que já encapsula tudo","O ícone padrão é EllipsisVertical (não MoreHorizontal) para manter consistência"]})}export{j as ActionButtonDoc};
@@ -0,0 +1,37 @@
1
+ import{j as e,aA as a,aB as i,aC as r}from"./index-BtX5DZqb.js";import{C as s}from"./ComponentDocTemplate-BtOCnlM2.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function c(){return e.jsx(s,{title:"Alert",description:"Exibe uma mensagem de destaque para chamar a atenção do usuário. O componente inclui ícone automático baseado na variante.",component:e.jsxs(a,{variant:"info",className:"max-w-md",children:[e.jsx(i,{children:"Informação"}),e.jsx(r,{children:"Esta é uma mensagem informativa para o usuário."})]}),usage:`import { Alert, AlertDescription, AlertTitle } from "forlogic-core"
2
+
3
+ <Alert variant="info">
4
+ <AlertTitle>Informação</AlertTitle>
5
+ <AlertDescription>
6
+ Esta é uma mensagem informativa para o usuário.
7
+ </AlertDescription>
8
+ </Alert>`,examples:[{title:"Informativo (info)",description:"Alerta neutro para informações gerais. Ícone: Info.",preview:e.jsxs(a,{variant:"info",className:"max-w-md",children:[e.jsx(i,{children:"Informação"}),e.jsx(r,{children:"Você pode adicionar componentes e dependências ao seu app usando o CLI."})]}),code:`<Alert variant="info">
9
+ <AlertTitle>Informação</AlertTitle>
10
+ <AlertDescription>
11
+ Você pode adicionar componentes e dependências ao seu app usando o CLI.
12
+ </AlertDescription>
13
+ </Alert>`},{title:"Alerta (warning)",description:"Alerta de atenção para avisos. Ícone: Info.",preview:e.jsxs(a,{variant:"warning",className:"max-w-md",children:[e.jsx(i,{children:"Atenção"}),e.jsx(r,{children:"Sua sessão expira em 5 minutos. Salve suas alterações."})]}),code:`<Alert variant="warning">
14
+ <AlertTitle>Atenção</AlertTitle>
15
+ <AlertDescription>
16
+ Sua sessão expira em 5 minutos. Salve suas alterações.
17
+ </AlertDescription>
18
+ </Alert>`},{title:"Perigo (danger)",description:"Alerta de erro ou perigo. Ícone: AlertTriangle.",preview:e.jsxs(a,{variant:"danger",className:"max-w-md",children:[e.jsx(i,{children:"Erro"}),e.jsxs(r,{children:[e.jsx("p",{children:"Não foi possível processar seu pagamento."}),e.jsxs("ul",{className:"mt-2 list-disc list-inside text-sm",children:[e.jsx("li",{children:"Verifique os dados do cartão"}),e.jsx("li",{children:"Confirme se há saldo suficiente"})]})]})]}),code:`<Alert variant="danger">
19
+ <AlertTitle>Erro</AlertTitle>
20
+ <AlertDescription>
21
+ <p>Não foi possível processar seu pagamento.</p>
22
+ <ul className="mt-2 list-disc list-inside text-sm">
23
+ <li>Verifique os dados do cartão</li>
24
+ <li>Confirme se há saldo suficiente</li>
25
+ </ul>
26
+ </AlertDescription>
27
+ </Alert>`},{title:"Sucesso (success)",description:"Alerta de sucesso para confirmações. Ícone: CheckCircle.",preview:e.jsxs(a,{variant:"success",className:"max-w-md",children:[e.jsx(i,{children:"Sucesso"}),e.jsx(r,{children:"Suas alterações foram salvas com sucesso."})]}),code:`<Alert variant="success">
28
+ <AlertTitle>Sucesso</AlertTitle>
29
+ <AlertDescription>
30
+ Suas alterações foram salvas com sucesso.
31
+ </AlertDescription>
32
+ </Alert>`},{title:"Sem ícone",description:"Use showIcon={false} para ocultar o ícone automático.",preview:e.jsxs(a,{variant:"info",showIcon:!1,className:"max-w-md",children:[e.jsx(i,{children:"Alerta sem ícone"}),e.jsx(r,{children:"Este alerta não exibe o ícone padrão da variante."})]}),code:`<Alert variant="info" showIcon={false}>
33
+ <AlertTitle>Alerta sem ícone</AlertTitle>
34
+ <AlertDescription>
35
+ Este alerta não exibe o ícone padrão da variante.
36
+ </AlertDescription>
37
+ </Alert>`}],props:[{name:"variant",type:'"info" | "warning" | "danger" | "success"',default:'"info"',description:"O estilo visual e ícone do alerta."},{name:"showIcon",type:"boolean",default:"true",description:"Se deve exibir o ícone padrão da variante."},{name:"className",type:"string",default:"-",description:"Classes CSS adicionais."}],accessibility:['Usa role="alert" para anunciar automaticamente aos leitores de tela',"A cor não é o único meio de transmitir informações - ícones fornecem contexto adicional","Estrutura HTML semântica com título e descrição claramente definidos","Contraste de cores adequado para acessibilidade visual"]})}export{c as AlertDoc};
@@ -0,0 +1,67 @@
1
+ import{j as e,bW as o,I as i,f as s,bT as a,x as u,P as n,aN as d,a7 as l,c9 as c,r as x,B as p}from"./index-BtX5DZqb.js";import{C as h}from"./ComponentDocTemplate-BtOCnlM2.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";function f(){const[t,r]=x.useState("");return e.jsx("div",{className:"w-full bg-background border rounded-lg",children:e.jsx("header",{className:"px-4 py-2",children:e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex-shrink-0",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("h1",{className:"text-lg font-semibold",children:"Usuários"}),e.jsx(p,{className:"bg-primary text-primary-foreground text-xs px-2 py-0.5",children:"Módulo"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Gerenciamento de usuários"})]}),e.jsxs("div",{className:"flex items-center gap-2 flex-1 max-w-md",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(o,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4"}),e.jsx(i,{placeholder:"Buscar...",value:t,onChange:m=>r(m.target.value),className:"w-full pl-10 pr-8"}),t&&e.jsx(s,{variant:"ghost",size:"sm",className:"absolute right-1 top-1/2 transform -translate-y-1/2 h-6 w-6 p-0",onClick:()=>r(""),children:e.jsx(c,{className:"h-3.5 w-3.5"})})]}),e.jsx(s,{variant:"outline",size:"icon",className:"h-10 w-10",children:e.jsx(a,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"flex-shrink-0 ml-auto flex items-center gap-3",children:[e.jsxs(s,{size:"sm",children:[e.jsx(n,{className:"h-4 w-4 mr-1"}),"Novo"]}),e.jsx(s,{variant:"ghost",className:"h-auto p-2",children:e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsxs("div",{className:"text-left",children:[e.jsx("p",{className:"text-sm font-medium",children:"João Silva"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Empresa XYZ"})]}),e.jsx("div",{className:"w-8 h-8 bg-primary rounded-full flex items-center justify-center",children:e.jsx(d,{className:"h-4 w-4 text-primary-foreground"})}),e.jsx(l,{className:"h-4 w-4"})]})})]})]})})})}function g(){return e.jsxs("div",{className:"w-full",children:[e.jsxs("div",{className:"flex items-center justify-between h-14 px-4 border rounded-lg bg-background",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"bg-primary/10 text-primary px-2 py-1 rounded text-xs font-medium",children:"TÍTULO"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"←"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"→"}),e.jsx("div",{className:"bg-secondary/50 text-secondary-foreground px-2 py-1 rounded text-xs font-medium",children:"BUSCA"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"←"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:"→"}),e.jsx("div",{className:"bg-accent/50 text-accent-foreground px-2 py-1 rounded text-xs font-medium",children:"AÇÕES"}),e.jsx("div",{className:"bg-muted text-muted-foreground px-2 py-1 rounded text-xs font-medium",children:"PERFIL"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground text-center mt-2",children:"Diagrama das áreas internas do AppHeader (altura fixa: 56px)"})]})}function v(){return e.jsxs("div",{className:"flex gap-8 items-start",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:'variant="dropdown"'}),e.jsx("div",{className:"border rounded-lg p-2 bg-background",children:e.jsx(s,{variant:"ghost",className:"h-auto p-2",children:e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsxs("div",{className:"text-left",children:[e.jsx("p",{className:"text-sm font-medium",children:"João Silva"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Empresa XYZ"})]}),e.jsx("div",{className:"w-8 h-8 bg-primary rounded-full flex items-center justify-center",children:e.jsx(d,{className:"h-4 w-4 text-primary-foreground"})}),e.jsx(l,{className:"h-4 w-4"})]})})})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:"Menu aberto"}),e.jsxs("div",{className:"border rounded-lg p-2 w-48 bg-background shadow-lg",children:[e.jsxs("div",{className:"py-1.5 px-2 hover:bg-muted rounded flex items-center gap-2 cursor-pointer",children:[e.jsx(a,{className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:"Alterar Unidade"})]}),e.jsx("div",{className:"h-px bg-border my-1"}),e.jsxs("div",{className:"py-1.5 px-2 hover:bg-muted rounded flex items-center gap-2 cursor-pointer text-destructive",children:[e.jsx(c,{className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:"Sair"})]})]})]})]})}function y(){return e.jsx(h,{title:"AppHeader",description:"Header principal da aplicação com título dinâmico, busca global integrada ao CRUD, ações customizáveis e informações do usuário. Altura fixa de 56px (h-14).",component:e.jsx(f,{}),usage:`import { AppLayout } from 'forlogic-core';
2
+ import { usePageMetadataContext } from 'forlogic-core';
3
+
4
+ // O AppHeader é renderizado automaticamente pelo AppLayout
5
+ <AppLayout sidebarConfig={sidebarConfig}>
6
+ <Routes>...</Routes>
7
+ </AppLayout>
8
+
9
+ // Para configurar título e ações, use o PageMetadataContext
10
+ function UsersPage() {
11
+ const { setHeaderActions, setMetadata } = usePageMetadataContext();
12
+
13
+ useEffect(() => {
14
+ setMetadata({ title: 'Usuários', subtitle: 'Gerenciamento' });
15
+ setHeaderActions(
16
+ <Button size="sm" onClick={() => setIsAddDialogOpen(true)}>
17
+ <Plus className="h-4 w-4 mr-1" />
18
+ Novo Usuário
19
+ </Button>
20
+ );
21
+
22
+ return () => {
23
+ setMetadata({});
24
+ setHeaderActions(null);
25
+ };
26
+ }, []);
27
+ }`,examples:[{title:"Estrutura do Componente",description:"O AppHeader possui 4 áreas internas: Título (esquerda), Busca (centro), Ações (direita) e Perfil (extrema direita).",preview:e.jsx(g,{}),code:`// Áreas do AppHeader
28
+ // 1. Título: Título da página + Subtítulo + Badge do módulo
29
+ // 2. Busca: Input de busca global (visível quando habilitado)
30
+ // 3. Ações: Botões customizáveis via PageMetadataContext
31
+ // 4. Perfil: UserInfo com dropdown de usuário
32
+
33
+ // Altura fixa: 56px (h-14 no Tailwind)`},{title:"UserInfo Integrado",description:"Dropdown com informações do usuário, troca de unidade e logout.",preview:e.jsx(v,{}),code:`// UserInfo com variantes
34
+ <UserInfo variant="dropdown" /> // No header
35
+ <UserInfo variant="card" /> // Em páginas
36
+
37
+ // Menu do usuário inclui:
38
+ // - Alterar Unidade (submenu com todas unidades disponíveis)
39
+ // - Sair (Logout)`},{title:"Busca Global",description:"Campo de busca com debounce sincronizado com URL (?search=termo).",preview:e.jsxs("div",{className:"flex items-center gap-2 max-w-md",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(o,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4"}),e.jsx(i,{placeholder:"Buscar...",className:"w-full pl-10 pr-8"})]}),e.jsx(s,{variant:"outline",size:"icon",className:"h-10 w-10",children:e.jsx(a,{className:"h-4 w-4"})})]}),code:`// Configurar campos pesquisáveis no service
40
+ const userService = createSimpleService({
41
+ tableName: 'users',
42
+ schema: 'common',
43
+ searchFields: ['name', 'email', 'department'],
44
+ });
45
+
46
+ // A busca é exibida quando isSearchVisible = true no AuthContext`},{title:"Ações Customizáveis",description:"Botões de ação configurados via PageMetadataContext.",preview:e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(s,{variant:"outline",size:"sm",children:[e.jsx(u,{className:"h-4 w-4 mr-1"}),"Exportar"]}),e.jsxs(s,{size:"sm",children:[e.jsx(n,{className:"h-4 w-4 mr-1"}),"Novo"]})]}),code:`// ✅ CORRETO: Apenas botões de ação
47
+ setHeaderActions(
48
+ <>
49
+ <Button variant="outline" size="sm">
50
+ <Download className="h-4 w-4 mr-1" />
51
+ Exportar
52
+ </Button>
53
+ <Button size="sm">
54
+ <Plus className="h-4 w-4 mr-1" />
55
+ Novo
56
+ </Button>
57
+ </>
58
+ );
59
+
60
+ // ❌ INCORRETO: Formulário no header
61
+ setHeaderActions(
62
+ <form onSubmit={...}>
63
+ <Input />
64
+ <Select />
65
+ <Button type="submit">Salvar</Button>
66
+ </form>
67
+ );`}],props:[{name:"actions",type:"ReactNode",description:"Botões de ação à direita do header (via PageMetadataContext)"},{name:"variant (UserInfo)",type:'"card" | "dropdown"',default:'"card"',description:"Estilo de exibição do UserInfo"},{name:"selectedUnit (UserInfo)",type:"Company | null",description:"Unidade selecionada"},{name:"onUnitChange (UserInfo)",type:"(unit: Company) => void",description:"Callback ao trocar unidade"}],accessibility:["Busca acessível via teclado (Tab para navegar, Escape para limpar)","UserInfo dropdown acessível via teclado","Botões de ação com foco visível (focus-visible)",'Título da página anunciado por leitores de tela (role="heading")',"Atalho de teclado para busca (/ ou Ctrl+K pode ser implementado)"],notes:["✅ Use PageMetadataContext para ações dinâmicas","✅ Mantenha título curto e descritivo (máx. 3 palavras)","✅ Use um único header por página","✅ Limpe ações no useEffect cleanup","✅ Use ícones do Lucide nos botões de ação","❌ Não adicione múltiplos headers na mesma página","❌ Não modifique a altura do header (fixo em 56px)","❌ Não coloque formulários complexos no header","❌ Não use mais de 3 botões de ação","❌ Não esconda o UserInfo em páginas autenticadas"]})}export{y as AppHeaderDoc};
@@ -0,0 +1,196 @@
1
+ import{j as e,B as n,f as t,bm as j,P as l,g as P,bs as c,h as b,l as i,c7 as d,bB as T,w as R,v as k,bZ as I,a7 as U,G,bi as D,r as m,cS as H,ek as A,cT as p,cU as x,cV as u,b$ as B,bE as W}from"./index-BtX5DZqb.js";import{C as q}from"./ComponentDocTemplate-BtOCnlM2.js";import{a as L,b as z,P as F}from"./pin-CJJgLEBz.js";import{G as O}from"./grip-vertical-CgXp0oI-.js";import"./ExampleCard-DfuMYM6E.js";import"./TableOfContents-DBMJMbI4.js";const V=[{icon:c,label:"Visão geral"},{icon:B,label:"Showcase"},{icon:d,label:"Liderança"},{icon:W,label:"Locais"},{icon:k,label:"Gestão",children:[{icon:d,label:"Usuários"},{icon:I,label:"Permissões"}]},{icon:F,label:"Design System"}];function Q(){const[a,r]=m.useState(!0),[N,h]=m.useState(!0),[S,g]=m.useState("Visão geral"),[E,M]=m.useState(["Gestão"]);return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx(t,{variant:a?"primary":"outline",size:"sm",onClick:()=>{r(!0),h(!0)},children:"Expandido"}),e.jsx(t,{variant:a?"outline":"primary",size:"sm",onClick:()=>{r(!1),h(!1)},children:"Colapsado"}),e.jsxs("span",{className:"text-xs text-muted-foreground ml-2",children:[N?e.jsx(L,{className:"inline h-3 w-3 mr-1"}):e.jsx(z,{className:"inline h-3 w-3 mr-1"}),N?"Pinada":"Despinada"]})]}),e.jsx(H,{children:e.jsx("div",{className:"relative inline-block",children:e.jsxs("div",{className:i("bg-background border border-border rounded-lg py-4 space-y-3 transition-all duration-300 overflow-visible relative",a?"w-64 px-3":"w-16 px-1.5"),children:[a?e.jsxs("div",{className:"flex flex-col gap-3 pl-2",children:[e.jsx("div",{className:"flex items-center h-10",children:e.jsx("img",{src:A.logo,alt:"Logo",className:"h-5 object-contain",onError:s=>{s.target.src='data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 24"%3E%3Ctext x="0" y="18" font-family="system-ui" font-size="16" font-weight="bold" fill="%23333"%3EForlogic%3C/text%3E%3C/svg%3E'}})}),e.jsxs(t,{variant:"secondary",size:"default",className:"h-10 gap-2 px-3 justify-start w-full",children:[e.jsx(j,{className:"h-4 w-4 flex-shrink-0"}),e.jsx("span",{className:"truncate",children:"Meu Módulo"})]})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center w-full gap-3",children:[e.jsx("div",{className:"flex items-center justify-center h-10 w-8",children:e.jsx("img",{src:A.smallLogo,alt:"Logo",className:"h-6 w-auto object-contain",onError:s=>{s.target.src='data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34 34"%3E%3Crect width="34" height="34" rx="6" fill="%23e5e7eb"/%3E%3Ctext x="50%25" y="55%25" text-anchor="middle" font-family="system-ui" font-size="14" font-weight="bold" fill="%23333"%3EF%3C/text%3E%3C/svg%3E'}})}),e.jsxs(p,{children:[e.jsx(x,{asChild:!0,children:e.jsx("button",{className:"flex items-center justify-center h-10 w-8 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors",children:e.jsx(j,{className:"h-4 w-4"})})}),e.jsx(u,{side:"right",children:"Módulos"})]})]}),a?e.jsxs(t,{variant:"outline",className:"w-full gap-2 justify-start h-10",children:[e.jsx(l,{className:"h-4 w-4"}),"Novo Processo"]}):e.jsxs(p,{children:[e.jsx(x,{asChild:!0,children:e.jsx(t,{variant:"outline",size:"icon",className:"w-full h-10",children:e.jsx(l,{className:"h-4 w-4"})})}),e.jsx(u,{side:"right",children:"Novo Processo"})]}),e.jsxs("div",{className:"relative py-2",children:[e.jsx("div",{className:"border-t border-border"}),e.jsxs(p,{children:[e.jsx(x,{asChild:!0,children:e.jsx("button",{onClick:()=>{const s=!a;r(s),h(s)},className:i("absolute top-1/2 -translate-y-1/2 z-[100] h-6 w-6 flex items-center justify-center rounded-full bg-primary hover:bg-primary/90 shadow-md transition-colors",a?"-right-6":"-right-[18px]"),children:a?e.jsx(P,{className:"h-3.5 w-3.5 text-primary-foreground"}):e.jsx(b,{className:"h-3.5 w-3.5 text-primary-foreground"})})}),e.jsx(u,{side:"right",children:e.jsx("p",{children:a?"Recolher":"Expandir"})})]})]}),e.jsx("div",{className:"space-y-1",children:V.map(s=>{const w=s.label===S,f="children"in s&&s.children,y=E.includes(s.label),C=()=>{M(o=>o.includes(s.label)?o.filter(v=>v!==s.label):[...o,s.label])};return a?f?e.jsxs("div",{children:[e.jsxs("div",{onClick:C,className:i("flex items-center justify-between h-10 px-3 rounded-md transition-colors cursor-pointer","hover:bg-muted text-foreground"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"flex items-center justify-center h-8 w-8",children:e.jsx(s.icon,{className:"h-4 w-4"})}),e.jsx("span",{className:"text-sm font-medium",children:s.label})]}),e.jsx(b,{className:i("h-4 w-4 transition-transform",y&&"rotate-90")})]}),y&&e.jsx("div",{className:"ml-6 mt-1 space-y-1 border-l border-border pl-3",children:s.children.map(o=>{const v=o.label===S;return e.jsxs("div",{onClick:()=>g(o.label),className:i("flex items-center gap-2 h-8 px-2 rounded-md transition-colors cursor-pointer text-sm",v?"bg-primary/10 text-primary font-medium":"text-muted-foreground hover:bg-muted hover:text-foreground"),children:[e.jsx(o.icon,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:o.label})]},o.label)})})]},s.label):e.jsxs("div",{onClick:()=>g(s.label),className:i("flex items-center gap-3 h-10 px-3 rounded-md transition-colors cursor-pointer",w?"bg-primary/10 text-primary font-medium":"hover:bg-muted text-foreground"),children:[e.jsx("span",{className:"flex items-center justify-center h-8 w-8",children:e.jsx(s.icon,{className:"h-4 w-4"})}),e.jsx("span",{className:"text-sm",children:s.label})]},s.label):e.jsxs(p,{children:[e.jsx(x,{asChild:!0,children:e.jsx("div",{onClick:()=>{f?C():g(s.label)},className:i("flex items-center justify-center h-8 w-8 mx-auto rounded-md transition-colors cursor-pointer",w?"bg-primary/10 text-primary":"hover:bg-accent hover:text-accent-foreground"),children:e.jsx(s.icon,{className:"h-4 w-4"})})}),e.jsxs(u,{side:"right",children:[s.label,f&&" (expandir para ver subitens)"]})]},s.label)})}),a&&e.jsx("div",{className:"absolute inset-y-0 right-0 w-1 hover:bg-primary/20 transition-colors cursor-ew-resize"})]})})})]})}function K(){return e.jsxs("div",{className:"flex gap-8 items-start flex-wrap",children:[e.jsx("div",{className:"relative",children:e.jsxs("div",{className:"w-64 bg-background border border-border rounded-lg py-4 px-3 space-y-3 relative overflow-visible",children:[e.jsxs("div",{className:"flex flex-col gap-2 px-2 py-2 border border-dashed border-primary/50 rounded relative",children:[e.jsx(n,{variant:"outline",className:"absolute -top-2.5 left-2 text-xs bg-background",children:"SidebarHeader"}),e.jsx("div",{className:"h-8 w-14 bg-muted rounded flex items-center justify-center text-[10px]",children:"Logo"}),e.jsxs(t,{variant:"secondary",size:"sm",className:"h-8 text-[10px] gap-2 px-3 justify-start",children:[e.jsx(j,{className:"h-3 w-3"}),"Módulos"]})]}),e.jsxs("div",{className:"border border-dashed border-green-500/50 rounded p-2 relative",children:[e.jsx(n,{variant:"outline",className:"absolute -top-2.5 left-2 text-xs bg-background text-green-600",children:"SidebarActionTrigger"}),e.jsxs(t,{variant:"outline",size:"sm",className:"w-full gap-1 text-xs h-7 justify-start",children:[e.jsx(l,{className:"h-3 w-3"}),"Ação"]})]}),e.jsxs("div",{className:"relative py-2",children:[e.jsx("div",{className:"border-t border-dashed border-blue-500/50 relative",children:e.jsx(n,{variant:"outline",className:"absolute -top-2.5 right-0 text-[8px] bg-background text-blue-600 whitespace-nowrap",children:"Pin/Unpin"})}),e.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 -right-5 h-5 w-5 rounded-full bg-primary flex items-center justify-center",children:e.jsx(P,{className:"h-2.5 w-2.5 text-primary-foreground"})})]}),e.jsxs("div",{className:"border border-dashed border-orange-500/50 rounded p-2 relative space-y-1",children:[e.jsx(n,{variant:"outline",className:"absolute -top-2.5 left-2 text-xs bg-background text-orange-600",children:"NavigationItems"}),[{label:"Item simples",active:!0},{label:"Item com children",hasChildren:!0}].map((a,r)=>e.jsxs("div",{className:i("flex items-center justify-between px-2 py-1.5 rounded text-xs",a.active?"bg-primary/10 text-primary":"bg-muted/50"),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(c,{className:"h-3 w-3"}),e.jsx("span",{children:a.label})]}),a.hasChildren&&e.jsx(b,{className:"h-3 w-3"})]},r))]}),e.jsx("div",{className:"absolute inset-y-0 right-0 w-1 border-r-2 border-dashed border-purple-400/50 rounded-r"}),e.jsx(n,{variant:"outline",className:"absolute top-1/2 -right-16 text-[8px] bg-background text-purple-600 whitespace-nowrap",children:"Resize rail"})]})}),e.jsxs("div",{className:"space-y-2 text-xs",children:[e.jsx("p",{className:"font-medium text-sm mb-3",children:"Hierarquia:"}),e.jsx("pre",{className:"bg-muted p-3 rounded text-xs font-mono leading-relaxed",children:`<Sidebar collapsible="icon">
2
+ ├── SidebarHeader
3
+ │ ├── Logo / SmallLogo
4
+ │ └── ModulesButton (appName)
5
+
6
+ ├── SidebarActionTrigger (opcional)
7
+ │ ├── Ação única → executa direto
8
+ │ └── Múltiplas → dropdown
9
+
10
+ ├── Separator + Pin/Unpin button
11
+
12
+ └── SidebarContent
13
+ └── NavigationItems
14
+ ├── Item simples (Link)
15
+ ├── Item com permissionCheck
16
+ └── Item com children
17
+ └── Collapsible > SidebarMenuSub`})]})]})}function Z(){return e.jsx("div",{className:"flex gap-4 items-start flex-wrap",children:[{title:"Ativo",className:"bg-primary/10 text-primary font-medium",icon:c,label:"Início"},{title:"Hover",className:"bg-muted",icon:d,label:"Usuários"},{title:"Desabilitado",className:"opacity-50 cursor-not-allowed border",icon:T,label:"Admin"},{title:"Carregando",className:"opacity-50 border",icon:R,label:"Verificando...",spin:!0}].map(a=>e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs text-muted-foreground mb-2",children:a.title}),e.jsxs("div",{className:i("flex items-center gap-3 px-3 py-2 rounded-md w-40",a.className),children:[e.jsx(a.icon,{className:i("h-4 w-4",a.spin&&"animate-spin")}),e.jsx("span",{className:"text-sm",children:a.label})]})]},a.title))})}function $(){return e.jsxs("div",{className:"p-3 border rounded-md w-56 space-y-1 bg-background",children:[e.jsxs("div",{className:"flex items-center gap-3 h-10 px-3 rounded-md hover:bg-muted",children:[e.jsx("span",{className:"flex items-center justify-center h-8 w-8",children:e.jsx(c,{className:"h-4 w-4"})}),e.jsx("span",{className:"text-sm font-medium",children:"Início"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between h-10 px-3 rounded-md hover:bg-muted cursor-pointer",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"flex items-center justify-center h-8 w-8",children:e.jsx(k,{className:"h-4 w-4"})}),e.jsx("span",{className:"text-sm font-medium",children:"Configurações"})]}),e.jsx(b,{className:"h-4 w-4 rotate-90"})]}),e.jsx("div",{className:"ml-6 mt-1 space-y-1 border-l border-border pl-3",children:[{icon:d,label:"Perfil",active:!0},{icon:I,label:"Segurança"}].map(a=>e.jsxs("div",{className:i("flex items-center gap-2 h-8 px-2 rounded-md text-sm",a.active?"bg-primary/10 text-primary font-medium":"text-muted-foreground hover:bg-muted"),children:[e.jsx(a.icon,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:a.label})]},a.label))})]})]})}function J(){return e.jsxs("div",{className:"flex gap-6 items-start flex-wrap",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-center",children:"Uma Ação"}),e.jsxs("div",{className:"w-56 bg-background border rounded-lg p-3 space-y-3",children:[e.jsxs(t,{variant:"outline",className:"w-full gap-2 justify-start",children:[e.jsx(l,{className:"h-4 w-4"}),"Novo Processo"]}),e.jsx("div",{className:"border-t pt-2 space-y-1",children:[{icon:c,label:"Início",active:!0},{icon:d,label:"Usuários"}].map((a,r)=>e.jsxs("div",{className:i("flex items-center gap-3 px-3 py-2 rounded-md text-sm",a.active?"bg-primary/10 text-primary font-medium":"hover:bg-muted"),children:[e.jsx(a.icon,{className:"h-4 w-4"}),e.jsx("span",{children:a.label})]},r))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium text-center",children:"Múltiplas Ações"}),e.jsxs("div",{className:"w-56 bg-background border rounded-lg p-3 space-y-1",children:[e.jsxs(t,{variant:"outline",className:"w-full gap-2 justify-start",children:[e.jsx(l,{className:"h-4 w-4"}),"Criar",e.jsx(U,{className:"ml-auto h-4 w-4 rotate-180"})]}),e.jsx("div",{className:"border rounded-md bg-popover p-1 shadow-md",children:[{icon:G,label:"Novo Documento"},{icon:D,label:"Nova Pasta"},{icon:d,label:"Novo Grupo"}].map((a,r)=>e.jsxs("div",{className:"flex items-center gap-2 px-2 py-1.5 rounded-sm hover:bg-muted cursor-pointer",children:[e.jsx(a.icon,{className:"h-4 w-4"}),e.jsx("span",{className:"text-sm",children:a.label})]},r))})]})]})]})}function X(){return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3 p-3 border rounded-md bg-muted/30",children:[e.jsx(O,{className:"h-5 w-5 text-muted-foreground"}),e.jsxs("div",{className:"text-sm space-y-1",children:[e.jsx("p",{className:"font-medium",children:"Redimensionamento"}),e.jsxs("p",{className:"text-muted-foreground",children:["Quando ",e.jsx("code",{className:"bg-muted px-1 rounded text-xs",children:"resizable=true"}),", um rail aparece na borda direita. Arraste para redimensionar entre ",e.jsx("code",{className:"bg-muted px-1 rounded text-xs",children:"minWidth"})," e"," ",e.jsx("code",{className:"bg-muted px-1 rounded text-xs",children:"maxWidth"}),"."]}),e.jsxs("p",{className:"text-muted-foreground",children:["A largura é persistida automaticamente em ",e.jsx("code",{className:"bg-muted px-1 rounded text-xs",children:"localStorage"}),"."]})]})]}),e.jsx("pre",{className:"bg-muted p-3 rounded text-xs font-mono",children:`<AppSidebar
18
+ config={sidebarConfig}
19
+ resizable={true}
20
+ minWidth={224} // padrão: 224px (14rem)
21
+ maxWidth={384} // padrão: 384px (24rem)
22
+ />`})]})}function Y(){return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex gap-4 items-start flex-wrap",children:[e.jsxs("div",{className:"p-3 border rounded-md space-y-2 w-64",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(L,{className:"h-4 w-4 text-primary"}),e.jsx("span",{className:"text-sm font-medium",children:"Pinada"})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["Sidebar permanece aberta. Estado salvo em ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"localStorage"}),"."]})]}),e.jsxs("div",{className:"p-3 border rounded-md space-y-2 w-64",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(z,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium",children:"Despinada"})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Sidebar inicia colapsada. Expande ao hover (desktop) ou toggle (mobile)."})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:["O botão circular na borda do separador controla pin/unpin. Em telas ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"<768px"})," (mobile), o botão é ocultado."]})]})}function _(){return e.jsx("div",{className:"space-y-3 w-full",children:[{badge:"Desktop ≥1024px",variant:"default",text:"Sidebar visível, pode ser pinada ou colapsar"},{badge:"Tablet 768-1023px",variant:"secondary",text:"Sidebar inicia colapsada, expande ao hover/click"},{badge:"Mobile <768px",variant:"outline",text:"Sidebar como drawer/sheet lateral (oculta por padrão)"}].map(a=>e.jsxs("div",{className:"flex gap-4 items-center",children:[e.jsx(n,{variant:a.variant,className:"shrink-0",children:a.badge}),e.jsx("span",{className:"text-sm text-muted-foreground",children:a.text})]},a.badge))})}function te(){return e.jsxs(e.Fragment,{children:[e.jsx(q,{title:"AppSidebar",description:"Sidebar de navegação principal da aplicação com suporte a pin/unpin, permissões assíncronas, ações de módulo (SidebarActionTrigger), redimensionamento e navegação hierárquica.",component:e.jsx(Q,{}),usage:`import { AppLayout } from 'forlogic-core';
23
+ import type { SidebarConfig } from 'forlogic-core';
24
+ import { Home, Users, Settings, Shield, Plus, FileText, Folder } from 'lucide-react';
25
+
26
+ const sidebarConfig: SidebarConfig = {
27
+ appName: 'Minha Aplicação',
28
+
29
+ // Ações do módulo (opcional)
30
+ moduleActions: {
31
+ triggerLabel: 'Criar',
32
+ triggerIcon: Plus,
33
+ actions: [
34
+ { id: 'new-doc', label: 'Novo Documento', icon: FileText, onClick: () => {} },
35
+ { id: 'new-folder', label: 'Nova Pasta', icon: Folder, onClick: () => {} },
36
+ ],
37
+ },
38
+
39
+ // Navegação (com suporte a hierarquia)
40
+ navigation: [
41
+ { label: 'Início', path: '/', icon: Home },
42
+ { label: 'Usuários', path: '/users', icon: Users },
43
+ {
44
+ label: 'Configurações',
45
+ path: '/settings',
46
+ icon: Settings,
47
+ children: [
48
+ { label: 'Perfil', path: '/settings/profile', icon: Users },
49
+ { label: 'Segurança', path: '/settings/security', icon: Shield },
50
+ ],
51
+ },
52
+ ],
53
+ };
54
+
55
+ // Uso via AppLayout (recomendado)
56
+ <AppLayout sidebarConfig={sidebarConfig}>
57
+ <Routes>...</Routes>
58
+ </AppLayout>
59
+
60
+ // Uso direto (casos avançados)
61
+ <AppSidebar
62
+ config={sidebarConfig}
63
+ resizable={true}
64
+ minWidth={224}
65
+ maxWidth={384}
66
+ />`,examples:[{title:"Anatomia do Sidebar",description:"Estrutura hierárquica completa: Header, Actions, Separator com Pin, Navigation, e Resize rail.",preview:e.jsx(K,{}),code:`// Estrutura do AppSidebar
67
+ <Sidebar collapsible="icon">
68
+ ├── SidebarHeader (Logo + ModulesButton)
69
+ ├── SidebarActionTrigger (ações de módulo)
70
+ ├── Separator + Pin/Unpin button (borda)
71
+ └── SidebarContent
72
+ └── NavigationItems
73
+ ├── Item simples (Link)
74
+ ├── Item com permissionCheck
75
+ └── Item com children (Collapsible)
76
+ └── SidebarMenuSub`},{title:"Estados Visuais",description:"Itens de navegação possuem 4 estados: Ativo (bg-primary/10), Hover (bg-muted), Desabilitado (opacity-50 + Lock icon), e Carregando (spinner durante permissionCheck).",preview:e.jsx(Z,{}),code:`// Matching de rota ativa (hierárquico)
77
+ const isActive = (path: string) =>
78
+ location.pathname === path ||
79
+ location.pathname.startsWith(path + '/');
80
+
81
+ // Item com verificação de permissão assíncrona
82
+ {
83
+ label: 'Gestão',
84
+ path: '/management',
85
+ icon: Settings,
86
+ permissionCheck: async () => {
87
+ return await checkUserPermission('management');
88
+ }
89
+ }
90
+ // → Exibe Loader2 (spin) enquanto verifica
91
+ // → Exibe Lock + "Acesso restrito" se false`},{title:"Navegação Hierárquica",description:"Suporte a itens com children (máximo 2 níveis). No modo expandido, usa Collapsible com ChevronRight. No modo colapsado, exibe tooltip.",preview:e.jsx($,{}),code:`const navigation: SidebarNavigationItem[] = [
92
+ { label: 'Início', path: '/', icon: Home },
93
+ {
94
+ label: 'Configurações',
95
+ path: '/settings',
96
+ icon: Settings,
97
+ children: [
98
+ { label: 'Perfil', path: '/settings/profile', icon: Users },
99
+ { label: 'Segurança', path: '/settings/security', icon: Shield },
100
+ ],
101
+ },
102
+ ];`},{title:"Ações de Módulo (SidebarActionTrigger)",description:"Uma ação executa diretamente; múltiplas ações exibem dropdown. Quando a sidebar está colapsada, mostra apenas ícone com tooltip.",preview:e.jsx(J,{}),code:`// SidebarActionsConfig
103
+ moduleActions: {
104
+ triggerLabel: 'Criar', // Label do botão (múltiplas ações)
105
+ triggerIcon: Plus, // Ícone do gatilho
106
+ actions: [
107
+ {
108
+ id: 'new-document',
109
+ label: 'Novo Documento',
110
+ icon: FileText,
111
+ onClick: () => openDocumentDialog(),
112
+ disabled: false, // Opcional
113
+ permissionCheck: async () => true, // Opcional
114
+ },
115
+ ],
116
+ }`},{title:"Pin / Unpin",description:"O botão circular na borda do separador controla se a sidebar permanece aberta (pinada) ou colapsa automaticamente.",preview:e.jsx(Y,{}),code:`// Internamente o AppSidebar usa:
117
+ import { getSidebarPinnedPreference, setSidebarPinnedPreference }
118
+ from './sidebar-utils';
119
+
120
+ // Persistência em localStorage ('forlogic-sidebar-pinned')
121
+ // Botão circular usa bg-primary com ChevronLeft/Right
122
+ // Oculto em mobile (hidden md:block)`},{title:"Redimensionamento",description:"Quando resizable=true, um rail aparece na borda direita para arrastar. A largura é persistida em localStorage.",preview:e.jsx(X,{}),code:`// useSidebarResize hook
123
+ import { useSidebarResize } from 'forlogic-core';
124
+
125
+ const resize = useSidebarResize({
126
+ minWidth: 224, // Mínimo (14rem)
127
+ maxWidth: 384, // Máximo (24rem)
128
+ defaultWidth: 240, // Padrão (15rem)
129
+ storageKey: 'app-sidebar-width',
130
+ isOpen: true,
131
+ onResize: (width) => console.log(width),
132
+ });
133
+
134
+ // resize.width, resize.isDragging,
135
+ // resize.dragRef, resize.handleMouseDown`},{title:"Comportamento Responsivo",description:"A sidebar adapta-se automaticamente ao tamanho da tela.",preview:e.jsx(_,{}),code:`// O AppSidebar usa collapsible="icon"
136
+ // Em desktop: colapsa para 16px (ícones apenas)
137
+ // Em mobile: comportamento de drawer
138
+
139
+ // useSidebar() hook disponível para controle externo
140
+ import { useSidebar } from 'forlogic-core';
141
+
142
+ const { open, setOpen, state, toggleSidebar } = useSidebar();
143
+ // state: "expanded" | "collapsed"`}],props:[{name:"config",type:"SidebarConfig",description:"Configuração principal: appName, navigation[], moduleActions"},{name:"config.appName",type:"string",description:'Nome exibido no botão de módulos (fallback: "Módulos")'},{name:"config.navigation",type:"SidebarNavigationItem[]",description:"Itens de navegação com label, path, icon e children opcionais"},{name:"config.moduleActions",type:"SidebarActionsConfig",description:"Ações do módulo: triggerLabel, triggerIcon, actions[]"},{name:"customContent",type:"ReactNode",description:"Conteúdo customizado que substitui a navegação padrão"},{name:"resizable",type:"boolean",default:"false",description:"Habilita redimensionamento com drag na borda direita"},{name:"minWidth",type:"number",default:"224",description:"Largura mínima em pixels (resizable=true)"},{name:"maxWidth",type:"number",default:"384",description:"Largura máxima em pixels (resizable=true)"}],accessibility:["Navegação acessível via teclado (Tab, Arrow keys, Enter)","Submenus expansíveis com Enter ou Space (via Collapsible)","Estado ativo comunicado via isActive no SidebarMenuButton","Itens desabilitados com cursor-not-allowed e opacity reduzida","Tooltips em modo colapsado para identificação de todos os itens","Botão pin/unpin oculto em mobile (hidden md:block) para evitar conflito com drawer","Contraste adequado entre estados ativo/inativo usando tokens semânticos"],notes:["✅ Use ícones consistentes do Lucide React para todos os itens","✅ Máximo 2 níveis de aninhamento (item → children)","✅ Labels curtas: 1-3 palavras, máximo 20 caracteres","✅ Agrupe itens relacionados logicamente","✅ Use permissionCheck para controle de acesso assíncrono","✅ Use moduleActions para ações de criação/adição do módulo","✅ Prefira AppLayout ao invés de usar AppSidebar diretamente","❌ Não use mais de 10 itens no nível raiz","❌ Não crie 3+ níveis de submenu (hierarquia profunda)","❌ Não deixe itens sem ícones","❌ Não misture ícones de bibliotecas diferentes","❌ Não use labels com mais de 20 caracteres"]}),e.jsxs("div",{className:"mt-12 pt-8 border-t space-y-6",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Tipos TypeScript"}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:"SidebarConfig"}),e.jsx("pre",{className:"bg-muted p-4 rounded-lg overflow-x-auto text-sm",children:`interface SidebarConfig {
144
+ appName?: string;
145
+ navigation?: SidebarNavigationItem[];
146
+ moduleActions?: SidebarActionsConfig;
147
+ }`})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:"SidebarNavigationItem"}),e.jsx("pre",{className:"bg-muted p-4 rounded-lg overflow-x-auto text-sm",children:`interface SidebarNavigationItem {
148
+ label: string; // Texto do item
149
+ path: string; // Rota de navegação
150
+ icon: LucideIcon; // Ícone obrigatório
151
+ complementaryText?: string; // Texto complementar
152
+ permissionCheck?: () => Promise<boolean>; // Verificação assíncrona
153
+ children?: SidebarNavigationItem[]; // Subitens (máx. 2 níveis)
154
+ }`})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:"SidebarActionsConfig"}),e.jsx("pre",{className:"bg-muted p-4 rounded-lg overflow-x-auto text-sm",children:`interface SidebarActionsConfig {
155
+ triggerLabel?: string; // Rótulo do gatilho (default: 'Criar')
156
+ triggerIcon?: LucideIcon; // Ícone do gatilho (default: Plus)
157
+ actions: SidebarModuleAction[];
158
+ }
159
+
160
+ interface SidebarModuleAction {
161
+ id: string; // ID único
162
+ label: string; // Texto exibido
163
+ icon?: LucideIcon; // Ícone opcional
164
+ onClick: () => void; // Callback
165
+ disabled?: boolean; // Desabilitar ação
166
+ permissionCheck?: () => Promise<boolean>; // Verificação de permissão
167
+ }`})]})]}),e.jsxs("div",{className:"mt-12 pt-8 border-t space-y-6",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Componente Base: Sidebar"}),e.jsxs("p",{className:"text-muted-foreground",children:["O AppSidebar utiliza internamente o componente base ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"Sidebar"})," do Shadcn/Radix. Para sidebars customizadas fora do AppLayout, use o componente base diretamente."]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:"Uso do Base"}),e.jsx("pre",{className:"bg-muted p-4 rounded-lg overflow-x-auto text-sm",children:`import {
168
+ Sidebar, SidebarProvider, SidebarHeader, SidebarContent,
169
+ SidebarFooter, SidebarGroup, SidebarGroupLabel,
170
+ SidebarGroupContent, SidebarMenu, SidebarMenuItem,
171
+ SidebarMenuButton, SidebarTrigger,
172
+ } from 'forlogic-core';
173
+
174
+ <SidebarProvider>
175
+ <Sidebar collapsible="icon">
176
+ <SidebarHeader>Logo</SidebarHeader>
177
+ <SidebarContent>
178
+ <SidebarGroup>
179
+ <SidebarGroupLabel>Menu</SidebarGroupLabel>
180
+ <SidebarGroupContent>
181
+ <SidebarMenu>
182
+ <SidebarMenuItem>
183
+ <SidebarMenuButton isActive>
184
+ <Home className="mr-2" /> Home
185
+ </SidebarMenuButton>
186
+ </SidebarMenuItem>
187
+ </SidebarMenu>
188
+ </SidebarGroupContent>
189
+ </SidebarGroup>
190
+ </SidebarContent>
191
+ </Sidebar>
192
+ <main>
193
+ <SidebarTrigger />
194
+ {/* Content */}
195
+ </main>
196
+ </SidebarProvider>`})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold mb-3",children:"Props do Sidebar Base"}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm border",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"bg-muted",children:[e.jsx("th",{className:"text-left p-2 border-b",children:"Prop"}),e.jsx("th",{className:"text-left p-2 border-b",children:"Tipo"}),e.jsx("th",{className:"text-left p-2 border-b",children:"Default"}),e.jsx("th",{className:"text-left p-2 border-b",children:"Descrição"})]})}),e.jsxs("tbody",{children:[e.jsxs("tr",{children:[e.jsx("td",{className:"p-2 border-b font-mono text-xs",children:"side"}),e.jsx("td",{className:"p-2 border-b",children:'"left" | "right"'}),e.jsx("td",{className:"p-2 border-b",children:'"left"'}),e.jsx("td",{className:"p-2 border-b",children:"Lado da tela"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"p-2 border-b font-mono text-xs",children:"variant"}),e.jsx("td",{className:"p-2 border-b",children:'"sidebar" | "floating" | "inset"'}),e.jsx("td",{className:"p-2 border-b",children:'"sidebar"'}),e.jsx("td",{className:"p-2 border-b",children:"Estilo visual"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"p-2 border-b font-mono text-xs",children:"collapsible"}),e.jsx("td",{className:"p-2 border-b",children:'"offcanvas" | "icon" | "none"'}),e.jsx("td",{className:"p-2 border-b",children:'"offcanvas"'}),e.jsx("td",{className:"p-2 border-b",children:"Comportamento de collapse"})]})]})]})})]}),e.jsx("div",{className:"p-4 bg-muted/50 rounded-lg border",children:e.jsxs("p",{className:"text-sm",children:[e.jsx("strong",{children:"💡 Recomendação:"})," Para a maioria dos casos, prefira"," ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"AppSidebar"})," via"," ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"AppLayout"}),", que já inclui permissões, módulos, resize e pin/unpin. Use o Sidebar base apenas para customizações avançadas."]})})]})]})}export{te as AppSidebarDoc};