@proef/common-ui 0.0.0-stage → 2.2.1

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 (452) 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 +324 -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 +271 -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 +227 -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/display/RichText/RichText.js +12 -0
  261. package/dist/esm/v1/primitives/display/RichText/RichText.js.map +1 -0
  262. package/dist/esm/v1/primitives/display/RichText/utils.js +56 -0
  263. package/dist/esm/v1/primitives/display/RichText/utils.js.map +1 -0
  264. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js +137 -0
  265. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js.map +1 -0
  266. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js +26 -0
  267. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js.map +1 -0
  268. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +37 -0
  269. package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -0
  270. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js +150 -0
  271. package/dist/esm/v1/primitives/forms/DateInput/DateInput.js.map +1 -0
  272. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js +37 -0
  273. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -0
  274. package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js +253 -0
  275. package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js.map +1 -0
  276. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js +43 -0
  277. package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js.map +1 -0
  278. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +207 -0
  279. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -0
  280. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js +75 -0
  281. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -0
  282. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js +21 -0
  283. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js.map +1 -0
  284. package/dist/esm/v1/primitives/forms/field.js +14 -0
  285. package/dist/esm/v1/primitives/forms/field.js.map +1 -0
  286. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js +73 -0
  287. package/dist/esm/v1/primitives/lists/ListItem/ListItem.js.map +1 -0
  288. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js +96 -0
  289. package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js.map +1 -0
  290. package/dist/style.components.css +3 -0
  291. package/dist/style.css +2 -0
  292. package/dist/style.layered.css +2 -0
  293. package/dist/tailwind.css +24 -0
  294. package/dist/theme-boot.js +1 -0
  295. package/dist/theme.css +265 -0
  296. package/dist/tokens.css +121 -0
  297. package/dist/types/index.d.ts +14 -0
  298. package/dist/types/legacy/components/atoms/Acronym/Acronym.d.ts +11 -0
  299. package/dist/types/legacy/components/atoms/BreadCrumb/BreadCrumb.d.ts +9 -0
  300. package/dist/types/legacy/components/atoms/Button/variants/ActionButton.d.ts +14 -0
  301. package/dist/types/legacy/components/atoms/Button/variants/FilterButton.d.ts +12 -0
  302. package/dist/types/legacy/components/atoms/Button/variants/IconButton.d.ts +22 -0
  303. package/dist/types/legacy/components/atoms/Button/variants/MainButton.d.ts +17 -0
  304. package/dist/types/legacy/components/atoms/Button/variants/TabButton.d.ts +14 -0
  305. package/dist/types/legacy/components/atoms/Field/Field.d.ts +15 -0
  306. package/dist/types/legacy/components/atoms/IconText/IconText.d.ts +12 -0
  307. package/dist/types/legacy/components/atoms/Icone/Icone.d.ts +31 -0
  308. package/dist/types/legacy/components/atoms/Input/Input.d.ts +13 -0
  309. package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +38 -0
  310. package/dist/types/legacy/components/atoms/Label/Label.d.ts +11 -0
  311. package/dist/types/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +10 -0
  312. package/dist/types/legacy/components/atoms/SearchSelect/SearchSelect.d.ts +15 -0
  313. package/dist/types/legacy/components/atoms/Select/Select.d.ts +16 -0
  314. package/dist/types/legacy/components/atoms/Stack/Stack.d.ts +9 -0
  315. package/dist/types/legacy/components/atoms/Switch/CustomSwitch.d.ts +12 -0
  316. package/dist/types/legacy/components/charts/Charts.d.ts +149 -0
  317. package/dist/types/legacy/components/layout/AppLauncher/AppLauncher.d.ts +35 -0
  318. package/dist/types/legacy/components/layout/Error/Error.d.ts +8 -0
  319. package/dist/types/legacy/components/layout/Footer/Footer.d.ts +11 -0
  320. package/dist/types/legacy/components/layout/Header/Header.d.ts +16 -0
  321. package/dist/types/legacy/components/layout/Layout/Layout.d.ts +35 -0
  322. package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +56 -0
  323. package/dist/types/legacy/components/layout/Spinner/Spinner.d.ts +5 -0
  324. package/dist/types/legacy/components/layout/TopBar/TopBar.d.ts +10 -0
  325. package/dist/types/legacy/components/layout/TopNavLayout/TopNavLayout.d.ts +43 -0
  326. package/dist/types/legacy/components/molecules/BarraValor/BarraValor.d.ts +28 -0
  327. package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +116 -0
  328. package/dist/types/legacy/components/molecules/ConfirmModal/ConfirmModal.d.ts +13 -0
  329. package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +344 -0
  330. package/dist/types/legacy/components/molecules/FileDropzone/FileDropzone.d.ts +25 -0
  331. package/dist/types/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +33 -0
  332. package/dist/types/legacy/components/molecules/Modal/Modal.d.ts +22 -0
  333. package/dist/types/legacy/components/molecules/MultiTagPicker/MultiTagPicker.d.ts +25 -0
  334. package/dist/types/legacy/components/molecules/PhotoAvatar/PhotoAvatar.d.ts +34 -0
  335. package/dist/types/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.d.ts +48 -0
  336. package/dist/types/legacy/components/molecules/Sidebar/Sidebar.d.ts +12 -0
  337. package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +19 -0
  338. package/dist/types/legacy/components/organisms/GanttChart/GanttChart.d.ts +62 -0
  339. package/dist/types/legacy/components/organisms/Kanban/Kanban.d.ts +44 -0
  340. package/dist/types/legacy/components/organisms/LazyLoader/LazyLoader.d.ts +16 -0
  341. package/dist/types/legacy/components/organisms/MapaPontos/MapaPontos.d.ts +206 -0
  342. package/dist/types/legacy/components/organisms/PainelFiltros/PainelFiltros.d.ts +69 -0
  343. package/dist/types/legacy/components/organisms/PesquisaRapida/PesquisaRapida.d.ts +53 -0
  344. package/dist/types/legacy/components/organisms/Profile/Profile.d.ts +12 -0
  345. package/dist/types/legacy/components/organisms/RoleGuard/RoleGuard.d.ts +37 -0
  346. package/dist/types/legacy/components/organisms/Selector/Selector.d.ts +20 -0
  347. package/dist/types/legacy/components/organisms/StatusMatrix/StatusMatrix.d.ts +54 -0
  348. package/dist/types/legacy/components/ui/Avisos.d.ts +33 -0
  349. package/dist/types/legacy/components/ui/BarraAcoes.d.ts +19 -0
  350. package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +23 -0
  351. package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +14 -0
  352. package/dist/types/legacy/components/ui/Confirmacao.d.ts +24 -0
  353. package/dist/types/legacy/components/ui/Escolha.d.ts +35 -0
  354. package/dist/types/legacy/components/ui/FaixaAviso.d.ts +19 -0
  355. package/dist/types/legacy/components/ui/MenuAcoes.d.ts +31 -0
  356. package/dist/types/legacy/components/ui/Passos.d.ts +31 -0
  357. package/dist/types/legacy/components/ui/Separadores.d.ts +19 -0
  358. package/dist/types/legacy/components/ui/TextoAuto.d.ts +23 -0
  359. package/dist/types/legacy/components/ui/Ui.d.ts +181 -0
  360. package/dist/types/legacy/components/ui/painelFlutuante.d.ts +16 -0
  361. package/dist/types/legacy/constants/Colors.d.ts +28 -0
  362. package/dist/types/legacy/constants/FontWeight.d.ts +9 -0
  363. package/dist/types/legacy/contexts/apiContext.d.ts +10 -0
  364. package/dist/types/legacy/contexts/authContext.d.ts +31 -0
  365. package/dist/types/legacy/contexts/socketContext.d.ts +16 -0
  366. package/dist/types/legacy/exports/assets.d.ts +0 -0
  367. package/dist/types/legacy/exports/atoms.d.ts +19 -0
  368. package/dist/types/legacy/exports/charts.d.ts +2 -0
  369. package/dist/types/legacy/exports/constants.d.ts +0 -0
  370. package/dist/types/legacy/exports/contexts.d.ts +3 -0
  371. package/dist/types/legacy/exports/hooks.d.ts +4 -0
  372. package/dist/types/legacy/exports/layout.d.ts +14 -0
  373. package/dist/types/legacy/exports/molecules.d.ts +21 -0
  374. package/dist/types/legacy/exports/organisms.d.ts +17 -0
  375. package/dist/types/legacy/exports/pages.d.ts +5 -0
  376. package/dist/types/legacy/exports/styles.d.ts +2 -0
  377. package/dist/types/legacy/exports/types.d.ts +7 -0
  378. package/dist/types/legacy/exports/ui.d.ts +24 -0
  379. package/dist/types/legacy/exports/utils.d.ts +1 -0
  380. package/dist/types/legacy/hooks/useApi.d.ts +19 -0
  381. package/dist/types/legacy/pages/Error/ErrorPage.d.ts +16 -0
  382. package/dist/types/legacy/pages/Loading/Loading.d.ts +8 -0
  383. package/dist/types/legacy/pages/Login/LoginScreen.d.ts +42 -0
  384. package/dist/types/legacy/pages/NotFound/NotFound.d.ts +8 -0
  385. package/dist/types/legacy/styles/themes/ButtonThemes.d.ts +6 -0
  386. package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
  387. package/dist/types/legacy/types/Fetcher.d.ts +5 -0
  388. package/dist/types/legacy/types/LoggedUser.d.ts +10 -0
  389. package/dist/types/legacy/types/SelectableElement.d.ts +6 -0
  390. package/dist/types/legacy/types/SidebarMenu.d.ts +12 -0
  391. package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
  392. package/dist/types/legacy/types/themes/ButtonThemes.d.ts +21 -0
  393. package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
  394. package/dist/types/legacy/types/themes/IconTextThemes.d.ts +6 -0
  395. package/dist/types/legacy/utils/keycloak.d.ts +0 -0
  396. package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
  397. package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
  398. package/dist/types/v1/capabilities/overlay/useFloatingPanel.d.ts +20 -0
  399. package/dist/types/v1/capabilities/theme/useIsDark.d.ts +10 -0
  400. package/dist/types/v1/capabilities/theme/useTheme.d.ts +29 -0
  401. package/dist/types/v1/components/data/Pagination/Pagination.d.ts +33 -0
  402. package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
  403. package/dist/types/v1/components/feedback/Toast/Toast.d.ts +51 -0
  404. package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
  405. package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +23 -0
  406. package/dist/types/v1/components/layout/AppShell/AppShell.d.ts +35 -0
  407. package/dist/types/v1/components/layout/Page/Page.d.ts +23 -0
  408. package/dist/types/v1/components/layout/PageHeader/PageHeader.d.ts +35 -0
  409. package/dist/types/v1/components/layout/SideNav/SideNav.d.ts +92 -0
  410. package/dist/types/v1/components/layout/navTrail.d.ts +15 -0
  411. package/dist/types/v1/components/lists/ListFinder/ListFinder.d.ts +86 -0
  412. package/dist/types/v1/components/lists/ListFinder/labels.d.ts +24 -0
  413. package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
  414. package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +66 -0
  415. package/dist/types/v1/components/overlays/Tooltip/Tooltip.d.ts +34 -0
  416. package/dist/types/v1/components/overlays/Tooltip/TooltipLayer.d.ts +18 -0
  417. package/dist/types/v1/components/overlays/Tooltip/TooltipPanel.d.ts +23 -0
  418. package/dist/types/v1/components/overlays/topLayer.d.ts +23 -0
  419. package/dist/types/v1/components/tables/PaginatedTable/PaginatedTable.d.ts +41 -0
  420. package/dist/types/v1/components/tables/Table/ColumnFilter.d.ts +48 -0
  421. package/dist/types/v1/components/tables/Table/OverlayScrollbar.d.ts +34 -0
  422. package/dist/types/v1/components/tables/Table/Table.d.ts +250 -0
  423. package/dist/types/v1/components/tables/Table/labels.d.ts +54 -0
  424. package/dist/types/v1/foundations/icons/icons.d.ts +81 -0
  425. package/dist/types/v1/index.d.ts +86 -0
  426. package/dist/types/v1/primitives/buttons/Button/Button.d.ts +35 -0
  427. package/dist/types/v1/primitives/buttons/SegmentedControl/SegmentedControl.d.ts +28 -0
  428. package/dist/types/v1/primitives/buttons/SegmentedControl/segmentedStyles.d.ts +16 -0
  429. package/dist/types/v1/primitives/display/Avatar/Avatar.d.ts +30 -0
  430. package/dist/types/v1/primitives/display/Badge/Badge.d.ts +25 -0
  431. package/dist/types/v1/primitives/display/Card/Card.d.ts +22 -0
  432. package/dist/types/v1/primitives/display/FilterChips/FilterChips.d.ts +33 -0
  433. package/dist/types/v1/primitives/display/Kpi/Kpi.d.ts +68 -0
  434. package/dist/types/v1/primitives/display/Notice/Notice.d.ts +29 -0
  435. package/dist/types/v1/primitives/display/Person/Person.d.ts +15 -0
  436. package/dist/types/v1/primitives/display/RichText/RichText.d.ts +17 -0
  437. package/dist/types/v1/primitives/display/RichText/utils.d.ts +22 -0
  438. package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
  439. package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
  440. package/dist/types/v1/primitives/forms/Checkbox/Checkbox.d.ts +25 -0
  441. package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
  442. package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +28 -0
  443. package/dist/types/v1/primitives/forms/RichTextEditor/RichTextEditor.d.ts +64 -0
  444. package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
  445. package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +70 -0
  446. package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +40 -0
  447. package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
  448. package/dist/types/v1/primitives/forms/field.d.ts +22 -0
  449. package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +67 -0
  450. package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
  451. package/package.json +125 -6
  452. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.js","sources":["../../../../../../src/v1/primitives/display/Card/Card.tsx"],"sourcesContent":["import React from 'react'\r\n\r\nexport interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\r\n /** Título no topo (ex: \"Por estado\"). */\r\n title?: React.ReactNode\r\n /** Ações à direita do título (ex: um botão, um seletor). */\r\n actions?: React.ReactNode\r\n /** `none`: sem margem interior, para tabelas ou listas que vão até à borda. */\r\n padding?: 'md' | 'none'\r\n /** @deprecated Nome antigo (Legacy) de `actions`. */\r\n extra?: React.ReactNode\r\n}\r\n\r\n/**\r\n * Cartão: agrupa um bloco de conteúdo (um gráfico, uma lista, um resumo) num\r\n * fundo próprio com cantos redondos, com título opcional.\r\n *\r\n * Os indicadores soltos usam o `Kpi`; as tabelas da biblioteca já trazem o seu\r\n * contorno e não vão dentro de um cartão.\r\n *\r\n * **Aceita os atributos HTML do `<div>`** (ex: `id`, `data-*`, `onClick`).\r\n */\r\nexport default function Card({ title, actions, extra, padding = 'md', className = '', children, ...props }: CardProps) {\r\n const headerActions = actions ?? extra\r\n return (\r\n <div\r\n {...props}\r\n className={`min-w-0 rounded-xl border border-border bg-card text-foreground dark:border-slate-700 dark:bg-slate-900 ${padding === 'md' ? 'p-4 sm:p-5' : 'overflow-hidden'} ${className}`}\r\n >\r\n {(title || headerActions) && (\r\n <div className={`flex items-start justify-between gap-3 ${padding === 'md' ? 'mb-3.5' : 'px-4 pt-4 pb-3 sm:px-5 sm:pt-5'}`}>\r\n {title && <div className=\"text-sm font-semibold text-foreground\">{title}</div>}\r\n {headerActions}\r\n </div>\r\n )}\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport { Card }\r\n"],"names":[],"mappings":";AAsBA,SAAwB,KAAK,EAAE,OAAO,SAAS,OAAO,UAAU,MAAM,YAAY,IAAI,UAAU,GAAG,MAAA,GAAoB;AACrH,QAAM,gBAAgB,WAAW;AACjC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW,2GAA2G,YAAY,OAAO,eAAe,iBAAiB,IAAI,SAAS;AAAA,MAEpL,UAAA;AAAA,SAAA,SAAS,uCACR,OAAA,EAAI,WAAW,0CAA0C,YAAY,OAAO,WAAW,gCAAgC,IACrH,UAAA;AAAA,UAAA,SAAS,oBAAC,OAAA,EAAI,WAAU,yCAAyC,UAAA,OAAM;AAAA,UACvE;AAAA,QAAA,GACH;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,45 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const TONES = {
3
+ filter: "bg-proef-turquoise/15 text-proef-navy dark:text-proef-turquoise",
4
+ group: "bg-violet-100 text-violet-800 dark:bg-violet-500/20 dark:text-violet-200"
5
+ };
6
+ function FilterChips({ items, onClearAll, clearAllLabel = "Clear all", removeLabel = "Remove", className = "" }) {
7
+ if (items.length === 0) return null;
8
+ return /* @__PURE__ */ jsxs("div", { className: `flex flex-wrap items-center gap-2 ${className}`, children: [
9
+ items.map((it) => /* @__PURE__ */ jsxs(
10
+ "div",
11
+ {
12
+ className: `flex items-center gap-1.5 px-2.5 py-1 text-[10px] font-black uppercase tracking-wider ${it.colorClassName ?? TONES[it.tone ?? "filter"]}`,
13
+ children: [
14
+ it.icon,
15
+ /* @__PURE__ */ jsx("span", { children: it.label }),
16
+ /* @__PURE__ */ jsx(
17
+ "button",
18
+ {
19
+ type: "button",
20
+ onClick: it.onRemove,
21
+ "aria-label": typeof it.label === "string" ? `${removeLabel}: ${it.label}` : removeLabel,
22
+ className: "ml-0.5 cursor-pointer appearance-none border-0 bg-transparent p-0 text-current hover:opacity-70",
23
+ children: "✕"
24
+ }
25
+ )
26
+ ]
27
+ },
28
+ it.key
29
+ )),
30
+ onClearAll && /* @__PURE__ */ jsx(
31
+ "button",
32
+ {
33
+ type: "button",
34
+ onClick: onClearAll,
35
+ className: "cursor-pointer appearance-none border-0 bg-transparent p-0 text-[10px] font-black uppercase tracking-wider text-slate-400 transition-colors hover:text-red-500",
36
+ children: clearAllLabel
37
+ }
38
+ )
39
+ ] });
40
+ }
41
+ export {
42
+ FilterChips,
43
+ FilterChips as default
44
+ };
45
+ //# sourceMappingURL=FilterChips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterChips.js","sources":["../../../../../../src/v1/primitives/display/FilterChips/FilterChips.tsx"],"sourcesContent":["import React from 'react'\r\n\r\nexport interface FilterChipItem {\r\n /** Identificador único da etiqueta. */\r\n key: string\r\n /** Texto (ex: \"Estado: Cancelado\"). */\r\n label: React.ReactNode\r\n /** Tira este filtro. */\r\n onRemove: () => void\r\n /** Ícone antes do texto (ex: o de agrupar). */\r\n icon?: React.ReactNode\r\n /** `filter` (turquesa): um filtro. `group` (violeta): um agrupamento. */\r\n tone?: 'filter' | 'group'\r\n /** Cores próprias (classes), em vez das do `tone` — ex: a cor do estado. */\r\n colorClassName?: string\r\n}\r\n\r\nexport interface FilterChipsProps {\r\n items: FilterChipItem[]\r\n /** Tira todos. Sem isto não aparece o \"Limpar tudo\". */\r\n onClearAll?: () => void\r\n clearAllLabel?: string\r\n /** Nome do botão × para leitores de ecrã (recebe o texto da etiqueta, quando é texto). */\r\n removeLabel?: string\r\n className?: string\r\n}\r\n\r\nconst TONES = {\r\n filter: 'bg-proef-turquoise/15 text-proef-navy dark:text-proef-turquoise',\r\n group: 'bg-violet-100 text-violet-800 dark:bg-violet-500/20 dark:text-violet-200',\r\n}\r\n\r\n/**\r\n * Etiquetas dos filtros ativos, cada uma com × para o tirar, e \"Limpar tudo\".\r\n *\r\n * É o mesmo que a `DataTable` mostra por cima da tabela: usar este sempre que\r\n * um ecrã mostra os filtros escolhidos (ex: ao clicar num gráfico), para se\r\n * reconhecerem como a mesma coisa em todo o lado. Sem itens não desenha nada.\r\n */\r\nexport default function FilterChips({ items, onClearAll, clearAllLabel = 'Clear all', removeLabel = 'Remove', className = '' }: FilterChipsProps) {\r\n if (items.length === 0) return null\r\n return (\r\n <div className={`flex flex-wrap items-center gap-2 ${className}`}>\r\n {items.map((it) => (\r\n <div\r\n key={it.key}\r\n className={`flex items-center gap-1.5 px-2.5 py-1 text-[10px] font-black uppercase tracking-wider ${it.colorClassName ?? TONES[it.tone ?? 'filter']}`}\r\n >\r\n {it.icon}\r\n <span>{it.label}</span>\r\n <button\r\n type=\"button\"\r\n onClick={it.onRemove}\r\n aria-label={typeof it.label === 'string' ? `${removeLabel}: ${it.label}` : removeLabel}\r\n className=\"ml-0.5 cursor-pointer appearance-none border-0 bg-transparent p-0 text-current hover:opacity-70\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n ))}\r\n {onClearAll && (\r\n <button\r\n type=\"button\"\r\n onClick={onClearAll}\r\n className=\"cursor-pointer appearance-none border-0 bg-transparent p-0 text-[10px] font-black uppercase tracking-wider text-slate-400 transition-colors hover:text-red-500\"\r\n >\r\n {clearAllLabel}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport { FilterChips }\r\n"],"names":[],"mappings":";AA2BA,MAAM,QAAQ;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AACT;AASA,SAAwB,YAAY,EAAE,OAAO,YAAY,gBAAgB,aAAa,cAAc,UAAU,YAAY,MAAwB;AAChJ,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SACE,qBAAC,OAAA,EAAI,WAAW,qCAAqC,SAAS,IAC3D,UAAA;AAAA,IAAA,MAAM,IAAI,CAAC,OACV;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAW,yFAAyF,GAAG,kBAAkB,MAAM,GAAG,QAAQ,QAAQ,CAAC;AAAA,QAElJ,UAAA;AAAA,UAAA,GAAG;AAAA,UACJ,oBAAC,QAAA,EAAM,UAAA,GAAG,MAAA,CAAM;AAAA,UAChB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,GAAG;AAAA,cACZ,cAAY,OAAO,GAAG,UAAU,WAAW,GAAG,WAAW,KAAK,GAAG,KAAK,KAAK;AAAA,cAC3E,WAAU;AAAA,cACX,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,MAZK,GAAG;AAAA,IAAA,CAcX;AAAA,IACA,cACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QAET,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;"}
@@ -0,0 +1,103 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ const VALUE_TONES = {
3
+ default: "text-slate-800 dark:text-slate-100",
4
+ brand: "text-proef-blue dark:text-sky-300",
5
+ ok: "text-ok",
6
+ risco: "text-risco",
7
+ incumprido: "text-incumprido"
8
+ };
9
+ const TINTS = {
10
+ default: "bg-white border-slate-200 dark:bg-slate-900 dark:border-slate-700",
11
+ brand: "bg-proef-blue/10 border-transparent dark:bg-sky-500/15",
12
+ ok: "bg-ok-bg border-transparent",
13
+ risco: "bg-risco-bg border-transparent",
14
+ incumprido: "bg-incumprido-bg border-transparent"
15
+ };
16
+ function OpenIcon({ className }) {
17
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": true, viewBox: "0 0 24 24", className, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M7 17 17 7M7 7h10v10" }) });
18
+ }
19
+ function FunnelIcon({ className }) {
20
+ return /* @__PURE__ */ jsx(
21
+ "svg",
22
+ {
23
+ "aria-hidden": true,
24
+ viewBox: "0 0 24 24",
25
+ className,
26
+ fill: "none",
27
+ stroke: "currentColor",
28
+ strokeWidth: 2,
29
+ strokeLinecap: "round",
30
+ strokeLinejoin: "round",
31
+ children: /* @__PURE__ */ jsx("path", { d: "M3 4h18l-7 8.5V19l-4 2v-8.5L3 4z" })
32
+ }
33
+ );
34
+ }
35
+ function Kpi({
36
+ label,
37
+ value,
38
+ tone = "default",
39
+ detail: detailProp,
40
+ icon,
41
+ dot,
42
+ bar: barProp,
43
+ footer: footerProp,
44
+ dense: denseProp,
45
+ tinted: tintedProp,
46
+ onClick,
47
+ clickAction = "filter",
48
+ active = false,
49
+ hint,
50
+ className = "",
51
+ delta,
52
+ bgTint,
53
+ barra,
54
+ rodape,
55
+ denso
56
+ }) {
57
+ const detail = detailProp ?? delta;
58
+ const footer = footerProp ?? rodape;
59
+ const dense = denseProp ?? denso ?? false;
60
+ const tinted = tintedProp ?? bgTint ?? false;
61
+ const bar = barProp ?? (Array.isArray(barra) ? barra.map((x) => ({ weight: x.peso, color: x.cor })) : barra);
62
+ const surface = tinted ? TINTS[tone] : TINTS.default;
63
+ const layout = dense ? "rounded-lg px-2.5 py-1.5 flex flex-col justify-center text-left gap-0.5" : "rounded-xl px-4 py-3 min-h-[88px] flex flex-col items-center justify-center text-center gap-1.5";
64
+ const base = `relative border ${surface} ${layout} ${className}`;
65
+ const totalBar = Array.isArray(bar) ? bar.reduce((s, x) => s + x.weight, 0) : 0;
66
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
67
+ /* @__PURE__ */ jsxs("div", { className: `${dense ? "text-[10px] uppercase tracking-wide" : "text-xs"} text-slate-500 dark:text-slate-400 flex items-center gap-1.5 max-w-full`, children: [
68
+ icon ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "shrink-0 flex", children: icon }) : dot && /* @__PURE__ */ jsx("i", { "aria-hidden": true, className: "w-2 h-2 rounded-full inline-block shrink-0", style: { background: dot } }),
69
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: label })
70
+ ] }),
71
+ /* @__PURE__ */ jsxs("div", { className: dense ? "flex items-baseline gap-1.5" : "", children: [
72
+ /* @__PURE__ */ jsx("span", { className: `${dense ? "text-xl" : "text-2xl"} font-semibold ${VALUE_TONES[tone]}`, children: value }),
73
+ detail && dense && /* @__PURE__ */ jsx("span", { className: "text-[11px] text-slate-400 truncate", children: detail })
74
+ ] }),
75
+ detail && !dense && /* @__PURE__ */ jsx("div", { className: "text-[11.5px] text-slate-400", children: detail }),
76
+ bar != null && /* @__PURE__ */ jsx("div", { className: "w-full h-1 bg-slate-100 dark:bg-slate-800 rounded overflow-hidden flex", children: Array.isArray(bar) ? bar.map((x, i) => /* @__PURE__ */ jsx("i", { style: { width: totalBar ? `${x.weight / totalBar * 100}%` : 0, background: x.color } }, i)) : /* @__PURE__ */ jsx("i", { style: { width: `${Math.min(100, Math.max(0, bar))}%`, background: "currentColor" }, className: VALUE_TONES[tone] }) }),
77
+ footer && /* @__PURE__ */ jsx("div", { className: "text-[11px] text-slate-400", children: footer })
78
+ ] });
79
+ if (!onClick) {
80
+ return /* @__PURE__ */ jsx("div", { "data-tip": hint, className: `${base} ${hint ? "cursor-help" : ""}`, children: content });
81
+ }
82
+ return /* @__PURE__ */ jsxs(
83
+ "button",
84
+ {
85
+ type: "button",
86
+ onClick,
87
+ "data-tip": hint,
88
+ "aria-pressed": active,
89
+ className: `${base} w-full cursor-pointer shadow-sm transition hover:-translate-y-0.5 hover:border-proef-blue dark:hover:border-sky-400 hover:shadow-md focus:outline-none focus-visible:ring-2 focus-visible:ring-proef-blue ${active ? "ring-2 ring-proef-blue border-proef-blue dark:border-sky-400" : ""}`,
90
+ children: [
91
+ /* @__PURE__ */ (() => {
92
+ const cls = `absolute right-2.5 top-2.5 h-3.5 w-3.5 ${active ? "text-proef-blue dark:text-sky-300" : "text-slate-300 dark:text-slate-600"}`;
93
+ return clickAction === "open" ? /* @__PURE__ */ jsx(OpenIcon, { className: cls }) : /* @__PURE__ */ jsx(FunnelIcon, { className: cls });
94
+ })(),
95
+ content
96
+ ]
97
+ }
98
+ );
99
+ }
100
+ export {
101
+ Kpi
102
+ };
103
+ //# sourceMappingURL=Kpi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Kpi.js","sources":["../../../../../../src/v1/primitives/display/Kpi/Kpi.tsx"],"sourcesContent":["import React from 'react'\r\n\r\n/**\r\n * Estados com significado: `ok` (verde), `risco` (âmbar), `incumprido` (vermelho).\r\n * Sem estado: `default` (texto normal) e `brand` (azul da marca).\r\n * A cor é a do número — não usar cores só para enfeitar: um indicador sem\r\n * significado bom/mau fica em `default`.\r\n */\r\nexport type KpiTone = 'default' | 'brand' | 'ok' | 'risco' | 'incumprido'\r\n\r\nexport interface KpiProps {\r\n label: React.ReactNode\r\n value: React.ReactNode\r\n tone?: KpiTone\r\n /** Linha por baixo do valor (ex: \"de 120\", \"+12% do compromisso\"). */\r\n detail?: React.ReactNode\r\n /** Ícone antes do rótulo (ex: `<Inbox size={14} />`). */\r\n icon?: React.ReactNode\r\n /** Ponto colorido antes do rótulo — liga o indicador à cor que ele tem no mapa ou na legenda. */\r\n dot?: string\r\n /**\r\n * Barra por baixo do valor. Um número é uma percentagem; uma lista é uma\r\n * barra repartida, com cada troço proporcional ao seu peso.\r\n *\r\n * Serve para o indicador dizer a PROPORÇÃO e não só o valor: \"253 concluídas\"\r\n * não diz nada sem saber de quantas.\r\n */\r\n bar?: number | { weight: number; color: string }[]\r\n /** Linha pequena no fim, para um dado que acompanha mas não é o indicador. */\r\n footer?: React.ReactNode\r\n /**\r\n * Faixa fina em vez de cartão: alinha à esquerda e corta a altura para metade.\r\n * Para muitos indicadores que empurrariam o conteúdo para fora do ecrã.\r\n */\r\n dense?: boolean\r\n /** Fundo no tom claro da cor, em vez de só o número colorido. */\r\n tinted?: boolean\r\n /** Clicável (ex: filtra a tabela). Mostra o funil no canto (ou a seta, com `clickAction=\"open\"`). */\r\n onClick?: () => void\r\n /** O que o clique faz: `filter` (funil, por omissão) ou `open` (seta: abre uma lista ou um detalhe, não filtra). */\r\n clickAction?: 'filter' | 'open'\r\n /** Filtro ativo (Kpi clicável selecionado): contorno azul. */\r\n active?: boolean\r\n /** Explicação no tooltip (camada `data-tip`), ex: \"Filtrar a tabela\" ou como o valor é calculado. */\r\n hint?: string\r\n className?: string\r\n /** @deprecated Nome antigo (Legacy) de `detail`. */\r\n delta?: React.ReactNode\r\n /** @deprecated Nome antigo (Legacy) de `tinted`. */\r\n bgTint?: boolean\r\n /** @deprecated Nome antigo (Legacy) de `bar`. */\r\n barra?: number | { peso: number; cor: string }[]\r\n /** @deprecated Nome antigo (Legacy) de `footer`. */\r\n rodape?: React.ReactNode\r\n /** @deprecated Nome antigo (Legacy) de `dense`. */\r\n denso?: boolean\r\n}\r\n\r\nconst VALUE_TONES: Record<KpiTone, string> = {\r\n default: 'text-slate-800 dark:text-slate-100',\r\n brand: 'text-proef-blue dark:text-sky-300',\r\n ok: 'text-ok',\r\n risco: 'text-risco',\r\n incumprido: 'text-incumprido',\r\n}\r\n\r\nconst TINTS: Record<KpiTone, string> = {\r\n default: 'bg-white border-slate-200 dark:bg-slate-900 dark:border-slate-700',\r\n brand: 'bg-proef-blue/10 border-transparent dark:bg-sky-500/15',\r\n ok: 'bg-ok-bg border-transparent',\r\n risco: 'bg-risco-bg border-transparent',\r\n incumprido: 'bg-incumprido-bg border-transparent',\r\n}\r\n\r\nfunction OpenIcon({ className }: { className: string }) {\r\n return (\r\n <svg aria-hidden viewBox=\"0 0 24 24\" className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M7 17 17 7M7 7h10v10\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction FunnelIcon({ className }: { className: string }) {\r\n return (\r\n <svg\r\n aria-hidden\r\n viewBox=\"0 0 24 24\"\r\n className={className}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M3 4h18l-7 8.5V19l-4 2v-8.5L3 4z\" />\r\n </svg>\r\n )\r\n}\r\n\r\n/**\r\n * Indicador: um número com o seu rótulo (ex: \"Em progresso 13\"). Quando é\r\n * clicável filtra a vista e mostra-o com o funil; `active` marca o filtro\r\n * aplicado. Dispor vários numa grelha (`grid gap-3`).\r\n */\r\nexport default function Kpi({\r\n label,\r\n value,\r\n tone = 'default',\r\n detail: detailProp,\r\n icon,\r\n dot,\r\n bar: barProp,\r\n footer: footerProp,\r\n dense: denseProp,\r\n tinted: tintedProp,\r\n onClick,\r\n clickAction = 'filter',\r\n active = false,\r\n hint,\r\n className = '',\r\n delta,\r\n bgTint,\r\n barra,\r\n rodape,\r\n denso,\r\n}: KpiProps) {\r\n // A Legacy usa este mesmo Kpi com os nomes antigos.\r\n const detail = detailProp ?? delta\r\n const footer = footerProp ?? rodape\r\n const dense = denseProp ?? denso ?? false\r\n const tinted = tintedProp ?? bgTint ?? false\r\n const bar = barProp ?? (Array.isArray(barra) ? barra.map((x) => ({ weight: x.peso, color: x.cor })) : barra)\r\n const surface = tinted ? TINTS[tone] : TINTS.default\r\n const layout = dense\r\n ? 'rounded-lg px-2.5 py-1.5 flex flex-col justify-center text-left gap-0.5'\r\n : 'rounded-xl px-4 py-3 min-h-[88px] flex flex-col items-center justify-center text-center gap-1.5'\r\n const base = `relative border ${surface} ${layout} ${className}`\r\n const totalBar = Array.isArray(bar) ? bar.reduce((s, x) => s + x.weight, 0) : 0\r\n\r\n const content = (\r\n <>\r\n <div className={`${dense ? 'text-[10px] uppercase tracking-wide' : 'text-xs'} text-slate-500 dark:text-slate-400 flex items-center gap-1.5 max-w-full`}>\r\n {icon ? (\r\n <span aria-hidden className=\"shrink-0 flex\">{icon}</span>\r\n ) : (\r\n dot && <i aria-hidden className=\"w-2 h-2 rounded-full inline-block shrink-0\" style={{ background: dot }} />\r\n )}\r\n <span className=\"truncate\">{label}</span>\r\n </div>\r\n {/* Em denso o valor e o secundário partilham a linha: é o que poupa altura sem tirar informação. */}\r\n <div className={dense ? 'flex items-baseline gap-1.5' : ''}>\r\n <span className={`${dense ? 'text-xl' : 'text-2xl'} font-semibold ${VALUE_TONES[tone]}`}>{value}</span>\r\n {detail && dense && <span className=\"text-[11px] text-slate-400 truncate\">{detail}</span>}\r\n </div>\r\n {detail && !dense && <div className=\"text-[11.5px] text-slate-400\">{detail}</div>}\r\n {bar != null && (\r\n <div className=\"w-full h-1 bg-slate-100 dark:bg-slate-800 rounded overflow-hidden flex\">\r\n {Array.isArray(bar) ? (\r\n bar.map((x, i) => (\r\n <i key={i} style={{ width: totalBar ? `${(x.weight / totalBar) * 100}%` : 0, background: x.color }} />\r\n ))\r\n ) : (\r\n <i style={{ width: `${Math.min(100, Math.max(0, bar))}%`, background: 'currentColor' }} className={VALUE_TONES[tone]} />\r\n )}\r\n </div>\r\n )}\r\n {footer && <div className=\"text-[11px] text-slate-400\">{footer}</div>}\r\n </>\r\n )\r\n\r\n if (!onClick) {\r\n return (\r\n <div data-tip={hint} className={`${base} ${hint ? 'cursor-help' : ''}`}>\r\n {content}\r\n </div>\r\n )\r\n }\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n data-tip={hint}\r\n aria-pressed={active}\r\n className={`${base} w-full cursor-pointer shadow-sm transition hover:-translate-y-0.5 hover:border-proef-blue dark:hover:border-sky-400 hover:shadow-md focus:outline-none focus-visible:ring-2 focus-visible:ring-proef-blue ${\r\n active ? 'ring-2 ring-proef-blue border-proef-blue dark:border-sky-400' : ''\r\n }`}\r\n >\r\n {(() => {\r\n const cls = `absolute right-2.5 top-2.5 h-3.5 w-3.5 ${active ? 'text-proef-blue dark:text-sky-300' : 'text-slate-300 dark:text-slate-600'}`\r\n return clickAction === 'open' ? <OpenIcon className={cls} /> : <FunnelIcon className={cls} />\r\n })()}\r\n {content}\r\n </button>\r\n )\r\n}\r\n\r\nexport { Kpi }\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ const TONES = {
3
+ info: {
4
+ box: "border-sky-200 bg-sky-50 text-sky-950 dark:border-sky-500/30 dark:bg-sky-500/10 dark:text-sky-100",
5
+ banner: "border-sky-200 bg-sky-50 text-sky-900 dark:border-sky-500/30 dark:bg-sky-500/10 dark:text-sky-100",
6
+ icon: "text-sky-600 dark:text-sky-300"
7
+ },
8
+ warning: {
9
+ box: "border-amber-200 bg-amber-50 text-amber-950 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100",
10
+ banner: "border-amber-300 bg-amber-100 text-amber-950 dark:border-amber-500/30 dark:bg-amber-500/15 dark:text-amber-100",
11
+ icon: "text-amber-600 dark:text-amber-300"
12
+ },
13
+ error: {
14
+ box: "border-incumprido/30 bg-incumprido-bg text-incumprido",
15
+ banner: "border-incumprido/30 bg-incumprido-bg text-incumprido",
16
+ icon: "text-incumprido"
17
+ },
18
+ success: {
19
+ box: "border-ok/30 bg-ok-bg text-ok",
20
+ banner: "border-ok/30 bg-ok-bg text-ok",
21
+ icon: "text-ok"
22
+ }
23
+ };
24
+ const ICON_PATHS = {
25
+ info: /* @__PURE__ */ jsxs(Fragment, { children: [
26
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
27
+ /* @__PURE__ */ jsx("path", { d: "M12 16v-4M12 8h.01" })
28
+ ] }),
29
+ warning: /* @__PURE__ */ jsx("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3ZM12 9v4M12 17h.01" }),
30
+ error: /* @__PURE__ */ jsxs(Fragment, { children: [
31
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
32
+ /* @__PURE__ */ jsx("path", { d: "m15 9-6 6M9 9l6 6" })
33
+ ] }),
34
+ success: /* @__PURE__ */ jsxs(Fragment, { children: [
35
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
36
+ /* @__PURE__ */ jsx("path", { d: "m9 12 2 2 4-4" })
37
+ ] })
38
+ };
39
+ function Notice({ tone = "info", title, children, icon, action, variant = "box", className = "" }) {
40
+ const c = TONES[tone];
41
+ const shownIcon = icon === null ? null : icon ?? /* @__PURE__ */ jsx("svg", { "aria-hidden": true, viewBox: "0 0 24 24", width: 16, height: 16, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: ICON_PATHS[tone] });
42
+ const banner = variant === "banner";
43
+ return /* @__PURE__ */ jsxs(
44
+ "div",
45
+ {
46
+ role: tone === "error" ? "alert" : "status",
47
+ className: banner ? `flex flex-wrap items-center gap-x-3 gap-y-1 border-b px-4 py-2 text-xs font-bold ${c.banner} ${className}` : `flex items-start gap-3 rounded-xl border px-4 py-3 text-sm ${c.box} ${className}`,
48
+ children: [
49
+ shownIcon && /* @__PURE__ */ jsx("span", { className: `shrink-0 ${banner ? "" : `mt-0.5 ${c.icon}`}`, children: shownIcon }),
50
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
51
+ title && /* @__PURE__ */ jsx("div", { className: banner ? "" : "mb-0.5 font-semibold", children: title }),
52
+ children && /* @__PURE__ */ jsx("div", { className: banner ? "" : "leading-relaxed opacity-90", children })
53
+ ] }),
54
+ action && /* @__PURE__ */ jsx(
55
+ "button",
56
+ {
57
+ type: "button",
58
+ onClick: action.onClick,
59
+ className: "shrink-0 cursor-pointer rounded-md border-0 bg-transparent p-0 text-[11px] font-black tracking-widest text-current uppercase underline underline-offset-2 hover:no-underline",
60
+ children: action.label
61
+ }
62
+ )
63
+ ]
64
+ }
65
+ );
66
+ }
67
+ export {
68
+ Notice,
69
+ Notice as default
70
+ };
71
+ //# sourceMappingURL=Notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Notice.js","sources":["../../../../../../src/v1/primitives/display/Notice/Notice.tsx"],"sourcesContent":["import React from 'react'\r\n\r\nexport type NoticeTone = 'info' | 'warning' | 'error' | 'success'\r\n\r\nexport interface NoticeProps {\r\n /** `info` (azul), `warning` (âmbar), `error` (vermelho), `success` (verde). */\r\n tone?: NoticeTone\r\n /** Título curto em cima (ex: \"Automação — saída de colaborador\"). */\r\n title?: React.ReactNode\r\n children?: React.ReactNode\r\n /** Ícone à esquerda; por omissão, o do tom. `null` sem ícone. */\r\n icon?: React.ReactNode | null\r\n /** Ação à direita (ex: \"Voltar ao meu perfil\"). */\r\n action?: { label: React.ReactNode; onClick: () => void }\r\n /**\r\n * `box` (por omissão): caixa no meio do conteúdo, para explicar uma regra ou avisar de algo nesse sítio.\r\n * `banner`: faixa a toda a largura no topo, para um estado que afeta a página inteira (ex: \"Ver como\").\r\n */\r\n variant?: 'box' | 'banner'\r\n className?: string\r\n}\r\n\r\nconst TONES: Record<NoticeTone, { box: string; banner: string; icon: string }> = {\r\n info: {\r\n box: 'border-sky-200 bg-sky-50 text-sky-950 dark:border-sky-500/30 dark:bg-sky-500/10 dark:text-sky-100',\r\n banner: 'border-sky-200 bg-sky-50 text-sky-900 dark:border-sky-500/30 dark:bg-sky-500/10 dark:text-sky-100',\r\n icon: 'text-sky-600 dark:text-sky-300',\r\n },\r\n warning: {\r\n box: 'border-amber-200 bg-amber-50 text-amber-950 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-100',\r\n banner: 'border-amber-300 bg-amber-100 text-amber-950 dark:border-amber-500/30 dark:bg-amber-500/15 dark:text-amber-100',\r\n icon: 'text-amber-600 dark:text-amber-300',\r\n },\r\n error: {\r\n box: 'border-incumprido/30 bg-incumprido-bg text-incumprido',\r\n banner: 'border-incumprido/30 bg-incumprido-bg text-incumprido',\r\n icon: 'text-incumprido',\r\n },\r\n success: {\r\n box: 'border-ok/30 bg-ok-bg text-ok',\r\n banner: 'border-ok/30 bg-ok-bg text-ok',\r\n icon: 'text-ok',\r\n },\r\n}\r\n\r\nconst ICON_PATHS: Record<NoticeTone, React.ReactNode> = {\r\n info: (\r\n <>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 16v-4M12 8h.01\" />\r\n </>\r\n ),\r\n warning: <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3ZM12 9v4M12 17h.01\" />,\r\n error: (\r\n <>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"m15 9-6 6M9 9l6 6\" />\r\n </>\r\n ),\r\n success: (\r\n <>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"m9 12 2 2 4-4\" />\r\n </>\r\n ),\r\n}\r\n\r\n/**\r\n * Aviso ou explicação: uma caixa com ícone, título e texto (ex: a regra de uma\r\n * automação, dados possivelmente incompletos), ou uma faixa no topo da página.\r\n * Não é para o resultado de uma ação — esse é um toast (`useToast`).\r\n */\r\nexport default function Notice({ tone = 'info', title, children, icon, action, variant = 'box', className = '' }: NoticeProps) {\r\n const c = TONES[tone]\r\n const shownIcon =\r\n icon === null ? null : (icon ?? (\r\n <svg aria-hidden viewBox=\"0 0 24 24\" width={16} height={16} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n {ICON_PATHS[tone]}\r\n </svg>\r\n ))\r\n const banner = variant === 'banner'\r\n return (\r\n <div\r\n role={tone === 'error' ? 'alert' : 'status'}\r\n className={\r\n banner\r\n ? `flex flex-wrap items-center gap-x-3 gap-y-1 border-b px-4 py-2 text-xs font-bold ${c.banner} ${className}`\r\n : `flex items-start gap-3 rounded-xl border px-4 py-3 text-sm ${c.box} ${className}`\r\n }\r\n >\r\n {shownIcon && <span className={`shrink-0 ${banner ? '' : `mt-0.5 ${c.icon}`}`}>{shownIcon}</span>}\r\n <div className=\"min-w-0 flex-1\">\r\n {title && <div className={banner ? '' : 'mb-0.5 font-semibold'}>{title}</div>}\r\n {children && <div className={banner ? '' : 'leading-relaxed opacity-90'}>{children}</div>}\r\n </div>\r\n {action && (\r\n <button\r\n type=\"button\"\r\n onClick={action.onClick}\r\n className=\"shrink-0 cursor-pointer rounded-md border-0 bg-transparent p-0 text-[11px] font-black tracking-widest text-current uppercase underline underline-offset-2 hover:no-underline\"\r\n >\r\n {action.label}\r\n </button>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport { Notice }\r\n"],"names":[],"mappings":";AAsBA,MAAM,QAA2E;AAAA,EAC/E,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,OAAO;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV;AAEA,MAAM,aAAkD;AAAA,EACtD,MACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,oBAAC,QAAA,EAAK,GAAE,qBAAA,CAAqB;AAAA,EAAA,GAC/B;AAAA,EAEF,SAAS,oBAAC,QAAA,EAAK,GAAE,6FAAA,CAA6F;AAAA,EAC9G,OACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,oBAAC,QAAA,EAAK,GAAE,oBAAA,CAAoB;AAAA,EAAA,GAC9B;AAAA,EAEF,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,oBAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,EAAA,EAAA,CAC1B;AAEJ;AAOA,SAAwB,OAAO,EAAE,OAAO,QAAQ,OAAO,UAAU,MAAM,QAAQ,UAAU,OAAO,YAAY,GAAA,GAAmB;AAC7H,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,YACJ,SAAS,OAAO,OAAQ,QACtB,oBAAC,OAAA,EAAI,eAAW,MAAC,SAAQ,aAAY,OAAO,IAAI,QAAQ,IAAI,MAAK,QAAO,QAAO,gBAAe,aAAa,GAAG,eAAc,SAAQ,gBAAe,SAChJ,UAAA,WAAW,IAAI,EAAA,CAClB;AAEJ,QAAM,SAAS,YAAY;AAC3B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM,SAAS,UAAU,UAAU;AAAA,MACnC,WACE,SACI,oFAAoF,EAAE,MAAM,IAAI,SAAS,KACzG,8DAA8D,EAAE,GAAG,IAAI,SAAS;AAAA,MAGrF,UAAA;AAAA,QAAA,aAAa,oBAAC,QAAA,EAAK,WAAW,YAAY,SAAS,KAAK,UAAU,EAAE,IAAI,EAAE,IAAK,UAAA,WAAU;AAAA,QAC1F,qBAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,UAAA,6BAAU,OAAA,EAAI,WAAW,SAAS,KAAK,wBAAyB,UAAA,OAAM;AAAA,UACtE,YAAY,oBAAC,OAAA,EAAI,WAAW,SAAS,KAAK,8BAA+B,SAAA,CAAS;AAAA,QAAA,GACrF;AAAA,QACC,UACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,OAAO;AAAA,YAChB,WAAU;AAAA,YAET,UAAA,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -0,0 +1,14 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Avatar } from "../Avatar/Avatar.js";
3
+ function Person({ hideName = false, empty = "—", className = "", ...avatar }) {
4
+ const label = (avatar.name ?? "").trim() || avatar.email || "";
5
+ if (!label) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: empty });
6
+ return /* @__PURE__ */ jsxs("span", { className: `inline-flex min-w-0 items-center gap-2 ${className}`, "data-tip": hideName ? label : void 0, children: [
7
+ /* @__PURE__ */ jsx(Avatar, { ...avatar, name: label }),
8
+ !hideName && /* @__PURE__ */ jsx("span", { className: "truncate", children: label })
9
+ ] });
10
+ }
11
+ export {
12
+ Person
13
+ };
14
+ //# sourceMappingURL=Person.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Person.js","sources":["../../../../../../src/v1/primitives/display/Person/Person.tsx"],"sourcesContent":["import React from 'react'\r\nimport Avatar, { type AvatarProps } from '../Avatar/Avatar'\r\n\r\nexport interface PersonProps extends AvatarProps {\r\n /** Só o avatar (o nome fica no cartão e no tooltip), ex: em colunas estreitas. */\r\n hideName?: boolean\r\n /** O que mostrar sem nome nem email. */\r\n empty?: React.ReactNode\r\n}\r\n\r\n/**\r\n * Uma pessoa, igual em todo o lado: o avatar (fotografia ou iniciais, com o cartão\r\n * de detalhes ao passar o rato) e o nome ao lado, numa linha. Usar sempre que se\r\n * mostra o nome de alguém (ex: solicitante, responsável, quem aprovou).\r\n */\r\nexport default function Person({ hideName = false, empty = '—', className = '', ...avatar }: PersonProps) {\r\n const label = (avatar.name ?? '').trim() || avatar.email || ''\r\n if (!label) return <span className=\"text-muted-foreground\">{empty}</span>\r\n return (\r\n <span className={`inline-flex min-w-0 items-center gap-2 ${className}`} data-tip={hideName ? label : undefined}>\r\n <Avatar {...avatar} name={label} />\r\n {!hideName && <span className=\"truncate\">{label}</span>}\r\n </span>\r\n )\r\n}\r\n\r\nexport { Person }\r\n"],"names":[],"mappings":";;AAeA,SAAwB,OAAO,EAAE,WAAW,OAAO,QAAQ,KAAK,YAAY,IAAI,GAAG,UAAuB;AACxG,QAAM,SAAS,OAAO,QAAQ,IAAI,KAAA,KAAU,OAAO,SAAS;AAC5D,MAAI,CAAC,MAAO,4BAAQ,QAAA,EAAK,WAAU,yBAAyB,UAAA,OAAM;AAClE,SACE,qBAAC,UAAK,WAAW,0CAA0C,SAAS,IAAI,YAAU,WAAW,QAAQ,QACnG,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAQ,GAAG,QAAQ,MAAM,MAAA,CAAO;AAAA,IAChC,CAAC,YAAY,oBAAC,QAAA,EAAK,WAAU,YAAY,UAAA,MAAA,CAAM;AAAA,EAAA,GAClD;AAEJ;"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useMemo } from "react";
3
+ import { sanitizeRichText, richTextContentClasses } from "./utils.js";
4
+ function RichText({ value, className = "", ...props }) {
5
+ const html = useMemo(() => sanitizeRichText(value), [value]);
6
+ return /* @__PURE__ */ jsx("div", { className: `${richTextContentClasses} ${className}`, dangerouslySetInnerHTML: { __html: html }, ...props });
7
+ }
8
+ export {
9
+ RichText,
10
+ RichText as default
11
+ };
12
+ //# sourceMappingURL=RichText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichText.js","sources":["../../../../../../src/v1/primitives/display/RichText/RichText.tsx"],"sourcesContent":["import React, { useMemo } from 'react'\r\nimport { richTextContentClasses, sanitizeRichText } from './utils'\r\n\r\nexport interface RichTextProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'dangerouslySetInnerHTML'> {\r\n /** O texto: HTML do RichTextEditor ou texto simples (antigo, sem formatação). */\r\n value: string | null | undefined\r\n}\r\n\r\n/**\r\n * Mostra um texto com formatação (negrito, listas, citações, ligações, imagens) escrito no\r\n * [RichTextEditor](?path=/docs/v1-primitives-forms-richtexteditor--docs).\r\n *\r\n * O HTML é sempre limpo antes de entrar na página: só ficam as marcas de formatação (sem\r\n * scripts, estilos nem eventos) e as ligações abrem noutro separador. Texto sem marcas\r\n * (guardado antes do editor) aparece com as mudanças de linha.\r\n *\r\n * Não tem cor própria: herda a de quem o põe (ex: branco numa bolha navy de uma conversa).\r\n */\r\nexport function RichText({ value, className = '', ...props }: RichTextProps) {\r\n const html = useMemo(() => sanitizeRichText(value), [value])\r\n return <div className={`${richTextContentClasses} ${className}`} dangerouslySetInnerHTML={{ __html: html }} {...props} />\r\n}\r\n\r\nexport default RichText\r\n"],"names":[],"mappings":";;;AAkBO,SAAS,SAAS,EAAE,OAAO,YAAY,IAAI,GAAG,SAAwB;AAC3E,QAAM,OAAO,QAAQ,MAAM,iBAAiB,KAAK,GAAG,CAAC,KAAK,CAAC;AAC3D,SAAO,oBAAC,OAAA,EAAI,WAAW,GAAG,sBAAsB,IAAI,SAAS,IAAI,yBAAyB,EAAE,QAAQ,KAAA,GAAS,GAAG,OAAO;AACzH;"}
@@ -0,0 +1,56 @@
1
+ import DOMPurify from "dompurify";
2
+ const richTextContentClasses = "break-words [&_p]:my-0 [&_p+p]:mt-1.5 [&_ul]:my-1 [&_ul]:list-disc [&_ul]:pl-5 [&_ol]:my-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_li>p]:my-0 [&_blockquote]:my-1.5 [&_blockquote]:border-l-2 [&_blockquote]:border-current/30 [&_blockquote]:pl-3 [&_blockquote]:opacity-80 [&_a]:underline [&_a]:underline-offset-2 [&_u]:underline [&_s]:line-through [&_code]:rounded [&_code]:bg-current/10 [&_code]:px-1 [&_code]:text-[0.92em] [&_img]:my-2 [&_img]:max-w-full [&_img]:rounded-lg";
3
+ const ALLOWED_TAGS = ["p", "br", "strong", "b", "em", "i", "u", "s", "strike", "del", "ul", "ol", "li", "blockquote", "a", "img", "h1", "h2", "h3", "code", "pre", "hr"];
4
+ const ALLOWED_ATTR = ["href", "src", "alt", "title", "target", "rel", "start"];
5
+ let purifier = null;
6
+ function getPurifier() {
7
+ if (purifier) return purifier;
8
+ purifier = DOMPurify(window);
9
+ purifier.addHook("afterSanitizeAttributes", (node) => {
10
+ if (node.tagName === "A" && node.getAttribute("href")) {
11
+ node.setAttribute("target", "_blank");
12
+ node.setAttribute("rel", "noopener noreferrer");
13
+ }
14
+ });
15
+ return purifier;
16
+ }
17
+ function isRichText(value) {
18
+ return !!value && /<\/?[a-z][\s\S]*?>/i.test(value);
19
+ }
20
+ function escapeHtml(text) {
21
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
22
+ }
23
+ function textToRichText(text) {
24
+ if (!text) return "";
25
+ return text.split(/\r?\n/).map((line) => `<p>${escapeHtml(line)}</p>`).join("");
26
+ }
27
+ function sanitizeRichText(value) {
28
+ if (!value) return "";
29
+ const html = isRichText(value) ? value : textToRichText(value);
30
+ return getPurifier().sanitize(html, { ALLOWED_TAGS, ALLOWED_ATTR });
31
+ }
32
+ function richTextToPlain(value) {
33
+ if (!value) return "";
34
+ if (!isRichText(value)) return value;
35
+ const doc = new DOMParser().parseFromString(sanitizeRichText(value), "text/html");
36
+ doc.querySelectorAll("br").forEach((br) => br.replaceWith("\n"));
37
+ doc.querySelectorAll("p, li, blockquote, h1, h2, h3, pre").forEach((el) => {
38
+ if (el.tagName !== "P" && el.querySelector(":scope > p")) return;
39
+ el.append("\n");
40
+ });
41
+ return (doc.body.textContent ?? "").replace(/\n{3,}/g, "\n\n").trim();
42
+ }
43
+ function richTextIsEmpty(value) {
44
+ if (!value) return true;
45
+ if (!isRichText(value)) return !value.trim();
46
+ return !richTextToPlain(value) && !/<img\b/i.test(value);
47
+ }
48
+ export {
49
+ isRichText,
50
+ richTextContentClasses,
51
+ richTextIsEmpty,
52
+ richTextToPlain,
53
+ sanitizeRichText,
54
+ textToRichText
55
+ };
56
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../src/v1/primitives/display/RichText/utils.ts"],"sourcesContent":["import DOMPurify, { type DOMPurify as Purifier } from 'dompurify'\r\n\r\n/**\r\n * Texto com formatação (HTML do [RichTextEditor](?path=/docs/v1-primitives-forms-richtexteditor--docs)):\r\n * as classes do conteúdo e as funções para o guardar, ler e mostrar em segurança.\r\n */\r\n\r\n/**\r\n * Aspeto do conteúdo (listas, citações, ligações, imagens). Sem cor de texto: herda a de quem o põe\r\n * (ex: branco numa bolha navy de conversa).\r\n */\r\nexport const richTextContentClasses =\r\n 'break-words [&_p]:my-0 [&_p+p]:mt-1.5 ' +\r\n '[&_ul]:my-1 [&_ul]:list-disc [&_ul]:pl-5 [&_ol]:my-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_li>p]:my-0 ' +\r\n '[&_blockquote]:my-1.5 [&_blockquote]:border-l-2 [&_blockquote]:border-current/30 [&_blockquote]:pl-3 [&_blockquote]:opacity-80 ' +\r\n '[&_a]:underline [&_a]:underline-offset-2 [&_u]:underline [&_s]:line-through ' +\r\n '[&_code]:rounded [&_code]:bg-current/10 [&_code]:px-1 [&_code]:text-[0.92em] ' +\r\n '[&_img]:my-2 [&_img]:max-w-full [&_img]:rounded-lg'\r\n\r\n// Só o que o editor produz. Tudo o resto (script, style, iframe, on*, javascript:…) sai.\r\nconst ALLOWED_TAGS = ['p', 'br', 'strong', 'b', 'em', 'i', 'u', 's', 'strike', 'del', 'ul', 'ol', 'li', 'blockquote', 'a', 'img', 'h1', 'h2', 'h3', 'code', 'pre', 'hr']\r\nconst ALLOWED_ATTR = ['href', 'src', 'alt', 'title', 'target', 'rel', 'start']\r\n\r\nlet purifier: Purifier | null = null\r\n\r\n/** Instância própria do DOMPurify: o hook das ligações não mexe no DOMPurify global da app. */\r\nfunction getPurifier(): Purifier {\r\n if (purifier) return purifier\r\n purifier = DOMPurify(window)\r\n purifier.addHook('afterSanitizeAttributes', (node) => {\r\n // Ligações abrem noutro separador e sem acesso a esta janela.\r\n if (node.tagName === 'A' && node.getAttribute('href')) {\r\n node.setAttribute('target', '_blank')\r\n node.setAttribute('rel', 'noopener noreferrer')\r\n }\r\n })\r\n return purifier\r\n}\r\n\r\n/** Parece HTML (tem pelo menos uma marca)? Textos antigos, guardados sem formatação, não. */\r\nexport function isRichText(value: string | null | undefined): boolean {\r\n return !!value && /<\\/?[a-z][\\s\\S]*?>/i.test(value)\r\n}\r\n\r\nfunction escapeHtml(text: string): string {\r\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\r\n}\r\n\r\n/** Texto simples → HTML: um parágrafo por linha (as linhas em branco ficam). */\r\nexport function textToRichText(text: string): string {\r\n if (!text) return ''\r\n return text\r\n .split(/\\r?\\n/)\r\n .map((line) => `<p>${escapeHtml(line)}</p>`)\r\n .join('')\r\n}\r\n\r\n/**\r\n * HTML seguro para pôr na página: só as marcas de formatação, sem scripts nem atributos de eventos.\r\n * Texto sem marcas é convertido (uma linha, um parágrafo). Usar sempre antes de `dangerouslySetInnerHTML`.\r\n */\r\nexport function sanitizeRichText(value: string | null | undefined): string {\r\n if (!value) return ''\r\n const html = isRichText(value) ? value : textToRichText(value)\r\n return getPurifier().sanitize(html, { ALLOWED_TAGS, ALLOWED_ATTR })\r\n}\r\n\r\n/** Só o texto (ex: pré-visualização numa lista, notificação, pesquisa). Parágrafos e itens viram linhas. */\r\nexport function richTextToPlain(value: string | null | undefined): string {\r\n if (!value) return ''\r\n if (!isRichText(value)) return value\r\n const doc = new DOMParser().parseFromString(sanitizeRichText(value), 'text/html')\r\n doc.querySelectorAll('br').forEach((br) => br.replaceWith('\\n'))\r\n // Um item ou citação com parágrafos lá dentro já muda de linha pelo parágrafo.\r\n doc.querySelectorAll('p, li, blockquote, h1, h2, h3, pre').forEach((el) => {\r\n if (el.tagName !== 'P' && el.querySelector(':scope > p')) return\r\n el.append('\\n')\r\n })\r\n return (doc.body.textContent ?? '').replace(/\\n{3,}/g, '\\n\\n').trim()\r\n}\r\n\r\n/** Sem texto nem imagens (ex: `<p></p>` de um editor vazio)? Para validar \"obrigatório\". */\r\nexport function richTextIsEmpty(value: string | null | undefined): boolean {\r\n if (!value) return true\r\n if (!isRichText(value)) return !value.trim()\r\n return !richTextToPlain(value) && !/<img\\b/i.test(value)\r\n}\r\n"],"names":[],"mappings":";AAWO,MAAM,yBACX;AAQF,MAAM,eAAe,CAAC,KAAK,MAAM,UAAU,KAAK,MAAM,KAAK,KAAK,KAAK,UAAU,OAAO,MAAM,MAAM,MAAM,cAAc,KAAK,OAAO,MAAM,MAAM,MAAM,QAAQ,OAAO,IAAI;AACvK,MAAM,eAAe,CAAC,QAAQ,OAAO,OAAO,SAAS,UAAU,OAAO,OAAO;AAE7E,IAAI,WAA4B;AAGhC,SAAS,cAAwB;AAC/B,MAAI,SAAU,QAAO;AACrB,aAAW,UAAU,MAAM;AAC3B,WAAS,QAAQ,2BAA2B,CAAC,SAAS;AAEpD,QAAI,KAAK,YAAY,OAAO,KAAK,aAAa,MAAM,GAAG;AACrD,WAAK,aAAa,UAAU,QAAQ;AACpC,WAAK,aAAa,OAAO,qBAAqB;AAAA,IAChD;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAGO,SAAS,WAAW,OAA2C;AACpE,SAAO,CAAC,CAAC,SAAS,sBAAsB,KAAK,KAAK;AACpD;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KAAK,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AACvG;AAGO,SAAS,eAAe,MAAsB;AACnD,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KACJ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,MAAM,WAAW,IAAI,CAAC,MAAM,EAC1C,KAAK,EAAE;AACZ;AAMO,SAAS,iBAAiB,OAA0C;AACzE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,WAAW,KAAK,IAAI,QAAQ,eAAe,KAAK;AAC7D,SAAO,cAAc,SAAS,MAAM,EAAE,cAAc,cAAc;AACpE;AAGO,SAAS,gBAAgB,OAA0C;AACxE,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,CAAC,WAAW,KAAK,EAAG,QAAO;AAC/B,QAAM,MAAM,IAAI,UAAA,EAAY,gBAAgB,iBAAiB,KAAK,GAAG,WAAW;AAChF,MAAI,iBAAiB,IAAI,EAAE,QAAQ,CAAC,OAAO,GAAG,YAAY,IAAI,CAAC;AAE/D,MAAI,iBAAiB,oCAAoC,EAAE,QAAQ,CAAC,OAAO;AACzE,QAAI,GAAG,YAAY,OAAO,GAAG,cAAc,YAAY,EAAG;AAC1D,OAAG,OAAO,IAAI;AAAA,EAChB,CAAC;AACD,UAAQ,IAAI,KAAK,eAAe,IAAI,QAAQ,WAAW,MAAM,EAAE,KAAA;AACjE;AAGO,SAAS,gBAAgB,OAA2C;AACzE,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,CAAC,WAAW,KAAK,EAAG,QAAO,CAAC,MAAM,KAAA;AACtC,SAAO,CAAC,gBAAgB,KAAK,KAAK,CAAC,UAAU,KAAK,KAAK;AACzD;"}
@@ -0,0 +1,137 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect, useCallback } from "react";
3
+ import { loadPdfjs } from "./pdfjs.js";
4
+ const DEFAULT_ASPECT = 0.707;
5
+ async function renderPage(pdf, pageNum, maxSide = 1200) {
6
+ const page = await pdf.getPage(pageNum);
7
+ const base = page.getViewport({ scale: 1 });
8
+ const scale = Math.min(3, Math.max(1, maxSide / Math.max(base.width, base.height)));
9
+ const viewport = page.getViewport({ scale });
10
+ const canvas = document.createElement("canvas");
11
+ canvas.width = Math.ceil(viewport.width);
12
+ canvas.height = Math.ceil(viewport.height);
13
+ const ctx = canvas.getContext("2d");
14
+ ctx.fillStyle = "#fff";
15
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
16
+ await page.render({ canvasContext: ctx, viewport }).promise;
17
+ return canvas.toDataURL("image/jpeg", 0.85);
18
+ }
19
+ function PdfPreview({ file, label, initialFirstPage, className = "" }) {
20
+ const [pdf, setPdf] = useState(null);
21
+ const [numPages, setNumPages] = useState(0);
22
+ const [aspect, setAspect] = useState(null);
23
+ const [imgByPage, setImgByPage] = useState(initialFirstPage ? { 1: initialFirstPage } : {});
24
+ const [failed, setFailed] = useState(false);
25
+ const scrollRef = useRef(null);
26
+ const slotRefs = useRef([]);
27
+ const requested = useRef(new Set(initialFirstPage ? [1] : []));
28
+ useEffect(() => {
29
+ let alive = true;
30
+ let opened = null;
31
+ let idleId = 0;
32
+ setPdf(null);
33
+ setNumPages(0);
34
+ setAspect(null);
35
+ setFailed(false);
36
+ setImgByPage({});
37
+ requested.current = /* @__PURE__ */ new Set();
38
+ slotRefs.current = [];
39
+ const open = async () => {
40
+ try {
41
+ const { getDocument } = await loadPdfjs();
42
+ const data = new Uint8Array(await file.arrayBuffer());
43
+ const doc = await getDocument({ data }).promise;
44
+ if (!alive) {
45
+ doc.destroy();
46
+ return;
47
+ }
48
+ opened = doc;
49
+ setPdf(doc);
50
+ setNumPages(doc.numPages);
51
+ const { width, height } = (await doc.getPage(1)).getViewport({ scale: 1 });
52
+ if (alive && height > 0) setAspect(width / height);
53
+ } catch {
54
+ if (alive) setFailed(true);
55
+ }
56
+ };
57
+ const timer = window.setTimeout(() => {
58
+ if (typeof requestIdleCallback === "function") idleId = requestIdleCallback(open, { timeout: 1200 });
59
+ else open();
60
+ }, 500);
61
+ return () => {
62
+ alive = false;
63
+ opened?.destroy();
64
+ window.clearTimeout(timer);
65
+ if (idleId && typeof cancelIdleCallback === "function") cancelIdleCallback(idleId);
66
+ };
67
+ }, [file]);
68
+ useEffect(() => {
69
+ if (!initialFirstPage) return;
70
+ requested.current.add(1);
71
+ setImgByPage((cur) => cur[1] ? cur : { ...cur, 1: initialFirstPage });
72
+ }, [initialFirstPage]);
73
+ const requestPage = useCallback(
74
+ (p) => {
75
+ if (!pdf || requested.current.has(p)) return;
76
+ requested.current.add(p);
77
+ renderPage(pdf, p).then((url) => setImgByPage((cur) => ({ ...cur, [p]: url }))).catch(() => {
78
+ requested.current.delete(p);
79
+ });
80
+ },
81
+ [pdf]
82
+ );
83
+ useEffect(() => {
84
+ if (!pdf || !numPages) return;
85
+ const io = new IntersectionObserver(
86
+ (entries) => {
87
+ for (const e of entries) {
88
+ if (!e.isIntersecting) continue;
89
+ requestPage(Number(e.target.dataset.page));
90
+ io.unobserve(e.target);
91
+ }
92
+ },
93
+ { root: scrollRef.current, rootMargin: "400px 0px" }
94
+ );
95
+ slotRefs.current.forEach((el) => el && io.observe(el));
96
+ return () => io.disconnect();
97
+ }, [pdf, numPages, requestPage]);
98
+ const count = numPages || 1;
99
+ const slotAspect = aspect ?? DEFAULT_ASPECT;
100
+ if (failed) {
101
+ return /* @__PURE__ */ jsxs("div", { className: `flex h-full w-full flex-col items-center justify-center gap-2.5 bg-card text-muted-foreground ${className}`, children: [
102
+ /* @__PURE__ */ jsxs("svg", { width: "44", height: "44", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.6", "aria-hidden": true, children: [
103
+ /* @__PURE__ */ jsx("path", { d: "M14 2H7a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7z", strokeLinecap: "round", strokeLinejoin: "round" }),
104
+ /* @__PURE__ */ jsx("path", { d: "M14 2v5h5", strokeLinecap: "round", strokeLinejoin: "round" })
105
+ ] }),
106
+ /* @__PURE__ */ jsx("span", { className: "text-xs", children: label })
107
+ ] });
108
+ }
109
+ return /* @__PURE__ */ jsx(
110
+ "div",
111
+ {
112
+ ref: scrollRef,
113
+ className: `flex h-full min-h-0 w-full flex-col items-center gap-3.5 overflow-x-hidden overflow-y-auto bg-card px-4 pt-3.5 pb-[18px] [&::-webkit-scrollbar]:w-2.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-scrollbar [&::-webkit-scrollbar-thumb]:bg-clip-padding [&::-webkit-scrollbar-thumb:hover]:bg-scrollbar-hover ${className}`,
114
+ children: Array.from({ length: count }, (_, i) => {
115
+ const p = i + 1;
116
+ const url = imgByPage[p];
117
+ return /* @__PURE__ */ jsx(
118
+ "div",
119
+ {
120
+ ref: (el) => {
121
+ slotRefs.current[i] = el;
122
+ },
123
+ "data-page": p,
124
+ style: { aspectRatio: String(slotAspect) },
125
+ className: "flex w-full flex-none items-center justify-center overflow-hidden rounded border border-border bg-white shadow-page",
126
+ children: url ? /* @__PURE__ */ jsx("img", { src: url, alt: `${label} — ${p}/${count}`, className: "block h-full w-full object-contain" }) : /* @__PURE__ */ jsx("span", { role: "status", "aria-label": label, className: "inline-block h-[22px] w-[22px] animate-spin rounded-full border-[2.5px] border-primary/20 border-t-primary" })
127
+ },
128
+ p
129
+ );
130
+ })
131
+ }
132
+ );
133
+ }
134
+ export {
135
+ PdfPreview as default
136
+ };
137
+ //# sourceMappingURL=PdfPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfPreview.js","sources":["../../../../../../src/v1/primitives/documents/PdfPreview/PdfPreview.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react'\nimport type { PDFDocumentProxy } from 'pdfjs-dist'\nimport { loadPdfjs } from './pdfjs'\n\nexport interface PdfPreviewProps {\n file: File\n /** Texto alternativo das páginas e mensagem quando o PDF não abre. */\n label: string\n /** Imagem da 1.ª página já renderizada pela app, para aparecer de imediato. */\n initialFirstPage?: string\n className?: string\n}\n\n// Proporção A4 vertical, usada até se saber o tamanho real da página.\nconst DEFAULT_ASPECT = 0.707\n\nasync function renderPage(pdf: PDFDocumentProxy, pageNum: number, maxSide = 1200): Promise<string> {\n const page = await pdf.getPage(pageNum)\n const base = page.getViewport({ scale: 1 })\n const scale = Math.min(3, Math.max(1, maxSide / Math.max(base.width, base.height)))\n const viewport = page.getViewport({ scale })\n const canvas = document.createElement('canvas')\n canvas.width = Math.ceil(viewport.width)\n canvas.height = Math.ceil(viewport.height)\n const ctx = canvas.getContext('2d')!\n ctx.fillStyle = '#fff'\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n await page.render({ canvasContext: ctx, viewport }).promise\n return canvas.toDataURL('image/jpeg', 0.85)\n}\n\n/**\n * Pré-visualização de PDF com pdf.js: as páginas em coluna, com scroll vertical\n * e sem a barra de ferramentas do visualizador nativo (que transborda em caixas\n * estreitas). Cada página só é renderizada quando se aproxima da área visível.\n *\n * **Usado por:** [DocumentDropzone](?path=/docs/v1-components-documents-documentdropzone--docs) (quando o ficheiro é um PDF).\n */\nexport default function PdfPreview({ file, label, initialFirstPage, className = '' }: PdfPreviewProps) {\n const [pdf, setPdf] = useState<PDFDocumentProxy | null>(null)\n const [numPages, setNumPages] = useState(0)\n const [aspect, setAspect] = useState<number | null>(null)\n const [imgByPage, setImgByPage] = useState<Record<number, string>>(initialFirstPage ? { 1: initialFirstPage } : {})\n const [failed, setFailed] = useState(false)\n\n const scrollRef = useRef<HTMLDivElement>(null)\n const slotRefs = useRef<(HTMLDivElement | null)[]>([])\n const requested = useRef<Set<number>>(new Set(initialFirstPage ? [1] : []))\n\n useEffect(() => {\n let alive = true\n let opened: PDFDocumentProxy | null = null\n let idleId = 0\n setPdf(null)\n setNumPages(0)\n setAspect(null)\n setFailed(false)\n // Não semear a página 1 com initialFirstPage aqui: ao mudar de ficheiro, a\n // prop ainda traz a imagem do anterior. O efeito seguinte adota-a quando chegar.\n setImgByPage({})\n requested.current = new Set()\n slotRefs.current = []\n\n const open = async () => {\n try {\n const { getDocument } = await loadPdfjs()\n const data = new Uint8Array(await file.arrayBuffer())\n const doc = await getDocument({ data }).promise\n if (!alive) {\n doc.destroy()\n return\n }\n opened = doc\n setPdf(doc)\n setNumPages(doc.numPages)\n const { width, height } = (await doc.getPage(1)).getViewport({ scale: 1 })\n if (alive && height > 0) setAspect(width / height)\n } catch {\n if (alive) setFailed(true)\n }\n }\n\n // O parse corre na thread principal: espera que a animação de entrada acabe\n // e que a página fique livre, com um limite para nunca ficar parado.\n const timer = window.setTimeout(() => {\n if (typeof requestIdleCallback === 'function') idleId = requestIdleCallback(open, { timeout: 1200 })\n else open()\n }, 500)\n\n return () => {\n alive = false\n opened?.destroy()\n window.clearTimeout(timer)\n if (idleId && typeof cancelIdleCallback === 'function') cancelIdleCallback(idleId)\n }\n }, [file])\n\n useEffect(() => {\n if (!initialFirstPage) return\n requested.current.add(1)\n setImgByPage((cur) => (cur[1] ? cur : { ...cur, 1: initialFirstPage }))\n }, [initialFirstPage])\n\n const requestPage = useCallback(\n (p: number) => {\n if (!pdf || requested.current.has(p)) return\n requested.current.add(p)\n renderPage(pdf, p)\n .then((url) => setImgByPage((cur) => ({ ...cur, [p]: url })))\n .catch(() => {\n requested.current.delete(p)\n })\n },\n [pdf],\n )\n\n useEffect(() => {\n if (!pdf || !numPages) return\n const io = new IntersectionObserver(\n (entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue\n requestPage(Number((e.target as HTMLElement).dataset.page))\n io.unobserve(e.target)\n }\n },\n { root: scrollRef.current, rootMargin: '400px 0px' },\n )\n slotRefs.current.forEach((el) => el && io.observe(el))\n return () => io.disconnect()\n }, [pdf, numPages, requestPage])\n\n const count = numPages || 1\n const slotAspect = aspect ?? DEFAULT_ASPECT\n\n if (failed) {\n return (\n <div className={`flex h-full w-full flex-col items-center justify-center gap-2.5 bg-card text-muted-foreground ${className}`}>\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" aria-hidden>\n <path d=\"M14 2H7a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7z\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M14 2v5h5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"text-xs\">{label}</span>\n </div>\n )\n }\n\n return (\n <div\n ref={scrollRef}\n className={`flex h-full min-h-0 w-full flex-col items-center gap-3.5 overflow-x-hidden overflow-y-auto bg-card px-4 pt-3.5 pb-[18px] [&::-webkit-scrollbar]:w-2.5 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-scrollbar [&::-webkit-scrollbar-thumb]:bg-clip-padding [&::-webkit-scrollbar-thumb:hover]:bg-scrollbar-hover ${className}`}\n >\n {Array.from({ length: count }, (_, i) => {\n const p = i + 1\n const url = imgByPage[p]\n return (\n <div\n key={p}\n ref={(el) => {\n slotRefs.current[i] = el\n }}\n data-page={p}\n style={{ aspectRatio: String(slotAspect) }}\n className=\"flex w-full flex-none items-center justify-center overflow-hidden rounded border border-border bg-white shadow-page\"\n >\n {url ? (\n <img src={url} alt={`${label} — ${p}/${count}`} className=\"block h-full w-full object-contain\" />\n ) : (\n <span role=\"status\" aria-label={label} className=\"inline-block h-[22px] w-[22px] animate-spin rounded-full border-[2.5px] border-primary/20 border-t-primary\" />\n )}\n </div>\n )\n })}\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ let workerSrc = null;
2
+ let loaded = null;
3
+ let loading = null;
4
+ function configurePdfWorker(src) {
5
+ workerSrc = src;
6
+ if (loaded) loaded.GlobalWorkerOptions.workerSrc = src;
7
+ }
8
+ function loadPdfjs() {
9
+ if (!loading) {
10
+ loading = import("pdfjs-dist").then((pdfjs) => {
11
+ if (typeof pdfjs.getDocument !== "function") throw new Error("pdfjs-dist indisponível");
12
+ if (workerSrc) pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;
13
+ loaded = pdfjs;
14
+ return pdfjs;
15
+ }).catch((e) => {
16
+ loading = null;
17
+ throw e;
18
+ });
19
+ }
20
+ return loading;
21
+ }
22
+ export {
23
+ configurePdfWorker,
24
+ loadPdfjs
25
+ };
26
+ //# sourceMappingURL=pdfjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfjs.js","sources":["../../../../../../src/v1/primitives/documents/PdfPreview/pdfjs.ts"],"sourcesContent":["import type * as PdfJs from 'pdfjs-dist'\n\ntype PdfJsModule = typeof PdfJs\n\nlet workerSrc: string | null = null\nlet loaded: PdfJsModule | null = null\nlet loading: Promise<PdfJsModule> | null = null\n\n/**\n * Indica ao pdf.js onde está o worker (`pdf.worker.min.mjs`) servido pela app.\n * Chamar uma vez no arranque. Se a app já define `GlobalWorkerOptions.workerSrc`\n * pela sua própria cópia do pdf.js (a mesma, quando deduplicada), não é preciso.\n */\nexport function configurePdfWorker(src: string) {\n workerSrc = src\n if (loaded) loaded.GlobalWorkerOptions.workerSrc = src\n}\n\n/** Carrega o pdf.js só quando há um PDF para mostrar; depois fica em cache. */\nexport function loadPdfjs(): Promise<PdfJsModule> {\n if (!loading) {\n loading = import('pdfjs-dist')\n .then((pdfjs) => {\n // Salvaguarda: se o pdf.js não chegar (ex: ambiente sem ele), cai no ícone.\n if (typeof pdfjs.getDocument !== 'function') throw new Error('pdfjs-dist indisponível')\n if (workerSrc) pdfjs.GlobalWorkerOptions.workerSrc = workerSrc\n loaded = pdfjs\n return pdfjs\n })\n .catch((e) => {\n loading = null\n throw e\n })\n }\n return loading\n}\n"],"names":[],"mappings":"AAIA,IAAI,YAA2B;AAC/B,IAAI,SAA6B;AACjC,IAAI,UAAuC;AAOpC,SAAS,mBAAmB,KAAa;AAC9C,cAAY;AACZ,MAAI,OAAQ,QAAO,oBAAoB,YAAY;AACrD;AAGO,SAAS,YAAkC;AAChD,MAAI,CAAC,SAAS;AACZ,cAAU,OAAO,YAAY,EAC1B,KAAK,CAAC,UAAU;AAEf,UAAI,OAAO,MAAM,gBAAgB,WAAY,OAAM,IAAI,MAAM,yBAAyB;AACtF,UAAI,UAAW,OAAM,oBAAoB,YAAY;AACrD,eAAS;AACT,aAAO;AAAA,IACT,CAAC,EACA,MAAM,CAAC,MAAM;AACZ,gBAAU;AACV,YAAM;AAAA,IACR,CAAC;AAAA,EACL;AACA,SAAO;AACT;"}