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,165 @@
1
+ import{ba as G,r as u,j as e,fy as Re,bg as Ne,b9 as $,d8 as ye,bc as U,fz as we,bf as Ae,d9 as Te,fA as Ee,bh as N,fB as ke,fC as _e,fD as Pe,fE as Be,fF as Ge,fG as Oe,da as Z,b8 as De,bj as ze,fH as Fe,fI as Ve,fJ as qe,fK as Ke,fL as Le,fM as $e,fN as Ue,fO as Ze,o as I,bs as Je,aT as We,aQ as He}from"./index-DkiftrvI.js";import{C as Xe}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";var _="Menubar",[O,Qe,Ye]=De(_),[J]=ze(_,[Ye,Z]),m=we(),W=Z(),[er,F]=J(_),H=u.forwardRef((r,n)=>{const{__scopeMenubar:a,value:t,onValueChange:s,defaultValue:b,loop:p=!0,dir:d,...i}=r,f=Ne(d),c=W(a),[v,g]=$({prop:t,onChange:s,defaultProp:b??"",caller:_}),[S,M]=u.useState(null);return e.jsx(er,{scope:a,value:v,onMenuOpen:u.useCallback(R=>{g(R),M(R)},[g]),onMenuClose:u.useCallback(()=>g(""),[g]),onMenuToggle:u.useCallback(R=>{g(q=>q?"":R),M(R)},[g]),dir:f,loop:p,children:e.jsx(O.Provider,{scope:a,children:e.jsx(O.Slot,{scope:a,children:e.jsx(ye,{asChild:!0,...c,orientation:"horizontal",loop:p,dir:f,currentTabStopId:S,onCurrentTabStopIdChange:M,children:e.jsx(U.div,{role:"menubar",...i,ref:n})})})})})});H.displayName=_;var V="MenubarMenu",[rr,X]=J(V),Q=r=>{const{__scopeMenubar:n,value:a,...t}=r,s=G(),b=a||s||"LEGACY_REACT_AUTO_VALUE",p=F(V,n),d=m(n),i=u.useRef(null),f=u.useRef(!1),c=p.value===b;return u.useEffect(()=>{c||(f.current=!1)},[c]),e.jsx(rr,{scope:n,value:b,triggerId:G(),triggerRef:i,contentId:G(),wasKeyboardTriggerOpenRef:f,children:e.jsx(Re,{...d,open:c,onOpenChange:v=>{v||p.onMenuClose()},modal:!1,dir:p.dir,...t})})};Q.displayName=V;var D="MenubarTrigger",Y=u.forwardRef((r,n)=>{const{__scopeMenubar:a,disabled:t=!1,...s}=r,b=W(a),p=m(a),d=F(D,a),i=X(D,a),f=u.useRef(null),c=Ae(n,f,i.triggerRef),[v,g]=u.useState(!1),S=d.value===i.value;return e.jsx(O.ItemSlot,{scope:a,value:i.value,disabled:t,children:e.jsx(Te,{asChild:!0,...b,focusable:!t,tabStopId:i.value,children:e.jsx(Ee,{asChild:!0,...p,children:e.jsx(U.button,{type:"button",role:"menuitem",id:i.triggerId,"aria-haspopup":"menu","aria-expanded":S,"aria-controls":S?i.contentId:void 0,"data-highlighted":v?"":void 0,"data-state":S?"open":"closed","data-disabled":t?"":void 0,disabled:t,...s,ref:c,onPointerDown:N(r.onPointerDown,M=>{!t&&M.button===0&&M.ctrlKey===!1&&(d.onMenuOpen(i.value),S||M.preventDefault())}),onPointerEnter:N(r.onPointerEnter,()=>{d.value&&!S&&(d.onMenuOpen(i.value),f.current?.focus())}),onKeyDown:N(r.onKeyDown,M=>{t||(["Enter"," "].includes(M.key)&&d.onMenuToggle(i.value),M.key==="ArrowDown"&&d.onMenuOpen(i.value),["Enter"," ","ArrowDown"].includes(M.key)&&(i.wasKeyboardTriggerOpenRef.current=!0,M.preventDefault()))}),onFocus:N(r.onFocus,()=>g(!0)),onBlur:N(r.onBlur,()=>g(!1))})})})})});Y.displayName=D;var ar="MenubarPortal",ee=r=>{const{__scopeMenubar:n,...a}=r,t=m(n);return e.jsx(ke,{...t,...a})};ee.displayName=ar;var z="MenubarContent",re=u.forwardRef((r,n)=>{const{__scopeMenubar:a,align:t="start",...s}=r,b=m(a),p=F(z,a),d=X(z,a),i=Qe(a),f=u.useRef(!1);return e.jsx(_e,{id:d.contentId,"aria-labelledby":d.triggerId,"data-radix-menubar-content":"",...b,...s,ref:n,align:t,onCloseAutoFocus:N(r.onCloseAutoFocus,c=>{!p.value&&!f.current&&d.triggerRef.current?.focus(),f.current=!1,c.preventDefault()}),onFocusOutside:N(r.onFocusOutside,c=>{const v=c.target;i().some(S=>S.ref.current?.contains(v))&&c.preventDefault()}),onInteractOutside:N(r.onInteractOutside,()=>{f.current=!0}),onEntryFocus:c=>{d.wasKeyboardTriggerOpenRef.current||c.preventDefault()},onKeyDown:N(r.onKeyDown,c=>{if(["ArrowRight","ArrowLeft"].includes(c.key)){const v=c.target,g=v.hasAttribute("data-radix-menubar-subtrigger"),S=v.closest("[data-radix-menubar-content]")!==c.currentTarget,R=(p.dir==="rtl"?"ArrowRight":"ArrowLeft")===c.key;if(!R&&g||S&&R)return;let A=i().filter(B=>!B.disabled).map(B=>B.value);R&&A.reverse();const K=A.indexOf(d.value);A=p.loop?hr(A,K+1):A.slice(K+1);const[L]=A;L&&p.onMenuOpen(L)}},{checkForDefaultPrevented:!1}),style:{...r.style,"--radix-menubar-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-menubar-content-available-width":"var(--radix-popper-available-width)","--radix-menubar-content-available-height":"var(--radix-popper-available-height)","--radix-menubar-trigger-width":"var(--radix-popper-anchor-width)","--radix-menubar-trigger-height":"var(--radix-popper-anchor-height)"}})});re.displayName=z;var nr="MenubarGroup",tr=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx($e,{...s,...t,ref:n})});tr.displayName=nr;var or="MenubarLabel",ae=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Ue,{...s,...t,ref:n})});ae.displayName=or;var sr="MenubarItem",ne=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Pe,{...s,...t,ref:n})});ne.displayName=sr;var ur="MenubarCheckboxItem",te=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Fe,{...s,...t,ref:n})});te.displayName=ur;var ir="MenubarRadioGroup",oe=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Ge,{...s,...t,ref:n})});oe.displayName=ir;var cr="MenubarRadioItem",se=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(qe,{...s,...t,ref:n})});se.displayName=cr;var dr="MenubarItemIndicator",ue=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Ve,{...s,...t,ref:n})});ue.displayName=dr;var lr="MenubarSeparator",ie=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Be,{...s,...t,ref:n})});ie.displayName=lr;var br="MenubarArrow",mr=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Ze,{...s,...t,ref:n})});mr.displayName=br;var ce="MenubarSub",de=r=>{const{__scopeMenubar:n,children:a,open:t,onOpenChange:s,defaultOpen:b}=r,p=m(n),[d,i]=$({prop:t,defaultProp:b??!1,onChange:s,caller:ce});return e.jsx(Oe,{...p,open:d,onOpenChange:i,children:a})};de.displayName=ce;var pr="MenubarSubTrigger",le=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Ke,{"data-radix-menubar-subtrigger":"",...s,...t,ref:n})});le.displayName=pr;var Mr="MenubarSubContent",be=u.forwardRef((r,n)=>{const{__scopeMenubar:a,...t}=r,s=m(a);return e.jsx(Le,{...s,"data-radix-menubar-content":"",...t,ref:n,style:{...r.style,"--radix-menubar-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-menubar-content-available-width":"var(--radix-popper-available-width)","--radix-menubar-content-available-height":"var(--radix-popper-available-height)","--radix-menubar-trigger-width":"var(--radix-popper-anchor-width)","--radix-menubar-trigger-height":"var(--radix-popper-anchor-height)"}})});be.displayName=Mr;function hr(r,n){return r.map((a,t)=>r[(n+t)%r.length])}var me=H,xr=Q,pe=Y,fr=ee,Me=re,he=ae,xe=ne,fe=te,gr=oe,ge=se,je=ue,ve=ie,jr=de,Se=le,Ce=be;const j=xr,P=jr,Ie=gr,y=u.forwardRef(({className:r,...n},a)=>e.jsx(me,{ref:a,className:I("flex h-10 items-center space-x-1 rounded-md border bg-background p-1",r),...n}));y.displayName=me.displayName;const h=u.forwardRef(({className:r,...n},a)=>e.jsx(pe,{ref:a,className:I("flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",r),...n}));h.displayName=pe.displayName;const E=u.forwardRef(({className:r,inset:n,children:a,...t},s)=>e.jsxs(Se,{ref:s,className:I("flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",n&&"pl-8",r),...t,children:[a,e.jsx(He,{className:"ml-auto h-4 w-4"})]}));E.displayName=Se.displayName;const k=u.forwardRef(({className:r,...n},a)=>e.jsx(Ce,{ref:a,className:I("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",r),...n}));k.displayName=Ce.displayName;const x=u.forwardRef(({className:r,align:n="start",alignOffset:a=-4,sideOffset:t=8,...s},b)=>e.jsx(fr,{children:e.jsx(Me,{ref:b,align:n,alignOffset:a,sideOffset:t,className:I("z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",r),...s})}));x.displayName=Me.displayName;const o=u.forwardRef(({className:r,inset:n,...a},t)=>e.jsx(xe,{ref:t,className:I("relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",n&&"pl-8",r),...a}));o.displayName=xe.displayName;const T=u.forwardRef(({className:r,children:n,checked:a,...t},s)=>e.jsxs(fe,{ref:s,className:I("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",r),checked:a,...t,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(je,{children:e.jsx(Je,{className:"h-4 w-4"})})}),n]}));T.displayName=fe.displayName;const w=u.forwardRef(({className:r,children:n,...a},t)=>e.jsxs(ge,{ref:t,className:I("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",r),...a,children:[e.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:e.jsx(je,{children:e.jsx(We,{className:"h-2 w-2 fill-current"})})}),n]}));w.displayName=ge.displayName;const vr=u.forwardRef(({className:r,inset:n,...a},t)=>e.jsx(he,{ref:t,className:I("px-2 py-1.5 text-sm font-semibold",n&&"pl-8",r),...a}));vr.displayName=he.displayName;const C=u.forwardRef(({className:r,...n},a)=>e.jsx(ve,{ref:a,className:I("-mx-1 my-1 h-px bg-muted",r),...n}));C.displayName=ve.displayName;const l=({className:r,...n})=>e.jsx("span",{className:I("ml-auto text-xs tracking-widest text-muted-foreground",r),...n});l.displayname="MenubarShortcut";function Sr(){const[r,n]=u.useState(!0),[a,t]=u.useState(!1),[s,b]=u.useState("pedro");return e.jsxs(y,{children:[e.jsxs(j,{children:[e.jsx(h,{children:"Arquivo"}),e.jsxs(x,{children:[e.jsxs(o,{children:["Nova Aba ",e.jsx(l,{children:"⌘T"})]}),e.jsxs(o,{children:["Nova Janela ",e.jsx(l,{children:"⌘N"})]}),e.jsx(o,{disabled:!0,children:"Nova Janela Anônima"}),e.jsx(C,{}),e.jsxs(P,{children:[e.jsx(E,{children:"Compartilhar"}),e.jsxs(k,{children:[e.jsx(o,{children:"Email"}),e.jsx(o,{children:"Mensagem"}),e.jsx(o,{children:"Notas"})]})]}),e.jsx(C,{}),e.jsxs(o,{children:["Imprimir... ",e.jsx(l,{children:"⌘P"})]})]})]}),e.jsxs(j,{children:[e.jsx(h,{children:"Editar"}),e.jsxs(x,{children:[e.jsxs(o,{children:["Desfazer ",e.jsx(l,{children:"⌘Z"})]}),e.jsxs(o,{children:["Refazer ",e.jsx(l,{children:"⇧⌘Z"})]}),e.jsx(C,{}),e.jsxs(o,{children:["Recortar ",e.jsx(l,{children:"⌘X"})]}),e.jsxs(o,{children:["Copiar ",e.jsx(l,{children:"⌘C"})]}),e.jsxs(o,{children:["Colar ",e.jsx(l,{children:"⌘V"})]})]})]}),e.jsxs(j,{children:[e.jsx(h,{children:"Visualizar"}),e.jsxs(x,{children:[e.jsx(T,{checked:r,onCheckedChange:n,children:"Mostrar Favoritos"}),e.jsx(T,{checked:a,onCheckedChange:t,children:"Mostrar URLs Completas"}),e.jsx(C,{}),e.jsxs(o,{inset:!0,children:["Recarregar ",e.jsx(l,{children:"⌘R"})]})]})]}),e.jsxs(j,{children:[e.jsx(h,{children:"Perfis"}),e.jsx(x,{children:e.jsxs(Ie,{value:s,onValueChange:b,children:[e.jsx(w,{value:"pedro",children:"Pedro"}),e.jsx(w,{value:"ana",children:"Ana"}),e.jsx(w,{value:"carlos",children:"Carlos"})]})})]})]})}function Cr(){const[r,n]=u.useState(!0),[a,t]=u.useState(!1),[s,b]=u.useState(!1);return e.jsx(y,{children:e.jsxs(j,{children:[e.jsx(h,{children:"Visualizar"}),e.jsxs(x,{children:[e.jsx(T,{checked:r,onCheckedChange:n,children:"Barra de Status"}),e.jsx(T,{checked:a,onCheckedChange:t,children:"Barra de Atividades"}),e.jsx(T,{checked:s,onCheckedChange:b,children:"Painel"})]})]})})}function Ir(){const[r,n]=u.useState("system");return e.jsx(y,{children:e.jsxs(j,{children:[e.jsx(h,{children:"Aparência"}),e.jsx(x,{children:e.jsxs(Ie,{value:r,onValueChange:n,children:[e.jsx(w,{value:"light",children:"Claro"}),e.jsx(w,{value:"dark",children:"Escuro"}),e.jsx(w,{value:"system",children:"Sistema"})]})})]})})}function Rr(){return e.jsx(y,{children:e.jsxs(j,{children:[e.jsx(h,{children:"Arquivo"}),e.jsxs(x,{children:[e.jsx(o,{children:"Novo Arquivo"}),e.jsx(o,{children:"Nova Pasta"}),e.jsx(C,{}),e.jsxs(P,{children:[e.jsx(E,{children:"Exportar como"}),e.jsxs(k,{children:[e.jsx(o,{children:"PDF"}),e.jsx(o,{children:"Word (.docx)"}),e.jsx(o,{children:"Excel (.xlsx)"}),e.jsxs(P,{children:[e.jsx(E,{children:"Imagem"}),e.jsxs(k,{children:[e.jsx(o,{children:"PNG"}),e.jsx(o,{children:"JPEG"}),e.jsx(o,{children:"SVG"})]})]})]})]}),e.jsxs(P,{children:[e.jsx(E,{children:"Compartilhar"}),e.jsxs(k,{children:[e.jsx(o,{children:"Email"}),e.jsx(o,{children:"Link"}),e.jsx(o,{children:"Redes Sociais"})]})]})]})]})})}function Nr(){return e.jsx(y,{children:e.jsxs(j,{children:[e.jsx(h,{children:"Editar"}),e.jsxs(x,{children:[e.jsxs(o,{children:["Desfazer ",e.jsx(l,{children:"⌘Z"})]}),e.jsxs(o,{children:["Refazer ",e.jsx(l,{children:"⇧⌘Z"})]}),e.jsx(C,{}),e.jsxs(o,{children:["Recortar ",e.jsx(l,{children:"⌘X"})]}),e.jsxs(o,{children:["Copiar ",e.jsx(l,{children:"⌘C"})]}),e.jsxs(o,{children:["Colar ",e.jsx(l,{children:"⌘V"})]}),e.jsx(C,{}),e.jsxs(o,{children:["Selecionar Tudo ",e.jsx(l,{children:"⌘A"})]}),e.jsxs(o,{children:["Buscar ",e.jsx(l,{children:"⌘F"})]}),e.jsxs(o,{children:["Substituir ",e.jsx(l,{children:"⌘H"})]})]})]})})}function yr(){return e.jsx(y,{children:e.jsxs(j,{children:[e.jsx(h,{children:"Arquivo"}),e.jsxs(x,{children:[e.jsx(o,{children:"Novo"}),e.jsx(o,{children:"Abrir"}),e.jsx(C,{}),e.jsx(o,{disabled:!0,children:"Salvar (sem alterações)"}),e.jsx(o,{children:"Salvar Como..."}),e.jsx(C,{}),e.jsx(o,{disabled:!0,children:"Reverter para Versão Anterior"}),e.jsx(o,{children:"Fechar"})]})]})})}function kr(){return e.jsx(Xe,{title:"Menubar",description:"Barra de menu horizontal com submenus, checkboxes e radio items. Ideal para barras de navegação de aplicações desktop-like, seguindo padrões de aplicações nativas.",component:e.jsx(Sr,{}),usage:`import {
2
+ Menubar,
3
+ MenubarContent,
4
+ MenubarItem,
5
+ MenubarMenu,
6
+ MenubarSeparator,
7
+ MenubarShortcut,
8
+ MenubarTrigger,
9
+ MenubarCheckboxItem,
10
+ MenubarRadioGroup,
11
+ MenubarRadioItem,
12
+ MenubarSub,
13
+ MenubarSubContent,
14
+ MenubarSubTrigger,
15
+ } from "forlogic-core"
16
+
17
+ // Exemplo básico
18
+ <Menubar>
19
+ <MenubarMenu>
20
+ <MenubarTrigger>Arquivo</MenubarTrigger>
21
+ <MenubarContent>
22
+ <MenubarItem>
23
+ Novo <MenubarShortcut>⌘N</MenubarShortcut>
24
+ </MenubarItem>
25
+ <MenubarItem>Abrir</MenubarItem>
26
+ <MenubarSeparator />
27
+ <MenubarItem>Sair</MenubarItem>
28
+ </MenubarContent>
29
+ </MenubarMenu>
30
+ </Menubar>
31
+
32
+ // Com checkbox items
33
+ const [showBar, setShowBar] = useState(true);
34
+
35
+ <MenubarCheckboxItem
36
+ checked={showBar}
37
+ onCheckedChange={setShowBar}
38
+ >
39
+ Mostrar Barra
40
+ </MenubarCheckboxItem>
41
+
42
+ // Com radio group
43
+ const [theme, setTheme] = useState("light");
44
+
45
+ <MenubarRadioGroup value={theme} onValueChange={setTheme}>
46
+ <MenubarRadioItem value="light">Claro</MenubarRadioItem>
47
+ <MenubarRadioItem value="dark">Escuro</MenubarRadioItem>
48
+ </MenubarRadioGroup>
49
+
50
+ // Com submenus
51
+ <MenubarSub>
52
+ <MenubarSubTrigger>Exportar</MenubarSubTrigger>
53
+ <MenubarSubContent>
54
+ <MenubarItem>PDF</MenubarItem>
55
+ <MenubarItem>Word</MenubarItem>
56
+ </MenubarSubContent>
57
+ </MenubarSub>`,examples:[{title:"Menu Simples",description:"Menubar básico com múltiplos menus e itens.",preview:e.jsxs(y,{children:[e.jsxs(j,{children:[e.jsx(h,{children:"Arquivo"}),e.jsxs(x,{children:[e.jsx(o,{children:"Novo"}),e.jsx(o,{children:"Abrir"}),e.jsx(C,{}),e.jsx(o,{children:"Salvar"})]})]}),e.jsxs(j,{children:[e.jsx(h,{children:"Editar"}),e.jsxs(x,{children:[e.jsx(o,{children:"Desfazer"}),e.jsx(o,{children:"Refazer"})]})]}),e.jsxs(j,{children:[e.jsx(h,{children:"Ajuda"}),e.jsxs(x,{children:[e.jsx(o,{children:"Documentação"}),e.jsx(o,{children:"Sobre"})]})]})]}),code:`<Menubar>
58
+ <MenubarMenu>
59
+ <MenubarTrigger>Arquivo</MenubarTrigger>
60
+ <MenubarContent>
61
+ <MenubarItem>Novo</MenubarItem>
62
+ <MenubarItem>Abrir</MenubarItem>
63
+ <MenubarSeparator />
64
+ <MenubarItem>Salvar</MenubarItem>
65
+ </MenubarContent>
66
+ </MenubarMenu>
67
+ <MenubarMenu>
68
+ <MenubarTrigger>Editar</MenubarTrigger>
69
+ <MenubarContent>
70
+ <MenubarItem>Desfazer</MenubarItem>
71
+ <MenubarItem>Refazer</MenubarItem>
72
+ </MenubarContent>
73
+ </MenubarMenu>
74
+ </Menubar>`},{title:"Atalhos de Teclado",description:"Exibição de atalhos de teclado junto aos itens do menu.",preview:e.jsx(Nr,{}),code:`<Menubar>
75
+ <MenubarMenu>
76
+ <MenubarTrigger>Editar</MenubarTrigger>
77
+ <MenubarContent>
78
+ <MenubarItem>
79
+ Desfazer <MenubarShortcut>⌘Z</MenubarShortcut>
80
+ </MenubarItem>
81
+ <MenubarItem>
82
+ Refazer <MenubarShortcut>⇧⌘Z</MenubarShortcut>
83
+ </MenubarItem>
84
+ <MenubarSeparator />
85
+ <MenubarItem>
86
+ Recortar <MenubarShortcut>⌘X</MenubarShortcut>
87
+ </MenubarItem>
88
+ <MenubarItem>
89
+ Copiar <MenubarShortcut>⌘C</MenubarShortcut>
90
+ </MenubarItem>
91
+ <MenubarItem>
92
+ Colar <MenubarShortcut>⌘V</MenubarShortcut>
93
+ </MenubarItem>
94
+ </MenubarContent>
95
+ </MenubarMenu>
96
+ </Menubar>`},{title:"Checkbox Items",description:"Itens com checkbox para alternar opções de visualização.",preview:e.jsx(Cr,{}),code:`const [showStatusBar, setShowStatusBar] = useState(true);
97
+ const [showActivityBar, setShowActivityBar] = useState(false);
98
+
99
+ <Menubar>
100
+ <MenubarMenu>
101
+ <MenubarTrigger>Visualizar</MenubarTrigger>
102
+ <MenubarContent>
103
+ <MenubarCheckboxItem
104
+ checked={showStatusBar}
105
+ onCheckedChange={setShowStatusBar}
106
+ >
107
+ Barra de Status
108
+ </MenubarCheckboxItem>
109
+ <MenubarCheckboxItem
110
+ checked={showActivityBar}
111
+ onCheckedChange={setShowActivityBar}
112
+ >
113
+ Barra de Atividades
114
+ </MenubarCheckboxItem>
115
+ </MenubarContent>
116
+ </MenubarMenu>
117
+ </Menubar>`},{title:"Radio Group",description:"Grupo de opções mutuamente exclusivas (apenas uma pode ser selecionada).",preview:e.jsx(Ir,{}),code:`const [theme, setTheme] = useState("system");
118
+
119
+ <Menubar>
120
+ <MenubarMenu>
121
+ <MenubarTrigger>Aparência</MenubarTrigger>
122
+ <MenubarContent>
123
+ <MenubarRadioGroup value={theme} onValueChange={setTheme}>
124
+ <MenubarRadioItem value="light">Claro</MenubarRadioItem>
125
+ <MenubarRadioItem value="dark">Escuro</MenubarRadioItem>
126
+ <MenubarRadioItem value="system">Sistema</MenubarRadioItem>
127
+ </MenubarRadioGroup>
128
+ </MenubarContent>
129
+ </MenubarMenu>
130
+ </Menubar>`},{title:"Submenus Aninhados",description:"Menus com submenus para organização hierárquica de opções.",preview:e.jsx(Rr,{}),code:`<Menubar>
131
+ <MenubarMenu>
132
+ <MenubarTrigger>Arquivo</MenubarTrigger>
133
+ <MenubarContent>
134
+ <MenubarItem>Novo Arquivo</MenubarItem>
135
+ <MenubarSeparator />
136
+ <MenubarSub>
137
+ <MenubarSubTrigger>Exportar como</MenubarSubTrigger>
138
+ <MenubarSubContent>
139
+ <MenubarItem>PDF</MenubarItem>
140
+ <MenubarItem>Word (.docx)</MenubarItem>
141
+ <MenubarSub>
142
+ <MenubarSubTrigger>Imagem</MenubarSubTrigger>
143
+ <MenubarSubContent>
144
+ <MenubarItem>PNG</MenubarItem>
145
+ <MenubarItem>JPEG</MenubarItem>
146
+ </MenubarSubContent>
147
+ </MenubarSub>
148
+ </MenubarSubContent>
149
+ </MenubarSub>
150
+ </MenubarContent>
151
+ </MenubarMenu>
152
+ </Menubar>`},{title:"Itens Desabilitados",description:"Itens que não podem ser selecionados em determinadas condições.",preview:e.jsx(yr,{}),code:`<Menubar>
153
+ <MenubarMenu>
154
+ <MenubarTrigger>Arquivo</MenubarTrigger>
155
+ <MenubarContent>
156
+ <MenubarItem>Novo</MenubarItem>
157
+ <MenubarItem>Abrir</MenubarItem>
158
+ <MenubarSeparator />
159
+ <MenubarItem disabled>Salvar (sem alterações)</MenubarItem>
160
+ <MenubarItem>Salvar Como...</MenubarItem>
161
+ <MenubarSeparator />
162
+ <MenubarItem disabled>Reverter para Versão Anterior</MenubarItem>
163
+ </MenubarContent>
164
+ </MenubarMenu>
165
+ </Menubar>`}],props:[{name:"Menubar",type:"ReactNode",default:"-",description:"Container principal da barra de menu."},{name:"MenubarMenu",type:"ReactNode",default:"-",description:"Agrupa um trigger e seu conteúdo."},{name:"MenubarTrigger",type:"ReactNode",default:"-",description:"Botão que abre o menu dropdown."},{name:"MenubarContent",type:"ReactNode",default:"-",description:"Container do conteúdo do menu dropdown."},{name:"MenubarItem",type:"ReactNode",default:"-",description:'Item clicável do menu. Aceita prop "disabled" e "inset".'},{name:"MenubarShortcut",type:"string",default:"-",description:"Exibe atalho de teclado ao lado do item."},{name:"MenubarSeparator",type:"-",default:"-",description:"Linha separadora entre grupos de itens."},{name:"MenubarCheckboxItem",type:"ReactNode",default:"-",description:"Item com checkbox. Props: checked, onCheckedChange."},{name:"MenubarRadioGroup",type:"ReactNode",default:"-",description:"Container para radio items. Props: value, onValueChange."},{name:"MenubarRadioItem",type:"ReactNode",default:"-",description:"Item de radio dentro do RadioGroup. Prop: value."},{name:"MenubarSub",type:"ReactNode",default:"-",description:"Container para submenu aninhado."},{name:"MenubarSubTrigger",type:"ReactNode",default:"-",description:"Trigger que abre o submenu."},{name:"MenubarSubContent",type:"ReactNode",default:"-",description:"Conteúdo do submenu."}],accessibility:["Navegação completa por teclado (setas, Enter, Escape, Tab)","Segue padrão WAI-ARIA de menubar","Submenus acessíveis via seta direita/esquerda","Gerenciamento de foco automático","Suporte a leitor de tela com roles apropriados","Escape fecha o menu atual e retorna foco ao trigger"],notes:["Use MenubarSeparator para agrupar visualmente itens relacionados","MenubarShortcut é apenas visual - implemente os atalhos separadamente","Submenus podem ser aninhados em múltiplos níveis",'Use "inset" em MenubarItem quando precisar alinhar com CheckboxItems/RadioItems',"Para menus contextuais (clique direito), use ContextMenu ao invés de Menubar"]})}export{kr as MenubarDoc};
@@ -0,0 +1,153 @@
1
+ import{j as e,x as g,em as D,r as v,gN as A,Y as x,dY as P,a as l,b as i,c as t,B as u,d as n,T as h,i as p,k as a,l as o,p as j,q as s}from"./index-DkiftrvI.js";import{C as R}from"./ComponentDocTemplate-CQbBhfvZ.js";import{C as m,E as f}from"./ExampleCard-DuLrb3t-.js";import{S as O,G as M}from"./shield-x-DJTRfVux.js";function S({title:c,description:d,image:r,icon:N,ctaLabel:k="Quero conhecer mais",onCtaClick:C,children:b}){return e.jsxs("div",{className:"flex flex-col items-center text-center gap-6 py-8 px-4",children:[!b&&(r||N)&&e.jsx("div",{className:"flex items-center justify-center",children:r?e.jsx("img",{src:r,alt:c,className:"max-h-48 w-auto object-contain rounded-lg"}):N?e.jsx("div",{className:"w-24 h-24 rounded-2xl bg-primary/10 flex items-center justify-center",children:e.jsx(N,{className:"h-12 w-12 text-primary"})}):null}),e.jsxs("div",{className:"space-y-3 max-w-lg",children:[e.jsx("h3",{className:"text-xl font-semibold text-foreground",children:c}),e.jsx("p",{className:"text-sm text-muted-foreground leading-relaxed",children:d})]}),b?e.jsx("div",{className:"w-full",children:b}):C?e.jsxs(g,{onClick:C,size:"lg",className:"gap-2",children:[e.jsx(D,{className:"h-4 w-4"}),k]}):null]})}const y=[{alias:"matriz",name:"Matriz - São Paulo"},{alias:"filial-rj",name:"Filial Rio de Janeiro"},{alias:"filial-mg",name:"Filial Belo Horizonte"}],q=["Análises","Atas e Decisões","Configurações","Documentos","Fornecedores","Mapeamentos","Metrologia","Ocorrências","OKR","Portal do Fornecedor","Desempenho","Pulso","Action","Audit","Configurações v3","Dashboards v1","Docs v1","Indicators","Meeting","Metrology v3","Planner","Relatórios v1","Risks","Staff","Supply","Tracker1","Tracker2"];function T(){const[c,d]=v.useState(!1);return e.jsxs("div",{className:"flex flex-col items-center gap-4 p-8 border rounded-lg bg-muted/30",children:[e.jsx("p",{className:"text-muted-foreground text-center",children:"Clique no botão abaixo para simular o dialog de acesso negado com seletor de unidade"}),e.jsxs(g,{onClick:()=>d(!0),children:[e.jsx(O,{className:"h-4 w-4 mr-2"}),"Abrir Dialog de Acesso Negado"]}),e.jsx(A,{open:c,onOpenChange:d,userName:"João Silva",unitName:"Matriz - São Paulo",units:y,currentAlias:"matriz",onUnitChange:r=>x.info(`Trocando para: ${r.name}`),onLogout:()=>x.info("Logout realizado"),onModuleClick:r=>{x.success(`Navegando para: ${r.name}`),d(!1)},blocking:!1})]})}function w(){const[c,d]=v.useState(!1);return e.jsxs("div",{className:"flex flex-col items-center gap-4 p-8 border rounded-lg bg-muted/30",children:[e.jsx("p",{className:"text-muted-foreground text-center",children:"Exemplo de oferta focada para quando o usuário acessa um módulo não contratado — via WebView, deep link, link compartilhado ou qualquer outra origem"}),e.jsxs(g,{onClick:()=>d(!0),children:[e.jsx(M,{className:"h-4 w-4 mr-2"}),"Abrir Dialog de Oferta"]}),e.jsx(A,{open:c,onOpenChange:d,userName:"João Silva",unitName:"Matriz - São Paulo",units:y,currentAlias:"matriz",onUnitChange:r=>x.info(`Trocando para: ${r.name}`),onLogout:()=>x.info("Logout realizado"),size:"md",blocking:!1,children:e.jsx(S,{title:"Conheça o módulo Educação, da suíte SABER.",description:"Garanta rastreabilidade da qualificação das pessoas e evidências claras de capacitação para atender a norma 9001, auditorias e exigências legais!",icon:M,ctaLabel:"Falar com especialista",onCtaClick:()=>{x.success("Redirecionando para o chat com especialista..."),d(!1)}})})]})}function z(){const[c,d]=v.useState(!1);return e.jsxs("div",{className:"flex flex-col items-center gap-4 p-8 border rounded-lg bg-muted/30",children:[e.jsx("p",{className:"text-muted-foreground text-center",children:"Exemplo com separação entre módulos contratados e disponíveis para contratação"}),e.jsxs(g,{onClick:()=>d(!0),children:[e.jsx(P,{className:"h-4 w-4 mr-2"}),"Abrir com Módulos Contratados"]}),e.jsx(A,{open:c,onOpenChange:d,userName:"Maria Santos",unitName:"Filial Rio de Janeiro",units:y,currentAlias:"filial-rj",onUnitChange:r=>x.info(`Trocando para: ${r.name}`),onLogout:()=>x.info("Logout realizado"),onModuleClick:r=>{x.success(`Navegando para: ${r.name}`),d(!1)},onModuleInterest:r=>{x.info(`Interesse registrado no módulo: ${r.name}`)},contractedModules:q,blocking:!1})]})}const G=[{id:"visao-geral",label:"Visão Geral"},{id:"module-access-guard",label:"ModuleAccessGuard"},{id:"bypass-paths",label:"Bypass de Rotas"},{id:"access-denied-routes",label:"Rotas com Dialog Customizado"},{id:"oferta-modulo",label:"Oferta de Módulo"},{id:"troca-de-unidade",label:"Troca de Unidade"},{id:"use-module-access",label:"useModuleAccess"},{id:"api-reference",label:"API Reference"},{id:"cache-e-performance",label:"Cache e Performance"},{id:"aliases-disponiveis",label:"Aliases Disponíveis"}];function I(){return e.jsxs(R,{title:"Acesso Módulo (ModuleAccess)",description:"Sistema de autorização para verificar e bloquear acesso a módulos da plataforma Qualiex. Proteção automática de rotas via CoreProviders e hook para verificações programáticas.",usage:`// Proteção automática via CoreProviders
2
+ <CoreProviders moduleAlias="occurrences">
3
+ <App />
4
+ </CoreProviders>
5
+
6
+ // Verificação programática via hook
7
+ const { hasAccess, hasAccessTo, role } = useModuleAccess();
8
+ if (hasAccessTo('audit')) { /* ... */ }`,tocItems:G,children:[e.jsxs(l,{id:"visao-geral",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsxs(t,{className:"flex items-center gap-2",children:["Visão Geral",e.jsx(u,{variant:"secondary",children:"Guard + Hook"})]})}),e.jsxs(n,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"border rounded-lg p-4 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(u,{children:"Camada 1"}),e.jsx("span",{className:"font-semibold text-sm",children:"ModuleAccessGuard"})]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Integrado ao ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"CoreProviders"}),", ",e.jsx("strong",{children:"bloqueia automaticamente todas as rotas"})," quando o usuário não tem acesso ao módulo configurado. Zero configuração — basta definir ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"moduleAlias"}),"."]})]}),e.jsxs("div",{className:"border rounded-lg p-4 space-y-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(u,{variant:"outline",children:"Camada 2"}),e.jsx("span",{className:"font-semibold text-sm",children:"useModuleAccess"})]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hook para ",e.jsx("strong",{children:"verificações programáticas"})," — exibir/ocultar links, condicionar funcionalidades, verificar acesso a outros módulos, acessar dados do role."]})]})]}),e.jsx(m,{code:`// App.tsx — Configuração mínima para proteção automática
9
+ import { CoreProviders } from 'forlogic-core';
10
+ import { BrowserRouter, Routes, Route } from 'react-router-dom';
11
+
12
+ function App() {
13
+ return (
14
+ // ✅ Basta definir moduleAlias — todas as rotas ficam protegidas
15
+ <CoreProviders moduleAlias="performance">
16
+ <BrowserRouter>
17
+ <Routes>
18
+ <Route path="/" element={<Dashboard />} />
19
+ <Route path="/settings" element={<Settings />} />
20
+ </Routes>
21
+ </BrowserRouter>
22
+ </CoreProviders>
23
+ );
24
+ }`,language:"tsx"}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-4 space-y-3",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"O que acontece automaticamente:"}),e.jsxs("div",{className:"space-y-2 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-primary font-mono text-xs mt-0.5",children:"1."}),e.jsxs("p",{children:[e.jsx("strong",{children:"Enquanto carrega"})," — Spinner centralizado enquanto verifica as permissões."]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-primary font-mono text-xs mt-0.5",children:"2."}),e.jsxs("p",{children:[e.jsx("strong",{children:"Se tem acesso"})," — Renderiza a aplicação normalmente."]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-primary font-mono text-xs mt-0.5",children:"3."}),e.jsxs("p",{children:[e.jsx("strong",{children:"Se NÃO tem acesso"})," — Dialog não-fechável com grid de módulos para navegação."]})]})]})]}),e.jsx("div",{className:"bg-amber-50 dark:bg-amber-950/30 border border-amber-200 dark:border-amber-800 rounded-lg p-3",children:e.jsxs("p",{className:"text-sm text-amber-800 dark:text-amber-200",children:[e.jsx("strong",{children:"⚠️ Sem moduleAlias:"})," O guard é transparente — ",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:"hasAccess"})," retorna",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:" true"})," por padrão e nenhuma rota é bloqueada. A query de associações ",e.jsx("strong",{children:"continua disponível"})," para uso pelo ",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:"ModulesDialog"})," e pelo ",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:"hasAccessTo"}),". O ",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:"moduleAlias"})," deve corresponder a um alias válido do",e.jsx("a",{href:"#aliases-disponiveis",className:"underline ml-1",children:"SOFTWARES_MAP"}),"."]})})]})]}),e.jsxs(l,{id:"module-access-guard",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsxs(t,{className:"flex items-center gap-2",children:["ModuleAccessGuard",e.jsx(u,{variant:"secondary",children:"Componente"})]})}),e.jsxs(n,{className:"space-y-6",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Já integrado no ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"CoreProviders"}),". O dialog de acesso negado reutiliza o ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"ModulesContent"})," — o mesmo componente usado pelo"," ",e.jsx("a",{href:"/ds/modules-dialog",className:"underline font-medium",children:"ModulesDialog"}),"."]}),e.jsx("div",{className:"bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 rounded-lg p-3",children:e.jsxs("p",{className:"text-sm text-blue-800 dark:text-blue-200",children:[e.jsx("strong",{children:"ℹ️ Transparência:"})," O guard renderiza ",e.jsx("code",{className:"text-xs bg-blue-100 dark:bg-blue-900 px-1 py-0.5 rounded",children:"children"})," diretamente (sem spinner ou bloqueio) quando o auth ainda está carregando (",e.jsx("code",{className:"text-xs bg-blue-100 dark:bg-blue-900 px-1 py-0.5 rounded",children:"authIsLoading"}),") ou quando o usuário não está autenticado (",e.jsx("code",{className:"text-xs bg-blue-100 dark:bg-blue-900 px-1 py-0.5 rounded",children:"!isAuthenticated"}),"). Isso garante que fluxos de login e o ",e.jsx("code",{className:"text-xs bg-blue-100 dark:bg-blue-900 px-1 py-0.5 rounded",children:"ProtectedRoute"})," funcionem normalmente."]})}),e.jsx(f,{title:"Dialog de Acesso Negado",description:"O dialog exibido quando o usuário não tem acesso ao módulo. Inclui seletor de unidade e menu do usuário no header.",preview:e.jsx(T,{}),code:`<CoreProviders
25
+ moduleAlias="performance"
26
+ moduleAccessGuardProps={{
27
+ onModuleClick: (module) => {
28
+ window.location.href = module.url;
29
+ },
30
+ }}
31
+ >
32
+ <App />
33
+ </CoreProviders>`}),e.jsx(f,{title:"Com Módulos Contratados",description:"Módulos contratados aparecem normais. Não contratados ficam esmaecidos e abrem OnboardingDialog ao clicar.",preview:e.jsx(z,{}),code:`<CoreProviders
34
+ moduleAlias="performance"
35
+ moduleAccessGuardProps={{
36
+ contractedModules: ['Desempenho', 'Ocorrências', 'Planos de Ação'],
37
+ onModuleInterest: (module) => {
38
+ analytics.track('module_interest', { module: module.name });
39
+ },
40
+ }}
41
+ >
42
+ <App />
43
+ </CoreProviders>
44
+
45
+ // ⚡ Se contractedModules não for fornecido,
46
+ // os módulos são derivados automaticamente via SOFTWARES_MAP.`}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Props do ModuleAccessGuard"}),e.jsxs(h,{children:[e.jsx(p,{children:e.jsxs(a,{children:[e.jsx(o,{children:"Prop"}),e.jsx(o,{children:"Tipo"}),e.jsx(o,{children:"Default"}),e.jsx(o,{children:"Descrição"})]})}),e.jsxs(j,{children:[e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"children"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"ReactNode"})}),e.jsx(s,{children:"—"}),e.jsx(s,{className:"text-sm",children:"Conteúdo renderizado quando o usuário tem acesso"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"contractedModules"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string[]?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsx(s,{className:"text-sm",children:"Nomes dos módulos contratados. Se omitido, derivado automaticamente do SOFTWARES_MAP"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"onModuleClick"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"(module: Module) => void"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsx(s,{className:"text-sm",children:"Callback ao clicar em módulo contratado. Default: navega via URL"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"onModuleInterest"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"(module: Module) => void"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsx(s,{className:"text-sm",children:"Callback após onboarding de módulo não contratado"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"educaUrl"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:'"https://educa..."'})}),e.jsx(s,{className:"text-sm",children:"URL do Forlogic Educa no footer"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"saberGestaoUrl"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:'"https://saber..."'})}),e.jsx(s,{className:"text-sm",children:"URL do Saber Gestão no footer"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"bypassPaths"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string[]?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsxs(s,{className:"text-sm",children:["Rotas que ignoram o guard. Suporta glob simples com ",e.jsx("code",{className:"text-xs",children:"*"})]})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"accessDeniedRoutes"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"Record<string, ReactNode>"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsxs(s,{className:"text-sm",children:["Mapa de rotas → conteúdo customizado no dialog. Suporta glob com ",e.jsx("code",{className:"text-xs",children:"*"})]})]})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Quando usar cada variante"}),e.jsxs(h,{children:[e.jsx(p,{children:e.jsxs(a,{children:[e.jsx(o,{children:"Cenário"}),e.jsx(o,{children:"Variante"}),e.jsx(o,{children:"Quando usar"})]})}),e.jsxs(j,{children:[e.jsxs(a,{children:[e.jsx(s,{className:"text-sm font-medium",children:"App standalone (SPA)"}),e.jsxs(s,{className:"text-sm",children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"ModuleAccessGuard"})," via CoreProviders"]}),e.jsx(s,{className:"text-sm text-muted-foreground",children:"Padrão. Grid completo de módulos."})]}),e.jsxs(a,{children:[e.jsx(s,{className:"text-sm font-medium",children:"WebView / Deep link"}),e.jsxs(s,{className:"text-sm",children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"AccessDeniedDialog"})," + ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"ModuleOfferContent"})]}),e.jsx(s,{className:"text-sm text-muted-foreground",children:"Oferta focada em vez do grid."})]}),e.jsxs(a,{children:[e.jsx(s,{className:"text-sm font-medium",children:"Conteúdo customizado"}),e.jsxs(s,{className:"text-sm",children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"AccessDeniedDialog"})," + ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"children"})]}),e.jsx(s,{className:"text-sm text-muted-foreground",children:"Qualquer ReactNode livre."})]})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Uso Manual (standalone)"}),e.jsx(m,{code:`import { ModuleAccessGuard } from 'forlogic-core';
47
+
48
+ // Proteger apenas uma seção específica
49
+ function AdminSection() {
50
+ return (
51
+ <ModuleAccessGuard contractedModules={['Desempenho', 'Ocorrências']}>
52
+ <AdminDashboard />
53
+ </ModuleAccessGuard>
54
+ );
55
+ }`,language:"tsx"})]})]})]}),e.jsxs(l,{id:"bypass-paths",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsxs(t,{className:"flex items-center gap-2",children:["Bypass de Rotas",e.jsx(u,{className:"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",children:"Novo"})]})}),e.jsxs(n,{className:"space-y-6",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Use ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"bypassPaths"})," para liberar rotas específicas do guard — útil para páginas públicas, deep links ou rotas que precisam ser acessíveis mesmo sem acesso ao módulo."]}),e.jsx(m,{code:`// Liberar rotas específicas do guard
56
+ <CoreProviders
57
+ moduleAlias="staff"
58
+ moduleAccessGuardProps={{
59
+ bypassPaths: ['/docs/matrix-link', '/public/*'],
60
+ }}
61
+ >
62
+ <BrowserRouter>
63
+ <Routes>
64
+ <Route path="/docs/matrix-link" element={<MatrixLink />} />
65
+ <Route path="/public/terms" element={<Terms />} />
66
+ <Route path="/" element={<Dashboard />} />
67
+ </Routes>
68
+ </BrowserRouter>
69
+ </CoreProviders>`,language:"tsx"}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-4 space-y-2 text-sm text-muted-foreground",children:[e.jsx("h4",{className:"font-semibold text-foreground",children:"Regras de matching"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 ml-2",children:[e.jsxs("li",{children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"/docs/matrix-link"})," — match exato"]}),e.jsxs("li",{children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"/public/*"})," — glob simples, faz match com qualquer path que comece com ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"/public/"})]})]}),e.jsxs("p",{className:"mt-2",children:["O pathname é lido de ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"window.location.pathname"})," (sem dependência do React Router)."]})]})]})]}),e.jsxs(l,{id:"access-denied-routes",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsxs(t,{className:"flex items-center gap-2",children:["Rotas com Dialog Customizado",e.jsx(u,{className:"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",children:"Novo"})]})}),e.jsxs(n,{className:"space-y-6",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Use ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"accessDeniedRoutes"})," para exibir conteúdo personalizado no dialog de acesso negado em rotas específicas. O header (unit switcher) e footer (links de apoio) são preservados. Rotas sem match exibem o grid padrão de módulos."]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"1. Defina o mapa em arquivo separado"}),e.jsx(m,{code:`// src/config/accessDeniedRoutes.tsx
70
+ import { ModuleOfferContent } from 'forlogic-core';
71
+
72
+ export const accessDeniedRoutes: Record<string, React.ReactNode> = {
73
+ '/docs/matrix-link': (
74
+ <ModuleOfferContent
75
+ title="Conheça o módulo Staff"
76
+ description="Gerencie sua equipe com eficiência"
77
+ onCtaClick={() => window.open('https://...')}
78
+ />
79
+ ),
80
+ '/reports/*': (
81
+ <ModuleOfferContent
82
+ title="Relatórios avançados"
83
+ description="Desbloqueie relatórios completos"
84
+ ctaLabel="Falar com especialista"
85
+ onCtaClick={() => window.open('https://...')}
86
+ />
87
+ ),
88
+ };`,language:"tsx"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"2. Importe no App.tsx"}),e.jsx(m,{code:`// App.tsx — limpo, sem lógica de UI
89
+ import { accessDeniedRoutes } from './config/accessDeniedRoutes';
90
+
91
+ <CoreProviders
92
+ moduleAlias="staff"
93
+ moduleAccessGuardProps={{
94
+ accessDeniedRoutes,
95
+ }}
96
+ >
97
+ <App />
98
+ </CoreProviders>`,language:"tsx"})]}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-4 space-y-2 text-sm text-muted-foreground",children:[e.jsx("h4",{className:"font-semibold text-foreground",children:"Combinando com bypassPaths"}),e.jsxs("p",{children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"bypassPaths"})," libera a rota completamente (renderiza a página)."," ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"accessDeniedRoutes"})," mantém o bloqueio mas personaliza o dialog. As duas props são independentes e complementares."]}),e.jsx(m,{code:`<CoreProviders
99
+ moduleAlias="staff"
100
+ moduleAccessGuardProps={{
101
+ // Rotas públicas — bypass total
102
+ bypassPaths: ['/public/*'],
103
+ // Rotas bloqueadas com oferta customizada
104
+ accessDeniedRoutes: {
105
+ '/docs/*': <ModuleOfferContent title="Oferta Documentos" ... />,
106
+ },
107
+ }}
108
+ />`,language:"tsx"})]}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-4 space-y-2 text-sm text-muted-foreground",children:[e.jsx("h4",{className:"font-semibold text-foreground",children:"Regras de matching"}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 ml-2",children:[e.jsxs("li",{children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"/docs/matrix-link"})," — match exato"]}),e.jsxs("li",{children:[e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"/reports/*"})," — glob simples, faz match com qualquer path que comece com ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"/reports/"})]}),e.jsx("li",{children:"Sem match → grid padrão de módulos (comportamento default)"})]})]})]})]}),e.jsxs(l,{id:"oferta-modulo",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsxs(t,{className:"flex items-center gap-2",children:["Oferta de Módulo",e.jsx(u,{className:"bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200",children:"Novo"})]})}),e.jsxs(n,{className:"space-y-6",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Para acessos via WebView, deep link ou integração externa, exiba uma ",e.jsx("strong",{children:"oferta focada"})," no módulo em vez do grid completo. Passe ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"children"})," ao"," ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"AccessDeniedDialog"})," — substitui o grid mantendo header e footer."]}),e.jsx(f,{title:"Dialog de Oferta de Módulo",description:"Oferta focada com título, descrição, ícone e botão CTA.",preview:e.jsx(w,{}),code:`import { AccessDeniedDialog, ModuleOfferContent } from 'forlogic-core';
109
+ import { GraduationCap } from 'lucide-react';
110
+
111
+ <AccessDeniedDialog open blocking size="md"
112
+ userName={user.name} unitName={unit.name}
113
+ units={units} onUnitChange={switchUnit} onLogout={logout}
114
+ >
115
+ <ModuleOfferContent
116
+ title="Conheça o módulo Educação"
117
+ description="Garanta rastreabilidade da qualificação..."
118
+ icon={GraduationCap}
119
+ ctaLabel="Falar com especialista"
120
+ onCtaClick={() => openChat()}
121
+ />
122
+ </AccessDeniedDialog>`}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"ModuleOfferContent — Props"}),e.jsxs(h,{children:[e.jsx(p,{children:e.jsxs(a,{children:[e.jsx(o,{children:"Prop"}),e.jsx(o,{children:"Tipo"}),e.jsx(o,{children:"Default"}),e.jsx(o,{children:"Descrição"})]})}),e.jsxs(j,{children:[e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"title"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string"})}),e.jsx(s,{children:"—"}),e.jsx(s,{className:"text-sm",children:"Título da oferta"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"description"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string"})}),e.jsx(s,{children:"—"}),e.jsx(s,{className:"text-sm",children:"Descrição da oferta"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"image"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsx(s,{className:"text-sm",children:"URL de imagem/ilustração"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"icon"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"ComponentType?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsx(s,{className:"text-sm",children:"Ícone alternativo à imagem"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"ctaLabel"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:'"Quero conhecer mais"'})}),e.jsx(s,{className:"text-sm",children:"Texto do botão CTA"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"onCtaClick"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"() => void"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsx(s,{className:"text-sm",children:"Ação do botão CTA"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"children"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"ReactNode?"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"undefined"})}),e.jsx(s,{className:"text-sm",children:"Conteúdo livre — substitui imagem + CTA"})]})]})]})]})]})]}),e.jsxs(l,{id:"troca-de-unidade",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsx(t,{className:"flex items-center gap-2",children:"Troca de Unidade"})}),e.jsxs(n,{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["O dialog de acesso negado inclui automaticamente um ",e.jsx("strong",{children:"seletor de unidade"})," e ",e.jsx("strong",{children:"menu do usuário"})," no header. Dados vêm do ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"useAuth"})," — zero configuração."]}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-4 space-y-2 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-primary font-mono text-xs mt-0.5",children:"1."}),e.jsxs("p",{children:[e.jsx("strong",{children:"Seletor de unidade"})," — Aparece quando o usuário tem múltiplas unidades."]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-primary font-mono text-xs mt-0.5",children:"2."}),e.jsxs("p",{children:[e.jsx("strong",{children:"Ao trocar"})," — ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"switchUnit"})," é chamado, cache limpo, permissões reavaliadas."]})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-primary font-mono text-xs mt-0.5",children:"3."}),e.jsxs("p",{children:[e.jsx("strong",{children:"Fechamento automático"})," — Se a nova unidade tiver acesso, o dialog fecha automaticamente."]})]})]})]})]}),e.jsxs(l,{id:"use-module-access",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsxs(t,{className:"flex items-center gap-2",children:["useModuleAccess",e.jsx(u,{variant:"secondary",children:"Hook"})]})}),e.jsxs(n,{className:"space-y-6",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Hook para verificações programáticas dentro dos componentes. ",e.jsx("strong",{children:"Não é necessário para bloquear rotas"})," — o guard já faz isso. O ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"ModulesDialog"})," também usa este hook internamente para derivar automaticamente a lista de módulos contratados quando ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"contractedModules"})," não é fornecido via props."]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Uso básico"}),e.jsx(m,{code:`import { useModuleAccess } from 'forlogic-core';
123
+
124
+ function Dashboard() {
125
+ const { hasAccess, isLoading, role } = useModuleAccess();
126
+
127
+ return (
128
+ <div>
129
+ <p>Seu papel: {role?.name}</p>
130
+ <p>Empresa: {association?.companyName}</p>
131
+ </div>
132
+ );
133
+ }`,language:"tsx"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Verificar acesso a outros módulos"}),e.jsx(m,{code:`function Navigation() {
134
+ const { hasAccessTo } = useModuleAccess();
135
+
136
+ return (
137
+ <nav>
138
+ {hasAccessTo('occurrences') && <Link to="/occurrences">Ocorrências</Link>}
139
+ {hasAccessTo('audit') && <Link to="/audit">Auditorias</Link>}
140
+ {/* Array = AND (todos os módulos) */}
141
+ {hasAccessTo(['suppliers', 'suppliers-portal']) && (
142
+ <Link to="/suppliers">Fornecedores + Portal</Link>
143
+ )}
144
+ </nav>
145
+ );
146
+ }`,language:"tsx"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Override e dados da associação"}),e.jsx(m,{code:`// Override — ignora moduleAlias do CoreProviders
147
+ const { hasAccess } = useModuleAccess('audit');
148
+
149
+ // Dados da associação
150
+ const { association, role } = useModuleAccess();
151
+ console.log(role?.name); // "ADMINISTRADOR (DEV)"
152
+ console.log(association?.companyName); // "DevForLogicDev"
153
+ console.log(association?.softwares); // [0, 1, 3, 4, ...]`,language:"tsx"})]})]})]}),e.jsxs(l,{id:"api-reference",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsx(t,{children:"API Reference"})}),e.jsxs(n,{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"CoreProviders — Props relacionadas"}),e.jsxs(h,{children:[e.jsx(p,{children:e.jsxs(a,{children:[e.jsx(o,{children:"Prop"}),e.jsx(o,{children:"Tipo"}),e.jsx(o,{children:"Descrição"})]})}),e.jsxs(j,{children:[e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"moduleAlias"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"string?"})}),e.jsx(s,{className:"text-sm",children:"Alias do módulo. Ativa o guard e o hook automaticamente"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"moduleAccessGuardProps"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:'Omit<ModuleAccessGuardProps, "children">?'})}),e.jsx(s,{className:"text-sm",children:"Props para personalizar o guard (contractedModules, callbacks, URLs)"})]})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"useModuleAccess — Retorno (ModuleAccessResult)"}),e.jsxs(h,{children:[e.jsx(p,{children:e.jsxs(a,{children:[e.jsx(o,{children:"Propriedade"}),e.jsx(o,{children:"Tipo"}),e.jsx(o,{children:"Descrição"})]})}),e.jsxs(j,{children:[e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"hasAccess"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"boolean"})}),e.jsx(s,{className:"text-sm",children:"Se o usuário tem acesso ao módulo configurado/especificado"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"isLoading"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"boolean"})}),e.jsx(s,{className:"text-sm",children:"Se os dados ainda estão carregando"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"role"})}),e.jsx(s,{children:e.jsxs("code",{className:"text-xs",children:["{ id: string; name: string }"," | null"]})}),e.jsx(s,{className:"text-sm",children:"Role do usuário na unidade atual"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"association"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"UserAssociation | null"})}),e.jsx(s,{className:"text-sm",children:"Associação completa (company, softwares, functionalities)"})]}),e.jsxs(a,{children:[e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"hasAccessTo"})}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"(alias: string | string[]) => boolean"})}),e.jsx(s,{className:"text-sm",children:"Verifica acesso a outro(s) módulo(s). Array = AND"})]})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Diagrama de decisão"}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-4 font-mono text-xs space-y-1",children:[e.jsx("p",{children:"CoreProviders"}),e.jsx("p",{children:" └─ ModuleProvider (configura moduleAlias)"}),e.jsx("p",{children:" └─ ModuleAccessGuard"}),e.jsx("p",{children:" ├─ isLoading? → Spinner"}),e.jsxs("p",{children:[" ├─ hasAccess = true? → ","{ children }"]}),e.jsx("p",{children:" └─ hasAccess = false? → Dialog (não-fechável)"}),e.jsx("p",{children:" ├─ Header: título + [Seletor Unidade ▾] + [Menu Usuário ▾]"}),e.jsx("p",{children:" ├─ Tabs: Qualiex | Clássicos → ModuleGrid"}),e.jsx("p",{children:" └─ Footer: Educa | Saber Gestão | Wiki"})]})]})]})]}),e.jsxs(l,{id:"cache-e-performance",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsx(t,{children:"Cache e Performance"})}),e.jsxs(n,{className:"space-y-3",children:[e.jsxs(h,{children:[e.jsx(p,{children:e.jsxs(a,{children:[e.jsx(o,{children:"Query"}),e.jsx(o,{children:"Query Key"}),e.jsx(o,{children:"Stale Time"}),e.jsx(o,{children:"Motivo"})]})}),e.jsx(j,{children:e.jsxs(a,{children:[e.jsx(s,{className:"text-sm",children:"Associações"}),e.jsx(s,{children:e.jsx("code",{className:"text-xs",children:"['qualiex-associations', userId, alias]"})}),e.jsx(s,{className:"text-sm",children:"10 minutos"}),e.jsx(s,{className:"text-sm",children:"Permissões podem mudar"})]})})]}),e.jsx("div",{className:"bg-green-50 dark:bg-green-950/30 border border-green-200 dark:border-green-800 rounded-lg p-3",children:e.jsxs("p",{className:"text-sm text-green-800 dark:text-green-200",children:[e.jsx("strong",{children:"✅ Mapa estático:"})," A resolução alias → ID é feita pelo ",e.jsx("code",{className:"text-xs bg-green-100 dark:bg-green-900 px-1 py-0.5 rounded",children:"SOFTWARES_MAP"})," embutido na lib, sem requisição HTTP. Na troca de unidade, ",e.jsx("code",{className:"text-xs bg-green-100 dark:bg-green-900 px-1 py-0.5 rounded",children:"queryClient.clear()"})," é chamado automaticamente."]})}),e.jsx("div",{className:"bg-amber-50 dark:bg-amber-950/30 border border-amber-200 dark:border-amber-800 rounded-lg p-3",children:e.jsxs("p",{className:"text-sm text-amber-800 dark:text-amber-200",children:[e.jsx("strong",{children:"🔄 Limpeza no login:"})," Durante o processo de login (",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:"processCallback"}),"), o ",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:"queryClient.clear()"})," é executado, limpando todo o cache do React Query — incluindo a query ",e.jsx("code",{className:"text-xs bg-amber-100 dark:bg-amber-900 px-1 py-0.5 rounded",children:"['qualiex-associations']"}),". Isso garante que as associações do usuário sejam sempre buscadas da API ao iniciar uma nova sessão, refletindo permissões atualizadas."]})}),e.jsxs("div",{className:"bg-muted/50 rounded-lg p-4 space-y-2",children:[e.jsx("h4",{className:"text-sm font-semibold",children:"Condições para ativação da query"}),e.jsxs("div",{className:"text-sm text-muted-foreground space-y-1",children:[e.jsxs("p",{children:["A query de associações só executa quando ",e.jsx("strong",{children:"todas"})," as condições abaixo são verdadeiras:"]}),e.jsxs("ul",{className:"list-disc list-inside space-y-1 ml-2",children:[e.jsxs("li",{children:["Usuário autenticado (",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"isAuthenticated"}),")"]}),e.jsxs("li",{children:["Alias da unidade definido (",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"!!alias"}),")"]}),e.jsxs("li",{children:["ID do usuário disponível (",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"!!userId"}),")"]})]}),e.jsxs("p",{className:"mt-2",children:["Se qualquer condição falhar, a query não executa e ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"hasAccess"})," retorna ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"true"})," (guard transparente)."]})]})]})]})]}),e.jsxs(l,{id:"aliases-disponiveis",className:"scroll-mt-4",children:[e.jsx(i,{children:e.jsx(t,{children:"Aliases Disponíveis"})}),e.jsxs(n,{className:"space-y-3",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Aliases do ",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"SOFTWARES_MAP"})," (",e.jsx("code",{className:"text-xs bg-muted px-1 py-0.5 rounded",children:"lib/modules/softwaresMap.ts"}),"):"]}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 gap-2",children:[{alias:"analysis",name:"Análises"},{alias:"decisions",name:"Atas e Decisões"},{alias:"audit",name:"Auditorias"},{alias:"common",name:"Configurações"},{alias:"competencies",name:"Competências"},{alias:"performance",name:"Desempenho"},{alias:"docs",name:"Documentos"},{alias:"education",name:"Educação"},{alias:"flow",name:"Fluxos"},{alias:"suppliers",name:"Fornecedores"},{alias:"suppliers-portal",name:"Portal do Fornecedor"},{alias:"mapping",name:"Mapeamentos"},{alias:"metrology",name:"Metrologia"},{alias:"control",name:"Controle"},{alias:"msa",name:"MSA"},{alias:"occurrences",name:"Ocorrências"},{alias:"okr",name:"OKR"},{alias:"pdi",name:"PDI"},{alias:"plans",name:"Planos"},{alias:"strategy-extension",name:"Extensão Estratégia"},{alias:"pulse",name:"Pulso"},{alias:"boards",name:"Quadros"},{alias:"risks",name:"Riscos"},{alias:"fmea",name:"FMEA"},{alias:"staff",name:"Treinamentos"},{alias:"control-plan",name:"Plano de Controle"}].map(({alias:c,name:d})=>e.jsxs("div",{className:"flex items-center gap-2 p-2 rounded border bg-card text-sm",children:[e.jsx("code",{className:"text-xs font-mono text-primary",children:c}),e.jsxs("span",{className:"text-muted-foreground text-xs",children:["— ",d]})]},c))})]})]})]})}export{I as ModuleAccessDoc};
@@ -0,0 +1,46 @@
1
+ import{j as e,r as d,gf as i,x as c,dY as u,gg as m,gh as r,a as p,b as x,c as g,d as f}from"./index-DkiftrvI.js";import{C as h}from"./ComponentDocTemplate-CQbBhfvZ.js";import"./ExampleCard-DuLrb3t-.js";function l(s){const a=s.match(/bg-\[#([A-Fa-f0-9]{6})\]/);return a?`#${a[1]}`:s}function b(){const[s,a]=d.useState(!1),{alias:o}=i(),t=n=>{n.url&&window.open(n.url.replace("{alias}",o||"demo"),"_blank"),a(!1)};return e.jsxs("div",{className:"flex flex-col items-center gap-4 p-8 border rounded-lg bg-muted/30",children:[e.jsx("p",{className:"text-muted-foreground text-center",children:"Clique no botão abaixo para abrir o dialog de módulos"}),e.jsxs(c,{onClick:()=>a(!0),children:[e.jsx(u,{className:"h-4 w-4 mr-2"}),"Abrir Módulos"]}),e.jsx(m,{open:s,onOpenChange:a,onModuleClick:t})]})}const C=`import { useState } from 'react';
2
+ import { Button, ModulesDialog } from 'forlogic-core';
3
+ import { LayoutGrid } from 'lucide-react';
4
+
5
+ function App() {
6
+ const [open, setOpen] = useState(false);
7
+
8
+ return (
9
+ <>
10
+ <Button onClick={() => setOpen(true)}>
11
+ <LayoutGrid className="h-4 w-4 mr-2" />
12
+ Módulos
13
+ </Button>
14
+
15
+ <ModulesDialog
16
+ open={open}
17
+ onOpenChange={setOpen}
18
+ onModuleClick={(module) => console.log(module)}
19
+ />
20
+ </>
21
+ );
22
+ }`,j=`// Integração com AppHeader
23
+ import { AppHeader, ModulesDialog } from 'forlogic-core';
24
+ import { useState } from 'react';
25
+
26
+ function Layout() {
27
+ const [modulesOpen, setModulesOpen] = useState(false);
28
+
29
+ return (
30
+ <>
31
+ <AppHeader
32
+ onModulesClick={() => setModulesOpen(true)}
33
+ // ... outras props
34
+ />
35
+
36
+ <ModulesDialog
37
+ open={modulesOpen}
38
+ onOpenChange={setModulesOpen}
39
+ onModuleClick={(module) => {
40
+ navigate(\`/modules/\${module.name.toLowerCase()}\`);
41
+ setModulesOpen(false);
42
+ }}
43
+ />
44
+ </>
45
+ );
46
+ }`;function M(){const s=r.find(o=>o.id==="qualiex"),a=r.find(o=>o.id==="classico");return e.jsxs(p,{className:"mt-8",id:"modules-colors",children:[e.jsxs(x,{children:[e.jsx(g,{children:"Módulos e Cores"}),e.jsx("p",{className:"text-muted-foreground text-sm",children:"Cada módulo possui uma cor fixa para identificação visual. Lista gerada automaticamente a partir dos dados do componente."})]}),e.jsx(f,{children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-8",children:[s&&e.jsxs("div",{children:[e.jsxs("h4",{className:"font-semibold text-sm text-muted-foreground mb-3",children:[s.label," (",s.modules.length,")"]}),e.jsx("ul",{className:"space-y-1.5",children:[...s.modules].sort((o,t)=>o.name.localeCompare(t.name)).map(o=>e.jsxs("li",{className:"flex items-center justify-between text-sm",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:l(o.color)}}),o.name]}),e.jsx("code",{className:"text-xs text-muted-foreground font-mono",children:l(o.color)})]},o.name))})]}),a&&e.jsxs("div",{children:[e.jsxs("h4",{className:"font-semibold text-sm text-muted-foreground mb-3",children:[a.label," (",a.modules.length,")"]}),e.jsx("ul",{className:"space-y-1.5",children:[...a.modules].sort((o,t)=>o.name.localeCompare(t.name)).map(o=>e.jsxs("li",{className:"flex items-center justify-between text-sm",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"w-3 h-3 rounded-full flex-shrink-0",style:{backgroundColor:l(o.color)}}),o.name]}),e.jsx("code",{className:"text-xs text-muted-foreground font-mono",children:l(o.color)})]},o.name))})]})]})})]})}function k(){return e.jsxs(e.Fragment,{children:[e.jsx(h,{title:"ModulesDialog",description:"Dialog para navegação entre módulos do sistema.",usage:C,component:e.jsx(b,{}),examples:[{title:"Integração com AppHeader",description:"Exemplo de como integrar o ModulesDialog com o cabeçalho da aplicação.",preview:e.jsx("div",{className:"text-sm text-muted-foreground p-4 border rounded bg-muted/30",children:"Veja o código ao lado"}),code:j}],props:[{name:"open",type:"boolean",default:"-",description:"Controla se o dialog está aberto"},{name:"onOpenChange",type:"(open: boolean) => void",default:"-",description:"Callback quando o estado muda"},{name:"onModuleClick",type:"(module: Module) => void",default:"-",description:"Callback ao clicar em um módulo. Default: navega via URL do módulo"},{name:"educaUrl",type:"string",default:"https://educa.forlogic.net/",description:"URL do link do Forlogic Educa"},{name:"saberGestaoUrl",type:"string",default:"https://sabergestao.com.br/",description:"URL do link do Saber Gestão"}],accessibility:['Dialog acessível com role="dialog" e aria-modal="true"',"Navegação por teclado entre abas (Arrow Left/Right)","Foco automático no primeiro elemento interativo ao abrir","Escape fecha o dialog e retorna o foco ao elemento anterior"],notes:["Para separação entre módulos contratados e disponíveis (contractedModules, onModuleInterest), consulte a documentação de Module Access.","Internamente usa o componente ModulesContent, compartilhado com o AccessDeniedDialog.","2 Abas de Grupos: Qualiex e Clássicos","Grid Responsivo: 4 colunas em XL, 3 em MD, 2 em base","Cards no Rodapé: Forlogic Educa, Saber Gestão e Wiki"]}),e.jsx(M,{})]})}export{k as ModulesDialogDoc,k as default};
@@ -0,0 +1,34 @@
1
+ import{r as n,j as e,o as m,N as U,O as W,Q as Y,R as ee,V as se,B as O,Z as te,_ as re,x as z,bk as ae,a0 as ie,d7 as ne,K as oe,aG as de,bs as le,P as ce,a1 as me,aX as ue,ed as pe,y as xe}from"./index-DkiftrvI.js";import{E as g}from"./ExampleCard-DuLrb3t-.js";function D(r){return(r??"").normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}function R(r){const a=new Set;if(!r)return a;for(const i of r)i.allowedIds?.forEach(d=>a.add(d)),i.inheritedIds?.forEach(d=>a.add(d));return a}function he(r){const a=new Set;if(!r)return a;for(const i of r)i.inheritedIds?.forEach(d=>a.add(d));return a}function I({items:r,categories:a,value:i,onChange:d,readonly:u=!1,isLoading:T=!1,title:_="Permissões",addButtonLabel:B="Permitir",chipsTitle:F="Itens permitidos",chipsPlaceholder:G="Nenhum item selecionado",searchPlaceholder:$="Buscar...",selectPlaceholder:K="Selecione itens para adicionar...",itemInfoTemplate:L=o=>`${o} ${o===1?"item":"itens"}`,disclaimer:y,disclaimerLink:P,onDisclaimerClick:S,className:M}){const[o,Q]=n.useState(a[0]?.id??""),[f,j]=n.useState(""),[l,v]=n.useState([]),[X,E]=n.useState(!1),p=n.useMemo(()=>R(i[o]),[i,o]),N=n.useMemo(()=>he(i[o]),[i,o]),k=n.useMemo(()=>r.filter(s=>p.has(s.id)),[r,p]),V=n.useMemo(()=>{const s=D(f);return r.filter(t=>!(p.has(t.id)||s&&!D(t.name).includes(s)))},[r,p,f]),A=n.useMemo(()=>{const s={};for(const t of a)s[t.id]=R(i[t.id]).size;return s},[a,i]),q=n.useCallback(s=>{Q(s),v([]),j("")},[]),H=n.useCallback(s=>{v(t=>t.includes(s)?t.filter(c=>c!==s):[...t,s])},[]),Z=n.useCallback(()=>{if(l.length===0)return;const s=[...i[o]??[]];for(const t of l){const x=r.find(w=>w.id===t)?.group??"default",h=s.find(w=>w.context===x);h?h.allowedIds.includes(t)||(h.allowedIds=[...h.allowedIds,t]):s.push({context:x,allowedIds:[t],inheritedIds:[]})}d({...i,[o]:s}),v([]),j(""),E(!1)},[l,i,o,r,d]),J=n.useCallback(s=>{if(N.has(s))return;const t=(i[o]??[]).map(c=>({...c,allowedIds:c.allowedIds.filter(x=>x!==s)}));d({...i,[o]:t})},[i,o,N,d]);return T?e.jsxs("div",{className:m("rounded-md border bg-muted/30 p-4 animate-pulse space-y-3",M),children:[e.jsx("div",{className:"h-4 w-32 bg-muted rounded"}),e.jsx("div",{className:"h-9 w-full bg-muted rounded"}),e.jsx("div",{className:"h-20 w-full bg-muted rounded"})]}):e.jsx("div",{className:m("rounded-md border bg-muted/30",M),children:e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs font-medium text-muted-foreground uppercase tracking-wide",children:_}),e.jsxs(U,{value:o,onValueChange:q,children:[e.jsx(W,{className:"h-9 text-sm",children:e.jsx(Y,{})}),e.jsx(ee,{children:a.map(s=>e.jsx(se,{value:s.id,children:e.jsxs("span",{className:"flex items-center gap-2",children:[s.icon,s.name,A[s.id]>0&&e.jsx(O,{variant:"secondary",className:"ml-1 text-xs px-1.5 py-0",children:A[s.id]})]})},s.id))})]})]}),!u&&e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(te,{open:X,onOpenChange:E,children:[e.jsx(re,{asChild:!0,children:e.jsxs(z,{variant:"outline",role:"combobox",className:"flex-1 justify-between h-9 text-sm font-normal text-muted-foreground",children:[l.length>0?`${l.length} selecionado${l.length>1?"s":""}`:K,e.jsx(ae,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"})]})}),e.jsxs(ie,{className:"w-[var(--radix-popover-trigger-width)] p-0",align:"start",children:[e.jsx("div",{className:"p-2 border-b",children:e.jsxs("div",{className:"relative",children:[e.jsx(ne,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(oe,{className:"pl-8 h-8 text-sm",placeholder:$,value:f,onChange:s=>j(s.target.value)})]})}),e.jsx(de,{className:"max-h-[220px]",children:V.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-4",children:"Nenhum item encontrado"}):e.jsx("div",{className:"p-1",children:V.map(s=>{const t=l.includes(s.id);return e.jsxs("div",{className:m("flex items-center gap-3 rounded-sm px-2 py-1.5 text-sm cursor-pointer hover:bg-accent",t&&"bg-accent/50"),onClick:()=>H(s.id),children:[e.jsx("div",{className:m("flex h-4 w-4 items-center justify-center rounded-sm border border-primary",t&&"bg-primary text-primary-foreground"),children:t&&e.jsx(le,{className:"h-3 w-3"})}),e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx("span",{className:"truncate",children:s.name}),s.count!=null&&e.jsx("span",{className:"text-xs text-muted-foreground",children:L(s.count)})]})]},s.id)})})})]})]}),e.jsxs(z,{size:"sm",className:"h-9 gap-1",disabled:l.length===0,onClick:Z,children:[e.jsx(ce,{className:"h-4 w-4"}),B]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm font-medium",children:F}),e.jsx("div",{className:m("rounded-md border bg-background p-3 min-h-[60px]",u&&"bg-muted/50"),children:k.length===0?e.jsx("span",{className:"text-sm text-muted-foreground",children:G}):e.jsx("div",{className:"flex flex-wrap gap-1.5",children:k.map(s=>{const t=N.has(s.id);return e.jsxs(O,{variant:t?"secondary":"default",className:"gap-1 pl-2 pr-1 py-1 text-xs",children:[s.name,!u&&!t&&e.jsx("button",{type:"button",className:"ml-0.5 rounded-full hover:bg-primary-foreground/20 p-0.5",onClick:()=>J(s.id),children:e.jsx(me,{className:"h-3 w-3"})})]},s.id)})})}),u&&y&&e.jsxs("p",{className:"text-xs text-muted-foreground",children:[e.jsx("span",{dangerouslySetInnerHTML:{__html:y}})," ",P&&S&&e.jsx("button",{type:"button",className:"text-primary underline hover:no-underline",onClick:S,children:P})]})]})]})})}const b=[{id:"view",name:"Visualizar",icon:e.jsx(ue,{className:"h-4 w-4"})},{id:"edit",name:"Editar",icon:e.jsx(pe,{className:"h-4 w-4"})},{id:"delete",name:"Excluir",icon:e.jsx(xe,{className:"h-4 w-4"})}],C=[{id:"p1",name:"Documentos Internos",count:12,group:"folders"},{id:"p2",name:"Procedimentos Operacionais",count:8,group:"folders"},{id:"p3",name:"Registros de Qualidade",count:24,group:"folders"},{id:"p4",name:"Formulários",count:5,group:"folders"},{id:"p5",name:"Manuais",count:3,group:"folders"},{id:"p6",name:"Normas e Regulamentos",count:15,group:"external"},{id:"p7",name:"Anexos de Auditoria",count:7,group:"external"}];function ge(){const[r,a]=n.useState({view:[{context:"folders",allowedIds:["p1","p3"],inheritedIds:[]}],edit:[{context:"folders",allowedIds:["p1"],inheritedIds:[]}],delete:[]});return e.jsx("div",{className:"max-w-lg",children:e.jsx(I,{items:C,categories:b,value:r,onChange:a})})}function fe(){const r={view:[{context:"folders",allowedIds:["p1","p2","p3"],inheritedIds:["p4"]}],edit:[{context:"folders",allowedIds:["p1"],inheritedIds:[]}],delete:[]};return e.jsx("div",{className:"max-w-lg",children:e.jsx(I,{items:C,categories:b,value:r,onChange:()=>{},readonly:!0,disclaimer:"As permissões herdadas não podem ser removidas individualmente.",disclaimerLink:"Gerenciar permissões",onDisclaimerClick:()=>alert("Navegar para gerenciar permissões")})})}function je(){const[r,a]=n.useState({view:[],edit:[],delete:[]});return e.jsx("div",{className:"max-w-lg",children:e.jsx(I,{items:C,categories:b,value:r,onChange:a})})}function we(){return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold mb-2",children:"Multiselect Permissions"}),e.jsxs("p",{className:"text-muted-foreground",children:["Seletor de permissões multi-categoria com busca, chips e suporte a itens herdados. Portado de ",e.jsx("code",{children:"flc-multiselect-permissions"})," (v2)."]})]}),e.jsx(g,{title:"Com permissões pré-configuradas",description:"Alterne entre categorias (Visualizar, Editar, Excluir) e adicione/remova itens.",preview:e.jsx(ge,{}),code:`const [val, setVal] = useState({
2
+ view: [{ context: 'folders', allowedIds: ['p1', 'p3'], inheritedIds: [] }],
3
+ edit: [{ context: 'folders', allowedIds: ['p1'], inheritedIds: [] }],
4
+ delete: [],
5
+ });
6
+
7
+ <MultiselectPermissions
8
+ items={items}
9
+ categories={categories}
10
+ value={val}
11
+ onChange={setVal}
12
+ />`}),e.jsx(g,{title:"Somente leitura",description:"Modo readonly com disclaimer e itens herdados (badge secundário, não removível).",preview:e.jsx(fe,{}),code:`<MultiselectPermissions
13
+ items={items}
14
+ categories={categories}
15
+ value={val}
16
+ onChange={() => {}}
17
+ readonly
18
+ disclaimer="As permissões herdadas não podem ser removidas."
19
+ disclaimerLink="Gerenciar permissões"
20
+ onDisclaimerClick={handleClick}
21
+ />`}),e.jsx(g,{title:"Vazio",description:"Estado inicial sem permissões atribuídas.",preview:e.jsx(je,{}),code:"<MultiselectPermissions items={items} categories={categories} value={{}} onChange={setVal} />"}),e.jsx(g,{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 { MultiselectPermissions } from 'forlogic-core';
22
+ import type { PermissionItem, PermissionCategory, PermissionValues } from 'forlogic-core';`}),code:`import { MultiselectPermissions } from 'forlogic-core';
23
+ import type {
24
+ PermissionItem,
25
+ PermissionCategory,
26
+ PermissionValues,
27
+ } from 'forlogic-core';
28
+
29
+ <MultiselectPermissions
30
+ items={permissionItems}
31
+ categories={permissionCategories}
32
+ value={permissionsMap}
33
+ onChange={setPermissionsMap}
34
+ />`})]})}export{we as MultiselectPermissionsDoc};