@nextelco/common-ui 2.1.97 → 2.1.99

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 (356) hide show
  1. package/dist/esm/index.js +222 -0
  2. package/dist/esm/index.js.map +1 -0
  3. package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js +5 -0
  4. package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js.map +1 -0
  5. package/dist/esm/legacy/components/atoms/Acronym/Acronym.css +43 -0
  6. package/dist/esm/legacy/components/atoms/Acronym/Acronym.js +31 -0
  7. package/dist/esm/legacy/components/atoms/Acronym/Acronym.js.map +1 -0
  8. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.css +36 -0
  9. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js +57 -0
  10. package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js.map +1 -0
  11. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.css +218 -0
  12. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js +50 -0
  13. package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js.map +1 -0
  14. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.css +56 -0
  15. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js +34 -0
  16. package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js.map +1 -0
  17. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.css +74 -0
  18. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js +29 -0
  19. package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js.map +1 -0
  20. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.css +99 -0
  21. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js +36 -0
  22. package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js.map +1 -0
  23. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.css +63 -0
  24. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js +21 -0
  25. package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js.map +1 -0
  26. package/dist/esm/legacy/components/atoms/Field/Field.css +171 -0
  27. package/dist/esm/legacy/components/atoms/Field/Field.js +70 -0
  28. package/dist/esm/legacy/components/atoms/Field/Field.js.map +1 -0
  29. package/dist/esm/legacy/components/atoms/IconText/IconText.css +10 -0
  30. package/dist/esm/legacy/components/atoms/IconText/IconText.js +25 -0
  31. package/dist/esm/legacy/components/atoms/IconText/IconText.js.map +1 -0
  32. package/dist/esm/legacy/components/atoms/Icone/Icone.js +24 -0
  33. package/dist/esm/legacy/components/atoms/Icone/Icone.js.map +1 -0
  34. package/dist/esm/legacy/components/atoms/Input/Input.css +12 -0
  35. package/dist/esm/legacy/components/atoms/Input/Input.js +28 -0
  36. package/dist/esm/legacy/components/atoms/Input/Input.js.map +1 -0
  37. package/dist/esm/legacy/components/atoms/InputData/InputData.js +36 -0
  38. package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -0
  39. package/dist/esm/legacy/components/atoms/Label/Label.css +192 -0
  40. package/dist/esm/legacy/components/atoms/Label/Label.js +13 -0
  41. package/dist/esm/legacy/components/atoms/Label/Label.js.map +1 -0
  42. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.css +40 -0
  43. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js +21 -0
  44. package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js.map +1 -0
  45. package/dist/esm/legacy/components/atoms/Select/Select.css +16 -0
  46. package/dist/esm/legacy/components/atoms/Select/Select.js +27 -0
  47. package/dist/esm/legacy/components/atoms/Select/Select.js.map +1 -0
  48. package/dist/esm/legacy/components/atoms/Stack/Stack.js +20 -0
  49. package/dist/esm/legacy/components/atoms/Stack/Stack.js.map +1 -0
  50. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.css +36 -0
  51. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js +29 -0
  52. package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js.map +1 -0
  53. package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.css +17 -0
  54. package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js +41 -0
  55. package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js.map +1 -0
  56. package/dist/esm/legacy/components/charts/Charts.js +259 -0
  57. package/dist/esm/legacy/components/charts/Charts.js.map +1 -0
  58. package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js +100 -0
  59. package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js.map +1 -0
  60. package/dist/esm/legacy/components/layout/Error/Error.css +20 -0
  61. package/dist/esm/legacy/components/layout/Error/Error.js +12 -0
  62. package/dist/esm/legacy/components/layout/Error/Error.js.map +1 -0
  63. package/dist/esm/legacy/components/layout/Footer/Footer.css +42 -0
  64. package/dist/esm/legacy/components/layout/Footer/Footer.js +23 -0
  65. package/dist/esm/legacy/components/layout/Footer/Footer.js.map +1 -0
  66. package/dist/esm/legacy/components/layout/Header/Header.css +66 -0
  67. package/dist/esm/legacy/components/layout/Header/Header.js +37 -0
  68. package/dist/esm/legacy/components/layout/Header/Header.js.map +1 -0
  69. package/dist/esm/legacy/components/layout/Layout/Layout.js +92 -0
  70. package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -0
  71. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +227 -0
  72. package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -0
  73. package/dist/esm/legacy/components/layout/Spinner/Spinner.css +10 -0
  74. package/dist/esm/legacy/components/layout/Spinner/Spinner.js +19 -0
  75. package/dist/esm/legacy/components/layout/Spinner/Spinner.js.map +1 -0
  76. package/dist/esm/legacy/components/layout/TopBar/TopBar.js +34 -0
  77. package/dist/esm/legacy/components/layout/TopBar/TopBar.js.map +1 -0
  78. package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js +82 -0
  79. package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js.map +1 -0
  80. package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js +25 -0
  81. package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js.map +1 -0
  82. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +179 -0
  83. package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -0
  84. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.css +3 -0
  85. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js +33 -0
  86. package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js.map +1 -0
  87. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +1145 -0
  88. package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -0
  89. package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js +68 -0
  90. package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js.map +1 -0
  91. package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js +96 -0
  92. package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js.map +1 -0
  93. package/dist/esm/legacy/components/molecules/Modal/Modal.css +54 -0
  94. package/dist/esm/legacy/components/molecules/Modal/Modal.js +64 -0
  95. package/dist/esm/legacy/components/molecules/Modal/Modal.js.map +1 -0
  96. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.css +97 -0
  97. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js +113 -0
  98. package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js.map +1 -0
  99. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js +107 -0
  100. package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js.map +1 -0
  101. package/dist/esm/legacy/components/molecules/Search/Search.css +18 -0
  102. package/dist/esm/legacy/components/molecules/Search/Search.js +30 -0
  103. package/dist/esm/legacy/components/molecules/Search/Search.js.map +1 -0
  104. package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js +116 -0
  105. package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js.map +1 -0
  106. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.css +69 -0
  107. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js +62 -0
  108. package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js.map +1 -0
  109. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +105 -0
  110. package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -0
  111. package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js +162 -0
  112. package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js.map +1 -0
  113. package/dist/esm/legacy/components/organisms/Kanban/Kanban.js +88 -0
  114. package/dist/esm/legacy/components/organisms/Kanban/Kanban.js.map +1 -0
  115. package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js +87 -0
  116. package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js.map +1 -0
  117. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +427 -0
  118. package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -0
  119. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +206 -0
  120. package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -0
  121. package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js +147 -0
  122. package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js.map +1 -0
  123. package/dist/esm/legacy/components/organisms/Profile/Profile.css +26 -0
  124. package/dist/esm/legacy/components/organisms/Profile/Profile.js +26 -0
  125. package/dist/esm/legacy/components/organisms/Profile/Profile.js.map +1 -0
  126. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js +68 -0
  127. package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js.map +1 -0
  128. package/dist/esm/legacy/components/organisms/Selector/Selector.css +87 -0
  129. package/dist/esm/legacy/components/organisms/Selector/Selector.js +181 -0
  130. package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -0
  131. package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js +115 -0
  132. package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js.map +1 -0
  133. package/dist/esm/legacy/components/ui/Avisos.js +86 -0
  134. package/dist/esm/legacy/components/ui/Avisos.js.map +1 -0
  135. package/dist/esm/legacy/components/ui/BarraAcoes.js +19 -0
  136. package/dist/esm/legacy/components/ui/BarraAcoes.js.map +1 -0
  137. package/dist/esm/legacy/components/ui/CabecalhoPagina.js +32 -0
  138. package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -0
  139. package/dist/esm/legacy/components/ui/CaixaPesquisa.js +57 -0
  140. package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -0
  141. package/dist/esm/legacy/components/ui/Confirmacao.js +52 -0
  142. package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -0
  143. package/dist/esm/legacy/components/ui/Escolha.js +157 -0
  144. package/dist/esm/legacy/components/ui/Escolha.js.map +1 -0
  145. package/dist/esm/legacy/components/ui/FaixaAviso.js +17 -0
  146. package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -0
  147. package/dist/esm/legacy/components/ui/MenuAcoes.js +116 -0
  148. package/dist/esm/legacy/components/ui/MenuAcoes.js.map +1 -0
  149. package/dist/esm/legacy/components/ui/Passos.js +32 -0
  150. package/dist/esm/legacy/components/ui/Passos.js.map +1 -0
  151. package/dist/esm/legacy/components/ui/Separadores.js +52 -0
  152. package/dist/esm/legacy/components/ui/Separadores.js.map +1 -0
  153. package/dist/esm/legacy/components/ui/TextoAuto.js +33 -0
  154. package/dist/esm/legacy/components/ui/TextoAuto.js.map +1 -0
  155. package/dist/esm/legacy/components/ui/Ui.js +360 -0
  156. package/dist/esm/legacy/components/ui/Ui.js.map +1 -0
  157. package/dist/esm/legacy/components/ui/painelFlutuante.js +52 -0
  158. package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -0
  159. package/dist/esm/legacy/constants/Colors.js +33 -0
  160. package/dist/esm/legacy/constants/Colors.js.map +1 -0
  161. package/dist/esm/legacy/constants/FontWeight.js +35 -0
  162. package/dist/esm/legacy/constants/FontWeight.js.map +1 -0
  163. package/dist/esm/legacy/contexts/apiContext.js +25 -0
  164. package/dist/esm/legacy/contexts/apiContext.js.map +1 -0
  165. package/dist/esm/legacy/contexts/authContext.js +85 -0
  166. package/dist/esm/legacy/contexts/authContext.js.map +1 -0
  167. package/dist/esm/legacy/contexts/socketContext.js +34 -0
  168. package/dist/esm/legacy/contexts/socketContext.js.map +1 -0
  169. package/dist/esm/legacy/hooks/useApi.js +62 -0
  170. package/dist/esm/legacy/hooks/useApi.js.map +1 -0
  171. package/dist/esm/legacy/hooks/useTheme.js +39 -0
  172. package/dist/esm/legacy/hooks/useTheme.js.map +1 -0
  173. package/dist/esm/legacy/pages/Error/ErrorPage.css +18 -0
  174. package/dist/esm/legacy/pages/Error/ErrorPage.js +50 -0
  175. package/dist/esm/legacy/pages/Error/ErrorPage.js.map +1 -0
  176. package/dist/esm/legacy/pages/Loading/Loading.css +46 -0
  177. package/dist/esm/legacy/pages/Loading/Loading.js +9 -0
  178. package/dist/esm/legacy/pages/Loading/Loading.js.map +1 -0
  179. package/dist/esm/legacy/pages/Login/LoginScreen.js +46 -0
  180. package/dist/esm/legacy/pages/Login/LoginScreen.js.map +1 -0
  181. package/dist/esm/legacy/pages/NotFound/NotFound.css +21 -0
  182. package/dist/esm/legacy/pages/NotFound/NotFound.js +24 -0
  183. package/dist/esm/legacy/pages/NotFound/NotFound.js.map +1 -0
  184. package/dist/esm/legacy/styles/themes/ButtonThemes.js +28 -0
  185. package/dist/esm/legacy/styles/themes/ButtonThemes.js.map +1 -0
  186. package/dist/esm/legacy/styles/utils/utils.js +7 -0
  187. package/dist/esm/legacy/styles/utils/utils.js.map +1 -0
  188. package/dist/esm/legacy/utils/stringUtils.js +35 -0
  189. package/dist/esm/legacy/utils/stringUtils.js.map +1 -0
  190. package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js +157 -0
  191. package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js.map +1 -0
  192. package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js +307 -0
  193. package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js.map +1 -0
  194. package/dist/esm/v1/components/forms/FormField/FormField.js +59 -0
  195. package/dist/esm/v1/components/forms/FormField/FormField.js.map +1 -0
  196. package/dist/esm/v1/components/forms/FormGrid/FormGrid.js +20 -0
  197. package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -0
  198. package/dist/esm/v1/components/overlays/Dialog/Dialog.js +87 -0
  199. package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -0
  200. package/dist/esm/v1/foundations/icons/icons.js +76 -0
  201. package/dist/esm/v1/foundations/icons/icons.js.map +1 -0
  202. package/dist/esm/v1/primitives/buttons/Button/Button.js +27 -0
  203. package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -0
  204. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js +137 -0
  205. package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js.map +1 -0
  206. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js +26 -0
  207. package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js.map +1 -0
  208. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js +37 -0
  209. package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -0
  210. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +29 -0
  211. package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -0
  212. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js +75 -0
  213. package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -0
  214. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js +21 -0
  215. package/dist/esm/v1/primitives/forms/TextInput/TextInput.js.map +1 -0
  216. package/dist/esm/v1/primitives/forms/field.js +12 -0
  217. package/dist/esm/v1/primitives/forms/field.js.map +1 -0
  218. package/dist/style.css +1 -1
  219. package/dist/style.layered.css +1 -1
  220. package/dist/types/index.d.ts +14 -13
  221. package/dist/types/{components → legacy/components}/atoms/Acronym/Acronym.d.ts +1 -0
  222. package/dist/types/{components → legacy/components}/atoms/BreadCrumb/BreadCrumb.d.ts +1 -0
  223. package/dist/types/{components → legacy/components}/atoms/Button/variants/ActionButton.d.ts +1 -0
  224. package/dist/types/{components → legacy/components}/atoms/Button/variants/FilterButton.d.ts +1 -0
  225. package/dist/types/{components → legacy/components}/atoms/Button/variants/IconButton.d.ts +1 -0
  226. package/dist/types/{components → legacy/components}/atoms/Button/variants/MainButton.d.ts +1 -0
  227. package/dist/types/{components → legacy/components}/atoms/Button/variants/TabButton.d.ts +1 -0
  228. package/dist/types/{components → legacy/components}/atoms/Field/Field.d.ts +1 -0
  229. package/dist/types/{components → legacy/components}/atoms/IconText/IconText.d.ts +1 -0
  230. package/dist/types/{components → legacy/components}/atoms/Icone/Icone.d.ts +2 -0
  231. package/dist/types/{components → legacy/components}/atoms/Input/Input.d.ts +1 -0
  232. package/dist/types/{components → legacy/components}/atoms/InputData/InputData.d.ts +4 -0
  233. package/dist/types/{components → legacy/components}/atoms/Label/Label.d.ts +1 -0
  234. package/dist/types/{components → legacy/components}/atoms/Select/Select.d.ts +1 -0
  235. package/dist/types/{components → legacy/components}/atoms/Stack/Stack.d.ts +1 -0
  236. package/dist/types/{components → legacy/components}/atoms/Switch/CustomSwitch.d.ts +1 -0
  237. package/dist/types/{components → legacy/components}/atoms/Tooltip/Tooltip.d.ts +1 -0
  238. package/dist/types/{components → legacy/components}/charts/Charts.d.ts +29 -6
  239. package/dist/types/{components → legacy/components}/layout/AppLauncher/AppLauncher.d.ts +3 -0
  240. package/dist/types/{components → legacy/components}/layout/Error/Error.d.ts +1 -0
  241. package/dist/types/{components → legacy/components}/layout/Footer/Footer.d.ts +1 -0
  242. package/dist/types/{components → legacy/components}/layout/Header/Header.d.ts +1 -0
  243. package/dist/types/{components → legacy/components}/layout/Layout/Layout.d.ts +2 -0
  244. package/dist/types/{components → legacy/components}/layout/Sidebar/Sidebar.d.ts +5 -0
  245. package/dist/types/{components → legacy/components}/layout/Spinner/Spinner.d.ts +1 -0
  246. package/dist/types/{components → legacy/components}/layout/TopBar/TopBar.d.ts +2 -0
  247. package/dist/types/{components → legacy/components}/layout/TopNavLayout/TopNavLayout.d.ts +3 -0
  248. package/dist/types/{components → legacy/components}/molecules/BarraValor/BarraValor.d.ts +3 -0
  249. package/dist/types/{components → legacy/components}/molecules/ColumnPicker/ColumnPicker.d.ts +8 -1
  250. package/dist/types/{components → legacy/components}/molecules/ConfirmModal/ConfirmModal.d.ts +2 -0
  251. package/dist/types/{components → legacy/components}/molecules/DataTable/DataTable.d.ts +6 -0
  252. package/dist/types/{components → legacy/components}/molecules/FileDropzone/FileDropzone.d.ts +3 -0
  253. package/dist/types/{components → legacy/components}/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +3 -0
  254. package/dist/types/{components → legacy/components}/molecules/Modal/Modal.d.ts +2 -0
  255. package/dist/types/{components → legacy/components}/molecules/MultiTagPicker/MultiTagPicker.d.ts +2 -0
  256. package/dist/types/{components → legacy/components}/molecules/PhotoAvatar/PhotoAvatar.d.ts +1 -0
  257. package/dist/types/{components → legacy/components}/molecules/SeletorPesquisa/SeletorPesquisa.d.ts +3 -0
  258. package/dist/types/{components → legacy/components}/molecules/Sidebar/Sidebar.d.ts +1 -0
  259. package/dist/types/{components → legacy/components}/molecules/UserAvatar/UserAvatar.d.ts +1 -0
  260. package/dist/types/{components → legacy/components}/organisms/GanttChart/GanttChart.d.ts +8 -1
  261. package/dist/types/{components → legacy/components}/organisms/Kanban/Kanban.d.ts +3 -0
  262. package/dist/types/{components → legacy/components}/organisms/LazyLoader/LazyLoader.d.ts +1 -0
  263. package/dist/types/{components → legacy/components}/organisms/MapaPontos/MapaPontos.d.ts +12 -2
  264. package/dist/types/{components → legacy/components}/organisms/PainelFiltros/PainelFiltros.d.ts +7 -0
  265. package/dist/types/{components → legacy/components}/organisms/PesquisaRapida/PesquisaRapida.d.ts +5 -0
  266. package/dist/types/{components → legacy/components}/organisms/Profile/Profile.d.ts +1 -0
  267. package/dist/types/{components → legacy/components}/organisms/RoleGuard/RoleGuard.d.ts +6 -1
  268. package/dist/types/{components → legacy/components}/organisms/Selector/Selector.d.ts +1 -0
  269. package/dist/types/{components → legacy/components}/organisms/StatusMatrix/StatusMatrix.d.ts +6 -0
  270. package/dist/types/{components → legacy/components}/ui/Avisos.d.ts +9 -1
  271. package/dist/types/{components → legacy/components}/ui/BarraAcoes.d.ts +2 -0
  272. package/dist/types/{components → legacy/components}/ui/CabecalhoPagina.d.ts +6 -1
  273. package/dist/types/{components → legacy/components}/ui/Confirmacao.d.ts +2 -0
  274. package/dist/types/{components → legacy/components}/ui/Escolha.d.ts +14 -2
  275. package/dist/types/{components → legacy/components}/ui/FaixaAviso.d.ts +3 -0
  276. package/dist/types/{components → legacy/components}/ui/Passos.d.ts +3 -0
  277. package/dist/types/{components → legacy/components}/ui/Separadores.d.ts +3 -0
  278. package/dist/types/{components → legacy/components}/ui/TextoAuto.d.ts +2 -0
  279. package/dist/types/{components → legacy/components}/ui/Ui.d.ts +41 -7
  280. package/dist/types/{constants → legacy/constants}/FontWeight.d.ts +1 -0
  281. package/dist/types/{contexts → legacy/contexts}/apiContext.d.ts +1 -0
  282. package/dist/types/{contexts → legacy/contexts}/authContext.d.ts +2 -0
  283. package/dist/types/{contexts → legacy/contexts}/socketContext.d.ts +2 -0
  284. package/dist/types/{exports → legacy/exports}/hooks.d.ts +1 -1
  285. package/dist/types/{exports → legacy/exports}/molecules.d.ts +2 -1
  286. package/dist/types/legacy/exports/types.d.ts +7 -0
  287. package/dist/types/{hooks → legacy/hooks}/useApi.d.ts +2 -0
  288. package/dist/types/{hooks → legacy/hooks}/useTheme.d.ts +2 -0
  289. package/dist/types/{pages → legacy/pages}/Error/ErrorPage.d.ts +1 -0
  290. package/dist/types/{pages → legacy/pages}/Loading/Loading.d.ts +1 -0
  291. package/dist/types/{pages → legacy/pages}/Login/LoginScreen.d.ts +2 -0
  292. package/dist/types/{pages → legacy/pages}/NotFound/NotFound.d.ts +1 -0
  293. package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
  294. package/dist/types/{types → legacy/types}/Fetcher.d.ts +1 -0
  295. package/dist/types/{types → legacy/types}/LoggedUser.d.ts +1 -0
  296. package/dist/types/{types → legacy/types}/SidebarMenu.d.ts +2 -0
  297. package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
  298. package/dist/types/{types → legacy/types}/themes/ButtonThemes.d.ts +3 -0
  299. package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
  300. package/dist/types/{types → legacy/types}/themes/IconTextThemes.d.ts +1 -0
  301. package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
  302. package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
  303. package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
  304. package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
  305. package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +21 -0
  306. package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +55 -0
  307. package/dist/types/v1/foundations/icons/icons.d.ts +24 -0
  308. package/dist/types/v1/index.d.ts +25 -0
  309. package/dist/types/v1/primitives/buttons/Button/Button.d.ts +18 -0
  310. package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
  311. package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
  312. package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +25 -0
  313. package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +19 -0
  314. package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +37 -0
  315. package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
  316. package/dist/types/v1/primitives/forms/field.d.ts +20 -0
  317. package/package.json +38 -33
  318. package/dist/bundle.js +0 -2
  319. package/dist/bundle.js.LICENSE.txt +0 -80
  320. package/dist/types/components/atoms/Icone/Icone.test.d.ts +0 -1
  321. package/dist/types/components/layout/Sidebar/Sidebar.test.d.ts +0 -1
  322. package/dist/types/components/molecules/BarraValor/BarraValor.test.d.ts +0 -1
  323. package/dist/types/components/molecules/DataTable/DataTable.test.d.ts +0 -1
  324. package/dist/types/components/molecules/SeletorPesquisa/SeletorPesquisa.test.d.ts +0 -1
  325. package/dist/types/components/organisms/Kanban/Kanban.test.d.ts +0 -1
  326. package/dist/types/components/organisms/RoleGuard/RoleGuard.test.d.ts +0 -1
  327. package/dist/types/components/ui/CaixaPesquisa.test.d.ts +0 -1
  328. package/dist/types/components/ui/Escolha.test.d.ts +0 -1
  329. package/dist/types/components/ui/Paginas.test.d.ts +0 -1
  330. package/dist/types/exports/types.d.ts +0 -7
  331. package/dist/types/styles/utils/utils.d.ts +0 -1
  332. package/dist/types/test/setup.d.ts +0 -1
  333. package/dist/types/types/themes/AcronymThemes.d.ts +0 -3
  334. package/dist/types/types/themes/CustomSwitchThemes.d.ts +0 -3
  335. package/dist/types/utils/stringUtils.d.ts +0 -3
  336. /package/dist/types/{components → legacy/components}/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +0 -0
  337. /package/dist/types/{components → legacy/components}/atoms/SearchSelect/SearchSelect.d.ts +0 -0
  338. /package/dist/types/{components → legacy/components}/molecules/Search/Search.d.ts +0 -0
  339. /package/dist/types/{components → legacy/components}/ui/CaixaPesquisa.d.ts +0 -0
  340. /package/dist/types/{components → legacy/components}/ui/MenuAcoes.d.ts +0 -0
  341. /package/dist/types/{components → legacy/components}/ui/painelFlutuante.d.ts +0 -0
  342. /package/dist/types/{constants → legacy/constants}/Colors.d.ts +0 -0
  343. /package/dist/types/{exports → legacy/exports}/assets.d.ts +0 -0
  344. /package/dist/types/{exports → legacy/exports}/atoms.d.ts +0 -0
  345. /package/dist/types/{exports → legacy/exports}/charts.d.ts +0 -0
  346. /package/dist/types/{exports → legacy/exports}/constants.d.ts +0 -0
  347. /package/dist/types/{exports → legacy/exports}/contexts.d.ts +0 -0
  348. /package/dist/types/{exports → legacy/exports}/layout.d.ts +0 -0
  349. /package/dist/types/{exports → legacy/exports}/organisms.d.ts +0 -0
  350. /package/dist/types/{exports → legacy/exports}/pages.d.ts +0 -0
  351. /package/dist/types/{exports → legacy/exports}/styles.d.ts +0 -0
  352. /package/dist/types/{exports → legacy/exports}/ui.d.ts +0 -0
  353. /package/dist/types/{exports → legacy/exports}/utils.d.ts +0 -0
  354. /package/dist/types/{styles → legacy/styles}/themes/ButtonThemes.d.ts +0 -0
  355. /package/dist/types/{types → legacy/types}/SelectableElement.d.ts +0 -0
  356. /package/dist/types/{utils → legacy/utils}/keycloak.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.js","sources":["../../../../../../src/legacy/components/molecules/Modal/Modal.tsx"],"sourcesContent":["import { IconButtonThemeStyled } from '../../../styles/themes/ButtonThemes'\r\nimport IconButton from '../../atoms/Button/variants/IconButton'\r\nimport { faX } from '@fortawesome/free-solid-svg-icons'\r\nimport { RemoveScroll } from 'react-remove-scroll'\r\nimport React, { PropsWithChildren, forwardRef, useRef, useEffect } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport './Modal.scss'\r\n\r\n/**\r\n * Largura do modal.\r\n *\r\n * Sem `size` o modal mede-se pelo conteúdo (entre `min-width: 500px` e\r\n * `max-width: 90%`), que é o comportamento histórico — não se define um\r\n * default para não mexer na aparência dos portais que já o usam.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'xl'\r\n\r\ntype Props = PropsWithChildren<{\r\n title: string\r\n modalOnly?: boolean\r\n onClose: () => void\r\n /** Largura fixa. Omitir mantém a largura pelo conteúdo. */\r\n size?: ModalSize\r\n}>\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst Modal = forwardRef<HTMLDivElement, Props>(\r\n ({ title, onClose, modalOnly, size, children }, ref) => {\r\n const modalRef = useRef<HTMLDivElement>(null)\r\n const containerRef = ref || modalRef\r\n\r\n function closeModal() {\r\n onClose()\r\n }\r\n\r\n const handleOverlayClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget) {\r\n closeModal()\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n const handleEsc = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n closeModal()\r\n }\r\n }\r\n window.addEventListener('keydown', handleEsc)\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleEsc)\r\n }\r\n }, [])\r\n\r\n // Create a portal to render the modal content\r\n const modalContent = (\r\n <RemoveScroll>\r\n <div\r\n className=\"cui-modal-overlay\"\r\n onClick={handleOverlayClick}\r\n ref={containerRef}\r\n >\r\n {modalOnly ? (\r\n children\r\n ) : (\r\n <div className={`cui-modal-content${size ? ` cui-modal-${size}` : ''}`}>\r\n <div className=\"cui-modal-header\">\r\n <h2 className=\"cui-modal-title\">{title}</h2>\r\n <IconButton\r\n icon={faX}\r\n onClick={closeModal}\r\n theme={IconButtonThemeStyled}\r\n />\r\n </div>\r\n <div className=\"cui-modal-body\">{children}</div>\r\n </div>\r\n )}\r\n </div>\r\n </RemoveScroll>\r\n )\r\n\r\n // If a ref is provided, let the parent handle the portal rendering\r\n if (ref) {\r\n return modalContent\r\n }\r\n\r\n // Otherwise, create a portal to document.body\r\n return createPortal(modalContent, document.body)\r\n }\r\n)\r\n\r\nModal.displayName = 'Modal'\r\nexport default Modal\r\n"],"names":[],"mappings":";;;;;;;;AA2BA,MAAM,QAAQ;AAAA,EACZ,CAAC,EAAE,OAAO,SAAS,WAAW,MAAM,SAAA,GAAY,QAAQ;AACtD,UAAM,WAAW,OAAuB,IAAI;AAC5C,UAAM,eAAe,OAAO;AAE5B,aAAS,aAAa;AACpB,cAAA;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,MAAwC;AAClE,UAAI,EAAE,WAAW,EAAE,eAAe;AAChC,mBAAA;AAAA,MACF;AAAA,IACF;AAEA,cAAU,MAAM;AACd,YAAM,YAAY,CAAC,MAAqB;AACtC,YAAI,EAAE,QAAQ,UAAU;AACtB,qBAAA;AAAA,QACF;AAAA,MACF;AACA,aAAO,iBAAiB,WAAW,SAAS;AAE5C,aAAO,MAAM;AACX,eAAO,oBAAoB,WAAW,SAAS;AAAA,MACjD;AAAA,IACF,GAAG,CAAA,CAAE;AAGL,UAAM,mCACH,cAAA,EACC,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA,QACT,KAAK;AAAA,QAEJ,UAAA,YACC,WAEA,qBAAC,OAAA,EAAI,WAAW,oBAAoB,OAAO,cAAc,IAAI,KAAK,EAAE,IAClE,UAAA;AAAA,UAAA,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,YAAA,oBAAC,MAAA,EAAG,WAAU,mBAAmB,UAAA,OAAM;AAAA,YACvC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,OAAO;AAAA,cAAA;AAAA,YAAA;AAAA,UACT,GACF;AAAA,UACA,oBAAC,OAAA,EAAI,WAAU,kBAAkB,SAAA,CAAS;AAAA,QAAA,EAAA,CAC5C;AAAA,MAAA;AAAA,IAAA,GAGN;AAIF,QAAI,KAAK;AACP,aAAO;AAAA,IACT;AAGA,WAAO,aAAa,cAAc,SAAS,IAAI;AAAA,EACjD;AACF;AAEA,MAAM,cAAc;"}
