forlogic-core 1.20.0 → 2.0.0
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.
- package/.note/memory/patterns/alias-url-resolution.md +5 -2
- package/.note/memory/patterns/single-scroll-pattern.md +30 -12
- package/dist/action-plans/components/ActionPlanAttachmentsTab.d.ts +18 -0
- package/dist/action-plans/components/ActionPlanCommentsTab.d.ts +18 -0
- package/dist/action-plans/components/ActionPlanCostTab.d.ts +10 -0
- package/dist/action-plans/components/ActionPlanGeneralTab.d.ts +18 -0
- package/dist/action-plans/components/ActionPlanHistoryTab.d.ts +13 -0
- package/dist/action-plans/components/ActionPlanPage.d.ts +25 -0
- package/dist/action-plans/components/ActionPlanPredecessorsTab.d.ts +10 -0
- package/dist/action-plans/components/ActionPlanProgressDialog.d.ts +13 -0
- package/dist/action-plans/components/ActionPlanProgressTab.d.ts +5 -0
- package/dist/action-plans/components/ActionPlanStatusBadge.d.ts +11 -0
- package/dist/action-plans/constants.d.ts +42 -0
- package/dist/action-plans/hooks/useActionPlan.d.ts +14 -0
- package/dist/action-plans/hooks/useActionPlanProgress.d.ts +15 -0
- package/dist/action-plans/index.d.ts +15 -0
- package/dist/action-plans/types.d.ts +353 -0
- package/dist/action-plans/utils/formatTime.d.ts +15 -0
- package/dist/approval-flow/components/ApprovalSidenav.d.ts +16 -0
- package/dist/approval-flow/components/ApproveDialog.d.ts +13 -0
- package/dist/approval-flow/components/SelectApproverDialog.d.ts +11 -0
- package/dist/approval-flow/index.d.ts +4 -0
- package/dist/approval-flow/types.d.ts +76 -0
- package/dist/assets/index.d.ts +1 -0
- package/dist/audit-trail/components/AuditTrailDetails.d.ts +17 -0
- package/dist/audit-trail/components/AuditTrailFilter.d.ts +19 -0
- package/dist/audit-trail/components/AuditTrailPage.d.ts +30 -0
- package/dist/audit-trail/index.d.ts +9 -0
- package/dist/audit-trail/types.d.ts +151 -0
- package/dist/audit-trail/utils.d.ts +38 -0
- package/dist/components/dashboards/dashboard-form.d.ts +50 -0
- package/dist/components/dashboards/dashboard-general-view.d.ts +109 -0
- package/dist/components/dashboards/dashboard-grid.d.ts +41 -0
- package/dist/components/dashboards/dashboard-list.d.ts +31 -0
- package/dist/components/dashboards/dashboard-panel-renderer.d.ts +21 -0
- package/dist/components/dashboards/dashboard-view.d.ts +38 -0
- package/dist/components/dashboards/helpers.d.ts +47 -0
- package/dist/components/dashboards/index.d.ts +9 -0
- package/dist/components/dashboards/panels/burndown-panel.d.ts +26 -0
- package/dist/components/dashboards/panels/cartesian-panel.d.ts +46 -0
- package/dist/components/dashboards/panels/index.d.ts +14 -0
- package/dist/components/dashboards/panels/list-panel.d.ts +30 -0
- package/dist/components/dashboards/panels/matrix-risk-panel.d.ts +49 -0
- package/dist/components/dashboards/panels/numeric-panel.d.ts +22 -0
- package/dist/components/dashboards/panels/panel-error.d.ts +8 -0
- package/dist/components/dashboards/panels/panel-header.d.ts +17 -0
- package/dist/components/dashboards/panels/panel-loader.d.ts +7 -0
- package/dist/components/dashboards/panels/panel-no-data.d.ts +6 -0
- package/dist/components/dashboards/panels/panel-unavailable.d.ts +6 -0
- package/dist/components/dashboards/panels/pareto-panel.d.ts +20 -0
- package/dist/components/dashboards/panels/performance-panel.d.ts +24 -0
- package/dist/components/dashboards/panels/pie-panel.d.ts +19 -0
- package/dist/components/dashboards/panels/text-panel.d.ts +18 -0
- package/dist/components/dashboards/types.d.ts +525 -0
- package/dist/components/ui/electronic-signature-dialog.d.ts +21 -0
- package/dist/components/ui/export-dialog.d.ts +28 -0
- package/dist/components/ui/iframe-dialog.d.ts +14 -0
- package/dist/components/ui/multiselect-permissions.d.ts +59 -0
- package/dist/components/ui/online-editor-dialog.d.ts +18 -0
- package/dist/components/ui/report-request-list.d.ts +44 -0
- package/dist/components/ui/stimulsoft-viewer.d.ts +20 -0
- package/dist/components/ui/terms-of-use-dialog.d.ts +56 -0
- package/dist/components/ui/timepicker.d.ts +11 -0
- package/dist/components/ui/users-groups-selector.d.ts +44 -0
- package/dist/components/ui/viewer-dialog.d.ts +77 -0
- package/dist/custom-form-fields/components/CustomFormFields.d.ts +8 -0
- package/dist/custom-form-fields/fields/FormDateField.d.ts +6 -0
- package/dist/custom-form-fields/fields/FormMultiSelectionField.d.ts +6 -0
- package/dist/custom-form-fields/fields/FormNumericField.d.ts +6 -0
- package/dist/custom-form-fields/fields/FormQuestionsField.d.ts +6 -0
- package/dist/custom-form-fields/fields/FormSingleSelectionField.d.ts +6 -0
- package/dist/custom-form-fields/fields/FormTextField.d.ts +6 -0
- package/dist/custom-form-fields/fields/FormTimeField.d.ts +6 -0
- package/dist/custom-form-fields/fields/FormUrlField.d.ts +6 -0
- package/dist/custom-form-fields/fields/ReadOnlyTextField.d.ts +6 -0
- package/dist/custom-form-fields/index.d.ts +13 -0
- package/dist/custom-form-fields/types.d.ts +143 -0
- package/dist/exports/action-plans.d.ts +16 -0
- package/dist/exports/audit-trail.d.ts +1 -0
- package/dist/exports/custom-form-fields.d.ts +1 -0
- package/dist/exports/file-upload.d.ts +1 -0
- package/dist/exports/ui.d.ts +12 -0
- package/dist/file-upload/components/SingleFileUpload.d.ts +43 -0
- package/dist/file-upload/index.d.ts +6 -0
- package/dist/file-upload/types.d.ts +11 -0
- package/dist/file-upload/utils/formatBytes.d.ts +1 -0
- package/dist/file-upload/utils/getFileExtension.d.ts +1 -0
- package/dist/hooks/useSidebarResize.d.ts +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/team-selector/components/TeamSelector.d.ts +24 -0
- package/dist/team-selector/index.d.ts +2 -0
- package/dist/team-selector/types.d.ts +10 -0
- package/docs/ICON_MIGRATION_GUIDE.md +177 -0
- package/package.json +1 -1
- package/dist/assets/AccordionDoc-BVPUJk8G.js +0 -31
- package/dist/assets/ActionButtonDoc-DLJ_K9ib.js +0 -47
- package/dist/assets/AlertDoc-CY1ybZeG.js +0 -37
- package/dist/assets/AppHeaderDoc-Crkw4dA9.js +0 -67
- package/dist/assets/AppSidebarDoc-ET-4j6wV.js +0 -204
- package/dist/assets/AuthDoc-B4v4Nci5.js +0 -192
- package/dist/assets/AvatarDoc-BLdMoyJd.js +0 -11
- package/dist/assets/BadgeDoc-CSNM1b6b.js +0 -36
- package/dist/assets/BaseFormDoc-DXiYuN6-.js +0 -169
- package/dist/assets/BodyContentDoc-Bp6YmUWX.js +0 -83
- package/dist/assets/BreadcrumbDoc-D7tqqTvo.js +0 -75
- package/dist/assets/ButtonDoc-C4JwIvU3.js +0 -41
- package/dist/assets/ButtonGroupDoc-QFfjC7Pm.js +0 -7
- package/dist/assets/CalendarDoc-COlEKqmv.js +0 -81
- package/dist/assets/CardDoc-BVhMoC2w.js +0 -49
- package/dist/assets/ChartDoc-BJ14EjI2.js +0 -111
- package/dist/assets/CheckboxDoc-Bcqpln9_.js +0 -55
- package/dist/assets/ColorPickerDoc-CcfmSwyC.js +0 -10
- package/dist/assets/ColorsFoundationDoc-uO6IiJbS.js +0 -13
- package/dist/assets/ComboTreeDoc-R4qE6XwB.js +0 -46
- package/dist/assets/ComboboxDoc-JIo_-gSN.js +0 -134
- package/dist/assets/ComponentDocTemplate-CRbRY-v5.js +0 -1
- package/dist/assets/ContextMenuDoc-C4-_0NLp.js +0 -182
- package/dist/assets/ContextsDoc-Cj9Aaoyo.js +0 -184
- package/dist/assets/CreateCrudPageDoc-D_SnMRJ2.js +0 -106
- package/dist/assets/CrudActionBarDoc-BYqtIabp.js +0 -112
- package/dist/assets/CrudGridDoc-DspxQrq5.js +0 -85
- package/dist/assets/CrudOverviewDoc-DLcOL_HZ.js +0 -14
- package/dist/assets/CrudPrimitivesDoc-BRS86nWg.js +0 -164
- package/dist/assets/CrudTableDoc-Daw8u2G_.js +0 -113
- package/dist/assets/DataListDoc-BrgVNhhR.js +0 -13
- package/dist/assets/DesignSystemHome-BFBNqq1J.js +0 -1
- package/dist/assets/DialogDoc-DCpRy4rg.js +0 -981
- package/dist/assets/DropdownMenuDoc-DT6LBa8Z.js +0 -175
- package/dist/assets/EmptyStateDoc-wydc09gG.js +0 -35
- package/dist/assets/EnvironmentsDoc-amIriwDD.js +0 -96
- package/dist/assets/ErrorBoundaryDoc-BEixy_Gl.js +0 -111
- package/dist/assets/FormDoc-DxoRt6p7.js +0 -81
- package/dist/assets/FoundationOverview-CxSbumIt.js +0 -1
- package/dist/assets/GridDoc-BpQqCMUE.js +0 -28
- package/dist/assets/HooksDoc-JNODhbaF.js +0 -665
- package/dist/assets/HoverCardDoc-CdqiYrIb.js +0 -31
- package/dist/assets/I18nDoc-B6LMXnE3.js +0 -232
- package/dist/assets/IconPickerDoc-BRdy58IC.js +0 -10
- package/dist/assets/IconsFoundationDoc-CrymfxTI.js +0 -33
- package/dist/assets/InputDoc-BK-SdpJ7.js +0 -211
- package/dist/assets/LabelDoc-DHvgzhaJ.js +0 -42
- package/dist/assets/LeadershipDoc-DRiB0spL.js +0 -416
- package/dist/assets/MediaDoc-B_vqnf72.js +0 -459
- package/dist/assets/MenubarDoc-Zvgczxe2.js +0 -165
- package/dist/assets/ModuleAccessDoc-Nuxb4S27.js +0 -153
- package/dist/assets/ModulesDialogDoc-iJWLkOZo.js +0 -46
- package/dist/assets/NavigationMenuDoc-CeWun1VF.js +0 -116
- package/dist/assets/OnboardingDialogDoc-xBL-rXeZ.js +0 -55
- package/dist/assets/PaginationDoc-CfvwxCMe.js +0 -98
- package/dist/assets/PaginationDoc-DqtRgXnF.js +0 -27
- package/dist/assets/PlacesDoc-nckioEzg.js +0 -226
- package/dist/assets/PopoverDoc-C3o2CZCT.js +0 -64
- package/dist/assets/ProgressDoc-BmWBNMPA.js +0 -29
- package/dist/assets/QualiexUserFieldDoc-CE1e4mx6.js +0 -149
- package/dist/assets/RadioGroupDoc-DMZH6NmR.js +0 -57
- package/dist/assets/RadiusDoc-BOZD3gPV.js +0 -7
- package/dist/assets/RequiredFieldsCounterDoc-CG-lmSSy.js +0 -58
- package/dist/assets/ResizableDoc-CqGkv6Cd.js +0 -104
- package/dist/assets/RichTextEditorDoc-m50ll-Od.js +0 -24
- package/dist/assets/ScrollAreaDoc-BzJ-APXo.js +0 -28
- package/dist/assets/SecurityDoc-B34gVeiV.js +0 -204
- package/dist/assets/SelectDoc-DXRv7QHK.js +0 -80
- package/dist/assets/SeparatorDoc-DcNh8k0P.js +0 -4
- package/dist/assets/ServicesDoc-8aXBd6yg.js +0 -308
- package/dist/assets/ShadowsDoc-Brl4hIDI.js +0 -9
- package/dist/assets/SignDoc-BdwerR-2.js +0 -66
- package/dist/assets/SkeletonDoc-BWgqgbDY.js +0 -54
- package/dist/assets/SliderDoc-E-NjbYVk.js +0 -41
- package/dist/assets/SpacingDoc-BzburM-r.js +0 -12
- package/dist/assets/SplitButtonDoc-BYUysmJp.js +0 -53
- package/dist/assets/StepSelectorDoc-PB1k4v7F.js +0 -41
- package/dist/assets/SwitchDoc-BLOG6kfj.js +0 -56
- package/dist/assets/TableDoc-Dwcs-lop.js +0 -128
- package/dist/assets/TabsDoc-Ovkh8ArV.js +0 -42
- package/dist/assets/TextareaDoc-DsBYxmbr.js +0 -46
- package/dist/assets/ToastDoc-BbZaFE_A.js +0 -157
- package/dist/assets/ToggleDoc-C28vbvhp.js +0 -51
- package/dist/assets/TooltipDoc-DL5cnLak.js +0 -58
- package/dist/assets/TruncatedCellDoc-BuDA8QcY.js +0 -12
- package/dist/assets/TypographyFoundationDoc-CPdH4PHa.js +0 -7
- package/dist/assets/UtilitiesDoc-CrQhyEfz.js +0 -145
- package/dist/assets/blocks-DO93nPjs.js +0 -1
- package/dist/assets/calendar-days-cMfwBSZx.js +0 -1
- package/dist/assets/circle-plus-D3NftMzS.js +0 -1
- package/dist/assets/circle-x-BVAVJ_oz.js +0 -1
- package/dist/assets/crown-B2MTZDnM.js +0 -1
- package/dist/assets/date-picker-zhJU-_kM.js +0 -1
- package/dist/assets/disabled-menu-item-C16xsaVs.js +0 -1
- package/dist/assets/drawer-oTqCOtsC.js +0 -3
- package/dist/assets/file-pen-line-CXv-Eye-.js +0 -1
- package/dist/assets/git-branch-V6-h6P9K.js +0 -1
- package/dist/assets/globe-CaUBIJU8.js +0 -1
- package/dist/assets/hash-B4MTXppl.js +0 -1
- package/dist/assets/hover-card-DEuucfxP.js +0 -1
- package/dist/assets/index-CE0k7Rdh.js +0 -312
- package/dist/assets/index-Cx3adT_u.css +0 -1
- package/dist/assets/life-buoy-BRndExxh.js +0 -1
- package/dist/assets/lucide-react-t7dCa4lv.js +0 -1
- package/dist/assets/monitor-Dg3HKTSE.js +0 -1
- package/dist/assets/package-3G45ARQh.js +0 -1
- package/dist/assets/pen-BYSSwjK4.js +0 -1
- package/dist/assets/pin-CMYagNhs.js +0 -1
- package/dist/assets/radio-group-BVun_Tmt.js +0 -1
- package/dist/assets/server-p0Sb0mKI.js +0 -1
- package/dist/assets/share-2-D-ZhCCq2.js +0 -1
- package/dist/assets/shield-x-Q7hAXWsG.js +0 -1
- package/dist/assets/step-selector-DHxgT2FL.js +0 -1
- package/dist/assets/text-align-start-6aYQqbX4.js +0 -1
- package/dist/assets/trash-DveAOiLF.js +0 -1
- package/dist/assets/useMockCrud-GY0KxHXr.js +0 -1
- package/dist/assets/user-check-CoGNBfIk.js +0 -1
- package/dist/assets/user-plus-Bad2xWIT.js +0 -1
- package/dist/index.html +0 -35
- package/dist/leadership/components/LeaderRow.d.ts +0 -9
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import{j as e,r as a,n as s,o as t,f as i,p as d,cD as u,cE as n,dy as l,cI as r,dz as g,dA as m,c$ as S,a7 as M,q as o,x as h,ce as I,T as v,dB as w,aN as f,v as N,cf as B,cF as T,cG as A,cH as k,M as P,bL as y,P as R,bI as L}from"./index-CE0k7Rdh.js";import{C as E}from"./ComponentDocTemplate-CRbRY-v5.js";import{D}from"./disabled-menu-item-C16xsaVs.js";import{a as G,K as q,G as U,L as z,C as O}from"./life-buoy-BRndExxh.js";import{U as V}from"./user-plus-Bad2xWIT.js";import{C as W}from"./circle-plus-D3NftMzS.js";function K(){return e.jsxs(s,{children:[e.jsx(t,{asChild:!0,children:e.jsxs(i,{variant:"outline",children:["Abrir Menu",e.jsx(M,{className:"ml-2 h-4 w-4"})]})}),e.jsxs(d,{className:"w-56",children:[e.jsx(u,{children:"Minha Conta"}),e.jsx(n,{}),e.jsxs(w,{children:[e.jsxs(o,{children:[e.jsx(f,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Perfil"}),e.jsx(r,{children:"⇧⌘P"})]}),e.jsxs(o,{children:[e.jsx(G,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Cobrança"}),e.jsx(r,{children:"⌘B"})]}),e.jsxs(o,{children:[e.jsx(N,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Configurações"}),e.jsx(r,{children:"⌘S"})]}),e.jsxs(o,{children:[e.jsx(q,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Atalhos de Teclado"}),e.jsx(r,{children:"⌘K"})]})]}),e.jsx(n,{}),e.jsxs(w,{children:[e.jsxs(o,{children:[e.jsx(B,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Equipe"})]}),e.jsxs(T,{children:[e.jsxs(A,{children:[e.jsx(V,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Convidar Usuários"})]}),e.jsxs(k,{className:"w-48",children:[e.jsxs(o,{children:[e.jsx(P,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Email"})]}),e.jsxs(o,{children:[e.jsx(y,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Mensagem"})]}),e.jsx(n,{}),e.jsxs(o,{children:[e.jsx(W,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Mais..."})]})]})]}),e.jsxs(o,{children:[e.jsx(R,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Nova Equipe"}),e.jsx(r,{children:"⌘+T"})]})]}),e.jsx(n,{}),e.jsxs(o,{children:[e.jsx(U,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"GitHub"})]}),e.jsxs(o,{children:[e.jsx(z,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Suporte"})]}),e.jsxs(o,{disabled:!0,children:[e.jsx(O,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"API"})]}),e.jsx(n,{}),e.jsxs(o,{children:[e.jsx(L,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Sair"}),e.jsx(r,{children:"⇧⌘Q"})]})]})]})}function H(){const[p,c]=a.useState(!0),[x,j]=a.useState(!1),[C,b]=a.useState(!1);return e.jsxs(s,{children:[e.jsx(t,{asChild:!0,children:e.jsx(i,{variant:"outline",children:"Opções de Visualização"})}),e.jsxs(d,{className:"w-56",children:[e.jsx(u,{children:"Aparência"}),e.jsx(n,{}),e.jsxs(l,{checked:p,onCheckedChange:c,children:["Barra de Status",e.jsx(r,{children:"⌘⇧S"})]}),e.jsx(l,{checked:x,onCheckedChange:j,children:"Barra de Atividades"}),e.jsxs(l,{checked:C,onCheckedChange:b,children:["Painel",e.jsx(r,{children:"⌘J"})]})]})]})}function J(){const[p,c]=a.useState("bottom");return e.jsxs(s,{children:[e.jsx(t,{asChild:!0,children:e.jsx(i,{variant:"outline",children:"Posição do Painel"})}),e.jsxs(d,{className:"w-48",children:[e.jsx(u,{children:"Posição"}),e.jsx(n,{}),e.jsxs(g,{value:p,onValueChange:c,children:[e.jsx(m,{value:"top",children:"Superior"}),e.jsx(m,{value:"bottom",children:"Inferior"}),e.jsx(m,{value:"right",children:"Direita"})]})]})]})}function F(){return e.jsx(S,{delayDuration:200,children:e.jsxs(s,{children:[e.jsx(t,{asChild:!0,children:e.jsxs(i,{variant:"outline",children:["Ações",e.jsx(M,{className:"ml-2 h-4 w-4"})]})}),e.jsxs(d,{className:"w-56",children:[e.jsx(u,{children:"Ações em Massa"}),e.jsx(n,{}),e.jsxs(o,{children:[e.jsx(h,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Exportar Todos"})]}),e.jsxs(D,{disabledReason:"Selecione ao menos um item para exportar",children:[e.jsx(h,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Exportar Selecionados"})]}),e.jsxs(o,{children:[e.jsx(I,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Importar"})]}),e.jsx(n,{}),e.jsxs(D,{disabledReason:"Você não possui permissão para exclusão em massa",children:[e.jsx(v,{className:"mr-2 h-4 w-4"}),e.jsx("span",{children:"Excluir em Massa"})]})]})]})})}const Q=`import {
|
|
2
|
-
DropdownMenu,
|
|
3
|
-
DropdownMenuContent,
|
|
4
|
-
DropdownMenuItem,
|
|
5
|
-
DropdownMenuLabel,
|
|
6
|
-
DropdownMenuSeparator,
|
|
7
|
-
DropdownMenuTrigger,
|
|
8
|
-
DropdownMenuShortcut,
|
|
9
|
-
DropdownMenuGroup,
|
|
10
|
-
DropdownMenuSub,
|
|
11
|
-
DropdownMenuSubContent,
|
|
12
|
-
DropdownMenuSubTrigger,
|
|
13
|
-
Button
|
|
14
|
-
} from "forlogic-core"
|
|
15
|
-
import { User, Settings, LogOut, ChevronDown } from "lucide-react"
|
|
16
|
-
|
|
17
|
-
<DropdownMenu>
|
|
18
|
-
<DropdownMenuTrigger asChild>
|
|
19
|
-
<Button variant="outline">
|
|
20
|
-
Abrir Menu
|
|
21
|
-
<ChevronDown className="ml-2 h-4 w-4" />
|
|
22
|
-
</Button>
|
|
23
|
-
</DropdownMenuTrigger>
|
|
24
|
-
<DropdownMenuContent className="w-56">
|
|
25
|
-
<DropdownMenuLabel>Minha Conta</DropdownMenuLabel>
|
|
26
|
-
<DropdownMenuSeparator />
|
|
27
|
-
<DropdownMenuGroup>
|
|
28
|
-
<DropdownMenuItem>
|
|
29
|
-
<User className="mr-2 h-4 w-4" />
|
|
30
|
-
<span>Perfil</span>
|
|
31
|
-
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
|
|
32
|
-
</DropdownMenuItem>
|
|
33
|
-
<DropdownMenuItem>
|
|
34
|
-
<Settings className="mr-2 h-4 w-4" />
|
|
35
|
-
<span>Configurações</span>
|
|
36
|
-
</DropdownMenuItem>
|
|
37
|
-
</DropdownMenuGroup>
|
|
38
|
-
<DropdownMenuSeparator />
|
|
39
|
-
<DropdownMenuItem>
|
|
40
|
-
<LogOut className="mr-2 h-4 w-4" />
|
|
41
|
-
<span>Sair</span>
|
|
42
|
-
</DropdownMenuItem>
|
|
43
|
-
</DropdownMenuContent>
|
|
44
|
-
</DropdownMenu>`,$=`import { useState } from "react"
|
|
45
|
-
import {
|
|
46
|
-
DropdownMenu,
|
|
47
|
-
DropdownMenuCheckboxItem,
|
|
48
|
-
DropdownMenuContent,
|
|
49
|
-
DropdownMenuLabel,
|
|
50
|
-
DropdownMenuSeparator,
|
|
51
|
-
DropdownMenuShortcut,
|
|
52
|
-
DropdownMenuTrigger,
|
|
53
|
-
Button
|
|
54
|
-
} from "forlogic-core"
|
|
55
|
-
|
|
56
|
-
function DropdownMenuWithCheckbox() {
|
|
57
|
-
const [showStatusBar, setShowStatusBar] = useState(true)
|
|
58
|
-
const [showActivityBar, setShowActivityBar] = useState(false)
|
|
59
|
-
const [showPanel, setShowPanel] = useState(false)
|
|
60
|
-
|
|
61
|
-
return (
|
|
62
|
-
<DropdownMenu>
|
|
63
|
-
<DropdownMenuTrigger asChild>
|
|
64
|
-
<Button variant="outline">Opções de Visualização</Button>
|
|
65
|
-
</DropdownMenuTrigger>
|
|
66
|
-
<DropdownMenuContent className="w-56">
|
|
67
|
-
<DropdownMenuLabel>Aparência</DropdownMenuLabel>
|
|
68
|
-
<DropdownMenuSeparator />
|
|
69
|
-
<DropdownMenuCheckboxItem
|
|
70
|
-
checked={showStatusBar}
|
|
71
|
-
onCheckedChange={setShowStatusBar}
|
|
72
|
-
>
|
|
73
|
-
Barra de Status
|
|
74
|
-
<DropdownMenuShortcut>⌘⇧S</DropdownMenuShortcut>
|
|
75
|
-
</DropdownMenuCheckboxItem>
|
|
76
|
-
<DropdownMenuCheckboxItem
|
|
77
|
-
checked={showActivityBar}
|
|
78
|
-
onCheckedChange={setShowActivityBar}
|
|
79
|
-
>
|
|
80
|
-
Barra de Atividades
|
|
81
|
-
</DropdownMenuCheckboxItem>
|
|
82
|
-
<DropdownMenuCheckboxItem
|
|
83
|
-
checked={showPanel}
|
|
84
|
-
onCheckedChange={setShowPanel}
|
|
85
|
-
>
|
|
86
|
-
Painel
|
|
87
|
-
<DropdownMenuShortcut>⌘J</DropdownMenuShortcut>
|
|
88
|
-
</DropdownMenuCheckboxItem>
|
|
89
|
-
</DropdownMenuContent>
|
|
90
|
-
</DropdownMenu>
|
|
91
|
-
)
|
|
92
|
-
}`,X=`import { useState } from "react"
|
|
93
|
-
import {
|
|
94
|
-
DropdownMenu,
|
|
95
|
-
DropdownMenuContent,
|
|
96
|
-
DropdownMenuLabel,
|
|
97
|
-
DropdownMenuRadioGroup,
|
|
98
|
-
DropdownMenuRadioItem,
|
|
99
|
-
DropdownMenuSeparator,
|
|
100
|
-
DropdownMenuTrigger,
|
|
101
|
-
Button
|
|
102
|
-
} from "forlogic-core"
|
|
103
|
-
|
|
104
|
-
function DropdownMenuWithRadio() {
|
|
105
|
-
const [position, setPosition] = useState("bottom")
|
|
106
|
-
|
|
107
|
-
return (
|
|
108
|
-
<DropdownMenu>
|
|
109
|
-
<DropdownMenuTrigger asChild>
|
|
110
|
-
<Button variant="outline">Posição do Painel</Button>
|
|
111
|
-
</DropdownMenuTrigger>
|
|
112
|
-
<DropdownMenuContent className="w-48">
|
|
113
|
-
<DropdownMenuLabel>Posição</DropdownMenuLabel>
|
|
114
|
-
<DropdownMenuSeparator />
|
|
115
|
-
<DropdownMenuRadioGroup value={position} onValueChange={setPosition}>
|
|
116
|
-
<DropdownMenuRadioItem value="top">Superior</DropdownMenuRadioItem>
|
|
117
|
-
<DropdownMenuRadioItem value="bottom">Inferior</DropdownMenuRadioItem>
|
|
118
|
-
<DropdownMenuRadioItem value="right">Direita</DropdownMenuRadioItem>
|
|
119
|
-
</DropdownMenuRadioGroup>
|
|
120
|
-
</DropdownMenuContent>
|
|
121
|
-
</DropdownMenu>
|
|
122
|
-
)
|
|
123
|
-
}`,Y=`import {
|
|
124
|
-
DropdownMenu,
|
|
125
|
-
DropdownMenuContent,
|
|
126
|
-
DropdownMenuItem,
|
|
127
|
-
DropdownMenuLabel,
|
|
128
|
-
DropdownMenuSeparator,
|
|
129
|
-
DropdownMenuTrigger,
|
|
130
|
-
DisabledMenuItem,
|
|
131
|
-
TooltipProvider,
|
|
132
|
-
Button
|
|
133
|
-
} from "forlogic-core"
|
|
134
|
-
import { Download, Trash2, Upload, ChevronDown } from "lucide-react"
|
|
135
|
-
|
|
136
|
-
function DropdownMenuWithDisabled() {
|
|
137
|
-
return (
|
|
138
|
-
<TooltipProvider delayDuration={200}>
|
|
139
|
-
<DropdownMenu>
|
|
140
|
-
<DropdownMenuTrigger asChild>
|
|
141
|
-
<Button variant="outline">
|
|
142
|
-
Ações
|
|
143
|
-
<ChevronDown className="ml-2 h-4 w-4" />
|
|
144
|
-
</Button>
|
|
145
|
-
</DropdownMenuTrigger>
|
|
146
|
-
<DropdownMenuContent className="w-56">
|
|
147
|
-
<DropdownMenuLabel>Ações em Massa</DropdownMenuLabel>
|
|
148
|
-
<DropdownMenuSeparator />
|
|
149
|
-
<DropdownMenuItem>
|
|
150
|
-
<Download className="mr-2 h-4 w-4" />
|
|
151
|
-
<span>Exportar Todos</span>
|
|
152
|
-
</DropdownMenuItem>
|
|
153
|
-
|
|
154
|
-
{/* Item desabilitado com tooltip explicativo */}
|
|
155
|
-
<DisabledMenuItem disabledReason="Selecione ao menos um item para exportar">
|
|
156
|
-
<Download className="mr-2 h-4 w-4" />
|
|
157
|
-
<span>Exportar Selecionados</span>
|
|
158
|
-
</DisabledMenuItem>
|
|
159
|
-
|
|
160
|
-
<DropdownMenuItem>
|
|
161
|
-
<Upload className="mr-2 h-4 w-4" />
|
|
162
|
-
<span>Importar</span>
|
|
163
|
-
</DropdownMenuItem>
|
|
164
|
-
<DropdownMenuSeparator />
|
|
165
|
-
|
|
166
|
-
{/* Item sem permissão */}
|
|
167
|
-
<DisabledMenuItem disabledReason="Você não possui permissão para exclusão em massa">
|
|
168
|
-
<Trash2 className="mr-2 h-4 w-4" />
|
|
169
|
-
<span>Excluir em Massa</span>
|
|
170
|
-
</DisabledMenuItem>
|
|
171
|
-
</DropdownMenuContent>
|
|
172
|
-
</DropdownMenu>
|
|
173
|
-
</TooltipProvider>
|
|
174
|
-
)
|
|
175
|
-
}`;function ae(){return e.jsx(E,{title:"Dropdown Menu",description:"Exibe um menu ao usuário — como um conjunto de ações ou funções — acionado por um botão ou elemento interativo.",component:e.jsx(K,{}),usage:Q,examples:[{title:"Com Checkbox Items",description:"Menu dropdown com itens de seleção múltipla usando checkbox.",preview:e.jsx(H,{}),code:$},{title:"Com Radio Items",description:"Menu dropdown com seleção única usando radio buttons.",preview:e.jsx(J,{}),code:X},{title:"Com Itens Desabilitados",description:"Itens desabilitados exibem tooltip explicando o motivo do bloqueio. O cursor muda para not-allowed e cliques são ignorados.",preview:e.jsx(F,{}),code:Y}],props:[{name:"DropdownMenu",type:"Component",description:"Componente raiz que envolve o trigger e o conteúdo do menu."},{name:"DropdownMenuTrigger",type:"Component",description:"Elemento que dispara a abertura do menu. Use asChild para renderizar um elemento personalizado."},{name:"DropdownMenuContent",type:"Component",description:"Container para os itens do menu. Aceita align, sideOffset e className."},{name:"DropdownMenuItem",type:"Component",description:"Item básico do menu. Aceita inset, disabled e onSelect."},{name:"DropdownMenuCheckboxItem",type:"Component",description:"Item com checkbox. Aceita checked e onCheckedChange."},{name:"DropdownMenuRadioGroup",type:"Component",description:"Agrupa radio items. Aceita value e onValueChange."},{name:"DropdownMenuRadioItem",type:"Component",description:"Item de seleção única dentro de um RadioGroup. Requer value."},{name:"DropdownMenuLabel",type:"Component",description:"Rótulo não interativo para agrupar itens. Aceita inset."},{name:"DropdownMenuSeparator",type:"Component",description:"Linha divisória visual entre grupos de itens."},{name:"DropdownMenuShortcut",type:"Component",description:"Exibe atalho de teclado alinhado à direita do item."},{name:"DropdownMenuGroup",type:"Component",description:"Agrupa itens relacionados para organização semântica."},{name:"DropdownMenuSub",type:"Component",description:"Container para submenu aninhado."},{name:"DropdownMenuSubTrigger",type:"Component",description:"Item que abre um submenu ao hover ou foco."},{name:"DropdownMenuSubContent",type:"Component",description:"Conteúdo do submenu aninhado."},{name:"DisabledMenuItem",type:"Component",description:"Item desabilitado com tooltip explicativo. Aceita disabledReason para exibir motivo do bloqueio."}],accessibility:["Abre com clique, Enter ou Espaço no trigger","Navegação completa por teclado usando setas direcionais","Enter ou Espaço para selecionar item focado","Escape fecha o menu e retorna foco ao trigger","Tab navega para fora do menu (fechando-o)","Suporte completo a WAI-ARIA com roles menu, menuitem, menuitemcheckbox e menuitemradio","Submenus acessíveis via seta direita (abrir) e seta esquerda (fechar)","Type-ahead: digitar caracteres foca no item correspondente","Itens desabilitados exibem tooltip explicativo no hover"]})}export{ae as DropdownMenuDoc};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import{j as e,ao as a}from"./index-CE0k7Rdh.js";import{C as o}from"./ComponentDocTemplate-CRbRY-v5.js";import{P as t}from"./package-3G45ARQh.js";function s(){return e.jsx(o,{title:"Empty State",description:"Componente para exibir estados vazios com ícone, mensagem e ação opcional.",component:e.jsxs("div",{className:"w-full space-y-8 border rounded-lg p-4",children:[e.jsx(a,{title:"Nenhum item encontrado",description:"Adicione seu primeiro item para começar",action:{label:"Adicionar Item",onClick:()=>alert("Adicionar item!")}}),e.jsx("div",{className:"border-t pt-4",children:e.jsx(a,{variant:"search",title:"Nenhum resultado encontrado",description:"Tente ajustar sua busca"})}),e.jsx("div",{className:"border-t pt-4",children:e.jsx(a,{variant:"error",title:"Erro ao carregar dados",description:"Não foi possível carregar as informações",action:{label:"Tentar Novamente",onClick:()=>alert("Tentando novamente...")}})}),e.jsx("div",{className:"border-t pt-4",children:e.jsx(a,{icon:e.jsx(t,{className:"h-8 w-8"}),title:"Sem produtos",description:"Nenhum produto cadastrado no sistema"})})]}),usage:`import { EmptyState } from "forlogic-core"
|
|
2
|
-
|
|
3
|
-
// Estado vazio padrão
|
|
4
|
-
<EmptyState
|
|
5
|
-
title="Nenhum item encontrado"
|
|
6
|
-
description="Adicione seu primeiro item para começar"
|
|
7
|
-
action={{
|
|
8
|
-
label: "Adicionar Item",
|
|
9
|
-
onClick: () => handleAddItem()
|
|
10
|
-
}}
|
|
11
|
-
/>
|
|
12
|
-
|
|
13
|
-
// Sem resultados de busca
|
|
14
|
-
<EmptyState
|
|
15
|
-
variant="search"
|
|
16
|
-
title="Nenhum resultado encontrado"
|
|
17
|
-
description="Tente ajustar sua busca"
|
|
18
|
-
/>
|
|
19
|
-
|
|
20
|
-
// Estado de erro
|
|
21
|
-
<EmptyState
|
|
22
|
-
variant="error"
|
|
23
|
-
title="Erro ao carregar dados"
|
|
24
|
-
description="Não foi possível carregar as informações"
|
|
25
|
-
action={{
|
|
26
|
-
label: "Tentar Novamente",
|
|
27
|
-
onClick: () => refetch()
|
|
28
|
-
}}
|
|
29
|
-
/>
|
|
30
|
-
|
|
31
|
-
// Ícone customizado
|
|
32
|
-
<EmptyState
|
|
33
|
-
icon={<Package className="h-8 w-8" />}
|
|
34
|
-
title="Sem produtos"
|
|
35
|
-
/>`,props:[{name:"icon",type:"ReactNode",default:"-",description:"Ícone customizado (sobrescreve o variant)."},{name:"title",type:"string",default:"-",description:"Título principal."},{name:"description",type:"string",default:"-",description:"Descrição opcional."},{name:"action",type:"{ label: string, onClick: () => void }",default:"-",description:"Botão de ação opcional."},{name:"variant",type:'"default" | "search" | "error"',default:"default",description:"Tipo de estado vazio."},{name:"className",type:"string",default:"-",description:"Classes CSS adicionais."}],accessibility:["Ícones pré-configurados por variant","Botão de ação opcional","Centralizado e responsivo","Suporte a ícone customizado"]})}export{s as EmptyStateDoc};
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./index-CE0k7Rdh.js";import{C as t,a as o}from"./ComponentDocTemplate-CRbRY-v5.js";const a=`import { getEnvironmentConfig } from 'forlogic-core';
|
|
2
|
-
import type { EnvironmentConfig } from 'forlogic-core';
|
|
3
|
-
|
|
4
|
-
// Retorna configuração baseada no VITE_SUPABASE_PROJECT_ID
|
|
5
|
-
const config = getEnvironmentConfig();
|
|
6
|
-
|
|
7
|
-
// Acessar OAuth
|
|
8
|
-
console.log(config.oauth.authUrl); // URL de login OAuth
|
|
9
|
-
console.log(config.oauth.clientId); // Client ID OAuth
|
|
10
|
-
|
|
11
|
-
// Acessar API URL
|
|
12
|
-
console.log(config.qualiexApiUrl); // URL base da API Qualiex
|
|
13
|
-
|
|
14
|
-
// Acessar Storage Project ID
|
|
15
|
-
console.log(config.storageProjectId); // ID do projeto para assets/storage`,i=`// lib/config/environments.ts
|
|
16
|
-
|
|
17
|
-
const PROD_PROJECT_ID = 'ccjfvpnndclajkleyqkc';
|
|
18
|
-
|
|
19
|
-
interface EnvironmentConfig {
|
|
20
|
-
storageProjectId: string;
|
|
21
|
-
oauth: { authUrl: string; clientId: string };
|
|
22
|
-
qualiexApiUrl: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Produção: login.qualiex.com, common-v4-api.qualiex.com
|
|
26
|
-
// Dev/Preview: login-dev.qualiex.com, common-v4-api-dev.qualiex.com
|
|
27
|
-
|
|
28
|
-
export function getEnvironmentConfig(): EnvironmentConfig {
|
|
29
|
-
const projectId = import.meta.env.VITE_SUPABASE_PROJECT_ID;
|
|
30
|
-
return projectId === PROD_PROJECT_ID ? PROD : DEV;
|
|
31
|
-
}`,n=`# ⚠️ Variáveis Supabase NÃO ficam no .env!
|
|
32
|
-
# Elas são extraídas automaticamente de src/integrations/supabase/client.ts
|
|
33
|
-
# pelo vite.config.ts e injetadas via "define" no build.
|
|
34
|
-
#
|
|
35
|
-
# O arquivo client.ts é auto-gerado pelo Lovable ao conectar o Supabase.
|
|
36
|
-
# Veja a seção "Arquitetura" abaixo para entender o fluxo.
|
|
37
|
-
|
|
38
|
-
# Variáveis manuais (configurar no .env):
|
|
39
|
-
VITE_IS_QUALIEX=true
|
|
40
|
-
VITE_SHOW_ADMIN_REPORTS=false
|
|
41
|
-
# VITE_WIKI_URL=https://...
|
|
42
|
-
|
|
43
|
-
# ❌ NÃO usar mais (derivadas automaticamente do Project ID):
|
|
44
|
-
# VITE_OAUTH_AUTH_URL
|
|
45
|
-
# VITE_OAUTH_CLIENT_ID
|
|
46
|
-
# VITE_QUALIEX_API_URL
|
|
47
|
-
# VITE_SUPABASE_PROJECT_ID_STORAGE
|
|
48
|
-
# VITE_SUPABASE_URL ← extraído do client.ts
|
|
49
|
-
# VITE_SUPABASE_PUBLISHABLE_KEY ← extraído do client.ts
|
|
50
|
-
# VITE_SUPABASE_PROJECT_ID ← derivado da URL no client.ts`,s=`// vite.config.ts — extrai URL e key do arquivo auto-gerado
|
|
51
|
-
|
|
52
|
-
function extractSupabaseConfig() {
|
|
53
|
-
const clientPath = path.resolve(__dirname, "src/integrations/supabase/client.ts");
|
|
54
|
-
const content = fs.readFileSync(clientPath, "utf-8");
|
|
55
|
-
const urlMatch = content.match(/SUPABASE_URL\\s*=\\s*["']([^"']+)["']/);
|
|
56
|
-
const keyMatch = content.match(/SUPABASE_PUBLISHABLE_KEY\\s*=\\s*["']([^"']+)["']/);
|
|
57
|
-
const url = urlMatch?.[1] ?? "";
|
|
58
|
-
const key = keyMatch?.[1] ?? "";
|
|
59
|
-
const projectId = url ? new URL(url).hostname.split(".")[0] : "";
|
|
60
|
-
return { url, key, projectId };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Injetados em import.meta.env via "define":
|
|
64
|
-
define: {
|
|
65
|
-
'import.meta.env.VITE_SUPABASE_URL': JSON.stringify(supabaseUrl),
|
|
66
|
-
'import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY': JSON.stringify(supabaseKey),
|
|
67
|
-
'import.meta.env.VITE_SUPABASE_PROJECT_ID': JSON.stringify(supabaseProjectId),
|
|
68
|
-
}`,r=`// eslint.config.js — bloqueia import direto do client auto-gerado
|
|
69
|
-
|
|
70
|
-
"no-restricted-imports": ["error", {
|
|
71
|
-
patterns: [{
|
|
72
|
-
group: ["@/integrations/supabase/client"],
|
|
73
|
-
message: "Use getSupabaseClient() from forlogic-core instead. "
|
|
74
|
-
+ "This file is auto-generated and exists only as data source "
|
|
75
|
-
+ "for vite.config.ts."
|
|
76
|
-
}]
|
|
77
|
-
}]
|
|
78
|
-
|
|
79
|
-
// ✅ CORRETO — usar clients da lib:
|
|
80
|
-
import { getSupabaseClient } from 'forlogic-core';
|
|
81
|
-
const supabase = getSupabaseClient();
|
|
82
|
-
|
|
83
|
-
// ❌ ERRADO — import direto (ESLint vai barrar):
|
|
84
|
-
import { supabase } from '@/integrations/supabase/client';`,c=`import { isDevSupabaseProject } from 'forlogic-core';
|
|
85
|
-
|
|
86
|
-
// Retorna true se o Supabase conectado NÃO é produção
|
|
87
|
-
const isDev = isDevSupabaseProject();
|
|
88
|
-
|
|
89
|
-
// Uso automático no NavigationProvider:
|
|
90
|
-
// Se isDev === true, o appName "Meu App" vira "Meu App (Dev)"
|
|
91
|
-
// Nenhuma mudança necessária nos módulos consumidores.
|
|
92
|
-
|
|
93
|
-
// Uso manual (ex: mostrar badge, desabilitar feature):
|
|
94
|
-
if (isDevSupabaseProject()) {
|
|
95
|
-
console.warn('Ambiente de desenvolvimento detectado');
|
|
96
|
-
}`;function u(){return e.jsx(t,{title:"Environments (Configuração por Project ID)",description:"Configurações de ambiente são extraídas automaticamente do arquivo auto-gerado pelo Lovable (src/integrations/supabase/client.ts) e injetadas pelo vite.config.ts. Não é necessário configurar variáveis Supabase no .env.",installation:a,usage:i,notes:["As variáveis Supabase (URL, Key, Project ID) NÃO ficam no .env — são extraídas do client.ts auto-gerado.",'O vite.config.ts lê o arquivo como texto (regex) e injeta via "define" no build.',"O import direto de @/integrations/supabase/client é bloqueado por ESLint (no-restricted-imports).","Use getSupabaseClient() de forlogic-core para obter o client Supabase correto.",'Produção é detectada pelo ID "ccjfvpnndclajkleyqkc". Qualquer outro ID usa configurações de dev.',"OAuth URL, Client ID, API URL e Storage Project ID são derivados automaticamente do Project ID.","VITE_IS_QUALIEX, VITE_WIKI_URL e VITE_SHOW_ADMIN_REPORTS continuam no .env manual.","Para trocar de ambiente, basta reconectar a outro projeto Supabase — tudo se ajusta."],children:e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"variaveis-env",className:"text-xl font-semibold mb-3",children:"Variáveis .env"}),e.jsx(o,{code:n,language:"bash"})]}),e.jsxs("div",{children:[e.jsx("h2",{id:"arquitetura",className:"text-xl font-semibold mb-3",children:"Arquitetura: Extração automática do client.ts"}),e.jsxs("p",{className:"text-sm text-muted-foreground mb-3",children:["O ",e.jsx("code",{children:"vite.config.ts"})," lê o arquivo ",e.jsx("code",{children:"src/integrations/supabase/client.ts"})," (auto-gerado pelo Lovable) via regex para extrair URL e Key. Esses valores são injetados em ",e.jsx("code",{children:"import.meta.env"})," via a propriedade ",e.jsx("code",{children:"define"})," do Vite."]}),e.jsx(o,{code:s,language:"typescript"})]}),e.jsxs("div",{children:[e.jsx("h2",{id:"is-dev-project",className:"text-xl font-semibold mb-3",children:"isDevSupabaseProject()"}),e.jsxs("p",{className:"text-sm text-muted-foreground mb-3",children:["Função utilitária que retorna ",e.jsx("code",{children:"true"})," quando o Supabase conectado ",e.jsx("strong",{children:"não"})," é o de produção. Usada internamente pelo ",e.jsx("code",{children:"NavigationProvider"})," para concatenar automaticamente ",e.jsx("code",{children:'" (Dev)"'})," ao ",e.jsx("code",{children:"appName"})," da sidebar."]}),e.jsx(o,{code:c,language:"typescript"})]}),e.jsxs("div",{children:[e.jsx("h2",{id:"eslint-protection",className:"text-xl font-semibold mb-3",children:"Proteção ESLint: Bloqueio de import direto"}),e.jsxs("p",{className:"text-sm text-muted-foreground mb-3",children:["O arquivo ",e.jsx("code",{children:"client.ts"})," auto-gerado exporta um Supabase client com ",e.jsx("code",{children:"persistSession: true"})," e ",e.jsx("code",{children:"localStorage"}),", incompatível com a arquitetura do projeto (que usa token externo via ",e.jsx("code",{children:"SupabaseSingleton"}),"). Uma regra ESLint impede o import acidental desse client:"]}),e.jsx(o,{code:r,language:"typescript"})]})]})})}export{u as EnvironmentsDoc};
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import{j as r,C as e,aD as a}from"./index-CE0k7Rdh.js";import{C as t}from"./ComponentDocTemplate-CRbRY-v5.js";const s=`import { ErrorBoundary } from 'forlogic-core';
|
|
2
|
-
|
|
3
|
-
// Envolver componentes que podem falhar
|
|
4
|
-
function App() {
|
|
5
|
-
return (
|
|
6
|
-
<ErrorBoundary>
|
|
7
|
-
<MyComponent />
|
|
8
|
-
</ErrorBoundary>
|
|
9
|
-
);
|
|
10
|
-
}`,n=`import { ErrorBoundary } from 'forlogic-core';
|
|
11
|
-
|
|
12
|
-
// ✅ Uso básico - UI de erro padrão
|
|
13
|
-
function App() {
|
|
14
|
-
return (
|
|
15
|
-
<ErrorBoundary>
|
|
16
|
-
<Header />
|
|
17
|
-
<MainContent />
|
|
18
|
-
<Footer />
|
|
19
|
-
</ErrorBoundary>
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// O ErrorBoundary captura erros de renderização e exibe:
|
|
24
|
-
// - Mensagem amigável "Algo deu errado"
|
|
25
|
-
// - Botão para ver detalhes técnicos (stack trace)
|
|
26
|
-
// - Histórico dos últimos erros
|
|
27
|
-
// - Botão para copiar detalhes
|
|
28
|
-
// - Botão para recarregar a página`,d=`import { ErrorBoundary } from 'forlogic-core';
|
|
29
|
-
|
|
30
|
-
// ✅ Fallback customizado
|
|
31
|
-
function App() {
|
|
32
|
-
return (
|
|
33
|
-
<ErrorBoundary
|
|
34
|
-
fallback={
|
|
35
|
-
<div className="flex flex-col items-center justify-center min-h-screen">
|
|
36
|
-
<h1 className="text-2xl font-bold text-destructive">
|
|
37
|
-
Ops! Algo deu errado
|
|
38
|
-
</h1>
|
|
39
|
-
<p className="text-muted-foreground mt-2">
|
|
40
|
-
Por favor, tente novamente mais tarde.
|
|
41
|
-
</p>
|
|
42
|
-
<Button
|
|
43
|
-
onClick={() => window.location.reload()}
|
|
44
|
-
className="mt-4"
|
|
45
|
-
>
|
|
46
|
-
Tentar Novamente
|
|
47
|
-
</Button>
|
|
48
|
-
</div>
|
|
49
|
-
}
|
|
50
|
-
>
|
|
51
|
-
<MyApp />
|
|
52
|
-
</ErrorBoundary>
|
|
53
|
-
);
|
|
54
|
-
}`,i=`import { ErrorBoundary } from 'forlogic-core';
|
|
55
|
-
|
|
56
|
-
// ✅ Boundaries granulares - isolar falhas
|
|
57
|
-
function Dashboard() {
|
|
58
|
-
return (
|
|
59
|
-
<div className="grid grid-cols-3 gap-4">
|
|
60
|
-
{/* Se um widget falhar, os outros continuam funcionando */}
|
|
61
|
-
<ErrorBoundary fallback={<WidgetError />}>
|
|
62
|
-
<SalesWidget />
|
|
63
|
-
</ErrorBoundary>
|
|
64
|
-
|
|
65
|
-
<ErrorBoundary fallback={<WidgetError />}>
|
|
66
|
-
<UsersWidget />
|
|
67
|
-
</ErrorBoundary>
|
|
68
|
-
|
|
69
|
-
<ErrorBoundary fallback={<WidgetError />}>
|
|
70
|
-
<RevenueWidget />
|
|
71
|
-
</ErrorBoundary>
|
|
72
|
-
</div>
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function WidgetError() {
|
|
77
|
-
return (
|
|
78
|
-
<Card className="h-full">
|
|
79
|
-
<CardContent className="flex items-center justify-center h-full">
|
|
80
|
-
<p className="text-muted-foreground text-sm">
|
|
81
|
-
Falha ao carregar widget
|
|
82
|
-
</p>
|
|
83
|
-
</CardContent>
|
|
84
|
-
</Card>
|
|
85
|
-
);
|
|
86
|
-
}`,c=`import { CoreProviders } from 'forlogic-core';
|
|
87
|
-
|
|
88
|
-
// ✅ CoreProviders já inclui ErrorBoundary
|
|
89
|
-
// Não precisa adicionar manualmente na raiz
|
|
90
|
-
function App() {
|
|
91
|
-
return (
|
|
92
|
-
<CoreProviders>
|
|
93
|
-
{/* ErrorBoundary já está ativo aqui */}
|
|
94
|
-
<Router>
|
|
95
|
-
<Routes />
|
|
96
|
-
</Router>
|
|
97
|
-
</CoreProviders>
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Use ErrorBoundary adicional apenas para isolamento granular
|
|
102
|
-
function FeaturePage() {
|
|
103
|
-
return (
|
|
104
|
-
<div>
|
|
105
|
-
<Header />
|
|
106
|
-
<ErrorBoundary fallback={<FeatureError />}>
|
|
107
|
-
<ComplexFeature />
|
|
108
|
-
</ErrorBoundary>
|
|
109
|
-
</div>
|
|
110
|
-
);
|
|
111
|
-
}`,l=[{name:"children",type:"ReactNode",default:"-",description:"Componentes filhos a serem protegidos pelo boundary."},{name:"fallback",type:"ReactNode",default:"UI padrão",description:"UI customizada a exibir quando ocorrer erro. Se não fornecido, usa a UI padrão com detalhes do erro."}];function o(){return r.jsx(e,{className:"w-full max-w-md mx-auto",children:r.jsxs("div",{className:"p-6 text-center space-y-4",children:[r.jsx("div",{className:"flex justify-center",children:r.jsx(a,{className:"h-12 w-12 text-destructive"})}),r.jsx("h3",{className:"text-lg font-semibold",children:"Algo deu errado"}),r.jsx("p",{className:"text-sm text-muted-foreground",children:"Ocorreu um erro inesperado. Tente recarregar a página."}),r.jsxs("div",{className:"space-y-2",children:[r.jsx("button",{className:"w-full px-4 py-2 text-sm border rounded-md hover:bg-muted",children:"Ver Detalhes Técnicos"}),r.jsx("button",{className:"w-full px-4 py-2 text-sm bg-primary text-primary-foreground rounded-md",children:"Recarregar Página"})]})]})})}function p(){return r.jsx(t,{title:"ErrorBoundary",description:"Componente de classe React que captura erros de renderização em componentes filhos, evitando que a aplicação inteira quebre.",usage:s,component:r.jsx(o,{}),examples:[{title:"Uso Básico",description:"Envolve componentes para capturar erros e exibir UI amigável.",preview:r.jsx(o,{}),code:n},{title:"Fallback Customizado",description:"Forneça sua própria UI de erro para casos específicos.",preview:r.jsxs("div",{className:"flex flex-col items-center justify-center p-8 bg-muted/50 rounded-lg",children:[r.jsx("h3",{className:"text-lg font-bold text-destructive",children:"Ops! Algo deu errado"}),r.jsx("p",{className:"text-muted-foreground mt-2 text-sm",children:"Por favor, tente novamente."})]}),code:d},{title:"Boundaries Granulares",description:"Isole falhas em componentes específicos para que o resto da UI continue funcionando.",preview:r.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[r.jsx(e,{className:"p-4 text-center text-xs",children:"Widget OK"}),r.jsx(e,{className:"p-4 text-center text-xs text-muted-foreground bg-muted/50",children:"Falha ao carregar"}),r.jsx(e,{className:"p-4 text-center text-xs",children:"Widget OK"})]}),code:i},{title:"Com CoreProviders",description:"CoreProviders já inclui ErrorBoundary na raiz. Use boundaries adicionais para isolamento.",preview:r.jsxs("div",{className:"p-4 border rounded-lg text-sm space-y-2",children:[r.jsxs("div",{className:"font-mono text-xs bg-muted p-2 rounded",children:["<CoreProviders>"," ← ErrorBoundary incluído"]}),r.jsxs("div",{className:"pl-4 font-mono text-xs bg-muted/50 p-2 rounded",children:["<ErrorBoundary>"," ← Adicional para isolamento"]})]}),code:c}],props:l,notes:["Em modo DEV (import.meta.env.DEV), erros são re-lançados para facilitar debugging.","Apenas erros de renderização são capturados. Erros em event handlers precisam de try/catch.","O ErrorBoundary integra com errorService para logging automático de erros.","A UI padrão inclui histórico dos últimos erros via errorService.getErrors().","CoreProviders já inclui ErrorBoundary - use boundaries adicionais apenas para isolamento granular.","Erros assíncronos (async/await, promises) não são capturados - use try/catch."]})}export{p as default};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import{j as e,I as o,f as r}from"./index-CE0k7Rdh.js";import{C as a}from"./ComponentDocTemplate-CRbRY-v5.js";function t(){return e.jsx(a,{title:"Form",description:"Construindo formulários com React Hook Form e Zod.",component:e.jsxs("div",{className:"w-full max-w-sm space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Username"}),e.jsx(o,{placeholder:"Enter username"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"This is your public display name."})]}),e.jsx(r,{children:"Submit"})]}),usage:`import { zodResolver } from "@hookform/resolvers/zod"
|
|
2
|
-
import { useForm } from "react-hook-form"
|
|
3
|
-
import * as z from "zod"
|
|
4
|
-
import {
|
|
5
|
-
Form,
|
|
6
|
-
FormControl,
|
|
7
|
-
FormDescription,
|
|
8
|
-
FormField,
|
|
9
|
-
FormItem,
|
|
10
|
-
FormLabel,
|
|
11
|
-
FormMessage,
|
|
12
|
-
} from "forlogic-core"
|
|
13
|
-
|
|
14
|
-
const formSchema = z.object({
|
|
15
|
-
username: z.string().min(2).max(50),
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
function MyForm() {
|
|
19
|
-
const form = useForm<z.infer<typeof formSchema>>({
|
|
20
|
-
resolver: zodResolver(formSchema),
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
function onSubmit(values: z.infer<typeof formSchema>) {
|
|
24
|
-
console.log(values)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return (
|
|
28
|
-
<Form {...form}>
|
|
29
|
-
<form onSubmit={form.handleSubmit(onSubmit)}>
|
|
30
|
-
<FormField
|
|
31
|
-
control={form.control}
|
|
32
|
-
name="username"
|
|
33
|
-
render={({ field }) => (
|
|
34
|
-
<FormItem>
|
|
35
|
-
<FormLabel>Username</FormLabel>
|
|
36
|
-
<FormControl>
|
|
37
|
-
<Input placeholder="shadcn" {...field} />
|
|
38
|
-
</FormControl>
|
|
39
|
-
<FormDescription>
|
|
40
|
-
This is your public display name.
|
|
41
|
-
</FormDescription>
|
|
42
|
-
<FormMessage />
|
|
43
|
-
</FormItem>
|
|
44
|
-
)}
|
|
45
|
-
/>
|
|
46
|
-
<Button type="submit">Submit</Button>
|
|
47
|
-
</form>
|
|
48
|
-
</Form>
|
|
49
|
-
)
|
|
50
|
-
}`,examples:[{title:"Estrutura Básica",preview:e.jsxs("div",{className:"w-full max-w-sm space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Email"}),e.jsx(o,{type:"email",placeholder:"email@example.com"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"We'll never share your email."})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Password"}),e.jsx(o,{type:"password",placeholder:"••••••••"})]}),e.jsx(r,{className:"w-full",children:"Sign In"})]}),code:`<FormField
|
|
51
|
-
control={form.control}
|
|
52
|
-
name="email"
|
|
53
|
-
render={({ field }) => (
|
|
54
|
-
<FormItem>
|
|
55
|
-
<FormLabel>Email</FormLabel>
|
|
56
|
-
<FormControl>
|
|
57
|
-
<Input type="email" {...field} />
|
|
58
|
-
</FormControl>
|
|
59
|
-
<FormDescription>We'll never share your email.</FormDescription>
|
|
60
|
-
<FormMessage />
|
|
61
|
-
</FormItem>
|
|
62
|
-
)}
|
|
63
|
-
/>`},{title:"Com Validação",preview:e.jsxs("div",{className:"w-full max-w-sm space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Username"}),e.jsx(o,{placeholder:"Enter username",className:"border-destructive"}),e.jsx("p",{className:"text-sm text-destructive",children:"Username must be at least 3 characters."})]}),e.jsx(r,{disabled:!0,children:"Submit"})]}),code:`const formSchema = z.object({
|
|
64
|
-
username: z.string().min(3, {
|
|
65
|
-
message: "Username must be at least 3 characters.",
|
|
66
|
-
}),
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
<FormField
|
|
70
|
-
control={form.control}
|
|
71
|
-
name="username"
|
|
72
|
-
render={({ field }) => (
|
|
73
|
-
<FormItem>
|
|
74
|
-
<FormLabel>Username</FormLabel>
|
|
75
|
-
<FormControl>
|
|
76
|
-
<Input {...field} />
|
|
77
|
-
</FormControl>
|
|
78
|
-
<FormMessage />
|
|
79
|
-
</FormItem>
|
|
80
|
-
)}
|
|
81
|
-
/>`}],props:[{name:"Form",type:"FormProvider props",description:"Wrapper que provê o contexto do formulário via React Hook Form"},{name:"FormField.control",type:"Control",description:"Objeto control do useForm para gerenciar o campo"},{name:"FormField.name",type:"string",description:"Nome do campo no schema do formulário"},{name:"FormField.render",type:"(field) => ReactNode",description:"Função de renderização do campo com acesso ao field object"},{name:"FormItem",type:"HTMLDivElement",description:"Container que agrupa label, controle, descrição e mensagem de erro"},{name:"FormLabel",type:"LabelProps",description:"Label associado ao campo do formulário"},{name:"FormControl",type:"SlotProps",description:"Wrapper que conecta o controle ao contexto do campo"},{name:"FormDescription",type:"HTMLParagraphElement",description:"Texto de ajuda exibido abaixo do controle"},{name:"FormMessage",type:"HTMLParagraphElement",description:"Exibe mensagens de erro de validação automaticamente"}],accessibility:["Labels são automaticamente associados aos controles via aria-describedby","Mensagens de erro são anunciadas por leitores de tela","Suporta navegação por teclado nativa dos controles","Estados de erro são indicados visualmente e semanticamente","Usa React Hook Form para gerenciamento de estado de formulário","Integra com Zod para validação de schema"]})}export{t as FormDoc};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./index-CE0k7Rdh.js";function o({title:e,description:i,onClick:r}){return s.jsxs("button",{onClick:r,className:"text-left p-6 rounded-lg border bg-card hover:bg-accent transition-colors",children:[s.jsx("h3",{className:"font-semibold text-lg mb-2",children:e}),s.jsx("p",{className:"text-sm text-muted-foreground",children:i})]})}function a({onNavigate:e}){return s.jsxs("div",{className:"space-y-8",children:[s.jsxs("div",{children:[s.jsx("h1",{className:"text-4xl font-bold tracking-tight",children:"Fundação"}),s.jsx("p",{className:"text-xl text-muted-foreground mt-2",children:"Tokens de design e elementos fundamentais para construir interfaces consistentes"})]}),s.jsxs("div",{className:"prose prose-slate dark:prose-invert max-w-none",children:[s.jsx("p",{children:"A seção de fundação contém todos os design tokens essenciais que sustentam o sistema de design: cores, tipografia, espaçamento, sombras e valores de raio de borda."}),s.jsx("h2",{children:"Design Tokens"}),s.jsx("p",{children:"Nossos design tokens seguem as melhores práticas da indústria de Material Design 3, Fluent 2, Radix UI e Tailwind CSS. Todos os tokens são:"}),s.jsxs("ul",{children:[s.jsx("li",{children:"Semânticos e orientados a propósito"}),s.jsx("li",{children:"Acessíveis (conformidade WCAG AA)"}),s.jsx("li",{children:"Conscientes do tema (modos claro/escuro)"}),s.jsx("li",{children:"Escaláveis e sustentáveis"})]}),s.jsx("h2",{children:"Princípios-Chave"}),s.jsxs("ol",{children:[s.jsxs("li",{children:[s.jsx("strong",{children:"Consistência"}),": Use tokens ao invés de valores fixos"]}),s.jsxs("li",{children:[s.jsx("strong",{children:"Acessibilidade"}),": Proporções de contraste mínimas AA"]}),s.jsxs("li",{children:[s.jsx("strong",{children:"Flexibilidade"}),": Escalas abrangentes para todos os casos de uso"]}),s.jsxs("li",{children:[s.jsx("strong",{children:"Significado Semântico"}),": Nomeados por propósito, não aparência"]})]})]}),s.jsxs("div",{className:"grid gap-6 md:grid-cols-2 lg:grid-cols-3",children:[s.jsx(o,{title:"Cores",description:"Escalas neutras, cores da marca e cores funcionais com suporte completo a temas claro/escuro",onClick:()=>e("colors")}),s.jsx(o,{title:"Tipografia",description:"Sistema tipográfico completo com display, títulos, corpo e estilos monospace",onClick:()=>e("typography")}),s.jsx(o,{title:"Espaçamento",description:"Escala de espaçamento consistente de 0.5 a 96 para layouts e componentes",onClick:()=>e("spacing")}),s.jsx(o,{title:"Sombras",description:"Sistema de elevação com sombras sutis para profundidade e hierarquia",onClick:()=>e("shadows")}),s.jsx(o,{title:"Raio",description:"Valores de raio de borda para criar cantos arredondados consistentes",onClick:()=>e("radius")})]})]})}export{a as FoundationOverview};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import{j as e,l as n,ew as i,C as t}from"./index-CE0k7Rdh.js";import{C as l}from"./ComponentDocTemplate-CRbRY-v5.js";const o={1:"grid-cols-1",2:"grid-cols-2",3:"grid-cols-3",4:"grid-cols-4",5:"grid-cols-5",6:"grid-cols-6","auto-fit":"grid-cols-[repeat(auto-fit,minmax(250px,1fr))]","auto-fill":"grid-cols-[repeat(auto-fill,minmax(250px,1fr))]"},m={xs:"gap-1",sm:"gap-2",md:"gap-4",lg:"gap-6",xl:"gap-8"};function r({children:s,cols:a="auto-fit",gap:d="md",className:c}){return e.jsx("div",{className:n("grid",o[a],m[d],c),children:s})}function g(){return e.jsx(l,{title:"Grid & Stack",description:"Sistema de layout com Grid responsivo e Stack flexível para organização de conteúdo.",component:e.jsxs("div",{className:"w-full space-y-6",children:[e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium mb-2",children:"Grid com 3 colunas fixas"}),e.jsxs(r,{cols:"3",gap:"md",children:[e.jsx(t,{className:"p-4 text-center bg-primary/10",children:"Item 1"}),e.jsx(t,{className:"p-4 text-center bg-primary/10",children:"Item 2"}),e.jsx(t,{className:"p-4 text-center bg-primary/10",children:"Item 3"}),e.jsx(t,{className:"p-4 text-center bg-primary/10",children:"Item 4"}),e.jsx(t,{className:"p-4 text-center bg-primary/10",children:"Item 5"}),e.jsx(t,{className:"p-4 text-center bg-primary/10",children:"Item 6"})]})]}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium mb-2",children:"Grid responsivo (auto-fit)"}),e.jsxs(r,{cols:"auto-fit",gap:"lg",children:[e.jsx(t,{className:"p-6 text-center bg-secondary/50",children:"Card 1"}),e.jsx(t,{className:"p-6 text-center bg-secondary/50",children:"Card 2"}),e.jsx(t,{className:"p-6 text-center bg-secondary/50",children:"Card 3"})]})]})]}),usage:`import { Grid, Stack, Card } from "forlogic-core"
|
|
2
|
-
|
|
3
|
-
// Grid com 3 colunas fixas
|
|
4
|
-
<Grid cols="3" gap="md">
|
|
5
|
-
<div>Item 1</div>
|
|
6
|
-
<div>Item 2</div>
|
|
7
|
-
<div>Item 3</div>
|
|
8
|
-
</Grid>
|
|
9
|
-
|
|
10
|
-
// Stack vertical
|
|
11
|
-
<Stack direction="column" gap="md">
|
|
12
|
-
<div>Item 1</div>
|
|
13
|
-
<div>Item 2</div>
|
|
14
|
-
</Stack>`,examples:[{title:"Stack Vertical",description:"Empilha elementos verticalmente",preview:e.jsxs(i,{direction:"column",gap:"md",align:"start",className:"w-full max-w-xs",children:[e.jsx(t,{className:"p-3 bg-primary/10 w-full",children:"Item 1"}),e.jsx(t,{className:"p-3 bg-primary/10 w-full",children:"Item 2"}),e.jsx(t,{className:"p-3 bg-primary/10 w-full",children:"Item 3"})]}),code:`<Stack direction="column" gap="md" align="start">
|
|
15
|
-
<div>Item 1</div>
|
|
16
|
-
<div>Item 2</div>
|
|
17
|
-
<div>Item 3</div>
|
|
18
|
-
</Stack>`},{title:"Stack Horizontal",description:"Empilha elementos horizontalmente",preview:e.jsxs(i,{direction:"row",gap:"lg",align:"center",children:[e.jsx(t,{className:"p-4 bg-secondary/50",children:"Item 1"}),e.jsx(t,{className:"p-4 bg-secondary/50",children:"Item 2"}),e.jsx(t,{className:"p-4 bg-secondary/50",children:"Item 3"})]}),code:`<Stack direction="row" gap="lg" align="center">
|
|
19
|
-
<div>Item 1</div>
|
|
20
|
-
<div>Item 2</div>
|
|
21
|
-
<div>Item 3</div>
|
|
22
|
-
</Stack>`},{title:"Stack com Justify Between",description:"Distribui itens nas extremidades",preview:e.jsxs(i,{direction:"row",justify:"between",className:"w-full max-w-md",children:[e.jsx(t,{className:"p-3 bg-accent",children:"Start"}),e.jsx(t,{className:"p-3 bg-accent",children:"Middle"}),e.jsx(t,{className:"p-3 bg-accent",children:"End"})]}),code:`<Stack direction="row" justify="between">
|
|
23
|
-
<div>Start</div>
|
|
24
|
-
<div>Middle</div>
|
|
25
|
-
<div>End</div>
|
|
26
|
-
</Stack>`},{title:"Stack com Wrap",description:"Permite quebra de linha quando não há espaço",preview:e.jsx(i,{direction:"row",gap:"sm",wrap:!0,className:"max-w-xs",children:Array.from({length:8}).map((s,a)=>e.jsx(t,{className:"p-2 bg-muted text-center min-w-12",children:a+1},a))}),code:`<Stack direction="row" gap="sm" wrap>
|
|
27
|
-
{items.map(item => <Card key={item.id}>{item.name}</Card>)}
|
|
28
|
-
</Stack>`}],props:[{name:"Grid.cols",type:'"1" | "2" | "3" | "4" | "5" | "6" | "auto-fit" | "auto-fill"',default:"auto-fit",description:"Número de colunas ou modo responsivo."},{name:"Grid.gap",type:'"xs" | "sm" | "md" | "lg" | "xl"',default:"md",description:"Espaçamento entre itens do grid."},{name:"Stack.direction",type:'"row" | "column"',default:"column",description:"Direção do flex."},{name:"Stack.gap",type:'"xs" | "sm" | "md" | "lg" | "xl"',default:"md",description:"Espaçamento entre itens."},{name:"Stack.align",type:'"start" | "center" | "end" | "stretch"',default:"stretch",description:"Alinhamento dos itens."},{name:"Stack.justify",type:'"start" | "center" | "end" | "between" | "around" | "evenly"',default:"start",description:"Justificação dos itens."},{name:"Stack.wrap",type:"boolean",default:"false",description:"Permite quebra de linha."}],accessibility:["Layout responsivo automático","Suporte a grid fixo e adaptativo","Espaçamentos padronizados","Props intuitivas e type-safe"],notes:["**Grid** é ideal para layouts de cards, galerias e grids de conteúdo","**Stack** é ideal para listas, formulários e layouts flexíveis","Ambos suportam espaçamentos padronizados (xs, sm, md, lg, xl)"]})}export{g as GridDoc};
|