@plenustech/design-system 0.2.3 → 0.2.4

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 (153) hide show
  1. package/dist/components/charts/ChartGauge/ChartGauge.cjs +2 -0
  2. package/dist/components/charts/ChartGauge/ChartGauge.cjs.map +1 -0
  3. package/dist/components/charts/ChartGauge/ChartGauge.js +307 -0
  4. package/dist/components/charts/ChartGauge/ChartGauge.js.map +1 -0
  5. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs +2 -0
  6. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs.map +1 -0
  7. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js +76 -0
  8. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js.map +1 -0
  9. package/dist/components/charts/ChartGauge/gaugeLayout.cjs +2 -0
  10. package/dist/components/charts/ChartGauge/gaugeLayout.cjs.map +1 -0
  11. package/dist/components/charts/ChartGauge/gaugeLayout.js +107 -0
  12. package/dist/components/charts/ChartGauge/gaugeLayout.js.map +1 -0
  13. package/dist/components/charts/ChartGauge/gaugeReading.cjs +2 -0
  14. package/dist/components/charts/ChartGauge/gaugeReading.cjs.map +1 -0
  15. package/dist/components/charts/ChartGauge/gaugeReading.js +112 -0
  16. package/dist/components/charts/ChartGauge/gaugeReading.js.map +1 -0
  17. package/dist/components/charts/ChartGauge/gaugeScale.cjs +2 -0
  18. package/dist/components/charts/ChartGauge/gaugeScale.cjs.map +1 -0
  19. package/dist/components/charts/ChartGauge/gaugeScale.js +57 -0
  20. package/dist/components/charts/ChartGauge/gaugeScale.js.map +1 -0
  21. package/dist/components/charts/ChartMap/ChartMap.cjs +2 -0
  22. package/dist/components/charts/ChartMap/ChartMap.cjs.map +1 -0
  23. package/dist/components/charts/ChartMap/ChartMap.js +523 -0
  24. package/dist/components/charts/ChartMap/ChartMap.js.map +1 -0
  25. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs +2 -0
  26. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs.map +1 -0
  27. package/dist/components/charts/ChartMap/ChartMap.module.css.js +124 -0
  28. package/dist/components/charts/ChartMap/ChartMap.module.css.js.map +1 -0
  29. package/dist/components/charts/ChartMap/ChartMapLegend.cjs +2 -0
  30. package/dist/components/charts/ChartMap/ChartMapLegend.cjs.map +1 -0
  31. package/dist/components/charts/ChartMap/ChartMapLegend.js +102 -0
  32. package/dist/components/charts/ChartMap/ChartMapLegend.js.map +1 -0
  33. package/dist/components/charts/ChartMap/ChartMapTable.cjs +2 -0
  34. package/dist/components/charts/ChartMap/ChartMapTable.cjs.map +1 -0
  35. package/dist/components/charts/ChartMap/ChartMapTable.js +118 -0
  36. package/dist/components/charts/ChartMap/ChartMapTable.js.map +1 -0
  37. package/dist/components/charts/ChartMap/mapGeometry.cjs +2 -0
  38. package/dist/components/charts/ChartMap/mapGeometry.cjs.map +1 -0
  39. package/dist/components/charts/ChartMap/mapGeometry.js +113 -0
  40. package/dist/components/charts/ChartMap/mapGeometry.js.map +1 -0
  41. package/dist/components/charts/ChartMap/mapLabels.cjs +2 -0
  42. package/dist/components/charts/ChartMap/mapLabels.cjs.map +1 -0
  43. package/dist/components/charts/ChartMap/mapLabels.js +80 -0
  44. package/dist/components/charts/ChartMap/mapLabels.js.map +1 -0
  45. package/dist/components/charts/ChartMap/mapScales.cjs +2 -0
  46. package/dist/components/charts/ChartMap/mapScales.cjs.map +1 -0
  47. package/dist/components/charts/ChartMap/mapScales.js +131 -0
  48. package/dist/components/charts/ChartMap/mapScales.js.map +1 -0
  49. package/dist/components/charts/ChartMap/polylabel.cjs +2 -0
  50. package/dist/components/charts/ChartMap/polylabel.cjs.map +1 -0
  51. package/dist/components/charts/ChartMap/polylabel.js +50 -0
  52. package/dist/components/charts/ChartMap/polylabel.js.map +1 -0
  53. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs +2 -0
  54. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs.map +1 -0
  55. package/dist/components/charts/ChartTimeline/ChartTimeline.js +703 -0
  56. package/dist/components/charts/ChartTimeline/ChartTimeline.js.map +1 -0
  57. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs +2 -0
  58. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs.map +1 -0
  59. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js +124 -0
  60. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js.map +1 -0
  61. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs +2 -0
  62. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs.map +1 -0
  63. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js +42 -0
  64. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js.map +1 -0
  65. package/dist/components/charts/ChartTimeline/timelineLayout.cjs +2 -0
  66. package/dist/components/charts/ChartTimeline/timelineLayout.cjs.map +1 -0
  67. package/dist/components/charts/ChartTimeline/timelineLayout.js +109 -0
  68. package/dist/components/charts/ChartTimeline/timelineLayout.js.map +1 -0
  69. package/dist/components/charts/ChartTimeline/timelineTime.cjs +2 -0
  70. package/dist/components/charts/ChartTimeline/timelineTime.cjs.map +1 -0
  71. package/dist/components/charts/ChartTimeline/timelineTime.js +91 -0
  72. package/dist/components/charts/ChartTimeline/timelineTime.js.map +1 -0
  73. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs +2 -0
  74. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs.map +1 -0
  75. package/dist/components/charts/ChartTimeline/timelineTooltip.js +77 -0
  76. package/dist/components/charts/ChartTimeline/timelineTooltip.js.map +1 -0
  77. package/dist/components/charts/core/ChartLegend.cjs +1 -1
  78. package/dist/components/charts/core/ChartLegend.cjs.map +1 -1
  79. package/dist/components/charts/core/ChartLegend.js +37 -25
  80. package/dist/components/charts/core/ChartLegend.js.map +1 -1
  81. package/dist/components/charts/core/useChartMetrics.cjs +1 -1
  82. package/dist/components/charts/core/useChartMetrics.cjs.map +1 -1
  83. package/dist/components/charts/core/useChartMetrics.js +20 -25
  84. package/dist/components/charts/core/useChartMetrics.js.map +1 -1
  85. package/dist/components/data-display/List/List.cjs.map +1 -1
  86. package/dist/components/data-display/List/List.js.map +1 -1
  87. package/dist/components/data-display/List/List.module.css.cjs +1 -1
  88. package/dist/components/data-display/List/List.module.css.js +34 -24
  89. package/dist/components/data-display/List/List.module.css.js.map +1 -1
  90. package/dist/components/data-display/List/ListingOptions.cjs +1 -1
  91. package/dist/components/data-display/List/ListingOptions.cjs.map +1 -1
  92. package/dist/components/data-display/List/ListingOptions.js +98 -74
  93. package/dist/components/data-display/List/ListingOptions.js.map +1 -1
  94. package/dist/components/data-display/List/useListing.cjs.map +1 -1
  95. package/dist/components/data-display/List/useListing.js.map +1 -1
  96. package/dist/components/forms/ComboBox/ComboBox.cjs.map +1 -1
  97. package/dist/components/forms/ComboBox/ComboBox.js.map +1 -1
  98. package/dist/components/navigation/TabsNav/TabsNav.cjs +2 -0
  99. package/dist/components/navigation/TabsNav/TabsNav.cjs.map +1 -0
  100. package/dist/components/navigation/TabsNav/TabsNav.js +21 -0
  101. package/dist/components/navigation/TabsNav/TabsNav.js.map +1 -0
  102. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs +2 -0
  103. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs.map +1 -0
  104. package/dist/components/navigation/TabsNav/TabsNav.module.css.js +18 -0
  105. package/dist/components/navigation/TabsNav/TabsNav.module.css.js.map +1 -0
  106. package/dist/components/overlays/Dialog/Dialog.cjs.map +1 -1
  107. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  108. package/dist/components/overlays/Dialog/DialogFrame.cjs +1 -1
  109. package/dist/components/overlays/Dialog/DialogFrame.cjs.map +1 -1
  110. package/dist/components/overlays/Dialog/DialogFrame.js +30 -30
  111. package/dist/components/overlays/Dialog/DialogFrame.js.map +1 -1
  112. package/dist/components/overlays/Drawer/Drawer.cjs.map +1 -1
  113. package/dist/components/overlays/Drawer/Drawer.js.map +1 -1
  114. package/dist/design-system.css +1 -1
  115. package/dist/index.cjs +1 -1
  116. package/dist/index.js +184 -174
  117. package/dist/index.js.map +1 -1
  118. package/dist/types/components/charts/ChartGauge/ChartGauge.d.ts +83 -0
  119. package/dist/types/components/charts/ChartGauge/gaugeLayout.d.ts +64 -0
  120. package/dist/types/components/charts/ChartGauge/gaugeReading.d.ts +97 -0
  121. package/dist/types/components/charts/ChartGauge/gaugeScale.d.ts +38 -0
  122. package/dist/types/components/charts/ChartGauge/index.d.ts +2 -0
  123. package/dist/types/components/charts/ChartMap/ChartMap.d.ts +104 -0
  124. package/dist/types/components/charts/ChartMap/ChartMapLegend.d.ts +44 -0
  125. package/dist/types/components/charts/ChartMap/ChartMapTable.d.ts +38 -0
  126. package/dist/types/components/charts/ChartMap/index.d.ts +4 -0
  127. package/dist/types/components/charts/ChartMap/mapGeometry.d.ts +56 -0
  128. package/dist/types/components/charts/ChartMap/mapLabels.d.ts +51 -0
  129. package/dist/types/components/charts/ChartMap/mapScales.d.ts +76 -0
  130. package/dist/types/components/charts/ChartMap/polylabel.d.ts +9 -0
  131. package/dist/types/components/charts/ChartTimeline/ChartTimeline.d.ts +137 -0
  132. package/dist/types/components/charts/ChartTimeline/ChartTimelineTable.d.ts +25 -0
  133. package/dist/types/components/charts/ChartTimeline/index.d.ts +2 -0
  134. package/dist/types/components/charts/ChartTimeline/timelineLayout.d.ts +70 -0
  135. package/dist/types/components/charts/ChartTimeline/timelineTime.d.ts +16 -0
  136. package/dist/types/components/charts/ChartTimeline/timelineTooltip.d.ts +45 -0
  137. package/dist/types/components/charts/core/ChartLegend.d.ts +3 -1
  138. package/dist/types/components/data-display/List/List.d.ts +1 -1
  139. package/dist/types/components/data-display/List/useListing.d.ts +7 -1
  140. package/dist/types/components/forms/ComboBox/ComboBox.d.ts +7 -1
  141. package/dist/types/components/navigation/TabsNav/TabsNav.d.ts +20 -0
  142. package/dist/types/components/navigation/TabsNav/index.d.ts +2 -0
  143. package/dist/types/components/overlays/Dialog/Dialog.d.ts +19 -7
  144. package/dist/types/components/overlays/Dialog/DialogFrame.d.ts +8 -2
  145. package/dist/types/components/overlays/Drawer/Drawer.d.ts +2 -2
  146. package/dist/types/index.d.ts +9 -1
  147. package/dist/types/utils/formatters/formatarDuracao.d.ts +5 -0
  148. package/dist/types/utils/formatters/index.d.ts +1 -0
  149. package/dist/utils/formatters/formatarDuracao.cjs +2 -0
  150. package/dist/utils/formatters/formatarDuracao.cjs.map +1 -0
  151. package/dist/utils/formatters/formatarDuracao.js +10 -0
  152. package/dist/utils/formatters/formatarDuracao.js.map +1 -0
  153. package/package.json +3 -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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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),e=require("./TabsNav.module.css.cjs");function d({as:s="a",className:t,current:n,fitted:i=!1,items:u,label:o,...c}){return l.jsx("nav",{...c,"aria-label":o,className:[e.default.tabsNav,i&&e.default.fitted,t].filter(Boolean).join(" "),children:l.jsx("ul",{className:e.default.list,children:u.map(a=>{const r=a.key===n;return l.jsx("li",{className:e.default.item,children:l.jsx(s,{"aria-current":r?"page":void 0,className:[e.default.link,r&&e.default.current].filter(Boolean).join(" "),href:a.href,...a.linkProps,children:a.label})},a.key)})})})}exports.TabsNav=d;
