@proef/common-ui 0.0.0-stage → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/dist/esm/assets/imagem-6ee08a37d9.png +0 -0
  2. package/dist/esm/assets/imagem-6fcae1b87b.png +0 -0
  3. package/dist/esm/index.js +301 -0
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js +5 -0
  6. package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js.map +1 -0
  7. package/dist/esm/legacy/components/atoms/Acronym/Acronym.css +43 -0
  8. package/dist/esm/legacy/components/atoms/Acronym/Acronym.js +31 -0
  9. package/dist/esm/legacy/components/atoms/Acronym/Acronym.js.map +1 -0
  10. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.css +36 -0
  11. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js +57 -0
  12. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js.map +1 -0
  13. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.css +218 -0
  14. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js +50 -0
  15. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js.map +1 -0
  16. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.css +56 -0
  17. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js +34 -0
  18. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js.map +1 -0
  19. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.css +74 -0
  20. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js +29 -0
  21. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js.map +1 -0
  22. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.css +99 -0
  23. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js +36 -0
  24. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js.map +1 -0
  25. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.css +63 -0
  26. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js +21 -0
  27. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js.map +1 -0
  28. package/dist/esm/legacy/components/atoms/Field/Field.css +171 -0
  29. package/dist/esm/legacy/components/atoms/Field/Field.js +70 -0
  30. package/dist/esm/legacy/components/atoms/Field/Field.js.map +1 -0
  31. package/dist/esm/legacy/components/atoms/IconText/IconText.css +10 -0
  32. package/dist/esm/legacy/components/atoms/IconText/IconText.js +25 -0
  33. package/dist/esm/legacy/components/atoms/IconText/IconText.js.map +1 -0
  34. package/dist/esm/legacy/components/atoms/Icone/Icone.js +24 -0
  35. package/dist/esm/legacy/components/atoms/Icone/Icone.js.map +1 -0
  36. package/dist/esm/legacy/components/atoms/Input/Input.css +12 -0
  37. package/dist/esm/legacy/components/atoms/Input/Input.js +28 -0
  38. package/dist/esm/legacy/components/atoms/Input/Input.js.map +1 -0
  39. package/dist/esm/legacy/components/atoms/InputData/InputData.js +25 -0
  40. package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -0
  41. package/dist/esm/legacy/components/atoms/Label/Label.css +192 -0
  42. package/dist/esm/legacy/components/atoms/Label/Label.js +13 -0
  43. package/dist/esm/legacy/components/atoms/Label/Label.js.map +1 -0
  44. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.css +40 -0
  45. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js +21 -0
  46. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js.map +1 -0
  47. package/dist/esm/legacy/components/atoms/Select/Select.css +16 -0
  48. package/dist/esm/legacy/components/atoms/Select/Select.js +27 -0
  49. package/dist/esm/legacy/components/atoms/Select/Select.js.map +1 -0
  50. package/dist/esm/legacy/components/atoms/Stack/Stack.js +20 -0
  51. package/dist/esm/legacy/components/atoms/Stack/Stack.js.map +1 -0
  52. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.css +36 -0
  53. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js +29 -0
  54. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js.map +1 -0
  55. package/dist/esm/legacy/components/charts/Charts.js +349 -0
  56. package/dist/esm/legacy/components/charts/Charts.js.map +1 -0
  57. package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js +100 -0
  58. package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js.map +1 -0
  59. package/dist/esm/legacy/components/layout/Error/Error.css +20 -0
  60. package/dist/esm/legacy/components/layout/Error/Error.js +12 -0
  61. package/dist/esm/legacy/components/layout/Error/Error.js.map +1 -0
  62. package/dist/esm/legacy/components/layout/Footer/Footer.css +42 -0
  63. package/dist/esm/legacy/components/layout/Footer/Footer.js +23 -0
  64. package/dist/esm/legacy/components/layout/Footer/Footer.js.map +1 -0
  65. package/dist/esm/legacy/components/layout/Header/Header.css +66 -0
  66. package/dist/esm/legacy/components/layout/Header/Header.js +37 -0
  67. package/dist/esm/legacy/components/layout/Header/Header.js.map +1 -0
  68. package/dist/esm/legacy/components/layout/Layout/Layout.js +31 -0
  69. package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -0
  70. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +38 -0
  71. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -0
  72. package/dist/esm/legacy/components/layout/Spinner/Spinner.css +10 -0
  73. package/dist/esm/legacy/components/layout/Spinner/Spinner.js +19 -0
  74. package/dist/esm/legacy/components/layout/Spinner/Spinner.js.map +1 -0
  75. package/dist/esm/legacy/components/layout/TopBar/TopBar.js +34 -0
  76. package/dist/esm/legacy/components/layout/TopBar/TopBar.js.map +1 -0
  77. package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js +82 -0
  78. package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js.map +1 -0
  79. package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js +25 -0
  80. package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js.map +1 -0
  81. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +246 -0
  82. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -0
  83. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.css +3 -0
  84. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js +33 -0
  85. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js.map +1 -0
  86. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +1259 -0
  87. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -0
  88. package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js +68 -0
  89. package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js.map +1 -0
  90. package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js +96 -0
  91. package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js.map +1 -0
  92. package/dist/esm/legacy/components/molecules/Modal/Modal.css +54 -0
  93. package/dist/esm/legacy/components/molecules/Modal/Modal.js +64 -0
  94. package/dist/esm/legacy/components/molecules/Modal/Modal.js.map +1 -0
  95. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.css +97 -0
  96. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js +113 -0
  97. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js.map +1 -0
  98. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js +114 -0
  99. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js.map +1 -0
  100. package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js +116 -0
  101. package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js.map +1 -0
  102. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.css +69 -0
  103. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js +62 -0
  104. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js.map +1 -0
  105. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +23 -0
  106. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -0
  107. package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js +162 -0
  108. package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js.map +1 -0
  109. package/dist/esm/legacy/components/organisms/Kanban/Kanban.js +88 -0
  110. package/dist/esm/legacy/components/organisms/Kanban/Kanban.js.map +1 -0
  111. package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js +87 -0
  112. package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js.map +1 -0
  113. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +427 -0
  114. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -0
  115. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +218 -0
  116. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -0
  117. package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js +147 -0
  118. package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js.map +1 -0
  119. package/dist/esm/legacy/components/organisms/Profile/Profile.css +26 -0
  120. package/dist/esm/legacy/components/organisms/Profile/Profile.js +26 -0
  121. package/dist/esm/legacy/components/organisms/Profile/Profile.js.map +1 -0
  122. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js +79 -0
  123. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js.map +1 -0
  124. package/dist/esm/legacy/components/organisms/Selector/Selector.css +87 -0
  125. package/dist/esm/legacy/components/organisms/Selector/Selector.js +181 -0
  126. package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -0
  127. package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js +115 -0
  128. package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js.map +1 -0
  129. package/dist/esm/legacy/components/ui/Avisos.js +33 -0
  130. package/dist/esm/legacy/components/ui/Avisos.js.map +1 -0
  131. package/dist/esm/legacy/components/ui/BarraAcoes.js +19 -0
  132. package/dist/esm/legacy/components/ui/BarraAcoes.js.map +1 -0
  133. package/dist/esm/legacy/components/ui/CabecalhoPagina.js +19 -0
  134. package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -0
  135. package/dist/esm/legacy/components/ui/CaixaPesquisa.js +9 -0
  136. package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -0
  137. package/dist/esm/legacy/components/ui/Confirmacao.js +34 -0
  138. package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -0
  139. package/dist/esm/legacy/components/ui/Escolha.js +41 -0
  140. package/dist/esm/legacy/components/ui/Escolha.js.map +1 -0
  141. package/dist/esm/legacy/components/ui/FaixaAviso.js +19 -0
  142. package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -0
  143. package/dist/esm/legacy/components/ui/MenuAcoes.js +116 -0
  144. package/dist/esm/legacy/components/ui/MenuAcoes.js.map +1 -0
  145. package/dist/esm/legacy/components/ui/Passos.js +32 -0
  146. package/dist/esm/legacy/components/ui/Passos.js.map +1 -0
  147. package/dist/esm/legacy/components/ui/Separadores.js +17 -0
  148. package/dist/esm/legacy/components/ui/Separadores.js.map +1 -0
  149. package/dist/esm/legacy/components/ui/TextoAuto.js +33 -0
  150. package/dist/esm/legacy/components/ui/TextoAuto.js.map +1 -0
  151. package/dist/esm/legacy/components/ui/Ui.js +263 -0
  152. package/dist/esm/legacy/components/ui/Ui.js.map +1 -0
  153. package/dist/esm/legacy/components/ui/painelFlutuante.js +13 -0
  154. package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -0
  155. package/dist/esm/legacy/constants/Colors.js +33 -0
  156. package/dist/esm/legacy/constants/Colors.js.map +1 -0
  157. package/dist/esm/legacy/constants/FontWeight.js +35 -0
  158. package/dist/esm/legacy/constants/FontWeight.js.map +1 -0
  159. package/dist/esm/legacy/contexts/apiContext.js +25 -0
  160. package/dist/esm/legacy/contexts/apiContext.js.map +1 -0
  161. package/dist/esm/legacy/contexts/authContext.js +85 -0
  162. package/dist/esm/legacy/contexts/authContext.js.map +1 -0
  163. package/dist/esm/legacy/contexts/socketContext.js +34 -0
  164. package/dist/esm/legacy/contexts/socketContext.js.map +1 -0
  165. package/dist/esm/legacy/hooks/useApi.js +62 -0
  166. package/dist/esm/legacy/hooks/useApi.js.map +1 -0
  167. package/dist/esm/legacy/pages/Error/ErrorPage.css +18 -0
  168. package/dist/esm/legacy/pages/Error/ErrorPage.js +50 -0
  169. package/dist/esm/legacy/pages/Error/ErrorPage.js.map +1 -0
  170. package/dist/esm/legacy/pages/Loading/Loading.css +46 -0
  171. package/dist/esm/legacy/pages/Loading/Loading.js +9 -0
  172. package/dist/esm/legacy/pages/Loading/Loading.js.map +1 -0
  173. package/dist/esm/legacy/pages/Login/LoginScreen.js +46 -0
  174. package/dist/esm/legacy/pages/Login/LoginScreen.js.map +1 -0
  175. package/dist/esm/legacy/pages/NotFound/NotFound.css +21 -0
  176. package/dist/esm/legacy/pages/NotFound/NotFound.js +24 -0
  177. package/dist/esm/legacy/pages/NotFound/NotFound.js.map +1 -0
  178. package/dist/esm/legacy/styles/themes/ButtonThemes.js +28 -0
  179. package/dist/esm/legacy/styles/themes/ButtonThemes.js.map +1 -0
  180. package/dist/esm/legacy/styles/utils/utils.js +7 -0
  181. package/dist/esm/legacy/styles/utils/utils.js.map +1 -0
  182. package/dist/esm/legacy/utils/stringUtils.js +35 -0
  183. package/dist/esm/legacy/utils/stringUtils.js.map +1 -0
  184. package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js +157 -0
  185. package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js.map +1 -0
  186. package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js +52 -0
  187. package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js.map +1 -0
  188. package/dist/esm/v1/capabilities/theme/useIsDark.js +15 -0
  189. package/dist/esm/v1/capabilities/theme/useIsDark.js.map +1 -0
  190. package/dist/esm/v1/capabilities/theme/useTheme.js +66 -0
  191. package/dist/esm/v1/capabilities/theme/useTheme.js.map +1 -0
  192. package/dist/esm/v1/components/data/Pagination/Pagination.js +66 -0
  193. package/dist/esm/v1/components/data/Pagination/Pagination.js.map +1 -0
  194. package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js +307 -0
  195. package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js.map +1 -0
  196. package/dist/esm/v1/components/feedback/Toast/Toast.js +105 -0
  197. package/dist/esm/v1/components/feedback/Toast/Toast.js.map +1 -0
  198. package/dist/esm/v1/components/forms/FormField/FormField.js +59 -0
  199. package/dist/esm/v1/components/forms/FormField/FormField.js.map +1 -0
  200. package/dist/esm/v1/components/forms/FormGrid/FormGrid.js +20 -0
  201. package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -0
  202. package/dist/esm/v1/components/layout/AppShell/AppShell.js +89 -0
  203. package/dist/esm/v1/components/layout/AppShell/AppShell.js.map +1 -0
  204. package/dist/esm/v1/components/layout/Page/Page.js +16 -0
  205. package/dist/esm/v1/components/layout/Page/Page.js.map +1 -0
  206. package/dist/esm/v1/components/layout/PageHeader/PageHeader.js +26 -0
  207. package/dist/esm/v1/components/layout/PageHeader/PageHeader.js.map +1 -0
  208. package/dist/esm/v1/components/layout/SideNav/SideNav.js +287 -0
  209. package/dist/esm/v1/components/layout/SideNav/SideNav.js.map +1 -0
  210. package/dist/esm/v1/components/layout/navTrail.js +19 -0
  211. package/dist/esm/v1/components/layout/navTrail.js.map +1 -0
  212. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js +214 -0
  213. package/dist/esm/v1/components/lists/ListFinder/ListFinder.js.map +1 -0
  214. package/dist/esm/v1/components/lists/ListFinder/labels.js +18 -0
  215. package/dist/esm/v1/components/lists/ListFinder/labels.js.map +1 -0
  216. package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js +95 -0
  217. package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js.map +1 -0
  218. package/dist/esm/v1/components/overlays/Dialog/Dialog.js +141 -0
  219. package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -0
  220. package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js +98 -0
  221. package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js.map +1 -0
  222. package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js +84 -0
  223. package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js.map +1 -0
  224. package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js +33 -0
  225. package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js.map +1 -0
  226. package/dist/esm/v1/components/overlays/topLayer.js +28 -0
  227. package/dist/esm/v1/components/overlays/topLayer.js.map +1 -0
  228. package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js +50 -0
  229. package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js.map +1 -0
  230. package/dist/esm/v1/components/tables/Table/ColumnFilter.js +292 -0
  231. package/dist/esm/v1/components/tables/Table/ColumnFilter.js.map +1 -0
  232. package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js +129 -0
  233. package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js.map +1 -0
  234. package/dist/esm/v1/components/tables/Table/Table.js +1410 -0
  235. package/dist/esm/v1/components/tables/Table/Table.js.map +1 -0
  236. package/dist/esm/v1/components/tables/Table/labels.js +44 -0
  237. package/dist/esm/v1/components/tables/Table/labels.js.map +1 -0
  238. package/dist/esm/v1/foundations/icons/icons.js +178 -0
  239. package/dist/esm/v1/foundations/icons/icons.js.map +1 -0
  240. package/dist/esm/v1/primitives/buttons/Button/Button.js +41 -0
  241. package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -0
  242. package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js +65 -0
  243. package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js.map +1 -0
  244. package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js +10 -0
  245. package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js.map +1 -0
  246. package/dist/esm/v1/primitives/display/Avatar/Avatar.js +120 -0
  247. package/dist/esm/v1/primitives/display/Avatar/Avatar.js.map +1 -0
  248. package/dist/esm/v1/primitives/display/Badge/Badge.js +23 -0
  249. package/dist/esm/v1/primitives/display/Badge/Badge.js.map +1 -0
  250. package/dist/esm/v1/primitives/display/Card/Card.js +22 -0
  251. package/dist/esm/v1/primitives/display/Card/Card.js.map +1 -0
  252. package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js +45 -0
  253. package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js.map +1 -0
  254. package/dist/esm/v1/primitives/display/Kpi/Kpi.js +103 -0
  255. package/dist/esm/v1/primitives/display/Kpi/Kpi.js.map +1 -0
  256. package/dist/esm/v1/primitives/display/Notice/Notice.js +71 -0
  257. package/dist/esm/v1/primitives/display/Notice/Notice.js.map +1 -0
  258. package/dist/esm/v1/primitives/display/Person/Person.js +14 -0
  259. package/dist/esm/v1/primitives/display/Person/Person.js.map +1 -0
  260. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js +137 -0
  261. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js.map +1 -0
  262. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js +26 -0
  263. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js.map +1 -0
  264. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +37 -0
  265. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -0
  266. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js +150 -0
  267. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js.map +1 -0
  268. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js +37 -0
  269. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -0
  270. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js +43 -0
  271. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js.map +1 -0
  272. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +207 -0
  273. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -0
  274. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js +75 -0
  275. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -0
  276. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js +21 -0
  277. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js.map +1 -0
  278. package/dist/esm/v1/primitives/forms/field.js +14 -0
  279. package/dist/esm/v1/primitives/forms/field.js.map +1 -0
  280. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js +39 -0
  281. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js.map +1 -0
  282. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js +96 -0
  283. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js.map +1 -0
  284. package/dist/style.components.css +3 -0
  285. package/dist/style.css +2 -0
  286. package/dist/style.layered.css +2 -0
  287. package/dist/tailwind.css +24 -0
  288. package/dist/theme-boot.js +1 -0
  289. package/dist/theme.css +265 -0
  290. package/dist/tokens.css +121 -0
  291. package/dist/types/index.d.ts +14 -0
  292. package/dist/types/legacy/components/atoms/Acronym/Acronym.d.ts +11 -0
  293. package/dist/types/legacy/components/atoms/BreadCrumb/BreadCrumb.d.ts +9 -0
  294. package/dist/types/legacy/components/atoms/Button/variants/ActionButton.d.ts +14 -0
  295. package/dist/types/legacy/components/atoms/Button/variants/FilterButton.d.ts +12 -0
  296. package/dist/types/legacy/components/atoms/Button/variants/IconButton.d.ts +22 -0
  297. package/dist/types/legacy/components/atoms/Button/variants/MainButton.d.ts +17 -0
  298. package/dist/types/legacy/components/atoms/Button/variants/TabButton.d.ts +14 -0
  299. package/dist/types/legacy/components/atoms/Field/Field.d.ts +15 -0
  300. package/dist/types/legacy/components/atoms/IconText/IconText.d.ts +12 -0
  301. package/dist/types/legacy/components/atoms/Icone/Icone.d.ts +31 -0
  302. package/dist/types/legacy/components/atoms/Input/Input.d.ts +13 -0
  303. package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +38 -0
  304. package/dist/types/legacy/components/atoms/Label/Label.d.ts +11 -0
  305. package/dist/types/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +10 -0
  306. package/dist/types/legacy/components/atoms/SearchSelect/SearchSelect.d.ts +15 -0
  307. package/dist/types/legacy/components/atoms/Select/Select.d.ts +16 -0
  308. package/dist/types/legacy/components/atoms/Stack/Stack.d.ts +9 -0
  309. package/dist/types/legacy/components/atoms/Switch/CustomSwitch.d.ts +12 -0
  310. package/dist/types/legacy/components/charts/Charts.d.ts +149 -0
  311. package/dist/types/legacy/components/layout/AppLauncher/AppLauncher.d.ts +35 -0
  312. package/dist/types/legacy/components/layout/Error/Error.d.ts +8 -0
  313. package/dist/types/legacy/components/layout/Footer/Footer.d.ts +11 -0
  314. package/dist/types/legacy/components/layout/Header/Header.d.ts +16 -0
  315. package/dist/types/legacy/components/layout/Layout/Layout.d.ts +35 -0
  316. package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +56 -0
  317. package/dist/types/legacy/components/layout/Spinner/Spinner.d.ts +5 -0
  318. package/dist/types/legacy/components/layout/TopBar/TopBar.d.ts +10 -0
  319. package/dist/types/legacy/components/layout/TopNavLayout/TopNavLayout.d.ts +43 -0
  320. package/dist/types/legacy/components/molecules/BarraValor/BarraValor.d.ts +28 -0
  321. package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +116 -0
  322. package/dist/types/legacy/components/molecules/ConfirmModal/ConfirmModal.d.ts +13 -0
  323. package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +344 -0
  324. package/dist/types/legacy/components/molecules/FileDropzone/FileDropzone.d.ts +25 -0
  325. package/dist/types/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +33 -0
  326. package/dist/types/legacy/components/molecules/Modal/Modal.d.ts +22 -0
  327. package/dist/types/legacy/components/molecules/MultiTagPicker/MultiTagPicker.d.ts +25 -0
  328. package/dist/types/legacy/components/molecules/PhotoAvatar/PhotoAvatar.d.ts +34 -0
  329. package/dist/types/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.d.ts +48 -0
  330. package/dist/types/legacy/components/molecules/Sidebar/Sidebar.d.ts +12 -0
  331. package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +19 -0
  332. package/dist/types/legacy/components/organisms/GanttChart/GanttChart.d.ts +62 -0
  333. package/dist/types/legacy/components/organisms/Kanban/Kanban.d.ts +44 -0
  334. package/dist/types/legacy/components/organisms/LazyLoader/LazyLoader.d.ts +16 -0
  335. package/dist/types/legacy/components/organisms/MapaPontos/MapaPontos.d.ts +206 -0
  336. package/dist/types/legacy/components/organisms/PainelFiltros/PainelFiltros.d.ts +69 -0
  337. package/dist/types/legacy/components/organisms/PesquisaRapida/PesquisaRapida.d.ts +53 -0
  338. package/dist/types/legacy/components/organisms/Profile/Profile.d.ts +12 -0
  339. package/dist/types/legacy/components/organisms/RoleGuard/RoleGuard.d.ts +37 -0
  340. package/dist/types/legacy/components/organisms/Selector/Selector.d.ts +20 -0
  341. package/dist/types/legacy/components/organisms/StatusMatrix/StatusMatrix.d.ts +54 -0
  342. package/dist/types/legacy/components/ui/Avisos.d.ts +33 -0
  343. package/dist/types/legacy/components/ui/BarraAcoes.d.ts +19 -0
  344. package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +23 -0
  345. package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +14 -0
  346. package/dist/types/legacy/components/ui/Confirmacao.d.ts +24 -0
  347. package/dist/types/legacy/components/ui/Escolha.d.ts +35 -0
  348. package/dist/types/legacy/components/ui/FaixaAviso.d.ts +19 -0
  349. package/dist/types/legacy/components/ui/MenuAcoes.d.ts +31 -0
  350. package/dist/types/legacy/components/ui/Passos.d.ts +31 -0
  351. package/dist/types/legacy/components/ui/Separadores.d.ts +19 -0
  352. package/dist/types/legacy/components/ui/TextoAuto.d.ts +23 -0
  353. package/dist/types/legacy/components/ui/Ui.d.ts +181 -0
  354. package/dist/types/legacy/components/ui/painelFlutuante.d.ts +16 -0
  355. package/dist/types/legacy/constants/Colors.d.ts +28 -0
  356. package/dist/types/legacy/constants/FontWeight.d.ts +9 -0
  357. package/dist/types/legacy/contexts/apiContext.d.ts +10 -0
  358. package/dist/types/legacy/contexts/authContext.d.ts +31 -0
  359. package/dist/types/legacy/contexts/socketContext.d.ts +16 -0
  360. package/dist/types/legacy/exports/assets.d.ts +0 -0
  361. package/dist/types/legacy/exports/atoms.d.ts +19 -0
  362. package/dist/types/legacy/exports/charts.d.ts +2 -0
  363. package/dist/types/legacy/exports/constants.d.ts +0 -0
  364. package/dist/types/legacy/exports/contexts.d.ts +3 -0
  365. package/dist/types/legacy/exports/hooks.d.ts +4 -0
  366. package/dist/types/legacy/exports/layout.d.ts +14 -0
  367. package/dist/types/legacy/exports/molecules.d.ts +21 -0
  368. package/dist/types/legacy/exports/organisms.d.ts +17 -0
  369. package/dist/types/legacy/exports/pages.d.ts +5 -0
  370. package/dist/types/legacy/exports/styles.d.ts +2 -0
  371. package/dist/types/legacy/exports/types.d.ts +7 -0
  372. package/dist/types/legacy/exports/ui.d.ts +24 -0
  373. package/dist/types/legacy/exports/utils.d.ts +1 -0
  374. package/dist/types/legacy/hooks/useApi.d.ts +19 -0
  375. package/dist/types/legacy/pages/Error/ErrorPage.d.ts +16 -0
  376. package/dist/types/legacy/pages/Loading/Loading.d.ts +8 -0
  377. package/dist/types/legacy/pages/Login/LoginScreen.d.ts +42 -0
  378. package/dist/types/legacy/pages/NotFound/NotFound.d.ts +8 -0
  379. package/dist/types/legacy/styles/themes/ButtonThemes.d.ts +6 -0
  380. package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
  381. package/dist/types/legacy/types/Fetcher.d.ts +5 -0
  382. package/dist/types/legacy/types/LoggedUser.d.ts +10 -0
  383. package/dist/types/legacy/types/SelectableElement.d.ts +6 -0
  384. package/dist/types/legacy/types/SidebarMenu.d.ts +12 -0
  385. package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
  386. package/dist/types/legacy/types/themes/ButtonThemes.d.ts +21 -0
  387. package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
  388. package/dist/types/legacy/types/themes/IconTextThemes.d.ts +6 -0
  389. package/dist/types/legacy/utils/keycloak.d.ts +0 -0
  390. package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
  391. package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
  392. package/dist/types/v1/capabilities/overlay/useFloatingPanel.d.ts +20 -0
  393. package/dist/types/v1/capabilities/theme/useIsDark.d.ts +10 -0
  394. package/dist/types/v1/capabilities/theme/useTheme.d.ts +29 -0
  395. package/dist/types/v1/components/data/Pagination/Pagination.d.ts +33 -0
  396. package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
  397. package/dist/types/v1/components/feedback/Toast/Toast.d.ts +51 -0
  398. package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
  399. package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +23 -0
  400. package/dist/types/v1/components/layout/AppShell/AppShell.d.ts +35 -0
  401. package/dist/types/v1/components/layout/Page/Page.d.ts +23 -0
  402. package/dist/types/v1/components/layout/PageHeader/PageHeader.d.ts +35 -0
  403. package/dist/types/v1/components/layout/SideNav/SideNav.d.ts +92 -0
  404. package/dist/types/v1/components/layout/navTrail.d.ts +15 -0
  405. package/dist/types/v1/components/lists/ListFinder/ListFinder.d.ts +60 -0
  406. package/dist/types/v1/components/lists/ListFinder/labels.d.ts +24 -0
  407. package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
  408. package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +66 -0
  409. package/dist/types/v1/components/overlays/Tooltip/Tooltip.d.ts +34 -0
  410. package/dist/types/v1/components/overlays/Tooltip/TooltipLayer.d.ts +18 -0
  411. package/dist/types/v1/components/overlays/Tooltip/TooltipPanel.d.ts +23 -0
  412. package/dist/types/v1/components/overlays/topLayer.d.ts +23 -0
  413. package/dist/types/v1/components/tables/PaginatedTable/PaginatedTable.d.ts +41 -0
  414. package/dist/types/v1/components/tables/Table/ColumnFilter.d.ts +48 -0
  415. package/dist/types/v1/components/tables/Table/OverlayScrollbar.d.ts +34 -0
  416. package/dist/types/v1/components/tables/Table/Table.d.ts +250 -0
  417. package/dist/types/v1/components/tables/Table/labels.d.ts +54 -0
  418. package/dist/types/v1/foundations/icons/icons.d.ts +61 -0
  419. package/dist/types/v1/index.d.ts +81 -0
  420. package/dist/types/v1/primitives/buttons/Button/Button.d.ts +35 -0
  421. package/dist/types/v1/primitives/buttons/SegmentedControl/SegmentedControl.d.ts +28 -0
  422. package/dist/types/v1/primitives/buttons/SegmentedControl/segmentedStyles.d.ts +16 -0
  423. package/dist/types/v1/primitives/display/Avatar/Avatar.d.ts +30 -0
  424. package/dist/types/v1/primitives/display/Badge/Badge.d.ts +25 -0
  425. package/dist/types/v1/primitives/display/Card/Card.d.ts +22 -0
  426. package/dist/types/v1/primitives/display/FilterChips/FilterChips.d.ts +33 -0
  427. package/dist/types/v1/primitives/display/Kpi/Kpi.d.ts +68 -0
  428. package/dist/types/v1/primitives/display/Notice/Notice.d.ts +29 -0
  429. package/dist/types/v1/primitives/display/Person/Person.d.ts +15 -0
  430. package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
  431. package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
  432. package/dist/types/v1/primitives/forms/Checkbox/Checkbox.d.ts +25 -0
  433. package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
  434. package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +28 -0
  435. package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
  436. package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +70 -0
  437. package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +40 -0
  438. package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
  439. package/dist/types/v1/primitives/forms/field.d.ts +22 -0
  440. package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +36 -0
  441. package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
  442. package/package.json +120 -6
  443. package/README.md +0 -3