@@ -0,0 +1,97 @@
1
+ .cui-multiTagPicker {
2
+ display: flex;
3
+ width: 100%;
4
+ flex-direction: column;
5
+ }
6
+
7
+ .cui-multiTagPicker-container {
8
+ width: 100%;
9
+ position: relative;
10
+ display: flex;
11
+ justify-content: center;
12
+ align-items: flex-start;
13
+ }
14
+
15
+ .cui-multiTagPicker-search {
16
+ flex-grow: 1;
17
+ width: 100%;
18
+ min-height: 32px;
19
+ max-height: 100px;
20
+ border-radius: 24px;
21
+ background-color: var(--light-gray-02);
22
+ border: solid rgba(0, 0, 0, 0.2) 1px;
23
+ padding: 5px 10px 5px 35px;
24
+ box-shadow: inset 0px 1px 1px rgb(194, 194, 194);
25
+ display: flex;
26
+ flex-wrap: wrap;
27
+ gap: 6px;
28
+ overflow: auto;
29
+ }
30
+ .cui-multiTagPicker-search .pointer {
31
+ cursor: pointer;
32
+ }
33
+
34
+ .cui-multiTagPicker-search li {
35
+ min-width: fit-content;
36
+ display: flex;
37
+ align-items: center;
38
+ gap: 6px;
39
+ list-style-type: none;
40
+ background-color: var(--dark-blue);
41
+ border-radius: 15px;
42
+ color: var(--almost-white);
43
+ font-size: 15px;
44
+ padding: 7px 10px 7px 10px;
45
+ }
46
+
47
+ .cui-multiTagPicker-search input[type=text]:focus {
48
+ outline: none;
49
+ }
50
+
51
+ .cui-multiTagPicker-input {
52
+ border: none;
53
+ flex-grow: 1;
54
+ background: transparent;
55
+ height: 32px;
56
+ }
57
+
58
+ .cui-multiTagPicker-magnifier {
59
+ position: absolute;
60
+ top: 14px;
61
+ left: 14px;
62
+ }
63
+
64
+ .cui-multiTagPicker-no-options {
65
+ color: var(--dark-blue);
66
+ font-size: 13px;
67
+ text-align: center;
68
+ margin-top: 15px;
69
+ }
70
+
71
+ .cui-multiTagPicker-spinner {
72
+ margin-top: 20px;
73
+ flex: 1;
74
+ }
75
+
76
+ .cui-multiTagPicker-options-container {
77
+ flex: 1;
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: 10px;
81
+ overflow: auto;
82
+ box-sizing: border-box;
83
+ margin-top: 10px;
84
+ }
85
+
86
+ .cui-multiTagPicker-options {
87
+ flex: 1;
88
+ width: 100%;
89
+ overflow-y: auto;
90
+ overflow-x: hidden;
91
+ box-sizing: border-box;
92
+ display: grid;
93
+ grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
94
+ gap: 10px;
95
+ align-content: start;
96
+ padding: 10px 10px 10px 0px;
97
+ }
@@ -0,0 +1,113 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useMemo } from "react";
3
+ import InfiniteScroll from "react-infinite-scroll-component";
4
+ import { faCircleMinus, faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons";
5
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
6
+ import { Color } from "../../../constants/Colors.js";
7
+ import Select from "../../atoms/MultiTagPickerTag/MultiTagPickerTag.js";
8
+ import Spinner from "../../layout/Spinner/Spinner.js";
9
+ import './MultiTagPicker.css';/* empty css */
10
+ const MultiTagPicker = (props) => {
11
+ const {
12
+ placeholder,
13
+ noOptionsLabel,
14
+ searchInput,
15
+ editable,
16
+ loading,
17
+ optionsSelected,
18
+ options,
19
+ hasMoreItems,
20
+ handleRemoveItem,
21
+ handleInputChange,
22
+ handleInputKeyDown,
23
+ handleAddItem,
24
+ loadMore
25
+ } = props;
26
+ function handleInputKeyDownInner(event) {
27
+ event.preventDefault();
28
+ editable && handleInputKeyDown && handleInputKeyDown();
29
+ }
30
+ function handleInputChangeInner(event) {
31
+ editable && handleInputChange && handleInputChange(event.target.value);
32
+ }
33
+ const selectedIds = useMemo(
34
+ () => new Set(optionsSelected.map((o) => o.id)),
35
+ [optionsSelected]
36
+ );
37
+ const showSelected = optionsSelected.map((option) => /* @__PURE__ */ jsxs("li", { children: [
38
+ /* @__PURE__ */ jsx("p", { children: option.label }),
39
+ /* @__PURE__ */ jsx(
40
+ FontAwesomeIcon,
41
+ {
42
+ size: "sm",
43
+ icon: faCircleMinus,
44
+ className: `${editable && "pointer"}`,
45
+ color: "#F8F8F8",
46
+ onClick: () => editable && handleRemoveItem(option.id)
47
+ }
48
+ )
49
+ ] }, option.id));
50
+ return /* @__PURE__ */ jsxs("div", { className: "cui-multiTagPicker", children: [
51
+ /* @__PURE__ */ jsxs(
52
+ "form",
53
+ {
54
+ onSubmit: handleInputKeyDownInner,
55
+ className: "cui-multiTagPicker-container",
56
+ children: [
57
+ /* @__PURE__ */ jsx(
58
+ FontAwesomeIcon,
59
+ {
60
+ size: "1x",
61
+ icon: faMagnifyingGlass,
62
+ className: "cui-multiTagPicker-magnifier",
63
+ color: Color.MEDIUM_GRAY_01
64
+ }
65
+ ),
66
+ /* @__PURE__ */ jsxs("div", { className: "cui-multiTagPicker-search", children: [
67
+ showSelected,
68
+ " ",
69
+ /* @__PURE__ */ jsx(
70
+ "input",
71
+ {
72
+ className: "cui-multiTagPicker-input",
73
+ type: "text",
74
+ value: searchInput,
75
+ onChange: handleInputChangeInner,
76
+ placeholder: editable ? placeholder : "",
77
+ disabled: !editable || loading
78
+ }
79
+ )
80
+ ] })
81
+ ]
82
+ }
83
+ ),
84
+ options.length === 0 && !loading && /* @__PURE__ */ jsx("p", { className: "cui-multiTagPicker-no-options", children: noOptionsLabel }),
85
+ editable && (loading ? /* @__PURE__ */ jsx("div", { className: "cui-multiTagPicker-spinner", children: /* @__PURE__ */ jsx(Spinner, {}) }) : /* @__PURE__ */ jsx("div", { className: "cui-multiTagPicker-options-container", children: /* @__PURE__ */ jsx(
86
+ InfiniteScroll,
87
+ {
88
+ dataLength: options.length,
89
+ next: () => loadMore && loadMore(),
90
+ hasMore: hasMoreItems,
91
+ className: "cui-multiTagPicker-options",
92
+ loader: /* @__PURE__ */ jsx("div", { className: "cui-multiTagPicker-spinner", children: /* @__PURE__ */ jsx(Spinner, {}) }),
93
+ children: options.map((option) => /* @__PURE__ */ jsx(
94
+ Select,
95
+ {
96
+ id: option.id,
97
+ label: option.label,
98
+ selected: selectedIds.has(option.id),
99
+ handleTagChange: (changedTo) => {
100
+ if (changedTo) handleAddItem(option);
101
+ else handleRemoveItem(option.id);
102
+ }
103
+ },
104
+ option.id
105
+ ))
106
+ }
107
+ ) }))
108
+ ] });
109
+ };
110
+ export {
111
+ MultiTagPicker as default
112
+ };
113
+ //# sourceMappingURL=MultiTagPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiTagPicker.js","sources":["../../../../../../src/legacy/components/molecules/MultiTagPicker/MultiTagPicker.tsx"],"sourcesContent":["import React, { ChangeEvent, useMemo } from 'react'\r\nimport InfiniteScroll from 'react-infinite-scroll-component'\r\nimport {\r\n faCircleMinus,\r\n faMagnifyingGlass,\r\n} from '@fortawesome/free-solid-svg-icons'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { Color } from '../../../constants/Colors'\r\n\r\nimport MultiTagPickerTag from '../../atoms/MultiTagPickerTag/MultiTagPickerTag'\r\nimport Spinner from '../../layout/Spinner/Spinner'\r\nimport './MultiTagPicker.scss'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface Option {\r\n id: string\r\n label: string\r\n}\r\n\r\nexport interface MultiTagPickerProps {\r\n placeholder?: string\r\n noOptionsLabel?: string\r\n searchInput: string\r\n editable: boolean\r\n loading: boolean\r\n optionsSelected: Option[]\r\n options: Option[]\r\n hasMoreItems: boolean\r\n\r\n handleInputKeyDown?: () => void\r\n handleInputChange?: (input: string) => void\r\n handleRemoveItem: (itemId: string) => void\r\n handleAddItem: (item: Option) => void\r\n loadMore?: () => void\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst MultiTagPicker: React.FC<MultiTagPickerProps> = (\r\n props: MultiTagPickerProps\r\n) => {\r\n const {\r\n placeholder,\r\n noOptionsLabel,\r\n searchInput,\r\n editable,\r\n loading,\r\n optionsSelected,\r\n options,\r\n hasMoreItems,\r\n handleRemoveItem,\r\n handleInputChange,\r\n handleInputKeyDown,\r\n handleAddItem,\r\n loadMore,\r\n } = props\r\n\r\n function handleInputKeyDownInner(event: React.FormEvent<HTMLFormElement>) {\r\n event.preventDefault()\r\n editable && handleInputKeyDown && handleInputKeyDown()\r\n }\r\n\r\n function handleInputChangeInner(event: ChangeEvent<HTMLInputElement>) {\r\n editable && handleInputChange && handleInputChange(event.target.value)\r\n }\r\n\r\n const selectedIds = useMemo(\r\n () => new Set(optionsSelected.map((o) => o.id)),\r\n [optionsSelected]\r\n )\r\n\r\n const showSelected = optionsSelected.map((option: Option) => (\r\n <li key={option.id}>\r\n <p>{option.label}</p>\r\n <FontAwesomeIcon\r\n size=\"sm\"\r\n icon={faCircleMinus}\r\n className={`${editable && 'pointer'}`}\r\n color=\"#F8F8F8\"\r\n onClick={() => editable && handleRemoveItem(option.id)}\r\n />\r\n </li>\r\n ))\r\n\r\n return (\r\n <div className=\"cui-multiTagPicker\">\r\n <form\r\n onSubmit={handleInputKeyDownInner}\r\n className=\"cui-multiTagPicker-container\"\r\n >\r\n <FontAwesomeIcon\r\n size=\"1x\"\r\n icon={faMagnifyingGlass}\r\n className=\"cui-multiTagPicker-magnifier\"\r\n color={Color.MEDIUM_GRAY_01}\r\n />\r\n <div className=\"cui-multiTagPicker-search\">\r\n {showSelected}{' '}\r\n {/* Not using ul around the li to ensure the input is added nicely to the grid*/}\r\n <input\r\n className=\"cui-multiTagPicker-input\"\r\n type=\"text\"\r\n value={searchInput}\r\n onChange={handleInputChangeInner}\r\n placeholder={editable ? placeholder : ''}\r\n disabled={!editable || loading}\r\n />\r\n </div>\r\n </form>\r\n {options.length === 0 && !loading && (\r\n <p className=\"cui-multiTagPicker-no-options\">{noOptionsLabel}</p>\r\n )}\r\n {editable &&\r\n (loading ? (\r\n <div className=\"cui-multiTagPicker-spinner\">\r\n <Spinner />\r\n </div>\r\n ) : (\r\n <div className=\"cui-multiTagPicker-options-container\">\r\n <InfiniteScroll\r\n dataLength={options.length}\r\n next={() => loadMore && loadMore()}\r\n hasMore={hasMoreItems}\r\n className=\"cui-multiTagPicker-options\"\r\n loader={\r\n <div className=\"cui-multiTagPicker-spinner\">\r\n <Spinner />\r\n </div>\r\n }\r\n >\r\n {options.map((option: Option) => (\r\n <MultiTagPickerTag\r\n key={option.id}\r\n id={option.id}\r\n label={option.label}\r\n selected={selectedIds.has(option.id)}\r\n handleTagChange={(changedTo) => {\r\n if (changedTo) handleAddItem(option)\r\n else handleRemoveItem(option.id)\r\n }}\r\n />\r\n ))}\r\n </InfiniteScroll>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport default MultiTagPicker\r\n"],"names":["MultiTagPickerTag"],"mappings":";;;;;;;;;AAqCA,MAAM,iBAAgD,CACpD,UACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,WAAS,wBAAwB,OAAyC;AACxE,UAAM,eAAA;AACN,gBAAY,sBAAsB,mBAAA;AAAA,EACpC;AAEA,WAAS,uBAAuB,OAAsC;AACpE,gBAAY,qBAAqB,kBAAkB,MAAM,OAAO,KAAK;AAAA,EACvE;AAEA,QAAM,cAAc;AAAA,IAClB,MAAM,IAAI,IAAI,gBAAgB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,IAC9C,CAAC,eAAe;AAAA,EAAA;AAGlB,QAAM,eAAe,gBAAgB,IAAI,CAAC,gCACvC,MAAA,EACC,UAAA;AAAA,IAAA,oBAAC,KAAA,EAAG,iBAAO,MAAA,CAAM;AAAA,IACjB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAM;AAAA,QACN,WAAW,GAAG,YAAY,SAAS;AAAA,QACnC,OAAM;AAAA,QACN,SAAS,MAAM,YAAY,iBAAiB,OAAO,EAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EACvD,KARO,OAAO,EAShB,CACD;AAED,SACE,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAM;AAAA,cACN,WAAU;AAAA,cACV,OAAO,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAEf,qBAAC,OAAA,EAAI,WAAU,6BACZ,UAAA;AAAA,YAAA;AAAA,YAAc;AAAA,YAEf;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,aAAa,WAAW,cAAc;AAAA,gBACtC,UAAU,CAAC,YAAY;AAAA,cAAA;AAAA,YAAA;AAAA,UACzB,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAED,QAAQ,WAAW,KAAK,CAAC,WACxB,oBAAC,KAAA,EAAE,WAAU,iCAAiC,UAAA,eAAA,CAAe;AAAA,IAE9D,aACE,UACC,oBAAC,OAAA,EAAI,WAAU,8BACb,UAAA,oBAAC,SAAA,EAAQ,EAAA,CACX,IAEA,oBAAC,OAAA,EAAI,WAAU,wCACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,YAAY,QAAQ;AAAA,QACpB,MAAM,MAAM,YAAY,SAAA;AAAA,QACxB,SAAS;AAAA,QACT,WAAU;AAAA,QACV,QACE,oBAAC,OAAA,EAAI,WAAU,8BACb,UAAA,oBAAC,WAAQ,GACX;AAAA,QAGD,UAAA,QAAQ,IAAI,CAAC,WACZ;AAAA,UAACA;AAAAA,UAAA;AAAA,YAEC,IAAI,OAAO;AAAA,YACX,OAAO,OAAO;AAAA,YACd,UAAU,YAAY,IAAI,OAAO,EAAE;AAAA,YACnC,iBAAiB,CAAC,cAAc;AAC9B,kBAAI,yBAAyB,MAAM;AAAA,kBAC9B,kBAAiB,OAAO,EAAE;AAAA,YACjC;AAAA,UAAA;AAAA,UAPK,OAAO;AAAA,QAAA,CASf;AAAA,MAAA;AAAA,IAAA,GAEL;AAAA,EAAA,GAEN;AAEJ;"}
@@ -0,0 +1,107 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import * as MsalReact from "@azure/msal-react";
4
+ import UserAvatar from "../UserAvatar/UserAvatar.js";
5
+ const GRAPH = "https://graph.microsoft.com/v1.0";
6
+ async function getGraphToken(instance, account) {
7
+ try {
8
+ const res = await instance.acquireTokenSilent({ scopes: ["User.Read"], account });
9
+ return res.accessToken;
10
+ } catch (err) {
11
+ if (err?.name === "InteractionRequiredAuthError") {
12
+ const res = await instance.acquireTokenPopup({ scopes: ["User.Read"] });
13
+ return res.accessToken;
14
+ }
15
+ throw err;
16
+ }
17
+ }
18
+ async function fetchPhotoBlob(token, base) {
19
+ for (const seg of ["/photos/240x240/$value", "/photo/$value"]) {
20
+ const resp = await fetch(`${GRAPH}${base}${seg}`, { headers: { Authorization: `Bearer ${token}` } });
21
+ if (resp.ok) return resp.blob();
22
+ if (resp.status === 404) continue;
23
+ return null;
24
+ }
25
+ return null;
26
+ }
27
+ async function fetchProfile(token, base) {
28
+ const resp = await fetch(`${GRAPH}${base}?$select=displayName,mail,userPrincipalName,jobTitle,department,companyName`, {
29
+ headers: { Authorization: `Bearer ${token}` }
30
+ });
31
+ if (!resp.ok) return null;
32
+ const d = await resp.json();
33
+ return {
34
+ name: d.displayName,
35
+ email: d.mail ?? d.userPrincipalName,
36
+ company: d.companyName,
37
+ department: d.department,
38
+ jobTitle: d.jobTitle
39
+ };
40
+ }
41
+ const photoCache = /* @__PURE__ */ new Map();
42
+ const profileCache = /* @__PURE__ */ new Map();
43
+ function PhotoAvatar({ oid, name, email, className = "", showCard = false, getToken }) {
44
+ const { instance, accounts } = MsalReact.useMsal();
45
+ const account = instance.getActiveAccount() ?? accounts[0];
46
+ const [url, setUrl] = useState(null);
47
+ const [profile, setProfile] = useState(null);
48
+ useEffect(() => {
49
+ if (!getToken && !account) return;
50
+ let cancelled = false;
51
+ let objectUrl = null;
52
+ const cacheKey = getToken ? "self" : oid ?? account?.homeAccountId ?? "me";
53
+ const apply = (blob) => {
54
+ if (cancelled || !blob) return;
55
+ objectUrl = URL.createObjectURL(blob);
56
+ setUrl(objectUrl);
57
+ };
58
+ const resolve = async () => {
59
+ if (getToken) return { token: await getToken(), base: "/me" };
60
+ const token = await getGraphToken(instance, account);
61
+ const selfOid = account.idTokenClaims?.oid;
62
+ const base = !oid || selfOid && selfOid === oid ? "/me" : `/users/${oid}`;
63
+ return { token, base };
64
+ };
65
+ const cachedPhoto = photoCache.get(cacheKey);
66
+ const cachedProfile = profileCache.get(cacheKey);
67
+ if (cachedPhoto !== void 0 && (!showCard || cachedProfile !== void 0)) {
68
+ apply(cachedPhoto);
69
+ if (cachedProfile) setProfile(cachedProfile);
70
+ } else {
71
+ resolve().then(async ({ token, base }) => {
72
+ const blob = await fetchPhotoBlob(token, base);
73
+ photoCache.set(cacheKey, blob);
74
+ apply(blob);
75
+ if (showCard) {
76
+ const prof = await fetchProfile(token, base);
77
+ profileCache.set(cacheKey, prof);
78
+ if (!cancelled && prof) setProfile(prof);
79
+ }
80
+ }).catch(() => {
81
+ photoCache.set(cacheKey, null);
82
+ if (showCard) profileCache.set(cacheKey, null);
83
+ });
84
+ }
85
+ return () => {
86
+ cancelled = true;
87
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
88
+ };
89
+ }, [oid, account, instance, getToken, showCard]);
90
+ return /* @__PURE__ */ jsx(
91
+ UserAvatar,
92
+ {
93
+ name: name ?? profile?.name,
94
+ email: email ?? profile?.email,
95
+ company: profile?.company,
96
+ department: profile?.department,
97
+ jobTitle: profile?.jobTitle,
98
+ photo: url,
99
+ className: `rounded-full ${className}`,
100
+ showCard
101
+ }
102
+ );
103
+ }
104
+ export {
105
+ PhotoAvatar as default
106
+ };
107
+ //# sourceMappingURL=PhotoAvatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhotoAvatar.js","sources":["../../../../../../src/legacy/components/molecules/PhotoAvatar/PhotoAvatar.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\r\n// O MSAL é peer opcional: numa app sem ele, o bundler troca-o por um módulo vazio, e\r\n// imports com nome (useMsal, InteractionRequiredAuthError) partiam o build dessa app.\r\nimport * as MsalReact from '@azure/msal-react'\r\nimport type { IPublicClientApplication, AccountInfo } from '@azure/msal-browser'\r\nimport UserAvatar from '../UserAvatar/UserAvatar'\r\n\r\nconst GRAPH = 'https://graph.microsoft.com/v1.0'\r\n\r\nasync function getGraphToken(instance: IPublicClientApplication, account: AccountInfo): Promise<string> {\r\n try {\r\n const res = await instance.acquireTokenSilent({ scopes: ['User.Read'], account })\r\n return res.accessToken\r\n } catch (err) {\r\n if ((err as { name?: string } | null)?.name === 'InteractionRequiredAuthError') {\r\n const res = await instance.acquireTokenPopup({ scopes: ['User.Read'] })\r\n return res.accessToken\r\n }\r\n throw err\r\n }\r\n}\r\n\r\n/** Busca a foto (240×240, fallback /photo). null se 404/erro. */\r\nasync function fetchPhotoBlob(token: string, base: string): Promise<Blob | null> {\r\n for (const seg of ['/photos/240x240/$value', '/photo/$value']) {\r\n const resp = await fetch(`${GRAPH}${base}${seg}`, { headers: { Authorization: `Bearer ${token}` } })\r\n if (resp.ok) return resp.blob()\r\n if (resp.status === 404) continue\r\n return null\r\n }\r\n return null\r\n}\r\n\r\nexport interface GraphProfile {\r\n name?: string | null\r\n email?: string | null\r\n company?: string | null\r\n department?: string | null\r\n jobTitle?: string | null\r\n}\r\n\r\n/** Perfil p/ o cartão de hover (mesmo token User.Read). null se erro. */\r\nasync function fetchProfile(token: string, base: string): Promise<GraphProfile | null> {\r\n const resp = await fetch(`${GRAPH}${base}?$select=displayName,mail,userPrincipalName,jobTitle,department,companyName`, {\r\n headers: { Authorization: `Bearer ${token}` },\r\n })\r\n if (!resp.ok) return null\r\n const d = (await resp.json()) as Record<string, string | null>\r\n return {\r\n name: d.displayName,\r\n email: d.mail ?? d.userPrincipalName,\r\n company: d.companyName,\r\n department: d.department,\r\n jobTitle: d.jobTitle,\r\n }\r\n}\r\n\r\ninterface Props {\r\n oid?: string | null\r\n name?: string | null\r\n email?: string | null\r\n className?: string\r\n /** Passa para UserAvatar: cartão de detalhes em hover. Default: off. */\r\n showCard?: boolean\r\n /**\r\n * Fornece um token do Graph (scope `User.Read`) usando o MSAL DA APP.\r\n * PREFERIR isto: evita o `useMsal` interno, que pode ler um `MsalContext`\r\n * diferente quando o bundler duplica o `@azure/msal-react` (→ account null →\r\n * sem foto). Com `getToken`, a foto do próprio (/me) resolve sempre.\r\n * Ex.: `getToken={() => msalInstance.acquireTokenSilent({scopes:['User.Read'],account}).then(r=>r.accessToken)}`\r\n */\r\n getToken?: () => Promise<string>\r\n}\r\n\r\n// Cache em memória (evita refetch entre montagens).\r\nconst photoCache = new Map<string, Blob | null>()\r\nconst profileCache = new Map<string, GraphProfile | null>()\r\n\r\n/**\r\n * Avatar com a foto real do MS Graph. Fallback: iniciais (UserAvatar).\r\n * Token: via `getToken` (recomendado) ou, em alternativa, via `useMsal` interno.\r\n * Peers: @azure/msal-react, @azure/msal-browser.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport default function PhotoAvatar({ oid, name, email, className = '', showCard = false, getToken }: Props) {\r\n const { instance, accounts } = MsalReact.useMsal()\r\n const account = instance.getActiveAccount() ?? accounts[0]\r\n const [url, setUrl] = useState<string | null>(null)\r\n const [profile, setProfile] = useState<GraphProfile | null>(null)\r\n\r\n useEffect(() => {\r\n if (!getToken && !account) return\r\n let cancelled = false\r\n let objectUrl: string | null = null\r\n const cacheKey = getToken ? 'self' : oid ?? account?.homeAccountId ?? 'me'\r\n\r\n const apply = (blob: Blob | null) => {\r\n if (cancelled || !blob) return\r\n objectUrl = URL.createObjectURL(blob)\r\n setUrl(objectUrl)\r\n }\r\n\r\n // Token + base do Graph resolvidos 1x, reutilizados p/ foto e perfil.\r\n const resolve = async (): Promise<{ token: string; base: string }> => {\r\n if (getToken) return { token: await getToken(), base: '/me' }\r\n const token = await getGraphToken(instance, account!)\r\n const selfOid = (account!.idTokenClaims as { oid?: string } | undefined)?.oid\r\n const base = !oid || (selfOid && selfOid === oid) ? '/me' : `/users/${oid}`\r\n return { token, base }\r\n }\r\n\r\n const cachedPhoto = photoCache.get(cacheKey)\r\n const cachedProfile = profileCache.get(cacheKey)\r\n if (cachedPhoto !== undefined && (!showCard || cachedProfile !== undefined)) {\r\n apply(cachedPhoto)\r\n if (cachedProfile) setProfile(cachedProfile)\r\n } else {\r\n resolve()\r\n .then(async ({ token, base }) => {\r\n const blob = await fetchPhotoBlob(token, base)\r\n photoCache.set(cacheKey, blob)\r\n apply(blob)\r\n // Perfil só quando há cartão de hover (evita chamada Graph extra).\r\n if (showCard) {\r\n const prof = await fetchProfile(token, base)\r\n profileCache.set(cacheKey, prof)\r\n if (!cancelled && prof) setProfile(prof)\r\n }\r\n })\r\n .catch(() => {\r\n photoCache.set(cacheKey, null)\r\n if (showCard) profileCache.set(cacheKey, null)\r\n })\r\n }\r\n\r\n return () => {\r\n cancelled = true\r\n if (objectUrl) URL.revokeObjectURL(objectUrl)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [oid, account, instance, getToken, showCard])\r\n\r\n // Redondo por default (a app pode sobrepor a forma no className, ex: rounded-none).\r\n return (\r\n <UserAvatar\r\n name={name ?? profile?.name}\r\n email={email ?? profile?.email}\r\n company={profile?.company}\r\n department={profile?.department}\r\n jobTitle={profile?.jobTitle}\r\n photo={url}\r\n className={`rounded-full ${className}`}\r\n showCard={showCard}\r\n />\r\n )\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ .cui-search {
2
+ width: 100%;
3
+ display: flex;
4
+ align-items: center;
5
+ gap: 2rem;
6
+ }
7
+ .cui-search__icon-container {
8
+ width: 1.5rem;
9
+ height: 1.5rem;
10
+ }
11
+ .cui-search__icon {
12
+ width: 100%;
13
+ height: 100%;
14
+ color: var(--dark-blue);
15
+ }
16
+ .cui-search__input {
17
+ width: 100%;
18
+ }
@@ -0,0 +1,30 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import Input from "../../atoms/Input/Input.js";
4
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
5
+ import { faSearch } from "@fortawesome/free-solid-svg-icons";
6
+ import './Search.css';/* empty css */
7
+ const Search = ({ handleSearch }) => {
8
+ const [searchTerm, setSearchTerm] = useState("");
9
+ const handleChange = (e) => {
10
+ const { value } = e.target;
11
+ setSearchTerm(value);
12
+ handleSearch(value);
13
+ };
14
+ return /* @__PURE__ */ jsxs("div", { className: "cui-search", children: [
15
+ /* @__PURE__ */ jsx("div", { className: "cui-search__icon-container", children: /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: faSearch, className: "cui-search__icon" }) }),
16
+ /* @__PURE__ */ jsx("div", { className: "cui-search__input", children: /* @__PURE__ */ jsx(
17
+ Input,
18
+ {
19
+ onChange: handleChange,
20
+ value: searchTerm,
21
+ placeholder: "Pesquisa aqui..."
22
+ }
23
+ ) })
24
+ ] });
25
+ };
26
+ export {
27
+ Search,
28
+ Search as default
29
+ };
30
+ //# sourceMappingURL=Search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Search.js","sources":["../../../../../../src/legacy/components/molecules/Search/Search.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport Input from '../../atoms/Input/Input'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\r\n\r\nimport './Search.scss'\r\n\r\ntype Props = {\r\n handleSearch: (searchTerm: string) => void\r\n}\r\n\r\nexport const Search = ({ handleSearch }: Props) => {\r\n const [searchTerm, setSearchTerm] = useState('')\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const { value } = e.target\r\n setSearchTerm(value)\r\n handleSearch(value)\r\n }\r\n\r\n return (\r\n <div className={'cui-search'}>\r\n <div className={'cui-search__icon-container'}>\r\n <FontAwesomeIcon icon={faSearch} className=\"cui-search__icon\" />\r\n </div>\r\n <div className={'cui-search__input'}>\r\n <Input\r\n onChange={handleChange}\r\n value={searchTerm}\r\n placeholder=\"Pesquisa aqui...\"\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Search\r\n"],"names":[],"mappings":";;;;;;AAWO,MAAM,SAAS,CAAC,EAAE,mBAA0B;AACjD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAE/C,QAAM,eAAe,CAAC,MAA2C;AAC/D,UAAM,EAAE,UAAU,EAAE;AACpB,kBAAc,KAAK;AACnB,iBAAa,KAAK;AAAA,EACpB;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,cACd,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAW,8BACd,UAAA,oBAAC,mBAAgB,MAAM,UAAU,WAAU,mBAAA,CAAmB,EAAA,CAChE;AAAA,IACA,oBAAC,OAAA,EAAI,WAAW,qBACd,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAY;AAAA,MAAA;AAAA,IAAA,EACd,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,116 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect, useMemo } from "react";
3
+ function SeletorPesquisa({
4
+ opcoes,
5
+ valor,
6
+ onChange,
7
+ onTextoLivre,
8
+ aCarregar = false,
9
+ erro = false,
10
+ maximo = 20,
11
+ labels,
12
+ icone
13
+ }) {
14
+ const [pesquisa, setPesquisa] = useState("");
15
+ const [aberto, setAberto] = useState(false);
16
+ const caixa = useRef(null);
17
+ useEffect(() => {
18
+ if (!aberto) return;
19
+ const aoClicarFora = (e) => {
20
+ if (!caixa.current?.contains(e.target)) setAberto(false);
21
+ };
22
+ const aoEscape = (e) => {
23
+ if (e.key === "Escape") setAberto(false);
24
+ };
25
+ document.addEventListener("mousedown", aoClicarFora);
26
+ document.addEventListener("keydown", aoEscape);
27
+ return () => {
28
+ document.removeEventListener("mousedown", aoClicarFora);
29
+ document.removeEventListener("keydown", aoEscape);
30
+ };
31
+ }, [aberto]);
32
+ const escolhida = useMemo(
33
+ () => opcoes.find((o) => o.valor === valor) ?? null,
34
+ [opcoes, valor]
35
+ );
36
+ const resultados = useMemo(() => {
37
+ const q = pesquisa.trim().toLowerCase();
38
+ if (!q) return opcoes.slice(0, maximo);
39
+ return opcoes.filter((o) => `${o.titulo} ${o.contexto ?? ""}`.toLowerCase().includes(q)).slice(0, maximo);
40
+ }, [opcoes, pesquisa, maximo]);
41
+ if (valor && escolhida) {
42
+ return /* @__PURE__ */ jsxs("div", { className: "cui-seletor-pesquisa flex items-center justify-between gap-3 border border-slate-200 bg-white px-3 py-2 rounded-lg dark:bg-slate-800 dark:border-slate-700", children: [
43
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
44
+ /* @__PURE__ */ jsx("span", { className: "block truncate font-semibold text-proef-navy dark:text-slate-100", children: escolhida.titulo }),
45
+ escolhida.contexto && /* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-slate-500 dark:text-slate-400", children: escolhida.contexto })
46
+ ] }),
47
+ /* @__PURE__ */ jsx(
48
+ "button",
49
+ {
50
+ type: "button",
51
+ onClick: () => onChange(null),
52
+ "aria-label": labels.limpar,
53
+ className: "shrink-0 px-1 text-slate-400 hover:text-proef-navy dark:hover:text-white",
54
+ children: "×"
55
+ }
56
+ )
57
+ ] });
58
+ }
59
+ return /* @__PURE__ */ jsxs("div", { className: "cui-seletor-pesquisa relative", ref: caixa, children: [
60
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border border-slate-200 bg-white px-3 py-2 rounded-lg dark:bg-slate-800 dark:border-slate-700", children: [
61
+ icone,
62
+ /* @__PURE__ */ jsx(
63
+ "input",
64
+ {
65
+ value: pesquisa,
66
+ onChange: (e) => {
67
+ setPesquisa(e.target.value);
68
+ setAberto(true);
69
+ },
70
+ onFocus: () => setAberto(true),
71
+ placeholder: labels.placeholder,
72
+ className: "w-full bg-transparent text-sm outline-none"
73
+ }
74
+ )
75
+ ] }),
76
+ aberto && /* @__PURE__ */ jsxs("div", { className: "absolute z-20 mt-1 max-h-72 w-full overflow-auto border border-slate-200 bg-white shadow-xl rounded-xl dark:bg-slate-900 dark:border-slate-700", children: [
77
+ aCarregar && /* @__PURE__ */ jsx("p", { className: "px-3 py-2 text-sm text-slate-400", children: labels.aCarregar }),
78
+ erro && /* @__PURE__ */ jsx("p", { className: "px-3 py-2 text-sm text-red-600", children: labels.erro }),
79
+ resultados.map((opcao) => /* @__PURE__ */ jsxs(
80
+ "button",
81
+ {
82
+ type: "button",
83
+ onClick: () => {
84
+ onChange(opcao.valor);
85
+ setPesquisa("");
86
+ setAberto(false);
87
+ },
88
+ className: "block w-full px-3 py-2 text-left hover:bg-slate-50 dark:hover:bg-slate-800",
89
+ children: [
90
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium text-proef-navy dark:text-slate-100", children: opcao.titulo }),
91
+ opcao.contexto && /* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-slate-500 dark:text-slate-400", children: opcao.contexto })
92
+ ]
93
+ },
94
+ opcao.valor
95
+ )),
96
+ !aCarregar && !erro && resultados.length === 0 && /* @__PURE__ */ jsx("p", { className: "px-3 py-2 text-sm text-slate-400", children: labels.semResultados }),
97
+ onTextoLivre && pesquisa.trim().length > 1 && /* @__PURE__ */ jsx(
98
+ "button",
99
+ {
100
+ type: "button",
101
+ onClick: () => {
102
+ onTextoLivre(pesquisa.trim());
103
+ setPesquisa("");
104
+ setAberto(false);
105
+ },
106
+ className: "block w-full border-t border-slate-100 px-3 py-2 text-left text-sm text-slate-600 hover:bg-slate-50 dark:border-slate-800 dark:text-slate-300 dark:hover:bg-slate-800",
107
+ children: labels.textoLivre ? labels.textoLivre(pesquisa.trim()) : pesquisa.trim()
108
+ }
109
+ )
110
+ ] })
111
+ ] });
112
+ }
113
+ export {
114
+ SeletorPesquisa as default
115
+ };
116
+ //# sourceMappingURL=SeletorPesquisa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeletorPesquisa.js","sources":["../../../../../../src/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\r\n\r\n/**\r\n * Seletor com pesquisa, para listas grandes vindas de outro sistema.\r\n *\r\n * Difere do `SearchSelect` em três coisas que o tornavam inutilizável nesses\r\n * casos: cada opção pode ter uma **segunda linha** (contexto — projeto, cliente,\r\n * plano), a pesquisa corre sobre esse contexto e não só sobre o título, e pode\r\n * aceitar **texto livre** quando o que a pessoa quer não está na lista.\r\n *\r\n * Fecha ao clicar fora e com Escape. Parece detalhe, mas dentro de um modal uma\r\n * lista que não fecha tapa o resto do formulário.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\n\r\nexport interface OpcaoPesquisa {\r\n valor: string\r\n titulo: string\r\n /** Segunda linha: contexto que distingue homónimos. Também é pesquisável. */\r\n contexto?: string\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface SeletorPesquisaProps {\r\n opcoes: OpcaoPesquisa[]\r\n /** Opção escolhida (`valor`), ou null. */\r\n valor: string | null\r\n onChange: (valor: string | null) => void\r\n /**\r\n * Permite escolher o que foi escrito, mesmo sem estar na lista. Recebe o\r\n * texto; quem usa decide o que fazer com ele.\r\n */\r\n onTextoLivre?: (texto: string) => void\r\n aCarregar?: boolean\r\n erro?: boolean\r\n /** Máximo de opções mostradas — listas longas tornam o painel inútil. */\r\n maximo?: number\r\n labels: {\r\n placeholder: string\r\n semResultados: string\r\n aCarregar: string\r\n erro: string\r\n limpar: string\r\n /** Recebe o texto escrito, ex: `Registar sem tarefa: \"{texto}\"`. */\r\n textoLivre?: (texto: string) => string\r\n }\r\n /** Ícone opcional à esquerda do campo. */\r\n icone?: ReactNode\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport default function SeletorPesquisa({\r\n opcoes,\r\n valor,\r\n onChange,\r\n onTextoLivre,\r\n aCarregar = false,\r\n erro = false,\r\n maximo = 20,\r\n labels,\r\n icone,\r\n}: SeletorPesquisaProps) {\r\n const [pesquisa, setPesquisa] = useState('')\r\n const [aberto, setAberto] = useState(false)\r\n const caixa = useRef<HTMLDivElement>(null)\r\n\r\n useEffect(() => {\r\n if (!aberto) return\r\n const aoClicarFora = (e: MouseEvent) => {\r\n if (!caixa.current?.contains(e.target as Node)) setAberto(false)\r\n }\r\n const aoEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') setAberto(false)\r\n }\r\n // `mousedown` e não `click`: fecha antes de o alvo reagir.\r\n document.addEventListener('mousedown', aoClicarFora)\r\n document.addEventListener('keydown', aoEscape)\r\n return () => {\r\n document.removeEventListener('mousedown', aoClicarFora)\r\n document.removeEventListener('keydown', aoEscape)\r\n }\r\n }, [aberto])\r\n\r\n const escolhida = useMemo(\r\n () => opcoes.find((o) => o.valor === valor) ?? null,\r\n [opcoes, valor]\r\n )\r\n\r\n const resultados = useMemo(() => {\r\n const q = pesquisa.trim().toLowerCase()\r\n if (!q) return opcoes.slice(0, maximo)\r\n return opcoes\r\n .filter((o) => `${o.titulo} ${o.contexto ?? ''}`.toLowerCase().includes(q))\r\n .slice(0, maximo)\r\n }, [opcoes, pesquisa, maximo])\r\n\r\n if (valor && escolhida) {\r\n return (\r\n <div className=\"cui-seletor-pesquisa flex items-center justify-between gap-3 border border-slate-200 bg-white px-3 py-2 rounded-lg dark:bg-slate-800 dark:border-slate-700\">\r\n <span className=\"min-w-0\">\r\n <span className=\"block truncate font-semibold text-proef-navy dark:text-slate-100\">{escolhida.titulo}</span>\r\n {escolhida.contexto && (\r\n <span className=\"block truncate text-xs text-slate-500 dark:text-slate-400\">{escolhida.contexto}</span>\r\n )}\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={() => onChange(null)}\r\n aria-label={labels.limpar}\r\n className=\"shrink-0 px-1 text-slate-400 hover:text-proef-navy dark:hover:text-white\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"cui-seletor-pesquisa relative\" ref={caixa}>\r\n <div className=\"flex items-center gap-2 border border-slate-200 bg-white px-3 py-2 rounded-lg dark:bg-slate-800 dark:border-slate-700\">\r\n {icone}\r\n <input\r\n value={pesquisa}\r\n onChange={(e) => {\r\n setPesquisa(e.target.value)\r\n setAberto(true)\r\n }}\r\n onFocus={() => setAberto(true)}\r\n placeholder={labels.placeholder}\r\n className=\"w-full bg-transparent text-sm outline-none\"\r\n />\r\n </div>\r\n\r\n {aberto && (\r\n <div className=\"absolute z-20 mt-1 max-h-72 w-full overflow-auto border border-slate-200 bg-white shadow-xl rounded-xl dark:bg-slate-900 dark:border-slate-700\">\r\n {aCarregar && <p className=\"px-3 py-2 text-sm text-slate-400\">{labels.aCarregar}</p>}\r\n {erro && <p className=\"px-3 py-2 text-sm text-red-600\">{labels.erro}</p>}\r\n\r\n {resultados.map((opcao) => (\r\n <button\r\n key={opcao.valor}\r\n type=\"button\"\r\n onClick={() => {\r\n onChange(opcao.valor)\r\n setPesquisa('')\r\n setAberto(false)\r\n }}\r\n className=\"block w-full px-3 py-2 text-left hover:bg-slate-50 dark:hover:bg-slate-800\"\r\n >\r\n <span className=\"block truncate text-sm font-medium text-proef-navy dark:text-slate-100\">\r\n {opcao.titulo}\r\n </span>\r\n {opcao.contexto && (\r\n <span className=\"block truncate text-xs text-slate-500 dark:text-slate-400\">{opcao.contexto}</span>\r\n )}\r\n </button>\r\n ))}\r\n\r\n {!aCarregar && !erro && resultados.length === 0 && (\r\n <p className=\"px-3 py-2 text-sm text-slate-400\">{labels.semResultados}</p>\r\n )}\r\n\r\n {onTextoLivre && pesquisa.trim().length > 1 && (\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n onTextoLivre(pesquisa.trim())\r\n setPesquisa('')\r\n setAberto(false)\r\n }}\r\n className=\"block w-full border-t border-slate-100 px-3 py-2 text-left text-sm text-slate-600 hover:bg-slate-50 dark:border-slate-800 dark:text-slate-300 dark:hover:bg-slate-800\"\r\n >\r\n {labels.textoLivre ? labels.textoLivre(pesquisa.trim()) : pesquisa.trim()}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"names":[],"mappings":"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"}