2
+ //# sourceMappingURL=TabsNav.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsNav.cjs","sources":["../../../../src/components/navigation/TabsNav/TabsNav.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ElementType } from 'react';\nimport styles from './TabsNav.module.css';\n\nexport interface TabsNavItem {\n href?: string;\n key: string;\n label: string;\n /** Propriedades entregues inteiras ao componente de link, para o roteador que não usa `href`. */\n linkProps?: Record<string, unknown>;\n}\n\nexport interface TabsNavProps extends Omit<ComponentPropsWithRef<'nav'>, 'aria-label'> {\n /** Componente de link da aplicação, para não acoplar o sistema a um roteador. */\n as?: ElementType;\n /** Chave da aba do endereço atual. */\n current: string;\n /** As abas dividem a largura em partes iguais, em vez de ficar do tamanho do rótulo. */\n fitted?: boolean;\n items: readonly TabsNavItem[];\n label: string;\n}\n\n/** Abas que são endereços: cada uma é um link, e a da página atual leva `aria-current=\"page\"`. */\nexport function TabsNav({ as: Link = 'a', className, current, fitted = false, items, label, ...props }: TabsNavProps) {\n return (\n <nav {...props} aria-label={label} className={[styles.tabsNav, fitted && styles.fitted, className].filter(Boolean).join(' ')}>\n <ul className={styles.list}>\n {items.map((item) => {\n const atual = item.key === current;\n\n return (\n <li className={styles.item} key={item.key}>\n <Link\n aria-current={atual ? 'page' : undefined}\n className={[styles.link, atual && styles.current].filter(Boolean).join(' ')}\n href={item.href}\n {...item.linkProps}\n >\n {item.label}\n </Link>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"],"names":["TabsNav","Link","className","current","fitted","items","label","props","jsx","styles","item","atual"],"mappings":"2JAuBO,SAASA,EAAQ,CAAE,GAAIC,EAAO,IAAK,UAAAC,EAAW,QAAAC,EAAS,OAAAC,EAAS,GAAO,MAAAC,EAAO,MAAAC,EAAO,GAAGC,GAAuB,CACpH,OACEC,EAAAA,IAAC,MAAA,CAAK,GAAGD,EAAO,aAAYD,EAAO,UAAW,CAACG,EAAAA,QAAO,QAASL,GAAUK,EAAAA,QAAO,OAAQP,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACzH,SAAAM,EAAAA,IAAC,KAAA,CAAG,UAAWC,EAAAA,QAAO,KACnB,SAAAJ,EAAM,IAAKK,GAAS,CACnB,MAAMC,EAAQD,EAAK,MAAQP,EAE3B,OACEK,EAAAA,IAAC,KAAA,CAAG,UAAWC,EAAAA,QAAO,KACpB,SAAAD,EAAAA,IAACP,EAAA,CACC,eAAcU,EAAQ,OAAS,OAC/B,UAAW,CAACF,EAAAA,QAAO,KAAME,GAASF,EAAAA,QAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC1E,KAAMC,EAAK,KACV,GAAGA,EAAK,UAER,SAAAA,EAAK,KAAA,CAAA,CACR,EAR+BA,EAAK,GAStC,CAEJ,CAAC,EACH,EACF,CAEJ"}
@@ -0,0 +1,21 @@
1
+ import { jsx as l } from "react/jsx-runtime";
2
+ import a from "./TabsNav.module.css.js";
3
+ function h({ as: n = "a", className: s, current: i, fitted: o = !1, items: t, label: c, ...f }) {
4
+ return /* @__PURE__ */ l("nav", { ...f, "aria-label": c, className: [a.tabsNav, o && a.fitted, s].filter(Boolean).join(" "), children: /* @__PURE__ */ l("ul", { className: a.list, children: t.map((e) => {
5
+ const r = e.key === i;
6
+ return /* @__PURE__ */ l("li", { className: a.item, children: /* @__PURE__ */ l(
7
+ n,
8
+ {
9
+ "aria-current": r ? "page" : void 0,
10
+ className: [a.link, r && a.current].filter(Boolean).join(" "),
11
+ href: e.href,
12
+ ...e.linkProps,
13
+ children: e.label
14
+ }
15
+ ) }, e.key);
16
+ }) }) });
17
+ }
18
+ export {
19
+ h as TabsNav
20
+ };
21
+ //# sourceMappingURL=TabsNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsNav.js","sources":["../../../../src/components/navigation/TabsNav/TabsNav.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ElementType } from 'react';\nimport styles from './TabsNav.module.css';\n\nexport interface TabsNavItem {\n href?: string;\n key: string;\n label: string;\n /** Propriedades entregues inteiras ao componente de link, para o roteador que não usa `href`. */\n linkProps?: Record<string, unknown>;\n}\n\nexport interface TabsNavProps extends Omit<ComponentPropsWithRef<'nav'>, 'aria-label'> {\n /** Componente de link da aplicação, para não acoplar o sistema a um roteador. */\n as?: ElementType;\n /** Chave da aba do endereço atual. */\n current: string;\n /** As abas dividem a largura em partes iguais, em vez de ficar do tamanho do rótulo. */\n fitted?: boolean;\n items: readonly TabsNavItem[];\n label: string;\n}\n\n/** Abas que são endereços: cada uma é um link, e a da página atual leva `aria-current=\"page\"`. */\nexport function TabsNav({ as: Link = 'a', className, current, fitted = false, items, label, ...props }: TabsNavProps) {\n return (\n <nav {...props} aria-label={label} className={[styles.tabsNav, fitted && styles.fitted, className].filter(Boolean).join(' ')}>\n <ul className={styles.list}>\n {items.map((item) => {\n const atual = item.key === current;\n\n return (\n <li className={styles.item} key={item.key}>\n <Link\n aria-current={atual ? 'page' : undefined}\n className={[styles.link, atual && styles.current].filter(Boolean).join(' ')}\n href={item.href}\n {...item.linkProps}\n >\n {item.label}\n </Link>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"],"names":["TabsNav","Link","className","current","fitted","items","label","props","jsx","styles","item","atual"],"mappings":";;AAuBO,SAASA,EAAQ,EAAE,IAAIC,IAAO,KAAK,WAAAC,GAAW,SAAAC,GAAS,QAAAC,IAAS,IAAO,OAAAC,GAAO,OAAAC,GAAO,GAAGC,KAAuB;AACpH,SACE,gBAAAC,EAAC,OAAA,EAAK,GAAGD,GAAO,cAAYD,GAAO,WAAW,CAACG,EAAO,SAASL,KAAUK,EAAO,QAAQP,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACzH,UAAA,gBAAAM,EAAC,MAAA,EAAG,WAAWC,EAAO,MACnB,UAAAJ,EAAM,IAAI,CAACK,MAAS;AACnB,UAAMC,IAAQD,EAAK,QAAQP;AAE3B,WACE,gBAAAK,EAAC,MAAA,EAAG,WAAWC,EAAO,MACpB,UAAA,gBAAAD;AAAA,MAACP;AAAA,MAAA;AAAA,QACC,gBAAcU,IAAQ,SAAS;AAAA,QAC/B,WAAW,CAACF,EAAO,MAAME,KAASF,EAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC1E,MAAMC,EAAK;AAAA,QACV,GAAGA,EAAK;AAAA,QAER,UAAAA,EAAK;AAAA,MAAA;AAAA,IAAA,EACR,GAR+BA,EAAK,GAStC;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t="_tabsNav_13l4d_2",e="_list_13l4d_6",_="_item_13l4d_16",i="_link_13l4d_21 _tab_cf8v3_1",l="_current_13l4d_26 _active_cf8v3_17",s="_fitted_13l4d_31",n={tabsNav:t,list:e,item:_,link:i,current:l,fitted:s};exports.current=l;exports.default=n;exports.fitted=s;exports.item=_;exports.link=i;exports.list=e;exports.tabsNav=t;
2
+ //# sourceMappingURL=TabsNav.module.css.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsNav.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ const t = "_tabsNav_13l4d_2", _ = "_list_13l4d_6", s = "_item_13l4d_16", l = "_link_13l4d_21 _tab_cf8v3_1", c = "_current_13l4d_26 _active_cf8v3_17", e = "_fitted_13l4d_31", i = {
2
+ tabsNav: t,
3
+ list: _,
4
+ item: s,
5
+ link: l,
6
+ current: c,
7
+ fitted: e
8
+ };
9
+ export {
10
+ c as current,
11
+ i as default,
12
+ e as fitted,
13
+ s as item,
14
+ l as link,
15
+ _ as list,
16
+ t as tabsNav
17
+ };
18
+ //# sourceMappingURL=TabsNav.module.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabsNav.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.cjs","sources":["../../../../src/components/overlays/Dialog/Dialog.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { DialogFrame } from './DialogFrame';\nimport styles from './Dialog.module.css';\n\nexport type DialogSize = 'sm' | 'md' | 'lg';\nexport type DialogRole = 'dialog' | 'alertdialog';\n\n/** As propriedades nativas vao ao elemento do dialogo; o `className` soma ao do sistema. */\nexport interface DialogProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'role' | 'title'> {\n children?: ReactNode;\n description?: string;\n dismissable?: boolean;\n footer?: ReactNode;\n /** Opcional. Desenhado ao lado do titulo, fora da leitura: quem fala e o titulo. */\n icon?: ReactNode;\n onClose: () => void;\n open: boolean;\n /** `alertdialog` para a confirmacao que interrompe e exige resposta, como a de uma acao destrutiva. */\n role?: DialogRole;\n size?: DialogSize;\n title: string;\n}\n\nexport function Dialog({ size = 'md', ...props }: DialogProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.dialog, styles[size]].join(' ')}\n underlayClassName={styles.underlay}\n />\n );\n}\n"],"names":["Dialog","size","props","jsx","DialogFrame","styles"],"mappings":"yLAuBO,SAASA,EAAO,CAAE,KAAAC,EAAO,KAAM,GAAGC,GAAsB,CAC7D,OACEC,EAAAA,IAACC,EAAAA,YAAA,CACE,GAAGF,EACJ,iBAAkB,CAACG,EAAAA,QAAO,OAAQA,EAAAA,QAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG,EACxD,kBAAmBI,EAAAA,QAAO,QAAA,CAAA,CAGhC"}
1
+ {"version":3,"file":"Dialog.cjs","sources":["../../../../src/components/overlays/Dialog/Dialog.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { DialogFrame } from './DialogFrame';\nimport styles from './Dialog.module.css';\n\nexport type DialogSize = 'sm' | 'md' | 'lg';\nexport type DialogRole = 'dialog' | 'alertdialog';\n\n/** O que o `Dialog` e o `Drawer` compartilham. As propriedades nativas vao ao elemento do dialogo. */\nexport interface DialogBaseProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'children' | 'role' | 'title'> {\n children?: ReactNode;\n dismissable?: boolean;\n footer?: ReactNode;\n onClose: () => void;\n open: boolean;\n}\n\nexport interface DialogTitledProps {\n 'aria-label'?: never;\n description?: string;\n /** Opcional. Desenhado ao lado do titulo, fora da leitura: quem fala e o titulo. */\n icon?: ReactNode;\n title: string;\n}\n\n/** Sem titulo, sem cabecalho: o nome vem do `aria-label`, como na paleta de busca. Esc continua fechando. */\nexport interface DialogUntitledProps {\n 'aria-label': string;\n description?: never;\n icon?: never;\n title?: never;\n}\n\nexport type DialogProps = DialogBaseProps &\n (DialogTitledProps | DialogUntitledProps) & {\n /** `alertdialog` para a confirmacao que interrompe e exige resposta, como a de uma acao destrutiva. */\n role?: DialogRole;\n size?: DialogSize;\n };\n\nexport function Dialog({ size = 'md', ...props }: DialogProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.dialog, styles[size]].join(' ')}\n underlayClassName={styles.underlay}\n />\n );\n}\n"],"names":["Dialog","size","props","jsx","DialogFrame","styles"],"mappings":"yLAuCO,SAASA,EAAO,CAAE,KAAAC,EAAO,KAAM,GAAGC,GAAsB,CAC7D,OACEC,EAAAA,IAACC,EAAAA,YAAA,CACE,GAAGF,EACJ,iBAAkB,CAACG,EAAAA,QAAO,OAAQA,EAAAA,QAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG,EACxD,kBAAmBI,EAAAA,QAAO,QAAA,CAAA,CAGhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","sources":["../../../../src/components/overlays/Dialog/Dialog.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { DialogFrame } from './DialogFrame';\nimport styles from './Dialog.module.css';\n\nexport type DialogSize = 'sm' | 'md' | 'lg';\nexport type DialogRole = 'dialog' | 'alertdialog';\n\n/** As propriedades nativas vao ao elemento do dialogo; o `className` soma ao do sistema. */\nexport interface DialogProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'role' | 'title'> {\n children?: ReactNode;\n description?: string;\n dismissable?: boolean;\n footer?: ReactNode;\n /** Opcional. Desenhado ao lado do titulo, fora da leitura: quem fala e o titulo. */\n icon?: ReactNode;\n onClose: () => void;\n open: boolean;\n /** `alertdialog` para a confirmacao que interrompe e exige resposta, como a de uma acao destrutiva. */\n role?: DialogRole;\n size?: DialogSize;\n title: string;\n}\n\nexport function Dialog({ size = 'md', ...props }: DialogProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.dialog, styles[size]].join(' ')}\n underlayClassName={styles.underlay}\n />\n );\n}\n"],"names":["Dialog","size","props","jsx","DialogFrame","styles"],"mappings":";;;AAuBO,SAASA,EAAO,EAAE,MAAAC,IAAO,MAAM,GAAGC,KAAsB;AAC7D,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGF;AAAA,MACJ,kBAAkB,CAACG,EAAO,QAAQA,EAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MACxD,mBAAmBI,EAAO;AAAA,IAAA;AAAA,EAAA;AAGhC;"}
1
+ {"version":3,"file":"Dialog.js","sources":["../../../../src/components/overlays/Dialog/Dialog.tsx"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\nimport { DialogFrame } from './DialogFrame';\nimport styles from './Dialog.module.css';\n\nexport type DialogSize = 'sm' | 'md' | 'lg';\nexport type DialogRole = 'dialog' | 'alertdialog';\n\n/** O que o `Dialog` e o `Drawer` compartilham. As propriedades nativas vao ao elemento do dialogo. */\nexport interface DialogBaseProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'children' | 'role' | 'title'> {\n children?: ReactNode;\n dismissable?: boolean;\n footer?: ReactNode;\n onClose: () => void;\n open: boolean;\n}\n\nexport interface DialogTitledProps {\n 'aria-label'?: never;\n description?: string;\n /** Opcional. Desenhado ao lado do titulo, fora da leitura: quem fala e o titulo. */\n icon?: ReactNode;\n title: string;\n}\n\n/** Sem titulo, sem cabecalho: o nome vem do `aria-label`, como na paleta de busca. Esc continua fechando. */\nexport interface DialogUntitledProps {\n 'aria-label': string;\n description?: never;\n icon?: never;\n title?: never;\n}\n\nexport type DialogProps = DialogBaseProps &\n (DialogTitledProps | DialogUntitledProps) & {\n /** `alertdialog` para a confirmacao que interrompe e exige resposta, como a de uma acao destrutiva. */\n role?: DialogRole;\n size?: DialogSize;\n };\n\nexport function Dialog({ size = 'md', ...props }: DialogProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.dialog, styles[size]].join(' ')}\n underlayClassName={styles.underlay}\n />\n );\n}\n"],"names":["Dialog","size","props","jsx","DialogFrame","styles"],"mappings":";;;AAuCO,SAASA,EAAO,EAAE,MAAAC,IAAO,MAAM,GAAGC,KAAsB;AAC7D,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGF;AAAA,MACJ,kBAAkB,CAACG,EAAO,QAAQA,EAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MACxD,mBAAmBI,EAAO;AAAA,IAAA;AAAA,EAAA;AAGhC;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react"),q=require("react-dom"),F=require("@react-aria/focus"),d=require("@react-aria/overlays"),I=require("../../../hooks/useMergedRefs.cjs"),r=require("./Dialog.module.css.cjs"),P=require("../../icons/icons.cjs");function R({open:s,...t}){return!s||typeof document>"u"?null:q.createPortal(e.jsx(O,{...t}),document.body)}function O({children:s,className:t,description:i,dismissable:o=!0,footer:n,icon:c,onClose:u,ref:h,role:x="dialog",surfaceClassName:v,title:y,underlayClassName:b,...g}){const a=l.useRef(null),p=I.useMergedRefs(a,h),f=l.useId(),m=`${f}-title`,j=`${f}-description`,{overlayProps:N,underlayProps:D}=d.useOverlay({isOpen:!0,onClose:u,isDismissable:o,isKeyboardDismissDisabled:!o},a);return d.usePreventScroll(),l.useEffect(()=>a.current?d.ariaHideOutside([a.current]):void 0,[]),e.jsx("div",{...D,className:b,children:e.jsx(F.FocusScope,{contain:!0,restoreFocus:!0,autoFocus:!0,children:e.jsxs("div",{...g,...N,ref:p,className:[v,t].filter(Boolean).join(" "),role:x,"aria-modal":"true","aria-labelledby":m,"aria-describedby":i?j:void 0,children:[e.jsxs("header",{className:[r.default.header,s&&r.default.headerDivided].filter(Boolean).join(" "),children:[c&&e.jsx("span",{"aria-hidden":"true",className:r.default.icon,children:c}),e.jsxs("div",{className:r.default.heading,children:[e.jsx("h2",{className:r.default.title,id:m,children:y}),i&&e.jsx("p",{className:r.default.description,id:j,children:i})]}),o&&e.jsx("button",{className:r.default.close,type:"button","aria-label":"Fechar",onClick:u,children:e.jsx(P.IconClose,{size:20})})]}),s&&e.jsx("div",{className:r.default.body,children:s}),n&&e.jsx("div",{className:r.default.footer,children:n})]})})})}exports.DialogFrame=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react"),q=require("react-dom"),F=require("@react-aria/focus"),n=require("@react-aria/overlays"),I=require("../../../hooks/useMergedRefs.cjs"),r=require("./Dialog.module.css.cjs"),P=require("../../icons/icons.cjs");function R({open:s,...t}){return!s||typeof document>"u"?null:q.createPortal(e.jsx(O,{...t}),document.body)}function O({children:s,className:t,description:i,dismissable:o=!0,footer:c,icon:u,onClose:f,ref:v,role:x="dialog",surfaceClassName:y,title:d,underlayClassName:b,...g}){const a=l.useRef(null),p=I.useMergedRefs(a,v),m=l.useId(),j=`${m}-title`,h=`${m}-description`,{overlayProps:N,underlayProps:D}=n.useOverlay({isOpen:!0,onClose:f,isDismissable:o,isKeyboardDismissDisabled:!o},a);return n.usePreventScroll(),l.useEffect(()=>a.current?n.ariaHideOutside([a.current]):void 0,[]),e.jsx("div",{...D,className:b,children:e.jsx(F.FocusScope,{contain:!0,restoreFocus:!0,autoFocus:!0,children:e.jsxs("div",{...g,...N,ref:p,className:[y,t].filter(Boolean).join(" "),role:x,"aria-modal":"true","aria-labelledby":d?j:void 0,"aria-describedby":i?h:void 0,children:[d&&e.jsxs("header",{className:[r.default.header,s&&r.default.headerDivided].filter(Boolean).join(" "),children:[u&&e.jsx("span",{"aria-hidden":"true",className:r.default.icon,children:u}),e.jsxs("div",{className:r.default.heading,children:[e.jsx("h2",{className:r.default.title,id:j,children:d}),i&&e.jsx("p",{className:r.default.description,id:h,children:i})]}),o&&e.jsx("button",{className:r.default.close,type:"button","aria-label":"Fechar",onClick:f,children:e.jsx(P.IconClose,{size:20})})]}),s&&e.jsx("div",{className:r.default.body,children:s}),c&&e.jsx("div",{className:r.default.footer,children:c})]})})})}exports.DialogFrame=R;
2
2
  //# sourceMappingURL=DialogFrame.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DialogFrame.cjs","sources":["../../../../src/components/overlays/Dialog/DialogFrame.tsx"],"sourcesContent":["import { useEffect, useId, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { ariaHideOutside, useOverlay, usePreventScroll } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { IconClose } from '../../icons';\nimport type { DialogProps } from './Dialog';\nimport styles from './Dialog.module.css';\n\nexport interface DialogFrameProps extends Omit<DialogProps, 'size'> {\n surfaceClassName: string;\n underlayClassName: string;\n}\n\n/** Mecanica modal do `Dialog` e do `Drawer`: portal, foco preso, rolagem travada, cabecalho, corpo e rodape. Interna. */\nexport function DialogFrame({ open, ...props }: DialogFrameProps) {\n // No servidor nao ha `document` para o portal; o modal nasce na hidratacao.\n if (!open || typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<DialogFrameContent {...props} />, document.body);\n}\n\nfunction DialogFrameContent({\n children,\n className,\n description,\n dismissable = true,\n footer,\n icon,\n onClose,\n ref: refDoConsumidor,\n role = 'dialog',\n surfaceClassName,\n title,\n underlayClassName,\n ...props\n}: Omit<DialogFrameProps, 'open'>) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const generatedId = useId();\n const titleId = `${generatedId}-title`;\n const descriptionId = `${generatedId}-description`;\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: dismissable,\n isKeyboardDismissDisabled: !dismissable,\n },\n ref,\n );\n\n usePreventScroll();\n\n useEffect(() => (ref.current ? ariaHideOutside([ref.current]) : undefined), []);\n\n return (\n <div {...underlayProps} className={underlayClassName}>\n <FocusScope contain restoreFocus autoFocus>\n <div\n {...props}\n {...overlayProps}\n ref={mergedRef}\n className={[surfaceClassName, className].filter(Boolean).join(' ')}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n <header className={[styles.header, children && styles.headerDivided].filter(Boolean).join(' ')}>\n {icon && (\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n )}\n <div className={styles.heading}>\n <h2 className={styles.title} id={titleId}>{title}</h2>\n {description && <p className={styles.description} id={descriptionId}>{description}</p>}\n </div>\n {dismissable && (\n <button className={styles.close} type=\"button\" aria-label=\"Fechar\" onClick={onClose}>\n <IconClose size={20} />\n </button>\n )}\n </header>\n {children && <div className={styles.body}>{children}</div>}\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </FocusScope>\n </div>\n );\n}\n"],"names":["DialogFrame","open","props","createPortal","jsx","DialogFrameContent","children","className","description","dismissable","footer","icon","onClose","refDoConsumidor","role","surfaceClassName","title","underlayClassName","ref","useRef","mergedRef","useMergedRefs","generatedId","useId","titleId","descriptionId","overlayProps","underlayProps","useOverlay","usePreventScroll","useEffect","ariaHideOutside","FocusScope","jsxs","styles","IconClose"],"mappings":"sVAeO,SAASA,EAAY,CAAE,KAAAC,EAAM,GAAGC,GAA2B,CAEhE,MAAI,CAACD,GAAQ,OAAO,SAAa,IACxB,KAGFE,EAAAA,aAAaC,EAAAA,IAACC,EAAA,CAAoB,GAAGH,EAAO,EAAI,SAAS,IAAI,CACtE,CAEA,SAASG,EAAmB,CAC1B,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,YAAAC,EAAc,GACd,OAAAC,EACA,KAAAC,EACA,QAAAC,EACA,IAAKC,EACL,KAAAC,EAAO,SACP,iBAAAC,EACA,MAAAC,EACA,kBAAAC,EACA,GAAGf,CACL,EAAmC,CACjC,MAAMgB,EAAMC,EAAAA,OAAuB,IAAI,EACjCC,EAAYC,EAAAA,cAAcH,EAAKL,CAAe,EAC9CS,EAAcC,EAAAA,MAAA,EACdC,EAAU,GAAGF,CAAW,SACxBG,EAAgB,GAAGH,CAAW,eAE9B,CAAE,aAAAI,EAAc,cAAAC,CAAA,EAAkBC,EAAAA,WACtC,CACE,OAAQ,GACR,QAAAhB,EACA,cAAeH,EACf,0BAA2B,CAACA,CAAA,EAE9BS,CAAA,EAGFW,OAAAA,mBAAA,EAEAC,YAAU,IAAOZ,EAAI,QAAUa,EAAAA,gBAAgB,CAACb,EAAI,OAAO,CAAC,EAAI,OAAY,EAAE,EAG5Ed,EAAAA,IAAC,MAAA,CAAK,GAAGuB,EAAe,UAAWV,EACjC,SAAAb,EAAAA,IAAC4B,EAAAA,WAAA,CAAW,QAAO,GAAC,aAAY,GAAC,UAAS,GACxC,SAAAC,EAAAA,KAAC,MAAA,CACE,GAAG/B,EACH,GAAGwB,EACJ,IAAKN,EACL,UAAW,CAACL,EAAkBR,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACjE,KAAAO,EACA,aAAW,OACX,kBAAiBU,EACjB,mBAAkBhB,EAAciB,EAAgB,OAEhD,SAAA,CAAAQ,EAAAA,KAAC,SAAA,CAAO,UAAW,CAACC,EAAAA,QAAO,OAAQ5B,GAAY4B,EAAAA,QAAO,aAAa,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC1F,SAAA,CAAAvB,SACE,OAAA,CAAK,cAAY,OAAO,UAAWuB,UAAO,KACxC,SAAAvB,CAAA,CACH,EAEFsB,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAAA,QAAO,QACrB,SAAA,CAAA9B,MAAC,MAAG,UAAW8B,EAAAA,QAAO,MAAO,GAAIV,EAAU,SAAAR,EAAM,EAChDR,SAAgB,IAAA,CAAE,UAAW0B,EAAAA,QAAO,YAAa,GAAIT,EAAgB,SAAAjB,CAAA,CAAY,CAAA,EACpF,EACCC,GACCL,EAAAA,IAAC,SAAA,CAAO,UAAW8B,EAAAA,QAAO,MAAO,KAAK,SAAS,aAAW,SAAS,QAAStB,EAC1E,SAAAR,EAAAA,IAAC+B,EAAAA,UAAA,CAAU,KAAM,GAAI,CAAA,CACvB,CAAA,EAEJ,EACC7B,GAAYF,EAAAA,IAAC,MAAA,CAAI,UAAW8B,UAAO,KAAO,SAAA5B,EAAS,EACnDI,GAAUN,EAAAA,IAAC,MAAA,CAAI,UAAW8B,EAAAA,QAAO,OAAS,SAAAxB,CAAA,CAAO,CAAA,CAAA,CAAA,EAEtD,CAAA,CACF,CAEJ"}