@@ -0,0 +1,98 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef, useId, useEffect, useLayoutEffect } from "react";
3
+ import { useTopLayer } from "../topLayer.js";
4
+ import TooltipPanel, { MARGIN, OFFSET, clamp } from "./TooltipPanel.js";
5
+ const SHOW_DELAY = 120;
6
+ const HIDE_DELAY_INTERACTIVE = 200;
7
+ const CURSOR_OFFSET = 14;
8
+ function Tooltip({
9
+ content: contentProp,
10
+ tip,
11
+ title,
12
+ children,
13
+ interactive = false,
14
+ followCursor = false,
15
+ disabled = false,
16
+ className = ""
17
+ }) {
18
+ const content = contentProp ?? tip;
19
+ const [open, setOpen] = useState(false);
20
+ const [cursor, setCursor] = useState(null);
21
+ const anchorRef = useRef(null);
22
+ const panelRef = useRef(null);
23
+ const timer = useRef(null);
24
+ const id = useId();
25
+ useTopLayer(panelRef, open);
26
+ const clear = () => {
27
+ if (timer.current) clearTimeout(timer.current);
28
+ timer.current = null;
29
+ };
30
+ const show = () => {
31
+ clear();
32
+ timer.current = setTimeout(() => setOpen(true), SHOW_DELAY);
33
+ };
34
+ const hide = () => {
35
+ clear();
36
+ if (interactive) timer.current = setTimeout(() => setOpen(false), HIDE_DELAY_INTERACTIVE);
37
+ else setOpen(false);
38
+ };
39
+ useEffect(() => clear, []);
40
+ useEffect(() => {
41
+ if (!open) return;
42
+ const onKey = (e) => {
43
+ if (e.key === "Escape") setOpen(false);
44
+ };
45
+ document.addEventListener("keydown", onKey);
46
+ return () => document.removeEventListener("keydown", onKey);
47
+ }, [open]);
48
+ const [pos, setPos] = useState({ left: 0, top: 0 });
49
+ useLayoutEffect(() => {
50
+ if (!open || !anchorRef.current || !panelRef.current) return;
51
+ const p = panelRef.current.getBoundingClientRect();
52
+ if (followCursor && cursor) {
53
+ const left = cursor.x + CURSOR_OFFSET + p.width > window.innerWidth - MARGIN ? Math.max(MARGIN, cursor.x - CURSOR_OFFSET - p.width) : cursor.x + CURSOR_OFFSET;
54
+ const top2 = cursor.y + CURSOR_OFFSET + p.height > window.innerHeight - MARGIN ? Math.max(MARGIN, cursor.y - CURSOR_OFFSET - p.height) : cursor.y + CURSOR_OFFSET;
55
+ setPos({ left, top: top2 });
56
+ return;
57
+ }
58
+ const a = anchorRef.current.getBoundingClientRect();
59
+ const above = a.top - OFFSET - p.height;
60
+ const top = above >= 0 ? above : a.bottom + OFFSET;
61
+ setPos({ left: clamp(a.left + a.width / 2 - p.width / 2, p.width, window.innerWidth), top });
62
+ }, [open, followCursor, cursor]);
63
+ if (disabled || !content) return /* @__PURE__ */ jsx("span", { className: className || void 0, children });
64
+ return /* @__PURE__ */ jsxs(
65
+ "span",
66
+ {
67
+ ref: anchorRef,
68
+ onMouseEnter: show,
69
+ onMouseMove: followCursor ? (e) => setCursor({ x: e.clientX, y: e.clientY }) : void 0,
70
+ onMouseLeave: hide,
71
+ onFocus: show,
72
+ onBlur: hide,
73
+ "aria-describedby": open ? id : void 0,
74
+ className: className || void 0,
75
+ children: [
76
+ children,
77
+ /* @__PURE__ */ jsx(
78
+ TooltipPanel,
79
+ {
80
+ ref: panelRef,
81
+ id,
82
+ visible: open,
83
+ title,
84
+ interactive,
85
+ style: { left: pos.left, top: pos.top },
86
+ onMouseEnter: interactive ? clear : void 0,
87
+ onMouseLeave: interactive ? hide : void 0,
88
+ children: /* @__PURE__ */ jsx("div", { className: "whitespace-pre-line", children: content })
89
+ }
90
+ )
91
+ ]
92
+ }
93
+ );
94
+ }
95
+ export {
96
+ Tooltip as default
97
+ };
98
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","sources":["../../../../../../src/v1/components/overlays/Tooltip/Tooltip.tsx"],"sourcesContent":["import React, { useEffect, useId, useLayoutEffect, useRef, useState } from 'react'\r\nimport { useTopLayer } from '../topLayer'\r\nimport TooltipPanel, { MARGIN, OFFSET, clamp } from './TooltipPanel'\r\n\r\nexport interface TooltipProps {\r\n /** O que aparece no painel. Aceita JSX (ex: uma lista, um link com `interactive`). Vazio: sem tooltip. */\r\n content?: React.ReactNode\r\n /** @deprecated Nome antigo de `content` (Tooltip legacy). */\r\n tip?: React.ReactNode\r\n /** @deprecated Já não é preciso (o id é gerado); fica para não partir o código legacy. */\r\n id?: string\r\n /** Cabeçalho opcional, separado por uma linha. */\r\n title?: React.ReactNode\r\n /** O elemento que mostra o tooltip ao passar o rato ou com o foco. */\r\n children: React.ReactNode\r\n /** O painel aceita o rato (para clicar em links lá dentro) e fecha com um pequeno atraso. */\r\n interactive?: boolean\r\n /**\r\n * O painel segue o rato, em vez de ficar por cima do elemento. Para elementos\r\n * grandes ou células de grelhas (ex: um cronograma), onde o centro do\r\n * elemento fica longe do rato.\r\n */\r\n followCursor?: boolean\r\n /** Desliga o tooltip (o elemento aparece na mesma). */\r\n disabled?: boolean\r\n /** Classes do invólucro (um `<span>`), ex: `cursor-help` ou `block`. */\r\n className?: string\r\n}\r\n\r\nconst SHOW_DELAY = 120\r\nconst HIDE_DELAY_INTERACTIVE = 200\r\n/** Distância do cursor ao painel, com `followCursor`. */\r\nconst CURSOR_OFFSET = 14\r\n\r\n/**\r\n * Tooltip com conteúdo rico à volta de um elemento: aparece por cima dele (ou\r\n * por baixo, se não couber) ao passar o rato ou com o foco do teclado; Esc\r\n * fecha. As quebras de linha (`\\n`) do texto mantêm-se.\r\n *\r\n * Para texto simples, basta o atributo `data-tip` com o `TooltipLayer`\r\n * montado na raiz, sem embrulhar nada. O painel é o mesmo.\r\n */\r\nexport default function Tooltip({\r\n content: contentProp,\r\n tip,\r\n title,\r\n children,\r\n interactive = false,\r\n followCursor = false,\r\n disabled = false,\r\n className = '',\r\n}: TooltipProps) {\r\n const content = contentProp ?? tip\r\n const [open, setOpen] = useState(false)\r\n const [cursor, setCursor] = useState<{ x: number; y: number } | null>(null)\r\n const anchorRef = useRef<HTMLSpanElement>(null)\r\n const panelRef = useRef<HTMLDivElement>(null)\r\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const id = useId()\r\n\r\n useTopLayer(panelRef, open)\r\n\r\n const clear = () => {\r\n if (timer.current) clearTimeout(timer.current)\r\n timer.current = null\r\n }\r\n const show = () => {\r\n clear()\r\n timer.current = setTimeout(() => setOpen(true), SHOW_DELAY)\r\n }\r\n const hide = () => {\r\n clear()\r\n if (interactive) timer.current = setTimeout(() => setOpen(false), HIDE_DELAY_INTERACTIVE)\r\n else setOpen(false)\r\n }\r\n\r\n useEffect(() => clear, [])\r\n\r\n useEffect(() => {\r\n if (!open) return\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') setOpen(false)\r\n }\r\n document.addEventListener('keydown', onKey)\r\n return () => document.removeEventListener('keydown', onKey)\r\n }, [open])\r\n\r\n // Por cima do elemento, centrado (por baixo se não couber em cima); ou, com\r\n // `followCursor`, à direita e abaixo do rato, virando quando não cabe.\r\n const [pos, setPos] = useState({ left: 0, top: 0 })\r\n useLayoutEffect(() => {\r\n if (!open || !anchorRef.current || !panelRef.current) return\r\n const p = panelRef.current.getBoundingClientRect()\r\n if (followCursor && cursor) {\r\n const left = cursor.x + CURSOR_OFFSET + p.width > window.innerWidth - MARGIN ? Math.max(MARGIN, cursor.x - CURSOR_OFFSET - p.width) : cursor.x + CURSOR_OFFSET\r\n const top = cursor.y + CURSOR_OFFSET + p.height > window.innerHeight - MARGIN ? Math.max(MARGIN, cursor.y - CURSOR_OFFSET - p.height) : cursor.y + CURSOR_OFFSET\r\n setPos({ left, top })\r\n return\r\n }\r\n const a = anchorRef.current.getBoundingClientRect()\r\n const above = a.top - OFFSET - p.height\r\n const top = above >= 0 ? above : a.bottom + OFFSET\r\n setPos({ left: clamp(a.left + a.width / 2 - p.width / 2, p.width, window.innerWidth), top })\r\n }, [open, followCursor, cursor])\r\n\r\n if (disabled || !content) return <span className={className || undefined}>{children}</span>\r\n\r\n return (\r\n <span\r\n ref={anchorRef}\r\n onMouseEnter={show}\r\n onMouseMove={followCursor ? (e) => setCursor({ x: e.clientX, y: e.clientY }) : undefined}\r\n onMouseLeave={hide}\r\n onFocus={show}\r\n onBlur={hide}\r\n aria-describedby={open ? id : undefined}\r\n className={className || undefined}\r\n >\r\n {children}\r\n <TooltipPanel\r\n ref={panelRef}\r\n id={id}\r\n visible={open}\r\n title={title}\r\n interactive={interactive}\r\n style={{ left: pos.left, top: pos.top }}\r\n onMouseEnter={interactive ? clear : undefined}\r\n onMouseLeave={interactive ? hide : undefined}\r\n >\r\n <div className=\"whitespace-pre-line\">{content}</div>\r\n </TooltipPanel>\r\n </span>\r\n )\r\n}\r\n"],"names":["top"],"mappings":";;;;AA6BA,MAAM,aAAa;AACnB,MAAM,yBAAyB;AAE/B,MAAM,gBAAgB;AAUtB,SAAwB,QAAQ;AAAA,EAC9B,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AACd,GAAiB;AACf,QAAM,UAAU,eAAe;AAC/B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA0C,IAAI;AAC1E,QAAM,YAAY,OAAwB,IAAI;AAC9C,QAAM,WAAW,OAAuB,IAAI;AAC5C,QAAM,QAAQ,OAA6C,IAAI;AAC/D,QAAM,KAAK,MAAA;AAEX,cAAY,UAAU,IAAI;AAE1B,QAAM,QAAQ,MAAM;AAClB,QAAI,MAAM,QAAS,cAAa,MAAM,OAAO;AAC7C,UAAM,UAAU;AAAA,EAClB;AACA,QAAM,OAAO,MAAM;AACjB,UAAA;AACA,UAAM,UAAU,WAAW,MAAM,QAAQ,IAAI,GAAG,UAAU;AAAA,EAC5D;AACA,QAAM,OAAO,MAAM;AACjB,UAAA;AACA,QAAI,mBAAmB,UAAU,WAAW,MAAM,QAAQ,KAAK,GAAG,sBAAsB;AAAA,iBAC3E,KAAK;AAAA,EACpB;AAEA,YAAU,MAAM,OAAO,EAAE;AAEzB,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,SAAU,SAAQ,KAAK;AAAA,IACvC;AACA,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM,SAAS,oBAAoB,WAAW,KAAK;AAAA,EAC5D,GAAG,CAAC,IAAI,CAAC;AAIT,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG;AAClD,kBAAgB,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,UAAU,WAAW,CAAC,SAAS,QAAS;AACtD,UAAM,IAAI,SAAS,QAAQ,sBAAA;AAC3B,QAAI,gBAAgB,QAAQ;AAC1B,YAAM,OAAO,OAAO,IAAI,gBAAgB,EAAE,QAAQ,OAAO,aAAa,SAAS,KAAK,IAAI,QAAQ,OAAO,IAAI,gBAAgB,EAAE,KAAK,IAAI,OAAO,IAAI;AACjJ,YAAMA,OAAM,OAAO,IAAI,gBAAgB,EAAE,SAAS,OAAO,cAAc,SAAS,KAAK,IAAI,QAAQ,OAAO,IAAI,gBAAgB,EAAE,MAAM,IAAI,OAAO,IAAI;AACnJ,aAAO,EAAE,MAAM,KAAAA,KAAAA,CAAK;AACpB;AAAA,IACF;AACA,UAAM,IAAI,UAAU,QAAQ,sBAAA;AAC5B,UAAM,QAAQ,EAAE,MAAM,SAAS,EAAE;AACjC,UAAM,MAAM,SAAS,IAAI,QAAQ,EAAE,SAAS;AAC5C,WAAO,EAAE,MAAM,MAAM,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ,GAAG,EAAE,OAAO,OAAO,UAAU,GAAG,KAAK;AAAA,EAC7F,GAAG,CAAC,MAAM,cAAc,MAAM,CAAC;AAE/B,MAAI,YAAY,CAAC,QAAS,4BAAQ,QAAA,EAAK,WAAW,aAAa,QAAY,UAAS;AAEpF,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,cAAc;AAAA,MACd,aAAa,eAAe,CAAC,MAAM,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAA,CAAS,IAAI;AAAA,MAC/E,cAAc;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,oBAAkB,OAAO,KAAK;AAAA,MAC9B,WAAW,aAAa;AAAA,MAEvB,UAAA;AAAA,QAAA;AAAA,QACD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA,OAAO,EAAE,MAAM,IAAI,MAAM,KAAK,IAAI,IAAA;AAAA,YAClC,cAAc,cAAc,QAAQ;AAAA,YACpC,cAAc,cAAc,OAAO;AAAA,YAEnC,UAAA,oBAAC,OAAA,EAAI,WAAU,uBAAuB,UAAA,QAAA,CAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MAChD;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,84 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect, useLayoutEffect } from "react";
3
+ import { useTopLayer } from "../topLayer.js";
4
+ import TooltipPanel, { MARGIN } from "./TooltipPanel.js";
5
+ const CURSOR_OFFSET = 14;
6
+ const DELAY_MS = 120;
7
+ const tipOf = (el) => {
8
+ const target = el?.closest("[data-tip]") ?? null;
9
+ const text = target?.getAttribute("data-tip");
10
+ return target && text ? { target, text, title: target.getAttribute("data-tip-title") } : null;
11
+ };
12
+ function TooltipLayer() {
13
+ const [tip, setTip] = useState(null);
14
+ const panelRef = useRef(null);
15
+ const sourceRef = useRef(null);
16
+ const timerRef = useRef(null);
17
+ useTopLayer(panelRef, tip !== null);
18
+ useEffect(() => {
19
+ const clearTimer = () => {
20
+ if (timerRef.current) clearTimeout(timerRef.current);
21
+ timerRef.current = null;
22
+ };
23
+ const hide = () => {
24
+ clearTimer();
25
+ sourceRef.current = null;
26
+ setTip((prev) => prev ? null : prev);
27
+ };
28
+ const show = (target, next) => {
29
+ if (sourceRef.current === target) {
30
+ setTip(next);
31
+ return;
32
+ }
33
+ clearTimer();
34
+ sourceRef.current = target;
35
+ timerRef.current = setTimeout(() => setTip(next), DELAY_MS);
36
+ };
37
+ const onMove = (e) => {
38
+ const found = tipOf(e.target instanceof Element ? e.target : null);
39
+ if (!found) return hide();
40
+ show(found.target, { text: found.text, title: found.title, x: e.clientX, y: e.clientY });
41
+ };
42
+ const onFocus = (e) => {
43
+ const el = e.target instanceof Element ? e.target : null;
44
+ if (!el?.matches(":focus-visible")) return;
45
+ const found = tipOf(el);
46
+ if (!found) return hide();
47
+ const r = found.target.getBoundingClientRect();
48
+ show(found.target, { text: found.text, title: found.title, x: r.left, y: r.bottom - CURSOR_OFFSET + 6 });
49
+ };
50
+ const onKey = (e) => {
51
+ if (e.key === "Escape") hide();
52
+ };
53
+ document.addEventListener("mousemove", onMove, { passive: true });
54
+ document.addEventListener("focusin", onFocus);
55
+ document.addEventListener("focusout", hide);
56
+ document.addEventListener("keydown", onKey);
57
+ document.addEventListener("mousedown", hide, true);
58
+ document.addEventListener("wheel", hide, { passive: true, capture: true });
59
+ window.addEventListener("blur", hide);
60
+ return () => {
61
+ clearTimer();
62
+ document.removeEventListener("mousemove", onMove);
63
+ document.removeEventListener("focusin", onFocus);
64
+ document.removeEventListener("focusout", hide);
65
+ document.removeEventListener("keydown", onKey);
66
+ document.removeEventListener("mousedown", hide, true);
67
+ document.removeEventListener("wheel", hide, true);
68
+ window.removeEventListener("blur", hide);
69
+ };
70
+ }, []);
71
+ const [pos, setPos] = useState({ left: 0, top: 0 });
72
+ useLayoutEffect(() => {
73
+ if (!tip || !panelRef.current) return;
74
+ const r = panelRef.current.getBoundingClientRect();
75
+ const left = tip.x + CURSOR_OFFSET + r.width > window.innerWidth - MARGIN ? Math.max(MARGIN, tip.x - CURSOR_OFFSET - r.width) : tip.x + CURSOR_OFFSET;
76
+ const top = tip.y + CURSOR_OFFSET + r.height > window.innerHeight - MARGIN ? Math.max(MARGIN, tip.y - CURSOR_OFFSET - r.height) : tip.y + CURSOR_OFFSET;
77
+ setPos({ left, top });
78
+ }, [tip]);
79
+ return /* @__PURE__ */ jsx(TooltipPanel, { ref: panelRef, visible: tip !== null, title: tip?.title, style: { left: pos.left, top: pos.top }, children: /* @__PURE__ */ jsx("p", { className: "m-0 whitespace-pre-line", children: tip?.text }) });
80
+ }
81
+ export {
82
+ TooltipLayer as default
83
+ };
84
+ //# sourceMappingURL=TooltipLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TooltipLayer.js","sources":["../../../../../../src/v1/components/overlays/Tooltip/TooltipLayer.tsx"],"sourcesContent":["import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'\r\nimport { useTopLayer } from '../topLayer'\r\nimport TooltipPanel, { MARGIN } from './TooltipPanel'\r\n\r\n/** Distância do cursor ao painel. */\r\nconst CURSOR_OFFSET = 14\r\n/** Atraso curto: evita painéis a piscar ao atravessar uma barra de botões. */\r\nconst DELAY_MS = 120\r\n\r\ninterface Tip {\r\n text: string\r\n title: string | null\r\n x: number\r\n y: number\r\n}\r\n\r\nconst tipOf = (el: Element | null) => {\r\n const target = el?.closest('[data-tip]') ?? null\r\n const text = target?.getAttribute('data-tip')\r\n // `data-tip` vazio é o mesmo que não ter (o React omite o atributo quando o valor é undefined).\r\n return target && text ? { target, text, title: target.getAttribute('data-tip-title') } : null\r\n}\r\n\r\n/**\r\n * Tooltips de toda a app, por atributo: qualquer elemento com `data-tip` mostra\r\n * o texto num painel escuro ao passar o rato ou ao receber o foco do teclado.\r\n * Monta-se uma vez na raiz.\r\n *\r\n * <button data-tip=\"Registar horas\" aria-label=\"Registar horas\">…</button>\r\n * <span data-tip={nome} data-tip-title=\"Requisitante\">…</span>\r\n *\r\n * - `data-tip-title`: cabeçalho opcional, separado por uma linha.\r\n * - Texto com `\\n` aparece em várias linhas.\r\n * - Para conteúdo rico (JSX, links), usar o `Tooltip`.\r\n * - Substitui o `title` do browser (lento, sem tema, corta texto longo). O\r\n * tooltip não é lido pelos leitores de ecrã: o elemento continua a precisar\r\n * do seu nome (`aria-label` ou texto).\r\n * - Aparece por cima de uma janela (Dialog) aberta.\r\n */\r\nexport default function TooltipLayer() {\r\n const [tip, setTip] = useState<Tip | null>(null)\r\n const panelRef = useRef<HTMLDivElement>(null)\r\n /** Elemento que originou o tooltip visível, para não recalcular a cada pixel. */\r\n const sourceRef = useRef<Element | null>(null)\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n\r\n useTopLayer(panelRef, tip !== null)\r\n\r\n useEffect(() => {\r\n const clearTimer = () => {\r\n if (timerRef.current) clearTimeout(timerRef.current)\r\n timerRef.current = null\r\n }\r\n const hide = () => {\r\n clearTimer()\r\n sourceRef.current = null\r\n setTip((prev) => (prev ? null : prev))\r\n }\r\n const show = (target: Element, next: Tip) => {\r\n // Já visível sobre o mesmo elemento: só segue o cursor, sem atraso.\r\n if (sourceRef.current === target) {\r\n setTip(next)\r\n return\r\n }\r\n clearTimer()\r\n sourceRef.current = target\r\n timerRef.current = setTimeout(() => setTip(next), DELAY_MS)\r\n }\r\n\r\n const onMove = (e: MouseEvent) => {\r\n const found = tipOf(e.target instanceof Element ? e.target : null)\r\n if (!found) return hide()\r\n show(found.target, { text: found.text, title: found.title, x: e.clientX, y: e.clientY })\r\n }\r\n\r\n // Teclado: o painel aparece por baixo do elemento focado.\r\n const onFocus = (e: FocusEvent) => {\r\n const el = e.target instanceof Element ? e.target : null\r\n if (!el?.matches(':focus-visible')) return\r\n const found = tipOf(el)\r\n if (!found) return hide()\r\n const r = found.target.getBoundingClientRect()\r\n show(found.target, { text: found.text, title: found.title, x: r.left, y: r.bottom - CURSOR_OFFSET + 6 })\r\n }\r\n\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') hide()\r\n }\r\n\r\n // Fechar em qualquer interação: um painel a pairar sobre um menu que acabou\r\n // de abrir é pior do que não haver tooltip.\r\n document.addEventListener('mousemove', onMove, { passive: true })\r\n document.addEventListener('focusin', onFocus)\r\n document.addEventListener('focusout', hide)\r\n document.addEventListener('keydown', onKey)\r\n document.addEventListener('mousedown', hide, true)\r\n document.addEventListener('wheel', hide, { passive: true, capture: true })\r\n window.addEventListener('blur', hide)\r\n return () => {\r\n clearTimer()\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('focusin', onFocus)\r\n document.removeEventListener('focusout', hide)\r\n document.removeEventListener('keydown', onKey)\r\n document.removeEventListener('mousedown', hide, true)\r\n document.removeEventListener('wheel', hide, true)\r\n window.removeEventListener('blur', hide)\r\n }\r\n }, [])\r\n\r\n // À direita e abaixo do cursor, virando para o lado oposto quando não cabe.\r\n // Medido antes de pintar, com as dimensões reais do painel.\r\n const [pos, setPos] = useState({ left: 0, top: 0 })\r\n useLayoutEffect(() => {\r\n if (!tip || !panelRef.current) return\r\n const r = panelRef.current.getBoundingClientRect()\r\n const left =\r\n tip.x + CURSOR_OFFSET + r.width > window.innerWidth - MARGIN ? Math.max(MARGIN, tip.x - CURSOR_OFFSET - r.width) : tip.x + CURSOR_OFFSET\r\n const top =\r\n tip.y + CURSOR_OFFSET + r.height > window.innerHeight - MARGIN ? Math.max(MARGIN, tip.y - CURSOR_OFFSET - r.height) : tip.y + CURSOR_OFFSET\r\n setPos({ left, top })\r\n }, [tip])\r\n\r\n return (\r\n <TooltipPanel ref={panelRef} visible={tip !== null} title={tip?.title} style={{ left: pos.left, top: pos.top }}>\r\n <p className=\"m-0 whitespace-pre-line\">{tip?.text}</p>\r\n </TooltipPanel>\r\n )\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { popoverReset } from "../topLayer.js";
4
+ const TooltipPanel = forwardRef(function TooltipPanel2({ id, title, children, visible, interactive = false, style, onMouseEnter, onMouseLeave }, ref) {
5
+ return /* @__PURE__ */ jsxs(
6
+ "div",
7
+ {
8
+ ref,
9
+ id,
10
+ popover: "manual",
11
+ role: "tooltip",
12
+ hidden: !visible,
13
+ style,
14
+ onMouseEnter,
15
+ onMouseLeave,
16
+ className: `${popoverReset} fixed inset-auto z-[400] max-w-[380px] rounded-xl bg-slate-900 px-3 py-2 text-caption leading-relaxed text-white shadow-modal dark:bg-slate-950 dark:ring-1 dark:ring-slate-700 ${interactive ? "" : "pointer-events-none"}`,
17
+ children: [
18
+ title && /* @__PURE__ */ jsx("div", { className: "mb-1.5 border-b border-slate-700 pb-1.5 text-xs font-bold", children: title }),
19
+ children
20
+ ]
21
+ }
22
+ );
23
+ });
24
+ const OFFSET = 10;
25
+ const MARGIN = 12;
26
+ const clamp = (value, size, max) => Math.min(Math.max(MARGIN, value), Math.max(MARGIN, max - MARGIN - size));
27
+ export {
28
+ MARGIN,
29
+ OFFSET,
30
+ clamp,
31
+ TooltipPanel as default
32
+ };
33
+ //# sourceMappingURL=TooltipPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TooltipPanel.js","sources":["../../../../../../src/v1/components/overlays/Tooltip/TooltipPanel.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\r\nimport { popoverReset } from '../topLayer'\r\n\r\n/**\r\n * O painel escuro das tooltips (uso interno): o mesmo para a camada `data-tip`\r\n * (TooltipLayer) e para o `Tooltip` com conteúdo rico. Fica na camada de cima\r\n * do browser (`popover`), por cima de uma janela aberta.\r\n */\r\nconst TooltipPanel = forwardRef<\r\n HTMLDivElement,\r\n {\r\n id?: string\r\n title?: React.ReactNode\r\n children: React.ReactNode\r\n visible: boolean\r\n /** Aceita o rato (para se poder clicar em links lá dentro). */\r\n interactive?: boolean\r\n style?: React.CSSProperties\r\n onMouseEnter?: () => void\r\n onMouseLeave?: () => void\r\n }\r\n>(function TooltipPanel({ id, title, children, visible, interactive = false, style, onMouseEnter, onMouseLeave }, ref) {\r\n return (\r\n <div\r\n ref={ref}\r\n id={id}\r\n popover=\"manual\"\r\n role=\"tooltip\"\r\n hidden={!visible}\r\n style={style}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n className={\r\n `${popoverReset} fixed inset-auto z-[400] max-w-[380px] rounded-xl bg-slate-900 px-3 py-2 text-caption leading-relaxed text-white shadow-modal ` +\r\n `dark:bg-slate-950 dark:ring-1 dark:ring-slate-700 ${interactive ? '' : 'pointer-events-none'}`\r\n }\r\n >\r\n {title && <div className=\"mb-1.5 border-b border-slate-700 pb-1.5 text-xs font-bold\">{title}</div>}\r\n {children}\r\n </div>\r\n )\r\n})\r\n\r\nexport default TooltipPanel\r\n\r\n/** Distância ao cursor/elemento e margem mínima ao bordo da janela. */\r\nexport const OFFSET = 10\r\nexport const MARGIN = 12\r\n\r\n/** Encosta o painel dentro da janela. */\r\nexport const clamp = (value: number, size: number, max: number) => Math.min(Math.max(MARGIN, value), Math.max(MARGIN, max - MARGIN - size))\r\n"],"names":["TooltipPanel"],"mappings":";;;AAQA,MAAM,eAAe,WAanB,SAASA,cAAa,EAAE,IAAI,OAAO,UAAU,SAAS,cAAc,OAAO,OAAO,cAAc,aAAA,GAAgB,KAAK;AACrH,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAQ,CAAC;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,WACE,GAAG,YAAY,oLACsC,cAAc,KAAK,qBAAqB;AAAA,MAG9F,UAAA;AAAA,QAAA,SAAS,oBAAC,OAAA,EAAI,WAAU,6DAA6D,UAAA,OAAM;AAAA,QAC3F;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;AAKM,MAAM,SAAS;AACf,MAAM,SAAS;AAGf,MAAM,QAAQ,CAAC,OAAe,MAAc,QAAgB,KAAK,IAAI,KAAK,IAAI,QAAQ,KAAK,GAAG,KAAK,IAAI,QAAQ,MAAM,SAAS,IAAI,CAAC;"}
@@ -0,0 +1,28 @@
1
+ import { useCallback, useLayoutEffect } from "react";
2
+ function useTopLayer(ref, visible) {
3
+ const raise = useCallback(() => {
4
+ const el = ref.current;
5
+ if (!el || typeof el.showPopover !== "function") return;
6
+ try {
7
+ if (el.matches(":popover-open")) el.hidePopover();
8
+ el.showPopover();
9
+ } catch {
10
+ }
11
+ }, [ref]);
12
+ useLayoutEffect(() => {
13
+ const el = ref.current;
14
+ if (!el || typeof el.showPopover !== "function") return;
15
+ try {
16
+ if (visible) raise();
17
+ else if (el.matches(":popover-open")) el.hidePopover();
18
+ } catch {
19
+ }
20
+ }, [visible, raise, ref]);
21
+ return raise;
22
+ }
23
+ const popoverReset = "m-0 border-0 overflow-visible";
24
+ export {
25
+ popoverReset,
26
+ useTopLayer
27
+ };
28
+ //# sourceMappingURL=topLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topLayer.js","sources":["../../../../../src/v1/components/overlays/topLayer.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, type RefObject } from 'react'\r\n\r\n/**\r\n * Põe um elemento na camada de cima do browser (top layer), por cima de um\r\n * Dialog aberto. Só para uso interno (avisos, tooltips): o elemento tem de ter\r\n * `popover=\"manual\"`.\r\n *\r\n * Um `<dialog>` aberto com `showModal()` fica por cima de tudo o que está na\r\n * página, incluindo `position: fixed` com `z-index` alto. Um popover também vai\r\n * para essa camada, e fica por cima de quem lá entrou antes: por isso `raise()`\r\n * volta a mostrá-lo quando é preciso que apareça à frente de uma janela que\r\n * abriu depois.\r\n *\r\n * Em browsers sem popover (e no jsdom dos testes) não faz nada: o elemento\r\n * continua com o seu `z-index`.\r\n */\r\nexport function useTopLayer(ref: RefObject<HTMLElement | null>, visible: boolean) {\r\n const raise = useCallback(() => {\r\n const el = ref.current\r\n if (!el || typeof el.showPopover !== 'function') return\r\n try {\r\n if (el.matches(':popover-open')) el.hidePopover()\r\n el.showPopover()\r\n } catch {\r\n // Elemento desligado do documento entretanto: ignora.\r\n }\r\n }, [ref])\r\n\r\n useLayoutEffect(() => {\r\n const el = ref.current\r\n if (!el || typeof el.showPopover !== 'function') return\r\n try {\r\n if (visible) raise()\r\n else if (el.matches(':popover-open')) el.hidePopover()\r\n } catch {\r\n // idem\r\n }\r\n }, [visible, raise, ref])\r\n\r\n return raise\r\n}\r\n\r\n/**\r\n * Anula a margem, a borda e o scroll que o browser dá aos popovers. O fundo e o\r\n * espaçamento ficam com cada componente: pôr aqui `bg-transparent`/`p-0` junto\r\n * com o `bg-…`/`px-…` do componente deixava o resultado à mercê da ordem do CSS\r\n * (numa app com Tailwind próprio, a tooltip ficava transparente).\r\n */\r\nexport const popoverReset = 'm-0 border-0 overflow-visible'\r\n"],"names":[],"mappings":";AAgBO,SAAS,YAAY,KAAoC,SAAkB;AAChF,QAAM,QAAQ,YAAY,MAAM;AAC9B,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,MAAM,OAAO,GAAG,gBAAgB,WAAY;AACjD,QAAI;AACF,UAAI,GAAG,QAAQ,eAAe,MAAM,YAAA;AACpC,SAAG,YAAA;AAAA,IACL,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,kBAAgB,MAAM;AACpB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,MAAM,OAAO,GAAG,gBAAgB,WAAY;AACjD,QAAI;AACF,UAAI,QAAS,OAAA;AAAA,eACJ,GAAG,QAAQ,eAAe,MAAM,YAAA;AAAA,IAC3C,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,GAAG,CAAC;AAExB,SAAO;AACT;AAQO,MAAM,eAAe;"}
@@ -0,0 +1,50 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { TableBase } from "../Table/Table.js";
4
+ function PaginatedTable({
5
+ total,
6
+ page,
7
+ onPageChange,
8
+ pageSizeOptions,
9
+ onPageSizeChange,
10
+ pageSize,
11
+ data,
12
+ allData,
13
+ alwaysClient,
14
+ fillHeight = true,
15
+ overlayScrollbars = true,
16
+ horizontalScrollbarBelow = true,
17
+ skeleton = true,
18
+ fadeRight = true,
19
+ ...resto
20
+ }) {
21
+ const [tamanhoProprio, setTamanhoProprio] = useState(pageSize ?? pageSizeOptions?.[0] ?? 50);
22
+ const tamanho = onPageSizeChange ? pageSize ?? pageSizeOptions?.[0] ?? 50 : tamanhoProprio;
23
+ const peloServidor = !!onPageChange && page !== void 0;
24
+ return /* @__PURE__ */ jsx(
25
+ TableBase,
26
+ {
27
+ ...resto,
28
+ data,
29
+ allData: peloServidor ? allData : allData ?? data,
30
+ alwaysClient: peloServidor ? alwaysClient : true,
31
+ pageSize: tamanho,
32
+ fillHeight,
33
+ overlayScrollbars,
34
+ horizontalScrollbarBelow,
35
+ skeleton,
36
+ fadeRight,
37
+ paginacaoNoTopo: {
38
+ total,
39
+ page,
40
+ onPageChange,
41
+ pageSizeOptions,
42
+ onPageSizeChange: onPageSizeChange ?? (pageSizeOptions ? setTamanhoProprio : void 0)
43
+ }
44
+ }
45
+ );
46
+ }
47
+ export {
48
+ PaginatedTable as default
49
+ };
50
+ //# sourceMappingURL=PaginatedTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaginatedTable.js","sources":["../../../../../../src/v1/components/tables/PaginatedTable/PaginatedTable.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { TableBase, type TableProps } from '../Table/Table'\r\n\r\nexport interface PaginatedTableProps<T> extends TableProps<T> {\r\n /**\r\n * Total de linhas no servidor, quando é ele que pagina (`page` e\r\n * `onPageChange`). É o número da contagem e dá o número de páginas.\r\n */\r\n total?: number\r\n /**\r\n * Página atual (a contar de 1), quando é o servidor que pagina: a app pede a\r\n * página e dá-a em `data`. Sem isto, a tabela pagina-se a si mesma com todas\r\n * as linhas de `data`.\r\n */\r\n page?: number\r\n onPageChange?: (page: number) => void\r\n /** Tamanhos de página à escolha (ex: `[60, 120, 250, 500]`). Sem isto não há escolha. */\r\n pageSizeOptions?: number[]\r\n /**\r\n * A pessoa escolheu outro tamanho de página. Quando é o servidor que pagina,\r\n * a app volta à página 1 (ficar na 7.ª com 500 por página caía fora da lista).\r\n * Sem isto, a tabela guarda a escolha ela própria.\r\n */\r\n onPageSizeChange?: (pageSize: number) => void\r\n}\r\n\r\n/**\r\n * A [Table](?path=/docs/v1-components-tables-table--docs) para listas de página inteira: a paginação fica EM CIMA, numa\r\n * barra com a contagem de linhas, o tamanho de página e os números de página,\r\n * em vez de no fundo.\r\n *\r\n * Funciona de duas maneiras:\r\n * - **O servidor pagina** (`page`, `onPageChange`, `total`): `data` é a\r\n * página atual. Com filtros, ordenação ou agrupamento no cabeçalho, a tabela\r\n * passa a paginar o conjunto completo (`allData`) e a barra mostra as\r\n * páginas dela.\r\n * - **Todas as linhas de uma vez** (só `data`): a tabela pagina-se a si mesma.\r\n *\r\n * Por omissão ocupa a altura do pai (`fillHeight`), com as barras de scroll\r\n * por cima das linhas, linhas-esqueleto a carregar e a aresta direita\r\n * esbatida. Qualquer uma pode ser desligada.\r\n */\r\nexport default function PaginatedTable<T>({\r\n total,\r\n page,\r\n onPageChange,\r\n pageSizeOptions,\r\n onPageSizeChange,\r\n pageSize,\r\n data,\r\n allData,\r\n alwaysClient,\r\n fillHeight = true,\r\n overlayScrollbars = true,\r\n horizontalScrollbarBelow = true,\r\n skeleton = true,\r\n fadeRight = true,\r\n ...resto\r\n}: PaginatedTableProps<T>) {\r\n const [tamanhoProprio, setTamanhoProprio] = useState(pageSize ?? pageSizeOptions?.[0] ?? 50)\r\n const tamanho = onPageSizeChange ? (pageSize ?? pageSizeOptions?.[0] ?? 50) : tamanhoProprio\r\n // Sem paginação do servidor, todas as linhas são o conjunto completo e a tabela pagina-as.\r\n const peloServidor = !!onPageChange && page !== undefined\r\n return (\r\n <TableBase\r\n {...resto}\r\n data={data}\r\n allData={peloServidor ? allData : (allData ?? data)}\r\n alwaysClient={peloServidor ? alwaysClient : true}\r\n pageSize={tamanho}\r\n fillHeight={fillHeight}\r\n overlayScrollbars={overlayScrollbars}\r\n horizontalScrollbarBelow={horizontalScrollbarBelow}\r\n skeleton={skeleton}\r\n fadeRight={fadeRight}\r\n paginacaoNoTopo={{\r\n total,\r\n page,\r\n onPageChange,\r\n pageSizeOptions,\r\n onPageSizeChange: onPageSizeChange ?? (pageSizeOptions ? setTamanhoProprio : undefined),\r\n }}\r\n />\r\n )\r\n}\r\n"],"names":[],"mappings":";;;AA0CA,SAAwB,eAAkB;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,2BAA2B;AAAA,EAC3B,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,GAAG;AACL,GAA2B;AACzB,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,YAAY,kBAAkB,CAAC,KAAK,EAAE;AAC3F,QAAM,UAAU,mBAAoB,YAAY,kBAAkB,CAAC,KAAK,KAAM;AAE9E,QAAM,eAAe,CAAC,CAAC,gBAAgB,SAAS;AAChD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,SAAS,eAAe,UAAW,WAAW;AAAA,MAC9C,cAAc,eAAe,eAAe;AAAA,MAC5C,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB,qBAAqB,kBAAkB,oBAAoB;AAAA,MAAA;AAAA,IAC/E;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,292 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useRef, useId, useState, useMemo, useEffect } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { SlidersIcon, ListIcon, ChevronUpIcon, ChevronDownIcon, CheckIcon } from "../../../foundations/icons/icons.js";
5
+ const ALTURA = 420;
6
+ const LARGURA = 320;
7
+ function ColumnFilter({
8
+ labels: L,
9
+ label,
10
+ canSort,
11
+ tipo,
12
+ valores,
13
+ seleccionados,
14
+ intervalo,
15
+ numero,
16
+ ordenadaPor,
17
+ aCarregar,
18
+ ancora,
19
+ onOrdenar,
20
+ onAplicar,
21
+ onAplicarDatas,
22
+ onAplicarNumeros,
23
+ onLimpar,
24
+ onFechar
25
+ }) {
26
+ const caixa = useRef(null);
27
+ const idMin = useId();
28
+ const [busca, setBusca] = useState("");
29
+ const [rascunho, setRascunho] = useState(() => new Set(seleccionados));
30
+ const [de, setDe] = useState(intervalo.from ?? "");
31
+ const [ate, setAte] = useState(intervalo.to ?? "");
32
+ const [min, setMin] = useState(numero?.min ?? "");
33
+ const [max, setMax] = useState(numero?.max ?? "");
34
+ const [modoLista, setModoLista] = useState(tipo === "numero" && !numero?.min && !numero?.max);
35
+ const lista = tipo === "texto" || tipo === "numero" && modoLista;
36
+ const visiveis = useMemo(() => {
37
+ const achados = valores.filter((v) => v.toLowerCase().includes(busca.toLowerCase()));
38
+ if (tipo !== "numero") return achados;
39
+ return [...achados].sort((a, b) => {
40
+ const na = Number(a), nb = Number(b);
41
+ const va = a !== "—" && Number.isFinite(na), vb = b !== "—" && Number.isFinite(nb);
42
+ if (va && vb) return na - nb;
43
+ return va ? -1 : vb ? 1 : a.localeCompare(b);
44
+ });
45
+ }, [valores, busca, tipo]);
46
+ const todosVisiveis = visiveis.length > 0 && visiveis.every((v) => rascunho.has(v));
47
+ const algunsVisiveis = visiveis.some((v) => rascunho.has(v)) && !todosVisiveis;
48
+ const alternarTodos = () => setRascunho((prev) => {
49
+ const n = new Set(prev);
50
+ if (todosVisiveis) for (const v of visiveis) n.delete(v);
51
+ else for (const v of visiveis) n.add(v);
52
+ return n;
53
+ });
54
+ const alternar = (v) => setRascunho((prev) => {
55
+ const n = new Set(prev);
56
+ if (n.has(v)) n.delete(v);
57
+ else n.add(v);
58
+ return n;
59
+ });
60
+ const mesmoConjunto = (a, b) => a.size === b.size && [...a].every((v) => b.has(v));
61
+ const sujo = tipo === "data" ? de !== (intervalo.from ?? "") || ate !== (intervalo.to ?? "") : tipo === "numero" && !modoLista ? min !== (numero?.min ?? "") || max !== (numero?.max ?? "") : !mesmoConjunto(rascunho, seleccionados);
62
+ const temFiltro = seleccionados.size > 0 || !!intervalo.from || !!intervalo.to || !!numero?.min || !!numero?.max;
63
+ useEffect(() => {
64
+ const fora = (e) => {
65
+ if (caixa.current && !caixa.current.contains(e.target)) onFechar();
66
+ };
67
+ const tecla = (e) => {
68
+ if (e.key === "Escape") onFechar();
69
+ };
70
+ const aoRolar = (e) => {
71
+ if (caixa.current && e.target instanceof Node && caixa.current.contains(e.target)) return;
72
+ onFechar();
73
+ };
74
+ document.addEventListener("mousedown", fora);
75
+ document.addEventListener("keydown", tecla);
76
+ window.addEventListener("scroll", aoRolar, true);
77
+ window.addEventListener("resize", onFechar);
78
+ return () => {
79
+ document.removeEventListener("mousedown", fora);
80
+ document.removeEventListener("keydown", tecla);
81
+ window.removeEventListener("scroll", aoRolar, true);
82
+ window.removeEventListener("resize", onFechar);
83
+ };
84
+ }, [onFechar]);
85
+ const botaoModo = tipo === "numero" && /* @__PURE__ */ jsxs(
86
+ "button",
87
+ {
88
+ type: "button",
89
+ onClick: (e) => {
90
+ e.preventDefault();
91
+ setModoLista((m) => !m);
92
+ },
93
+ title: modoLista ? L.showRange : L.showList,
94
+ className: "inline-flex items-center gap-1 text-[9px] font-black uppercase tracking-widest text-slate-400 hover:text-proef-blue flex-shrink-0 whitespace-nowrap",
95
+ children: [
96
+ modoLista ? /* @__PURE__ */ jsx(SlidersIcon, { size: 10 }) : /* @__PURE__ */ jsx(ListIcon, { size: 10 }),
97
+ modoLista ? L.showRange : L.showList
98
+ ]
99
+ }
100
+ );
101
+ const paraCima = window.innerHeight - ancora.bottom < ALTURA && ancora.top > ALTURA;
102
+ return createPortal(
103
+ /* @__PURE__ */ jsxs(
104
+ "div",
105
+ {
106
+ ref: caixa,
107
+ style: {
108
+ position: "fixed",
109
+ left: Math.max(4, Math.min(ancora.left, window.innerWidth - LARGURA - 4)),
110
+ ...paraCima ? { bottom: window.innerHeight - ancora.top + 2 } : { top: ancora.bottom + 2 },
111
+ width: LARGURA,
112
+ maxHeight: ALTURA
113
+ },
114
+ className: "v1-reset z-[250] flex flex-col bg-white border border-slate-200 shadow-lg",
115
+ children: [
116
+ label && /* @__PURE__ */ jsx("div", { className: "px-3 pt-2.5 pb-2 border-b border-slate-100 flex-shrink-0", children: /* @__PURE__ */ jsx("span", { className: "text-[9px] font-black uppercase tracking-widest text-proef-blue", children: label }) }),
117
+ aCarregar && /* @__PURE__ */ jsxs("div", { className: "px-3 py-1.5 bg-amber-50 border-b border-amber-100 flex items-center gap-1.5 text-micro text-amber-700 flex-shrink-0", children: [
118
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "inline-block h-2.5 w-2.5 animate-spin rounded-full border-2 border-current border-t-transparent " }),
119
+ L.loadingOptions
120
+ ] }),
121
+ canSort && onOrdenar && /* @__PURE__ */ jsxs("div", { className: "border-b border-slate-100 p-1.5 space-y-0.5 flex-shrink-0", children: [
122
+ /* @__PURE__ */ jsxs(
123
+ "button",
124
+ {
125
+ onClick: () => onOrdenar("asc"),
126
+ className: `w-full flex items-center gap-2 px-2.5 py-1.5 text-caption font-semibold text-left hover:bg-slate-50 transition-colors ${ordenadaPor === "asc" ? "text-proef-blue bg-slate-50" : "text-slate-600"}`,
127
+ children: [
128
+ /* @__PURE__ */ jsx(ChevronUpIcon, { size: 11 }),
129
+ " ",
130
+ tipo === "data" ? L.sortDateAsc : tipo === "numero" ? L.sortNumAsc : L.sortAsc
131
+ ]
132
+ }
133
+ ),
134
+ /* @__PURE__ */ jsxs(
135
+ "button",
136
+ {
137
+ onClick: () => onOrdenar("desc"),
138
+ className: `w-full flex items-center gap-2 px-2.5 py-1.5 text-caption font-semibold text-left hover:bg-slate-50 transition-colors ${ordenadaPor === "desc" ? "text-proef-blue bg-slate-50" : "text-slate-600"}`,
139
+ children: [
140
+ /* @__PURE__ */ jsx(ChevronDownIcon, { size: 11 }),
141
+ " ",
142
+ tipo === "data" ? L.sortDateDesc : tipo === "numero" ? L.sortNumDesc : L.sortDesc
143
+ ]
144
+ }
145
+ )
146
+ ] }),
147
+ tipo === "data" ? /* @__PURE__ */ jsxs("div", { className: "p-3 space-y-2", children: [
148
+ /* @__PURE__ */ jsxs("label", { className: "block", children: [
149
+ /* @__PURE__ */ jsx("span", { className: "text-[9px] font-black uppercase tracking-widest text-slate-400", children: L.dateFrom }),
150
+ /* @__PURE__ */ jsx(
151
+ "input",
152
+ {
153
+ type: "date",
154
+ value: de,
155
+ onChange: (e) => setDe(e.target.value),
156
+ onKeyDown: (e) => {
157
+ if (e.key === "Enter") onAplicarDatas?.(de, ate);
158
+ },
159
+ className: "w-full mt-0.5 bg-slate-50 border border-slate-100 px-2.5 py-1.5 text-xs outline-none focus:border-proef-blue"
160
+ }
161
+ )
162
+ ] }),
163
+ /* @__PURE__ */ jsxs("label", { className: "block", children: [
164
+ /* @__PURE__ */ jsx("span", { className: "text-[9px] font-black uppercase tracking-widest text-slate-400", children: L.dateTo }),
165
+ /* @__PURE__ */ jsx(
166
+ "input",
167
+ {
168
+ type: "date",
169
+ value: ate,
170
+ onChange: (e) => setAte(e.target.value),
171
+ onKeyDown: (e) => {
172
+ if (e.key === "Enter") onAplicarDatas?.(de, ate);
173
+ },
174
+ className: "w-full mt-0.5 bg-slate-50 border border-slate-100 px-2.5 py-1.5 text-xs outline-none focus:border-proef-blue"
175
+ }
176
+ )
177
+ ] })
178
+ ] }) : !lista ? (
179
+ /* Mín/Máx em vez da lista: numa coluna de dinheiro ou de contagem há
180
+ tantos valores distintos quantas as linhas, e ninguém procura "10.04".
181
+ Vazio de um dos lados vale "sem limite desse lado". */
182
+ /* @__PURE__ */ jsxs("div", { className: "p-3 space-y-2", children: [
183
+ /* @__PURE__ */ jsxs("div", { children: [
184
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center justify-between", children: [
185
+ /* @__PURE__ */ jsx("label", { htmlFor: idMin, className: "text-[9px] font-black uppercase tracking-widest text-slate-400", children: L.min }),
186
+ botaoModo
187
+ ] }),
188
+ /* @__PURE__ */ jsx(
189
+ "input",
190
+ {
191
+ id: idMin,
192
+ type: "number",
193
+ value: min,
194
+ onChange: (e) => setMin(e.target.value),
195
+ onKeyDown: (e) => {
196
+ if (e.key === "Enter") onAplicarNumeros?.(min, max);
197
+ },
198
+ className: "w-full mt-0.5 bg-slate-50 border border-slate-100 px-2.5 py-1.5 text-xs outline-none focus:border-proef-blue"
199
+ }
200
+ )
201
+ ] }),
202
+ /* @__PURE__ */ jsxs("label", { className: "block", children: [
203
+ /* @__PURE__ */ jsx("span", { className: "text-[9px] font-black uppercase tracking-widest text-slate-400", children: L.max }),
204
+ /* @__PURE__ */ jsx(
205
+ "input",
206
+ {
207
+ type: "number",
208
+ value: max,
209
+ onChange: (e) => setMax(e.target.value),
210
+ onKeyDown: (e) => {
211
+ if (e.key === "Enter") onAplicarNumeros?.(min, max);
212
+ },
213
+ className: "w-full mt-0.5 bg-slate-50 border border-slate-100 px-2.5 py-1.5 text-xs outline-none focus:border-proef-blue"
214
+ }
215
+ )
216
+ ] })
217
+ ] })
218
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
219
+ /* @__PURE__ */ jsxs("div", { className: "p-1.5 flex-shrink-0 flex items-center gap-2", children: [
220
+ /* @__PURE__ */ jsx(
221
+ "input",
222
+ {
223
+ autoFocus: true,
224
+ type: "text",
225
+ value: busca,
226
+ onChange: (e) => setBusca(e.target.value),
227
+ placeholder: L.search,
228
+ className: "flex-1 min-w-0 bg-slate-50 border border-slate-100 px-2.5 py-1.5 text-xs outline-none focus:border-proef-blue"
229
+ }
230
+ ),
231
+ botaoModo && /* @__PURE__ */ jsx("span", { className: "pr-1.5", children: botaoModo })
232
+ ] }),
233
+ visiveis.length > 0 && /* @__PURE__ */ jsxs(
234
+ "button",
235
+ {
236
+ onClick: alternarTodos,
237
+ className: "flex items-center gap-2 px-3 py-1.5 border-y border-slate-100 hover:bg-slate-50 text-left flex-shrink-0",
238
+ children: [
239
+ /* @__PURE__ */ jsx("div", { className: `w-3.5 h-3.5 flex items-center justify-center border flex-shrink-0 transition-colors ${todosVisiveis ? "bg-primary border-primary" : algunsVisiveis ? "bg-primary/30 border-primary" : "border-slate-300"}`, children: todosVisiveis && /* @__PURE__ */ jsx(CheckIcon, { size: 9, strokeWidth: 3, className: "text-white" }) }),
240
+ /* @__PURE__ */ jsx("span", { className: "text-caption font-semibold text-slate-600", children: busca ? L.selectAllFound(visiveis.length) : L.selectAll })
241
+ ]
242
+ }
243
+ ),
244
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto p-1.5 space-y-0.5 min-h-0", children: visiveis.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-caption text-slate-400 text-center py-3", children: L.noResults }) : visiveis.map((v) => {
245
+ const escolhido = rascunho.has(v);
246
+ return /* @__PURE__ */ jsxs("button", { onClick: () => alternar(v), className: "w-full flex items-center gap-2 px-2 py-1.5 hover:bg-slate-50 text-left", children: [
247
+ /* @__PURE__ */ jsx("div", { className: `w-3.5 h-3.5 flex items-center justify-center border flex-shrink-0 transition-colors ${escolhido ? "bg-primary border-primary" : "border-slate-300"}`, children: escolhido && /* @__PURE__ */ jsx(CheckIcon, { size: 9, strokeWidth: 3, className: "text-white" }) }),
248
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-slate-700 whitespace-normal break-words leading-snug", children: v })
249
+ ] }, v);
250
+ }) })
251
+ ] }),
252
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 p-1.5 border-t border-slate-100 flex-shrink-0 bg-white", children: [
253
+ /* @__PURE__ */ jsx(
254
+ "button",
255
+ {
256
+ onClick: () => {
257
+ if (tipo === "data") onAplicarDatas?.(de, ate);
258
+ else if (tipo === "numero" && !modoLista) onAplicarNumeros?.(min, max);
259
+ else onAplicar(rascunho);
260
+ },
261
+ disabled: !sujo,
262
+ className: "flex-1 text-micro font-black uppercase tracking-wider text-white bg-primary hover:bg-primary/90 py-1.5 disabled:opacity-30",
263
+ children: L.apply
264
+ }
265
+ ),
266
+ /* @__PURE__ */ jsx(
267
+ "button",
268
+ {
269
+ onClick: onFechar,
270
+ className: "text-micro font-black uppercase tracking-wider text-slate-500 hover:text-slate-700 px-2 py-1.5",
271
+ children: L.cancel
272
+ }
273
+ ),
274
+ temFiltro && /* @__PURE__ */ jsx(
275
+ "button",
276
+ {
277
+ onClick: onLimpar,
278
+ className: "text-micro font-black uppercase tracking-wider text-red-400 hover:text-red-500 px-2 py-1.5",
279
+ children: L.clearFilter
280
+ }
281
+ )
282
+ ] })
283
+ ]
284
+ }
285
+ ),
286
+ document.body
287
+ );
288
+ }
289
+ export {
290
+ ColumnFilter
291
+ };
292
+ //# sourceMappingURL=ColumnFilter.js.map