@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":"Select.cjs","sources":["../../../../src/components/forms/Select/Select.tsx"],"sourcesContent":["import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions } from '../../data-display/List/ListingOptions';\nimport { useListing, type Listing } from '../../data-display/List/useListing';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './Select.module.css';\nimport { IconChevronDown } from '../../icons';\n\nexport type SelectSize = 'sm' | 'md';\n\nexport interface SelectOption {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao gatilho, que e o controle; o `className` soma ao do sistema. */\nexport interface SelectProps\n extends Omit<ComponentPropsWithRef<'button'>, 'children' | 'defaultValue' | 'name' | 'onChange' | 'type' | 'value'> {\n defaultValue?: 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 onValueChange?: (value: string) => void;\n options: readonly SelectOption[];\n placeholder?: string;\n required?: boolean;\n size?: SelectSize;\n value?: string;\n}\n\nexport function Select({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n label,\n onClick,\n onKeyDown,\n onValueChange,\n options,\n placeholder = 'Selecione',\n ref,\n required = false,\n size = 'md',\n value,\n ...props\n}: SelectProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const resetRef = useFormReset<HTMLButtonElement>(() => listing.reset());\n const mergedRef = useMergedRefs(triggerRef, 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: 'single',\n defaultValue: defaultValue === undefined ? undefined : [{ value: defaultValue, label: '' }],\n value: value === undefined ? undefined : [{ value, label: '' }],\n onSelectionChange: (chosen) => {\n const [first] = chosen;\n\n if (first) {\n onValueChange?.(first.value);\n }\n },\n });\n\n const [chosen] = listing.selected;\n\n function fechar() {\n setOpen(false);\n triggerRef.current?.focus();\n }\n\n function abrir() {\n if (disabled) {\n return;\n }\n\n listing.focus(chosen?.value ?? options.find((option) => !option.disabled)?.value);\n setOpen(true);\n }\n\n function handleTriggerKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n onKeyDown?.(event);\n\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n abrir();\n }\n }\n\n function handleTriggerClick(event: MouseEvent<HTMLButtonElement>) {\n onClick?.(event);\n\n if (open) {\n fechar();\n } else {\n abrir();\n }\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => triggerRef.current?.focus()}\n required={required}\n value={chosen?.value ?? ''}\n />\n <button\n {...props}\n ref={mergedRef}\n className={[styles.trigger, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-required={required || undefined}\n disabled={disabled}\n onClick={handleTriggerClick}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={chosen?.label ? styles.value : styles.placeholder}>{chosen?.label || placeholder}</span>\n <IconChevronDown className={styles.chevron} size={14} />\n </button>\n {open &&\n createPortal(\n <SelectListbox\n label={label ?? placeholder}\n listing={listing}\n onClose={fechar}\n triggerRef={triggerRef}\n />,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n\nfunction SelectListbox({\n label,\n listing,\n onClose,\n triggerRef,\n}: {\n label: string;\n listing: Listing;\n onClose: () => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const listboxRef = useRef<HTMLElement | null>(null);\n // `Math.random` mudava entre servidor e cliente.\n const baseId = `listbox-${useId()}`;\n\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n const [largura, setLargura] = useState<number>();\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(triggerRef.current?.offsetWidth);\n }, [triggerRef]);\n\n useEffect(() => {\n listboxRef.current?.focus();\n }, []);\n\n function handleKeyDown(event: KeyboardEvent<HTMLElement>) {\n if (event.key === 'Escape' || event.key === 'Tab') {\n onClose();\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (alvo && !alvo.disabled) {\n listing.select(alvo);\n onClose();\n }\n return;\n }\n\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n listing.typeahead(event.key);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <div\n {...overlayProps}\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 style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n elementRef={listboxRef}\n label={label}\n listing={listing}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event as KeyboardEvent<HTMLDivElement>);\n }}\n onSelect={onClose}\n tabIndex={-1}\n />\n </div>\n );\n}\n"],"names":["Select","ariaDescribedBy","className","defaultValue","name","disabled","error","hint","providedId","label","onClick","onKeyDown","onValueChange","options","placeholder","ref","required","size","value","props","triggerRef","useRef","open","setOpen","useState","resetRef","useFormReset","listing","mergedRef","useMergedRefs","useListing","chosen","first","fechar","_a","abrir","option","handleTriggerKeyDown","event","handleTriggerClick","Field","id","describedBy","invalid","jsxs","Fragment","jsx","FormValue","styles","IconChevronDown","createPortal","SelectListbox","onClose","panelRef","listboxRef","baseId","useId","overlayProps","useOverlay","elemento","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","useEffect","handleKeyDown","alvo","ListingOptions"],"mappings":"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"}
1
+ {"version":3,"file":"Select.cjs","sources":["../../../../src/components/forms/Select/Select.tsx"],"sourcesContent":["import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions } from '../../data-display/List/ListingOptions';\nimport { useListing, type Listing } from '../../data-display/List/useListing';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './Select.module.css';\nimport { IconChevronDown } from '../../icons';\n\nexport type SelectSize = 'sm' | 'md';\n\nexport interface SelectOption {\n /** Segunda linha da opção, na lista aberta. O nome da opção e o gatilho fechado ficam no rótulo. */\n description?: string;\n disabled?: boolean;\n /** Decorativo, à frente do rótulo, na lista aberta. */\n icon?: ReactNode;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao gatilho, que e o controle; o `className` soma ao do sistema. */\nexport interface SelectProps\n extends Omit<ComponentPropsWithRef<'button'>, 'children' | 'defaultValue' | 'name' | 'onChange' | 'type' | 'value'> {\n defaultValue?: 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 onValueChange?: (value: string) => void;\n options: readonly SelectOption[];\n placeholder?: string;\n required?: boolean;\n size?: SelectSize;\n value?: string;\n}\n\nexport function Select({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n label,\n onClick,\n onKeyDown,\n onValueChange,\n options,\n placeholder = 'Selecione',\n ref,\n required = false,\n size = 'md',\n value,\n ...props\n}: SelectProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const resetRef = useFormReset<HTMLButtonElement>(() => listing.reset());\n const mergedRef = useMergedRefs(triggerRef, 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: 'single',\n defaultValue: defaultValue === undefined ? undefined : [{ value: defaultValue, label: '' }],\n value: value === undefined ? undefined : [{ value, label: '' }],\n onSelectionChange: (chosen) => {\n const [first] = chosen;\n\n if (first) {\n onValueChange?.(first.value);\n }\n },\n });\n\n const [chosen] = listing.selected;\n\n function fechar() {\n setOpen(false);\n triggerRef.current?.focus();\n }\n\n function abrir() {\n if (disabled) {\n return;\n }\n\n listing.focus(chosen?.value ?? options.find((option) => !option.disabled)?.value);\n setOpen(true);\n }\n\n function handleTriggerKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n onKeyDown?.(event);\n\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n abrir();\n }\n }\n\n function handleTriggerClick(event: MouseEvent<HTMLButtonElement>) {\n onClick?.(event);\n\n if (open) {\n fechar();\n } else {\n abrir();\n }\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => triggerRef.current?.focus()}\n required={required}\n value={chosen?.value ?? ''}\n />\n <button\n {...props}\n ref={mergedRef}\n className={[styles.trigger, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-required={required || undefined}\n disabled={disabled}\n onClick={handleTriggerClick}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={chosen?.label ? styles.value : styles.placeholder}>{chosen?.label || placeholder}</span>\n <IconChevronDown className={styles.chevron} size={14} />\n </button>\n {open &&\n createPortal(\n <SelectListbox\n label={label ?? placeholder}\n listing={listing}\n onClose={fechar}\n triggerRef={triggerRef}\n />,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n\nfunction SelectListbox({\n label,\n listing,\n onClose,\n triggerRef,\n}: {\n label: string;\n listing: Listing;\n onClose: () => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const listboxRef = useRef<HTMLElement | null>(null);\n // `Math.random` mudava entre servidor e cliente.\n const baseId = `listbox-${useId()}`;\n\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n const [largura, setLargura] = useState<number>();\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(triggerRef.current?.offsetWidth);\n }, [triggerRef]);\n\n useEffect(() => {\n listboxRef.current?.focus();\n }, []);\n\n function handleKeyDown(event: KeyboardEvent<HTMLElement>) {\n if (event.key === 'Escape' || event.key === 'Tab') {\n onClose();\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (alvo && !alvo.disabled) {\n listing.select(alvo);\n onClose();\n }\n return;\n }\n\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n listing.typeahead(event.key);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <div\n {...overlayProps}\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 style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n elementRef={listboxRef}\n label={label}\n listing={listing}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event as KeyboardEvent<HTMLDivElement>);\n }}\n onSelect={onClose}\n tabIndex={-1}\n />\n </div>\n );\n}\n"],"names":["Select","ariaDescribedBy","className","defaultValue","name","disabled","error","hint","providedId","label","onClick","onKeyDown","onValueChange","options","placeholder","ref","required","size","value","props","triggerRef","useRef","open","setOpen","useState","resetRef","useFormReset","listing","mergedRef","useMergedRefs","useListing","chosen","first","fechar","_a","abrir","option","handleTriggerKeyDown","event","handleTriggerClick","Field","id","describedBy","invalid","jsxs","Fragment","jsx","FormValue","styles","IconChevronDown","createPortal","SelectListbox","onClose","panelRef","listboxRef","baseId","useId","overlayProps","useOverlay","elemento","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","useEffect","handleKeyDown","alvo","ListingOptions"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","sources":["../../../../src/components/forms/Select/Select.tsx"],"sourcesContent":["import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions } from '../../data-display/List/ListingOptions';\nimport { useListing, type Listing } from '../../data-display/List/useListing';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './Select.module.css';\nimport { IconChevronDown } from '../../icons';\n\nexport type SelectSize = 'sm' | 'md';\n\nexport interface SelectOption {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao gatilho, que e o controle; o `className` soma ao do sistema. */\nexport interface SelectProps\n extends Omit<ComponentPropsWithRef<'button'>, 'children' | 'defaultValue' | 'name' | 'onChange' | 'type' | 'value'> {\n defaultValue?: 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 onValueChange?: (value: string) => void;\n options: readonly SelectOption[];\n placeholder?: string;\n required?: boolean;\n size?: SelectSize;\n value?: string;\n}\n\nexport function Select({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n label,\n onClick,\n onKeyDown,\n onValueChange,\n options,\n placeholder = 'Selecione',\n ref,\n required = false,\n size = 'md',\n value,\n ...props\n}: SelectProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const resetRef = useFormReset<HTMLButtonElement>(() => listing.reset());\n const mergedRef = useMergedRefs(triggerRef, 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: 'single',\n defaultValue: defaultValue === undefined ? undefined : [{ value: defaultValue, label: '' }],\n value: value === undefined ? undefined : [{ value, label: '' }],\n onSelectionChange: (chosen) => {\n const [first] = chosen;\n\n if (first) {\n onValueChange?.(first.value);\n }\n },\n });\n\n const [chosen] = listing.selected;\n\n function fechar() {\n setOpen(false);\n triggerRef.current?.focus();\n }\n\n function abrir() {\n if (disabled) {\n return;\n }\n\n listing.focus(chosen?.value ?? options.find((option) => !option.disabled)?.value);\n setOpen(true);\n }\n\n function handleTriggerKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n onKeyDown?.(event);\n\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n abrir();\n }\n }\n\n function handleTriggerClick(event: MouseEvent<HTMLButtonElement>) {\n onClick?.(event);\n\n if (open) {\n fechar();\n } else {\n abrir();\n }\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => triggerRef.current?.focus()}\n required={required}\n value={chosen?.value ?? ''}\n />\n <button\n {...props}\n ref={mergedRef}\n className={[styles.trigger, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-required={required || undefined}\n disabled={disabled}\n onClick={handleTriggerClick}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={chosen?.label ? styles.value : styles.placeholder}>{chosen?.label || placeholder}</span>\n <IconChevronDown className={styles.chevron} size={14} />\n </button>\n {open &&\n createPortal(\n <SelectListbox\n label={label ?? placeholder}\n listing={listing}\n onClose={fechar}\n triggerRef={triggerRef}\n />,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n\nfunction SelectListbox({\n label,\n listing,\n onClose,\n triggerRef,\n}: {\n label: string;\n listing: Listing;\n onClose: () => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const listboxRef = useRef<HTMLElement | null>(null);\n // `Math.random` mudava entre servidor e cliente.\n const baseId = `listbox-${useId()}`;\n\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n const [largura, setLargura] = useState<number>();\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(triggerRef.current?.offsetWidth);\n }, [triggerRef]);\n\n useEffect(() => {\n listboxRef.current?.focus();\n }, []);\n\n function handleKeyDown(event: KeyboardEvent<HTMLElement>) {\n if (event.key === 'Escape' || event.key === 'Tab') {\n onClose();\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (alvo && !alvo.disabled) {\n listing.select(alvo);\n onClose();\n }\n return;\n }\n\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n listing.typeahead(event.key);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <div\n {...overlayProps}\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 style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n elementRef={listboxRef}\n label={label}\n listing={listing}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event as KeyboardEvent<HTMLDivElement>);\n }}\n onSelect={onClose}\n tabIndex={-1}\n />\n </div>\n );\n}\n"],"names":["Select","ariaDescribedBy","className","defaultValue","name","disabled","error","hint","providedId","label","onClick","onKeyDown","onValueChange","options","placeholder","ref","required","size","value","props","triggerRef","useRef","open","setOpen","useState","resetRef","useFormReset","listing","mergedRef","useMergedRefs","useListing","chosen","first","fechar","_a","abrir","option","handleTriggerKeyDown","event","handleTriggerClick","Field","id","describedBy","invalid","jsxs","Fragment","jsx","FormValue","styles","IconChevronDown","createPortal","SelectListbox","onClose","panelRef","listboxRef","baseId","useId","overlayProps","useOverlay","elemento","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","useEffect","handleKeyDown","alvo","ListingOptions"],"mappings":"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"}
1
+ {"version":3,"file":"Select.js","sources":["../../../../src/components/forms/Select/Select.tsx"],"sourcesContent":["import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions } from '../../data-display/List/ListingOptions';\nimport { useListing, type Listing } from '../../data-display/List/useListing';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './Select.module.css';\nimport { IconChevronDown } from '../../icons';\n\nexport type SelectSize = 'sm' | 'md';\n\nexport interface SelectOption {\n /** Segunda linha da opção, na lista aberta. O nome da opção e o gatilho fechado ficam no rótulo. */\n description?: string;\n disabled?: boolean;\n /** Decorativo, à frente do rótulo, na lista aberta. */\n icon?: ReactNode;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao gatilho, que e o controle; o `className` soma ao do sistema. */\nexport interface SelectProps\n extends Omit<ComponentPropsWithRef<'button'>, 'children' | 'defaultValue' | 'name' | 'onChange' | 'type' | 'value'> {\n defaultValue?: 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 onValueChange?: (value: string) => void;\n options: readonly SelectOption[];\n placeholder?: string;\n required?: boolean;\n size?: SelectSize;\n value?: string;\n}\n\nexport function Select({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n label,\n onClick,\n onKeyDown,\n onValueChange,\n options,\n placeholder = 'Selecione',\n ref,\n required = false,\n size = 'md',\n value,\n ...props\n}: SelectProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const resetRef = useFormReset<HTMLButtonElement>(() => listing.reset());\n const mergedRef = useMergedRefs(triggerRef, 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: 'single',\n defaultValue: defaultValue === undefined ? undefined : [{ value: defaultValue, label: '' }],\n value: value === undefined ? undefined : [{ value, label: '' }],\n onSelectionChange: (chosen) => {\n const [first] = chosen;\n\n if (first) {\n onValueChange?.(first.value);\n }\n },\n });\n\n const [chosen] = listing.selected;\n\n function fechar() {\n setOpen(false);\n triggerRef.current?.focus();\n }\n\n function abrir() {\n if (disabled) {\n return;\n }\n\n listing.focus(chosen?.value ?? options.find((option) => !option.disabled)?.value);\n setOpen(true);\n }\n\n function handleTriggerKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n onKeyDown?.(event);\n\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n abrir();\n }\n }\n\n function handleTriggerClick(event: MouseEvent<HTMLButtonElement>) {\n onClick?.(event);\n\n if (open) {\n fechar();\n } else {\n abrir();\n }\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => triggerRef.current?.focus()}\n required={required}\n value={chosen?.value ?? ''}\n />\n <button\n {...props}\n ref={mergedRef}\n className={[styles.trigger, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-required={required || undefined}\n disabled={disabled}\n onClick={handleTriggerClick}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={chosen?.label ? styles.value : styles.placeholder}>{chosen?.label || placeholder}</span>\n <IconChevronDown className={styles.chevron} size={14} />\n </button>\n {open &&\n createPortal(\n <SelectListbox\n label={label ?? placeholder}\n listing={listing}\n onClose={fechar}\n triggerRef={triggerRef}\n />,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n\nfunction SelectListbox({\n label,\n listing,\n onClose,\n triggerRef,\n}: {\n label: string;\n listing: Listing;\n onClose: () => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const listboxRef = useRef<HTMLElement | null>(null);\n // `Math.random` mudava entre servidor e cliente.\n const baseId = `listbox-${useId()}`;\n\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n const [largura, setLargura] = useState<number>();\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(triggerRef.current?.offsetWidth);\n }, [triggerRef]);\n\n useEffect(() => {\n listboxRef.current?.focus();\n }, []);\n\n function handleKeyDown(event: KeyboardEvent<HTMLElement>) {\n if (event.key === 'Escape' || event.key === 'Tab') {\n onClose();\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (alvo && !alvo.disabled) {\n listing.select(alvo);\n onClose();\n }\n return;\n }\n\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n listing.typeahead(event.key);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <div\n {...overlayProps}\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 style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n elementRef={listboxRef}\n label={label}\n listing={listing}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event as KeyboardEvent<HTMLDivElement>);\n }}\n onSelect={onClose}\n tabIndex={-1}\n />\n </div>\n );\n}\n"],"names":["Select","ariaDescribedBy","className","defaultValue","name","disabled","error","hint","providedId","label","onClick","onKeyDown","onValueChange","options","placeholder","ref","required","size","value","props","triggerRef","useRef","open","setOpen","useState","resetRef","useFormReset","listing","mergedRef","useMergedRefs","useListing","chosen","first","fechar","_a","abrir","option","handleTriggerKeyDown","event","handleTriggerClick","Field","id","describedBy","invalid","jsxs","Fragment","jsx","FormValue","styles","IconChevronDown","createPortal","SelectListbox","onClose","panelRef","listboxRef","baseId","useId","overlayProps","useOverlay","elemento","positionProps","useOverlayPosition","largura","setLargura","alturaMaxima","useLayoutEffect","useEffect","handleKeyDown","alvo","ListingOptions"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r="_field_1g7qr_1",e="_control_1g7qr_8",t="_input_1g7qr_15",o="_error_1g7qr_56",_="_text_1g7qr_79",s="_hint_1g7qr_87 _hint_1qg91_8",n="_errorMessage_1g7qr_91 _errorMessage_1qg91_9",i={field:r,control:e,input:t,error:o,text:_,hint:s,errorMessage:n};exports.control=e;exports.default=i;exports.error=o;exports.errorMessage=n;exports.field=r;exports.hint=s;exports.input=t;exports.text=_;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r="_field_1g7qr_1",e="_control_1g7qr_8",t="_input_1g7qr_15",o="_error_1g7qr_56",_="_text_1g7qr_79",n="_hint_1g7qr_87 _hint_1ndjk_8",s="_errorMessage_1g7qr_91 _errorMessage_1ndjk_9",i={field:r,control:e,input:t,error:o,text:_,hint:n,errorMessage:s};exports.control=e;exports.default=i;exports.error=o;exports.errorMessage=s;exports.field=r;exports.hint=n;exports.input=t;exports.text=_;
2
2
  //# sourceMappingURL=Switch.module.css.cjs.map
@@ -1,19 +1,19 @@
1
- const r = "_field_1g7qr_1", t = "_control_1g7qr_8", _ = "_input_1g7qr_15", e = "_error_1g7qr_56", o = "_text_1g7qr_79", s = "_hint_1g7qr_87 _hint_1qg91_8", n = "_errorMessage_1g7qr_91 _errorMessage_1qg91_9", g = {
1
+ const r = "_field_1g7qr_1", t = "_control_1g7qr_8", _ = "_input_1g7qr_15", e = "_error_1g7qr_56", o = "_text_1g7qr_79", n = "_hint_1g7qr_87 _hint_1ndjk_8", s = "_errorMessage_1g7qr_91 _errorMessage_1ndjk_9", c = {
2
2
  field: r,
3
3
  control: t,
4
4
  input: _,
5
5
  error: e,
6
6
  text: o,
7
- hint: s,
8
- errorMessage: n
7
+ hint: n,
8
+ errorMessage: s
9
9
  };
10
10
  export {
11
11
  t as control,
12
- g as default,
12
+ c as default,
13
13
  e as error,
14
- n as errorMessage,
14
+ s as errorMessage,
15
15
  r as field,
16
- s as hint,
16
+ n as hint,
17
17
  _ as input,
18
18
  o as text
19
19
  };