1
+ {"version":3,"file":"DialogFrame.cjs","sources":["../../../../src/components/overlays/Dialog/DialogFrame.tsx"],"sourcesContent":["import { useEffect, useId, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { ariaHideOutside, useOverlay, usePreventScroll } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { IconClose } from '../../icons';\nimport type { DialogBaseProps, DialogRole } from './Dialog';\nimport styles from './Dialog.module.css';\n\nexport interface DialogFrameProps extends DialogBaseProps {\n 'aria-label'?: string;\n description?: string;\n icon?: ReactNode;\n role?: DialogRole;\n surfaceClassName: string;\n title?: string;\n underlayClassName: string;\n}\n\n/** Mecanica modal do `Dialog` e do `Drawer`: portal, foco preso, rolagem travada, cabecalho, corpo e rodape. Interna. */\nexport function DialogFrame({ open, ...props }: DialogFrameProps) {\n // No servidor nao ha `document` para o portal; o modal nasce na hidratacao.\n if (!open || typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<DialogFrameContent {...props} />, document.body);\n}\n\nfunction DialogFrameContent({\n children,\n className,\n description,\n dismissable = true,\n footer,\n icon,\n onClose,\n ref: refDoConsumidor,\n role = 'dialog',\n surfaceClassName,\n title,\n underlayClassName,\n ...props\n}: Omit<DialogFrameProps, 'open'>) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const generatedId = useId();\n const titleId = `${generatedId}-title`;\n const descriptionId = `${generatedId}-description`;\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: dismissable,\n isKeyboardDismissDisabled: !dismissable,\n },\n ref,\n );\n\n usePreventScroll();\n\n useEffect(() => (ref.current ? ariaHideOutside([ref.current]) : undefined), []);\n\n return (\n <div {...underlayProps} className={underlayClassName}>\n <FocusScope contain restoreFocus autoFocus>\n <div\n {...props}\n {...overlayProps}\n ref={mergedRef}\n className={[surfaceClassName, className].filter(Boolean).join(' ')}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n >\n {title && (\n <header className={[styles.header, children && styles.headerDivided].filter(Boolean).join(' ')}>\n {icon && (\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n )}\n <div className={styles.heading}>\n <h2 className={styles.title} id={titleId}>{title}</h2>\n {description && <p className={styles.description} id={descriptionId}>{description}</p>}\n </div>\n {dismissable && (\n <button className={styles.close} type=\"button\" aria-label=\"Fechar\" onClick={onClose}>\n <IconClose size={20} />\n </button>\n )}\n </header>\n )}\n {children && <div className={styles.body}>{children}</div>}\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </FocusScope>\n </div>\n );\n}\n"],"names":["DialogFrame","open","props","createPortal","jsx","DialogFrameContent","children","className","description","dismissable","footer","icon","onClose","refDoConsumidor","role","surfaceClassName","title","underlayClassName","ref","useRef","mergedRef","useMergedRefs","generatedId","useId","titleId","descriptionId","overlayProps","underlayProps","useOverlay","usePreventScroll","useEffect","ariaHideOutside","FocusScope","jsxs","styles","IconClose"],"mappings":"sVAoBO,SAASA,EAAY,CAAE,KAAAC,EAAM,GAAGC,GAA2B,CAEhE,MAAI,CAACD,GAAQ,OAAO,SAAa,IACxB,KAGFE,EAAAA,aAAaC,EAAAA,IAACC,EAAA,CAAoB,GAAGH,EAAO,EAAI,SAAS,IAAI,CACtE,CAEA,SAASG,EAAmB,CAC1B,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,YAAAC,EAAc,GACd,OAAAC,EACA,KAAAC,EACA,QAAAC,EACA,IAAKC,EACL,KAAAC,EAAO,SACP,iBAAAC,EACA,MAAAC,EACA,kBAAAC,EACA,GAAGf,CACL,EAAmC,CACjC,MAAMgB,EAAMC,EAAAA,OAAuB,IAAI,EACjCC,EAAYC,EAAAA,cAAcH,EAAKL,CAAe,EAC9CS,EAAcC,EAAAA,MAAA,EACdC,EAAU,GAAGF,CAAW,SACxBG,EAAgB,GAAGH,CAAW,eAE9B,CAAE,aAAAI,EAAc,cAAAC,CAAA,EAAkBC,EAAAA,WACtC,CACE,OAAQ,GACR,QAAAhB,EACA,cAAeH,EACf,0BAA2B,CAACA,CAAA,EAE9BS,CAAA,EAGFW,OAAAA,mBAAA,EAEAC,YAAU,IAAOZ,EAAI,QAAUa,EAAAA,gBAAgB,CAACb,EAAI,OAAO,CAAC,EAAI,OAAY,EAAE,EAG5Ed,EAAAA,IAAC,MAAA,CAAK,GAAGuB,EAAe,UAAWV,EACjC,SAAAb,EAAAA,IAAC4B,EAAAA,WAAA,CAAW,QAAO,GAAC,aAAY,GAAC,UAAS,GACxC,SAAAC,EAAAA,KAAC,MAAA,CACE,GAAG/B,EACH,GAAGwB,EACJ,IAAKN,EACL,UAAW,CAACL,EAAkBR,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EACjE,KAAAO,EACA,aAAW,OACX,kBAAiBE,EAAQQ,EAAU,OACnC,mBAAkBhB,EAAciB,EAAgB,OAE/C,SAAA,CAAAT,GACCiB,EAAAA,KAAC,SAAA,CAAO,UAAW,CAACC,EAAAA,QAAO,OAAQ5B,GAAY4B,EAAAA,QAAO,aAAa,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC1F,SAAA,CAAAvB,SACE,OAAA,CAAK,cAAY,OAAO,UAAWuB,UAAO,KACxC,SAAAvB,CAAA,CACH,EAEFsB,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAAA,QAAO,QACrB,SAAA,CAAA9B,MAAC,MAAG,UAAW8B,EAAAA,QAAO,MAAO,GAAIV,EAAU,SAAAR,EAAM,EAChDR,SAAgB,IAAA,CAAE,UAAW0B,EAAAA,QAAO,YAAa,GAAIT,EAAgB,SAAAjB,CAAA,CAAY,CAAA,EACpF,EACCC,GACCL,EAAAA,IAAC,SAAA,CAAO,UAAW8B,EAAAA,QAAO,MAAO,KAAK,SAAS,aAAW,SAAS,QAAStB,EAC1E,SAAAR,EAAAA,IAAC+B,EAAAA,UAAA,CAAU,KAAM,GAAI,CAAA,CACvB,CAAA,EAEJ,EAED7B,GAAYF,EAAAA,IAAC,MAAA,CAAI,UAAW8B,UAAO,KAAO,SAAA5B,EAAS,EACnDI,GAAUN,EAAAA,IAAC,MAAA,CAAI,UAAW8B,EAAAA,QAAO,OAAS,SAAAxB,CAAA,CAAO,CAAA,CAAA,CAAA,EAEtD,CAAA,CACF,CAEJ"}
@@ -6,55 +6,55 @@ import { useOverlay as R, usePreventScroll as B, ariaHideOutside as C } from "@r
6
6
  import { useMergedRefs as S } from "../../../hooks/useMergedRefs.js";
