forlogic-core 1.20.1 → 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.
Files changed (217) hide show
  1. package/.note/memory/patterns/single-scroll-pattern.md +30 -12
  2. package/dist/action-plans/components/ActionPlanAttachmentsTab.d.ts +18 -0
  3. package/dist/action-plans/components/ActionPlanCommentsTab.d.ts +18 -0
  4. package/dist/action-plans/components/ActionPlanCostTab.d.ts +10 -0
  5. package/dist/action-plans/components/ActionPlanGeneralTab.d.ts +18 -0
  6. package/dist/action-plans/components/ActionPlanHistoryTab.d.ts +13 -0
  7. package/dist/action-plans/components/ActionPlanPage.d.ts +25 -0
  8. package/dist/action-plans/components/ActionPlanPredecessorsTab.d.ts +10 -0
  9. package/dist/action-plans/components/ActionPlanProgressDialog.d.ts +13 -0
  10. package/dist/action-plans/components/ActionPlanProgressTab.d.ts +5 -0
  11. package/dist/action-plans/components/ActionPlanStatusBadge.d.ts +11 -0
  12. package/dist/action-plans/constants.d.ts +42 -0
  13. package/dist/action-plans/hooks/useActionPlan.d.ts +14 -0
  14. package/dist/action-plans/hooks/useActionPlanProgress.d.ts +15 -0
  15. package/dist/action-plans/index.d.ts +15 -0
  16. package/dist/action-plans/types.d.ts +353 -0
  17. package/dist/action-plans/utils/formatTime.d.ts +15 -0
  18. package/dist/approval-flow/components/ApprovalSidenav.d.ts +16 -0
  19. package/dist/approval-flow/components/ApproveDialog.d.ts +13 -0
  20. package/dist/approval-flow/components/SelectApproverDialog.d.ts +11 -0
  21. package/dist/approval-flow/index.d.ts +4 -0
  22. package/dist/approval-flow/types.d.ts +76 -0
  23. package/dist/assets/index.d.ts +1 -0
  24. package/dist/audit-trail/components/AuditTrailDetails.d.ts +17 -0
  25. package/dist/audit-trail/components/AuditTrailFilter.d.ts +19 -0
  26. package/dist/audit-trail/components/AuditTrailPage.d.ts +30 -0
  27. package/dist/audit-trail/index.d.ts +9 -0
  28. package/dist/audit-trail/types.d.ts +151 -0
  29. package/dist/audit-trail/utils.d.ts +38 -0
  30. package/dist/components/dashboards/dashboard-form.d.ts +50 -0
  31. package/dist/components/dashboards/dashboard-general-view.d.ts +109 -0
  32. package/dist/components/dashboards/dashboard-grid.d.ts +41 -0
  33. package/dist/components/dashboards/dashboard-list.d.ts +31 -0
  34. package/dist/components/dashboards/dashboard-panel-renderer.d.ts +21 -0
  35. package/dist/components/dashboards/dashboard-view.d.ts +38 -0
  36. package/dist/components/dashboards/helpers.d.ts +47 -0
  37. package/dist/components/dashboards/index.d.ts +9 -0
  38. package/dist/components/dashboards/panels/burndown-panel.d.ts +26 -0
  39. package/dist/components/dashboards/panels/cartesian-panel.d.ts +46 -0
  40. package/dist/components/dashboards/panels/index.d.ts +14 -0
  41. package/dist/components/dashboards/panels/list-panel.d.ts +30 -0
  42. package/dist/components/dashboards/panels/matrix-risk-panel.d.ts +49 -0
  43. package/dist/components/dashboards/panels/numeric-panel.d.ts +22 -0
  44. package/dist/components/dashboards/panels/panel-error.d.ts +8 -0
  45. package/dist/components/dashboards/panels/panel-header.d.ts +17 -0
  46. package/dist/components/dashboards/panels/panel-loader.d.ts +7 -0
  47. package/dist/components/dashboards/panels/panel-no-data.d.ts +6 -0
  48. package/dist/components/dashboards/panels/panel-unavailable.d.ts +6 -0
  49. package/dist/components/dashboards/panels/pareto-panel.d.ts +20 -0
  50. package/dist/components/dashboards/panels/performance-panel.d.ts +24 -0
  51. package/dist/components/dashboards/panels/pie-panel.d.ts +19 -0
  52. package/dist/components/dashboards/panels/text-panel.d.ts +18 -0
  53. package/dist/components/dashboards/types.d.ts +525 -0
  54. package/dist/components/ui/electronic-signature-dialog.d.ts +21 -0
  55. package/dist/components/ui/export-dialog.d.ts +28 -0
  56. package/dist/components/ui/iframe-dialog.d.ts +14 -0
  57. package/dist/components/ui/multiselect-permissions.d.ts +59 -0
  58. package/dist/components/ui/online-editor-dialog.d.ts +18 -0
  59. package/dist/components/ui/report-request-list.d.ts +44 -0
  60. package/dist/components/ui/stimulsoft-viewer.d.ts +20 -0
  61. package/dist/components/ui/terms-of-use-dialog.d.ts +56 -0
  62. package/dist/components/ui/timepicker.d.ts +11 -0
  63. package/dist/components/ui/users-groups-selector.d.ts +44 -0
  64. package/dist/components/ui/viewer-dialog.d.ts +77 -0
  65. package/dist/custom-form-fields/components/CustomFormFields.d.ts +8 -0
  66. package/dist/custom-form-fields/fields/FormDateField.d.ts +6 -0
  67. package/dist/custom-form-fields/fields/FormMultiSelectionField.d.ts +6 -0
  68. package/dist/custom-form-fields/fields/FormNumericField.d.ts +6 -0
  69. package/dist/custom-form-fields/fields/FormQuestionsField.d.ts +6 -0
  70. package/dist/custom-form-fields/fields/FormSingleSelectionField.d.ts +6 -0
  71. package/dist/custom-form-fields/fields/FormTextField.d.ts +6 -0
  72. package/dist/custom-form-fields/fields/FormTimeField.d.ts +6 -0
  73. package/dist/custom-form-fields/fields/FormUrlField.d.ts +6 -0
  74. package/dist/custom-form-fields/fields/ReadOnlyTextField.d.ts +6 -0
  75. package/dist/custom-form-fields/index.d.ts +13 -0
  76. package/dist/custom-form-fields/types.d.ts +143 -0
  77. package/dist/exports/action-plans.d.ts +16 -0
  78. package/dist/exports/audit-trail.d.ts +1 -0
  79. package/dist/exports/custom-form-fields.d.ts +1 -0
  80. package/dist/exports/file-upload.d.ts +1 -0
  81. package/dist/exports/ui.d.ts +12 -0
  82. package/dist/file-upload/components/SingleFileUpload.d.ts +43 -0
  83. package/dist/file-upload/index.d.ts +6 -0
  84. package/dist/file-upload/types.d.ts +11 -0
  85. package/dist/file-upload/utils/formatBytes.d.ts +1 -0
  86. package/dist/file-upload/utils/getFileExtension.d.ts +1 -0
  87. package/dist/hooks/useSidebarResize.d.ts +1 -1
  88. package/dist/index.css +1 -1
  89. package/dist/index.css.map +1 -1
  90. package/dist/index.d.ts +6 -0
  91. package/dist/index.esm.js +1 -1
  92. package/dist/index.js +1 -1
  93. package/dist/team-selector/components/TeamSelector.d.ts +24 -0
  94. package/dist/team-selector/index.d.ts +2 -0
  95. package/dist/team-selector/types.d.ts +10 -0
  96. package/docs/ICON_MIGRATION_GUIDE.md +177 -0
  97. package/package.json +1 -1
  98. package/dist/assets/AccordionDoc-BVPUJk8G.js +0 -31
  99. package/dist/assets/ActionButtonDoc-DLJ_K9ib.js +0 -47
  100. package/dist/assets/AlertDoc-CY1ybZeG.js +0 -37
  101. package/dist/assets/AppHeaderDoc-Crkw4dA9.js +0 -67
  102. package/dist/assets/AppSidebarDoc-ET-4j6wV.js +0 -204
  103. package/dist/assets/AuthDoc-B4v4Nci5.js +0 -192
  104. package/dist/assets/AvatarDoc-BLdMoyJd.js +0 -11
  105. package/dist/assets/BadgeDoc-CSNM1b6b.js +0 -36
  106. package/dist/assets/BaseFormDoc-DXiYuN6-.js +0 -169
  107. package/dist/assets/BodyContentDoc-Bp6YmUWX.js +0 -83
  108. package/dist/assets/BreadcrumbDoc-D7tqqTvo.js +0 -75
  109. package/dist/assets/ButtonDoc-C4JwIvU3.js +0 -41
  110. package/dist/assets/ButtonGroupDoc-QFfjC7Pm.js +0 -7
  111. package/dist/assets/CalendarDoc-COlEKqmv.js +0 -81
  112. package/dist/assets/CardDoc-BVhMoC2w.js +0 -49
  113. package/dist/assets/ChartDoc-BJ14EjI2.js +0 -111
  114. package/dist/assets/CheckboxDoc-Bcqpln9_.js +0 -55
  115. package/dist/assets/ColorPickerDoc-CcfmSwyC.js +0 -10
  116. package/dist/assets/ColorsFoundationDoc-uO6IiJbS.js +0 -13
  117. package/dist/assets/ComboTreeDoc-R4qE6XwB.js +0 -46
  118. package/dist/assets/ComboboxDoc-JIo_-gSN.js +0 -134
  119. package/dist/assets/ComponentDocTemplate-CRbRY-v5.js +0 -1
  120. package/dist/assets/ContextMenuDoc-C4-_0NLp.js +0 -182
  121. package/dist/assets/ContextsDoc-Cj9Aaoyo.js +0 -184
  122. package/dist/assets/CreateCrudPageDoc-D_SnMRJ2.js +0 -106
  123. package/dist/assets/CrudActionBarDoc-BYqtIabp.js +0 -112
  124. package/dist/assets/CrudGridDoc-DspxQrq5.js +0 -85
  125. package/dist/assets/CrudOverviewDoc-DLcOL_HZ.js +0 -14
  126. package/dist/assets/CrudPrimitivesDoc-BRS86nWg.js +0 -164
  127. package/dist/assets/CrudTableDoc-Daw8u2G_.js +0 -113
  128. package/dist/assets/DataListDoc-BrgVNhhR.js +0 -13
  129. package/dist/assets/DesignSystemHome-BFBNqq1J.js +0 -1
  130. package/dist/assets/DialogDoc-DCpRy4rg.js +0 -981
  131. package/dist/assets/DropdownMenuDoc-DT6LBa8Z.js +0 -175
  132. package/dist/assets/EmptyStateDoc-wydc09gG.js +0 -35
  133. package/dist/assets/EnvironmentsDoc-amIriwDD.js +0 -96
  134. package/dist/assets/ErrorBoundaryDoc-BEixy_Gl.js +0 -111
  135. package/dist/assets/FormDoc-DxoRt6p7.js +0 -81
  136. package/dist/assets/FoundationOverview-CxSbumIt.js +0 -1
  137. package/dist/assets/GridDoc-BpQqCMUE.js +0 -28
  138. package/dist/assets/HooksDoc-JNODhbaF.js +0 -665
  139. package/dist/assets/HoverCardDoc-CdqiYrIb.js +0 -31
  140. package/dist/assets/I18nDoc-B6LMXnE3.js +0 -232
  141. package/dist/assets/IconPickerDoc-BRdy58IC.js +0 -10
  142. package/dist/assets/IconsFoundationDoc-CrymfxTI.js +0 -33
  143. package/dist/assets/InputDoc-BK-SdpJ7.js +0 -211
  144. package/dist/assets/LabelDoc-DHvgzhaJ.js +0 -42
  145. package/dist/assets/LeadershipDoc-DRiB0spL.js +0 -416
  146. package/dist/assets/MediaDoc-B_vqnf72.js +0 -459
  147. package/dist/assets/MenubarDoc-Zvgczxe2.js +0 -165
  148. package/dist/assets/ModuleAccessDoc-Nuxb4S27.js +0 -153
  149. package/dist/assets/ModulesDialogDoc-iJWLkOZo.js +0 -46
  150. package/dist/assets/NavigationMenuDoc-CeWun1VF.js +0 -116
  151. package/dist/assets/OnboardingDialogDoc-xBL-rXeZ.js +0 -55
  152. package/dist/assets/PaginationDoc-CfvwxCMe.js +0 -98
  153. package/dist/assets/PaginationDoc-DqtRgXnF.js +0 -27
  154. package/dist/assets/PlacesDoc-nckioEzg.js +0 -226
  155. package/dist/assets/PopoverDoc-C3o2CZCT.js +0 -64
  156. package/dist/assets/ProgressDoc-BmWBNMPA.js +0 -29
  157. package/dist/assets/QualiexUserFieldDoc-CE1e4mx6.js +0 -149
  158. package/dist/assets/RadioGroupDoc-DMZH6NmR.js +0 -57
  159. package/dist/assets/RadiusDoc-BOZD3gPV.js +0 -7
  160. package/dist/assets/RequiredFieldsCounterDoc-CG-lmSSy.js +0 -58
  161. package/dist/assets/ResizableDoc-CqGkv6Cd.js +0 -104
  162. package/dist/assets/RichTextEditorDoc-m50ll-Od.js +0 -24
  163. package/dist/assets/ScrollAreaDoc-BzJ-APXo.js +0 -28
  164. package/dist/assets/SecurityDoc-B34gVeiV.js +0 -204
  165. package/dist/assets/SelectDoc-DXRv7QHK.js +0 -80
  166. package/dist/assets/SeparatorDoc-DcNh8k0P.js +0 -4
  167. package/dist/assets/ServicesDoc-8aXBd6yg.js +0 -308
  168. package/dist/assets/ShadowsDoc-Brl4hIDI.js +0 -9
  169. package/dist/assets/SignDoc-BdwerR-2.js +0 -66
  170. package/dist/assets/SkeletonDoc-BWgqgbDY.js +0 -54
  171. package/dist/assets/SliderDoc-E-NjbYVk.js +0 -41
  172. package/dist/assets/SpacingDoc-BzburM-r.js +0 -12
  173. package/dist/assets/SplitButtonDoc-BYUysmJp.js +0 -53
  174. package/dist/assets/StepSelectorDoc-PB1k4v7F.js +0 -41
  175. package/dist/assets/SwitchDoc-BLOG6kfj.js +0 -56
  176. package/dist/assets/TableDoc-Dwcs-lop.js +0 -128
  177. package/dist/assets/TabsDoc-Ovkh8ArV.js +0 -42
  178. package/dist/assets/TextareaDoc-DsBYxmbr.js +0 -46
  179. package/dist/assets/ToastDoc-BbZaFE_A.js +0 -157
  180. package/dist/assets/ToggleDoc-C28vbvhp.js +0 -51
  181. package/dist/assets/TooltipDoc-DL5cnLak.js +0 -58
  182. package/dist/assets/TruncatedCellDoc-BuDA8QcY.js +0 -12
  183. package/dist/assets/TypographyFoundationDoc-CPdH4PHa.js +0 -7
  184. package/dist/assets/UtilitiesDoc-CrQhyEfz.js +0 -145
  185. package/dist/assets/blocks-DO93nPjs.js +0 -1
  186. package/dist/assets/calendar-days-cMfwBSZx.js +0 -1
  187. package/dist/assets/circle-plus-D3NftMzS.js +0 -1
  188. package/dist/assets/circle-x-BVAVJ_oz.js +0 -1
  189. package/dist/assets/crown-B2MTZDnM.js +0 -1
  190. package/dist/assets/date-picker-zhJU-_kM.js +0 -1
  191. package/dist/assets/disabled-menu-item-C16xsaVs.js +0 -1
  192. package/dist/assets/drawer-oTqCOtsC.js +0 -3
  193. package/dist/assets/file-pen-line-CXv-Eye-.js +0 -1
  194. package/dist/assets/git-branch-V6-h6P9K.js +0 -1
  195. package/dist/assets/globe-CaUBIJU8.js +0 -1
  196. package/dist/assets/hash-B4MTXppl.js +0 -1
  197. package/dist/assets/hover-card-DEuucfxP.js +0 -1
  198. package/dist/assets/index-CE0k7Rdh.js +0 -312
  199. package/dist/assets/index-Cx3adT_u.css +0 -1
  200. package/dist/assets/life-buoy-BRndExxh.js +0 -1
  201. package/dist/assets/lucide-react-t7dCa4lv.js +0 -1
  202. package/dist/assets/monitor-Dg3HKTSE.js +0 -1
  203. package/dist/assets/package-3G45ARQh.js +0 -1
  204. package/dist/assets/pen-BYSSwjK4.js +0 -1
  205. package/dist/assets/pin-CMYagNhs.js +0 -1
  206. package/dist/assets/radio-group-BVun_Tmt.js +0 -1
  207. package/dist/assets/server-p0Sb0mKI.js +0 -1
  208. package/dist/assets/share-2-D-ZhCCq2.js +0 -1
  209. package/dist/assets/shield-x-Q7hAXWsG.js +0 -1
  210. package/dist/assets/step-selector-DHxgT2FL.js +0 -1
  211. package/dist/assets/text-align-start-6aYQqbX4.js +0 -1
  212. package/dist/assets/trash-DveAOiLF.js +0 -1
  213. package/dist/assets/useMockCrud-GY0KxHXr.js +0 -1
  214. package/dist/assets/user-check-CoGNBfIk.js +0 -1
  215. package/dist/assets/user-plus-Bad2xWIT.js +0 -1
  216. package/dist/index.html +0 -35
  217. package/dist/leadership/components/LeaderRow.d.ts +0 -9
