forlogic-core 2.0.0 → 2.0.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 (181) hide show
  1. package/README.md +0 -46
  2. package/dist/assets/AccordionDoc-CGNlubG3.js +31 -0
  3. package/dist/assets/ActionButtonDoc-CYtkXR0k.js +47 -0
  4. package/dist/assets/ActionPlanDoc-BSuPRftQ.js +65 -0
  5. package/dist/assets/AlertDoc-Cpvxneqg.js +37 -0
  6. package/dist/assets/AliasUrlDoc-DIpUWf4Y.js +189 -0
  7. package/dist/assets/AppHeaderDoc-DNQErj_t.js +74 -0
  8. package/dist/assets/AppSidebarDoc-DkeQarDu.js +221 -0
  9. package/dist/assets/ApprovalFlowDoc-8YgXbhKJ.js +31 -0
  10. package/dist/assets/AuditLogDoc-BBvNcHIo.js +67 -0
  11. package/dist/assets/AuditTrailDoc-DgFHO-uo.js +17 -0
  12. package/dist/assets/AuthDoc-WIA_Aetl.js +200 -0
  13. package/dist/assets/AvatarDoc-B6go1C1T.js +11 -0
  14. package/dist/assets/BadgeDoc-BONhfqB_.js +36 -0
  15. package/dist/assets/BaseFormDoc-CuyUArcj.js +169 -0
  16. package/dist/assets/BodyContentDoc-CterHC1E.js +83 -0
  17. package/dist/assets/BreadcrumbDoc-Dwn9nLeO.js +75 -0
  18. package/dist/assets/ButtonDoc-BOjRseZT.js +41 -0
  19. package/dist/assets/ButtonGroupDoc-8IS6PPh4.js +7 -0
  20. package/dist/assets/CalendarDoc-CMwIEqgT.js +81 -0
  21. package/dist/assets/CardDoc-BZz1CVg2.js +49 -0
  22. package/dist/assets/ChartDoc-B5vZVtqD.js +76 -0
  23. package/dist/assets/CheckboxDoc-lAbYO9I5.js +55 -0
  24. package/dist/assets/ColorPickerDoc-Dpsprp4N.js +10 -0
  25. package/dist/assets/ColorsFoundationDoc-CCHeSL3p.js +13 -0
  26. package/dist/assets/ComboTreeDoc-D4dTkIt-.js +46 -0
  27. package/dist/assets/ComboboxDoc-CqqZPvZq.js +134 -0
  28. package/dist/assets/ComponentDocTemplate-CQbBhfvZ.js +1 -0
  29. package/dist/assets/ContextMenuDoc-D3jC-MVA.js +182 -0
  30. package/dist/assets/ContextsDoc-XFH0-JdS.js +211 -0
  31. package/dist/assets/CreateCrudPageDoc-CpuiWI-g.js +106 -0
  32. package/dist/assets/CrudActionBarDoc-wuBGXD9Y.js +112 -0
  33. package/dist/assets/CrudGridDoc-BYWqSXBH.js +85 -0
  34. package/dist/assets/CrudOverviewDoc-B_bk2a2t.js +14 -0
  35. package/dist/assets/CrudPrimitivesDoc-CxaTB94A.js +164 -0
  36. package/dist/assets/CrudTableDoc-Dga1VgCu.js +113 -0
  37. package/dist/assets/CustomFormFieldsDoc-C1hwwSl3.js +33 -0
  38. package/dist/assets/DashboardFormDoc-BUDCmrMl.js +49 -0
  39. package/dist/assets/DashboardGeneralViewDoc-Cyg1SIiG.js +71 -0
  40. package/dist/assets/DashboardGridDoc-BavePiRF.js +49 -0
  41. package/dist/assets/DashboardListDoc-CLyMA6UK.js +37 -0
  42. package/dist/assets/DashboardOverviewDoc-DRVvNIF1.js +35 -0
  43. package/dist/assets/DashboardPanelRendererDoc--mfwb8Nc.js +60 -0
  44. package/dist/assets/DashboardPanelsBasicDoc-BQ2V_52D.js +62 -0
  45. package/dist/assets/DashboardPanelsCartesianDoc-sy-hcVQY.js +75 -0
  46. package/dist/assets/DashboardPanelsSpecialDoc-DsIUCRRP.js +83 -0
  47. package/dist/assets/DashboardViewDoc-CtlCNlEF.js +45 -0
  48. package/dist/assets/DataListDoc-DUy88lCQ.js +13 -0
  49. package/dist/assets/DesignSystemHome-DHl9YtbH.js +1 -0
  50. package/dist/assets/DialogDoc-CMQqnTV-.js +981 -0
  51. package/dist/assets/DropdownMenuDoc-S7X9csGt.js +175 -0
  52. package/dist/assets/ElectronicSignatureDialogDoc-BfithaL_.js +57 -0
  53. package/dist/assets/EmptyStateDoc-CHGCiGIk.js +35 -0
  54. package/dist/assets/EnvironmentsDoc-DZHJZ2nm.js +96 -0
  55. package/dist/assets/ErrorBoundaryDoc-DoaAg68p.js +111 -0
  56. package/dist/assets/ExampleActionPlanPage-C0fIMZCD.js +1 -0
  57. package/dist/assets/ExampleAppDoc-DzIU81Fn.js +1 -0
  58. package/dist/assets/ExampleCard-DuLrb3t-.js +1 -0
  59. package/dist/assets/ExampleCrudReportsPage-M0pz6tdM.js +1 -0
  60. package/dist/assets/ExampleDashboardPage-CRG5r3Vw.js +1 -0
  61. package/dist/assets/ExampleIdeasPage-I84ZMLY4.js +1 -0
  62. package/dist/assets/ExampleImportWizardPage-h4YqrrSe.js +1 -0
  63. package/dist/assets/ExampleSettingsPage-CwdWqoaP.js +1 -0
  64. package/dist/assets/FileUploadDoc-9-UujFNX.js +34 -0
  65. package/dist/assets/FilterBar-DDTqqUfZ.js +1 -0
  66. package/dist/assets/FormDoc-CVES6n3d.js +81 -0
  67. package/dist/assets/FoundationOverview-DT0u11Gz.js +1 -0
  68. package/dist/assets/GridDoc-CbHFSILF.js +28 -0
  69. package/dist/assets/HooksDoc-Ctxdk6Wq.js +665 -0
  70. package/dist/assets/HoverCardDoc-8Wkaafdj.js +31 -0
  71. package/dist/assets/I18nDoc-D3Q2m7ik.js +167 -0
  72. package/dist/assets/IconPickerDoc-DZ26Gdpg.js +10 -0
  73. package/dist/assets/IconsFoundationDoc-xOxtC7CW.js +33 -0
  74. package/dist/assets/InputDoc-BhztAiuJ.js +211 -0
  75. package/dist/assets/LabelDoc-A4hmTRRV.js +42 -0
  76. package/dist/assets/LeadershipDoc-CqOSfWsP.js +452 -0
  77. package/dist/assets/MediaDoc-C78gvC8p.js +459 -0
  78. package/dist/assets/MenubarDoc-DCnmd2tO.js +165 -0
  79. package/dist/assets/ModuleAccessDoc-CmD5nHDp.js +153 -0
  80. package/dist/assets/ModulesDialogDoc-DVit1CA-.js +46 -0
  81. package/dist/assets/MultiselectPermissionsDoc-tlJMs04L.js +34 -0
  82. package/dist/assets/NavigationMenuDoc-q1fbc89j.js +116 -0
  83. package/dist/assets/OnboardingDialogDoc-3A3eBYrq.js +55 -0
  84. package/dist/assets/PaginationDoc-B8-bMz5J.js +27 -0
  85. package/dist/assets/PaginationDoc-BkGdxHL3.js +98 -0
  86. package/dist/assets/PlacesDoc-CKPO6ATs.js +226 -0
  87. package/dist/assets/PopoverDoc-CJPU4Ags.js +64 -0
  88. package/dist/assets/ProgressDoc-CpjbTL4o.js +29 -0
  89. package/dist/assets/QualiexUserFieldDoc-DDwumlRw.js +149 -0
  90. package/dist/assets/RadioGroupDoc-D6tSZz8G.js +57 -0
  91. package/dist/assets/RadiusDoc-B4xSnajw.js +7 -0
  92. package/dist/assets/ReportRequestListDoc-C0LIaU8P.js +15 -0
  93. package/dist/assets/RequiredFieldsCounterDoc-COesoSdx.js +58 -0
  94. package/dist/assets/ResizableDoc-CW0-XQuB.js +104 -0
  95. package/dist/assets/RichTextEditorDoc-C8c_XA9P.js +24 -0
  96. package/dist/assets/ScrollAreaDoc-BxtoAPaZ.js +28 -0
  97. package/dist/assets/SecurityDoc-wOVqpg2F.js +204 -0
  98. package/dist/assets/SelectDoc-C75gtY9D.js +80 -0
  99. package/dist/assets/SeparatorDoc-BjQBPB1P.js +4 -0
  100. package/dist/assets/ServicesDoc-CXTctwBl.js +308 -0
  101. package/dist/assets/ShadowsDoc-C6Lw8_x2.js +9 -0
  102. package/dist/assets/SignDoc-Bh5ZUg5x.js +66 -0
  103. package/dist/assets/SkeletonDoc-rTLGK5VE.js +54 -0
  104. package/dist/assets/SliderDoc-JMAMDub7.js +41 -0
  105. package/dist/assets/SpacingDoc-RljOrpwA.js +12 -0
  106. package/dist/assets/SplitButtonDoc-CvShUW3w.js +53 -0
  107. package/dist/assets/StepSelectorDoc-C-nAap9H.js +41 -0
  108. package/dist/assets/SwitchDoc-DLnqmkPr.js +56 -0
  109. package/dist/assets/TableDoc-B8EpWLVg.js +128 -0
  110. package/dist/assets/TabsDoc-DIBtl_uC.js +42 -0
  111. package/dist/assets/TeamSelectorDoc-B7OnCbL7.js +10 -0
  112. package/dist/assets/TermsOfUseDoc-Bb-pw08s.js +16 -0
  113. package/dist/assets/TextareaDoc-DGnqMqEC.js +46 -0
  114. package/dist/assets/ToastDoc-DjYyc7ae.js +157 -0
  115. package/dist/assets/ToggleDoc-C9ZOVjkY.js +51 -0
  116. package/dist/assets/TooltipDoc-BEx4l9-i.js +58 -0
  117. package/dist/assets/TruncatedCellDoc-BbV1bRSY.js +12 -0
  118. package/dist/assets/TypographyFoundationDoc-CUDYjRo9.js +7 -0
  119. package/dist/assets/UpdatesNotificationDoc-7nyjzLMJ.js +29 -0
  120. package/dist/assets/UsersGroupsSelectorDoc-C0KlTAL5.js +18 -0
  121. package/dist/assets/UtilitiesDoc-DGxaHVV1.js +145 -0
  122. package/dist/assets/ViewerDialogsDoc-CnTPTEz0.js +1 -0
  123. package/dist/assets/blocks-B6LrJeAM.js +1 -0
  124. package/dist/assets/building-DeVappnD.js +1 -0
  125. package/dist/assets/calendar-days-BQ0na5kM.js +1 -0
  126. package/dist/assets/check-check-C_-PJCJa.js +1 -0
  127. package/dist/assets/circle-plus-CpIcep-O.js +1 -0
  128. package/dist/assets/circle-x-jPpBPew0.js +1 -0
  129. package/dist/assets/clipboard-list-CXNPdciZ.js +1 -0
  130. package/dist/assets/cloud-upload-BEjzumjl.js +1 -0
  131. package/dist/assets/crown-CqNsQIsm.js +1 -0
  132. package/dist/assets/date-picker-BW3eGOe_.js +1 -0
  133. package/dist/assets/disabled-menu-item-C2YaMvSt.js +1 -0
  134. package/dist/assets/drawer-D5rflIcD.js +3 -0
  135. package/dist/assets/file-braces-DFb5X9so.js +1 -0
  136. package/dist/assets/file-pen-line-CyUGKkEN.js +1 -0
  137. package/dist/assets/git-branch-BcXv9mpp.js +1 -0
  138. package/dist/assets/globe-CpMIWAcv.js +1 -0
  139. package/dist/assets/hash-cQWdKjya.js +1 -0
  140. package/dist/assets/hourglass-BahQ3eDv.js +1 -0
  141. package/dist/assets/hover-card-R66N85sZ.js +1 -0
  142. package/dist/assets/iframe-dialog-V0mW5aBb.js +1 -0
  143. package/dist/assets/index-DkiftrvI.js +352 -0
  144. package/dist/assets/index-nmBjO9Th.css +1 -0
  145. package/dist/assets/life-buoy-ByXiPddz.js +1 -0
  146. package/dist/assets/loading-state-Cb5_t5uE.js +1 -0
  147. package/dist/assets/lucide-react-Cp3Yw3Zm.js +1 -0
  148. package/dist/assets/package-B3-pVvPM.js +1 -0
  149. package/dist/assets/pen-Bi_lmmKT.js +1 -0
  150. package/dist/assets/pin-DVsSl8QA.js +1 -0
  151. package/dist/assets/printer-BnJ8B6m-.js +1 -0
  152. package/dist/assets/radio-group-BHAaNGsm.js +1 -0
  153. package/dist/assets/server-CtzFTfKR.js +1 -0
  154. package/dist/assets/share-2-Dv8Do445.js +1 -0
  155. package/dist/assets/shield-check-CFXjOV_w.js +1 -0
  156. package/dist/assets/shield-x-DJTRfVux.js +1 -0
  157. package/dist/assets/slider-v9tXBSnB.js +1 -0
  158. package/dist/assets/smartphone-BSNR60L7.js +1 -0
  159. package/dist/assets/step-selector-ATTh_9Wa.js +1 -0
  160. package/dist/assets/text-align-start-qE-MbYYw.js +1 -0
  161. package/dist/assets/thumbs-up-D_XIW_uX.js +1 -0
  162. package/dist/assets/trash-DTWQwpwA.js +1 -0
  163. package/dist/assets/trending-up-jip5-leJ.js +1 -0
  164. package/dist/assets/useMockCrud-CN4vjyOZ.js +1 -0
  165. package/dist/assets/user-check-BlH3EDWK.js +1 -0
  166. package/dist/assets/user-plus-BqwXwD-c.js +1 -0
  167. package/dist/components/ui/button.d.ts +1 -1
  168. package/dist/components/ui/resizable.d.ts +1 -1
  169. package/dist/index.css +1 -1
  170. package/dist/index.css.map +1 -1
  171. package/dist/index.d.ts +1 -0
  172. package/dist/index.esm.js +1 -1
  173. package/dist/index.html +33 -0
  174. package/dist/index.js +1 -1
  175. package/dist/setup/favicon.d.ts +1 -0
  176. package/docs/PUBLISH.md +3 -3
  177. package/package.json +1 -5
  178. package/dist/README.md +0 -1079
  179. package/dist/bin/bootstrap.js +0 -40
  180. package/dist/bin/pull-docs.js +0 -186
  181. package/dist/docs/KNOWLEDGE.md +0 -109