7
7
  import r from "./Dialog.module.css.js";
8
8
  import { IconClose as $ } from "../../icons/icons.js";
9
- function G({ open: i, ...t }) {
10
- return !i || typeof document > "u" ? null : x(/* @__PURE__ */ e(k, { ...t }), document.body);
9
+ function G({ open: o, ...a }) {
10
+ return !o || typeof document > "u" ? null : x(/* @__PURE__ */ e(k, { ...a }), document.body);
11
11
  }
12
12
  function k({
13
- children: i,
14
- className: t,
15
- description: a,
16
- dismissable: s = !0,
17
- footer: d,
18
- icon: l,
19
- onClose: c,
20
- ref: p,
21
- role: h = "dialog",
22
- surfaceClassName: v,
23
- title: y,
13
+ children: o,
14
+ className: a,
15
+ description: s,
16
+ dismissable: t = !0,
17
+ footer: l,
18
+ icon: c,
19
+ onClose: u,
20
+ ref: h,
21
+ role: v = "dialog",
22
+ surfaceClassName: y,
23
+ title: d,
24
24
  underlayClassName: b,
25
25
  ...N
26
26
  }) {
27
- const o = I(null), g = S(o, p), u = j(), m = `${u}-title`, f = `${u}-description`, { overlayProps: D, underlayProps: F } = R(
27
+ const i = I(null), g = S(i, h), m = j(), f = `${m}-title`, p = `${m}-description`, { overlayProps: D, underlayProps: F } = R(
28
28
  {
29
29
  isOpen: !0,
30
- onClose: c,
31
- isDismissable: s,
32
- isKeyboardDismissDisabled: !s
30
+ onClose: u,
31
+ isDismissable: t,
32
+ isKeyboardDismissDisabled: !t
33
33
  },
34
- o
34
+ i
35
35
  );
36
- return B(), P(() => o.current ? C([o.current]) : void 0, []), /* @__PURE__ */ e("div", { ...F, className: b, children: /* @__PURE__ */ e(O, { contain: !0, restoreFocus: !0, autoFocus: !0, children: /* @__PURE__ */ n(
36
+ return B(), P(() => i.current ? C([i.current]) : void 0, []), /* @__PURE__ */ e("div", { ...F, className: b, children: /* @__PURE__ */ e(O, { contain: !0, restoreFocus: !0, autoFocus: !0, children: /* @__PURE__ */ n(
37
37
  "div",
38
38
  {
39
39
  ...N,
40
40
  ...D,
41
41
  ref: g,
42
- className: [v, t].filter(Boolean).join(" "),
43
- role: h,
42
+ className: [y, a].filter(Boolean).join(" "),
43
+ role: v,
44
44
  "aria-modal": "true",
45
- "aria-labelledby": m,
46
- "aria-describedby": a ? f : void 0,
45
+ "aria-labelledby": d ? f : void 0,
46
+ "aria-describedby": s ? p : void 0,
47
47
  children: [
48
- /* @__PURE__ */ n("header", { className: [r.header, i && r.headerDivided].filter(Boolean).join(" "), children: [
49
- l && /* @__PURE__ */ e("span", { "aria-hidden": "true", className: r.icon, children: l }),
48
+ d && /* @__PURE__ */ n("header", { className: [r.header, o && r.headerDivided].filter(Boolean).join(" "), children: [
49
+ c && /* @__PURE__ */ e("span", { "aria-hidden": "true", className: r.icon, children: c }),
50
50
  /* @__PURE__ */ n("div", { className: r.heading, children: [
51
- /* @__PURE__ */ e("h2", { className: r.title, id: m, children: y }),
52
- a && /* @__PURE__ */ e("p", { className: r.description, id: f, children: a })
51
+ /* @__PURE__ */ e("h2", { className: r.title, id: f, children: d }),
52
+ s && /* @__PURE__ */ e("p", { className: r.description, id: p, children: s })
53
53
  ] }),
54
- s && /* @__PURE__ */ e("button", { className: r.close, type: "button", "aria-label": "Fechar", onClick: c, children: /* @__PURE__ */ e($, { size: 20 }) })
54
+ t && /* @__PURE__ */ e("button", { className: r.close, type: "button", "aria-label": "Fechar", onClick: u, children: /* @__PURE__ */ e($, { size: 20 }) })
55
55
  ] }),
56
- i && /* @__PURE__ */ e("div", { className: r.body, children: i }),
57
- d && /* @__PURE__ */ e("div", { className: r.footer, children: d })
56
+ o && /* @__PURE__ */ e("div", { className: r.body, children: o }),
57
+ l && /* @__PURE__ */ e("div", { className: r.footer, children: l })
58
58
  ]
59
59
  }
60
60
  ) }) });
@@ -1 +1 @@
1
- {"version":3,"file":"DialogFrame.js","sources":["../../../../src/components/overlays/Dialog/DialogFrame.tsx"],"sourcesContent":["import { useEffect, useId, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { ariaHideOutside, useOverlay, usePreventScroll } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { IconClose } from '../../icons';\nimport type { DialogProps } from './Dialog';\nimport styles from './Dialog.module.css';\n\nexport interface DialogFrameProps extends Omit<DialogProps, 'size'> {\n surfaceClassName: string;\n underlayClassName: string;\n}\n\n/** Mecanica modal do `Dialog` e do `Drawer`: portal, foco preso, rolagem travada, cabecalho, corpo e rodape. Interna. */\nexport function DialogFrame({ open, ...props }: DialogFrameProps) {\n // No servidor nao ha `document` para o portal; o modal nasce na hidratacao.\n if (!open || typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<DialogFrameContent {...props} />, document.body);\n}\n\nfunction DialogFrameContent({\n children,\n className,\n description,\n dismissable = true,\n footer,\n icon,\n onClose,\n ref: refDoConsumidor,\n role = 'dialog',\n surfaceClassName,\n title,\n underlayClassName,\n ...props\n}: Omit<DialogFrameProps, 'open'>) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const generatedId = useId();\n const titleId = `${generatedId}-title`;\n const descriptionId = `${generatedId}-description`;\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: dismissable,\n isKeyboardDismissDisabled: !dismissable,\n },\n ref,\n );\n\n usePreventScroll();\n\n useEffect(() => (ref.current ? ariaHideOutside([ref.current]) : undefined), []);\n\n return (\n <div {...underlayProps} className={underlayClassName}>\n <FocusScope contain restoreFocus autoFocus>\n <div\n {...props}\n {...overlayProps}\n ref={mergedRef}\n className={[surfaceClassName, className].filter(Boolean).join(' ')}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n <header className={[styles.header, children && styles.headerDivided].filter(Boolean).join(' ')}>\n {icon && (\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n )}\n <div className={styles.heading}>\n <h2 className={styles.title} id={titleId}>{title}</h2>\n {description && <p className={styles.description} id={descriptionId}>{description}</p>}\n </div>\n {dismissable && (\n <button className={styles.close} type=\"button\" aria-label=\"Fechar\" onClick={onClose}>\n <IconClose size={20} />\n </button>\n )}\n </header>\n {children && <div className={styles.body}>{children}</div>}\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </FocusScope>\n </div>\n );\n}\n"],"names":["DialogFrame","open","props","createPortal","jsx","DialogFrameContent","children","className","description","dismissable","footer","icon","onClose","refDoConsumidor","role","surfaceClassName","title","underlayClassName","ref","useRef","mergedRef","useMergedRefs","generatedId","useId","titleId","descriptionId","overlayProps","underlayProps","useOverlay","usePreventScroll","useEffect","ariaHideOutside","FocusScope","jsxs","styles","IconClose"],"mappings":";;;;;;;;AAeO,SAASA,EAAY,EAAE,MAAAC,GAAM,GAAGC,KAA2B;AAEhE,SAAI,CAACD,KAAQ,OAAO,WAAa,MACxB,OAGFE,EAAa,gBAAAC,EAACC,GAAA,EAAoB,GAAGH,GAAO,GAAI,SAAS,IAAI;AACtE;AAEA,SAASG,EAAmB;AAAA,EAC1B,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,KAAKC;AAAA,EACL,MAAAC,IAAO;AAAA,EACP,kBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,GAAGf;AACL,GAAmC;AACjC,QAAMgB,IAAMC,EAAuB,IAAI,GACjCC,IAAYC,EAAcH,GAAKL,CAAe,GAC9CS,IAAcC,EAAA,GACdC,IAAU,GAAGF,CAAW,UACxBG,IAAgB,GAAGH,CAAW,gBAE9B,EAAE,cAAAI,GAAc,eAAAC,EAAA,IAAkBC;AAAA,IACtC;AAAA,MACE,QAAQ;AAAA,MACR,SAAAhB;AAAA,MACA,eAAeH;AAAA,MACf,2BAA2B,CAACA;AAAA,IAAA;AAAA,IAE9BS;AAAA,EAAA;AAGF,SAAAW,EAAA,GAEAC,EAAU,MAAOZ,EAAI,UAAUa,EAAgB,CAACb,EAAI,OAAO,CAAC,IAAI,QAAY,EAAE,GAG5E,gBAAAd,EAAC,OAAA,EAAK,GAAGuB,GAAe,WAAWV,GACjC,UAAA,gBAAAb,EAAC4B,GAAA,EAAW,SAAO,IAAC,cAAY,IAAC,WAAS,IACxC,UAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG/B;AAAA,MACH,GAAGwB;AAAA,MACJ,KAAKN;AAAA,MACL,WAAW,CAACL,GAAkBR,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACjE,MAAAO;AAAA,MACA,cAAW;AAAA,MACX,mBAAiBU;AAAA,MACjB,oBAAkBhB,IAAciB,IAAgB;AAAA,MAEhD,UAAA;AAAA,QAAA,gBAAAQ,EAAC,UAAA,EAAO,WAAW,CAACC,EAAO,QAAQ5B,KAAY4B,EAAO,aAAa,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC1F,UAAA;AAAA,UAAAvB,uBACE,QAAA,EAAK,eAAY,QAAO,WAAWuB,EAAO,MACxC,UAAAvB,EAAA,CACH;AAAA,UAEF,gBAAAsB,EAAC,OAAA,EAAI,WAAWC,EAAO,SACrB,UAAA;AAAA,YAAA,gBAAA9B,EAAC,QAAG,WAAW8B,EAAO,OAAO,IAAIV,GAAU,UAAAR,GAAM;AAAA,YAChDR,uBAAgB,KAAA,EAAE,WAAW0B,EAAO,aAAa,IAAIT,GAAgB,UAAAjB,EAAA,CAAY;AAAA,UAAA,GACpF;AAAA,UACCC,KACC,gBAAAL,EAAC,UAAA,EAAO,WAAW8B,EAAO,OAAO,MAAK,UAAS,cAAW,UAAS,SAAStB,GAC1E,UAAA,gBAAAR,EAAC+B,GAAA,EAAU,MAAM,IAAI,EAAA,CACvB;AAAA,QAAA,GAEJ;AAAA,QACC7B,KAAY,gBAAAF,EAAC,OAAA,EAAI,WAAW8B,EAAO,MAAO,UAAA5B,GAAS;AAAA,QACnDI,KAAU,gBAAAN,EAAC,OAAA,EAAI,WAAW8B,EAAO,QAAS,UAAAxB,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEtD,EAAA,CACF;AAEJ;"}
1
+ {"version":3,"file":"DialogFrame.js","sources":["../../../../src/components/overlays/Dialog/DialogFrame.tsx"],"sourcesContent":["import { useEffect, useId, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { ariaHideOutside, useOverlay, usePreventScroll } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { IconClose } from '../../icons';\nimport type { DialogBaseProps, DialogRole } from './Dialog';\nimport styles from './Dialog.module.css';\n\nexport interface DialogFrameProps extends DialogBaseProps {\n 'aria-label'?: string;\n description?: string;\n icon?: ReactNode;\n role?: DialogRole;\n surfaceClassName: string;\n title?: string;\n underlayClassName: string;\n}\n\n/** Mecanica modal do `Dialog` e do `Drawer`: portal, foco preso, rolagem travada, cabecalho, corpo e rodape. Interna. */\nexport function DialogFrame({ open, ...props }: DialogFrameProps) {\n // No servidor nao ha `document` para o portal; o modal nasce na hidratacao.\n if (!open || typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<DialogFrameContent {...props} />, document.body);\n}\n\nfunction DialogFrameContent({\n children,\n className,\n description,\n dismissable = true,\n footer,\n icon,\n onClose,\n ref: refDoConsumidor,\n role = 'dialog',\n surfaceClassName,\n title,\n underlayClassName,\n ...props\n}: Omit<DialogFrameProps, 'open'>) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const generatedId = useId();\n const titleId = `${generatedId}-title`;\n const descriptionId = `${generatedId}-description`;\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: dismissable,\n isKeyboardDismissDisabled: !dismissable,\n },\n ref,\n );\n\n usePreventScroll();\n\n useEffect(() => (ref.current ? ariaHideOutside([ref.current]) : undefined), []);\n\n return (\n <div {...underlayProps} className={underlayClassName}>\n <FocusScope contain restoreFocus autoFocus>\n <div\n {...props}\n {...overlayProps}\n ref={mergedRef}\n className={[surfaceClassName, className].filter(Boolean).join(' ')}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n >\n {title && (\n <header className={[styles.header, children && styles.headerDivided].filter(Boolean).join(' ')}>\n {icon && (\n <span aria-hidden=\"true\" className={styles.icon}>\n {icon}\n </span>\n )}\n <div className={styles.heading}>\n <h2 className={styles.title} id={titleId}>{title}</h2>\n {description && <p className={styles.description} id={descriptionId}>{description}</p>}\n </div>\n {dismissable && (\n <button className={styles.close} type=\"button\" aria-label=\"Fechar\" onClick={onClose}>\n <IconClose size={20} />\n </button>\n )}\n </header>\n )}\n {children && <div className={styles.body}>{children}</div>}\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </FocusScope>\n </div>\n );\n}\n"],"names":["DialogFrame","open","props","createPortal","jsx","DialogFrameContent","children","className","description","dismissable","footer","icon","onClose","refDoConsumidor","role","surfaceClassName","title","underlayClassName","ref","useRef","mergedRef","useMergedRefs","generatedId","useId","titleId","descriptionId","overlayProps","underlayProps","useOverlay","usePreventScroll","useEffect","ariaHideOutside","FocusScope","jsxs","styles","IconClose"],"mappings":";;;;;;;;AAoBO,SAASA,EAAY,EAAE,MAAAC,GAAM,GAAGC,KAA2B;AAEhE,SAAI,CAACD,KAAQ,OAAO,WAAa,MACxB,OAGFE,EAAa,gBAAAC,EAACC,GAAA,EAAoB,GAAGH,GAAO,GAAI,SAAS,IAAI;AACtE;AAEA,SAASG,EAAmB;AAAA,EAC1B,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,KAAKC;AAAA,EACL,MAAAC,IAAO;AAAA,EACP,kBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,GAAGf;AACL,GAAmC;AACjC,QAAMgB,IAAMC,EAAuB,IAAI,GACjCC,IAAYC,EAAcH,GAAKL,CAAe,GAC9CS,IAAcC,EAAA,GACdC,IAAU,GAAGF,CAAW,UACxBG,IAAgB,GAAGH,CAAW,gBAE9B,EAAE,cAAAI,GAAc,eAAAC,EAAA,IAAkBC;AAAA,IACtC;AAAA,MACE,QAAQ;AAAA,MACR,SAAAhB;AAAA,MACA,eAAeH;AAAA,MACf,2BAA2B,CAACA;AAAA,IAAA;AAAA,IAE9BS;AAAA,EAAA;AAGF,SAAAW,EAAA,GAEAC,EAAU,MAAOZ,EAAI,UAAUa,EAAgB,CAACb,EAAI,OAAO,CAAC,IAAI,QAAY,EAAE,GAG5E,gBAAAd,EAAC,OAAA,EAAK,GAAGuB,GAAe,WAAWV,GACjC,UAAA,gBAAAb,EAAC4B,GAAA,EAAW,SAAO,IAAC,cAAY,IAAC,WAAS,IACxC,UAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG/B;AAAA,MACH,GAAGwB;AAAA,MACJ,KAAKN;AAAA,MACL,WAAW,CAACL,GAAkBR,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACjE,MAAAO;AAAA,MACA,cAAW;AAAA,MACX,mBAAiBE,IAAQQ,IAAU;AAAA,MACnC,oBAAkBhB,IAAciB,IAAgB;AAAA,MAE/C,UAAA;AAAA,QAAAT,KACC,gBAAAiB,EAAC,UAAA,EAAO,WAAW,CAACC,EAAO,QAAQ5B,KAAY4B,EAAO,aAAa,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC1F,UAAA;AAAA,UAAAvB,uBACE,QAAA,EAAK,eAAY,QAAO,WAAWuB,EAAO,MACxC,UAAAvB,EAAA,CACH;AAAA,UAEF,gBAAAsB,EAAC,OAAA,EAAI,WAAWC,EAAO,SACrB,UAAA;AAAA,YAAA,gBAAA9B,EAAC,QAAG,WAAW8B,EAAO,OAAO,IAAIV,GAAU,UAAAR,GAAM;AAAA,YAChDR,uBAAgB,KAAA,EAAE,WAAW0B,EAAO,aAAa,IAAIT,GAAgB,UAAAjB,EAAA,CAAY;AAAA,UAAA,GACpF;AAAA,UACCC,KACC,gBAAAL,EAAC,UAAA,EAAO,WAAW8B,EAAO,OAAO,MAAK,UAAS,cAAW,UAAS,SAAStB,GAC1E,UAAA,gBAAAR,EAAC+B,GAAA,EAAU,MAAM,IAAI,EAAA,CACvB;AAAA,QAAA,GAEJ;AAAA,QAED7B,KAAY,gBAAAF,EAAC,OAAA,EAAI,WAAW8B,EAAO,MAAO,UAAA5B,GAAS;AAAA,QACnDI,KAAU,gBAAAN,EAAC,OAAA,EAAI,WAAW8B,EAAO,QAAS,UAAAxB,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEtD,EAAA,CACF;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.cjs","sources":["../../../../src/components/overlays/Drawer/Drawer.tsx"],"sourcesContent":["import type { DialogProps } from '../Dialog';\nimport { DialogFrame } from '../Dialog/DialogFrame';\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'sm' | 'md' | 'lg';\n\nexport interface DrawerProps extends Omit<DialogProps, 'icon' | 'role' | 'size'> {\n side?: DrawerSide;\n size?: DrawerSize;\n}\n\n/** Painel modal preso a lateral da tela, com a mesma mecanica do `Dialog`: foco preso, Esc fecha, a pagina nao rola. */\nexport function Drawer({ side = 'right', size = 'md', ...props }: DrawerProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.drawer, styles[size]].join(' ')}\n underlayClassName={[styles.underlay, styles[side]].join(' ')}\n />\n );\n}\n"],"names":["Drawer","side","size","props","jsx","DialogFrame","styles"],"mappings":"iMAaO,SAASA,EAAO,CAAE,KAAAC,EAAO,QAAS,KAAAC,EAAO,KAAM,GAAGC,GAAsB,CAC7E,OACEC,EAAAA,IAACC,EAAAA,YAAA,CACE,GAAGF,EACJ,iBAAkB,CAACG,EAAAA,QAAO,OAAQA,EAAAA,QAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG,EACxD,kBAAmB,CAACI,EAAAA,QAAO,SAAUA,EAAAA,QAAOL,CAAI,CAAC,EAAE,KAAK,GAAG,CAAA,CAAA,CAGjE"}
1
+ {"version":3,"file":"Drawer.cjs","sources":["../../../../src/components/overlays/Drawer/Drawer.tsx"],"sourcesContent":["import type { DialogBaseProps, DialogTitledProps } from '../Dialog/Dialog';\nimport { DialogFrame } from '../Dialog/DialogFrame';\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'sm' | 'md' | 'lg';\n\nexport interface DrawerProps extends DialogBaseProps, Omit<DialogTitledProps, 'icon'> {\n side?: DrawerSide;\n size?: DrawerSize;\n}\n\n/** Painel modal preso a lateral da tela, com a mesma mecanica do `Dialog`: foco preso, Esc fecha, a pagina nao rola. */\nexport function Drawer({ side = 'right', size = 'md', ...props }: DrawerProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.drawer, styles[size]].join(' ')}\n underlayClassName={[styles.underlay, styles[side]].join(' ')}\n />\n );\n}\n"],"names":["Drawer","side","size","props","jsx","DialogFrame","styles"],"mappings":"iMAaO,SAASA,EAAO,CAAE,KAAAC,EAAO,QAAS,KAAAC,EAAO,KAAM,GAAGC,GAAsB,CAC7E,OACEC,EAAAA,IAACC,EAAAA,YAAA,CACE,GAAGF,EACJ,iBAAkB,CAACG,EAAAA,QAAO,OAAQA,EAAAA,QAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG,EACxD,kBAAmB,CAACI,EAAAA,QAAO,SAAUA,EAAAA,QAAOL,CAAI,CAAC,EAAE,KAAK,GAAG,CAAA,CAAA,CAGjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.js","sources":["../../../../src/components/overlays/Drawer/Drawer.tsx"],"sourcesContent":["import type { DialogProps } from '../Dialog';\nimport { DialogFrame } from '../Dialog/DialogFrame';\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'sm' | 'md' | 'lg';\n\nexport interface DrawerProps extends Omit<DialogProps, 'icon' | 'role' | 'size'> {\n side?: DrawerSide;\n size?: DrawerSize;\n}\n\n/** Painel modal preso a lateral da tela, com a mesma mecanica do `Dialog`: foco preso, Esc fecha, a pagina nao rola. */\nexport function Drawer({ side = 'right', size = 'md', ...props }: DrawerProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.drawer, styles[size]].join(' ')}\n underlayClassName={[styles.underlay, styles[side]].join(' ')}\n />\n );\n}\n"],"names":["Drawer","side","size","props","jsx","DialogFrame","styles"],"mappings":";;;AAaO,SAASA,EAAO,EAAE,MAAAC,IAAO,SAAS,MAAAC,IAAO,MAAM,GAAGC,KAAsB;AAC7E,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGF;AAAA,MACJ,kBAAkB,CAACG,EAAO,QAAQA,EAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MACxD,mBAAmB,CAACI,EAAO,UAAUA,EAAOL,CAAI,CAAC,EAAE,KAAK,GAAG;AAAA,IAAA;AAAA,EAAA;AAGjE;"}
1
+ {"version":3,"file":"Drawer.js","sources":["../../../../src/components/overlays/Drawer/Drawer.tsx"],"sourcesContent":["import type { DialogBaseProps, DialogTitledProps } from '../Dialog/Dialog';\nimport { DialogFrame } from '../Dialog/DialogFrame';\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'sm' | 'md' | 'lg';\n\nexport interface DrawerProps extends DialogBaseProps, Omit<DialogTitledProps, 'icon'> {\n side?: DrawerSide;\n size?: DrawerSize;\n}\n\n/** Painel modal preso a lateral da tela, com a mesma mecanica do `Dialog`: foco preso, Esc fecha, a pagina nao rola. */\nexport function Drawer({ side = 'right', size = 'md', ...props }: DrawerProps) {\n return (\n <DialogFrame\n {...props}\n surfaceClassName={[styles.drawer, styles[size]].join(' ')}\n underlayClassName={[styles.underlay, styles[side]].join(' ')}\n />\n );\n}\n"],"names":["Drawer","side","size","props","jsx","DialogFrame","styles"],"mappings":";;;AAaO,SAASA,EAAO,EAAE,MAAAC,IAAO,SAAS,MAAAC,IAAO,MAAM,GAAGC,KAAsB;AAC7E,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACE,GAAGF;AAAA,MACJ,kBAAkB,CAACG,EAAO,QAAQA,EAAOJ,CAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MACxD,mBAAmB,CAACI,EAAO,UAAUA,EAAOL,CAAI,CAAC,EAAE,KAAK,GAAG;AAAA,IAAA;AAAA,EAAA;AAGjE;"}