@plenustech/design-system 0.2.3 → 0.2.5

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 (233) hide show
  1. package/README.md +8 -0
  2. package/dist/components/actions/ButtonTile/ButtonTile.module.css.cjs +1 -1
  3. package/dist/components/actions/ButtonTile/ButtonTile.module.css.js +10 -10
  4. package/dist/components/actions/Toolbar/Toolbar.cjs +1 -1
  5. package/dist/components/actions/Toolbar/Toolbar.cjs.map +1 -1
  6. package/dist/components/actions/Toolbar/Toolbar.js +64 -53
  7. package/dist/components/actions/Toolbar/Toolbar.js.map +1 -1
  8. package/dist/components/charts/ChartGauge/ChartGauge.cjs +2 -0
  9. package/dist/components/charts/ChartGauge/ChartGauge.cjs.map +1 -0
  10. package/dist/components/charts/ChartGauge/ChartGauge.js +307 -0
  11. package/dist/components/charts/ChartGauge/ChartGauge.js.map +1 -0
  12. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs +2 -0
  13. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs.map +1 -0
  14. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js +76 -0
  15. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js.map +1 -0
  16. package/dist/components/charts/ChartGauge/gaugeLayout.cjs +2 -0
  17. package/dist/components/charts/ChartGauge/gaugeLayout.cjs.map +1 -0
  18. package/dist/components/charts/ChartGauge/gaugeLayout.js +107 -0
  19. package/dist/components/charts/ChartGauge/gaugeLayout.js.map +1 -0
  20. package/dist/components/charts/ChartGauge/gaugeReading.cjs +2 -0
  21. package/dist/components/charts/ChartGauge/gaugeReading.cjs.map +1 -0
  22. package/dist/components/charts/ChartGauge/gaugeReading.js +112 -0
  23. package/dist/components/charts/ChartGauge/gaugeReading.js.map +1 -0
  24. package/dist/components/charts/ChartGauge/gaugeScale.cjs +2 -0
  25. package/dist/components/charts/ChartGauge/gaugeScale.cjs.map +1 -0
  26. package/dist/components/charts/ChartGauge/gaugeScale.js +57 -0
  27. package/dist/components/charts/ChartGauge/gaugeScale.js.map +1 -0
  28. package/dist/components/charts/ChartMap/ChartMap.cjs +2 -0
  29. package/dist/components/charts/ChartMap/ChartMap.cjs.map +1 -0
  30. package/dist/components/charts/ChartMap/ChartMap.js +523 -0
  31. package/dist/components/charts/ChartMap/ChartMap.js.map +1 -0
  32. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs +2 -0
  33. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs.map +1 -0
  34. package/dist/components/charts/ChartMap/ChartMap.module.css.js +124 -0
  35. package/dist/components/charts/ChartMap/ChartMap.module.css.js.map +1 -0
  36. package/dist/components/charts/ChartMap/ChartMapLegend.cjs +2 -0
  37. package/dist/components/charts/ChartMap/ChartMapLegend.cjs.map +1 -0
  38. package/dist/components/charts/ChartMap/ChartMapLegend.js +102 -0
  39. package/dist/components/charts/ChartMap/ChartMapLegend.js.map +1 -0
  40. package/dist/components/charts/ChartMap/ChartMapTable.cjs +2 -0
  41. package/dist/components/charts/ChartMap/ChartMapTable.cjs.map +1 -0
  42. package/dist/components/charts/ChartMap/ChartMapTable.js +118 -0
  43. package/dist/components/charts/ChartMap/ChartMapTable.js.map +1 -0
  44. package/dist/components/charts/ChartMap/mapGeometry.cjs +2 -0
  45. package/dist/components/charts/ChartMap/mapGeometry.cjs.map +1 -0
  46. package/dist/components/charts/ChartMap/mapGeometry.js +113 -0
  47. package/dist/components/charts/ChartMap/mapGeometry.js.map +1 -0
  48. package/dist/components/charts/ChartMap/mapLabels.cjs +2 -0
  49. package/dist/components/charts/ChartMap/mapLabels.cjs.map +1 -0
  50. package/dist/components/charts/ChartMap/mapLabels.js +80 -0
  51. package/dist/components/charts/ChartMap/mapLabels.js.map +1 -0
  52. package/dist/components/charts/ChartMap/mapScales.cjs +2 -0
  53. package/dist/components/charts/ChartMap/mapScales.cjs.map +1 -0
  54. package/dist/components/charts/ChartMap/mapScales.js +131 -0
  55. package/dist/components/charts/ChartMap/mapScales.js.map +1 -0
  56. package/dist/components/charts/ChartMap/polylabel.cjs +2 -0
  57. package/dist/components/charts/ChartMap/polylabel.cjs.map +1 -0
  58. package/dist/components/charts/ChartMap/polylabel.js +50 -0
  59. package/dist/components/charts/ChartMap/polylabel.js.map +1 -0
  60. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs +2 -0
  61. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs.map +1 -0
  62. package/dist/components/charts/ChartTimeline/ChartTimeline.js +703 -0
  63. package/dist/components/charts/ChartTimeline/ChartTimeline.js.map +1 -0
  64. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs +2 -0
  65. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs.map +1 -0
  66. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js +124 -0
  67. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js.map +1 -0
  68. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs +2 -0
  69. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs.map +1 -0
  70. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js +42 -0
  71. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js.map +1 -0
  72. package/dist/components/charts/ChartTimeline/timelineLayout.cjs +2 -0
  73. package/dist/components/charts/ChartTimeline/timelineLayout.cjs.map +1 -0
  74. package/dist/components/charts/ChartTimeline/timelineLayout.js +109 -0
  75. package/dist/components/charts/ChartTimeline/timelineLayout.js.map +1 -0
  76. package/dist/components/charts/ChartTimeline/timelineTime.cjs +2 -0
  77. package/dist/components/charts/ChartTimeline/timelineTime.cjs.map +1 -0
  78. package/dist/components/charts/ChartTimeline/timelineTime.js +91 -0
  79. package/dist/components/charts/ChartTimeline/timelineTime.js.map +1 -0
  80. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs +2 -0
  81. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs.map +1 -0
  82. package/dist/components/charts/ChartTimeline/timelineTooltip.js +77 -0
  83. package/dist/components/charts/ChartTimeline/timelineTooltip.js.map +1 -0
  84. package/dist/components/charts/core/ChartLegend.cjs +1 -1
  85. package/dist/components/charts/core/ChartLegend.cjs.map +1 -1
  86. package/dist/components/charts/core/ChartLegend.js +37 -25
  87. package/dist/components/charts/core/ChartLegend.js.map +1 -1
  88. package/dist/components/charts/core/useChartMetrics.cjs +1 -1
  89. package/dist/components/charts/core/useChartMetrics.cjs.map +1 -1
  90. package/dist/components/charts/core/useChartMetrics.js +20 -25
  91. package/dist/components/charts/core/useChartMetrics.js.map +1 -1
  92. package/dist/components/data-display/CodeBlock/syntax.cjs +10 -3
  93. package/dist/components/data-display/CodeBlock/syntax.cjs.map +1 -1
  94. package/dist/components/data-display/CodeBlock/syntax.js +68 -48
  95. package/dist/components/data-display/CodeBlock/syntax.js.map +1 -1
  96. package/dist/components/data-display/List/List.cjs.map +1 -1
  97. package/dist/components/data-display/List/List.js.map +1 -1
  98. package/dist/components/data-display/List/List.module.css.cjs +1 -1
  99. package/dist/components/data-display/List/List.module.css.js +34 -24
  100. package/dist/components/data-display/List/List.module.css.js.map +1 -1
  101. package/dist/components/data-display/List/ListingOptions.cjs +1 -1
  102. package/dist/components/data-display/List/ListingOptions.cjs.map +1 -1
  103. package/dist/components/data-display/List/ListingOptions.js +98 -74
  104. package/dist/components/data-display/List/ListingOptions.js.map +1 -1
  105. package/dist/components/data-display/List/useListing.cjs.map +1 -1
  106. package/dist/components/data-display/List/useListing.js.map +1 -1
  107. package/dist/components/data-display/Timeline/Timeline.cjs +1 -1
  108. package/dist/components/data-display/Timeline/Timeline.cjs.map +1 -1
  109. package/dist/components/data-display/Timeline/Timeline.js +6 -6
  110. package/dist/components/data-display/Timeline/Timeline.js.map +1 -1
  111. package/dist/components/data-display/Timeline/Timeline.module.css.cjs +1 -1
  112. package/dist/components/data-display/Timeline/Timeline.module.css.js +18 -16
  113. package/dist/components/data-display/Timeline/Timeline.module.css.js.map +1 -1
  114. package/dist/components/forms/Checkbox/Checkbox.module.css.cjs +1 -1
  115. package/dist/components/forms/Checkbox/Checkbox.module.css.js +5 -5
  116. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs +1 -1
  117. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js +1 -1
  118. package/dist/components/forms/ComboBox/ComboBox.cjs.map +1 -1
  119. package/dist/components/forms/ComboBox/ComboBox.js.map +1 -1
  120. package/dist/components/forms/Field/Field.cjs +1 -1
  121. package/dist/components/forms/Field/Field.cjs.map +1 -1
  122. package/dist/components/forms/Field/Field.js +22 -22
  123. package/dist/components/forms/Field/Field.js.map +1 -1
  124. package/dist/components/forms/Field/Field.module.css.cjs +1 -1
  125. package/dist/components/forms/Field/Field.module.css.js +19 -17
  126. package/dist/components/forms/Field/Field.module.css.js.map +1 -1
  127. package/dist/components/forms/InputText/InputText.cjs +1 -1
  128. package/dist/components/forms/InputText/InputText.cjs.map +1 -1
  129. package/dist/components/forms/InputText/InputText.js +24 -24
  130. package/dist/components/forms/InputText/InputText.js.map +1 -1
  131. package/dist/components/forms/InputText/InputText.module.css.cjs +1 -1
  132. package/dist/components/forms/InputText/InputText.module.css.js +9 -7
  133. package/dist/components/forms/InputText/InputText.module.css.js.map +1 -1
  134. package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs +1 -1
  135. package/dist/components/forms/RadioGroup/RadioGroup.module.css.js +4 -4
  136. package/dist/components/forms/Select/Select.cjs.map +1 -1
  137. package/dist/components/forms/Select/Select.js.map +1 -1
  138. package/dist/components/forms/Switch/Switch.module.css.cjs +1 -1
  139. package/dist/components/forms/Switch/Switch.module.css.js +6 -6
  140. package/dist/components/icons/suite.cjs +1 -0
  141. package/dist/components/icons/suite.js +10894 -0
  142. package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
  143. package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
  144. package/dist/components/navigation/Pagination/Pagination.js +71 -44
  145. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  146. package/dist/components/navigation/Pagination/Pagination.module.css.cjs +1 -1
  147. package/dist/components/navigation/Pagination/Pagination.module.css.js +18 -14
  148. package/dist/components/navigation/Pagination/Pagination.module.css.js.map +1 -1
  149. package/dist/components/navigation/TabsNav/TabsNav.cjs +2 -0
  150. package/dist/components/navigation/TabsNav/TabsNav.cjs.map +1 -0
  151. package/dist/components/navigation/TabsNav/TabsNav.js +21 -0
  152. package/dist/components/navigation/TabsNav/TabsNav.js.map +1 -0
  153. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs +2 -0
  154. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs.map +1 -0
  155. package/dist/components/navigation/TabsNav/TabsNav.module.css.js +18 -0
  156. package/dist/components/navigation/TabsNav/TabsNav.module.css.js.map +1 -0
  157. package/dist/components/overlays/Dialog/Dialog.cjs.map +1 -1
  158. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  159. package/dist/components/overlays/Dialog/DialogFrame.cjs +1 -1
  160. package/dist/components/overlays/Dialog/DialogFrame.cjs.map +1 -1
  161. package/dist/components/overlays/Dialog/DialogFrame.js +30 -30
  162. package/dist/components/overlays/Dialog/DialogFrame.js.map +1 -1
  163. package/dist/components/overlays/Drawer/Drawer.cjs.map +1 -1
  164. package/dist/components/overlays/Drawer/Drawer.js.map +1 -1
  165. package/dist/components/overlays/Menu/Menu.cjs +1 -1
  166. package/dist/components/overlays/Menu/Menu.cjs.map +1 -1
  167. package/dist/components/overlays/Menu/Menu.js +37 -36
  168. package/dist/components/overlays/Menu/Menu.js.map +1 -1
  169. package/dist/components/overlays/Menu/keyShortcuts.cjs +2 -0
  170. package/dist/components/overlays/Menu/keyShortcuts.cjs.map +1 -0
  171. package/dist/components/overlays/Menu/keyShortcuts.js +55 -0
  172. package/dist/components/overlays/Menu/keyShortcuts.js.map +1 -0
  173. package/dist/components/overlays/Tooltip/Tooltip.cjs +1 -1
  174. package/dist/components/overlays/Tooltip/Tooltip.cjs.map +1 -1
  175. package/dist/components/overlays/Tooltip/Tooltip.js +81 -56
  176. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  177. package/dist/design-system.css +1 -1
  178. package/dist/icons.cjs +2 -0
  179. package/dist/icons.cjs.map +1 -0
  180. package/dist/icons.js +2054 -0
  181. package/dist/icons.js.map +1 -0
  182. package/dist/index.cjs +1 -1
  183. package/dist/index.js +184 -174
  184. package/dist/index.js.map +1 -1
  185. package/dist/types/components/charts/ChartGauge/ChartGauge.d.ts +83 -0
  186. package/dist/types/components/charts/ChartGauge/gaugeLayout.d.ts +64 -0
  187. package/dist/types/components/charts/ChartGauge/gaugeReading.d.ts +97 -0
  188. package/dist/types/components/charts/ChartGauge/gaugeScale.d.ts +38 -0
  189. package/dist/types/components/charts/ChartGauge/index.d.ts +2 -0
  190. package/dist/types/components/charts/ChartMap/ChartMap.d.ts +104 -0
  191. package/dist/types/components/charts/ChartMap/ChartMapLegend.d.ts +44 -0
  192. package/dist/types/components/charts/ChartMap/ChartMapTable.d.ts +38 -0
  193. package/dist/types/components/charts/ChartMap/index.d.ts +4 -0
  194. package/dist/types/components/charts/ChartMap/mapGeometry.d.ts +56 -0
  195. package/dist/types/components/charts/ChartMap/mapLabels.d.ts +51 -0
  196. package/dist/types/components/charts/ChartMap/mapScales.d.ts +76 -0
  197. package/dist/types/components/charts/ChartMap/polylabel.d.ts +9 -0
  198. package/dist/types/components/charts/ChartTimeline/ChartTimeline.d.ts +137 -0
  199. package/dist/types/components/charts/ChartTimeline/ChartTimelineTable.d.ts +25 -0
  200. package/dist/types/components/charts/ChartTimeline/index.d.ts +2 -0
  201. package/dist/types/components/charts/ChartTimeline/timelineLayout.d.ts +70 -0
  202. package/dist/types/components/charts/ChartTimeline/timelineTime.d.ts +16 -0
  203. package/dist/types/components/charts/ChartTimeline/timelineTooltip.d.ts +45 -0
  204. package/dist/types/components/charts/core/ChartLegend.d.ts +3 -1
  205. package/dist/types/components/data-display/CodeBlock/syntax.d.ts +1 -1
  206. package/dist/types/components/data-display/List/List.d.ts +1 -1
  207. package/dist/types/components/data-display/List/useListing.d.ts +7 -1
  208. package/dist/types/components/data-display/Timeline/Timeline.d.ts +4 -1
  209. package/dist/types/components/data-display/Timeline/index.d.ts +1 -1
  210. package/dist/types/components/forms/ComboBox/ComboBox.d.ts +7 -1
  211. package/dist/types/components/forms/Field/Field.d.ts +1 -1
  212. package/dist/types/components/forms/InputText/InputText.d.ts +1 -1
  213. package/dist/types/components/forms/Select/Select.d.ts +5 -1
  214. package/dist/types/components/icons/suite.d.ts +2051 -0
  215. package/dist/types/components/navigation/Pagination/Pagination.d.ts +13 -1
  216. package/dist/types/components/navigation/Pagination/index.d.ts +1 -1
  217. package/dist/types/components/navigation/TabsNav/TabsNav.d.ts +20 -0
  218. package/dist/types/components/navigation/TabsNav/index.d.ts +2 -0
  219. package/dist/types/components/overlays/Dialog/Dialog.d.ts +19 -7
  220. package/dist/types/components/overlays/Dialog/DialogFrame.d.ts +8 -2
  221. package/dist/types/components/overlays/Drawer/Drawer.d.ts +2 -2
  222. package/dist/types/components/overlays/Menu/Menu.d.ts +3 -1
  223. package/dist/types/components/overlays/Menu/keyShortcuts.d.ts +2 -0
  224. package/dist/types/components/overlays/Tooltip/Tooltip.d.ts +26 -5
  225. package/dist/types/icons.d.ts +6 -0
  226. package/dist/types/index.d.ts +11 -3
  227. package/dist/types/utils/formatters/formatarDuracao.d.ts +5 -0
  228. package/dist/types/utils/formatters/index.d.ts +1 -0
  229. package/dist/utils/formatters/formatarDuracao.cjs +2 -0
  230. package/dist/utils/formatters/formatarDuracao.cjs.map +1 -0
  231. package/dist/utils/formatters/formatarDuracao.js +10 -0
  232. package/dist/utils/formatters/formatarDuracao.js.map +1 -0
  233. package/package.json +10 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ComboBox.cjs","sources":["../../../../src/components/forms/ComboBox/ComboBox.tsx"],"sourcesContent":["import {\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions, optionId } from '../../data-display/List/ListingOptions';\nimport { useListing, type ListingItem } from '../../data-display/List/useListing';\nimport { Badge } from '../../data-display/Badge';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './ComboBox.module.css';\n\nexport type ComboBoxSize = 'sm' | 'md';\n\nexport interface ComboBoxOption {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma ao do sistema. */\ninterface ComboBoxBaseProps\n extends Omit<ComponentPropsWithRef<'input'>, 'defaultValue' | 'name' | 'onChange' | 'size' | 'type' | 'value'> {\n emptyMessage?: string;\n error?: string;\n hint?: string;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n loading?: boolean;\n onSearch?: (term: string) => void;\n options: readonly ComboBoxOption[];\n size?: ComboBoxSize;\n}\n\nexport interface ComboBoxSingleProps extends ComboBoxBaseProps {\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n selectionMode?: 'single';\n value?: string;\n}\n\nexport interface ComboBoxMultipleProps extends ComboBoxBaseProps {\n defaultValue?: readonly string[];\n onValueChange?: (values: readonly string[]) => void;\n selectionMode: 'multiple';\n value?: readonly string[];\n}\n\nexport type ComboBoxProps = ComboBoxSingleProps | ComboBoxMultipleProps;\n\nfunction comoItens(valor: string | readonly string[] | undefined): ListingItem[] | undefined {\n if (valor === undefined) {\n return undefined;\n }\n\n return (typeof valor === 'string' ? [valor] : valor).map((value) => ({ value, label: '' }));\n}\n\nfunction relatarEscolha(props: ComboBoxProps, escolhidos: readonly ListingItem[]) {\n if (props.selectionMode === 'multiple') {\n props.onValueChange?.(escolhidos.map((item) => item.value));\n return;\n }\n\n const [primeiro] = escolhidos;\n\n if (primeiro) {\n props.onValueChange?.(primeiro.value);\n }\n}\n\nexport function ComboBox(allProps: ComboBoxProps) {\n const {\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n emptyMessage = 'Nenhum resultado',\n error,\n hint,\n id: providedId,\n label,\n loading = false,\n onBlur,\n onClick,\n onKeyDown,\n onSearch,\n // Fora do resto, que vai ao campo: quem o chama e `relatarEscolha`, que conhece o modo.\n onValueChange,\n options,\n placeholder,\n ref,\n required = false,\n selectionMode = 'single',\n size = 'md',\n value,\n ...props\n } = allProps;\n const multiple = selectionMode === 'multiple';\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const baseId = `combobox-${useId()}`;\n const [open, setOpen] = useState(false);\n const [filtering, setFiltering] = useState(false);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n listing.reset();\n fechar();\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n\n // O valor e a chave, e nao a opcao: com opcoes que chegam depois, filtrar por elas perdia a escolha.\n const listing = useListing({\n items: options,\n selectionMode,\n defaultValue: comoItens(defaultValue),\n value: comoItens(value),\n onSearch,\n onSelectionChange: (escolhidos) => relatarEscolha(allProps, escolhidos),\n });\n\n const escolhidos = listing.selected;\n const [chosen] = escolhidos;\n // Na escolha multipla o campo so guarda a busca: quem mostra o que esta escolhido sao as etiquetas.\n const texto = multiple || filtering ? listing.term : chosen?.label ?? '';\n const ancoraRef = multiple ? controlRef : inputRef;\n const activeIndex = listing.visible.findIndex((option) => option.value === listing.focusedKey);\n\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: ancoraRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n const [largura, setLargura] = useState<number>();\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(ancoraRef.current?.offsetWidth);\n }, [ancoraRef, open]);\n\n // Sem medida, como no servidor, o campo resume as escolhas; medido, mostra todas as etiquetas enquanto couberem.\n const [resumir, setResumir] = useState(true);\n const selecaoRef = useRef<HTMLSpanElement>(null);\n const chaveDasEscolhas = escolhidos.map((item) => item.value).join('\\n');\n\n useLayoutEffect(() => {\n const moldura = controlRef.current;\n\n if (!moldura || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n // Desenhar todas e medir na mesma passada, antes da pintura, para o campo nao piscar ao redimensionar.\n const observador = new ResizeObserver(() => {\n flushSync(() => setResumir(false));\n const selecao = selecaoRef.current;\n flushSync(() => setResumir(Boolean(selecao && selecao.scrollWidth > selecao.clientWidth)));\n });\n\n observador.observe(moldura);\n\n return () => observador.disconnect();\n }, [chaveDasEscolhas, multiple]);\n\n function encerrarFiltro() {\n setFiltering(false);\n listing.filter('');\n }\n\n function fechar() {\n setOpen(false);\n encerrarFiltro();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n listing.focusFirst();\n return;\n }\n\n if (event.key === 'Escape') {\n fechar();\n return;\n }\n\n if (event.key === 'Enter') {\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (open && alvo && !alvo.disabled) {\n event.preventDefault();\n listing.select(alvo);\n\n if (!multiple) {\n fechar();\n }\n }\n return;\n }\n\n const ultimo = escolhidos[escolhidos.length - 1];\n\n if (event.key === 'Backspace' && multiple && texto === '' && ultimo) {\n listing.select(ultimo);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => {\n const resumoId = id + '-selection';\n const campo = (\n <input\n {...props}\n ref={mergedRef}\n className={[multiple ? styles.search : styles.input, !multiple && styles[size], !multiple && error && styles.error, className]\n .filter(Boolean)\n .join(' ')}\n id={id}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-describedby={[describedBy, multiple && escolhidos.length > 0 && resumoId].filter(Boolean).join(' ') || undefined}\n aria-invalid={invalid || undefined}\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-controls={open ? baseId + '-options' : undefined}\n aria-activedescendant={open && activeIndex >= 0 ? optionId(baseId, activeIndex) : undefined}\n aria-required={required || undefined}\n disabled={disabled}\n placeholder={placeholder}\n value={texto}\n // Sair do campo desfaz a busca: o texto volta a dizer o que esta escolhido.\n onBlur={(event: FocusEvent<HTMLInputElement>) => {\n fechar();\n onBlur?.(event);\n }}\n onChange={(event) => {\n setFiltering(true);\n setOpen(true);\n listing.filter(event.target.value);\n }}\n onClick={(event: MouseEvent<HTMLInputElement>) => {\n setOpen(true);\n onClick?.(event);\n }}\n onKeyDown={handleKeyDown}\n />\n );\n\n return (\n <>\n {(escolhidos.length > 0 ? escolhidos : [undefined]).map((item) => (\n <FormValue\n disabled={disabled}\n key={item?.value ?? ''}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={item?.value ?? ''}\n />\n ))}\n {multiple ? (\n <div\n className={[styles.control, styles[size], error && styles.error].filter(Boolean).join(' ')}\n // O clique na moldura, fora do campo, leva o foco a ele em vez de tira-lo.\n onMouseDown={(event) => {\n if (event.target !== inputRef.current) {\n event.preventDefault();\n inputRef.current?.focus();\n }\n }}\n ref={controlRef}\n >\n {chosen && (\n <>\n <span aria-hidden=\"true\" className={styles.selection} ref={selecaoRef}>\n {(resumir ? [chosen] : escolhidos).map((item) => (\n <Badge key={item.value}>{item.label}</Badge>\n ))}\n {resumir && escolhidos.length > 1 && (\n <span className={styles.rest}>+{escolhidos.length - 1}</span>\n )}\n </span>\n <span className={styles.summary} id={resumoId}>\n {escolhidos.length === 1 ? '1 selecionado' : `${escolhidos.length} selecionados`}:{' '}\n {escolhidos.map((item) => item.label).join(', ')}\n </span>\n </>\n )}\n {campo}\n </div>\n ) : (\n campo\n )}\n {open &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n // O clique no painel, fora de uma opcao, nao tira o foco do campo nem fecha a lista.\n onMouseDown={(event) => event.preventDefault()}\n style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n empty={<p className={styles.empty}>{emptyMessage}</p>}\n holdsFocus={false}\n label={label ?? placeholder ?? 'Opções'}\n listing={listing}\n loading={loading}\n onSelect={multiple ? undefined : fechar}\n />\n </div>,\n document.body,\n )}\n </>\n );\n }}\n </Field>\n );\n}\n"],"names":["comoItens","valor","value","relatarEscolha","props","escolhidos","_a","item","primeiro","_b","ComboBox","allProps","ariaDescribedBy","className","defaultValue","name","disabled","emptyMessage","error","hint","providedId","label","loading","onBlur","onClick","onKeyDown","onSearch","onValueChange","options","placeholder","ref","required","selectionMode","size","multiple","inputRef","useRef","controlRef","panelRef","baseId","useId","open","setOpen","useState","filtering","setFiltering","resetRef","useFormReset","listing","fechar","mergedRef","useMergedRefs","useListing","chosen","texto","ancoraRef","activeIndex","option","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","resumir","setResumir","selecaoRef","chaveDasEscolhas","moldura","observador","flushSync","selecao","encerrarFiltro","handleKeyDown","event","alvo","ultimo","jsx","Field","id","describedBy","invalid","resumoId","campo","styles","optionId","jsxs","Fragment","FormValue","Badge","createPortal","ListingOptions"],"mappings":"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"}
1
+ {"version":3,"file":"ComboBox.cjs","sources":["../../../../src/components/forms/ComboBox/ComboBox.tsx"],"sourcesContent":["import {\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions, optionId } from '../../data-display/List/ListingOptions';\nimport { useListing, type ListingItem } from '../../data-display/List/useListing';\nimport { Badge } from '../../data-display/Badge';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './ComboBox.module.css';\n\nexport type ComboBoxSize = 'sm' | 'md';\n\nexport interface ComboBoxOption {\n /** Segunda linha da opção, como a coleção de um documento. A busca local procura só no rótulo. */\n description?: string;\n disabled?: boolean;\n /** Título do grupo. As opções seguidas de um mesmo grupo aparecem juntas, sob ele. */\n group?: string;\n /** Decorativo, à frente do rótulo. */\n icon?: ReactNode;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma ao do sistema. */\ninterface ComboBoxBaseProps\n extends Omit<ComponentPropsWithRef<'input'>, 'defaultValue' | 'name' | 'onChange' | 'size' | 'type' | 'value'> {\n emptyMessage?: string;\n error?: string;\n hint?: string;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n loading?: boolean;\n onSearch?: (term: string) => void;\n options: readonly ComboBoxOption[];\n size?: ComboBoxSize;\n}\n\nexport interface ComboBoxSingleProps extends ComboBoxBaseProps {\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n selectionMode?: 'single';\n value?: string;\n}\n\nexport interface ComboBoxMultipleProps extends ComboBoxBaseProps {\n defaultValue?: readonly string[];\n onValueChange?: (values: readonly string[]) => void;\n selectionMode: 'multiple';\n value?: readonly string[];\n}\n\nexport type ComboBoxProps = ComboBoxSingleProps | ComboBoxMultipleProps;\n\nfunction comoItens(valor: string | readonly string[] | undefined): ListingItem[] | undefined {\n if (valor === undefined) {\n return undefined;\n }\n\n return (typeof valor === 'string' ? [valor] : valor).map((value) => ({ value, label: '' }));\n}\n\nfunction relatarEscolha(props: ComboBoxProps, escolhidos: readonly ListingItem[]) {\n if (props.selectionMode === 'multiple') {\n props.onValueChange?.(escolhidos.map((item) => item.value));\n return;\n }\n\n const [primeiro] = escolhidos;\n\n if (primeiro) {\n props.onValueChange?.(primeiro.value);\n }\n}\n\nexport function ComboBox(allProps: ComboBoxProps) {\n const {\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n emptyMessage = 'Nenhum resultado',\n error,\n hint,\n id: providedId,\n label,\n loading = false,\n onBlur,\n onClick,\n onKeyDown,\n onSearch,\n // Fora do resto, que vai ao campo: quem o chama e `relatarEscolha`, que conhece o modo.\n onValueChange,\n options,\n placeholder,\n ref,\n required = false,\n selectionMode = 'single',\n size = 'md',\n value,\n ...props\n } = allProps;\n const multiple = selectionMode === 'multiple';\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const baseId = `combobox-${useId()}`;\n const [open, setOpen] = useState(false);\n const [filtering, setFiltering] = useState(false);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n listing.reset();\n fechar();\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n\n // O valor e a chave, e nao a opcao: com opcoes que chegam depois, filtrar por elas perdia a escolha.\n const listing = useListing({\n items: options,\n selectionMode,\n defaultValue: comoItens(defaultValue),\n value: comoItens(value),\n onSearch,\n onSelectionChange: (escolhidos) => relatarEscolha(allProps, escolhidos),\n });\n\n const escolhidos = listing.selected;\n const [chosen] = escolhidos;\n // Na escolha multipla o campo so guarda a busca: quem mostra o que esta escolhido sao as etiquetas.\n const texto = multiple || filtering ? listing.term : chosen?.label ?? '';\n const ancoraRef = multiple ? controlRef : inputRef;\n const activeIndex = listing.visible.findIndex((option) => option.value === listing.focusedKey);\n\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: ancoraRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n const [largura, setLargura] = useState<number>();\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(ancoraRef.current?.offsetWidth);\n }, [ancoraRef, open]);\n\n // Sem medida, como no servidor, o campo resume as escolhas; medido, mostra todas as etiquetas enquanto couberem.\n const [resumir, setResumir] = useState(true);\n const selecaoRef = useRef<HTMLSpanElement>(null);\n const chaveDasEscolhas = escolhidos.map((item) => item.value).join('\\n');\n\n useLayoutEffect(() => {\n const moldura = controlRef.current;\n\n if (!moldura || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n // Desenhar todas e medir na mesma passada, antes da pintura, para o campo nao piscar ao redimensionar.\n const observador = new ResizeObserver(() => {\n flushSync(() => setResumir(false));\n const selecao = selecaoRef.current;\n flushSync(() => setResumir(Boolean(selecao && selecao.scrollWidth > selecao.clientWidth)));\n });\n\n observador.observe(moldura);\n\n return () => observador.disconnect();\n }, [chaveDasEscolhas, multiple]);\n\n function encerrarFiltro() {\n setFiltering(false);\n listing.filter('');\n }\n\n function fechar() {\n setOpen(false);\n encerrarFiltro();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n listing.focusFirst();\n return;\n }\n\n if (event.key === 'Escape') {\n fechar();\n return;\n }\n\n if (event.key === 'Enter') {\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (open && alvo && !alvo.disabled) {\n event.preventDefault();\n listing.select(alvo);\n\n if (!multiple) {\n fechar();\n }\n }\n return;\n }\n\n const ultimo = escolhidos[escolhidos.length - 1];\n\n if (event.key === 'Backspace' && multiple && texto === '' && ultimo) {\n listing.select(ultimo);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => {\n const resumoId = id + '-selection';\n const campo = (\n <input\n {...props}\n ref={mergedRef}\n className={[multiple ? styles.search : styles.input, !multiple && styles[size], !multiple && error && styles.error, className]\n .filter(Boolean)\n .join(' ')}\n id={id}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-describedby={[describedBy, multiple && escolhidos.length > 0 && resumoId].filter(Boolean).join(' ') || undefined}\n aria-invalid={invalid || undefined}\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-controls={open ? baseId + '-options' : undefined}\n aria-activedescendant={open && activeIndex >= 0 ? optionId(baseId, activeIndex) : undefined}\n aria-required={required || undefined}\n disabled={disabled}\n placeholder={placeholder}\n value={texto}\n // Sair do campo desfaz a busca: o texto volta a dizer o que esta escolhido.\n onBlur={(event: FocusEvent<HTMLInputElement>) => {\n fechar();\n onBlur?.(event);\n }}\n onChange={(event) => {\n setFiltering(true);\n setOpen(true);\n listing.filter(event.target.value);\n }}\n onClick={(event: MouseEvent<HTMLInputElement>) => {\n setOpen(true);\n onClick?.(event);\n }}\n onKeyDown={handleKeyDown}\n />\n );\n\n return (\n <>\n {(escolhidos.length > 0 ? escolhidos : [undefined]).map((item) => (\n <FormValue\n disabled={disabled}\n key={item?.value ?? ''}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={item?.value ?? ''}\n />\n ))}\n {multiple ? (\n <div\n className={[styles.control, styles[size], error && styles.error].filter(Boolean).join(' ')}\n // O clique na moldura, fora do campo, leva o foco a ele em vez de tira-lo.\n onMouseDown={(event) => {\n if (event.target !== inputRef.current) {\n event.preventDefault();\n inputRef.current?.focus();\n }\n }}\n ref={controlRef}\n >\n {chosen && (\n <>\n <span aria-hidden=\"true\" className={styles.selection} ref={selecaoRef}>\n {(resumir ? [chosen] : escolhidos).map((item) => (\n <Badge key={item.value}>{item.label}</Badge>\n ))}\n {resumir && escolhidos.length > 1 && (\n <span className={styles.rest}>+{escolhidos.length - 1}</span>\n )}\n </span>\n <span className={styles.summary} id={resumoId}>\n {escolhidos.length === 1 ? '1 selecionado' : `${escolhidos.length} selecionados`}:{' '}\n {escolhidos.map((item) => item.label).join(', ')}\n </span>\n </>\n )}\n {campo}\n </div>\n ) : (\n campo\n )}\n {open &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n // O clique no painel, fora de uma opcao, nao tira o foco do campo nem fecha a lista.\n onMouseDown={(event) => event.preventDefault()}\n style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n empty={<p className={styles.empty}>{emptyMessage}</p>}\n holdsFocus={false}\n label={label ?? placeholder ?? 'Opções'}\n listing={listing}\n loading={loading}\n onSelect={multiple ? undefined : fechar}\n />\n </div>,\n document.body,\n )}\n </>\n );\n }}\n </Field>\n );\n}\n"],"names":["comoItens","valor","value","relatarEscolha","props","escolhidos","_a","item","primeiro","_b","ComboBox","allProps","ariaDescribedBy","className","defaultValue","name","disabled","emptyMessage","error","hint","providedId","label","loading","onBlur","onClick","onKeyDown","onSearch","onValueChange","options","placeholder","ref","required","selectionMode","size","multiple","inputRef","useRef","controlRef","panelRef","baseId","useId","open","setOpen","useState","filtering","setFiltering","resetRef","useFormReset","listing","fechar","mergedRef","useMergedRefs","useListing","chosen","texto","ancoraRef","activeIndex","option","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","resumir","setResumir","selecaoRef","chaveDasEscolhas","moldura","observador","flushSync","selecao","encerrarFiltro","handleKeyDown","event","alvo","ultimo","jsx","Field","id","describedBy","invalid","resumoId","campo","styles","optionId","jsxs","Fragment","FormValue","Badge","createPortal","ListingOptions"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComboBox.js","sources":["../../../../src/components/forms/ComboBox/ComboBox.tsx"],"sourcesContent":["import {\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions, optionId } from '../../data-display/List/ListingOptions';\nimport { useListing, type ListingItem } from '../../data-display/List/useListing';\nimport { Badge } from '../../data-display/Badge';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './ComboBox.module.css';\n\nexport type ComboBoxSize = 'sm' | 'md';\n\nexport interface ComboBoxOption {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma ao do sistema. */\ninterface ComboBoxBaseProps\n extends Omit<ComponentPropsWithRef<'input'>, 'defaultValue' | 'name' | 'onChange' | 'size' | 'type' | 'value'> {\n emptyMessage?: string;\n error?: string;\n hint?: string;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n loading?: boolean;\n onSearch?: (term: string) => void;\n options: readonly ComboBoxOption[];\n size?: ComboBoxSize;\n}\n\nexport interface ComboBoxSingleProps extends ComboBoxBaseProps {\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n selectionMode?: 'single';\n value?: string;\n}\n\nexport interface ComboBoxMultipleProps extends ComboBoxBaseProps {\n defaultValue?: readonly string[];\n onValueChange?: (values: readonly string[]) => void;\n selectionMode: 'multiple';\n value?: readonly string[];\n}\n\nexport type ComboBoxProps = ComboBoxSingleProps | ComboBoxMultipleProps;\n\nfunction comoItens(valor: string | readonly string[] | undefined): ListingItem[] | undefined {\n if (valor === undefined) {\n return undefined;\n }\n\n return (typeof valor === 'string' ? [valor] : valor).map((value) => ({ value, label: '' }));\n}\n\nfunction relatarEscolha(props: ComboBoxProps, escolhidos: readonly ListingItem[]) {\n if (props.selectionMode === 'multiple') {\n props.onValueChange?.(escolhidos.map((item) => item.value));\n return;\n }\n\n const [primeiro] = escolhidos;\n\n if (primeiro) {\n props.onValueChange?.(primeiro.value);\n }\n}\n\nexport function ComboBox(allProps: ComboBoxProps) {\n const {\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n emptyMessage = 'Nenhum resultado',\n error,\n hint,\n id: providedId,\n label,\n loading = false,\n onBlur,\n onClick,\n onKeyDown,\n onSearch,\n // Fora do resto, que vai ao campo: quem o chama e `relatarEscolha`, que conhece o modo.\n onValueChange,\n options,\n placeholder,\n ref,\n required = false,\n selectionMode = 'single',\n size = 'md',\n value,\n ...props\n } = allProps;\n const multiple = selectionMode === 'multiple';\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const baseId = `combobox-${useId()}`;\n const [open, setOpen] = useState(false);\n const [filtering, setFiltering] = useState(false);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n listing.reset();\n fechar();\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n\n // O valor e a chave, e nao a opcao: com opcoes que chegam depois, filtrar por elas perdia a escolha.\n const listing = useListing({\n items: options,\n selectionMode,\n defaultValue: comoItens(defaultValue),\n value: comoItens(value),\n onSearch,\n onSelectionChange: (escolhidos) => relatarEscolha(allProps, escolhidos),\n });\n\n const escolhidos = listing.selected;\n const [chosen] = escolhidos;\n // Na escolha multipla o campo so guarda a busca: quem mostra o que esta escolhido sao as etiquetas.\n const texto = multiple || filtering ? listing.term : chosen?.label ?? '';\n const ancoraRef = multiple ? controlRef : inputRef;\n const activeIndex = listing.visible.findIndex((option) => option.value === listing.focusedKey);\n\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: ancoraRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n const [largura, setLargura] = useState<number>();\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(ancoraRef.current?.offsetWidth);\n }, [ancoraRef, open]);\n\n // Sem medida, como no servidor, o campo resume as escolhas; medido, mostra todas as etiquetas enquanto couberem.\n const [resumir, setResumir] = useState(true);\n const selecaoRef = useRef<HTMLSpanElement>(null);\n const chaveDasEscolhas = escolhidos.map((item) => item.value).join('\\n');\n\n useLayoutEffect(() => {\n const moldura = controlRef.current;\n\n if (!moldura || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n // Desenhar todas e medir na mesma passada, antes da pintura, para o campo nao piscar ao redimensionar.\n const observador = new ResizeObserver(() => {\n flushSync(() => setResumir(false));\n const selecao = selecaoRef.current;\n flushSync(() => setResumir(Boolean(selecao && selecao.scrollWidth > selecao.clientWidth)));\n });\n\n observador.observe(moldura);\n\n return () => observador.disconnect();\n }, [chaveDasEscolhas, multiple]);\n\n function encerrarFiltro() {\n setFiltering(false);\n listing.filter('');\n }\n\n function fechar() {\n setOpen(false);\n encerrarFiltro();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n listing.focusFirst();\n return;\n }\n\n if (event.key === 'Escape') {\n fechar();\n return;\n }\n\n if (event.key === 'Enter') {\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (open && alvo && !alvo.disabled) {\n event.preventDefault();\n listing.select(alvo);\n\n if (!multiple) {\n fechar();\n }\n }\n return;\n }\n\n const ultimo = escolhidos[escolhidos.length - 1];\n\n if (event.key === 'Backspace' && multiple && texto === '' && ultimo) {\n listing.select(ultimo);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => {\n const resumoId = id + '-selection';\n const campo = (\n <input\n {...props}\n ref={mergedRef}\n className={[multiple ? styles.search : styles.input, !multiple && styles[size], !multiple && error && styles.error, className]\n .filter(Boolean)\n .join(' ')}\n id={id}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-describedby={[describedBy, multiple && escolhidos.length > 0 && resumoId].filter(Boolean).join(' ') || undefined}\n aria-invalid={invalid || undefined}\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-controls={open ? baseId + '-options' : undefined}\n aria-activedescendant={open && activeIndex >= 0 ? optionId(baseId, activeIndex) : undefined}\n aria-required={required || undefined}\n disabled={disabled}\n placeholder={placeholder}\n value={texto}\n // Sair do campo desfaz a busca: o texto volta a dizer o que esta escolhido.\n onBlur={(event: FocusEvent<HTMLInputElement>) => {\n fechar();\n onBlur?.(event);\n }}\n onChange={(event) => {\n setFiltering(true);\n setOpen(true);\n listing.filter(event.target.value);\n }}\n onClick={(event: MouseEvent<HTMLInputElement>) => {\n setOpen(true);\n onClick?.(event);\n }}\n onKeyDown={handleKeyDown}\n />\n );\n\n return (\n <>\n {(escolhidos.length > 0 ? escolhidos : [undefined]).map((item) => (\n <FormValue\n disabled={disabled}\n key={item?.value ?? ''}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={item?.value ?? ''}\n />\n ))}\n {multiple ? (\n <div\n className={[styles.control, styles[size], error && styles.error].filter(Boolean).join(' ')}\n // O clique na moldura, fora do campo, leva o foco a ele em vez de tira-lo.\n onMouseDown={(event) => {\n if (event.target !== inputRef.current) {\n event.preventDefault();\n inputRef.current?.focus();\n }\n }}\n ref={controlRef}\n >\n {chosen && (\n <>\n <span aria-hidden=\"true\" className={styles.selection} ref={selecaoRef}>\n {(resumir ? [chosen] : escolhidos).map((item) => (\n <Badge key={item.value}>{item.label}</Badge>\n ))}\n {resumir && escolhidos.length > 1 && (\n <span className={styles.rest}>+{escolhidos.length - 1}</span>\n )}\n </span>\n <span className={styles.summary} id={resumoId}>\n {escolhidos.length === 1 ? '1 selecionado' : `${escolhidos.length} selecionados`}:{' '}\n {escolhidos.map((item) => item.label).join(', ')}\n </span>\n </>\n )}\n {campo}\n </div>\n ) : (\n campo\n )}\n {open &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n // O clique no painel, fora de uma opcao, nao tira o foco do campo nem fecha a lista.\n onMouseDown={(event) => event.preventDefault()}\n style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n empty={<p className={styles.empty}>{emptyMessage}</p>}\n holdsFocus={false}\n label={label ?? placeholder ?? 'Opções'}\n listing={listing}\n loading={loading}\n onSelect={multiple ? undefined : fechar}\n />\n </div>,\n document.body,\n )}\n </>\n );\n }}\n </Field>\n );\n}\n"],"names":["comoItens","valor","value","relatarEscolha","props","escolhidos","_a","item","primeiro","_b","ComboBox","allProps","ariaDescribedBy","className","defaultValue","name","disabled","emptyMessage","error","hint","providedId","label","loading","onBlur","onClick","onKeyDown","onSearch","onValueChange","options","placeholder","ref","required","selectionMode","size","multiple","inputRef","useRef","controlRef","panelRef","baseId","useId","open","setOpen","useState","filtering","setFiltering","resetRef","useFormReset","listing","fechar","mergedRef","useMergedRefs","useListing","chosen","texto","ancoraRef","activeIndex","option","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","resumir","setResumir","selecaoRef","chaveDasEscolhas","moldura","observador","flushSync","selecao","encerrarFiltro","handleKeyDown","event","alvo","ultimo","jsx","Field","id","describedBy","invalid","resumoId","campo","styles","optionId","jsxs","Fragment","FormValue","Badge","createPortal","ListingOptions"],"mappings":"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"}
1
+ {"version":3,"file":"ComboBox.js","sources":["../../../../src/components/forms/ComboBox/ComboBox.tsx"],"sourcesContent":["import {\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions, optionId } from '../../data-display/List/ListingOptions';\nimport { useListing, type ListingItem } from '../../data-display/List/useListing';\nimport { Badge } from '../../data-display/Badge';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './ComboBox.module.css';\n\nexport type ComboBoxSize = 'sm' | 'md';\n\nexport interface ComboBoxOption {\n /** Segunda linha da opção, como a coleção de um documento. A busca local procura só no rótulo. */\n description?: string;\n disabled?: boolean;\n /** Título do grupo. As opções seguidas de um mesmo grupo aparecem juntas, sob ele. */\n group?: string;\n /** Decorativo, à frente do rótulo. */\n icon?: ReactNode;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma ao do sistema. */\ninterface ComboBoxBaseProps\n extends Omit<ComponentPropsWithRef<'input'>, 'defaultValue' | 'name' | 'onChange' | 'size' | 'type' | 'value'> {\n emptyMessage?: string;\n error?: string;\n hint?: string;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n loading?: boolean;\n onSearch?: (term: string) => void;\n options: readonly ComboBoxOption[];\n size?: ComboBoxSize;\n}\n\nexport interface ComboBoxSingleProps extends ComboBoxBaseProps {\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n selectionMode?: 'single';\n value?: string;\n}\n\nexport interface ComboBoxMultipleProps extends ComboBoxBaseProps {\n defaultValue?: readonly string[];\n onValueChange?: (values: readonly string[]) => void;\n selectionMode: 'multiple';\n value?: readonly string[];\n}\n\nexport type ComboBoxProps = ComboBoxSingleProps | ComboBoxMultipleProps;\n\nfunction comoItens(valor: string | readonly string[] | undefined): ListingItem[] | undefined {\n if (valor === undefined) {\n return undefined;\n }\n\n return (typeof valor === 'string' ? [valor] : valor).map((value) => ({ value, label: '' }));\n}\n\nfunction relatarEscolha(props: ComboBoxProps, escolhidos: readonly ListingItem[]) {\n if (props.selectionMode === 'multiple') {\n props.onValueChange?.(escolhidos.map((item) => item.value));\n return;\n }\n\n const [primeiro] = escolhidos;\n\n if (primeiro) {\n props.onValueChange?.(primeiro.value);\n }\n}\n\nexport function ComboBox(allProps: ComboBoxProps) {\n const {\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n emptyMessage = 'Nenhum resultado',\n error,\n hint,\n id: providedId,\n label,\n loading = false,\n onBlur,\n onClick,\n onKeyDown,\n onSearch,\n // Fora do resto, que vai ao campo: quem o chama e `relatarEscolha`, que conhece o modo.\n onValueChange,\n options,\n placeholder,\n ref,\n required = false,\n selectionMode = 'single',\n size = 'md',\n value,\n ...props\n } = allProps;\n const multiple = selectionMode === 'multiple';\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const baseId = `combobox-${useId()}`;\n const [open, setOpen] = useState(false);\n const [filtering, setFiltering] = useState(false);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n listing.reset();\n fechar();\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n\n // O valor e a chave, e nao a opcao: com opcoes que chegam depois, filtrar por elas perdia a escolha.\n const listing = useListing({\n items: options,\n selectionMode,\n defaultValue: comoItens(defaultValue),\n value: comoItens(value),\n onSearch,\n onSelectionChange: (escolhidos) => relatarEscolha(allProps, escolhidos),\n });\n\n const escolhidos = listing.selected;\n const [chosen] = escolhidos;\n // Na escolha multipla o campo so guarda a busca: quem mostra o que esta escolhido sao as etiquetas.\n const texto = multiple || filtering ? listing.term : chosen?.label ?? '';\n const ancoraRef = multiple ? controlRef : inputRef;\n const activeIndex = listing.visible.findIndex((option) => option.value === listing.focusedKey);\n\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: ancoraRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n const [largura, setLargura] = useState<number>();\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(ancoraRef.current?.offsetWidth);\n }, [ancoraRef, open]);\n\n // Sem medida, como no servidor, o campo resume as escolhas; medido, mostra todas as etiquetas enquanto couberem.\n const [resumir, setResumir] = useState(true);\n const selecaoRef = useRef<HTMLSpanElement>(null);\n const chaveDasEscolhas = escolhidos.map((item) => item.value).join('\\n');\n\n useLayoutEffect(() => {\n const moldura = controlRef.current;\n\n if (!moldura || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n // Desenhar todas e medir na mesma passada, antes da pintura, para o campo nao piscar ao redimensionar.\n const observador = new ResizeObserver(() => {\n flushSync(() => setResumir(false));\n const selecao = selecaoRef.current;\n flushSync(() => setResumir(Boolean(selecao && selecao.scrollWidth > selecao.clientWidth)));\n });\n\n observador.observe(moldura);\n\n return () => observador.disconnect();\n }, [chaveDasEscolhas, multiple]);\n\n function encerrarFiltro() {\n setFiltering(false);\n listing.filter('');\n }\n\n function fechar() {\n setOpen(false);\n encerrarFiltro();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n listing.focusFirst();\n return;\n }\n\n if (event.key === 'Escape') {\n fechar();\n return;\n }\n\n if (event.key === 'Enter') {\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (open && alvo && !alvo.disabled) {\n event.preventDefault();\n listing.select(alvo);\n\n if (!multiple) {\n fechar();\n }\n }\n return;\n }\n\n const ultimo = escolhidos[escolhidos.length - 1];\n\n if (event.key === 'Backspace' && multiple && texto === '' && ultimo) {\n listing.select(ultimo);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => {\n const resumoId = id + '-selection';\n const campo = (\n <input\n {...props}\n ref={mergedRef}\n className={[multiple ? styles.search : styles.input, !multiple && styles[size], !multiple && error && styles.error, className]\n .filter(Boolean)\n .join(' ')}\n id={id}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-describedby={[describedBy, multiple && escolhidos.length > 0 && resumoId].filter(Boolean).join(' ') || undefined}\n aria-invalid={invalid || undefined}\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-controls={open ? baseId + '-options' : undefined}\n aria-activedescendant={open && activeIndex >= 0 ? optionId(baseId, activeIndex) : undefined}\n aria-required={required || undefined}\n disabled={disabled}\n placeholder={placeholder}\n value={texto}\n // Sair do campo desfaz a busca: o texto volta a dizer o que esta escolhido.\n onBlur={(event: FocusEvent<HTMLInputElement>) => {\n fechar();\n onBlur?.(event);\n }}\n onChange={(event) => {\n setFiltering(true);\n setOpen(true);\n listing.filter(event.target.value);\n }}\n onClick={(event: MouseEvent<HTMLInputElement>) => {\n setOpen(true);\n onClick?.(event);\n }}\n onKeyDown={handleKeyDown}\n />\n );\n\n return (\n <>\n {(escolhidos.length > 0 ? escolhidos : [undefined]).map((item) => (\n <FormValue\n disabled={disabled}\n key={item?.value ?? ''}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={item?.value ?? ''}\n />\n ))}\n {multiple ? (\n <div\n className={[styles.control, styles[size], error && styles.error].filter(Boolean).join(' ')}\n // O clique na moldura, fora do campo, leva o foco a ele em vez de tira-lo.\n onMouseDown={(event) => {\n if (event.target !== inputRef.current) {\n event.preventDefault();\n inputRef.current?.focus();\n }\n }}\n ref={controlRef}\n >\n {chosen && (\n <>\n <span aria-hidden=\"true\" className={styles.selection} ref={selecaoRef}>\n {(resumir ? [chosen] : escolhidos).map((item) => (\n <Badge key={item.value}>{item.label}</Badge>\n ))}\n {resumir && escolhidos.length > 1 && (\n <span className={styles.rest}>+{escolhidos.length - 1}</span>\n )}\n </span>\n <span className={styles.summary} id={resumoId}>\n {escolhidos.length === 1 ? '1 selecionado' : `${escolhidos.length} selecionados`}:{' '}\n {escolhidos.map((item) => item.label).join(', ')}\n </span>\n </>\n )}\n {campo}\n </div>\n ) : (\n campo\n )}\n {open &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n // O clique no painel, fora de uma opcao, nao tira o foco do campo nem fecha a lista.\n onMouseDown={(event) => event.preventDefault()}\n style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n empty={<p className={styles.empty}>{emptyMessage}</p>}\n holdsFocus={false}\n label={label ?? placeholder ?? 'Opções'}\n listing={listing}\n loading={loading}\n onSelect={multiple ? undefined : fechar}\n />\n </div>,\n document.body,\n )}\n </>\n );\n }}\n </Field>\n );\n}\n"],"names":["comoItens","valor","value","relatarEscolha","props","escolhidos","_a","item","primeiro","_b","ComboBox","allProps","ariaDescribedBy","className","defaultValue","name","disabled","emptyMessage","error","hint","providedId","label","loading","onBlur","onClick","onKeyDown","onSearch","onValueChange","options","placeholder","ref","required","selectionMode","size","multiple","inputRef","useRef","controlRef","panelRef","baseId","useId","open","setOpen","useState","filtering","setFiltering","resetRef","useFormReset","listing","fechar","mergedRef","useMergedRefs","useListing","chosen","texto","ancoraRef","activeIndex","option","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","resumir","setResumir","selecaoRef","chaveDasEscolhas","moldura","observador","flushSync","selecao","encerrarFiltro","handleKeyDown","event","alvo","ultimo","jsx","Field","id","describedBy","invalid","resumoId","campo","styles","optionId","jsxs","Fragment","FormValue","Badge","createPortal","ListingOptions"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react/jsx-runtime"),q=require("react"),s=require("./Field.module.css.cjs"),x=require("../Label/Label.cjs");function y({"aria-describedby":r,className:f,characterCount:i=0,children:m,error:e,hint:a,id:j,label:t,maxLength:n,required:v=!1,showCharacterCount:o=!1,size:b="md",...g}){const B=q.useId(),l=j??`field-${B}`,c=`${l}-message`,u=`${l}-character-count`,N=[r,e||a?c:void 0,o?u:void 0].filter(Boolean).join(" ")||void 0,$=[s.default.control,b==="sm"&&s.default.sm,e&&s.default.invalid].filter(Boolean).join(" ");return d.jsxs("div",{...g,className:[s.default.field,f].filter(Boolean).join(" "),children:[t&&d.jsx(x.Label,{htmlFor:l,required:v,children:t}),m({className:$,describedBy:N,id:l,invalid:!!e}),(e||a)&&d.jsx("span",{className:e?s.default.errorMessage:s.default.hint,id:c,role:e?"alert":void 0,children:e||a}),o&&d.jsx("span",{className:s.default.characterCount,id:u,children:n?`${i}/${n}`:i})]})}exports.Field=y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),q=require("react"),e=require("./Field.module.css.cjs"),x=require("../Label/Label.cjs");function y({"aria-describedby":f,className:m,characterCount:i=0,children:j,error:l,hint:a,id:v,label:t,maxLength:n,required:g=!1,showCharacterCount:o=!1,size:c="md",...b}){const B=q.useId(),d=v??`field-${B}`,u=`${d}-message`,r=`${d}-character-count`,N=[f,l||a?u:void 0,o?r:void 0].filter(Boolean).join(" ")||void 0,$=[e.default.control,c==="sm"&&e.default.sm,c==="lg"&&e.default.lg,l&&e.default.invalid].filter(Boolean).join(" ");return s.jsxs("div",{...b,className:[e.default.field,m].filter(Boolean).join(" "),children:[t&&s.jsx(x.Label,{htmlFor:d,required:g,children:t}),j({className:$,describedBy:N,id:d,invalid:!!l}),(l||a)&&s.jsx("span",{className:l?e.default.errorMessage:e.default.hint,id:u,role:l?"alert":void 0,children:l||a}),o&&s.jsx("span",{className:e.default.characterCount,id:r,children:n?`${i}/${n}`:i})]})}exports.Field=y;
2
2
  //# sourceMappingURL=Field.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.cjs","sources":["../../../../src/components/forms/Field/Field.tsx"],"sourcesContent":["import { useId, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { Label } from '../Label';\nimport styles from './Field.module.css';\n\nexport type FieldSize = 'sm' | 'md';\n\nexport interface FieldWiring {\n /** O visual dos campos do sistema para o controle — borda, foco, erro e tamanho. A classe do controle vence a dele. */\n className: string;\n describedBy: string | undefined;\n id: string;\n invalid: boolean;\n}\n\nexport interface FieldProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n 'aria-describedby'?: string;\n characterCount?: number;\n children: (wiring: FieldWiring) => ReactNode;\n error?: string;\n hint?: string;\n id?: string;\n label?: string;\n maxLength?: number;\n required?: boolean;\n showCharacterCount?: boolean;\n size?: FieldSize;\n}\n\nexport function Field({\n 'aria-describedby': ariaDescribedBy,\n className,\n characterCount = 0,\n children,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n required = false,\n showCharacterCount = false,\n size = 'md',\n ...props\n}: FieldProps) {\n const generatedId = useId();\n const id = providedId ?? `field-${generatedId}`;\n const messageId = `${id}-message`;\n const characterCountId = `${id}-character-count`;\n const describedBy = [\n ariaDescribedBy,\n error || hint ? messageId : undefined,\n showCharacterCount ? characterCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n const controlClassName = [styles.control, size === 'sm' && styles.sm, error && styles.invalid].filter(Boolean).join(' ');\n\n return (\n <div {...props} className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <Label htmlFor={id} required={required}>{label}</Label>}\n {children({ className: controlClassName, describedBy, id, invalid: Boolean(error) })}\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n {showCharacterCount && (\n <span className={styles.characterCount} id={characterCountId}>\n {maxLength ? `${characterCount}/${maxLength}` : characterCount}\n </span>\n )}\n </div>\n );\n}\n"],"names":["Field","ariaDescribedBy","className","characterCount","children","error","hint","providedId","label","maxLength","required","showCharacterCount","size","props","generatedId","useId","id","messageId","characterCountId","describedBy","controlClassName","styles","jsxs","jsx","Label"],"mappings":"4MA4BO,SAASA,EAAM,CACpB,mBAAoBC,EACpB,UAAAC,EACA,eAAAC,EAAiB,EACjB,SAAAC,EACA,MAAAC,EACA,KAAAC,EACA,GAAIC,EACJ,MAAAC,EACA,UAAAC,EACA,SAAAC,EAAW,GACX,mBAAAC,EAAqB,GACrB,KAAAC,EAAO,KACP,GAAGC,CACL,EAAe,CACb,MAAMC,EAAcC,EAAAA,MAAA,EACdC,EAAKT,GAAc,SAASO,CAAW,GACvCG,EAAY,GAAGD,CAAE,WACjBE,EAAmB,GAAGF,CAAE,mBACxBG,EAAc,CAClBlB,EACAI,GAASC,EAAOW,EAAY,OAC5BN,EAAqBO,EAAmB,MAAA,EAEvC,OAAO,OAAO,EACd,KAAK,GAAG,GAAK,OACVE,EAAmB,CAACC,EAAAA,QAAO,QAAST,IAAS,MAAQS,UAAO,GAAIhB,GAASgB,EAAAA,QAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAEvH,OACEC,EAAAA,KAAC,MAAA,CAAK,GAAGT,EAAO,UAAW,CAACQ,UAAO,MAAOnB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC1E,SAAA,CAAAM,GAASe,EAAAA,IAACC,EAAAA,MAAA,CAAM,QAASR,EAAI,SAAAN,EAAqB,SAAAF,EAAM,EACxDJ,EAAS,CAAE,UAAWgB,EAAkB,YAAAD,EAAa,GAAAH,EAAI,QAAS,EAAQX,EAAQ,GACjFA,GAASC,IACTiB,EAAAA,IAAC,OAAA,CAAK,UAAWlB,EAAQgB,UAAO,aAAeA,EAAAA,QAAO,KAAM,GAAIJ,EAAW,KAAMZ,EAAQ,QAAU,OAChG,YAASC,EACZ,EAEDK,GACCY,EAAAA,IAAC,OAAA,CAAK,UAAWF,EAAAA,QAAO,eAAgB,GAAIH,EACzC,SAAAT,EAAY,GAAGN,CAAc,IAAIM,CAAS,GAAKN,CAAA,CAClD,CAAA,EAEJ,CAEJ"}
1
+ {"version":3,"file":"Field.cjs","sources":["../../../../src/components/forms/Field/Field.tsx"],"sourcesContent":["import { useId, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { Label } from '../Label';\nimport styles from './Field.module.css';\n\nexport type FieldSize = 'sm' | 'md' | 'lg';\n\nexport interface FieldWiring {\n /** O visual dos campos do sistema para o controle — borda, foco, erro e tamanho. A classe do controle vence a dele. */\n className: string;\n describedBy: string | undefined;\n id: string;\n invalid: boolean;\n}\n\nexport interface FieldProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n 'aria-describedby'?: string;\n characterCount?: number;\n children: (wiring: FieldWiring) => ReactNode;\n error?: string;\n hint?: string;\n id?: string;\n label?: string;\n maxLength?: number;\n required?: boolean;\n showCharacterCount?: boolean;\n size?: FieldSize;\n}\n\nexport function Field({\n 'aria-describedby': ariaDescribedBy,\n className,\n characterCount = 0,\n children,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n required = false,\n showCharacterCount = false,\n size = 'md',\n ...props\n}: FieldProps) {\n const generatedId = useId();\n const id = providedId ?? `field-${generatedId}`;\n const messageId = `${id}-message`;\n const characterCountId = `${id}-character-count`;\n const describedBy = [\n ariaDescribedBy,\n error || hint ? messageId : undefined,\n showCharacterCount ? characterCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n const controlClassName = [styles.control, size === 'sm' && styles.sm, size === 'lg' && styles.lg, error && styles.invalid].filter(Boolean).join(' ');\n\n return (\n <div {...props} className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <Label htmlFor={id} required={required}>{label}</Label>}\n {children({ className: controlClassName, describedBy, id, invalid: Boolean(error) })}\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n {showCharacterCount && (\n <span className={styles.characterCount} id={characterCountId}>\n {maxLength ? `${characterCount}/${maxLength}` : characterCount}\n </span>\n )}\n </div>\n );\n}\n"],"names":["Field","ariaDescribedBy","className","characterCount","children","error","hint","providedId","label","maxLength","required","showCharacterCount","size","props","generatedId","useId","id","messageId","characterCountId","describedBy","controlClassName","styles","jsxs","jsx","Label"],"mappings":"4MA4BO,SAASA,EAAM,CACpB,mBAAoBC,EACpB,UAAAC,EACA,eAAAC,EAAiB,EACjB,SAAAC,EACA,MAAAC,EACA,KAAAC,EACA,GAAIC,EACJ,MAAAC,EACA,UAAAC,EACA,SAAAC,EAAW,GACX,mBAAAC,EAAqB,GACrB,KAAAC,EAAO,KACP,GAAGC,CACL,EAAe,CACb,MAAMC,EAAcC,EAAAA,MAAA,EACdC,EAAKT,GAAc,SAASO,CAAW,GACvCG,EAAY,GAAGD,CAAE,WACjBE,EAAmB,GAAGF,CAAE,mBACxBG,EAAc,CAClBlB,EACAI,GAASC,EAAOW,EAAY,OAC5BN,EAAqBO,EAAmB,MAAA,EAEvC,OAAO,OAAO,EACd,KAAK,GAAG,GAAK,OACVE,EAAmB,CAACC,EAAAA,QAAO,QAAST,IAAS,MAAQS,EAAAA,QAAO,GAAIT,IAAS,MAAQS,EAAAA,QAAO,GAAIhB,GAASgB,EAAAA,QAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAEnJ,OACEC,EAAAA,KAAC,MAAA,CAAK,GAAGT,EAAO,UAAW,CAACQ,UAAO,MAAOnB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC1E,SAAA,CAAAM,GAASe,EAAAA,IAACC,EAAAA,MAAA,CAAM,QAASR,EAAI,SAAAN,EAAqB,SAAAF,EAAM,EACxDJ,EAAS,CAAE,UAAWgB,EAAkB,YAAAD,EAAa,GAAAH,EAAI,QAAS,EAAQX,EAAQ,GACjFA,GAASC,IACTiB,EAAAA,IAAC,OAAA,CAAK,UAAWlB,EAAQgB,UAAO,aAAeA,EAAAA,QAAO,KAAM,GAAIJ,EAAW,KAAMZ,EAAQ,QAAU,OAChG,YAASC,EACZ,EAEDK,GACCY,EAAAA,IAAC,OAAA,CAAK,UAAWF,EAAAA,QAAO,eAAgB,GAAIH,EACzC,SAAAT,EAAY,GAAGN,CAAc,IAAIM,CAAS,GAAKN,CAAA,CAClD,CAAA,EAEJ,CAEJ"}
@@ -1,32 +1,32 @@
1
- import { jsxs as b, jsx as a } from "react/jsx-runtime";
2
- import { useId as g } from "react";
3
- import s from "./Field.module.css.js";
1
+ import { jsxs as I, jsx as l } from "react/jsx-runtime";
2
+ import { useId as b } from "react";
3
+ import e from "./Field.module.css.js";
4
4
  import { Label as h } from "../Label/Label.js";
5
5
  function k({
6
- "aria-describedby": r,
7
- className: f,
8
- characterCount: d = 0,
9
- children: p,
10
- error: e,
6
+ "aria-describedby": f,
7
+ className: p,
8
+ characterCount: a = 0,
9
+ children: v,
10
+ error: s,
11
11
  hint: o,
12
- id: v,
13
- label: l,
12
+ id: g,
13
+ label: d,
14
14
  maxLength: n,
15
15
  required: j = !1,
16
16
  showCharacterCount: c = !1,
17
- size: B = "md",
18
- ...N
17
+ size: t = "md",
18
+ ...B
19
19
  }) {
20
- const $ = g(), i = v ?? `field-${$}`, t = `${i}-message`, m = `${i}-character-count`, u = [
21
- r,
22
- e || o ? t : void 0,
23
- c ? m : void 0
24
- ].filter(Boolean).join(" ") || void 0, I = [s.control, B === "sm" && s.sm, e && s.invalid].filter(Boolean).join(" ");
25
- return /* @__PURE__ */ b("div", { ...N, className: [s.field, f].filter(Boolean).join(" "), children: [
26
- l && /* @__PURE__ */ a(h, { htmlFor: i, required: j, children: l }),
27
- p({ className: I, describedBy: u, id: i, invalid: !!e }),
28
- (e || o) && /* @__PURE__ */ a("span", { className: e ? s.errorMessage : s.hint, id: t, role: e ? "alert" : void 0, children: e || o }),
29
- c && /* @__PURE__ */ a("span", { className: s.characterCount, id: m, children: n ? `${d}/${n}` : d })
20
+ const N = b(), i = g ?? `field-${N}`, m = `${i}-message`, r = `${i}-character-count`, $ = [
21
+ f,
22
+ s || o ? m : void 0,
23
+ c ? r : void 0
24
+ ].filter(Boolean).join(" ") || void 0, u = [e.control, t === "sm" && e.sm, t === "lg" && e.lg, s && e.invalid].filter(Boolean).join(" ");
25
+ return /* @__PURE__ */ I("div", { ...B, className: [e.field, p].filter(Boolean).join(" "), children: [
26
+ d && /* @__PURE__ */ l(h, { htmlFor: i, required: j, children: d }),
27
+ v({ className: u, describedBy: $, id: i, invalid: !!s }),
28
+ (s || o) && /* @__PURE__ */ l("span", { className: s ? e.errorMessage : e.hint, id: m, role: s ? "alert" : void 0, children: s || o }),
29
+ c && /* @__PURE__ */ l("span", { className: e.characterCount, id: r, children: n ? `${a}/${n}` : a })
30
30
  ] });
31
31
  }
32
32
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"Field.js","sources":["../../../../src/components/forms/Field/Field.tsx"],"sourcesContent":["import { useId, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { Label } from '../Label';\nimport styles from './Field.module.css';\n\nexport type FieldSize = 'sm' | 'md';\n\nexport interface FieldWiring {\n /** O visual dos campos do sistema para o controle — borda, foco, erro e tamanho. A classe do controle vence a dele. */\n className: string;\n describedBy: string | undefined;\n id: string;\n invalid: boolean;\n}\n\nexport interface FieldProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n 'aria-describedby'?: string;\n characterCount?: number;\n children: (wiring: FieldWiring) => ReactNode;\n error?: string;\n hint?: string;\n id?: string;\n label?: string;\n maxLength?: number;\n required?: boolean;\n showCharacterCount?: boolean;\n size?: FieldSize;\n}\n\nexport function Field({\n 'aria-describedby': ariaDescribedBy,\n className,\n characterCount = 0,\n children,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n required = false,\n showCharacterCount = false,\n size = 'md',\n ...props\n}: FieldProps) {\n const generatedId = useId();\n const id = providedId ?? `field-${generatedId}`;\n const messageId = `${id}-message`;\n const characterCountId = `${id}-character-count`;\n const describedBy = [\n ariaDescribedBy,\n error || hint ? messageId : undefined,\n showCharacterCount ? characterCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n const controlClassName = [styles.control, size === 'sm' && styles.sm, error && styles.invalid].filter(Boolean).join(' ');\n\n return (\n <div {...props} className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <Label htmlFor={id} required={required}>{label}</Label>}\n {children({ className: controlClassName, describedBy, id, invalid: Boolean(error) })}\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n {showCharacterCount && (\n <span className={styles.characterCount} id={characterCountId}>\n {maxLength ? `${characterCount}/${maxLength}` : characterCount}\n </span>\n )}\n </div>\n );\n}\n"],"names":["Field","ariaDescribedBy","className","characterCount","children","error","hint","providedId","label","maxLength","required","showCharacterCount","size","props","generatedId","useId","id","messageId","characterCountId","describedBy","controlClassName","styles","jsxs","jsx","Label"],"mappings":";;;;AA4BO,SAASA,EAAM;AAAA,EACpB,oBAAoBC;AAAA,EACpB,WAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,IAAIC;AAAA,EACJ,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,oBAAAC,IAAqB;AAAA,EACrB,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,GAAe;AACb,QAAMC,IAAcC,EAAA,GACdC,IAAKT,KAAc,SAASO,CAAW,IACvCG,IAAY,GAAGD,CAAE,YACjBE,IAAmB,GAAGF,CAAE,oBACxBG,IAAc;AAAA,IAClBlB;AAAA,IACAI,KAASC,IAAOW,IAAY;AAAA,IAC5BN,IAAqBO,IAAmB;AAAA,EAAA,EAEvC,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,QACVE,IAAmB,CAACC,EAAO,SAAST,MAAS,QAAQS,EAAO,IAAIhB,KAASgB,EAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEvH,SACE,gBAAAC,EAAC,OAAA,EAAK,GAAGT,GAAO,WAAW,CAACQ,EAAO,OAAOnB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC1E,UAAA;AAAA,IAAAM,KAAS,gBAAAe,EAACC,GAAA,EAAM,SAASR,GAAI,UAAAN,GAAqB,UAAAF,GAAM;AAAA,IACxDJ,EAAS,EAAE,WAAWgB,GAAkB,aAAAD,GAAa,IAAAH,GAAI,SAAS,EAAQX,GAAQ;AAAA,KACjFA,KAASC,MACT,gBAAAiB,EAAC,QAAA,EAAK,WAAWlB,IAAQgB,EAAO,eAAeA,EAAO,MAAM,IAAIJ,GAAW,MAAMZ,IAAQ,UAAU,QAChG,eAASC,GACZ;AAAA,IAEDK,KACC,gBAAAY,EAAC,QAAA,EAAK,WAAWF,EAAO,gBAAgB,IAAIH,GACzC,UAAAT,IAAY,GAAGN,CAAc,IAAIM,CAAS,KAAKN,EAAA,CAClD;AAAA,EAAA,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"Field.js","sources":["../../../../src/components/forms/Field/Field.tsx"],"sourcesContent":["import { useId, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { Label } from '../Label';\nimport styles from './Field.module.css';\n\nexport type FieldSize = 'sm' | 'md' | 'lg';\n\nexport interface FieldWiring {\n /** O visual dos campos do sistema para o controle — borda, foco, erro e tamanho. A classe do controle vence a dele. */\n className: string;\n describedBy: string | undefined;\n id: string;\n invalid: boolean;\n}\n\nexport interface FieldProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n 'aria-describedby'?: string;\n characterCount?: number;\n children: (wiring: FieldWiring) => ReactNode;\n error?: string;\n hint?: string;\n id?: string;\n label?: string;\n maxLength?: number;\n required?: boolean;\n showCharacterCount?: boolean;\n size?: FieldSize;\n}\n\nexport function Field({\n 'aria-describedby': ariaDescribedBy,\n className,\n characterCount = 0,\n children,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n required = false,\n showCharacterCount = false,\n size = 'md',\n ...props\n}: FieldProps) {\n const generatedId = useId();\n const id = providedId ?? `field-${generatedId}`;\n const messageId = `${id}-message`;\n const characterCountId = `${id}-character-count`;\n const describedBy = [\n ariaDescribedBy,\n error || hint ? messageId : undefined,\n showCharacterCount ? characterCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n const controlClassName = [styles.control, size === 'sm' && styles.sm, size === 'lg' && styles.lg, error && styles.invalid].filter(Boolean).join(' ');\n\n return (\n <div {...props} className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <Label htmlFor={id} required={required}>{label}</Label>}\n {children({ className: controlClassName, describedBy, id, invalid: Boolean(error) })}\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n {showCharacterCount && (\n <span className={styles.characterCount} id={characterCountId}>\n {maxLength ? `${characterCount}/${maxLength}` : characterCount}\n </span>\n )}\n </div>\n );\n}\n"],"names":["Field","ariaDescribedBy","className","characterCount","children","error","hint","providedId","label","maxLength","required","showCharacterCount","size","props","generatedId","useId","id","messageId","characterCountId","describedBy","controlClassName","styles","jsxs","jsx","Label"],"mappings":";;;;AA4BO,SAASA,EAAM;AAAA,EACpB,oBAAoBC;AAAA,EACpB,WAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,IAAIC;AAAA,EACJ,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,oBAAAC,IAAqB;AAAA,EACrB,MAAAC,IAAO;AAAA,EACP,GAAGC;AACL,GAAe;AACb,QAAMC,IAAcC,EAAA,GACdC,IAAKT,KAAc,SAASO,CAAW,IACvCG,IAAY,GAAGD,CAAE,YACjBE,IAAmB,GAAGF,CAAE,oBACxBG,IAAc;AAAA,IAClBlB;AAAA,IACAI,KAASC,IAAOW,IAAY;AAAA,IAC5BN,IAAqBO,IAAmB;AAAA,EAAA,EAEvC,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,QACVE,IAAmB,CAACC,EAAO,SAAST,MAAS,QAAQS,EAAO,IAAIT,MAAS,QAAQS,EAAO,IAAIhB,KAASgB,EAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEnJ,SACE,gBAAAC,EAAC,OAAA,EAAK,GAAGT,GAAO,WAAW,CAACQ,EAAO,OAAOnB,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC1E,UAAA;AAAA,IAAAM,KAAS,gBAAAe,EAACC,GAAA,EAAM,SAASR,GAAI,UAAAN,GAAqB,UAAAF,GAAM;AAAA,IACxDJ,EAAS,EAAE,WAAWgB,GAAkB,aAAAD,GAAa,IAAAH,GAAI,SAAS,EAAQX,GAAQ;AAAA,KACjFA,KAASC,MACT,gBAAAiB,EAAC,QAAA,EAAK,WAAWlB,IAAQgB,EAAO,eAAeA,EAAO,MAAM,IAAIJ,GAAW,MAAMZ,IAAQ,UAAU,QAChG,eAASC,GACZ;AAAA,IAEDK,KACC,gBAAAY,EAAC,QAAA,EAAK,WAAWF,EAAO,gBAAgB,IAAIH,GACzC,UAAAT,IAAY,GAAGN,CAAc,IAAIM,CAAS,KAAKN,EAAA,CAClD;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_field_1qg91_1",o="_hint_1qg91_8",t="_errorMessage_1qg91_9",r="_characterCount_1qg91_10",n="_formValue_1qg91_31",s="_control_1qg91_40",_="_invalid_1qg91_59",a="_sm_1qg91_77",c={field:e,hint:o,errorMessage:t,characterCount:r,formValue:n,control:s,invalid:_,sm:a};exports.characterCount=r;exports.control=s;exports.default=c;exports.errorMessage=t;exports.field=e;exports.formValue=n;exports.hint=o;exports.invalid=_;exports.sm=a;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_field_1ndjk_1",n="_hint_1ndjk_8",o="_errorMessage_1ndjk_9",t="_characterCount_1ndjk_10",r="_formValue_1ndjk_31",_="_control_1ndjk_40",s="_invalid_1ndjk_59",l="_sm_1ndjk_77",a="_lg_1ndjk_84",c={field:e,hint:n,errorMessage:o,characterCount:t,formValue:r,control:_,invalid:s,sm:l,lg:a};exports.characterCount=t;exports.control=_;exports.default=c;exports.errorMessage=o;exports.field=e;exports.formValue=r;exports.hint=n;exports.invalid=s;exports.lg=a;exports.sm=l;
2
2
  //# sourceMappingURL=Field.module.css.cjs.map
@@ -1,22 +1,24 @@
1
- const o = "_field_1qg91_1", t = "_hint_1qg91_8", _ = "_errorMessage_1qg91_9", r = "_characterCount_1qg91_10", e = "_formValue_1qg91_31", n = "_control_1qg91_40", s = "_invalid_1qg91_59", c = "_sm_1qg91_77", a = {
2
- field: o,
3
- hint: t,
4
- errorMessage: _,
5
- characterCount: r,
6
- formValue: e,
7
- control: n,
8
- invalid: s,
9
- sm: c
1
+ const n = "_field_1ndjk_1", _ = "_hint_1ndjk_8", o = "_errorMessage_1ndjk_9", t = "_characterCount_1ndjk_10", r = "_formValue_1ndjk_31", s = "_control_1ndjk_40", e = "_invalid_1ndjk_59", c = "_sm_1ndjk_77", a = "_lg_1ndjk_84", l = {
2
+ field: n,
3
+ hint: _,
4
+ errorMessage: o,
5
+ characterCount: t,
6
+ formValue: r,
7
+ control: s,
8
+ invalid: e,
9
+ sm: c,
10
+ lg: a
10
11
  };
11
12
  export {
12
- r as characterCount,
13
- n as control,
14
- a as default,
15
- _ as errorMessage,
16
- o as field,
17
- e as formValue,
18
- t as hint,
19
- s as invalid,
13
+ t as characterCount,
14
+ s as control,
15
+ l as default,
16
+ o as errorMessage,
17
+ n as field,
18
+ r as formValue,
19
+ _ as hint,
20
+ e as invalid,
21
+ a as lg,
20
22
  c as sm
21
23
  };
22
24
  //# sourceMappingURL=Field.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Field.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
1
+ {"version":3,"file":"Field.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),B=require("../../../hooks/useMergedRefs.cjs"),t=require("./InputText.module.css.cjs"),F=require("../../../hooks/useCharacterCount/useCharacterCount.cjs"),S=require("../Field/Field.cjs");function w({"aria-describedby":o,"aria-invalid":f,className:m,error:p,hint:b,icon:i,id:j,label:x,maxLength:s,required:n=!1,size:u="md",showCharacterCount:h=!1,defaultValue:d,onChange:a,value:c,ref:y,...R}){const{ref:q,count:C,updateCount:I}=F.useCharacterCount(c,d),N=B.useMergedRefs(q,y);function T(e){I(e.target.value),a==null||a(e)}return r.jsx(S.Field,{"aria-describedby":o,characterCount:C,error:p,hint:b,id:j,label:x,maxLength:s,required:n,showCharacterCount:h,size:u,children:({className:e,id:g,describedBy:v,invalid:M})=>{const l=r.jsx("input",{...R,defaultValue:d,id:g,ref:N,"aria-describedby":v,"aria-invalid":M||f,className:[e,i&&t.default.withIcon,m].filter(Boolean).join(" "),maxLength:s,onChange:T,required:n,value:c});return i?r.jsxs("div",{className:[t.default.control,u==="sm"&&t.default.sm].filter(Boolean).join(" "),children:[r.jsx("span",{"aria-hidden":"true",className:t.default.icon,children:i}),l]}):l}})}exports.InputText=w;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),B=require("../../../hooks/useMergedRefs.cjs"),e=require("./InputText.module.css.cjs"),F=require("../../../hooks/useCharacterCount/useCharacterCount.cjs"),S=require("../Field/Field.cjs");function w({"aria-describedby":o,"aria-invalid":f,className:m,error:p,hint:b,icon:a,id:j,label:x,maxLength:n,required:u=!1,size:i="md",showCharacterCount:h=!1,defaultValue:d,onChange:s,value:c,ref:g,...y}){const{ref:R,count:q,updateCount:C}=F.useCharacterCount(c,d),I=B.useMergedRefs(R,g);function N(t){C(t.target.value),s==null||s(t)}return r.jsx(S.Field,{"aria-describedby":o,characterCount:q,error:p,hint:b,id:j,label:x,maxLength:n,required:u,showCharacterCount:h,size:i,children:({className:t,id:T,describedBy:v,invalid:M})=>{const l=r.jsx("input",{...y,defaultValue:d,id:T,ref:I,"aria-describedby":v,"aria-invalid":M||f,className:[t,a&&e.default.withIcon,m].filter(Boolean).join(" "),maxLength:n,onChange:N,required:u,value:c});return a?r.jsxs("div",{className:[e.default.control,i==="sm"&&e.default.sm,i==="lg"&&e.default.lg].filter(Boolean).join(" "),children:[r.jsx("span",{"aria-hidden":"true",className:e.default.icon,children:a}),l]}):l}})}exports.InputText=w;
2
2
  //# sourceMappingURL=InputText.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"InputText.cjs","sources":["../../../../src/components/forms/InputText/InputText.tsx"],"sourcesContent":["import { type ChangeEvent, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { useCharacterCount } from '../../../hooks/useCharacterCount';\nimport { Field } from '../Field';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './InputText.module.css';\n\nexport type InputTextSize = 'sm' | 'md';\n\nexport interface InputTextProps extends Omit<ComponentPropsWithRef<'input'>, 'size'> {\n error?: string;\n hint?: string;\n /** Icone decorativo a frente do texto, como a lupa de uma busca. O nome do campo continua no `label`. */\n icon?: ReactNode;\n label?: string;\n size?: InputTextSize;\n showCharacterCount?: boolean;\n}\n\nexport function InputText({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n icon,\n id: providedId,\n label,\n maxLength,\n required = false,\n size = 'md',\n showCharacterCount = false,\n defaultValue,\n onChange,\n value,\n ref,\n ...props\n}: InputTextProps) {\n const { ref: inputRef, count, updateCount } = useCharacterCount<HTMLInputElement>(value, defaultValue);\n const mergedRef = useMergedRefs(inputRef, ref);\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n updateCount(event.target.value);\n onChange?.(event);\n }\n\n return (\n <Field\n aria-describedby={ariaDescribedBy}\n characterCount={count}\n error={error}\n hint={hint}\n id={providedId}\n label={label}\n maxLength={maxLength}\n required={required}\n showCharacterCount={showCharacterCount}\n size={size}\n >\n {({ className: controlClassName, id, describedBy, invalid }) => {\n const input = (\n <input\n {...props}\n defaultValue={defaultValue}\n id={id}\n ref={mergedRef}\n aria-describedby={describedBy}\n aria-invalid={invalid || ariaInvalid}\n className={[controlClassName, icon && styles.withIcon, className].filter(Boolean).join(' ')}\n maxLength={maxLength}\n onChange={handleChange}\n required={required}\n value={value}\n />\n );\n\n if (!icon) {\n return input;\n }\n\n return (\n <div className={[styles.control, size === 'sm' && styles.sm].filter(Boolean).join(' ')}>\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n {input}\n </div>\n );\n }}\n </Field>\n );\n}\n"],"names":["InputText","ariaDescribedBy","ariaInvalid","className","error","hint","icon","providedId","label","maxLength","required","size","showCharacterCount","defaultValue","onChange","value","ref","props","inputRef","count","updateCount","useCharacterCount","mergedRef","useMergedRefs","handleChange","event","jsx","Field","controlClassName","id","describedBy","invalid","input","styles"],"mappings":"+SAkBO,SAASA,EAAU,CACxB,mBAAoBC,EACpB,eAAgBC,EAChB,UAAAC,EACA,MAAAC,EACA,KAAAC,EACA,KAAAC,EACA,GAAIC,EACJ,MAAAC,EACA,UAAAC,EACA,SAAAC,EAAW,GACX,KAAAC,EAAO,KACP,mBAAAC,EAAqB,GACrB,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,IAAAC,EACA,GAAGC,CACL,EAAmB,CACjB,KAAM,CAAE,IAAKC,EAAU,MAAAC,EAAO,YAAAC,GAAgBC,EAAAA,kBAAoCN,EAAOF,CAAY,EAC/FS,EAAYC,EAAAA,cAAcL,EAAUF,CAAG,EAE7C,SAASQ,EAAaC,EAAsC,CAC1DL,EAAYK,EAAM,OAAO,KAAK,EAC9BX,GAAA,MAAAA,EAAWW,EACb,CAEA,OACEC,EAAAA,IAACC,EAAAA,MAAA,CACC,mBAAkB1B,EAClB,eAAgBkB,EAChB,MAAAf,EACA,KAAAC,EACA,GAAIE,EACJ,MAAAC,EACA,UAAAC,EACA,SAAAC,EACA,mBAAAE,EACA,KAAAD,EAEC,UAAC,CAAE,UAAWiB,EAAkB,GAAAC,EAAI,YAAAC,EAAa,QAAAC,KAAc,CAC9D,MAAMC,EACJN,EAAAA,IAAC,QAAA,CACE,GAAGT,EACJ,aAAAJ,EACA,GAAAgB,EACA,IAAKP,EACL,mBAAkBQ,EAClB,eAAcC,GAAW7B,EACzB,UAAW,CAAC0B,EAAkBtB,GAAQ2B,EAAAA,QAAO,SAAU9B,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC1F,UAAAM,EACA,SAAUe,EACV,SAAAd,EACA,MAAAK,CAAA,CAAA,EAIJ,OAAKT,SAKF,MAAA,CAAI,UAAW,CAAC2B,EAAAA,QAAO,QAAStB,IAAS,MAAQsB,EAAAA,QAAO,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACnF,SAAA,CAAAP,MAAC,QAAK,cAAY,OAAO,UAAWO,EAAAA,QAAO,KACxC,SAAA3B,EACH,EACC0B,CAAA,EACH,EATOA,CAWX,CAAA,CAAA,CAGN"}
1
+ {"version":3,"file":"InputText.cjs","sources":["../../../../src/components/forms/InputText/InputText.tsx"],"sourcesContent":["import { type ChangeEvent, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { useCharacterCount } from '../../../hooks/useCharacterCount';\nimport { Field } from '../Field';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './InputText.module.css';\n\nexport type InputTextSize = 'sm' | 'md' | 'lg';\n\nexport interface InputTextProps extends Omit<ComponentPropsWithRef<'input'>, 'size'> {\n error?: string;\n hint?: string;\n /** Icone decorativo a frente do texto, como a lupa de uma busca. O nome do campo continua no `label`. */\n icon?: ReactNode;\n label?: string;\n size?: InputTextSize;\n showCharacterCount?: boolean;\n}\n\nexport function InputText({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n icon,\n id: providedId,\n label,\n maxLength,\n required = false,\n size = 'md',\n showCharacterCount = false,\n defaultValue,\n onChange,\n value,\n ref,\n ...props\n}: InputTextProps) {\n const { ref: inputRef, count, updateCount } = useCharacterCount<HTMLInputElement>(value, defaultValue);\n const mergedRef = useMergedRefs(inputRef, ref);\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n updateCount(event.target.value);\n onChange?.(event);\n }\n\n return (\n <Field\n aria-describedby={ariaDescribedBy}\n characterCount={count}\n error={error}\n hint={hint}\n id={providedId}\n label={label}\n maxLength={maxLength}\n required={required}\n showCharacterCount={showCharacterCount}\n size={size}\n >\n {({ className: controlClassName, id, describedBy, invalid }) => {\n const input = (\n <input\n {...props}\n defaultValue={defaultValue}\n id={id}\n ref={mergedRef}\n aria-describedby={describedBy}\n aria-invalid={invalid || ariaInvalid}\n className={[controlClassName, icon && styles.withIcon, className].filter(Boolean).join(' ')}\n maxLength={maxLength}\n onChange={handleChange}\n required={required}\n value={value}\n />\n );\n\n if (!icon) {\n return input;\n }\n\n return (\n <div className={[styles.control, size === 'sm' && styles.sm, size === 'lg' && styles.lg].filter(Boolean).join(' ')}>\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n {input}\n </div>\n );\n }}\n </Field>\n );\n}\n"],"names":["InputText","ariaDescribedBy","ariaInvalid","className","error","hint","icon","providedId","label","maxLength","required","size","showCharacterCount","defaultValue","onChange","value","ref","props","inputRef","count","updateCount","useCharacterCount","mergedRef","useMergedRefs","handleChange","event","jsx","Field","controlClassName","id","describedBy","invalid","input","styles","jsxs"],"mappings":"+SAkBO,SAASA,EAAU,CACxB,mBAAoBC,EACpB,eAAgBC,EAChB,UAAAC,EACA,MAAAC,EACA,KAAAC,EACA,KAAAC,EACA,GAAIC,EACJ,MAAAC,EACA,UAAAC,EACA,SAAAC,EAAW,GACX,KAAAC,EAAO,KACP,mBAAAC,EAAqB,GACrB,aAAAC,EACA,SAAAC,EACA,MAAAC,EACA,IAAAC,EACA,GAAGC,CACL,EAAmB,CACjB,KAAM,CAAE,IAAKC,EAAU,MAAAC,EAAO,YAAAC,GAAgBC,EAAAA,kBAAoCN,EAAOF,CAAY,EAC/FS,EAAYC,EAAAA,cAAcL,EAAUF,CAAG,EAE7C,SAASQ,EAAaC,EAAsC,CAC1DL,EAAYK,EAAM,OAAO,KAAK,EAC9BX,GAAA,MAAAA,EAAWW,EACb,CAEA,OACEC,EAAAA,IAACC,EAAAA,MAAA,CACC,mBAAkB1B,EAClB,eAAgBkB,EAChB,MAAAf,EACA,KAAAC,EACA,GAAIE,EACJ,MAAAC,EACA,UAAAC,EACA,SAAAC,EACA,mBAAAE,EACA,KAAAD,EAEC,UAAC,CAAE,UAAWiB,EAAkB,GAAAC,EAAI,YAAAC,EAAa,QAAAC,KAAc,CAC9D,MAAMC,EACJN,EAAAA,IAAC,QAAA,CACE,GAAGT,EACJ,aAAAJ,EACA,GAAAgB,EACA,IAAKP,EACL,mBAAkBQ,EAClB,eAAcC,GAAW7B,EACzB,UAAW,CAAC0B,EAAkBtB,GAAQ2B,EAAAA,QAAO,SAAU9B,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC1F,UAAAM,EACA,SAAUe,EACV,SAAAd,EACA,MAAAK,CAAA,CAAA,EAIJ,OAAKT,EAKH4B,EAAAA,KAAC,OAAI,UAAW,CAACD,EAAAA,QAAO,QAAStB,IAAS,MAAQsB,UAAO,GAAItB,IAAS,MAAQsB,UAAO,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC/G,SAAA,CAAAP,MAAC,QAAK,cAAY,OAAO,UAAWO,EAAAA,QAAO,KACxC,SAAA3B,EACH,EACC0B,CAAA,EACH,EATOA,CAWX,CAAA,CAAA,CAGN"}
@@ -1,6 +1,6 @@
1
- import { jsx as a, jsxs as T } from "react/jsx-runtime";
2
- import { useMergedRefs as g } from "../../../hooks/useMergedRefs.js";
3
- import e from "./InputText.module.css.js";
1
+ import { jsx as o, jsxs as M } from "react/jsx-runtime";
2
+ import { useMergedRefs as T } from "../../../hooks/useMergedRefs.js";
3
+ import r from "./InputText.module.css.js";
4
4
  import { useCharacterCount as k } from "../../../hooks/useCharacterCount/useCharacterCount.js";
5
5
  import { Field as A } from "../Field/Field.js";
6
6
  function K({
@@ -13,51 +13,51 @@ function K({
13
13
  id: h,
14
14
  label: j,
15
15
  maxLength: s,
16
- required: o = !1,
17
- size: n = "md",
16
+ required: n = !1,
17
+ size: t = "md",
18
18
  showCharacterCount: y = !1,
19
19
  defaultValue: c,
20
- onChange: t,
20
+ onChange: a,
21
21
  value: d,
22
22
  ref: N,
23
23
  ...x
24
24
  }) {
25
- const { ref: R, count: v, updateCount: B } = k(d, c), C = g(R, N);
26
- function I(r) {
27
- B(r.target.value), t == null || t(r);
25
+ const { ref: R, count: g, updateCount: v } = k(d, c), B = T(R, N);
26
+ function C(e) {
27
+ v(e.target.value), a == null || a(e);
28
28
  }
29
- return /* @__PURE__ */ a(
29
+ return /* @__PURE__ */ o(
30
30
  A,
31
31
  {
32
32
  "aria-describedby": m,
33
- characterCount: v,
33
+ characterCount: g,
34
34
  error: p,
35
35
  hint: b,
36
36
  id: h,
37
37
  label: j,
38
38
  maxLength: s,
39
- required: o,
39
+ required: n,
40
40
  showCharacterCount: y,
41
- size: n,
42
- children: ({ className: r, id: w, describedBy: F, invalid: M }) => {
43
- const l = /* @__PURE__ */ a(
41
+ size: t,
42
+ children: ({ className: e, id: I, describedBy: w, invalid: F }) => {
43
+ const l = /* @__PURE__ */ o(
44
44
  "input",
45
45
  {
46
46
  ...x,
47
47
  defaultValue: c,
48
- id: w,
49
- ref: C,
50
- "aria-describedby": F,
51
- "aria-invalid": M || f,
52
- className: [r, i && e.withIcon, u].filter(Boolean).join(" "),
48
+ id: I,
49
+ ref: B,
50
+ "aria-describedby": w,
51
+ "aria-invalid": F || f,
52
+ className: [e, i && r.withIcon, u].filter(Boolean).join(" "),
53
53
  maxLength: s,
54
- onChange: I,
55
- required: o,
54
+ onChange: C,
55
+ required: n,
56
56
  value: d
57
57
  }
58
58
  );
59
- return i ? /* @__PURE__ */ T("div", { className: [e.control, n === "sm" && e.sm].filter(Boolean).join(" "), children: [
60
- /* @__PURE__ */ a("span", { "aria-hidden": "true", className: e.icon, children: i }),
59
+ return i ? /* @__PURE__ */ M("div", { className: [r.control, t === "sm" && r.sm, t === "lg" && r.lg].filter(Boolean).join(" "), children: [
60
+ /* @__PURE__ */ o("span", { "aria-hidden": "true", className: r.icon, children: i }),
61
61
  l
62
62
  ] }) : l;
63
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"InputText.js","sources":["../../../../src/components/forms/InputText/InputText.tsx"],"sourcesContent":["import { type ChangeEvent, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { useCharacterCount } from '../../../hooks/useCharacterCount';\nimport { Field } from '../Field';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './InputText.module.css';\n\nexport type InputTextSize = 'sm' | 'md';\n\nexport interface InputTextProps extends Omit<ComponentPropsWithRef<'input'>, 'size'> {\n error?: string;\n hint?: string;\n /** Icone decorativo a frente do texto, como a lupa de uma busca. O nome do campo continua no `label`. */\n icon?: ReactNode;\n label?: string;\n size?: InputTextSize;\n showCharacterCount?: boolean;\n}\n\nexport function InputText({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n icon,\n id: providedId,\n label,\n maxLength,\n required = false,\n size = 'md',\n showCharacterCount = false,\n defaultValue,\n onChange,\n value,\n ref,\n ...props\n}: InputTextProps) {\n const { ref: inputRef, count, updateCount } = useCharacterCount<HTMLInputElement>(value, defaultValue);\n const mergedRef = useMergedRefs(inputRef, ref);\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n updateCount(event.target.value);\n onChange?.(event);\n }\n\n return (\n <Field\n aria-describedby={ariaDescribedBy}\n characterCount={count}\n error={error}\n hint={hint}\n id={providedId}\n label={label}\n maxLength={maxLength}\n required={required}\n showCharacterCount={showCharacterCount}\n size={size}\n >\n {({ className: controlClassName, id, describedBy, invalid }) => {\n const input = (\n <input\n {...props}\n defaultValue={defaultValue}\n id={id}\n ref={mergedRef}\n aria-describedby={describedBy}\n aria-invalid={invalid || ariaInvalid}\n className={[controlClassName, icon && styles.withIcon, className].filter(Boolean).join(' ')}\n maxLength={maxLength}\n onChange={handleChange}\n required={required}\n value={value}\n />\n );\n\n if (!icon) {\n return input;\n }\n\n return (\n <div className={[styles.control, size === 'sm' && styles.sm].filter(Boolean).join(' ')}>\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n {input}\n </div>\n );\n }}\n </Field>\n );\n}\n"],"names":["InputText","ariaDescribedBy","ariaInvalid","className","error","hint","icon","providedId","label","maxLength","required","size","showCharacterCount","defaultValue","onChange","value","ref","props","inputRef","count","updateCount","useCharacterCount","mergedRef","useMergedRefs","handleChange","event","jsx","Field","controlClassName","id","describedBy","invalid","input","styles"],"mappings":";;;;;AAkBO,SAASA,EAAU;AAAA,EACxB,oBAAoBC;AAAA,EACpB,gBAAgBC;AAAA,EAChB,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,IAAIC;AAAA,EACJ,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC,IAAO;AAAA,EACP,oBAAAC,IAAqB;AAAA,EACrB,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,KAAAC;AAAA,EACA,GAAGC;AACL,GAAmB;AACjB,QAAM,EAAE,KAAKC,GAAU,OAAAC,GAAO,aAAAC,MAAgBC,EAAoCN,GAAOF,CAAY,GAC/FS,IAAYC,EAAcL,GAAUF,CAAG;AAE7C,WAASQ,EAAaC,GAAsC;AAC1D,IAAAL,EAAYK,EAAM,OAAO,KAAK,GAC9BX,KAAA,QAAAA,EAAWW;AAAA,EACb;AAEA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,oBAAkB1B;AAAA,MAClB,gBAAgBkB;AAAA,MAChB,OAAAf;AAAA,MACA,MAAAC;AAAA,MACA,IAAIE;AAAA,MACJ,OAAAC;AAAA,MACA,WAAAC;AAAA,MACA,UAAAC;AAAA,MACA,oBAAAE;AAAA,MACA,MAAAD;AAAA,MAEC,WAAC,EAAE,WAAWiB,GAAkB,IAAAC,GAAI,aAAAC,GAAa,SAAAC,QAAc;AAC9D,cAAMC,IACJ,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACE,GAAGT;AAAA,YACJ,cAAAJ;AAAA,YACA,IAAAgB;AAAA,YACA,KAAKP;AAAA,YACL,oBAAkBQ;AAAA,YAClB,gBAAcC,KAAW7B;AAAA,YACzB,WAAW,CAAC0B,GAAkBtB,KAAQ2B,EAAO,UAAU9B,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC1F,WAAAM;AAAA,YACA,UAAUe;AAAA,YACV,UAAAd;AAAA,YACA,OAAAK;AAAA,UAAA;AAAA,QAAA;AAIJ,eAAKT,sBAKF,OAAA,EAAI,WAAW,CAAC2B,EAAO,SAAStB,MAAS,QAAQsB,EAAO,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACnF,UAAA;AAAA,UAAA,gBAAAP,EAAC,UAAK,eAAY,QAAO,WAAWO,EAAO,MACxC,UAAA3B,GACH;AAAA,UACC0B;AAAA,QAAA,GACH,IATOA;AAAA,MAWX;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"InputText.js","sources":["../../../../src/components/forms/InputText/InputText.tsx"],"sourcesContent":["import { type ChangeEvent, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { useCharacterCount } from '../../../hooks/useCharacterCount';\nimport { Field } from '../Field';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './InputText.module.css';\n\nexport type InputTextSize = 'sm' | 'md' | 'lg';\n\nexport interface InputTextProps extends Omit<ComponentPropsWithRef<'input'>, 'size'> {\n error?: string;\n hint?: string;\n /** Icone decorativo a frente do texto, como a lupa de uma busca. O nome do campo continua no `label`. */\n icon?: ReactNode;\n label?: string;\n size?: InputTextSize;\n showCharacterCount?: boolean;\n}\n\nexport function InputText({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n icon,\n id: providedId,\n label,\n maxLength,\n required = false,\n size = 'md',\n showCharacterCount = false,\n defaultValue,\n onChange,\n value,\n ref,\n ...props\n}: InputTextProps) {\n const { ref: inputRef, count, updateCount } = useCharacterCount<HTMLInputElement>(value, defaultValue);\n const mergedRef = useMergedRefs(inputRef, ref);\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n updateCount(event.target.value);\n onChange?.(event);\n }\n\n return (\n <Field\n aria-describedby={ariaDescribedBy}\n characterCount={count}\n error={error}\n hint={hint}\n id={providedId}\n label={label}\n maxLength={maxLength}\n required={required}\n showCharacterCount={showCharacterCount}\n size={size}\n >\n {({ className: controlClassName, id, describedBy, invalid }) => {\n const input = (\n <input\n {...props}\n defaultValue={defaultValue}\n id={id}\n ref={mergedRef}\n aria-describedby={describedBy}\n aria-invalid={invalid || ariaInvalid}\n className={[controlClassName, icon && styles.withIcon, className].filter(Boolean).join(' ')}\n maxLength={maxLength}\n onChange={handleChange}\n required={required}\n value={value}\n />\n );\n\n if (!icon) {\n return input;\n }\n\n return (\n <div className={[styles.control, size === 'sm' && styles.sm, size === 'lg' && styles.lg].filter(Boolean).join(' ')}>\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n {input}\n </div>\n );\n }}\n </Field>\n );\n}\n"],"names":["InputText","ariaDescribedBy","ariaInvalid","className","error","hint","icon","providedId","label","maxLength","required","size","showCharacterCount","defaultValue","onChange","value","ref","props","inputRef","count","updateCount","useCharacterCount","mergedRef","useMergedRefs","handleChange","event","jsx","Field","controlClassName","id","describedBy","invalid","input","styles","jsxs"],"mappings":";;;;;AAkBO,SAASA,EAAU;AAAA,EACxB,oBAAoBC;AAAA,EACpB,gBAAgBC;AAAA,EAChB,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,IAAIC;AAAA,EACJ,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC,IAAO;AAAA,EACP,oBAAAC,IAAqB;AAAA,EACrB,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,KAAAC;AAAA,EACA,GAAGC;AACL,GAAmB;AACjB,QAAM,EAAE,KAAKC,GAAU,OAAAC,GAAO,aAAAC,MAAgBC,EAAoCN,GAAOF,CAAY,GAC/FS,IAAYC,EAAcL,GAAUF,CAAG;AAE7C,WAASQ,EAAaC,GAAsC;AAC1D,IAAAL,EAAYK,EAAM,OAAO,KAAK,GAC9BX,KAAA,QAAAA,EAAWW;AAAA,EACb;AAEA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,oBAAkB1B;AAAA,MAClB,gBAAgBkB;AAAA,MAChB,OAAAf;AAAA,MACA,MAAAC;AAAA,MACA,IAAIE;AAAA,MACJ,OAAAC;AAAA,MACA,WAAAC;AAAA,MACA,UAAAC;AAAA,MACA,oBAAAE;AAAA,MACA,MAAAD;AAAA,MAEC,WAAC,EAAE,WAAWiB,GAAkB,IAAAC,GAAI,aAAAC,GAAa,SAAAC,QAAc;AAC9D,cAAMC,IACJ,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YACE,GAAGT;AAAA,YACJ,cAAAJ;AAAA,YACA,IAAAgB;AAAA,YACA,KAAKP;AAAA,YACL,oBAAkBQ;AAAA,YAClB,gBAAcC,KAAW7B;AAAA,YACzB,WAAW,CAAC0B,GAAkBtB,KAAQ2B,EAAO,UAAU9B,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC1F,WAAAM;AAAA,YACA,UAAUe;AAAA,YACV,UAAAd;AAAA,YACA,OAAAK;AAAA,UAAA;AAAA,QAAA;AAIJ,eAAKT,IAKH,gBAAA4B,EAAC,SAAI,WAAW,CAACD,EAAO,SAAStB,MAAS,QAAQsB,EAAO,IAAItB,MAAS,QAAQsB,EAAO,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/G,UAAA;AAAA,UAAA,gBAAAP,EAAC,UAAK,eAAY,QAAO,WAAWO,EAAO,MACxC,UAAA3B,GACH;AAAA,UACC0B;AAAA,QAAA,GACH,IATOA;AAAA,MAWX;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o="_control_x50cf_2",c="_icon_x50cf_8",t="_withIcon_x50cf_17",n="_sm_x50cf_21",s={control:o,icon:c,withIcon:t,sm:n};exports.control=o;exports.default=s;exports.icon=c;exports.sm=n;exports.withIcon=t;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o="_control_1pe0o_2",t="_icon_1pe0o_8",c="_withIcon_1pe0o_17",n="_sm_1pe0o_21",e="_lg_1pe0o_30",_={control:o,icon:t,withIcon:c,sm:n,lg:e};exports.control=o;exports.default=_;exports.icon=t;exports.lg=e;exports.sm=n;exports.withIcon=c;
2
2
  //# sourceMappingURL=InputText.module.css.cjs.map
@@ -1,13 +1,15 @@
1
- const c = "_control_x50cf_2", o = "_icon_x50cf_8", n = "_withIcon_x50cf_17", t = "_sm_x50cf_21", _ = {
2
- control: c,
3
- icon: o,
1
+ const o = "_control_1pe0o_2", c = "_icon_1pe0o_8", n = "_withIcon_1pe0o_17", t = "_sm_1pe0o_21", _ = "_lg_1pe0o_30", s = {
2
+ control: o,
3
+ icon: c,
4
4
  withIcon: n,
5
- sm: t
5
+ sm: t,
6
+ lg: _
6
7
  };
7
8
  export {
8
- c as control,
9
- _ as default,
10
- o as icon,
9
+ o as control,
10
+ s as default,
11
+ c as icon,
12
+ _ as lg,
11
13
  t as sm,
12
14
  n as withIcon
13
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"InputText.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
1
+ {"version":3,"file":"InputText.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_group_1nbsm_1",r="_legend_1nbsm_11",o="_required_1nbsm_20",t="_options_1nbsm_25",n="_control_1nbsm_31",s="_input_1nbsm_38",_="_error_1nbsm_59",i="_text_1nbsm_90",u="_hint_1nbsm_98 _hint_1qg91_8",c="_errorMessage_1nbsm_102 _errorMessage_1qg91_9",g={group:e,legend:r,required:o,options:t,control:n,input:s,error:_,text:i,hint:u,errorMessage:c};exports.control=n;exports.default=g;exports.error=_;exports.errorMessage=c;exports.group=e;exports.hint=u;exports.input=s;exports.legend=r;exports.options=t;exports.required=o;exports.text=i;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_group_1nbsm_1",r="_legend_1nbsm_11",n="_required_1nbsm_20",o="_options_1nbsm_25",t="_control_1nbsm_31",s="_input_1nbsm_38",_="_error_1nbsm_59",i="_text_1nbsm_90",u="_hint_1nbsm_98 _hint_1ndjk_8",c="_errorMessage_1nbsm_102 _errorMessage_1ndjk_9",g={group:e,legend:r,required:n,options:o,control:t,input:s,error:_,text:i,hint:u,errorMessage:c};exports.control=t;exports.default=g;exports.error=_;exports.errorMessage=c;exports.group=e;exports.hint=u;exports.input=s;exports.legend=r;exports.options=o;exports.required=n;exports.text=i;
2
2
  //# sourceMappingURL=RadioGroup.module.css.cjs.map
@@ -1,4 +1,4 @@
1
- const n = "_group_1nbsm_1", _ = "_legend_1nbsm_11", s = "_required_1nbsm_20", o = "_options_1nbsm_25", r = "_control_1nbsm_31", e = "_input_1nbsm_38", t = "_error_1nbsm_59", c = "_text_1nbsm_90", i = "_hint_1nbsm_98 _hint_1qg91_8", g = "_errorMessage_1nbsm_102 _errorMessage_1qg91_9", b = {
1
+ const n = "_group_1nbsm_1", _ = "_legend_1nbsm_11", s = "_required_1nbsm_20", o = "_options_1nbsm_25", r = "_control_1nbsm_31", e = "_input_1nbsm_38", t = "_error_1nbsm_59", c = "_text_1nbsm_90", i = "_hint_1nbsm_98 _hint_1ndjk_8", b = "_errorMessage_1nbsm_102 _errorMessage_1ndjk_9", g = {
2
2
  group: n,
3
3
  legend: _,
4
4
  required: s,
@@ -8,13 +8,13 @@ const n = "_group_1nbsm_1", _ = "_legend_1nbsm_11", s = "_required_1nbsm_20", o
8
8
  error: t,
9
9
  text: c,
10
10
  hint: i,
11
- errorMessage: g
11
+ errorMessage: b
12
12
  };
13
13
  export {
14
14
  r as control,
15
- b as default,
15
+ g as default,
16
16
  t as error,
17
- g as errorMessage,
17
+ b as errorMessage,
18
18
  n as group,
19
19
  i as hint,
20
20
  e as input,