forlogic-core 1.16.7 → 1.16.9

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 (169) hide show
  1. package/.note/memory/architecture/documentation-strategy.md +59 -0
  2. package/.note/memory/patterns/core-providers-setup.md +39 -0
  3. package/.note/memory/patterns/deprecated-patterns.md +14 -0
  4. package/.note/memory/patterns/feature-flags.md +19 -0
  5. package/.note/memory/patterns/header-metadata-pattern.md +62 -0
  6. package/.note/memory/patterns/i18n-setup.md +43 -0
  7. package/.note/memory/patterns/vite-tailwind-setup.md +49 -0
  8. package/.note/memory/rules/doc-sync-rule.md +32 -0
  9. package/.note/memory/rules/i18n-import-rule.md +29 -0
  10. package/.note/memory/rules/lib-first-rule.md +42 -0
  11. package/.note/memory/rules/no-auto-index-rule.md +37 -9
  12. package/.note/memory/rules/no-delete-policy-rule.md +41 -12
  13. package/.note/memory/rules/rls-syntax-rule.md +50 -0
  14. package/.note/memory/rules/sql-naming-rule.md +23 -0
  15. package/.note/memory/rules/supabase-import-rule.md +31 -0
  16. package/.note/memory/rules/supabase-schema-rule.md +5 -4
  17. package/.note/memory/ui/components/combo-tree.md +9 -1
  18. package/.note/memory/ui/design-system/documentation-standard.md +17 -0
  19. package/README.md +78 -212
  20. package/dist/README.md +78 -212
  21. package/dist/assets/AccordionDoc-BVPUJk8G.js +31 -0
  22. package/dist/assets/ActionButtonDoc-DLJ_K9ib.js +47 -0
  23. package/dist/assets/AlertDoc-CY1ybZeG.js +37 -0
  24. package/dist/assets/AppHeaderDoc-Crkw4dA9.js +67 -0
  25. package/dist/assets/AppSidebarDoc-ET-4j6wV.js +204 -0
  26. package/dist/assets/AuthDoc-B4v4Nci5.js +192 -0
  27. package/dist/assets/AvatarDoc-BLdMoyJd.js +11 -0
  28. package/dist/assets/BadgeDoc-CSNM1b6b.js +36 -0
  29. package/dist/assets/BaseFormDoc-DXiYuN6-.js +169 -0
  30. package/dist/assets/BodyContentDoc-Bp6YmUWX.js +83 -0
  31. package/dist/assets/BreadcrumbDoc-D7tqqTvo.js +75 -0
  32. package/dist/assets/ButtonDoc-C4JwIvU3.js +41 -0
  33. package/dist/assets/ButtonGroupDoc-QFfjC7Pm.js +7 -0
  34. package/dist/assets/CalendarDoc-COlEKqmv.js +81 -0
  35. package/dist/assets/CardDoc-BVhMoC2w.js +49 -0
  36. package/dist/assets/ChartDoc-BJ14EjI2.js +111 -0
  37. package/dist/assets/CheckboxDoc-Bcqpln9_.js +55 -0
  38. package/dist/assets/ColorPickerDoc-CcfmSwyC.js +10 -0
  39. package/dist/assets/ColorsFoundationDoc-uO6IiJbS.js +13 -0
  40. package/dist/assets/ComboTreeDoc-R4qE6XwB.js +46 -0
  41. package/dist/assets/ComboboxDoc-JIo_-gSN.js +134 -0
  42. package/dist/assets/ComponentDocTemplate-CRbRY-v5.js +1 -0
  43. package/dist/assets/ContextMenuDoc-C4-_0NLp.js +182 -0
  44. package/dist/assets/ContextsDoc-Cj9Aaoyo.js +184 -0
  45. package/dist/assets/CreateCrudPageDoc-D_SnMRJ2.js +106 -0
  46. package/dist/assets/CrudActionBarDoc-BYqtIabp.js +112 -0
  47. package/dist/assets/CrudGridDoc-DspxQrq5.js +85 -0
  48. package/dist/assets/CrudOverviewDoc-DLcOL_HZ.js +14 -0
  49. package/dist/assets/CrudPrimitivesDoc-BRS86nWg.js +164 -0
  50. package/dist/assets/CrudTableDoc-Daw8u2G_.js +113 -0
  51. package/dist/assets/DataListDoc-BrgVNhhR.js +13 -0
  52. package/dist/assets/DesignSystemHome-BFBNqq1J.js +1 -0
  53. package/dist/assets/DialogDoc-DCpRy4rg.js +981 -0
  54. package/dist/assets/DropdownMenuDoc-DT6LBa8Z.js +175 -0
  55. package/dist/assets/EmptyStateDoc-wydc09gG.js +35 -0
  56. package/dist/assets/EnvironmentsDoc-amIriwDD.js +96 -0
  57. package/dist/assets/ErrorBoundaryDoc-BEixy_Gl.js +111 -0
  58. package/dist/assets/FormDoc-DxoRt6p7.js +81 -0
  59. package/dist/assets/FoundationOverview-CxSbumIt.js +1 -0
  60. package/dist/assets/GridDoc-BpQqCMUE.js +28 -0
  61. package/dist/assets/HooksDoc-JNODhbaF.js +665 -0
  62. package/dist/assets/HoverCardDoc-CdqiYrIb.js +31 -0
  63. package/dist/assets/I18nDoc-B6LMXnE3.js +232 -0
  64. package/dist/assets/IconPickerDoc-BRdy58IC.js +10 -0
  65. package/dist/assets/IconsFoundationDoc-CrymfxTI.js +33 -0
  66. package/dist/assets/InputDoc-BK-SdpJ7.js +211 -0
  67. package/dist/assets/LabelDoc-DHvgzhaJ.js +42 -0
  68. package/dist/assets/LeadershipDoc-DRiB0spL.js +416 -0
  69. package/dist/assets/MediaDoc-B_vqnf72.js +459 -0
  70. package/dist/assets/MenubarDoc-Zvgczxe2.js +165 -0
  71. package/dist/assets/ModuleAccessDoc-Nuxb4S27.js +153 -0
  72. package/dist/assets/ModulesDialogDoc-iJWLkOZo.js +46 -0
  73. package/dist/assets/NavigationMenuDoc-CeWun1VF.js +116 -0
  74. package/dist/assets/OnboardingDialogDoc-xBL-rXeZ.js +55 -0
  75. package/dist/assets/PaginationDoc-CfvwxCMe.js +98 -0
  76. package/dist/assets/PaginationDoc-DqtRgXnF.js +27 -0
  77. package/dist/assets/PlacesDoc-nckioEzg.js +226 -0
  78. package/dist/assets/PopoverDoc-C3o2CZCT.js +64 -0
  79. package/dist/assets/ProgressDoc-BmWBNMPA.js +29 -0
  80. package/dist/assets/QualiexUserFieldDoc-CE1e4mx6.js +149 -0
  81. package/dist/assets/RadioGroupDoc-DMZH6NmR.js +57 -0
  82. package/dist/assets/RadiusDoc-BOZD3gPV.js +7 -0
  83. package/dist/assets/RequiredFieldsCounterDoc-CG-lmSSy.js +58 -0
  84. package/dist/assets/ResizableDoc-CqGkv6Cd.js +104 -0
  85. package/dist/assets/RichTextEditorDoc-m50ll-Od.js +24 -0
  86. package/dist/assets/ScrollAreaDoc-BzJ-APXo.js +28 -0
  87. package/dist/assets/SecurityDoc-B34gVeiV.js +204 -0
  88. package/dist/assets/SelectDoc-DXRv7QHK.js +80 -0
  89. package/dist/assets/SeparatorDoc-DcNh8k0P.js +4 -0
  90. package/dist/assets/ServicesDoc-8aXBd6yg.js +308 -0
  91. package/dist/assets/ShadowsDoc-Brl4hIDI.js +9 -0
  92. package/dist/assets/SignDoc-BdwerR-2.js +66 -0
  93. package/dist/assets/SkeletonDoc-BWgqgbDY.js +54 -0
  94. package/dist/assets/SliderDoc-E-NjbYVk.js +41 -0
  95. package/dist/assets/SpacingDoc-BzburM-r.js +12 -0
  96. package/dist/assets/SplitButtonDoc-BYUysmJp.js +53 -0
  97. package/dist/assets/StepSelectorDoc-PB1k4v7F.js +41 -0
  98. package/dist/assets/SwitchDoc-BLOG6kfj.js +56 -0
  99. package/dist/assets/TableDoc-Dwcs-lop.js +128 -0
  100. package/dist/assets/TabsDoc-Ovkh8ArV.js +42 -0
  101. package/dist/assets/TextareaDoc-DsBYxmbr.js +46 -0
  102. package/dist/assets/ToastDoc-BbZaFE_A.js +157 -0
  103. package/dist/assets/ToggleDoc-C28vbvhp.js +51 -0
  104. package/dist/assets/TooltipDoc-DL5cnLak.js +58 -0
  105. package/dist/assets/TruncatedCellDoc-BuDA8QcY.js +12 -0
  106. package/dist/assets/TypographyFoundationDoc-CPdH4PHa.js +7 -0
  107. package/dist/assets/UtilitiesDoc-CrQhyEfz.js +145 -0
  108. package/dist/assets/blocks-DO93nPjs.js +1 -0
  109. package/dist/assets/calendar-days-cMfwBSZx.js +1 -0
  110. package/dist/assets/circle-plus-D3NftMzS.js +1 -0
  111. package/dist/assets/circle-x-BVAVJ_oz.js +1 -0
  112. package/dist/assets/crown-B2MTZDnM.js +1 -0
  113. package/dist/assets/date-picker-zhJU-_kM.js +1 -0
  114. package/dist/assets/disabled-menu-item-C16xsaVs.js +1 -0
  115. package/dist/assets/drawer-oTqCOtsC.js +3 -0
  116. package/dist/assets/file-pen-line-CXv-Eye-.js +1 -0
  117. package/dist/assets/git-branch-V6-h6P9K.js +1 -0
  118. package/dist/assets/globe-CaUBIJU8.js +1 -0
  119. package/dist/assets/hash-B4MTXppl.js +1 -0
  120. package/dist/assets/hover-card-DEuucfxP.js +1 -0
  121. package/dist/assets/index-CE0k7Rdh.js +312 -0
  122. package/dist/assets/index-Cx3adT_u.css +1 -0
  123. package/dist/assets/life-buoy-BRndExxh.js +1 -0
  124. package/dist/assets/lucide-react-t7dCa4lv.js +1 -0
  125. package/dist/assets/monitor-Dg3HKTSE.js +1 -0
  126. package/dist/assets/package-3G45ARQh.js +1 -0
  127. package/dist/assets/pen-BYSSwjK4.js +1 -0
  128. package/dist/assets/pin-CMYagNhs.js +1 -0
  129. package/dist/assets/radio-group-BVun_Tmt.js +1 -0
  130. package/dist/assets/server-p0Sb0mKI.js +1 -0
  131. package/dist/assets/share-2-D-ZhCCq2.js +1 -0
  132. package/dist/assets/shield-x-Q7hAXWsG.js +1 -0
  133. package/dist/assets/step-selector-DHxgT2FL.js +1 -0
  134. package/dist/assets/text-align-start-6aYQqbX4.js +1 -0
  135. package/dist/assets/trash-DveAOiLF.js +1 -0
  136. package/dist/assets/useMockCrud-GY0KxHXr.js +1 -0
  137. package/dist/assets/user-check-CoGNBfIk.js +1 -0
  138. package/dist/assets/user-plus-Bad2xWIT.js +1 -0
  139. package/dist/bin/pull-docs.js +14 -13
  140. package/dist/components/modules/ModuleAccessGuard.d.ts +24 -2
  141. package/dist/components/ui/combo-tree.d.ts +2 -0
  142. package/dist/contexts/PageMetadataContext.d.ts +6 -1
  143. package/dist/crud/components/ColumnSettingsPopover.d.ts +17 -0
  144. package/dist/crud/components/CrudActionBar.d.ts +2 -1
  145. package/dist/crud/components/CrudTable.d.ts +5 -1
  146. package/dist/crud/components/GroupDropZone.d.ts +16 -0
  147. package/dist/crud/components/InlineRowActions.d.ts +15 -0
  148. package/dist/crud/hooks/useColumnDragReorder.d.ts +19 -0
  149. package/dist/crud/hooks/useColumnManager.d.ts +56 -0
  150. package/dist/crud/primitives/Table.d.ts +1 -1
  151. package/dist/crud/primitives/TreeTable.d.ts +2 -0
  152. package/dist/crud/primitives/index.d.ts +2 -1
  153. package/dist/crud/primitives/types.d.ts +33 -0
  154. package/dist/docs/KNOWLEDGE.md +68 -167
  155. package/dist/exports/crud.d.ts +2 -1
  156. package/dist/hooks/useDerivedContractedModules.d.ts +8 -0
  157. package/dist/i18n/config.d.ts +11 -0
  158. package/dist/i18n/index.d.ts +1 -1
  159. package/dist/index.css +1 -1
  160. package/dist/index.css.map +1 -1
  161. package/dist/index.d.ts +3 -1
  162. package/dist/index.esm.js +1 -1
  163. package/dist/index.html +35 -0
  164. package/dist/index.js +1 -1
  165. package/dist/providers/CoreProviders.d.ts +31 -34
  166. package/dist/types.d.ts +4 -0
  167. package/docs/KNOWLEDGE.md +68 -167
  168. package/package.json +2 -3
  169. package/docs/DESIGN_SYSTEM.md +0 -12174