@@ -0,0 +1,157 @@
1
+ import{j as e,aK as c,dU as j,aM as g,aN as l,T as d,i as m,k as i,l as n,p as u,q as o,x as a,Y as s,a as p,b as x,c as h,ar as N,d as v,a4 as F,aH as C,bp as b,aI as E,aJ as w,B,ew as T,aU as k}from"./index-DkiftrvI.js";import{C as A}from"./ComponentDocTemplate-CQbBhfvZ.js";import{C as S}from"./circle-x-jPpBPew0.js";import"./ExampleCard-DuLrb3t-.js";function I(){return e.jsx(A,{title:"Toast",description:"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.",component:e.jsx(a,{variant:"outline",onClick:()=>s("Evento foi criado",{description:"Domingo, 03 de dezembro de 2023 às 9:00"}),children:"Mostrar Toast"}),usage:`import { toast } from "sonner"
2
+
3
+ // Informativo (BG #FFFFFF)
4
+ toast("Mensagem simples")
5
+ toast.info("Informação importante")
6
+
7
+ // Sucesso (BG #E0FBE8)
8
+ toast.success("Operação concluída")
9
+
10
+ // Alerta (BG #FEF3C8)
11
+ toast.warning("Atenção necessária")
12
+
13
+ // Erro (BG #FEE1E1)
14
+ toast.error("Algo deu errado")`,examples:[{title:"Definição Conceitual",preview:e.jsxs(c,{children:[e.jsx(j,{className:"h-4 w-4"}),e.jsx(g,{children:"Toast é um feedback temporário e não bloqueante"}),e.jsx(l,{className:"mt-2",children:e.jsxs("ul",{className:"list-disc pl-4 space-y-1 text-sm",children:[e.jsx("li",{children:"Informa rapidamente o usuário sobre o resultado de uma ação"}),e.jsx("li",{children:"Não compete visualmente com outros Toasts"}),e.jsx("li",{children:"Quando múltiplos Toasts são exibidos, eles empilham sem sobreposição"}),e.jsx("li",{children:"Seguem uma ordem previsível (mais recente no topo)"})]})})]}),code:`// Toast é um feedback temporário e não bloqueante
15
+ // - Informa rapidamente o usuário
16
+ // - Não compete visualmente com outros Toasts
17
+ // - Empilhamento vertical sem sobreposição
18
+ // - Ordem previsível: mais recente no topo`},{title:"Regras de Empilhamento",preview:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs(d,{children:[e.jsx(m,{children:e.jsxs(i,{children:[e.jsx(n,{children:"Regra"}),e.jsx(n,{children:"Comportamento"})]})}),e.jsxs(u,{children:[e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Direção"}),e.jsx(o,{children:"Empilhamento vertical (de cima para baixo)"})]}),e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Ordem"}),e.jsx(o,{children:"Mais recente aparece no topo"})]}),e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Espaçamento"}),e.jsx(o,{children:"8px entre cada toast"})]}),e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Visibilidade"}),e.jsx(o,{children:"Até 5 toasts simultâneos"})]}),e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Sobreposição"}),e.jsx(o,{children:"Nunca sobrepõe conteúdo ou outros toasts"})]})]})]}),e.jsx(a,{variant:"outline",onClick:()=>{s.success("Toast 1 - Mais antigo"),setTimeout(()=>s.info("Toast 2"),300),setTimeout(()=>s.warning("Toast 3"),600),setTimeout(()=>s.error("Toast 4 - Mais recente"),900)},children:"Testar Empilhamento (4 toasts)"})]}),code:`// Empilhamento vertical com espaçamento consistente
19
+ toast.success("Toast 1 - Mais antigo");
20
+ setTimeout(() => toast.info("Toast 2"), 300);
21
+ setTimeout(() => toast.warning("Toast 3"), 600);
22
+ setTimeout(() => toast.error("Toast 4 - Mais recente"), 900);
23
+
24
+ // Configuração do Toaster:
25
+ // position="top-right"
26
+ // expand={true}
27
+ // visibleToasts={5}
28
+ // gap={8}`},{title:"Regras de Posição",preview:e.jsxs(d,{children:[e.jsx(m,{children:e.jsxs(i,{children:[e.jsx(n,{children:"Propriedade"}),e.jsx(n,{children:"Valor"})]})}),e.jsxs(u,{children:[e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Posição"}),e.jsx(o,{children:"Canto superior direito (top-right)"})]}),e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Offset"}),e.jsx(o,{children:"16px das bordas da tela"})]}),e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Z-index"}),e.jsx(o,{children:"1400 (acima de dialogs e modais)"})]}),e.jsxs(i,{children:[e.jsx(o,{className:"font-medium",children:"Área"}),e.jsx(o,{children:"Fixa, suporta múltiplos toasts sem quebrar layout"})]})]})]}),code:`// Configuração de posição no Toaster:
29
+ <Sonner
30
+ position="top-right"
31
+ offset={16}
32
+ />
33
+
34
+ // CSS z-index:
35
+ [data-sonner-toaster] {
36
+ z-index: 1400 !important;
37
+ }`},{title:"Regras de Interação",preview:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs(p,{className:"border-green-200 bg-green-50/50",children:[e.jsx(x,{className:"pb-2",children:e.jsxs(h,{className:"text-green-700 flex items-center gap-2 text-base",children:[e.jsx(N,{className:"h-4 w-4"}),"Correto"]})}),e.jsx(v,{children:e.jsxs("ul",{className:"text-sm space-y-1 text-green-800",children:[e.jsx("li",{children:"• Cada toast possui botão de fechar individual"}),e.jsx("li",{children:"• Fechamento reorganiza automaticamente o empilhamento"}),e.jsx("li",{children:"• Toasts não bloqueiam clique ou leitura de outros"}),e.jsx("li",{children:"• pointer-events habilitado para cada toast"})]})})]}),e.jsxs(p,{className:"border-red-200 bg-red-50/50",children:[e.jsx(x,{className:"pb-2",children:e.jsxs(h,{className:"text-red-700 flex items-center gap-2 text-base",children:[e.jsx(S,{className:"h-4 w-4"}),"Evitar"]})}),e.jsx(v,{children:e.jsxs("ul",{className:"text-sm space-y-1 text-red-800",children:[e.jsx("li",{children:"• Toasts sem opção de fechar"}),e.jsx("li",{children:"• Duração infinita sem botão de fechar"}),e.jsx("li",{children:"• Sobrepor outros toasts ou conteúdo"}),e.jsx("li",{children:"• Bloquear interação com a página"})]})})]})]}),code:`// Cada toast tem fechamento individual
38
+ toast("Mensagem", { closeButton: true })
39
+
40
+ // Fechamento reorganiza automaticamente
41
+ // Não é possível bloquear cliques em outros toasts
42
+
43
+ // CSS garante pointer-events:
44
+ [data-sonner-toast] {
45
+ pointer-events: auto !important;
46
+ }`},{title:"Tipos de Toast (Comportamento Consistente)",preview:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs(c,{variant:"info",children:[e.jsx(F,{className:"h-4 w-4 text-blue-600"}),e.jsxs(l,{className:"text-blue-800",children:["O comportamento de empilhamento é ",e.jsx("strong",{children:"consistente entre todos os tipos"}),". A variação visual (cor, ícone) não altera o layout ou empilhamento."]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{variant:"outline",onClick:()=>s.success("Operação realizada com sucesso!"),children:"Sucesso"}),e.jsx(a,{variant:"outline",onClick:()=>s.warning("Atenção requerida"),children:"Alerta"}),e.jsx(a,{variant:"outline",onClick:()=>s.error("Falha na operação"),children:"Erro"}),e.jsx(a,{variant:"outline",onClick:()=>s.info("Informação importante"),children:"Informativo"})]})]}),code:`// Todos os tipos seguem as mesmas regras de empilhamento
47
+
48
+ // Sucesso (BG #E0FBE8)
49
+ toast.success("Operação realizada com sucesso!")
50
+
51
+ // Alerta (BG #FEF3C8)
52
+ toast.warning("Atenção requerida")
53
+
54
+ // Erro (BG #FEE1E1)
55
+ toast.error("Falha na operação")
56
+
57
+ // Informativo (BG #FFFFFF)
58
+ toast.info("Informação importante")`},{title:"Informativo - Com Descrição",preview:e.jsx(a,{variant:"outline",onClick:()=>s("Evento foi criado",{description:"Domingo, 03 de dezembro de 2023 às 9:00"}),children:"Toast com Descrição"}),code:`// Informativo (BG #FFFFFF)
59
+ toast("Evento foi criado", {
60
+ description: "Domingo, 03 de dezembro de 2023 às 9:00",
61
+ })`},{title:"Informativo - Com Ação",preview:e.jsx(a,{variant:"outline",onClick:()=>s("Arquivo excluído",{action:{label:"Desfazer",onClick:()=>s.success("Arquivo restaurado")}}),children:"Toast com Ação"}),code:`// Informativo (BG #FFFFFF) com ação que exibe Sucesso (BG #E0FBE8)
62
+ toast("Arquivo excluído", {
63
+ action: {
64
+ label: "Desfazer",
65
+ onClick: () => toast.success("Arquivo restaurado"),
66
+ },
67
+ })`},{title:"Promise - Loading → Sucesso/Erro",preview:e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{variant:"outline",onClick:()=>{const r=new Promise(t=>setTimeout(t,2e3));s.promise(r,{loading:"Salvando...",success:"Salvo com sucesso!",error:"Erro ao salvar"})},children:"Promise (Sucesso)"}),e.jsx(a,{variant:"outline",onClick:()=>{const r=new Promise((t,f)=>setTimeout(f,2e3));s.promise(r,{loading:"Processando...",success:"Concluído!",error:"Falha no processamento"})},children:"Promise (Erro)"})]}),code:`// Promise com transição: Loading → Sucesso (BG #E0FBE8)
68
+ const promiseSuccess = new Promise((resolve) => setTimeout(resolve, 2000));
69
+ toast.promise(promiseSuccess, {
70
+ loading: "Salvando...",
71
+ success: "Salvo com sucesso!",
72
+ error: "Erro ao salvar",
73
+ });
74
+
75
+ // Promise com transição: Loading → Erro (BG #FEE1E1)
76
+ const promiseError = new Promise((_, reject) => setTimeout(reject, 2000));
77
+ toast.promise(promiseError, {
78
+ loading: "Processando...",
79
+ success: "Concluído!",
80
+ error: "Falha no processamento",
81
+ });`},{title:"Promise com Dados",preview:e.jsx(a,{variant:"outline",onClick:()=>{const r=new Promise(t=>setTimeout(()=>t({name:"Projeto Alpha"}),2e3));s.promise(r,{loading:"Carregando projeto...",success:t=>`Projeto "${t.name}" carregado!`,error:"Erro ao carregar projeto"})},children:"Promise com Dados"}),code:`// Sucesso (BG #E0FBE8) com dados dinâmicos
82
+ const promise = fetchProject(id);
83
+
84
+ toast.promise(promise, {
85
+ loading: "Carregando projeto...",
86
+ success: (data) => \`Projeto "\${data.name}" carregado!\`,
87
+ error: "Erro ao carregar projeto",
88
+ })`},{title:"Casos de Uso por Variação",preview:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"Informativo"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.info("Copiado para área de transferência"),children:"Copiar"}),e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s("Arquivo enviado para processamento"),children:"Enviar"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"Sucesso"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.success("Alterações salvas com sucesso"),children:"Salvar"}),e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.success("Usuário criado com sucesso"),children:"Criar"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"Alerta"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.warning("Você tem alterações não salvas"),children:"Alterações pendentes"}),e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.warning("Sessão expira em 5 minutos"),children:"Sessão"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-muted-foreground",children:"Erro"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.error("Falha ao conectar com o servidor"),children:"Conexão"}),e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.error("Permissão negada"),children:"Permissão"})]})]})]}),code:`// Informativo (BG #FFFFFF)
89
+ toast.info("Copiado para área de transferência")
90
+ toast("Arquivo enviado para processamento")
91
+
92
+ // Sucesso (BG #E0FBE8)
93
+ toast.success("Alterações salvas com sucesso")
94
+ toast.success("Usuário criado com sucesso")
95
+
96
+ // Alerta (BG #FEF3C8)
97
+ toast.warning("Você tem alterações não salvas")
98
+ toast.warning("Sessão expira em 5 minutos")
99
+
100
+ // Erro (BG #FEE1E1)
101
+ toast.error("Falha ao conectar com o servidor")
102
+ toast.error("Permissão negada")`},{title:"Toast Customizado com JSX",preview:e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(a,{variant:"outline",onClick:()=>s(e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs(C,{className:"h-10 w-10",children:[e.jsx(b,{src:"https://github.com/shadcn.png"}),e.jsx(E,{children:"JD"})]}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"font-medium",children:"João da Silva"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:"Comentou no seu projeto"})]})]}),{duration:5e3}),children:"Notificação de Usuário"}),e.jsx(a,{variant:"outline",onClick:()=>s.success(e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(w,{className:"h-4 w-4"}),e.jsx("span",{className:"font-medium",children:"Download concluído"})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:"relatorio-2024.pdf"}),e.jsx(B,{variant:"secondary",children:"2.4 MB"})]})]}),{duration:5e3}),children:"Download (Sucesso)"}),e.jsx(a,{variant:"outline",onClick:()=>s(e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"rounded-full bg-primary/10 p-2",children:e.jsx(T,{className:"h-4 w-4 text-primary"})}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"font-medium",children:"Novo convite recebido"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:'Maria te convidou para o projeto "Design System"'})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(a,{size:"sm",variant:"default",onClick:()=>s.success("Convite aceito!"),children:"Aceitar"}),e.jsx(a,{size:"sm",variant:"outline",onClick:()=>s.warning("Convite recusado"),children:"Recusar"})]})]}),{duration:1/0,closeButton:!0}),children:"Com Botões Personalizados"}),e.jsx(a,{variant:"outline",onClick:()=>s.info(e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(k,{className:"h-4 w-4"}),e.jsx("span",{children:"Link copiado!"})]}),e.jsx(a,{size:"sm",variant:"link",className:"h-auto p-0",onClick:()=>window.open("https://lovable.dev","_blank"),children:"Abrir"})]})),children:"Com Link Externo"})]}),code:`// Informativo (BG #FFFFFF) - Notificação de usuário
103
+ toast(
104
+ <div className="flex items-center gap-3">
105
+ <Avatar className="h-10 w-10">
106
+ <AvatarImage src="https://github.com/shadcn.png" />
107
+ <AvatarFallback>JD</AvatarFallback>
108
+ </Avatar>
109
+ <div className="flex flex-col">
110
+ <span className="font-medium">João da Silva</span>
111
+ <span className="text-sm text-muted-foreground">
112
+ Comentou no seu projeto
113
+ </span>
114
+ </div>
115
+ </div>,
116
+ { duration: 5000 }
117
+ )
118
+
119
+ // Sucesso (BG #E0FBE8) - Download com Badge
120
+ toast.success(
121
+ <div className="flex flex-col gap-2">
122
+ <div className="flex items-center gap-2">
123
+ <Download className="h-4 w-4" />
124
+ <span className="font-medium">Download concluído</span>
125
+ </div>
126
+ <div className="flex items-center justify-between">
127
+ <span className="text-sm text-muted-foreground">relatorio-2024.pdf</span>
128
+ <Badge variant="secondary">2.4 MB</Badge>
129
+ </div>
130
+ </div>
131
+ )
132
+
133
+ // Informativo (BG #FFFFFF) com botões que disparam outras variações
134
+ toast(
135
+ <div className="flex flex-col gap-3">
136
+ <div className="flex items-start gap-3">
137
+ <div className="rounded-full bg-primary/10 p-2">
138
+ <User className="h-4 w-4 text-primary" />
139
+ </div>
140
+ <div className="flex flex-col">
141
+ <span className="font-medium">Novo convite recebido</span>
142
+ <span className="text-sm text-muted-foreground">
143
+ Maria te convidou para o projeto "Design System"
144
+ </span>
145
+ </div>
146
+ </div>
147
+ <div className="flex gap-2">
148
+ <Button size="sm" onClick={() => toast.success("Aceito!")}>
149
+ Aceitar
150
+ </Button>
151
+ <Button size="sm" variant="outline" onClick={() => toast.warning("Recusado")}>
152
+ Recusar
153
+ </Button>
154
+ </div>
155
+ </div>,
156
+ { duration: Infinity, closeButton: true }
157
+ )`}],props:[{name:"message",type:"string | ReactNode",default:"-",description:"Texto principal ou conteúdo do toast."},{name:"description",type:"string | ReactNode",default:"-",description:"Descrição adicional exibida abaixo do título."},{name:"action",type:"{ label: string, onClick: () => void }",default:"-",description:"Botão de ação principal."},{name:"cancel",type:"{ label: string, onClick: () => void }",default:"-",description:"Botão de cancelamento secundário."},{name:"duration",type:"number",default:"4000",description:"Duração em ms antes de dispensar. Use Infinity para persistir."},{name:"closeButton",type:"boolean",default:"false",description:"Exibe botão X para fechar o toast."},{name:"icon",type:"ReactNode",default:"-",description:"Ícone personalizado para o toast."},{name:"id",type:"string | number",default:"-",description:"ID único para atualizar ou dispensar o toast."},{name:"onDismiss",type:"(toast) => void",default:"-",description:"Callback executado quando o toast é dispensado."},{name:"onAutoClose",type:"(toast) => void",default:"-",description:"Callback executado quando o toast fecha automaticamente."}],accessibility:["Utiliza ARIA live regions para anunciar toasts aos leitores de tela","Dispensável via tecla Escape","Auto-dispensa com duração configurável respeitando usabilidade","Suporte a swipe para dispensar em dispositivos touch","Respeita prefers-reduced-motion do sistema operacional","Foco gerenciado corretamente quando toast contém elementos interativos"],notes:["Informativo (#FFFFFF): toast() e toast.info() - Para informações contextuais e notificações neutras","Sucesso (#E0FBE8): toast.success() - Para feedback de operações bem-sucedidas","Alerta (#FEF3C8): toast.warning() - Para alertas que requerem atenção do usuário","Erro (#FEE1E1): toast.error() - Para erros e falhas, considere incluir ação de retry","Use toast.promise() para operações assíncronas com feedback de loading","Mantenha mensagens curtas e objetivas (máximo 2 linhas)",'Forneça ação de "Desfazer" para operações destrutivas quando possível',"Evite usar duration: Infinity sem closeButton ou action para dispensar"]})}export{I as ToastDoc};
@@ -0,0 +1,51 @@
1
+ import{j as e,b1 as r,b2 as a,b3 as o,b4 as l,b5 as i,b6 as t}from"./index-DkiftrvI.js";import{C as s}from"./ComponentDocTemplate-CQbBhfvZ.js";import{T as g,a as n,b as d}from"./text-align-start-qE-MbYYw.js";import"./ExampleCard-DuLrb3t-.js";function T(){return e.jsx(s,{title:"Toggle",description:"Botões de dois estados que podem estar ligados ou desligados, individualmente ou em grupo.",component:e.jsxs(o,{type:"multiple",children:[e.jsx(l,{value:"bold","aria-label":"Toggle bold",children:e.jsx(a,{className:"h-4 w-4"})}),e.jsx(l,{value:"italic","aria-label":"Toggle italic",children:e.jsx(i,{className:"h-4 w-4"})}),e.jsx(l,{value:"underline","aria-label":"Toggle underline",children:e.jsx(t,{className:"h-4 w-4"})})]}),usage:`import { Toggle, ToggleGroup, ToggleGroupItem } from "forlogic-core"
2
+ import { Bold, Italic } from "lucide-react"
3
+
4
+ // Toggle individual
5
+ <Toggle aria-label="Alternar negrito">
6
+ <Bold className="h-4 w-4" />
7
+ </Toggle>
8
+
9
+ // Toggle em grupo (seleção única)
10
+ <ToggleGroup type="single" defaultValue="center">
11
+ <ToggleGroupItem value="left" aria-label="Alinhar à esquerda">
12
+ <AlignLeft className="h-4 w-4" />
13
+ </ToggleGroupItem>
14
+ <ToggleGroupItem value="center" aria-label="Centralizar">
15
+ <AlignCenter className="h-4 w-4" />
16
+ </ToggleGroupItem>
17
+ </ToggleGroup>`,examples:[{title:"Toggle Simples",preview:e.jsx(r,{"aria-label":"Alternar negrito",children:e.jsx(a,{className:"h-4 w-4"})}),code:`import { Toggle } from "forlogic-core"
18
+ import { Bold } from "lucide-react"
19
+
20
+ <Toggle aria-label="Alternar negrito">
21
+ <Bold className="h-4 w-4" />
22
+ </Toggle>`},{title:"Toggle com Texto",preview:e.jsxs(r,{"aria-label":"Alternar negrito",children:[e.jsx(a,{className:"h-4 w-4 mr-2"}),"Negrito"]}),code:`<Toggle aria-label="Alternar negrito">
23
+ <Bold className="h-4 w-4 mr-2" />
24
+ Negrito
25
+ </Toggle>`},{title:"Grupo - Seleção Múltipla",preview:e.jsxs(o,{type:"multiple",children:[e.jsx(l,{value:"bold","aria-label":"Alternar negrito",children:e.jsx(a,{className:"h-4 w-4"})}),e.jsx(l,{value:"italic","aria-label":"Alternar itálico",children:e.jsx(i,{className:"h-4 w-4"})}),e.jsx(l,{value:"underline","aria-label":"Alternar sublinhado",children:e.jsx(t,{className:"h-4 w-4"})})]}),code:`import { ToggleGroup, ToggleGroupItem } from "forlogic-core"
26
+ import { Bold, Italic, Underline } from "lucide-react"
27
+
28
+ <ToggleGroup type="multiple">
29
+ <ToggleGroupItem value="bold" aria-label="Alternar negrito">
30
+ <Bold className="h-4 w-4" />
31
+ </ToggleGroupItem>
32
+ <ToggleGroupItem value="italic" aria-label="Alternar itálico">
33
+ <Italic className="h-4 w-4" />
34
+ </ToggleGroupItem>
35
+ <ToggleGroupItem value="underline" aria-label="Alternar sublinhado">
36
+ <Underline className="h-4 w-4" />
37
+ </ToggleGroupItem>
38
+ </ToggleGroup>`},{title:"Grupo - Seleção Única",preview:e.jsxs(o,{type:"single",defaultValue:"center",children:[e.jsx(l,{value:"left","aria-label":"Alinhar à esquerda",children:e.jsx(g,{className:"h-4 w-4"})}),e.jsx(l,{value:"center","aria-label":"Centralizar",children:e.jsx(n,{className:"h-4 w-4"})}),e.jsx(l,{value:"right","aria-label":"Alinhar à direita",children:e.jsx(d,{className:"h-4 w-4"})})]}),code:`import { ToggleGroup, ToggleGroupItem } from "forlogic-core"
39
+ import { AlignLeft, AlignCenter, AlignRight } from "lucide-react"
40
+
41
+ <ToggleGroup type="single" defaultValue="center">
42
+ <ToggleGroupItem value="left" aria-label="Alinhar à esquerda">
43
+ <AlignLeft className="h-4 w-4" />
44
+ </ToggleGroupItem>
45
+ <ToggleGroupItem value="center" aria-label="Centralizar">
46
+ <AlignCenter className="h-4 w-4" />
47
+ </ToggleGroupItem>
48
+ <ToggleGroupItem value="right" aria-label="Alinhar à direita">
49
+ <AlignRight className="h-4 w-4" />
50
+ </ToggleGroupItem>
51
+ </ToggleGroup>`}],props:[{name:"pressed",type:"boolean",default:"-",description:"Estado controlado do Toggle."},{name:"defaultPressed",type:"boolean",default:"false",description:"Estado inicial não controlado do Toggle."},{name:"onPressedChange",type:"(pressed: boolean) => void",default:"-",description:"Callback quando o estado do Toggle muda."},{name:"disabled",type:"boolean",default:"false",description:"Desabilita a interação."},{name:"aria-label",type:"string",default:"-",description:"Obrigatório para acessibilidade quando não há texto visível."},{name:"type",type:'"single" | "multiple"',default:"-",description:"Modo de seleção do ToggleGroup (obrigatório)."},{name:"value",type:"string | string[]",default:"-",description:"Valor(es) controlado(s) do ToggleGroup."},{name:"defaultValue",type:"string | string[]",default:"-",description:"Valor(es) inicial(is) não controlado(s) do ToggleGroup."},{name:"onValueChange",type:"(value: string | string[]) => void",default:"-",description:"Callback quando o valor do ToggleGroup muda."}],accessibility:['Role "button" com aria-pressed aplicado automaticamente',"Suporte completo de teclado (Espaço/Enter para alternar)","Navegação por setas entre itens do ToggleGroup","aria-label obrigatório para toggles apenas com ícones","Estados aria-pressed comunicados para leitores de tela","Indicadores visuais de foco e estado ativo","ToggleGroup implementa padrão roving tabindex"]})}export{T as ToggleDoc};
@@ -0,0 +1,58 @@
1
+ import{j as e,f8 as r,f9 as o,fa as i,dU as s,fb as t,x as a,dx as d,dv as p}from"./index-DkiftrvI.js";import{C as c}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";function x(){const l=`import {
2
+ Tooltip,
3
+ TooltipContent,
4
+ TooltipProvider,
5
+ TooltipTrigger,
6
+ } from 'forlogic-core';
7
+
8
+ <TooltipProvider>
9
+ <Tooltip>
10
+ <TooltipTrigger asChild>
11
+ <Button variant="outline">Hover</Button>
12
+ </TooltipTrigger>
13
+ <TooltipContent>
14
+ <p>Adicionar à biblioteca</p>
15
+ </TooltipContent>
16
+ </Tooltip>
17
+ </TooltipProvider>`,n=e.jsx("div",{className:"flex justify-center py-8",children:e.jsx(r,{children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",children:"Hover"})}),e.jsx(t,{children:e.jsx("p",{children:"Adicionar à biblioteca"})})]})})});return e.jsx(c,{title:"Tooltip",description:"Um popup que exibe informações relacionadas a um elemento quando o elemento recebe foco do teclado ou o mouse passa sobre ele.",component:n,usage:l,examples:[{title:"Tooltip em Ícone",description:"Tooltip exibido ao passar o cursor sobre um ícone de informação.",preview:e.jsx("div",{className:"flex justify-center py-8",children:e.jsx(r,{children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(s,{className:"h-4 w-4 text-muted-foreground cursor-help"})}),e.jsx(t,{children:e.jsx("p",{children:"Esta é uma dica de ajuda"})})]})})}),code:`<TooltipProvider>
18
+ <Tooltip>
19
+ <TooltipTrigger asChild>
20
+ <Info className="h-4 w-4 text-muted-foreground cursor-help" />
21
+ </TooltipTrigger>
22
+ <TooltipContent>
23
+ <p>Esta é uma dica de ajuda</p>
24
+ </TooltipContent>
25
+ </Tooltip>
26
+ </TooltipProvider>`},{title:"Posicionamento",description:"Controle o lado onde o tooltip aparece usando a prop side.",preview:e.jsxs("div",{className:"flex justify-center gap-4 py-8",children:[e.jsx(r,{children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",size:"sm",children:"Top"})}),e.jsx(t,{side:"top",children:e.jsx("p",{children:"Tooltip no topo"})})]})}),e.jsx(r,{children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",size:"sm",children:"Bottom"})}),e.jsx(t,{side:"bottom",children:e.jsx("p",{children:"Tooltip embaixo"})})]})}),e.jsx(r,{children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",size:"sm",children:"Left"})}),e.jsx(t,{side:"left",children:e.jsx("p",{children:"Tooltip à esquerda"})})]})}),e.jsx(r,{children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",size:"sm",children:"Right"})}),e.jsx(t,{side:"right",children:e.jsx("p",{children:"Tooltip à direita"})})]})})]}),code:`<TooltipContent side="top">...</TooltipContent>
27
+ <TooltipContent side="bottom">...</TooltipContent>
28
+ <TooltipContent side="left">...</TooltipContent>
29
+ <TooltipContent side="right">...</TooltipContent>`},{title:"Delay Customizado",description:"Ajuste o tempo de exibição com delayDuration e skipDelayDuration.",preview:e.jsxs("div",{className:"flex justify-center gap-4 py-8",children:[e.jsx(r,{delayDuration:0,children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",size:"sm",children:"Sem delay"})}),e.jsx(t,{children:e.jsx("p",{children:"Aparece instantaneamente"})})]})}),e.jsx(r,{delayDuration:1e3,children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",size:"sm",children:"1s delay"})}),e.jsx(t,{children:e.jsx("p",{children:"Aparece após 1 segundo"})})]})})]}),code:`// Sem delay
30
+ <TooltipProvider delayDuration={0}>
31
+ <Tooltip>...</Tooltip>
32
+ </TooltipProvider>
33
+
34
+ // Delay de 1 segundo
35
+ <TooltipProvider delayDuration={1000}>
36
+ <Tooltip>...</Tooltip>
37
+ </TooltipProvider>`},{title:"Múltiplos Tooltips",description:"Use um único TooltipProvider para compartilhar delay entre tooltips.",preview:e.jsx("div",{className:"flex justify-center gap-4 py-8",children:e.jsxs(r,{delayDuration:100,skipDelayDuration:0,children:[e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"ghost",size:"icon",children:e.jsx(s,{className:"h-4 w-4"})})}),e.jsx(t,{children:e.jsx("p",{children:"Informação"})})]}),e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"ghost",size:"icon",children:e.jsx(d,{className:"h-4 w-4"})})}),e.jsx(t,{children:e.jsx("p",{children:"Ajuda"})})]}),e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"ghost",size:"icon",children:e.jsx(p,{className:"h-4 w-4"})})}),e.jsx(t,{children:e.jsx("p",{children:"Alerta"})})]})]})}),code:`// Provider compartilhado - mover entre tooltips é instantâneo
38
+ <TooltipProvider delayDuration={100} skipDelayDuration={0}>
39
+ <Tooltip>
40
+ <TooltipTrigger asChild>
41
+ <Button variant="ghost" size="icon"><Info /></Button>
42
+ </TooltipTrigger>
43
+ <TooltipContent><p>Informação</p></TooltipContent>
44
+ </Tooltip>
45
+ <Tooltip>
46
+ <TooltipTrigger asChild>
47
+ <Button variant="ghost" size="icon"><HelpCircle /></Button>
48
+ </TooltipTrigger>
49
+ <TooltipContent><p>Ajuda</p></TooltipContent>
50
+ </Tooltip>
51
+ </TooltipProvider>`},{title:"Com Conteúdo Rico",description:"Tooltips podem conter múltiplas linhas e formatação.",preview:e.jsx("div",{className:"flex justify-center py-8",children:e.jsx(r,{children:e.jsxs(o,{children:[e.jsx(i,{asChild:!0,children:e.jsx(a,{variant:"outline",children:"Mais informações"})}),e.jsx(t,{className:"max-w-xs",children:e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"font-semibold",children:"Título do Tooltip"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Descrição mais detalhada que pode ocupar múltiplas linhas."})]})})]})})}),code:`<TooltipContent className="max-w-xs">
52
+ <div className="space-y-1">
53
+ <p className="font-semibold">Título do Tooltip</p>
54
+ <p className="text-xs text-muted-foreground">
55
+ Descrição mais detalhada...
56
+ </p>
57
+ </div>
58
+ </TooltipContent>`}],props:[{name:"delayDuration",type:"number",default:"300",description:"TooltipProvider: Atraso em ms antes de exibir o tooltip"},{name:"skipDelayDuration",type:"number",default:"300",description:"TooltipProvider: Tempo para pular o delay ao mover entre tooltips"},{name:"disableHoverableContent",type:"boolean",default:"false",description:"TooltipProvider: Impede que o conteúdo permaneça aberto ao passar o mouse"},{name:"open",type:"boolean",default:"-",description:"Tooltip: Estado controlado de abertura"},{name:"defaultOpen",type:"boolean",default:"false",description:"Tooltip: Estado inicial (não controlado)"},{name:"onOpenChange",type:"(open: boolean) => void",default:"-",description:"Tooltip: Callback quando o estado muda"},{name:"side",type:'"top" | "right" | "bottom" | "left"',default:'"top"',description:"TooltipContent: Lado preferido de posicionamento"},{name:"sideOffset",type:"number",default:"4",description:"TooltipContent: Distância em pixels do trigger"},{name:"align",type:'"start" | "center" | "end"',default:'"center"',description:"TooltipContent: Alinhamento em relação ao trigger"},{name:"alignOffset",type:"number",default:"0",description:"TooltipContent: Offset do alinhamento em pixels"}],accessibility:["Exibido ao focar no elemento trigger via teclado","Fechado automaticamente ao pressionar Escape",'role="tooltip" aplicado automaticamente',"Associação via aria-describedby","Não depende apenas de hover (acessível via focus)"],notes:["Use TooltipProvider como wrapper para compartilhar delays entre tooltips","Prefira Tooltip para dicas curtas, use Popover para conteúdo interativo","Evite tooltips em elementos que requerem ação rápida (botões principais)","Combine com ícones de informação para ajuda contextual","Use delayDuration={0} para exibição instantânea quando necessário"]})}export{x as TooltipDoc};
@@ -0,0 +1,12 @@
1
+ import{j as e,s as t}from"./index-DkiftrvI.js";import{C as o}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";const a=`import { TruncatedCell } from 'forlogic-core';
2
+
3
+ <td className="max-w-[200px]">
4
+ <TruncatedCell>
5
+ Texto que pode ser muito longo...
6
+ </TruncatedCell>
7
+ </td>
8
+
9
+ // Com className customizada
10
+ <TruncatedCell className="text-muted-foreground">
11
+ {item.description}
12
+ </TruncatedCell>`;function s(){return e.jsx("div",{className:"border rounded-lg overflow-hidden",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b bg-muted/50",children:[e.jsx("th",{className:"text-left p-3 w-[200px]",children:"Nome"}),e.jsx("th",{className:"text-left p-3 w-[150px]",children:"Status"})]})}),e.jsxs("tbody",{children:[e.jsxs("tr",{className:"border-b",children:[e.jsx("td",{className:"p-3 w-[200px] max-w-[200px]",children:e.jsx(t,{children:"Texto curto"})}),e.jsx("td",{className:"p-3",children:"Ativo"})]}),e.jsxs("tr",{className:"border-b",children:[e.jsx("td",{className:"p-3 w-[200px] max-w-[200px]",children:e.jsx(t,{children:"Este é um texto muito longo que será truncado automaticamente e mostrará tooltip ao passar o mouse"})}),e.jsx("td",{className:"p-3",children:"Ativo"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"p-3 w-[200px] max-w-[200px]",children:e.jsx(t,{children:"Outro texto extremamente longo para demonstrar que o tooltip só aparece quando o texto realmente está truncado pelo container"})}),e.jsx("td",{className:"p-3",children:"Inativo"})]})]})]})})}function l(){return e.jsx(o,{title:"Truncated Cell",description:"Componente utilitário que trunca texto longo e exibe tooltip automático quando o conteúdo está cortado.",component:e.jsx(s,{}),usage:a,props:[{name:"children",type:"ReactNode",description:"Conteúdo a ser renderizado (e truncado se necessário)"},{name:"className",type:"string",description:"Classes CSS adicionais para o container"}],accessibility:["Tooltip automático garante que o conteúdo completo é acessível via hover/focus","Usa role tooltip com aria para leitores de tela"],notes:["O componente usa ResizeObserver para detectar truncamento — zero overhead quando o texto cabe no espaço","Ideal para células de tabela, listas e áreas com largura fixa","O container pai deve ter max-width definido para que o truncamento funcione"]})}export{l as TruncatedCellDoc};
@@ -0,0 +1,7 @@
1
+ import{j as e,a as n,b as a,c as d,e as o,d as r}from"./index-DkiftrvI.js";const s={sans:'Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif',mono:'"Roboto Mono", Menlo, Monaco, "Courier New", monospace'},i={"display-lg":{size:"4.5rem",lineHeight:"1",letterSpacing:"-0.02em"},"display-md":{size:"3.75rem",lineHeight:"1.05",letterSpacing:"-0.015em"},"heading-h1":{size:"3rem",lineHeight:"1.1",letterSpacing:"-0.01em"},"heading-h2":{size:"2.25rem",lineHeight:"1.15",letterSpacing:"-0.008em"},"heading-h3":{size:"1.875rem",lineHeight:"1.2",letterSpacing:"-0.005em"},"heading-h4":{size:"1.5rem",lineHeight:"1.3",letterSpacing:"0"},"heading-h5":{size:"1.25rem",lineHeight:"1.4",letterSpacing:"0"},"heading-h6":{size:"1.125rem",lineHeight:"1.5",letterSpacing:"0"},"subtitle-lg":{size:"1.125rem",lineHeight:"1.55",letterSpacing:"0.005em"},"subtitle-md":{size:"1rem",lineHeight:"1.6",letterSpacing:"0.01em"},"body-lg":{size:"1.125rem",lineHeight:"1.75"},"body-md":{size:"1rem",lineHeight:"1.75"},"label-lg":{size:"0.875rem",lineHeight:"1.5",letterSpacing:"0.01em"},"label-md":{size:"0.75rem",lineHeight:"1.5",letterSpacing:"0.015em"},"label-sm":{size:"0.6875rem",lineHeight:"1.5",letterSpacing:"0.02em"},caption:{size:"0.625rem",lineHeight:"1.5",letterSpacing:"0.02em"},code:{size:"0.875rem",lineHeight:"1.7"}},t={normal:"400",medium:"500",semibold:"600",bold:"700"},g={displayLarge:{fontFamily:s.sans,fontSize:i["display-lg"].size,lineHeight:i["display-lg"].lineHeight,letterSpacing:i["display-lg"].letterSpacing,fontWeight:t.bold},displayMedium:{fontFamily:s.sans,fontSize:i["display-md"].size,lineHeight:i["display-md"].lineHeight,letterSpacing:i["display-md"].letterSpacing,fontWeight:t.bold},h1:{fontFamily:s.sans,fontSize:i["heading-h1"].size,lineHeight:i["heading-h1"].lineHeight,letterSpacing:i["heading-h1"].letterSpacing,fontWeight:t.bold},h2:{fontFamily:s.sans,fontSize:i["heading-h2"].size,lineHeight:i["heading-h2"].lineHeight,letterSpacing:i["heading-h2"].letterSpacing,fontWeight:t.bold},h3:{fontFamily:s.sans,fontSize:i["heading-h3"].size,lineHeight:i["heading-h3"].lineHeight,letterSpacing:i["heading-h3"].letterSpacing,fontWeight:t.semibold},h4:{fontFamily:s.sans,fontSize:i["heading-h4"].size,lineHeight:i["heading-h4"].lineHeight,letterSpacing:i["heading-h4"].letterSpacing,fontWeight:t.semibold},h5:{fontFamily:s.sans,fontSize:i["heading-h5"].size,lineHeight:i["heading-h5"].lineHeight,letterSpacing:i["heading-h5"].letterSpacing,fontWeight:t.semibold},h6:{fontFamily:s.sans,fontSize:i["heading-h6"].size,lineHeight:i["heading-h6"].lineHeight,letterSpacing:i["heading-h6"].letterSpacing,fontWeight:t.semibold},subtitleLarge:{fontFamily:s.sans,fontSize:i["subtitle-lg"].size,lineHeight:i["subtitle-lg"].lineHeight,letterSpacing:i["subtitle-lg"].letterSpacing,fontWeight:t.medium},subtitleMedium:{fontFamily:s.sans,fontSize:i["subtitle-md"].size,lineHeight:i["subtitle-md"].lineHeight,letterSpacing:i["subtitle-md"].letterSpacing,fontWeight:t.medium},bodyLarge:{fontFamily:s.sans,fontSize:i["body-lg"].size,lineHeight:i["body-lg"].lineHeight,fontWeight:t.normal},bodyMedium:{fontFamily:s.sans,fontSize:i["body-md"].size,lineHeight:i["body-md"].lineHeight,fontWeight:t.normal},labelLarge:{fontFamily:s.sans,fontSize:i["label-lg"].size,lineHeight:i["label-lg"].lineHeight,letterSpacing:i["label-lg"].letterSpacing,fontWeight:t.medium},labelMedium:{fontFamily:s.sans,fontSize:i["label-md"].size,lineHeight:i["label-md"].lineHeight,letterSpacing:i["label-md"].letterSpacing,fontWeight:t.medium},labelSmall:{fontFamily:s.sans,fontSize:i["label-sm"].size,lineHeight:i["label-sm"].lineHeight,letterSpacing:i["label-sm"].letterSpacing,fontWeight:t.medium},caption:{fontFamily:s.sans,fontSize:i.caption.size,lineHeight:i.caption.lineHeight,letterSpacing:i.caption.letterSpacing,fontWeight:t.normal},code:{fontFamily:s.mono,fontSize:i.code.size,lineHeight:i.code.lineHeight,fontWeight:t.normal}};function p(){return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-4xl font-bold mb-4",children:"Sistema Tipográfico"}),e.jsx("p",{className:"text-lg text-muted-foreground mb-6",children:"Sistema tipográfico profissional com Display (2 níveis), Headings (6 níveis), Subtitle (2 níveis), Body (2 níveis), Label (3 níveis), Caption e Monospace (Code). Todos os níveis incluem escalamento responsivo e conformidade de acessibilidade."})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Display (2 níveis)"}),e.jsx(o,{children:"Texto grande e impactante para seções hero e conteúdo de marketing"})]}),e.jsxs(r,{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["display-lg"].size,lineHeight:i["display-lg"].lineHeight,letterSpacing:i["display-lg"].letterSpacing,fontWeight:t.bold},children:"Display Large"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 72px · Bold · Line height 1.0 · Letter spacing -0.02em"})]}),e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["display-md"].size,lineHeight:i["display-md"].lineHeight,letterSpacing:i["display-md"].letterSpacing,fontWeight:t.bold},children:"Display Medium"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 60px · Bold · Line height 1.05 · Letter spacing -0.015em"})]})]})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Cabeçalhos (6 níveis)"}),e.jsx(o,{children:"Cabeçalhos hierárquicos de H1 a H6"})]}),e.jsx(r,{className:"space-y-4",children:["h1","h2","h3","h4","h5","h6"].map(h=>{const l=g[h],c="letterSpacing"in l?l.letterSpacing:"0";return e.jsxs("div",{children:[e.jsxs("div",{style:{fontSize:l.fontSize,lineHeight:l.lineHeight,letterSpacing:c,fontWeight:l.fontWeight},children:["Heading ",h.toUpperCase()]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Roboto · ",l.fontSize," · ",l.fontWeight==="700"?"Bold":"Semibold"," · Line height ",l.lineHeight]})]},h)})})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Subtítulo (2 níveis)"}),e.jsx(o,{children:"Cabeçalhos secundários e texto descritivo"})]}),e.jsxs(r,{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["subtitle-lg"].size,lineHeight:i["subtitle-lg"].lineHeight,letterSpacing:i["subtitle-lg"].letterSpacing,fontWeight:t.medium},children:"Subtitle Large - Texto de suporte para cabeçalhos"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 18px · Medium · Line height 1.55 · Letter spacing 0.005em"})]}),e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["subtitle-md"].size,lineHeight:i["subtitle-md"].lineHeight,letterSpacing:i["subtitle-md"].letterSpacing,fontWeight:t.medium},children:"Subtitle Medium - Texto descritivo secundário"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 16px · Medium · Line height 1.6 · Letter spacing 0.01em"})]})]})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Corpo (2 níveis)"}),e.jsx(o,{children:"Texto de conteúdo principal com legibilidade otimizada"})]}),e.jsxs(r,{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["body-lg"].size,lineHeight:i["body-lg"].lineHeight,fontWeight:t.normal},children:"Body Large - Este é o tamanho de texto de corpo grande, ideal para ênfase ou áreas de conteúdo primário onde texto ligeiramente maior melhora a legibilidade."}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 18px · Regular · Line height 1.75"})]}),e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["body-md"].size,lineHeight:i["body-md"].lineHeight,fontWeight:t.normal},children:"Body Medium - Este é o tamanho padrão de texto de corpo, otimizado para conteúdo de forma longa e leitura geral. Fornece excelente legibilidade em todos os dispositivos."}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 16px · Regular · Line height 1.75 (Default)"})]})]})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Rótulos (3 níveis)"}),e.jsx(o,{children:"Labels de UI, legendas e metadados"})]}),e.jsxs(r,{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["label-lg"].size,lineHeight:i["label-lg"].lineHeight,letterSpacing:i["label-lg"].letterSpacing,fontWeight:t.medium},children:"Label Large - Labels de formulário e texto de UI"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 14px · Medium · Line height 1.5 · Letter spacing 0.01em"})]}),e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["label-md"].size,lineHeight:i["label-md"].lineHeight,letterSpacing:i["label-md"].letterSpacing,fontWeight:t.medium},children:"Label Medium - Legendas e metadados"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 12px · Medium · Line height 1.5 · Letter spacing 0.015em"})]}),e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i["label-sm"].size,lineHeight:i["label-sm"].lineHeight,letterSpacing:i["label-sm"].letterSpacing,fontWeight:t.medium},children:"Label Small - Headers de tabela, tabs compactas, controles de UI"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 11px · Medium · Line height 1.5 · Letter spacing 0.02em"})]})]})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Caption"}),e.jsx(o,{children:"Metadados auxiliares, timestamps e contadores"})]}),e.jsx(r,{children:e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:i.caption.size,lineHeight:i.caption.lineHeight,letterSpacing:i.caption.letterSpacing,fontWeight:t.normal},children:"Caption - Códigos de documento, timestamps, badges contadores, links auxiliares"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto · 10px · Regular · Line height 1.5 · Letter spacing 0.02em"})]})})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Monoespaçado (Código)"}),e.jsx(o,{children:"Fonte monoespaçada para blocos de código e conteúdo técnico"})]}),e.jsx(r,{children:e.jsxs("div",{children:[e.jsxs("code",{style:{fontSize:i.code.size,lineHeight:i.code.lineHeight,fontFamily:"monospace"},className:"block bg-muted p-4 rounded-md",children:['const greeting = "Hello, World!";',`
2
+ `,"console.log(greeting);"]}),e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:"Roboto Mono · 14px · Regular · Line height 1.7"})]})})]}),e.jsxs(n,{children:[e.jsxs(a,{children:[e.jsx(d,{children:"Diretrizes de Uso"}),e.jsx(o,{children:"Melhores práticas para tipografia"})]}),e.jsxs(r,{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"font-semibold mb-2",children:"Hierarquia"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 text-sm text-muted-foreground",children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Display:"})," Seções hero, landing pages, banners de marketing"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"H1:"})," Títulos de página, cabeçalhos principais (um por página)"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"H2-H3:"})," Cabeçalhos de seção, divisões principais de conteúdo"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"H4-H6:"})," Subseções, cabeçalhos menores"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Subtitle:"})," Texto de suporte para cabeçalhos, descrições"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Body:"})," Conteúdo principal, parágrafos, listas"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Label:"})," Labels de formulário, elementos de UI, legendas, headers de tabela"]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Caption:"})," Metadados auxiliares, timestamps, códigos, contadores"]})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"font-semibold mb-2",children:"Melhores Práticas"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 text-sm text-muted-foreground",children:[e.jsx("li",{children:"Mantenha altura de linha consistente para melhor legibilidade (1.5-1.75 para texto de corpo)"}),e.jsx("li",{children:"Use pesos de fonte para estabelecer hierarquia (Bold para H1-H2, Semibold para H3-H6)"}),e.jsx("li",{children:"Limite o comprimento da linha a 60-80 caracteres para legibilidade ideal"}),e.jsx("li",{children:"Garanta contraste suficiente entre texto e fundo (mínimo AA)"}),e.jsx("li",{children:"Use tags HTML semânticas (h1, h2, p) junto com classes de tipografia"})]})]}),e.jsxs("div",{children:[e.jsx("h4",{className:"font-semibold mb-3",children:"Exemplos de Código"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium mb-2 text-green-600 dark:text-green-400",children:"✅ Correto"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md text-xs overflow-x-auto",children:`<h1 className="text-4xl font-bold">Page Title</h1>
3
+ <h2 className="text-3xl font-bold">Section Heading</h2>
4
+ <p className="text-base leading-relaxed">Body text content...</p>
5
+ <label className="text-sm font-medium">Form Label</label>`})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium mb-2 text-red-600 dark:text-red-400",children:"❌ Incorreto"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md text-xs overflow-x-auto",children:`<div className="text-[32px]">Page Title</div>
6
+ <span style={{fontSize: '24px'}}>Section Heading</span>
7
+ <p className="text-[14px] leading-[1.5]">Body text...</p>`})]})]})]})]})]})]})}export{p as TypographyFoundationDoc};
@@ -0,0 +1,29 @@
1
+ import{j as o,eI as e,Y as a}from"./index-DkiftrvI.js";import{C as i}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";const t=[{id:"1",title:"Nova versão do Documentos",text:"Agora é possível assinar documentos digitalmente com integração D4Sign."},{id:"2",title:"Melhorias no header",text:"O cabeçalho foi atualizado com novo menu de notificações e atalhos."},{id:"3",title:"Correção de bugs",text:"Corrigido problema de carregamento lento nas listagens com muitos registros."}];function r(){return o.jsx(i,{title:"Updates Notification",description:"Botão com popover para exibir notificações de atualização das aplicações. Possui dois modos: automático (self-contained, busca dados da API sozinho) e controlado (recebe dados via props).",component:o.jsx("div",{className:"flex items-center gap-6",children:o.jsx(e,{updates:t,badgeCount:3,onOpen:()=>a.info("Popover aberto"),onViewAll:()=>a.info("Ver todas clicado")})}),usage:`// Modo automático — basta importar e usar, sem props
2
+ // O componente busca dados da API internamente usando useAuth() e useUpdatesNotification()
3
+ import { UpdatesNotification } from 'forlogic-core';
4
+
5
+ <UpdatesNotification />
6
+
7
+ // Modo controlado — para testes, docs ou lógica customizada
8
+ <UpdatesNotification
9
+ updates={[{ id: '1', title: 'Nova versão', text: 'Descrição' }]}
10
+ badgeCount={1}
11
+ onOpen={() => markAsViewed()}
12
+ onViewAll={() => window.open('/common/alias/up/view', '_blank')}
13
+ />`,examples:[{title:"Modo automático (recomendado)",description:"Sem nenhuma prop, o componente usa useAuth() para obter o alias e busca as notificações da API automaticamente. Ideal para projetos consumidores.",preview:o.jsxs("div",{className:"flex items-center gap-4 p-4 border border-dashed border-border rounded-md",children:[o.jsx("span",{className:"text-sm text-muted-foreground",children:"Em produção, basta:"}),o.jsx("code",{className:"text-xs bg-muted px-2 py-1 rounded",children:"<UpdatesNotification />"})]}),code:`import { UpdatesNotification } from 'forlogic-core';
14
+
15
+ // Coloque no header ou onde desejar — sem configuração adicional
16
+ <UpdatesNotification />`},{title:"Sem atualizações",description:"Estado vazio com mensagem temática do café.",preview:o.jsx(e,{updates:[],badgeCount:0}),code:"<UpdatesNotification updates={[]} badgeCount={0} />"},{title:"Com badge",description:'Badge numérico sobre o ícone. Valores acima de 99 exibem "99+".',preview:o.jsxs("div",{className:"flex items-center gap-6",children:[o.jsx(e,{badgeCount:3,updates:[]}),o.jsx(e,{badgeCount:42,updates:[]}),o.jsx(e,{badgeCount:150,updates:[]})]}),code:`<UpdatesNotification badgeCount={3} updates={[]} />
17
+ <UpdatesNotification badgeCount={42} updates={[]} />
18
+ <UpdatesNotification badgeCount={150} updates={[]} /> {/* exibe 99+ */}`},{title:"Com atualizações",description:"Lista de atualizações dentro do popover. Clique no ícone para visualizar.",preview:o.jsx(e,{updates:t,badgeCount:3}),code:`const updates = [
19
+ { id: '1', title: 'Nova versão do Documentos', text: 'Integração D4Sign disponível.' },
20
+ { id: '2', title: 'Melhorias no header', text: 'Novo menu de notificações.' },
21
+ { id: '3', title: 'Correção de bugs', text: 'Carregamento otimizado.' },
22
+ ];
23
+
24
+ <UpdatesNotification updates={updates} badgeCount={3} />`},{title:"Callbacks (modo controlado)",description:'onOpen é chamado ao abrir o popover, onViewAll ao clicar em "Ver todas as atualizações".',preview:o.jsx(e,{updates:t,badgeCount:2,onOpen:()=>a.info("onOpen disparado — marcar como visualizado"),onViewAll:()=>a.info("onViewAll — abrir /common/{alias}/up/view")}),code:`<UpdatesNotification
25
+ updates={updates}
26
+ badgeCount={2}
27
+ onOpen={() => markAsViewed()}
28
+ onViewAll={() => window.open(\`/common/\${alias}/up/view\`, '_blank')}
29
+ />`}],props:[{name:"updates",type:"UpdateNotificationItem[]",default:"undefined",description:"Lista de atualizações. Se undefined, busca automaticamente da API (modo automático). Se [] (array vazio), exibe estado vazio (modo controlado)."},{name:"badgeCount",type:"number",default:"undefined",description:'Número exibido no badge. Em modo automático (undefined), usa o valor da API. Acima de 99 exibe "99+".'},{name:"onOpen",type:"() => void",default:"markAsVisualized",description:"Callback ao abrir o popover. Em modo automático, chama markAsVisualized internamente."},{name:"onViewAll",type:"() => void",default:"window.open(...)",description:'Callback ao clicar em "Ver todas". Em modo automático, abre /common/{alias}/up/view.'}],notes:["O componente possui dois modos: automático (sem props) e controlado (com props). O modo é determinado pela presença da prop updates.","No modo automático, o componente usa useAuth() para obter o alias e useUpdatesNotification() para buscar dados da API.","No modo controlado, todas as props são fornecidas externamente — útil para testes e documentação.","O tipo canônico é UpdateNotificationItem (id, title, text), exportado do hook. UpdateNotification é um alias deprecated.","No modo automático, onOpen chama markAsVisualized (POST Updates/userVisualized/3/undefined) e onViewAll abre a rota legada.","O ícone utilizado é Coffee do Lucide React — não requer fontes externas nos projetos consumidores.","O hook useUpdatesNotification também é exportado separadamente para uso avançado.","Todas as chamadas à API incluem o header x-waf-rate (base64 do campo sub do JWT), exigido pelo WAF da API legada.","Em caso de 401, o hook faz retry automático regenerando o token via QualiexErrorInterceptor.","Em produção, o componente deve ser colocado no AppHeader — já está integrado no forlogic-core."]})}export{r as UpdatesNotificationDoc};
@@ -0,0 +1,18 @@
1
+ import{r as a,j as e,o as v,N as K,O as L,Q as T,R as B,V as G,d7 as H,K as Q,ab as $,m as w,aG as J,aH as W,bp as X,aI as Y}from"./index-DkiftrvI.js";import{E as x}from"./ExampleCard-DuLrb3t-.js";function Z(r){return r.split(" ").slice(0,2).map(t=>t[0]?.toUpperCase()??"").join("")}function S(r){return(r??"").normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}function f({users:r,groups:t=[],value:n,onChange:m,disabled:c=!1,maxHeight:y=350,hideGroupFilter:E=!1,searchPlaceholder:k="Buscar usuário...",selectLabel:_="Selecionar",doneLabel:A="Concluir",allLabel:F="Todos",emptyLabel:M="Nenhum usuário selecionado",selectedLabel:z="selecionado",selectedPluralLabel:O="selecionados",className:D}){const[l,P]=a.useState(!1),[g,C]=a.useState(""),[h,b]=a.useState(void 0),u=a.useMemo(()=>new Set(n),[n]),d=a.useMemo(()=>{let s=r;if(h&&(s=s.filter(o=>o.groupIds?.includes(h))),g){const o=S(g);s=s.filter(i=>S(i.name).includes(o)||S(i.email??"").includes(o))}return s},[r,h,g]),U=a.useMemo(()=>l?d:r.filter(s=>u.has(s.id)),[l,d,r,u]),p=n.length,R=a.useMemo(()=>d.length>0&&d.every(s=>u.has(s.id)),[d,u]),I=a.useCallback(s=>{if(c)return;const o=u.has(s)?n.filter(i=>i!==s):[...n,s];m(o)},[n,u,m,c]),V=a.useCallback(s=>{if(c)return;const o=new Set(d.map(i=>i.id));if(s){const i=new Set([...n,...o]);m(Array.from(i))}else m(n.filter(i=>!o.has(i)))},[n,d,m,c]),q=a.useCallback(()=>{P(s=>!s),C(""),b(void 0)},[]);return e.jsxs("div",{className:v("rounded-md border bg-muted/30",D),children:[(!c||p>0)&&e.jsxs("div",{className:v("flex items-center justify-between px-4 py-2",!c&&"cursor-pointer hover:bg-muted/50"),onClick:c?void 0:q,children:[e.jsx("span",{className:"text-sm font-medium text-primary uppercase",children:!c&&(l?A:_)}),e.jsx("span",{className:"text-xs text-muted-foreground",children:p>0&&`${p} ${p===1?z:O}`})]}),e.jsxs("div",{className:"px-4 pb-3",children:[l&&e.jsxs("div",{className:"flex gap-3 mb-3",children:[!E&&t.length>0&&e.jsxs(K,{value:h??"__all__",onValueChange:s=>b(s==="__all__"?void 0:s),children:[e.jsx(L,{className:"w-[200px] h-9 text-sm",children:e.jsx(T,{placeholder:"Grupo de usuários"})}),e.jsxs(B,{children:[e.jsx(G,{value:"__all__",children:"Todos os grupos"}),t.map(s=>e.jsx(G,{value:s.id,children:s.name},s.id))]})]}),e.jsxs("div",{className:"relative flex-1",children:[e.jsx(H,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(Q,{className:"pl-8 h-9 text-sm",placeholder:k,value:g,onChange:s=>C(s.target.value)})]})]}),!l&&p===0&&e.jsxs("div",{className:"flex items-center justify-center py-4 text-sm text-muted-foreground",children:[e.jsx($,{className:"h-4 w-4 mr-2"}),M]}),l&&d.length>0&&e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(w,{checked:R,onCheckedChange:s=>V(!!s)}),e.jsx("span",{className:"text-sm",children:F})]}),U.length>0&&e.jsx(J,{style:{maxHeight:y},className:"pr-2",children:e.jsx("div",{className:"space-y-0.5",children:U.map(s=>e.jsxs("div",{className:v("flex items-center gap-3 rounded-md bg-background px-3 py-2 text-sm",l&&!c&&"cursor-pointer hover:bg-accent/50"),onClick:l?()=>I(s.id):void 0,children:[l&&e.jsx(w,{checked:u.has(s.id),onCheckedChange:()=>I(s.id),onClick:o=>o.stopPropagation()}),e.jsxs(W,{className:"h-8 w-8 shrink-0",children:[s.avatar&&e.jsx(X,{src:s.avatar,alt:s.name}),e.jsx(Y,{className:"text-xs",children:Z(s.name)})]}),e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx("span",{className:"font-normal truncate",children:s.name}),s.email&&e.jsx("span",{className:"text-xs text-muted-foreground truncate",children:s.email})]})]},s.id))})}),l&&d.length===0&&e.jsx("div",{className:"flex items-center justify-center py-4 text-sm text-muted-foreground",children:"Nenhum usuário encontrado"})]})]})}const N=[{id:"g1",name:"Qualidade"},{id:"g2",name:"Produção"},{id:"g3",name:"Engenharia"}],j=[{id:"u1",name:"João Silva",email:"joao@example.com",groupIds:["g1"]},{id:"u2",name:"Maria Santos",email:"maria@example.com",groupIds:["g1","g2"]},{id:"u3",name:"Carlos Mendes",email:"carlos@example.com",groupIds:["g2"]},{id:"u4",name:"Ana Costa",email:"ana@example.com",groupIds:["g3"]},{id:"u5",name:"Pedro Oliveira",email:"pedro@example.com",groupIds:["g1","g3"]},{id:"u6",name:"Fernanda Lima",email:"fernanda@example.com",groupIds:["g2"]},{id:"u7",name:"Lucas Souza",email:"lucas@example.com",groupIds:["g3"]},{id:"u8",name:"Beatriz Almeida",email:"beatriz@example.com",groupIds:["g1","g2"]}];function ee(){const[r,t]=a.useState(["u1","u3"]);return e.jsx("div",{className:"max-w-lg",children:e.jsx(f,{users:j,groups:N,value:r,onChange:t})})}function se(){const[r,t]=a.useState([]);return e.jsx("div",{className:"max-w-lg",children:e.jsx(f,{users:j,groups:N,value:r,onChange:t})})}function re(){const[r,t]=a.useState(["u2"]);return e.jsx("div",{className:"max-w-lg",children:e.jsx(f,{users:j,value:r,onChange:t,hideGroupFilter:!0})})}function ae(){return e.jsx("div",{className:"max-w-lg",children:e.jsx(f,{users:j,groups:N,value:["u1","u4","u5"],onChange:()=>{},disabled:!0})})}function le(){return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold mb-2",children:"Users Groups Selector"}),e.jsxs("p",{className:"text-muted-foreground",children:["Seletor de usuários por grupo com checkbox, busca por nome/email, filtro por grupo e seleção em lote. Portado de ",e.jsx("code",{children:"qex-users-groups"})," (v1)."]})]}),e.jsx(x,{title:"Com membros pré-selecionados",description:"Clique em 'Selecionar' para abrir o modo de edição com filtro por grupo e busca.",preview:e.jsx(ee,{}),code:`const [ids, setIds] = useState(['u1', 'u3']);
2
+
3
+ <UsersGroupsSelector
4
+ users={users}
5
+ groups={groups}
6
+ value={ids}
7
+ onChange={setIds}
8
+ />`}),e.jsx(x,{title:"Vazio",description:"Estado vazio com mensagem padrão.",preview:e.jsx(se,{}),code:"<UsersGroupsSelector users={users} groups={groups} value={[]} onChange={setIds} />"}),e.jsx(x,{title:"Sem filtro de grupo",description:"Oculta o dropdown de grupo, exibindo apenas a busca por texto.",preview:e.jsx(re,{}),code:"<UsersGroupsSelector users={users} value={ids} onChange={setIds} hideGroupFilter />"}),e.jsx(x,{title:"Desabilitado",description:"Exibe somente os usuários selecionados, sem possibilidade de edição.",preview:e.jsx(ae,{}),code:"<UsersGroupsSelector users={users} value={['u1', 'u4']} onChange={() => {}} disabled />"}),e.jsx(x,{title:"Importação",description:"Como usar o componente.",preview:e.jsx("pre",{className:"bg-muted p-4 rounded text-sm overflow-x-auto",children:`import { UsersGroupsSelector } from 'forlogic-core';
9
+ import type { UsersGroupUser, UsersGroup } from 'forlogic-core';`}),code:`import { UsersGroupsSelector } from 'forlogic-core';
10
+ import type { UsersGroupUser, UsersGroup } from 'forlogic-core';
11
+
12
+ <UsersGroupsSelector
13
+ users={availableUsers}
14
+ groups={userGroups}
15
+ value={selectedUserIds}
16
+ onChange={setSelectedUserIds}
17
+ maxHeight={400}
18
+ />`})]})}export{le as UsersGroupsSelectorDoc};
@@ -0,0 +1,145 @@
1
+ import{j as e}from"./index-DkiftrvI.js";import{C as a}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";const o=`import { cn, formatDatetime, formatCurrency } from 'forlogic-core';
2
+
3
+ // Combinar classes com cn()
4
+ <div className={cn("base-class", isActive && "active-class")} />
5
+
6
+ // Formatar data/hora
7
+ formatDatetime("2024-03-15T14:30:00Z"); // "15/03/2024 14:30"
8
+
9
+ // Formatar moeda
10
+ formatCurrency(1234.56); // "R$ 1.234,56"`,t=`import { cn } from 'forlogic-core';
11
+
12
+ // ✅ Combinar classes estáticas
13
+ <div className={cn("p-4 rounded-lg", "bg-background")} />
14
+ // Resultado: "p-4 rounded-lg bg-background"
15
+
16
+ // ✅ Classes condicionais
17
+ <Button className={cn(
18
+ "base-button",
19
+ isLoading && "opacity-50 cursor-wait",
20
+ variant === "primary" && "bg-primary text-primary-foreground"
21
+ )} />
22
+
23
+ // ✅ Resolver conflitos do Tailwind automaticamente
24
+ <div className={cn("px-4 py-2", "px-8")} />
25
+ // Resultado: "py-2 px-8" (px-4 é substituído por px-8)
26
+
27
+ // ✅ Ignorar valores falsy
28
+ <div className={cn(
29
+ "flex",
30
+ undefined,
31
+ null,
32
+ false,
33
+ "",
34
+ "items-center"
35
+ )} />
36
+ // Resultado: "flex items-center"
37
+
38
+ // ✅ Usar com arrays e objetos
39
+ <div className={cn([
40
+ "base",
41
+ { "active": isActive, "disabled": isDisabled }
42
+ ])} />`,r=`import { formatDatetime } from 'forlogic-core';
43
+
44
+ // ⚠️ ATENÇÃO: Para componentes React, prefira useI18nFormatters
45
+ // A função formatDatetime é útil para uso fora de componentes
46
+
47
+ // ✅ Formato padrão (dd/MM/yyyy HH:mm)
48
+ formatDatetime("2024-03-15T14:30:00Z");
49
+ // Resultado: "15/03/2024 14:30"
50
+
51
+ // ✅ Com formato customizado
52
+ formatDatetime("2024-03-15T14:30:00Z", "MM/dd/yyyy hh:mm a");
53
+ // Resultado: "03/15/2024 02:30 PM"
54
+
55
+ // ✅ Com locale para nomes de mês
56
+ formatDatetime("2024-03-15T14:30:00Z", "d MMM yyyy, HH:mm", "America/Sao_Paulo", "pt-BR");
57
+ // Resultado: "15 Mar 2024, 14:30"
58
+
59
+ // ✅ String vazia retorna vazio
60
+ formatDatetime("");
61
+ // Resultado: ""
62
+
63
+ // ✅ Data inválida
64
+ formatDatetime("invalid-date");
65
+ // Resultado: "Data inválida"
66
+
67
+ // ✅✅ RECOMENDADO: Usando hook useI18nFormatters
68
+ // Respeita automaticamente as preferências do usuário (formato, timezone, locale)
69
+ import { useI18nFormatters } from 'forlogic-core';
70
+
71
+ function UserDateDisplay({ date }: { date: string }) {
72
+ const { formatDatetime, formatDate } = useI18nFormatters();
73
+
74
+ return (
75
+ <div>
76
+ <span>{formatDatetime(date)}</span> {/* Usa configuração do usuário */}
77
+ <span>{formatDate(date)}</span> {/* Data sem hora, localizada */}
78
+ </div>
79
+ );
80
+ }`,s=`import { formatCurrency } from 'forlogic-core';
81
+
82
+ // ✅ Formato padrão (BRL)
83
+ formatCurrency(1234.56);
84
+ // Resultado: "R$ 1.234,56"
85
+
86
+ formatCurrency(0);
87
+ // Resultado: "R$ 0,00"
88
+
89
+ // ✅ Valores null/undefined
90
+ formatCurrency(null);
91
+ // Resultado: "R$ 0,00"
92
+
93
+ formatCurrency(undefined);
94
+ // Resultado: "R$ 0,00"
95
+
96
+ // ✅ Valores negativos
97
+ formatCurrency(-500.00);
98
+ // Resultado: "-R$ 500,00"
99
+
100
+ // ✅ Usando em tabelas
101
+ const columns = [
102
+ {
103
+ key: 'valor',
104
+ label: 'Valor',
105
+ render: (row) => formatCurrency(row.valor)
106
+ }
107
+ ];
108
+
109
+ // ✅ Versão avançada com locale/currency customizados
110
+ import { formatCurrency } from 'forlogic-core/modular';
111
+
112
+ // Formato USD
113
+ formatCurrency(1234.56, 'USD', 'en-US');
114
+ // Resultado: "$1,234.56"
115
+
116
+ // Formato EUR
117
+ formatCurrency(1234.56, 'EUR', 'de-DE');
118
+ // Resultado: "1.234,56 €"`,n=`import {
119
+ trimTextFields,
120
+ debounce,
121
+ slugify,
122
+ handleExternalLink
123
+ } from 'forlogic-core';
124
+
125
+ // ✅ trimTextFields - Remove espaços em branco
126
+ const data = { name: " João ", email: " email@test.com " };
127
+ trimTextFields(data);
128
+ // Resultado: { name: "João", email: "email@test.com" }
129
+
130
+ // ✅ debounce - Atrasa execução de função
131
+ const handleSearch = debounce((query: string) => {
132
+ fetchResults(query);
133
+ }, 300); // 300ms de delay
134
+
135
+ // ✅ slugify - Converte texto para slug URL-friendly
136
+ slugify("Meu Título Especial!");
137
+ // Resultado: "meu-titulo-especial"
138
+
139
+ slugify("Ação & Reação");
140
+ // Resultado: "acao-reacao"
141
+
142
+ // ✅ handleExternalLink - Abre link externo com segurança
143
+ <Button onClick={() => handleExternalLink("https://example.com")}>
144
+ Visitar Site
145
+ </Button>`,i=[{name:"cn(...inputs)",type:"(...inputs: ClassValue[]) => string",default:"-",description:"Combina classes CSS com tailwind-merge + clsx. Resolve conflitos automaticamente."},{name:"formatDatetime(dateString, format?, tz?, locale?)",type:"(dateString: string, format?: string, timezone?: string, locale?: string) => string",default:"dd/MM/yyyy HH:mm, America/Sao_Paulo, pt-BR",description:"Formata string ISO para data/hora. Para componentes React, prefira useI18nFormatters."},{name:"formatCurrency(value, currency?, locale?)",type:"(value: number | null | undefined, currency?: string, locale?: string) => string",default:"BRL, pt-BR",description:"Formata número como moeda. Padrão: Real Brasileiro."},{name:"trimTextFields(data)",type:"(data: any) => any",default:"-",description:"Remove espaços em branco de strings em objetos recursivamente."},{name:"debounce(func, wait)",type:"(func: Function, wait: number) => Function",default:"-",description:'Cria versão "debounced" de uma função que atrasa execução.'},{name:"slugify(text)",type:"(text: string) => string",default:"-",description:"Converte texto para slug URL-friendly (lowercase, sem acentos, hifenizado)."},{name:"handleExternalLink(url)",type:"(url: string) => void",default:"-",description:"Abre link externo em nova aba com noopener/noreferrer."}];function c(){return e.jsx(a,{title:"Utilities",description:"Funções utilitárias essenciais exportadas pela biblioteca para manipulação de classes CSS, formatação de datas e valores monetários.",usage:o,examples:[{title:"cn() - Class Names",description:"Combina classes CSS usando clsx + tailwind-merge. Resolve conflitos automaticamente.",preview:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"p-4 rounded-lg bg-muted text-sm font-mono",children:'cn("p-4", "p-8") → "p-8"'}),e.jsx("div",{className:"p-4 rounded-lg bg-primary text-primary-foreground text-sm font-mono",children:'cn("bg-red-500", "bg-primary") → "bg-primary"'})]}),code:t},{title:"formatDatetime()",description:"Formata strings ISO 8601 para formato brasileiro legível.",preview:e.jsxs("div",{className:"space-y-2 text-sm",children:[e.jsx("div",{className:"p-3 bg-muted rounded-lg font-mono",children:'"2024-03-15T14:30:00Z" → "15/03/2024 14:30"'}),e.jsx("div",{className:"p-3 bg-muted rounded-lg font-mono",children:'"" → ""'}),e.jsx("div",{className:"p-3 bg-muted rounded-lg font-mono",children:'"invalid" → "Data inválida"'})]}),code:r},{title:"formatCurrency()",description:"Formata números como valores monetários com suporte a múltiplas moedas.",preview:e.jsxs("div",{className:"space-y-2 text-sm",children:[e.jsx("div",{className:"p-3 bg-muted rounded-lg font-mono",children:'1234.56 → "R$ 1.234,56"'}),e.jsx("div",{className:"p-3 bg-muted rounded-lg font-mono",children:'null → "R$ 0,00"'}),e.jsx("div",{className:"p-3 bg-muted rounded-lg font-mono",children:'-500 → "-R$ 500,00"'})]}),code:s},{title:"Outras Utilities",description:"trimTextFields, debounce, slugify e handleExternalLink.",preview:e.jsxs("div",{className:"space-y-2 text-sm",children:[e.jsx("div",{className:"p-3 bg-muted rounded-lg font-mono",children:'slugify("Ação & Reação") → "acao-reacao"'}),e.jsxs("div",{className:"p-3 bg-muted rounded-lg font-mono",children:["trimTextFields("," name ",") → ","name"]})]}),code:n}],props:i,notes:["cn() é essencial para componentes com classes condicionais - nunca concatene strings manualmente.","**useI18nFormatters** é o método RECOMENDADO para formatação de datas em componentes React - respeita as preferências do usuário.","formatDatetime() direta é útil apenas fora de componentes React (scripts, services, etc).","As constantes de formato (DATETIME_FORMATS, TIMEZONES, SUPPORTED_LOCALES) estão em lib/i18n/constants.ts.",'formatCurrency() aceita null/undefined retornando "R$ 0,00" para evitar erros de renderização.',"Todas as utilities são tree-shakeable - importe apenas o que usar.","debounce é útil para inputs de busca e eventos de resize/scroll."]})}export{c as default};