@@ -1,211 +0,0 @@
1
- import{r as d,j as e,l as m,I as s,f as N,cU as w,z as G,L as a,M as h,c0 as C,ci as v,bV as A,aN as S,bD as L,ah as b,b1 as F,bG as k,bf as E,t as T,J as B}from"./index-CE0k7Rdh.js";import{C as D}from"./ComponentDocTemplate-CRbRY-v5.js";import{D as V,A as P,H as q}from"./hash-B4MTXppl.js";const t=d.forwardRef(({className:l,...i},n)=>e.jsx("div",{ref:n,"data-slot":"input-group",className:m("flex min-w-0 items-center rounded-md border border-input bg-background","focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background","has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50","has-[textarea:disabled]:cursor-not-allowed has-[textarea:disabled]:opacity-50",l),...i}));t.displayName="InputGroup";const z=G("flex items-center justify-center text-sm text-muted-foreground shrink-0",{variants:{align:{"inline-start":"border-r border-input px-3","inline-end":"border-l border-input px-3","block-start":"border-b border-input px-3 py-2 w-full justify-start","block-end":"border-t border-input px-3 py-2 w-full justify-start"}},defaultVariants:{align:"inline-start"}}),o=d.forwardRef(({className:l,align:i,...n},p)=>e.jsx("div",{ref:p,"data-slot":"input-group-addon",className:m(z({align:i}),l),...n}));o.displayName="InputGroupAddon";const M=G("",{variants:{size:{xs:"h-6 px-2 text-xs","icon-xs":"h-6 w-6",sm:"h-7 px-3 text-xs","icon-sm":"h-7 w-7"}},defaultVariants:{size:"xs"}}),c=d.forwardRef(({className:l,size:i,variant:n="ghost",...p},x)=>e.jsx(N,{ref:x,"data-slot":"input-group-button",variant:n,className:m(M({size:i}),"rounded-none first:rounded-l-md last:rounded-r-md",l),...p}));c.displayName="InputGroupButton";const r=d.forwardRef(({className:l,...i},n)=>e.jsx(s,{ref:n,"data-slot":"input-group-control",className:m("flex-1 border-0 bg-transparent shadow-none","focus-visible:ring-0 focus-visible:ring-offset-0",l),...i}));r.displayName="InputGroupInput";const j=d.forwardRef(({className:l,...i},n)=>e.jsx(w,{ref:n,"data-slot":"input-group-control",className:m("flex-1 border-0 bg-transparent shadow-none resize-none","focus-visible:ring-0 focus-visible:ring-offset-0",l),...i}));j.displayName="InputGroupTextarea";const R=`import { Input, Label } from "forlogic-core"
2
-
3
- // Input básico
4
- <Input placeholder="Digite algo..." />
5
-
6
- // Com Label
7
- <div className="grid w-full items-center gap-1.5">
8
- <Label htmlFor="email">Email</Label>
9
- <Input type="email" id="email" placeholder="email@exemplo.com" />
10
- </div>
11
-
12
- // InputGroup com prefixo e sufixo
13
- import { InputGroup, InputGroupInput, InputGroupAddon, InputGroupButton } from "forlogic-core"
14
-
15
- <InputGroup>
16
- <InputGroupAddon align="inline-start">https://</InputGroupAddon>
17
- <InputGroupInput placeholder="exemplo.com" />
18
- <InputGroupAddon align="inline-end">.com.br</InputGroupAddon>
19
- </InputGroup>`;function J(){const[l,i]=d.useState(!1),[n,p]=d.useState(!1),[x,f]=d.useState(""),[g,I]=d.useState(""),y=()=>{p(!0),setTimeout(()=>p(!1),1e3)};return e.jsx(D,{title:"Input",description:"Campo de entrada de texto com suporte a todos os tipos HTML. Inclui Label para rótulos acessíveis e InputGroup para agrupar inputs com addons de prefixo, sufixo, ícones e botões.",component:e.jsx(s,{placeholder:"Digite algo...",className:"max-w-sm"}),usage:R,examples:[{title:"Tipos de Input",description:"Suporta todos os tipos HTML nativos com estilização consistente",preview:e.jsxs("div",{className:"grid grid-cols-2 gap-4 max-w-lg",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"text-example",children:"Texto"}),e.jsx(s,{type:"text",id:"text-example",placeholder:"Nome completo"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"email-example",children:"Email"}),e.jsx(s,{type:"email",id:"email-example",placeholder:"email@exemplo.com"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"password-example",children:"Senha"}),e.jsx(s,{type:"password",id:"password-example",placeholder:"••••••••"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"number-example",children:"Número"}),e.jsx(s,{type:"number",id:"number-example",placeholder:"0"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"tel-example",children:"Telefone"}),e.jsx(s,{type:"tel",id:"tel-example",placeholder:"(11) 99999-9999"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"url-example",children:"URL"}),e.jsx(s,{type:"url",id:"url-example",placeholder:"https://..."})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"date-example",children:"Data"}),e.jsx(s,{type:"date",id:"date-example"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"search-example",children:"Busca"}),e.jsx(s,{type:"search",id:"search-example",placeholder:"Pesquisar..."})]})]}),code:`<Input type="text" placeholder="Nome completo" />
20
- <Input type="email" placeholder="email@exemplo.com" />
21
- <Input type="password" placeholder="••••••••" />
22
- <Input type="number" placeholder="0" />
23
- <Input type="tel" placeholder="(11) 99999-9999" />
24
- <Input type="url" placeholder="https://..." />
25
- <Input type="date" />
26
- <Input type="search" placeholder="Pesquisar..." />`},{title:"Com Label",description:"Use Label com htmlFor para associar corretamente ao input e melhorar acessibilidade",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-sm",children:[e.jsxs("div",{className:"grid w-full items-center gap-1.5",children:[e.jsx(a,{htmlFor:"name",children:"Nome *"}),e.jsx(s,{type:"text",id:"name",placeholder:"Seu nome completo"})]}),e.jsxs("div",{className:"grid w-full items-center gap-1.5",children:[e.jsx(a,{htmlFor:"email-label",children:"Email *"}),e.jsx(s,{type:"email",id:"email-label",placeholder:"email@exemplo.com"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Nunca compartilharemos seu email."})]})]}),code:`<div className="grid w-full items-center gap-1.5">
27
- <Label htmlFor="name">Nome *</Label>
28
- <Input type="text" id="name" placeholder="Seu nome completo" />
29
- </div>
30
-
31
- <div className="grid w-full items-center gap-1.5">
32
- <Label htmlFor="email">Email *</Label>
33
- <Input type="email" id="email" placeholder="email@exemplo.com" />
34
- <p className="text-xs text-muted-foreground">Nunca compartilharemos seu email.</p>
35
- </div>`},{title:"Estados",description:"Estados visuais para feedback do usuário",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-sm",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Normal"}),e.jsx(s,{placeholder:"Campo editável"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{className:"text-muted-foreground",children:"Desabilitado"}),e.jsx(s,{placeholder:"Campo desabilitado",disabled:!0})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Somente Leitura"}),e.jsx(s,{value:"Valor fixo",readOnly:!0})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{className:"text-destructive",children:"Com Erro"}),e.jsx(s,{placeholder:"Campo com erro",className:"border-destructive focus-visible:ring-destructive"}),e.jsx("p",{className:"text-xs text-destructive",children:"Este campo é obrigatório."})]})]}),code:`// Normal
36
- <Input placeholder="Campo editável" />
37
-
38
- // Desabilitado
39
- <Input placeholder="Campo desabilitado" disabled />
40
-
41
- // Somente Leitura
42
- <Input value="Valor fixo" readOnly />
43
-
44
- // Com Erro (adicione classes de erro)
45
- <Input
46
- placeholder="Campo com erro"
47
- className="border-destructive focus-visible:ring-destructive"
48
- />
49
- <p className="text-xs text-destructive">Este campo é obrigatório.</p>`},{title:"Com Ícones (posicionamento manual)",description:"Ícones posicionados com CSS absoluto para inputs simples",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-sm",children:[e.jsxs("div",{className:"relative",children:[e.jsx(h,{className:"absolute left-3 top-3 h-4 w-4 text-muted-foreground"}),e.jsx(s,{placeholder:"Email",className:"pl-10"})]}),e.jsxs("div",{className:"relative",children:[e.jsx(C,{className:"absolute left-3 top-3 h-4 w-4 text-muted-foreground"}),e.jsx(s,{placeholder:"Buscar...",className:"pl-10 pr-10",value:x,onChange:u=>f(u.target.value)}),x&&e.jsx("button",{className:"absolute right-3 top-3 text-muted-foreground hover:text-foreground",onClick:()=>f(""),children:e.jsx(v,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"relative",children:[e.jsx(A,{className:"absolute left-3 top-3 h-4 w-4 text-muted-foreground"}),e.jsx(s,{placeholder:"Telefone",className:"pl-10",type:"tel"})]})]}),code:`// Ícone à esquerda
50
- <div className="relative">
51
- <Mail className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
52
- <Input placeholder="Email" className="pl-10" />
53
- </div>
54
-
55
- // Com botão de limpar
56
- <div className="relative">
57
- <Search className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
58
- <Input
59
- placeholder="Buscar..."
60
- className="pl-10 pr-10"
61
- value={searchValue}
62
- onChange={(e) => setSearchValue(e.target.value)}
63
- />
64
- {searchValue && (
65
- <button
66
- className="absolute right-3 top-3"
67
- onClick={() => setSearchValue('')}
68
- >
69
- <X className="h-4 w-4" />
70
- </button>
71
- )}
72
- </div>`},{title:"InputGroup - Prefixo e Sufixo de Texto",description:"Use InputGroupAddon para textos fixos antes ou depois do input",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-md",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Website"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:"https://"}),e.jsx(r,{placeholder:"seusite.com"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Valor"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:"R$"}),e.jsx(r,{type:"number",placeholder:"0,00"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Email"}),e.jsxs(t,{children:[e.jsx(r,{placeholder:"usuario"}),e.jsx(o,{align:"inline-end",children:"@empresa.com.br"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Peso"}),e.jsxs(t,{children:[e.jsx(r,{type:"number",placeholder:"0"}),e.jsx(o,{align:"inline-end",children:"kg"})]})]})]}),code:`// Prefixo
73
- <InputGroup>
74
- <InputGroupAddon align="inline-start">https://</InputGroupAddon>
75
- <InputGroupInput placeholder="seusite.com" />
76
- </InputGroup>
77
-
78
- // Prefixo de moeda
79
- <InputGroup>
80
- <InputGroupAddon align="inline-start">R$</InputGroupAddon>
81
- <InputGroupInput type="number" placeholder="0,00" />
82
- </InputGroup>
83
-
84
- // Sufixo de domínio
85
- <InputGroup>
86
- <InputGroupInput placeholder="usuario" />
87
- <InputGroupAddon align="inline-end">@empresa.com.br</InputGroupAddon>
88
- </InputGroup>
89
-
90
- // Sufixo de unidade
91
- <InputGroup>
92
- <InputGroupInput type="number" placeholder="0" />
93
- <InputGroupAddon align="inline-end">kg</InputGroupAddon>
94
- </InputGroup>`},{title:"InputGroup - Com Ícones",description:"Combine ícones com inputs de forma elegante e consistente",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-md",children:[e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(S,{className:"h-4 w-4"})}),e.jsx(r,{placeholder:"Nome de usuário"})]}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(h,{className:"h-4 w-4"})}),e.jsx(r,{placeholder:"seu@email.com"})]}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(L,{className:"h-4 w-4"})}),e.jsx(r,{placeholder:"https://..."}),e.jsx(o,{align:"inline-end",children:e.jsx(b,{className:"h-4 w-4 text-success"})})]}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(F,{className:"h-4 w-4"})}),e.jsx(r,{type:"date"})]})]}),code:`// Ícone de usuário
95
- <InputGroup>
96
- <InputGroupAddon align="inline-start">
97
- <User className="h-4 w-4" />
98
- </InputGroupAddon>
99
- <InputGroupInput placeholder="Nome de usuário" />
100
- </InputGroup>
101
-
102
- // Com ícone de validação
103
- <InputGroup>
104
- <InputGroupAddon align="inline-start">
105
- <Link className="h-4 w-4" />
106
- </InputGroupAddon>
107
- <InputGroupInput placeholder="https://..." />
108
- <InputGroupAddon align="inline-end">
109
- <Check className="h-4 w-4 text-success" />
110
- </InputGroupAddon>
111
- </InputGroup>`},{title:"InputGroup - Com Botões",description:"Botões integrados para ações como mostrar/ocultar senha, copiar ou limpar",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-md",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Senha"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(k,{className:"h-4 w-4"})}),e.jsx(r,{type:l?"text":"password",placeholder:"Digite sua senha"}),e.jsx(c,{variant:"ghost",size:"icon-xs",onClick:()=>i(!l),type:"button",children:l?e.jsx(E,{className:"h-4 w-4"}):e.jsx(T,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Link para compartilhar"}),e.jsxs(t,{children:[e.jsx(r,{value:"https://meusite.com/abc123",readOnly:!0}),e.jsxs(c,{variant:"secondary",size:"sm",onClick:y,type:"button",children:[n?e.jsx(b,{className:"h-4 w-4"}):e.jsx(B,{className:"h-4 w-4"}),e.jsx("span",{className:"ml-1",children:n?"Copiado!":"Copiar"})]})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Campo com ação"}),e.jsxs(t,{children:[e.jsx(r,{placeholder:"Digite um valor",value:g,onChange:u=>I(u.target.value)}),g&&e.jsx(c,{variant:"ghost",size:"icon-xs",onClick:()=>I(""),type:"button",children:e.jsx(v,{className:"h-4 w-4"})})]})]})]}),code:`const [showPassword, setShowPassword] = useState(false);
112
-
113
- // Campo de senha com toggle
114
- <InputGroup>
115
- <InputGroupAddon align="inline-start">
116
- <Lock className="h-4 w-4" />
117
- </InputGroupAddon>
118
- <InputGroupInput
119
- type={showPassword ? "text" : "password"}
120
- placeholder="Digite sua senha"
121
- />
122
- <InputGroupButton
123
- variant="ghost"
124
- size="icon-xs"
125
- onClick={() => setShowPassword(!showPassword)}
126
- type="button"
127
- >
128
- {showPassword ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
129
- </InputGroupButton>
130
- </InputGroup>
131
-
132
- // Campo com botão de copiar
133
- <InputGroup>
134
- <InputGroupInput value="https://meusite.com/abc123" readOnly />
135
- <InputGroupButton variant="secondary" size="sm" onClick={handleCopy}>
136
- <Copy className="h-4 w-4" />
137
- <span className="ml-1">Copiar</span>
138
- </InputGroupButton>
139
- </InputGroup>`},{title:"InputGroup - Combinações Avançadas",description:"Combine múltiplos addons, ícones e botões para casos complexos",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-md",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Preço em dólares"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(V,{className:"h-4 w-4"})}),e.jsx(r,{type:"number",placeholder:"0.00",step:"0.01"}),e.jsx(o,{align:"inline-end",children:"USD"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Verificar usuário"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(P,{className:"h-4 w-4"})}),e.jsx(r,{placeholder:"username"}),e.jsx(c,{variant:"default",size:"sm",children:"Verificar"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Código de referência"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(q,{className:"h-4 w-4"})}),e.jsx(o,{align:"inline-start",children:"REF-"}),e.jsx(r,{placeholder:"0000",maxLength:4}),e.jsx(c,{variant:"outline",size:"sm",children:"Gerar"})]})]})]}),code:`// Preço com ícone e unidade
140
- <InputGroup>
141
- <InputGroupAddon align="inline-start">
142
- <DollarSign className="h-4 w-4" />
143
- </InputGroupAddon>
144
- <InputGroupInput type="number" placeholder="0.00" step="0.01" />
145
- <InputGroupAddon align="inline-end">USD</InputGroupAddon>
146
- </InputGroup>
147
-
148
- // Username com verificação
149
- <InputGroup>
150
- <InputGroupAddon align="inline-start">
151
- <AtSign className="h-4 w-4" />
152
- </InputGroupAddon>
153
- <InputGroupInput placeholder="username" />
154
- <InputGroupButton variant="default" size="sm">
155
- Verificar
156
- </InputGroupButton>
157
- </InputGroup>
158
-
159
- // Múltiplos addons
160
- <InputGroup>
161
- <InputGroupAddon align="inline-start">
162
- <Hash className="h-4 w-4" />
163
- </InputGroupAddon>
164
- <InputGroupAddon align="inline-start">REF-</InputGroupAddon>
165
- <InputGroupInput placeholder="0000" maxLength={4} />
166
- <InputGroupButton variant="outline" size="sm">
167
- Gerar
168
- </InputGroupButton>
169
- </InputGroup>`},{title:"InputGroup - Com Textarea",description:"Use InputGroupTextarea para áreas de texto com header ou footer",preview:e.jsxs("div",{className:"flex flex-col gap-4 max-w-md",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Mensagem com header"}),e.jsxs(t,{className:"flex-col",children:[e.jsx(o,{align:"block-start",className:"bg-muted/50",children:e.jsx("span",{className:"text-xs font-medium",children:"Escreva sua mensagem"})}),e.jsx(j,{placeholder:"Digite sua mensagem aqui...",rows:3})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{children:"Descrição com contador"}),e.jsxs(t,{className:"flex-col",children:[e.jsx(j,{placeholder:"Descreva o problema...",rows:3,maxLength:500}),e.jsx(o,{align:"block-end",className:"justify-end bg-muted/30",children:e.jsx("span",{className:"text-xs",children:"0/500 caracteres"})})]})]})]}),code:`// Textarea com header
170
- <InputGroup className="flex-col">
171
- <InputGroupAddon align="block-start" className="bg-muted/50">
172
- <span className="text-xs font-medium">Escreva sua mensagem</span>
173
- </InputGroupAddon>
174
- <InputGroupTextarea placeholder="Digite sua mensagem..." rows={3} />
175
- </InputGroup>
176
-
177
- // Textarea com footer contador
178
- <InputGroup className="flex-col">
179
- <InputGroupTextarea placeholder="Descreva..." rows={3} maxLength={500} />
180
- <InputGroupAddon align="block-end" className="justify-end bg-muted/30">
181
- <span className="text-xs">0/500 caracteres</span>
182
- </InputGroupAddon>
183
- </InputGroup>`},{title:"Formulário Completo",description:"Exemplo de formulário combinando Input, Label e InputGroup",preview:e.jsxs("form",{className:"flex flex-col gap-4 max-w-md",onSubmit:u=>u.preventDefault(),children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"first-name",children:"Nome *"}),e.jsx(s,{id:"first-name",placeholder:"João",required:!0})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"last-name",children:"Sobrenome *"}),e.jsx(s,{id:"last-name",placeholder:"Silva",required:!0})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"form-email",children:"Email *"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:e.jsx(h,{className:"h-4 w-4"})}),e.jsx(r,{id:"form-email",type:"email",placeholder:"joao@exemplo.com",required:!0})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"form-phone",children:"Telefone"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:"+55"}),e.jsx(r,{id:"form-phone",type:"tel",placeholder:"(11) 99999-9999"})]})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(a,{htmlFor:"form-website",children:"Website"}),e.jsxs(t,{children:[e.jsx(o,{align:"inline-start",children:"https://"}),e.jsx(r,{id:"form-website",placeholder:"seusite.com"})]})]}),e.jsx(N,{type:"submit",className:"w-full",children:"Enviar"})]}),code:`<form className="flex flex-col gap-4 max-w-md">
184
- <div className="grid grid-cols-2 gap-4">
185
- <div className="space-y-1.5">
186
- <Label htmlFor="first-name">Nome *</Label>
187
- <Input id="first-name" placeholder="João" required />
188
- </div>
189
- <div className="space-y-1.5">
190
- <Label htmlFor="last-name">Sobrenome *</Label>
191
- <Input id="last-name" placeholder="Silva" required />
192
- </div>
193
- </div>
194
- <div className="space-y-1.5">
195
- <Label htmlFor="email">Email *</Label>
196
- <InputGroup>
197
- <InputGroupAddon align="inline-start">
198
- <Mail className="h-4 w-4" />
199
- </InputGroupAddon>
200
- <InputGroupInput id="email" type="email" placeholder="joao@exemplo.com" required />
201
- </InputGroup>
202
- </div>
203
- <div className="space-y-1.5">
204
- <Label htmlFor="phone">Telefone</Label>
205
- <InputGroup>
206
- <InputGroupAddon align="inline-start">+55</InputGroupAddon>
207
- <InputGroupInput id="phone" type="tel" placeholder="(11) 99999-9999" />
208
- </InputGroup>
209
- </div>
210
- <Button type="submit" className="w-full">Enviar</Button>
211
- </form>`}],props:[{name:"type",type:"string",default:'"text"',description:'Tipo do input HTML: "text", "email", "password", "number", "tel", "url", "search", "date", "time", etc.'},{name:"placeholder",type:"string",default:"-",description:"Texto de placeholder exibido quando o campo está vazio."},{name:"value",type:"string | number",default:"-",description:"Valor controlado do input."},{name:"defaultValue",type:"string | number",default:"-",description:"Valor inicial para input não controlado."},{name:"disabled",type:"boolean",default:"false",description:"Se o input está desabilitado (não editável e não envia no form)."},{name:"readOnly",type:"boolean",default:"false",description:"Se o input é somente leitura (não editável mas envia no form)."},{name:"required",type:"boolean",default:"false",description:"Se o campo é obrigatório para submissão do formulário."},{name:"maxLength",type:"number",default:"-",description:"Número máximo de caracteres permitidos."},{name:"minLength",type:"number",default:"-",description:"Número mínimo de caracteres necessários."},{name:"pattern",type:"string",default:"-",description:"Regex para validação do valor (HTML5)."},{name:"autoComplete",type:"string",default:"-",description:'Dica de autocompletar: "off", "email", "name", "tel", etc.'},{name:"autoFocus",type:"boolean",default:"false",description:"Se o input deve receber foco automaticamente ao montar."},{name:"className",type:"string",default:"-",description:"Classes CSS adicionais para customização."},{name:"onChange",type:"(e: ChangeEvent) => void",default:"-",description:"Callback chamado quando o valor muda."},{name:"onBlur",type:"(e: FocusEvent) => void",default:"-",description:"Callback chamado quando o input perde foco."},{name:"onFocus",type:"(e: FocusEvent) => void",default:"-",description:"Callback chamado quando o input recebe foco."}],notes:["**Label**: Componente de rótulo acessível. Use `htmlFor` para associar ao `id` do input.","**InputGroup**: Container que agrupa input com addons. Adiciona borda unificada e foco visual compartilhado.","**InputGroupInput**: Input estilizado para uso dentro do InputGroup (remove bordas próprias).","**InputGroupTextarea**: Textarea estilizado para uso com addons `block-start` ou `block-end`.","**InputGroupAddon**: Elemento decorativo (texto, ícone). Props: `align`: `inline-start` (prefixo), `inline-end` (sufixo), `block-start` (topo), `block-end` (base).","**InputGroupButton**: Botão integrado ao InputGroup. Props: `size`: `xs`, `sm`, `icon-xs`, `icon-sm`. Aceita todas as `variant` do Button.","Para validação de formulários, use react-hook-form com FormField, FormControl e FormMessage.","Para estados de erro, adicione as classes `border-destructive focus-visible:ring-destructive` ao Input."],accessibility:["Sempre associe Label ao Input usando htmlFor/id para melhor navegação com leitores de tela","Use placeholder como dica adicional, nunca como substituto do Label","O estado disabled é comunicado automaticamente para tecnologias assistivas","O estado required é comunicado e valida automaticamente no submit","InputGroup mantém foco visual unificado (ring) quando qualquer elemento interno está focado","Indicadores de foco visíveis atendem WCAG 2.4.7 (Focus Visible)","Inputs são totalmente navegáveis via teclado (Tab, Shift+Tab)","Para campos de senha, forneça toggle de visibilidade com ícone descritivo","Mensagens de erro devem ser associadas ao input via aria-describedby para leitores de tela"]})}export{J as InputDoc};
@@ -1,42 +0,0 @@
1
- import{j as e,L as a,I as s,e as i}from"./index-CE0k7Rdh.js";import{C as l}from"./ComponentDocTemplate-CRbRY-v5.js";function o(){return e.jsx(l,{title:"Label",description:"Renderiza uma label acessível associada a controles de formulário.",component:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(i,{id:"terms-main"}),e.jsx(a,{htmlFor:"terms-main",children:"Aceitar termos e condições"})]}),usage:`import { Label } from "forlogic-core"
2
-
3
- <Label htmlFor="email">Email</Label>
4
- <Input id="email" type="email" />`,examples:[{title:"Com Input",description:"Label associada a um campo de texto.",preview:e.jsxs("div",{className:"grid w-full max-w-sm gap-1.5",children:[e.jsx(a,{htmlFor:"email",children:"Email"}),e.jsx(s,{id:"email",type:"email",placeholder:"seu@email.com"})]}),code:`<div className="grid gap-1.5">
5
- <Label htmlFor="email">Email</Label>
6
- <Input id="email" type="email" placeholder="seu@email.com" />
7
- </div>`},{title:"Campo Obrigatório",description:"Indicador visual de campo obrigatório.",preview:e.jsxs("div",{className:"grid w-full max-w-sm gap-1.5",children:[e.jsxs(a,{htmlFor:"name",children:["Nome completo ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(s,{id:"name",required:!0})]}),code:`<Label htmlFor="name">
8
- Nome completo <span className="text-destructive">*</span>
9
- </Label>
10
- <Input id="name" required />`},{title:"Com Texto de Ajuda",description:"Label com descrição auxiliar abaixo.",preview:e.jsxs("div",{className:"grid w-full max-w-sm gap-1.5",children:[e.jsx(a,{htmlFor:"password",children:"Senha"}),e.jsx(s,{id:"password",type:"password"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Mínimo de 8 caracteres com letras e números."})]}),code:`<div className="grid gap-1.5">
11
- <Label htmlFor="password">Senha</Label>
12
- <Input id="password" type="password" />
13
- <p className="text-xs text-muted-foreground">
14
- Mínimo de 8 caracteres com letras e números.
15
- </p>
16
- </div>`},{title:"Estado de Erro",description:"Label estilizada para indicar erro de validação.",preview:e.jsxs("div",{className:"grid w-full max-w-sm gap-1.5",children:[e.jsx(a,{htmlFor:"email-error",className:"text-destructive",children:"Email"}),e.jsx(s,{id:"email-error",type:"email",className:"border-destructive",defaultValue:"email-invalido"}),e.jsx("p",{className:"text-xs text-destructive",children:"Por favor, insira um email válido."})]}),code:`<Label htmlFor="email" className="text-destructive">Email</Label>
17
- <Input id="email" className="border-destructive" />
18
- <p className="text-xs text-destructive">
19
- Por favor, insira um email válido.
20
- </p>`},{title:"Campo Desabilitado",description:"Label com aparência desabilitada.",preview:e.jsxs("div",{className:"grid w-full max-w-sm gap-1.5",children:[e.jsx(a,{htmlFor:"disabled-field",className:"text-muted-foreground",children:"Campo bloqueado"}),e.jsx(s,{id:"disabled-field",disabled:!0,defaultValue:"Valor fixo"})]}),code:`<Label htmlFor="field" className="text-muted-foreground">
21
- Campo bloqueado
22
- </Label>
23
- <Input id="field" disabled defaultValue="Valor fixo" />`},{title:"Com Checkbox",description:"Label associada a checkbox para área de clique maior.",preview:e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(i,{id:"newsletter"}),e.jsx(a,{htmlFor:"newsletter",className:"cursor-pointer",children:"Receber novidades por email"})]}),code:`<div className="flex items-center space-x-2">
24
- <Checkbox id="newsletter" />
25
- <Label htmlFor="newsletter" className="cursor-pointer">
26
- Receber novidades por email
27
- </Label>
28
- </div>`},{title:"Formulário Completo",description:"Múltiplos campos com labels estruturadas.",preview:e.jsxs("div",{className:"grid w-full max-w-sm gap-4",children:[e.jsxs("div",{className:"grid gap-1.5",children:[e.jsxs(a,{htmlFor:"full-name",children:["Nome ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(s,{id:"full-name"})]}),e.jsxs("div",{className:"grid gap-1.5",children:[e.jsxs(a,{htmlFor:"full-email",children:["Email ",e.jsx("span",{className:"text-destructive",children:"*"})]}),e.jsx(s,{id:"full-email",type:"email"})]}),e.jsxs("div",{className:"grid gap-1.5",children:[e.jsx(a,{htmlFor:"full-phone",children:"Telefone"}),e.jsx(s,{id:"full-phone",type:"tel"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Opcional"})]})]}),code:`<div className="grid gap-4">
29
- <div className="grid gap-1.5">
30
- <Label htmlFor="name">Nome <span className="text-destructive">*</span></Label>
31
- <Input id="name" />
32
- </div>
33
- <div className="grid gap-1.5">
34
- <Label htmlFor="email">Email <span className="text-destructive">*</span></Label>
35
- <Input id="email" type="email" />
36
- </div>
37
- <div className="grid gap-1.5">
38
- <Label htmlFor="phone">Telefone</Label>
39
- <Input id="phone" type="tel" />
40
- <p className="text-xs text-muted-foreground">Opcional</p>
41
- </div>
42
- </div>`}],props:[{name:"htmlFor",type:"string",default:"-",description:"O id do controle de formulário para associar."},{name:"className",type:"string",default:"-",description:"Classes CSS para estilização."},{name:"children",type:"ReactNode",default:"-",description:"Conteúdo da label."}],accessibility:["Associa adequadamente com controles de formulário via htmlFor","Clicar na label foca automaticamente o input associado","Suporte completo para leitores de tela","Compatível com WCAG - melhora a área de clique","Use com Checkbox/Radio para melhor UX"],notes:["Sempre associe Labels a seus campos via htmlFor/id","Use o componente Label (não <label>) para formulários acessíveis","Indique campos obrigatórios com asterisco ou texto descritivo","Labels aumentam a área de clique para inputs (especialmente útil em mobile)","Adicione cursor-pointer quando associada a checkboxes/radios","Combine com texto de ajuda abaixo do input para instruções adicionais"]})}export{o as LabelDoc};