@@ -0,0 +1 @@
1
+ import{aR as a}from"./index-CE0k7Rdh.js";const e=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1",key:"1oajmo"}],["path",{d:"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1",key:"mpwhp6"}]],i=a("file-braces",e);const o=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]],c=a("monitor",o);export{i as F,c as M};
@@ -0,0 +1 @@
1
+ import{aR as a}from"./index-CE0k7Rdh.js";const e=[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]],t=a("package",e);export{t as P};
@@ -0,0 +1 @@
1
+ import{aR as a}from"./index-CE0k7Rdh.js";const e=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]],c=a("pen",e);export{c as P};
@@ -0,0 +1 @@
1
+ import{aR as a}from"./index-CE0k7Rdh.js";const o=[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89",key:"znwnzq"}],["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{d:"M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11",key:"c9qhm2"}]],t=a("pin-off",o);const n=[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z",key:"1nkz8b"}]],d=a("pin",n);export{d as P,t as a};
@@ -0,0 +1 @@
1
+ import{r as n,a3 as V,Y as K,j as a,cV as T,$ as b,a2 as w,cW as U,a4 as g,cX as E,cY as Y,a6 as N,cZ as $,c_ as z,l as I,k as H}from"./index-CE0k7Rdh.js";var C="Radio",[W,_]=N(C),[X,Z]=W(C),k=n.forwardRef((r,t)=>{const{__scopeRadio:e,name:c,checked:o=!1,required:s,disabled:i,value:p="on",onCheck:f,form:R,...v}=r,[l,m]=n.useState(null),d=w(t,x=>m(x)),u=n.useRef(!1),y=l?R||!!l.closest("form"):!0;return a.jsxs(X,{scope:e,checked:o,disabled:i,children:[a.jsx(b.button,{type:"button",role:"radio","aria-checked":o,"data-state":S(o),"data-disabled":i?"":void 0,disabled:i,value:p,...v,ref:d,onClick:g(r.onClick,x=>{o||f?.(),y&&(u.current=x.isPropagationStopped(),u.current||x.stopPropagation())})}),y&&a.jsx(G,{control:l,bubbles:!u.current,name:c,value:p,checked:o,required:s,disabled:i,form:R,style:{transform:"translateX(-100%)"}})]})});k.displayName=C;var j="RadioIndicator",P=n.forwardRef((r,t)=>{const{__scopeRadio:e,forceMount:c,...o}=r,s=Z(j,e);return a.jsx(Y,{present:c||s.checked,children:a.jsx(b.span,{"data-state":S(s.checked),"data-disabled":s.disabled?"":void 0,...o,ref:t})})});P.displayName=j;var J="RadioBubbleInput",G=n.forwardRef(({__scopeRadio:r,control:t,checked:e,bubbles:c=!0,...o},s)=>{const i=n.useRef(null),p=w(i,s),f=$(e),R=z(t);return n.useEffect(()=>{const v=i.current;if(!v)return;const l=window.HTMLInputElement.prototype,d=Object.getOwnPropertyDescriptor(l,"checked").set;if(f!==e&&d){const u=new Event("click",{bubbles:c});d.call(v,e),v.dispatchEvent(u)}},[f,e,c]),a.jsx(b.input,{type:"radio","aria-hidden":!0,defaultChecked:e,...o,tabIndex:-1,ref:p,style:{...o.style,...R,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});G.displayName=J;function S(r){return r?"checked":"unchecked"}var Q=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],h="RadioGroup",[ee]=N(h,[E,_]),A=E(),D=_(),[oe,re]=ee(h),M=n.forwardRef((r,t)=>{const{__scopeRadioGroup:e,name:c,defaultValue:o,value:s,required:i=!1,disabled:p=!1,orientation:f,dir:R,loop:v=!0,onValueChange:l,...m}=r,d=A(e),u=V(R),[y,x]=K({prop:s,defaultProp:o??null,onChange:l,caller:h});return a.jsx(oe,{scope:e,name:c,required:i,disabled:p,value:y,onValueChange:x,children:a.jsx(T,{asChild:!0,...d,orientation:f,dir:u,loop:v,children:a.jsx(b.div,{role:"radiogroup","aria-required":i,"aria-orientation":f,"data-disabled":p?"":void 0,dir:u,...m,ref:t})})})});M.displayName=h;var O="RadioGroupItem",F=n.forwardRef((r,t)=>{const{__scopeRadioGroup:e,disabled:c,...o}=r,s=re(O,e),i=s.disabled||c,p=A(e),f=D(e),R=n.useRef(null),v=w(t,R),l=s.value===o.value,m=n.useRef(!1);return n.useEffect(()=>{const d=y=>{Q.includes(y.key)&&(m.current=!0)},u=()=>m.current=!1;return document.addEventListener("keydown",d),document.addEventListener("keyup",u),()=>{document.removeEventListener("keydown",d),document.removeEventListener("keyup",u)}},[]),a.jsx(U,{asChild:!0,...p,focusable:!i,active:l,children:a.jsx(k,{disabled:i,required:s.required,checked:l,...f,...o,name:s.name,ref:v,onCheck:()=>s.onValueChange(o.value),onKeyDown:g(d=>{d.key==="Enter"&&d.preventDefault()}),onFocus:g(o.onFocus,()=>{m.current&&R.current?.click()})})})});F.displayName=O;var ae="RadioGroupIndicator",L=n.forwardRef((r,t)=>{const{__scopeRadioGroup:e,...c}=r,o=D(e);return a.jsx(P,{...o,...c,ref:t})});L.displayName=ae;var q=M,B=F,te=L;const se=n.forwardRef(({className:r,...t},e)=>a.jsx(q,{className:I("grid gap-2",r),...t,ref:e}));se.displayName=q.displayName;const ne=n.forwardRef(({className:r,...t},e)=>a.jsx(B,{ref:e,className:I("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",r),...t,children:a.jsx(te,{className:"flex items-center justify-center",children:a.jsx(H,{className:"h-2.5 w-2.5 fill-current text-current"})})}));ne.displayName=B.displayName;export{se as R,ne as a};
@@ -0,0 +1 @@
1
+ import{aR as e}from"./index-CE0k7Rdh.js";const r=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],i=e("server",r);export{i as S};
@@ -0,0 +1 @@
1
+ import{aR as c}from"./index-CE0k7Rdh.js";const e=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M12 3v18",key:"108xh3"}]],o=c("columns-2",e);const y=[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]],r=c("share-2",y);export{o as C,r as S};
@@ -0,0 +1 @@
1
+ import{aR as a}from"./index-CE0k7Rdh.js";const e=[["path",{d:"M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z",key:"j76jl0"}],["path",{d:"M22 10v6",key:"1lu8f3"}],["path",{d:"M6 12.5V16a6 3 0 0 0 12 0v-3.5",key:"1r8lef"}]],d=a("graduation-cap",e);const t=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]],c=a("shield-x",t);export{d as G,c as S};
@@ -0,0 +1 @@
1
+ import{j as a,n as f,o as j,f as t,a7 as w,p as N,q as g,ah as D,l as e,ap as v}from"./index-CE0k7Rdh.js";function M({currentStep:r,totalSteps:o,onStepChange:l,stepLabels:d,canGoToStep:n,className:m,progressWidth:u="w-32"}){const c=Array.from({length:o},(s,h)=>h+1),x=s=>{if(s<r){l(s);return}(!n||n(s))&&l(s)},i=s=>s<=r?!1:n?!n(s):!1;return a.jsxs("div",{className:e("flex items-center gap-3",m),children:[a.jsxs(f,{children:[a.jsx(j,{asChild:!0,children:a.jsxs(t,{variant:"ghost",size:"sm",className:"h-auto py-1 px-2 text-sm text-muted-foreground hover:text-foreground",children:["Etapa ",r,"/",o,a.jsx(w,{className:"h-3 w-3 ml-1"})]})}),a.jsx(N,{align:"start",children:c.map(s=>a.jsxs(g,{onClick:()=>x(s),disabled:i(s),className:e("cursor-pointer",s===r&&"bg-muted font-medium",i(s)&&"opacity-50 cursor-not-allowed"),children:[a.jsxs("span",{className:"mr-2 text-muted-foreground",children:[s,"."]}),d?.[s-1]||`Etapa ${s}`,s===r&&a.jsx(D,{className:"h-4 w-4 ml-auto"})]},s))})]}),a.jsx(v,{value:r/o*100,className:e("h-2",u)})]})}export{M as S};
@@ -0,0 +1 @@
1
+ import{aR as t}from"./index-CE0k7Rdh.js";const e=[["path",{d:"M21 5H3",key:"1fi0y6"}],["path",{d:"M17 12H7",key:"16if0g"}],["path",{d:"M19 19H5",key:"vjpgq2"}]],o=t("text-align-center",e);const a=[["path",{d:"M21 5H3",key:"1fi0y6"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M21 19H7",key:"4cu937"}]],i=t("text-align-end",a);const n=[["path",{d:"M21 5H3",key:"1fi0y6"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M17 19H3",key:"z6ezky"}]],c=t("text-align-start",n);export{c as T,o as a,i as b};
@@ -0,0 +1 @@
1
+ import{aR as a}from"./index-CE0k7Rdh.js";const t=[["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],o=a("trash",t);export{o as T};
@@ -0,0 +1 @@
1
+ import{r as a}from"./index-CE0k7Rdh.js";function X(i){return{...i,alias:"mock-alias",created_at:i.created_at||new Date().toISOString(),updated_at:i.updated_at||new Date().toISOString(),is_removed:!1,is_actived:i.is_actived??!0}}function Y(i,T={}){const{searchFields:w=[],defaultSort:y,pageSize:F=10,filterFn:b}=T,[g,d]=a.useState(i),[m,v]=a.useState(""),[c,M]=a.useState(y?.field||""),[D,I]=a.useState(y?.direction||"asc"),[l,C]=a.useState(1),[r,O]=a.useState(F),[S,u]=a.useState([]),[L,h]=a.useState(!1),[x,k]=a.useState(!1),p=a.useMemo(()=>{let e=g;if(m&&w.length>0){const s=m.toLowerCase();e=e.filter(t=>w.some(n=>{const f=t[n];return f&&String(f).toLowerCase().includes(s)}))}return b&&(e=e.filter(b)),e},[g,m,w,b]),P=a.useMemo(()=>c?[...p].sort((e,s)=>{const t=e[c],n=s[c];if(t===n)return 0;if(t==null)return 1;if(n==null)return-1;const f=t<n?-1:1;return D==="asc"?f:-f}):p,[p,c,D]),o=a.useMemo(()=>{const e=(l-1)*r;return P.slice(e,e+r)},[P,l,r]),_=Math.ceil(P.length/r),E=P.length,A=a.useMemo(()=>({data:o,currentPage:l,totalPages:_,totalItems:E,itemsPerPage:r,hasNextPage:l<_,hasPreviousPage:l>1}),[o,l,_,E,r]),V=a.useCallback(e=>{v(e),C(1)},[]),q=a.useCallback(e=>{c===e?I(s=>s==="asc"?"desc":"asc"):(M(e),I("asc"))},[c]),z=a.useCallback(e=>{C(e)},[]),N=a.useCallback(e=>{O(e),C(1)},[]),$=a.useCallback(e=>{u(s=>s.includes(e)?s.filter(t=>t!==e):[...s,e])},[]),j=a.useCallback(()=>{const e=o.map(t=>t.id),s=e.every(t=>S.includes(t));u(s?t=>t.filter(n=>!e.includes(n)):t=>[...new Set([...t,...e])])},[o,S]),B=a.useCallback(()=>{u([])},[]),G=a.useCallback(()=>{v(""),M(""),I("asc"),C(1)},[]),H=a.useMemo(()=>{const e=o.map(s=>s.id);return e.length>0&&e.every(s=>S.includes(s))},[o,S]),J=a.useCallback(async e=>{h(!0),await new Promise(t=>setTimeout(t,300));const s={...e,id:`${Date.now()}`,alias:"mock-alias",created_at:new Date().toISOString(),updated_at:new Date().toISOString(),is_removed:!1,is_actived:!0};d(t=>[s,...t]),h(!1)},[]),K=a.useCallback(async(e,s)=>{h(!0),await new Promise(t=>setTimeout(t,300)),d(t=>t.map(n=>n.id===e?{...n,...s,updated_at:new Date().toISOString()}:n)),h(!1)},[]),Q=a.useCallback(e=>{k(!0),setTimeout(()=>{d(s=>s.filter(t=>t.id!==e)),u(s=>s.filter(t=>t!==e)),k(!1)},300)},[]),R=a.useCallback(async e=>{k(!0),await new Promise(s=>setTimeout(s,300)),d(s=>s.filter(t=>!e.includes(t.id))),u([]),k(!1)},[]),U=a.useCallback(()=>{d([...g])},[g]);return{entities:o,pagination:A,isLoading:L,isDeleting:x,searchTerm:m,handleSearch:V,sortField:c,sortDirection:D,handleSort:q,currentPage:l,itemsPerPage:r,handlePageChange:z,handleItemsPerPageChange:N,selectedIds:S,selectItem:$,selectAll:j,clearSelection:B,isAllSelected:H,clearFilters:G,deleteEntity:Q,bulkDelete:R,refetch:U,createEntity:J,updateEntity:K}}export{X as c,Y as u};
@@ -0,0 +1 @@
1
+ import{aR as c}from"./index-CE0k7Rdh.js";const e=[["path",{d:"m16 11 2 2 4-4",key:"9rsbq5"}],["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],a=c("user-check",e);export{a as U};
@@ -0,0 +1 @@
1
+ import{aR as e}from"./index-CE0k7Rdh.js";const y=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]],s=e("user-plus",y);export{s as U};
@@ -60,7 +60,8 @@ function copyDirRecursive(src, dest) {
60
60
  return count;
61
61
  }
62
62
  async function syncDocs() {
63
- console.log("\u{1F4E5} Sincronizando documenta\xE7\xE3o do forlogic-core...\n");
63
+ console.log("\u{1F4E5} Sincronizando regras e conven\xE7\xF5es do forlogic-core...\n");
64
+ console.log("\u2139\uFE0F Detalhes de componentes, props e tipos s\xE3o lidos via cross-project.\n");
64
65
  let pkgPath;
65
66
  try {
66
67
  pkgPath = resolvePackagePath();
@@ -75,9 +76,7 @@ async function syncDocs() {
75
76
  let successCount = 0;
76
77
  let errorCount = 0;
77
78
  const filesToCopy = [
78
- { src: path.join(pkgPath, "README.md"), dest: path.join(projectRoot, "README.md"), label: "README.md" },
79
- { src: path.join(pkgPath, "docs", "KNOWLEDGE.md"), dest: path.join(projectRoot, "docs", "KNOWLEDGE.md"), label: "docs/KNOWLEDGE.md" },
80
- { src: path.join(pkgPath, "docs", "DESIGN_SYSTEM.md"), dest: path.join(projectRoot, "docs", "DESIGN_SYSTEM.md"), label: "docs/DESIGN_SYSTEM.md" }
79
+ { src: path.join(pkgPath, "docs", "KNOWLEDGE.md"), dest: path.join(projectRoot, "docs", "KNOWLEDGE.md"), label: "docs/KNOWLEDGE.md" }
81
80
  ];
82
81
  for (const file of filesToCopy) {
83
82
  if (copyFile(file.src, file.dest)) {
@@ -89,14 +88,14 @@ async function syncDocs() {
89
88
  errorCount++;
90
89
  }
91
90
  }
92
- const memorySrc = path.join(pkgPath, ".note", "memory");
93
- const memoryDest = path.join(projectRoot, ".note", "memory");
94
- if (fs.existsSync(memorySrc)) {
95
- const filesCopied = copyDirRecursive(memorySrc, memoryDest);
96
- console.log(`\u2705 .note/memory/ (${filesCopied} arquivos)`);
91
+ const rulesSrc = path.join(pkgPath, ".note", "memory", "rules");
92
+ const rulesDest = path.join(projectRoot, ".note", "memory", "rules");
93
+ if (fs.existsSync(rulesSrc)) {
94
+ const filesCopied = copyDirRecursive(rulesSrc, rulesDest);
95
+ console.log(`\u2705 .note/memory/rules/ (${filesCopied} arquivos)`);
97
96
  successCount++;
98
97
  } else {
99
- console.warn("\u26A0\uFE0F .note/memory/ \u2014 n\xE3o encontrado no pacote");
98
+ console.warn("\u26A0\uFE0F .note/memory/rules/ \u2014 n\xE3o encontrado no pacote");
100
99
  errorCount++;
101
100
  }
102
101
  console.log("\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501");
@@ -108,9 +107,11 @@ async function syncDocs() {
108
107
  console.log("");
109
108
  if (successCount > 0) {
110
109
  console.log("\u{1F4A1} Arquivos sincronizados:");
111
- console.log(" docs/KNOWLEDGE.md \u2014 Custom Knowledge para Lovable");
112
- console.log(" docs/DESIGN_SYSTEM.md \u2014 Documenta\xE7\xE3o do Design System");
113
- console.log(" .note/memory/ \u2014 Contexto de IA (regras, padr\xF5es, componentes)\n");
110
+ console.log(" docs/KNOWLEDGE.md \u2014 Regras cr\xEDticas + mapa de m\xF3dulos");
111
+ console.log(" .note/memory/rules/ \u2014 Regras de schema, RLS, \xEDndices, .env");
112
+ console.log("");
113
+ console.log("\u{1F4D6} Documenta\xE7\xE3o de componentes, props e padr\xF5es s\xE3o lidos");
114
+ console.log(" diretamente do forlogic-core via cross-project.\n");
114
115
  }
115
116
  }
116
117
  syncDocs();
@@ -1,4 +1,4 @@
1
- import { ReactNode } from "react";
1
+ import { type ReactNode } from "react";
2
2
  import { Module } from "./types";
3
3
  export interface ModuleAccessGuardProps {
4
4
  children: ReactNode;
@@ -14,5 +14,27 @@ export interface ModuleAccessGuardProps {
14
14
  saberGestaoUrl?: string;
15
15
  /** URL da Wiki */
16
16
  wikiUrl?: string;
17
+ /**
18
+ * Rotas que ignoram o guard (bypass).
19
+ * Suporta glob simples com `*` no final: `/public/*` faz match com `/public/qualquer-coisa`.
20
+ * Sem `bypassPaths` → comportamento padrão (todas as rotas protegidas).
21
+ */
22
+ bypassPaths?: string[];
23
+ /**
24
+ * Mapa declarativo de rotas → conteúdo customizado no dialog de acesso negado.
25
+ * As chaves são paths (suportam glob com `*` no final).
26
+ * Se a rota atual faz match, o conteúdo substitui o grid de módulos.
27
+ * Se nenhuma rota faz match → grid padrão.
28
+ *
29
+ * Defina em arquivo separado para manter o App.tsx limpo:
30
+ * ```tsx
31
+ * // src/config/accessDeniedRoutes.tsx
32
+ * export const accessDeniedRoutes = {
33
+ * '/docs/matrix-link': <ModuleOfferContent title="Conheça Staff" ... />,
34
+ * '/reports/*': <ModuleOfferContent title="Relatórios" ... />,
35
+ * };
36
+ * ```
37
+ */
38
+ accessDeniedRoutes?: Record<string, ReactNode>;
17
39
  }
18
- export declare function ModuleAccessGuard({ children, contractedModules, onModuleClick, onModuleInterest, educaUrl, saberGestaoUrl, wikiUrl, }: ModuleAccessGuardProps): import("react/jsx-runtime").JSX.Element;
40
+ export declare function ModuleAccessGuard({ children, contractedModules, onModuleClick, onModuleInterest, educaUrl, saberGestaoUrl, wikiUrl, bypassPaths, accessDeniedRoutes, }: ModuleAccessGuardProps): import("react/jsx-runtime").JSX.Element;
@@ -47,6 +47,8 @@ export interface ComboTreeOption {
47
47
  iconSelected?: React.ComponentType<{
48
48
  className?: string;
49
49
  }>;
50
+ /** Custom className for the icon (e.g. color) */
51
+ iconClassName?: string;
50
52
  children?: ComboTreeOption[];
51
53
  }
52
54
  export interface ComboTreeProps {
@@ -1,7 +1,12 @@
1
1
  import { ReactNode } from 'react';
2
+ export interface PageBreadcrumbItem {
3
+ label: string;
4
+ href?: string;
5
+ }
2
6
  interface PageMetadata {
3
7
  title?: string;
4
- subtitle?: string;
8
+ subtitle?: ReactNode;
9
+ breadcrumbs?: PageBreadcrumbItem[];
5
10
  }
6
11
  interface PageMetadataContextType {
7
12
  metadata: PageMetadata;
@@ -0,0 +1,17 @@
1
+ import type { CrudColumn, BaseEntity } from '../../types';
2
+ export interface ColumnSettingsPopoverProps<T> {
3
+ columns: CrudColumn<T>[];
4
+ columnOrder: string[];
5
+ isColumnHidden: (key: string) => boolean;
6
+ toggleColumn: (key: string) => void;
7
+ showAllColumns: () => void;
8
+ reorderColumns: (fromIndex: number, toIndex: number) => void;
9
+ /** @deprecated Use groupByColumns + addGroupByColumn + removeGroupByColumn */
10
+ groupByColumn?: string | null;
11
+ /** @deprecated Use addGroupByColumn/removeGroupByColumn */
12
+ setGroupByColumn?: (key: string | null) => void;
13
+ groupByColumns?: string[];
14
+ addGroupByColumn?: (key: string) => void;
15
+ removeGroupByColumn?: (key: string) => void;
16
+ }
17
+ export declare function ColumnSettingsPopover<T extends BaseEntity>({ columns, columnOrder, isColumnHidden, toggleColumn, showAllColumns, reorderColumns, groupByColumn, setGroupByColumn, groupByColumns, addGroupByColumn, removeGroupByColumn, }: ColumnSettingsPopoverProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -31,8 +31,9 @@ export interface CrudActionBarProps<T extends BaseEntity = BaseEntity> {
31
31
  onViewModeChange?: (mode: ViewMode) => void;
32
32
  showViewToggle?: boolean;
33
33
  availableViewModes?: ViewMode[];
34
+ rightSlot?: React.ReactNode;
34
35
  className?: string;
35
36
  }
36
- declare function CrudActionBarComponent<T extends BaseEntity = BaseEntity>({ onNew, newButtonLabel, showNewButton, showSearch, searchValue, onSearchChange, searchPlaceholder, showBulkActions, selectedCount, bulkActions, onBulkDelete, onClearSelection, customActions, filters, viewMode, onViewModeChange, showViewToggle, availableViewModes, className, }: CrudActionBarProps<T>): import("react/jsx-runtime").JSX.Element;
37
+ declare function CrudActionBarComponent<T extends BaseEntity = BaseEntity>({ onNew, newButtonLabel, showNewButton, showSearch, searchValue, onSearchChange, searchPlaceholder, showBulkActions, selectedCount, bulkActions, onBulkDelete, onClearSelection, customActions, filters, viewMode, onViewModeChange, showViewToggle, availableViewModes, rightSlot, className, }: CrudActionBarProps<T>): import("react/jsx-runtime").JSX.Element;
37
38
  export declare const CrudActionBar: typeof CrudActionBarComponent;
38
39
  export default CrudActionBar;
@@ -17,6 +17,8 @@ export interface CrudTableProps<T extends BaseEntity & {
17
17
  onClick: () => void;
18
18
  }>;
19
19
  enableBulkActions?: boolean;
20
+ /** Variante de ações por linha: 'dropdown' (padrão) ou 'inline' (hover estilo Google Drive) */
21
+ rowActionsVariant?: 'dropdown' | 'inline';
20
22
  onNew?: () => void;
21
23
  newButtonLabel?: string;
22
24
  showNewButton?: boolean;
@@ -36,6 +38,8 @@ export interface CrudTableProps<T extends BaseEntity & {
36
38
  showViewToggle?: boolean;
37
39
  enableColumnResize?: boolean;
38
40
  resizeStorageKey?: string;
41
+ enableColumnManager?: boolean;
42
+ columnManagerStorageKey?: string;
39
43
  }
40
- export declare const CrudTable: <T extends BaseEntity>({ manager, columns, onEdit, onView, onToggleStatus, onDelete, renderActions, customRowActions, enableBulkActions, onNew, newButtonLabel, showNewButton, customActions, hideActionBar, showActionBar, showSearch, searchValue, onSearchChange, searchPlaceholder, bulkActions, onBulkDelete, filters, viewMode, onViewModeChange, showViewToggle, enableColumnResize, resizeStorageKey }: CrudTableProps<T>) => import("react/jsx-runtime").JSX.Element;
44
+ export declare const CrudTable: <T extends BaseEntity>({ manager, columns, onEdit, onView, onToggleStatus, onDelete, renderActions, customRowActions, enableBulkActions, rowActionsVariant, onNew, newButtonLabel, showNewButton, customActions, hideActionBar, showActionBar, showSearch, searchValue, onSearchChange, searchPlaceholder, bulkActions, onBulkDelete, filters, viewMode, onViewModeChange, showViewToggle, enableColumnResize, resizeStorageKey, enableColumnManager, columnManagerStorageKey, }: CrudTableProps<T>) => import("react/jsx-runtime").JSX.Element;
41
45
  export default CrudTable;
@@ -0,0 +1,16 @@
1
+ import type { CrudColumn, BaseEntity } from '../../types';
2
+ export interface GroupDropZoneProps<T> {
3
+ columns: CrudColumn<T>[];
4
+ groupByColumns: string[];
5
+ addGroupByColumn: (key: string) => void;
6
+ removeGroupByColumn: (key: string) => void;
7
+ reorderGroupByColumns: (fromIndex: number, toIndex: number) => void;
8
+ }
9
+ /**
10
+ * GroupDropZone
11
+ *
12
+ * Zona de drop acima da tabela onde headers de colunas podem ser arrastados
13
+ * para agrupar os dados. Mostra chips com os agrupamentos ativos.
14
+ * Suporta reordenação dos chips por drag-and-drop.
15
+ */
16
+ export declare function GroupDropZone<T extends BaseEntity>({ columns, groupByColumns, addGroupByColumn, removeGroupByColumn, reorderGroupByColumns, }: GroupDropZoneProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ interface InlineRowActionsProps {
3
+ onEdit?: () => void;
4
+ onDelete?: () => void;
5
+ canDelete?: boolean;
6
+ onToggleStatus?: () => void;
7
+ isActive?: boolean;
8
+ customActions?: Array<{
9
+ icon: any;
10
+ label: string;
11
+ onClick: () => void;
12
+ }>;
13
+ }
14
+ export declare const InlineRowActions: React.FC<InlineRowActionsProps>;
15
+ export {};
@@ -0,0 +1,19 @@
1
+ import type React from 'react';
2
+ export interface UseColumnDragReorderOptions {
3
+ enabled?: boolean;
4
+ onReorder: (fromIndex: number, toIndex: number) => void;
5
+ }
6
+ export interface UseColumnDragReorderReturn {
7
+ dragFromIndex: number | null;
8
+ dragOverIndex: number | null;
9
+ isDragging: boolean;
10
+ getDragProps: (index: number, columnKey?: string) => {
11
+ draggable: boolean;
12
+ onDragStart: (e: React.DragEvent) => void;
13
+ onDragOver: (e: React.DragEvent) => void;
14
+ onDragEnter: (e: React.DragEvent) => void;
15
+ onDrop: (e: React.DragEvent) => void;
16
+ onDragEnd: () => void;
17
+ };
18
+ }
19
+ export declare function useColumnDragReorder({ enabled, onReorder, }: UseColumnDragReorderOptions): UseColumnDragReorderReturn;
@@ -0,0 +1,56 @@
1
+ import type { CrudColumn, BaseEntity } from '../../types';
2
+ export interface ColumnManagerState {
3
+ hiddenColumns: Set<string>;
4
+ columnOrder: string[];
5
+ groupByColumns: string[];
6
+ }
7
+ export interface UseColumnManagerOptions<T> {
8
+ columns: CrudColumn<T>[];
9
+ storageKey?: string;
10
+ enabled?: boolean;
11
+ }
12
+ export interface UseColumnManagerReturn<T> {
13
+ /** Columns filtered by visibility and reordered */
14
+ visibleColumns: CrudColumn<T>[];
15
+ /** All original columns (for the settings popover) */
16
+ allColumns: CrudColumn<T>[];
17
+ /** Whether a column is hidden */
18
+ isColumnHidden: (key: string) => boolean;
19
+ /** Toggle column visibility */
20
+ toggleColumn: (key: string) => void;
21
+ /** Show all columns */
22
+ showAllColumns: () => void;
23
+ /** Current column order (keys) */
24
+ columnOrder: string[];
25
+ /** Reorder columns */
26
+ reorderColumns: (fromIndex: number, toIndex: number) => void;
27
+ /** @deprecated Use groupByColumns instead */
28
+ groupByColumn: string | null;
29
+ /** @deprecated Use setGroupByColumns / addGroupByColumn instead */
30
+ setGroupByColumn: (key: string | null) => void;
31
+ /** Current group-by columns (ordered, multi-level) */
32
+ groupByColumns: string[];
33
+ /** Set all group-by columns at once */
34
+ setGroupByColumns: (keys: string[]) => void;
35
+ /** Add a column to grouping (appends at end) */
36
+ addGroupByColumn: (key: string) => void;
37
+ /** Remove a column from grouping */
38
+ removeGroupByColumn: (key: string) => void;
39
+ /** Reorder group-by columns */
40
+ reorderGroupByColumns: (fromIndex: number, toIndex: number) => void;
41
+ /** Groups computed from data (supports multi-level) */
42
+ getGroupedData: (data: T[]) => GroupedData<T>[];
43
+ /** Collapsed group keys */
44
+ collapsedGroups: Set<string>;
45
+ /** Toggle group collapse */
46
+ toggleGroupCollapse: (groupKey: string) => void;
47
+ }
48
+ export interface GroupedData<T> {
49
+ groupKey: string;
50
+ groupValue: string;
51
+ items: T[];
52
+ count: number;
53
+ level: number;
54
+ children?: GroupedData<T>[];
55
+ }
56
+ export declare function useColumnManager<T extends BaseEntity>({ columns, storageKey, enabled, }: UseColumnManagerOptions<T>): UseColumnManagerReturn<T>;
@@ -23,4 +23,4 @@
23
23
  import type { TableProps } from './types';
24
24
  export declare function Table<T extends {
25
25
  id: string;
26
- }>({ data, columns, sortField, sortDirection, onSort, onRowClick, renderActions, isLoading, emptyMessage, className, enableSelection, selectedIds, onSelectItem, onSelectAll, isAllSelected, enableColumnResize, onColumnResize, storageKey }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
26
+ }>({ data, columns, sortField, sortDirection, onSort, onRowClick, renderActions, isLoading, emptyMessage, className, enableSelection, selectedIds, onSelectItem, onSelectAll, isAllSelected, enableColumnResize, onColumnResize, enableColumnReorder, onReorderColumns, storageKey }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { TreeNode, TreeTableProps } from './types';
2
+ export declare function TreeTable<T extends TreeNode>({ data, columns, nameKey, nameHeader, iconComponent, expandedIds, onToggleExpand, onRowClick, renderActions, actionsHeader, rowActionsVariant, isLoading, emptyMessage, className, }: TreeTableProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -8,4 +8,5 @@ export { Table } from './Table';
8
8
  export { ActionMenu } from './ActionMenu';
9
9
  export { Pagination } from './Pagination';
10
10
  export { FilterBar } from './FilterBar';
11
- export type { TableProps, TableColumn, ActionMenuProps, ActionItem, PaginationProps, FilterBarProps, } from './types';
11
+ export { TreeTable } from './TreeTable';
12
+ export type { TableProps, TableColumn, ActionMenuProps, ActionItem, PaginationProps, FilterBarProps, TreeNode, TreeTableColumn, TreeTableProps, } from './types';
@@ -30,6 +30,8 @@ export interface TableProps<T> {
30
30
  enableColumnResize?: boolean;
31
31
  columnWidths?: Record<string, number>;
32
32
  onColumnResize?: (widths: Record<string, number>) => void;
33
+ enableColumnReorder?: boolean;
34
+ onReorderColumns?: (fromIndex: number, toIndex: number) => void;
33
35
  storageKey?: string;
34
36
  }
35
37
  export interface ActionItem {
@@ -66,6 +68,37 @@ export interface PaginationProps {
66
68
  onItemsPerPageChange: (limit: number) => void;
67
69
  variant?: 'full' | 'compact';
68
70
  }
71
+ export interface TreeNode {
72
+ id: string;
73
+ children?: TreeNode[];
74
+ [key: string]: any;
75
+ }
76
+ export interface TreeTableColumn<T = any> {
77
+ key: keyof T;
78
+ header: string;
79
+ render?: (item: T, level: number) => React.ReactNode;
80
+ className?: string;
81
+ width?: number;
82
+ /** Conteúdo exibido no HoverCard ao passar o mouse sobre o valor */
83
+ hoverContent?: (item: T) => React.ReactNode;
84
+ }
85
+ export interface TreeTableProps<T extends TreeNode = TreeNode> {
86
+ data: T[];
87
+ columns: TreeTableColumn<T>[];
88
+ nameKey: keyof T;
89
+ nameHeader?: string;
90
+ iconComponent?: React.ReactNode;
91
+ expandedIds: Set<string>;
92
+ onToggleExpand: (id: string) => void;
93
+ onRowClick?: (item: T) => void;
94
+ renderActions?: (item: T) => React.ReactNode;
95
+ actionsHeader?: string;
96
+ /** 'default' mostra sempre; 'inline' mostra apenas no hover (estilo Google Drive) */
97
+ rowActionsVariant?: 'default' | 'inline';
98
+ isLoading?: boolean;
99
+ emptyMessage?: string;
100
+ className?: string;
101
+ }
69
102
  export interface FilterBarProps {
70
103
  searchValue?: string;
71
104
  onSearchChange?: (value: string) => void;