@nextelco/common-ui 2.1.98 → 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/FaixaAviso.d.ts +3 -0
  275. package/dist/types/{components → legacy/components}/ui/Passos.d.ts +3 -0
  276. package/dist/types/{components → legacy/components}/ui/Separadores.d.ts +3 -0
  277. package/dist/types/{components → legacy/components}/ui/TextoAuto.d.ts +2 -0
  278. package/dist/types/{components → legacy/components}/ui/Ui.d.ts +41 -7
  279. package/dist/types/{constants → legacy/constants}/FontWeight.d.ts +1 -0
  280. package/dist/types/{contexts → legacy/contexts}/apiContext.d.ts +1 -0
  281. package/dist/types/{contexts → legacy/contexts}/authContext.d.ts +2 -0
  282. package/dist/types/{contexts → legacy/contexts}/socketContext.d.ts +2 -0
  283. package/dist/types/{exports → legacy/exports}/hooks.d.ts +1 -1
  284. package/dist/types/{exports → legacy/exports}/molecules.d.ts +2 -1
  285. package/dist/types/legacy/exports/types.d.ts +7 -0
  286. package/dist/types/{hooks → legacy/hooks}/useApi.d.ts +2 -0
  287. package/dist/types/{hooks → legacy/hooks}/useTheme.d.ts +2 -0
  288. package/dist/types/{pages → legacy/pages}/Error/ErrorPage.d.ts +1 -0
  289. package/dist/types/{pages → legacy/pages}/Loading/Loading.d.ts +1 -0
  290. package/dist/types/{pages → legacy/pages}/Login/LoginScreen.d.ts +2 -0
  291. package/dist/types/{pages → legacy/pages}/NotFound/NotFound.d.ts +1 -0
  292. package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
  293. package/dist/types/{types → legacy/types}/Fetcher.d.ts +1 -0
  294. package/dist/types/{types → legacy/types}/LoggedUser.d.ts +1 -0
  295. package/dist/types/{types → legacy/types}/SidebarMenu.d.ts +2 -0
  296. package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
  297. package/dist/types/{types → legacy/types}/themes/ButtonThemes.d.ts +3 -0
  298. package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
  299. package/dist/types/{types → legacy/types}/themes/IconTextThemes.d.ts +1 -0
  300. package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
  301. package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
  302. package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
  303. package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
  304. package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +21 -0
  305. package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +55 -0
  306. package/dist/types/v1/foundations/icons/icons.d.ts +24 -0
  307. package/dist/types/v1/index.d.ts +25 -0
  308. package/dist/types/v1/primitives/buttons/Button/Button.d.ts +18 -0
  309. package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
  310. package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
  311. package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +25 -0
  312. package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +19 -0
  313. package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +37 -0
  314. package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
  315. package/dist/types/v1/primitives/forms/field.d.ts +20 -0
  316. package/package.json +38 -33
  317. package/dist/bundle.js +0 -2
  318. package/dist/bundle.js.LICENSE.txt +0 -80
  319. package/dist/types/components/atoms/Icone/Icone.test.d.ts +0 -1
  320. package/dist/types/components/layout/Sidebar/Sidebar.test.d.ts +0 -1
  321. package/dist/types/components/molecules/BarraValor/BarraValor.test.d.ts +0 -1
  322. package/dist/types/components/molecules/DataTable/DataTable.test.d.ts +0 -1
  323. package/dist/types/components/molecules/SeletorPesquisa/SeletorPesquisa.test.d.ts +0 -1
  324. package/dist/types/components/organisms/Kanban/Kanban.test.d.ts +0 -1
  325. package/dist/types/components/organisms/RoleGuard/RoleGuard.test.d.ts +0 -1
  326. package/dist/types/components/ui/CaixaPesquisa.test.d.ts +0 -1
  327. package/dist/types/components/ui/Escolha.test.d.ts +0 -1
  328. package/dist/types/components/ui/Paginas.test.d.ts +0 -1
  329. package/dist/types/exports/types.d.ts +0 -7
  330. package/dist/types/styles/utils/utils.d.ts +0 -1
  331. package/dist/types/test/setup.d.ts +0 -1
  332. package/dist/types/types/themes/AcronymThemes.d.ts +0 -3
  333. package/dist/types/types/themes/CustomSwitchThemes.d.ts +0 -3
  334. package/dist/types/utils/stringUtils.d.ts +0 -3
  335. /package/dist/types/{components → legacy/components}/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +0 -0
  336. /package/dist/types/{components → legacy/components}/atoms/SearchSelect/SearchSelect.d.ts +0 -0
  337. /package/dist/types/{components → legacy/components}/molecules/Search/Search.d.ts +0 -0
  338. /package/dist/types/{components → legacy/components}/ui/CaixaPesquisa.d.ts +0 -0
  339. /package/dist/types/{components → legacy/components}/ui/Escolha.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,37 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
3
+ import { faBars } from "@fortawesome/free-solid-svg-icons";
4
+ import './Header.css';/* empty css */
5
+ const Header = ({
6
+ title,
7
+ subTitle,
8
+ icon,
9
+ sideBar,
10
+ handleSideBar,
11
+ profile,
12
+ handleHome,
13
+ background
14
+ }) => {
15
+ return /* @__PURE__ */ jsx("div", { className: "cui-header", children: /* @__PURE__ */ jsx(
16
+ "header",
17
+ {
18
+ className: "cui-header__wrapper",
19
+ style: background ? { "--cui-header-bg": background } : void 0,
20
+ children: /* @__PURE__ */ jsxs("div", { className: "cui-header__container", children: [
21
+ /* @__PURE__ */ jsxs("div", { className: "cui-header__left", children: [
22
+ sideBar && /* @__PURE__ */ jsx("div", { className: "cui-header__sidebar", onClick: handleSideBar, children: /* @__PURE__ */ jsx(FontAwesomeIcon, { icon: faBars, className: "cui-header__icon" }) }),
23
+ /* @__PURE__ */ jsxs("div", { className: "cui-header__title", onClick: handleHome, children: [
24
+ icon && /* @__PURE__ */ jsx(FontAwesomeIcon, { icon, className: "cui-header__icon" }),
25
+ /* @__PURE__ */ jsx("h1", { children: title })
26
+ ] }),
27
+ subTitle && /* @__PURE__ */ jsx("div", { className: "cui-header__subtitle", children: /* @__PURE__ */ jsx("h2", { children: subTitle }) })
28
+ ] }),
29
+ /* @__PURE__ */ jsx("div", { className: "cui-header__right", children: /* @__PURE__ */ jsx("div", { className: "cui-header__profile", children: profile }) })
30
+ ] })
31
+ }
32
+ ) });
33
+ };
34
+ export {
35
+ Header as default
36
+ };
37
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sources":["../../../../../../src/legacy/components/layout/Header/Header.tsx"],"sourcesContent":["import React, { ReactNode } from 'react'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faBars, faHouse } from '@fortawesome/free-solid-svg-icons'\r\nimport './Header.scss'\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core'\r\n\r\ntype Props = {\r\n title: string\r\n subTitle?: string\r\n icon?: IconProp\r\n sideBar: boolean\r\n handleSideBar: () => void\r\n profile: ReactNode\r\n handleHome: () => void\r\n // Sobrepõe o fundo (gradiente/imagem) por defeito. Aceita qualquer valor\r\n // válido da propriedade CSS \"background\" (cor sólida, gradiente, url(...)).\r\n background?: string\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst Header = ({\r\n title,\r\n subTitle,\r\n icon,\r\n sideBar,\r\n handleSideBar,\r\n profile,\r\n handleHome,\r\n background,\r\n}: Props) => {\r\n return (\r\n <div className=\"cui-header\">\r\n <header\r\n className=\"cui-header__wrapper\"\r\n style={background ? ({ '--cui-header-bg': background } as React.CSSProperties) : undefined}\r\n >\r\n <div className=\"cui-header__container\">\r\n <div className=\"cui-header__left\">\r\n {sideBar && (\r\n <div className=\"cui-header__sidebar\" onClick={handleSideBar}>\r\n <FontAwesomeIcon icon={faBars} className=\"cui-header__icon\" />\r\n </div>\r\n )}\r\n <div className=\"cui-header__title\" onClick={handleHome}>\r\n {icon && (\r\n <FontAwesomeIcon icon={icon} className=\"cui-header__icon\" />\r\n )}\r\n <h1>{title}</h1>\r\n </div>\r\n {subTitle && (\r\n <div className=\"cui-header__subtitle\">\r\n <h2>{subTitle}</h2>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"cui-header__right\">\r\n <div className=\"cui-header__profile\">{profile}</div>\r\n </div>\r\n </div>\r\n </header>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Header\r\n"],"names":[],"mappings":";;;;AAoBA,MAAM,SAAS,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAa;AACX,SACE,oBAAC,OAAA,EAAI,WAAU,cACb,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,aAAc,EAAE,mBAAmB,eAAuC;AAAA,MAEjF,UAAA,qBAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,UAAA,WACC,oBAAC,OAAA,EAAI,WAAU,uBAAsB,SAAS,eAC5C,UAAA,oBAAC,iBAAA,EAAgB,MAAM,QAAQ,WAAU,mBAAA,CAAmB,GAC9D;AAAA,UAEF,qBAAC,OAAA,EAAI,WAAU,qBAAoB,SAAS,YACzC,UAAA;AAAA,YAAA,QACC,oBAAC,iBAAA,EAAgB,MAAY,WAAU,oBAAmB;AAAA,YAE5D,oBAAC,QAAI,UAAA,MAAA,CAAM;AAAA,UAAA,GACb;AAAA,UACC,gCACE,OAAA,EAAI,WAAU,wBACb,UAAA,oBAAC,MAAA,EAAI,oBAAS,EAAA,CAChB;AAAA,QAAA,GAEJ;AAAA,QACA,oBAAC,SAAI,WAAU,qBACb,8BAAC,OAAA,EAAI,WAAU,uBAAuB,UAAA,QAAA,CAAQ,EAAA,CAChD;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -0,0 +1,92 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import Sidebar from "../Sidebar/Sidebar.js";
4
+ const Menu = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
5
+ /* @__PURE__ */ jsx("line", { x1: "4", x2: "20", y1: "12", y2: "12" }),
6
+ /* @__PURE__ */ jsx("line", { x1: "4", x2: "20", y1: "6", y2: "6" }),
7
+ /* @__PURE__ */ jsx("line", { x1: "4", x2: "20", y1: "18", y2: "18" })
8
+ ] });
9
+ const Layout = ({
10
+ children,
11
+ menus,
12
+ groupLabels,
13
+ appTitle,
14
+ topBar,
15
+ avatar,
16
+ onLogout,
17
+ logoutLabel,
18
+ languages,
19
+ currentLang,
20
+ onLanguageChange,
21
+ theme,
22
+ onThemeChange,
23
+ themeLabels,
24
+ footer,
25
+ deployedAt,
26
+ deployedAtLabel,
27
+ sidebarOpen: sidebarOpenProp,
28
+ onSidebarOpenChange
29
+ }) => {
30
+ const [sidebarOpen, setSidebarOpenState] = useState(sidebarOpenProp ?? window.innerWidth > 640);
31
+ const [isMobile, setIsMobile] = useState(window.innerWidth <= 640);
32
+ const setSidebarOpen = (open) => {
33
+ setSidebarOpenState(open);
34
+ onSidebarOpenChange?.(open);
35
+ };
36
+ useEffect(() => {
37
+ const handleResize = () => {
38
+ setIsMobile(window.innerWidth <= 640);
39
+ setSidebarOpenState(window.innerWidth > 640);
40
+ };
41
+ window.addEventListener("resize", handleResize);
42
+ return () => window.removeEventListener("resize", handleResize);
43
+ }, []);
44
+ const contentMarginLeft = isMobile ? 0 : sidebarOpen ? 256 : 80;
45
+ return /* @__PURE__ */ jsxs("div", { className: "min-h-screen bg-slate-50/30 dark:bg-slate-950 flex", children: [
46
+ /* @__PURE__ */ jsx(
47
+ Sidebar,
48
+ {
49
+ isOpen: sidebarOpen,
50
+ setIsOpen: setSidebarOpen,
51
+ menus,
52
+ groupLabels,
53
+ appTitle,
54
+ avatar,
55
+ onLogout,
56
+ logoutLabel,
57
+ languages,
58
+ currentLang,
59
+ onLanguageChange,
60
+ theme,
61
+ onThemeChange,
62
+ themeLabels,
63
+ footer,
64
+ deployedAt,
65
+ deployedAtLabel
66
+ }
67
+ ),
68
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col min-w-0 transition-all duration-300", children: [
69
+ !sidebarOpen && /* @__PURE__ */ jsx(
70
+ "button",
71
+ {
72
+ onClick: () => setSidebarOpen(true),
73
+ className: "fixed top-6 left-6 z-50 p-2.5 bg-white shadow-md border border-slate-200 rounded-lg text-slate-500 hover:text-proef-blue dark:bg-slate-900 dark:border-slate-700 dark:text-slate-400 transition-colors sm:hidden",
74
+ children: /* @__PURE__ */ jsx(Menu, { size: 20 })
75
+ }
76
+ ),
77
+ topBar && /* @__PURE__ */ jsx("div", { style: { marginLeft: contentMarginLeft }, className: "sticky top-0 z-30 transition-all duration-300", children: topBar }),
78
+ /* @__PURE__ */ jsx(
79
+ "main",
80
+ {
81
+ style: { marginLeft: contentMarginLeft },
82
+ className: `pb-16 px-4 sm:px-12 transition-all duration-300 ${topBar ? "pt-6 sm:pt-6" : "pt-24 sm:pt-8"}`,
83
+ children: /* @__PURE__ */ jsx("div", { className: "mx-auto animate-in fade-in slide-in-from-bottom-2 duration-700", children })
84
+ }
85
+ )
86
+ ] })
87
+ ] });
88
+ };
89
+ export {
90
+ Layout as default
91
+ };
92
+ //# sourceMappingURL=Layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout.js","sources":["../../../../../../src/legacy/components/layout/Layout/Layout.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react'\r\nimport Sidebar, { SidebarMenuItem, SidebarLanguage, SidebarTheme } from '../Sidebar/Sidebar'\r\n\r\n// ── Inline icon (no lucide-react dependency in common-ui) ─────────────────\r\ntype IconProps = { size?: number; className?: string }\r\n\r\nconst Menu = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\r\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\r\n </svg>\r\n)\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface LayoutProps {\r\n children: React.ReactNode\r\n menus: SidebarMenuItem[]\r\n groupLabels?: Record<string, string>\r\n appTitle?: string\r\n /** Barra superior opcional (título/alertas). Fica sticky acima do conteúdo,\r\n * alinhada à direita da sidebar. Traz o seu próprio fundo/padding. */\r\n topBar?: React.ReactNode\r\n avatar?: React.ReactNode\r\n onLogout?: () => void\r\n logoutLabel?: string\r\n languages?: SidebarLanguage[]\r\n currentLang?: string\r\n onLanguageChange?: (code: string) => void\r\n theme?: SidebarTheme\r\n onThemeChange?: (theme: SidebarTheme) => void\r\n themeLabels?: { label?: string; light?: string; dark?: string; system?: string }\r\n /** Slot extra no rodapé da sidebar (ex: filtro global). Ver Sidebar.footer. */\r\n footer?: (isExpanded: boolean) => React.ReactNode\r\n /** Quando este build foi feito, por baixo do logout. Ver Sidebar.deployedAt. */\r\n deployedAt?: string | number | Date\r\n deployedAtLabel?: string\r\n /**\r\n * Estado inicial da sidebar (aberta/fechada). Sem isto mantém-se o comportamento de\r\n * sempre: aberta no desktop, fechada em mobile. Passar isto serve para a app repor o\r\n * que a pessoa tinha antes de recarregar a página (ex.: lido do seu próprio\r\n * localStorage) — o Layout não persiste nada sozinho, tal como já acontece com `theme`.\r\n */\r\n sidebarOpen?: boolean\r\n /**\r\n * Chamado sempre que a sidebar abre/fecha por uma ação da pessoa (o atalho da própria\r\n * Sidebar, ou o botão de expandir em mobile) — nunca pelo ajuste automático ao\r\n * redimensionar a janela, que não é uma escolha dela. Mesmo padrão de\r\n * `onThemeChange`: o Layout só avisa, quem usa decide se e como guardar.\r\n */\r\n onSidebarOpenChange?: (open: boolean) => void\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst Layout = ({\r\n children,\r\n menus,\r\n groupLabels,\r\n appTitle,\r\n topBar,\r\n avatar,\r\n onLogout,\r\n logoutLabel,\r\n languages,\r\n currentLang,\r\n onLanguageChange,\r\n theme,\r\n onThemeChange,\r\n themeLabels,\r\n footer,\r\n deployedAt,\r\n deployedAtLabel,\r\n sidebarOpen: sidebarOpenProp,\r\n onSidebarOpenChange,\r\n}: LayoutProps) => {\r\n // Expandida por defeito no desktop; colapsa em mobile (< 640) — a não ser que a app\r\n // passe `sidebarOpen` (ex.: o que tinha guardado antes de recarregar a página).\r\n const [sidebarOpen, setSidebarOpenState] = useState(sidebarOpenProp ?? window.innerWidth > 640)\r\n const [isMobile, setIsMobile] = useState(window.innerWidth <= 640)\r\n\r\n // Toggle deliberado (Sidebar passa isto como o seu `setIsOpen`, e o botão de expandir\r\n // em mobile também) — avisa a app para poder persistir a escolha.\r\n const setSidebarOpen = (open: boolean) => {\r\n setSidebarOpenState(open)\r\n onSidebarOpenChange?.(open)\r\n }\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n setIsMobile(window.innerWidth <= 640)\r\n // Direto ao estado, não ao wrapper: isto é o viewport a mudar, não a pessoa a\r\n // escolher — não faz sentido a app gravar isto como preferência.\r\n setSidebarOpenState(window.innerWidth > 640)\r\n }\r\n window.addEventListener('resize', handleResize)\r\n return () => window.removeEventListener('resize', handleResize)\r\n }, [])\r\n\r\n // Margem do conteúdo = largura da sidebar fixa (px, inline). NÃO usar classes\r\n // sm:ml-* aqui: o Tailwind do consumidor scaneia o bundle minificado do\r\n // common-ui e nem sempre gera as responsive utilities → conteúdo ficava\r\n // por baixo do rail. Inline style é imune a isso.\r\n // Mobile (< 640): sidebar esconde (translate) → sem margem.\r\n const contentMarginLeft = isMobile ? 0 : sidebarOpen ? 256 : 80\r\n\r\n return (\r\n <div className=\"min-h-screen bg-slate-50/30 dark:bg-slate-950 flex\">\r\n <Sidebar\r\n isOpen={sidebarOpen}\r\n setIsOpen={setSidebarOpen}\r\n menus={menus}\r\n groupLabels={groupLabels}\r\n appTitle={appTitle}\r\n avatar={avatar}\r\n onLogout={onLogout}\r\n logoutLabel={logoutLabel}\r\n languages={languages}\r\n currentLang={currentLang}\r\n onLanguageChange={onLanguageChange}\r\n theme={theme}\r\n onThemeChange={onThemeChange}\r\n themeLabels={themeLabels}\r\n footer={footer}\r\n deployedAt={deployedAt}\r\n deployedAtLabel={deployedAtLabel}\r\n />\r\n <div className=\"flex-1 flex flex-col min-w-0 transition-all duration-300\">\r\n {!sidebarOpen && (\r\n <button\r\n onClick={() => setSidebarOpen(true)}\r\n className=\"fixed top-6 left-6 z-50 p-2.5 bg-white shadow-md border border-slate-200 rounded-lg text-slate-500 hover:text-proef-blue dark:bg-slate-900 dark:border-slate-700 dark:text-slate-400 transition-colors sm:hidden\"\r\n >\r\n <Menu size={20} />\r\n </button>\r\n )}\r\n {topBar && (\r\n <div style={{ marginLeft: contentMarginLeft }} className=\"sticky top-0 z-30 transition-all duration-300\">\r\n {topBar}\r\n </div>\r\n )}\r\n <main\r\n style={{ marginLeft: contentMarginLeft }}\r\n className={`pb-16 px-4 sm:px-12 transition-all duration-300 ${topBar ? 'pt-6 sm:pt-6' : 'pt-24 sm:pt-8'}`}\r\n >\r\n <div className=\"mx-auto animate-in fade-in slide-in-from-bottom-2 duration-700\">\r\n {children}\r\n </div>\r\n </main>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Layout\r\n"],"names":[],"mappings":";;;AAMA,MAAM,OAAO,CAAC,EAAE,OAAO,IAAI,UAAA,MACvB,qBAAC,OAAA,EAAI,OAAM,8BAA6B,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,WAClL,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,EACrC,oBAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,IAAA,CAAI;AAAA,EACnC,oBAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,KAAA,CAAK;AAAA,GACzC;AA2CJ,MAAM,SAAS,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AACJ,MAAmB;AAGf,QAAM,CAAC,aAAa,mBAAmB,IAAI,SAAS,mBAAmB,OAAO,aAAa,GAAG;AAC9F,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,OAAO,cAAc,GAAG;AAIjE,QAAM,iBAAiB,CAAC,SAAkB;AACtC,wBAAoB,IAAI;AACxB,0BAAsB,IAAI;AAAA,EAC9B;AAEA,YAAU,MAAM;AACZ,UAAM,eAAe,MAAM;AACvB,kBAAY,OAAO,cAAc,GAAG;AAGpC,0BAAoB,OAAO,aAAa,GAAG;AAAA,IAC/C;AACA,WAAO,iBAAiB,UAAU,YAAY;AAC9C,WAAO,MAAM,OAAO,oBAAoB,UAAU,YAAY;AAAA,EAClE,GAAG,CAAA,CAAE;AAOL,QAAM,oBAAoB,WAAW,IAAI,cAAc,MAAM;AAE7D,SACI,qBAAC,OAAA,EAAI,WAAU,sDACX,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,QAAQ;AAAA,QACR,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEJ,qBAAC,OAAA,EAAI,WAAU,4DACV,UAAA;AAAA,MAAA,CAAC,eACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,SAAS,MAAM,eAAe,IAAI;AAAA,UAClC,WAAU;AAAA,UAEV,UAAA,oBAAC,MAAA,EAAK,MAAM,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAGvB,UACG,oBAAC,OAAA,EAAI,OAAO,EAAE,YAAY,kBAAA,GAAqB,WAAU,iDACpD,UAAA,OAAA,CACL;AAAA,MAEJ;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,OAAO,EAAE,YAAY,kBAAA;AAAA,UACrB,WAAW,mDAAmD,SAAS,iBAAiB,eAAe;AAAA,UAEvG,UAAA,oBAAC,OAAA,EAAI,WAAU,kEACV,SAAA,CACL;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;"}
@@ -0,0 +1,227 @@
1
+ import { jsxs, jsx, Fragment as Fragment$1 } from "react/jsx-runtime";
2
+ import { useState, useEffect, Fragment } from "react";
3
+ import { useLocation, NavLink } from "react-router-dom";
4
+ const ChevronLeft = ({ size = 24, className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: /* @__PURE__ */ jsx("path", { d: "m15 18-6-6 6-6" }) });
5
+ const ChevronRight = ({ size = 24, className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" }) });
6
+ const ChevronDown = ({ size = 24, className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) });
7
+ const ExternalLink = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
8
+ /* @__PURE__ */ jsx("path", { d: "M15 3h6v6" }),
9
+ /* @__PURE__ */ jsx("path", { d: "M10 14 21 3" }),
10
+ /* @__PURE__ */ jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" })
11
+ ] });
12
+ const LogOut = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
13
+ /* @__PURE__ */ jsx("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }),
14
+ /* @__PURE__ */ jsx("polyline", { points: "16 17 21 12 16 7" }),
15
+ /* @__PURE__ */ jsx("line", { x1: "21", x2: "9", y1: "12", y2: "12" })
16
+ ] });
17
+ const Globe = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
18
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
19
+ /* @__PURE__ */ jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" }),
20
+ /* @__PURE__ */ jsx("path", { d: "M2 12h20" })
21
+ ] });
22
+ const Sun = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
23
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "4" }),
24
+ /* @__PURE__ */ jsx("path", { d: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41" })
25
+ ] });
26
+ const Moon = ({ size = 24, className }) => /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: /* @__PURE__ */ jsx("path", { d: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z" }) });
27
+ const Monitor = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
28
+ /* @__PURE__ */ jsx("rect", { width: "20", height: "14", x: "2", y: "3", rx: "2" }),
29
+ /* @__PURE__ */ jsx("path", { d: "M8 21h8M12 17v4" })
30
+ ] });
31
+ function formatarDeploy(valor) {
32
+ const d = valor instanceof Date ? valor : new Date(valor);
33
+ if (Number.isNaN(d.getTime())) return "";
34
+ const dois = (n) => String(n).padStart(2, "0");
35
+ return `${dois(d.getDate())}/${dois(d.getMonth() + 1)}/${d.getFullYear()}, ${dois(d.getHours())}:${dois(d.getMinutes())}:${dois(d.getSeconds())}`;
36
+ }
37
+ const Sidebar = ({
38
+ isOpen = true,
39
+ setIsOpen,
40
+ menus,
41
+ groupLabels = {},
42
+ appTitle,
43
+ avatar,
44
+ onLogout,
45
+ logoutLabel = "Logout",
46
+ languages,
47
+ currentLang,
48
+ onLanguageChange,
49
+ theme,
50
+ onThemeChange,
51
+ themeLabels,
52
+ footer,
53
+ deployedAt,
54
+ deployedAtLabel = "Último deploy"
55
+ }) => {
56
+ const [isHovered, setIsHovered] = useState(false);
57
+ const isExpanded = isOpen || isHovered;
58
+ const GROUPS = Array.from(new Set(menus.map((m) => m.group).filter(Boolean)));
59
+ const routeGroupMap = Object.fromEntries(
60
+ menus.filter((m) => m.group).map((m) => [m.to, m.group])
61
+ );
62
+ const location = useLocation();
63
+ const buildCollapsed = (pathname) => {
64
+ const base = window.innerHeight < 950 ? Object.fromEntries(GROUPS.map((g) => [g, true])) : {};
65
+ const activeGroup = Object.entries(routeGroupMap).find(([p]) => pathname.includes(p))?.[1];
66
+ if (activeGroup) base[activeGroup] = false;
67
+ return base;
68
+ };
69
+ const [collapsedGroups, setCollapsedGroups] = useState(
70
+ () => buildCollapsed(location.pathname)
71
+ );
72
+ const toggleGroup = (group) => setCollapsedGroups((prev) => ({ ...prev, [group]: !prev[group] }));
73
+ const cycleLang = () => {
74
+ if (!languages?.length || !onLanguageChange) return;
75
+ const idx = languages.findIndex((l) => l.code === currentLang);
76
+ const next = languages[(idx + 1) % languages.length];
77
+ if (next) onLanguageChange(next.code);
78
+ };
79
+ const themeOptions = [
80
+ { val: "light", Icon: Sun, label: themeLabels?.light ?? "Light" },
81
+ { val: "dark", Icon: Moon, label: themeLabels?.dark ?? "Dark" },
82
+ { val: "system", Icon: Monitor, label: themeLabels?.system ?? "System" }
83
+ ];
84
+ const ThemeIcon = theme === "light" ? Sun : theme === "dark" ? Moon : Monitor;
85
+ const cycleTheme = () => {
86
+ if (!onThemeChange) return;
87
+ const order = ["light", "dark", "system"];
88
+ const idx = order.indexOf(theme ?? "system");
89
+ onThemeChange(order[(idx + 1) % order.length]);
90
+ };
91
+ useEffect(() => {
92
+ const onResize = () => setCollapsedGroups(buildCollapsed(location.pathname));
93
+ window.addEventListener("resize", onResize);
94
+ return () => window.removeEventListener("resize", onResize);
95
+ }, [location.pathname]);
96
+ useEffect(() => {
97
+ const activeGroup = Object.entries(routeGroupMap).find(
98
+ ([p]) => location.pathname.includes(p)
99
+ )?.[1];
100
+ if (activeGroup) setCollapsedGroups((prev) => ({ ...prev, [activeGroup]: false }));
101
+ }, [location.pathname]);
102
+ return /* @__PURE__ */ jsxs(
103
+ "aside",
104
+ {
105
+ onMouseEnter: () => !isOpen && setIsHovered(true),
106
+ onMouseLeave: () => setIsHovered(false),
107
+ className: `bg-proef-navy text-white h-screen flex flex-col fixed left-0 top-0 z-40 transition-all duration-300 border-r border-white/10 overflow-hidden ${isExpanded ? "w-64 translate-x-0" : "w-20 sm:translate-x-0 -translate-x-full"}`,
108
+ children: [
109
+ /* @__PURE__ */ jsxs("div", { className: `px-4 flex flex-row items-center h-16 ${isExpanded ? "justify-between" : "justify-center"}`, children: [
110
+ isExpanded && /* @__PURE__ */ jsxs("div", { className: "flex flex-col pl-2", children: [
111
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
112
+ /* @__PURE__ */ jsx("span", { className: "text-3xl font-black text-white tracking-tighter", children: "proef" }),
113
+ /* @__PURE__ */ jsx("div", { className: "w-2 h-2 rounded-full bg-proef-turquoise mt-3 animate-pulse" })
114
+ ] }),
115
+ appTitle && /* @__PURE__ */ jsx("span", { className: "text-[10px] font-black uppercase tracking-[0.3em] text-white/50 mt-1 pl-1", children: appTitle })
116
+ ] }),
117
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
118
+ avatar && /* @__PURE__ */ jsx("div", { className: "cursor-help flex-shrink-0", children: avatar }),
119
+ setIsOpen && isExpanded && // isOpen: fixa → colapsa (ChevronLeft). Colapsada+hover: fixa de volta (ChevronRight).
120
+ /* @__PURE__ */ jsx("button", { onClick: () => setIsOpen(!isOpen), title: isOpen ? void 0 : "Fixar", className: "appearance-none border-0 cursor-pointer text-white/40 hover:text-white transition-colors p-1.5 bg-white/5 rounded-lg hover:bg-white/10", children: isOpen ? /* @__PURE__ */ jsx(ChevronLeft, { size: 16 }) : /* @__PURE__ */ jsx(ChevronRight, { size: 16 }) })
121
+ ] })
122
+ ] }),
123
+ /* @__PURE__ */ jsx("nav", { className: "flex-1 overflow-y-auto overflow-x-hidden pt-2 transition-opacity duration-300", children: menus.map((item, i) => {
124
+ const prevGroup = menus[i - 1]?.group;
125
+ const currGroup = item.group;
126
+ const showGroupHeader = currGroup && currGroup !== prevGroup;
127
+ const isGroupCollapsed = !!currGroup && !!collapsedGroups[currGroup];
128
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
129
+ showGroupHeader && isExpanded && /* @__PURE__ */ jsxs("button", { onClick: () => toggleGroup(currGroup), className: "w-full px-6 pt-5 pb-1.5 text-left group/grp appearance-none bg-transparent border-0 cursor-pointer", children: [
130
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
131
+ /* @__PURE__ */ jsx("span", { className: "text-[9px] font-black uppercase tracking-[0.25em] text-white/30 group-hover/grp:text-white/50 transition-colors", children: groupLabels[currGroup] ?? currGroup }),
132
+ /* @__PURE__ */ jsx(ChevronDown, { size: 10, className: `text-white/30 group-hover/grp:text-white/50 transition-all ${isGroupCollapsed ? "-rotate-90" : ""}` })
133
+ ] }),
134
+ /* @__PURE__ */ jsx("div", { className: "mt-1 h-px bg-white/10" })
135
+ ] }),
136
+ showGroupHeader && !isExpanded && /* @__PURE__ */ jsx("div", { className: "mx-auto w-8 my-3 h-px bg-white/15" }),
137
+ !isGroupCollapsed && item.external && /* @__PURE__ */ jsxs(
138
+ "a",
139
+ {
140
+ href: item.to,
141
+ target: "_blank",
142
+ rel: "noreferrer",
143
+ title: !isExpanded ? item.label : void 0,
144
+ onClick: () => {
145
+ if (window.innerWidth < 640 && setIsOpen) setIsOpen(false);
146
+ },
147
+ className: `
148
+ flex items-center gap-4 transition-all duration-300 rounded-lg mx-2 no-underline
149
+ ${isExpanded ? "px-6 py-2.5" : "px-0 py-2.5 justify-center"}
150
+ text-white/50 hover:bg-white/5 hover:text-white
151
+ `,
152
+ children: [
153
+ /* @__PURE__ */ jsx("div", { className: "relative flex-shrink-0", children: /* @__PURE__ */ jsx(item.icon, { size: 20 }) }),
154
+ isExpanded && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 flex-1 min-w-0", children: [
155
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold truncate", children: item.label }),
156
+ /* @__PURE__ */ jsx(ExternalLink, { size: 12, className: "ml-auto flex-shrink-0 text-white/30" })
157
+ ] })
158
+ ]
159
+ }
160
+ ),
161
+ !isGroupCollapsed && !item.external && /* @__PURE__ */ jsx(
162
+ NavLink,
163
+ {
164
+ to: item.to,
165
+ end: item.end ?? item.to === "/",
166
+ title: !isExpanded ? item.label : void 0,
167
+ onClick: () => {
168
+ if (window.innerWidth < 640 && setIsOpen) setIsOpen(false);
169
+ },
170
+ className: ({ isActive }) => `
171
+ flex items-center gap-4 transition-all duration-300 rounded-lg mx-2
172
+ ${isExpanded ? "px-6 py-2.5" : "px-0 py-2.5 justify-center"}
173
+ ${isActive ? "bg-proef-turquoise/15 text-proef-turquoise font-semibold" : "text-white/50 hover:bg-white/5 hover:text-white"}
174
+ `,
175
+ children: ({ isActive }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
176
+ /* @__PURE__ */ jsxs("div", { className: "relative flex-shrink-0", children: [
177
+ /* @__PURE__ */ jsx(item.icon, { size: 20, className: isActive ? "text-proef-turquoise drop-shadow-[0_0_6px_rgba(0,230,200,0.6)]" : "" }),
178
+ item.badge != null && item.badge > 0 && !isExpanded && /* @__PURE__ */ jsx("span", { className: "absolute -top-1 -right-1 w-2 h-2 rounded-full bg-amber-400" })
179
+ ] }),
180
+ isExpanded && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 flex-1 min-w-0", children: [
181
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold truncate", children: item.label }),
182
+ item.badge != null && item.badge > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto flex-shrink-0 bg-amber-400 text-proef-navy text-[10px] font-black rounded-full px-1.5 py-0.5 min-w-[18px] text-center leading-none", children: item.badge })
183
+ ] })
184
+ ] })
185
+ }
186
+ )
187
+ ] }, item.to);
188
+ }) }),
189
+ /* @__PURE__ */ jsxs("div", { className: `mt-auto border-t border-white/10 px-2 py-3 ${isExpanded ? "space-y-2" : "flex flex-col items-center gap-3"}`, children: [
190
+ footer && /* @__PURE__ */ jsx("div", { className: isExpanded ? "" : "w-full flex justify-center", children: footer(isExpanded) }),
191
+ onThemeChange && (isExpanded ? /* @__PURE__ */ jsxs("div", { children: [
192
+ /* @__PURE__ */ jsx("p", { className: "px-1 pb-1 text-[8px] font-black uppercase tracking-[0.25em] text-white/30", children: themeLabels?.label ?? "Theme" }),
193
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-1 p-1 bg-white/5 rounded-lg border border-white/5", children: themeOptions.map((opt) => /* @__PURE__ */ jsxs(
194
+ "button",
195
+ {
196
+ onClick: () => onThemeChange(opt.val),
197
+ title: opt.label,
198
+ "aria-pressed": theme === opt.val,
199
+ className: `appearance-none bg-transparent border-0 cursor-pointer flex flex-col items-center gap-1 py-1.5 rounded-md text-[8px] font-black uppercase tracking-wider transition-all ${theme === opt.val ? "bg-proef-turquoise/15 text-proef-turquoise" : "text-white/40 hover:text-white/70 hover:bg-white/5"}`,
200
+ children: [
201
+ /* @__PURE__ */ jsx(opt.Icon, { size: 14 }),
202
+ opt.label
203
+ ]
204
+ },
205
+ opt.val
206
+ )) })
207
+ ] }) : /* @__PURE__ */ jsx("button", { onClick: cycleTheme, title: themeLabels?.label ?? "Theme", className: "appearance-none bg-transparent border-0 cursor-pointer p-2 text-white/30 hover:text-proef-turquoise transition-colors rounded-lg hover:bg-white/5", children: /* @__PURE__ */ jsx(ThemeIcon, { size: 18 }) })),
208
+ languages && languages.length > 0 && (isExpanded ? /* @__PURE__ */ jsx("div", { className: "flex gap-1", children: languages.map((l) => /* @__PURE__ */ jsx(
209
+ "button",
210
+ {
211
+ onClick: () => onLanguageChange?.(l.code),
212
+ className: `appearance-none bg-transparent cursor-pointer flex-1 py-1.5 text-[10px] font-black uppercase tracking-widest border transition-all rounded-md ${currentLang === l.code ? "text-proef-turquoise border-proef-turquoise/40" : "text-white/40 border-white/5 hover:text-white hover:border-white/20"}`,
213
+ children: l.label
214
+ },
215
+ l.code
216
+ )) }) : /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx("button", { onClick: cycleLang, title: currentLang?.toUpperCase(), className: "appearance-none bg-transparent border-0 cursor-pointer p-2 text-white/30 hover:text-proef-turquoise transition-colors rounded-lg hover:bg-white/5", children: /* @__PURE__ */ jsx(Globe, { size: 18 }) }) })),
217
+ isExpanded ? /* @__PURE__ */ jsx("button", { onClick: () => onLogout?.(), className: "appearance-none bg-transparent cursor-pointer w-full text-center py-2.5 text-[10px] font-black uppercase tracking-widest text-white/40 hover:text-proef-turquoise transition-all border border-white/5 hover:border-proef-turquoise/30", children: logoutLabel }) : /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx("button", { onClick: () => onLogout?.(), title: logoutLabel, className: "appearance-none bg-transparent border-0 cursor-pointer p-2 text-white/30 hover:text-proef-turquoise transition-colors rounded-lg hover:bg-white/5", children: /* @__PURE__ */ jsx(LogOut, { size: 18 }) }) }),
218
+ deployedAt != null && isExpanded && /* @__PURE__ */ jsx("div", { title: deployedAtLabel, className: "text-center text-[10px] tabular-nums text-white/25 select-text", children: formatarDeploy(deployedAt) })
219
+ ] })
220
+ ]
221
+ }
222
+ );
223
+ };
224
+ export {
225
+ Sidebar as default
226
+ };
227
+ //# sourceMappingURL=Sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.js","sources":["../../../../../../src/legacy/components/layout/Sidebar/Sidebar.tsx"],"sourcesContent":["import React, { useState, Fragment, useEffect } from 'react'\r\nimport { NavLink, useLocation } from 'react-router-dom'\r\n\r\n// ── Inline icons (no lucide-react dependency in common-ui) ────────────────\r\ntype IconProps = { size?: number; className?: string }\r\n\r\nconst ChevronLeft = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"m15 18-6-6 6-6\" />\r\n </svg>\r\n)\r\n\r\nconst ChevronRight = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"m9 18 6-6-6-6\" />\r\n </svg>\r\n)\r\n\r\nconst ChevronDown = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n)\r\n\r\nconst ExternalLink = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M15 3h6v6\" />\r\n <path d=\"M10 14 21 3\" />\r\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\r\n </svg>\r\n)\r\n\r\nconst LogOut = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\r\n <polyline points=\"16 17 21 12 16 7\" />\r\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\r\n </svg>\r\n)\r\n\r\nconst Globe = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\r\n <path d=\"M2 12h20\" />\r\n </svg>\r\n)\r\n\r\nconst Sun = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\r\n <path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\" />\r\n </svg>\r\n)\r\n\r\nconst Moon = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z\" />\r\n </svg>\r\n)\r\n\r\nconst Monitor = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\" />\r\n <path d=\"M8 21h8M12 17v4\" />\r\n </svg>\r\n)\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport type SidebarTheme = 'light' | 'dark' | 'system'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface SidebarLanguage {\r\n code: string\r\n label: string\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface SidebarMenuItem {\r\n to: string\r\n icon: React.ComponentType<{ size?: number; className?: string }>\r\n label: string\r\n group?: string\r\n end?: boolean\r\n /** Contador opcional (ex: aprovações pendentes). Igual ao badge do Sidebar dos Tickets. */\r\n badge?: number\r\n /**\r\n * Destino fora da aplicação (SharePoint, portal antigo, etc.): abre em\r\n * separador novo em vez de navegar pelo router. Sem isto, um URL absoluto\r\n * ia parar ao NavLink, que o trata como rota interna e dá página em branco.\r\n */\r\n external?: boolean\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface SidebarProps {\r\n isOpen?: boolean\r\n setIsOpen?: (isOpen: boolean) => void\r\n menus: SidebarMenuItem[]\r\n groupLabels?: Record<string, string>\r\n appTitle?: string\r\n avatar?: React.ReactNode\r\n onLogout?: () => void\r\n logoutLabel?: string\r\n /** Selector de idioma no rodapé da sidebar. Só aparece se `languages` vier. */\r\n languages?: SidebarLanguage[]\r\n currentLang?: string\r\n onLanguageChange?: (code: string) => void\r\n /** Selector de tema (light/dark/system) no rodapé. Só aparece se `onThemeChange` vier.\r\n * O common-ui só renderiza a UI + chama o callback — aplicar a classe `.dark`\r\n * no <html> é responsabilidade da app (o seu gestor de tema). */\r\n theme?: SidebarTheme\r\n onThemeChange?: (theme: SidebarTheme) => void\r\n themeLabels?: { label?: string; light?: string; dark?: string; system?: string }\r\n /** Slot extra no topo do rodapé (acima de tema/idioma/logout). Render-prop\r\n * com o estado expandido → ex: filtro global (AgendamentoEDP → AoFilterDropdown). */\r\n footer?: (isExpanded: boolean) => React.ReactNode\r\n /**\r\n * Quando este build foi feito — aparece por baixo do logout.\r\n *\r\n * Serve para responder a \"isto já tem a correcção?\": diz a idade do código\r\n * que o browser está mesmo a correr, e não a que o servidor tem. A app é que\r\n * decide a QUEM o mostra (tipicamente só admins) — passar a prop é mostrá-la.\r\n */\r\n deployedAt?: string | number | Date\r\n /** Tooltip do rodapé, para a app o traduzir. */\r\n deployedAtLabel?: string\r\n}\r\n\r\n/**\r\n * `DD/MM/AAAA, HH:MM:SS` na hora local de quem lê.\r\n *\r\n * Escrito à mão e não com `toLocaleString`: o formato do rodapé não pode\r\n * mudar com a lingua escolhida no selector mesmo ao lado — é um carimbo, e\r\n * lê-se sempre da mesma maneira. Data inválida não mostra nada.\r\n */\r\nfunction formatarDeploy(valor: string | number | Date): string {\r\n const d = valor instanceof Date ? valor : new Date(valor)\r\n if (Number.isNaN(d.getTime())) return ''\r\n const dois = (n: number) => String(n).padStart(2, '0')\r\n return `${dois(d.getDate())}/${dois(d.getMonth() + 1)}/${d.getFullYear()}, ${dois(d.getHours())}:${dois(d.getMinutes())}:${dois(d.getSeconds())}`\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst Sidebar = ({\r\n isOpen = true,\r\n setIsOpen,\r\n menus,\r\n groupLabels = {},\r\n appTitle,\r\n avatar,\r\n onLogout,\r\n logoutLabel = 'Logout',\r\n languages,\r\n currentLang,\r\n onLanguageChange,\r\n theme,\r\n onThemeChange,\r\n themeLabels,\r\n footer,\r\n deployedAt,\r\n deployedAtLabel = 'Último deploy',\r\n}: SidebarProps) => {\r\n const [isHovered, setIsHovered] = useState(false)\r\n const isExpanded = isOpen || isHovered\r\n\r\n // ── Nav groups — derived from the injected menus ─────────────────────────\r\n const GROUPS = Array.from(new Set(menus.map((m) => m.group).filter(Boolean))) as string[]\r\n const routeGroupMap: Record<string, string> = Object.fromEntries(\r\n menus.filter((m) => m.group).map((m) => [m.to, m.group as string])\r\n )\r\n\r\n const location = useLocation()\r\n\r\n const buildCollapsed = (pathname: string) => {\r\n const base =\r\n window.innerHeight < 950\r\n ? Object.fromEntries(GROUPS.map((g) => [g, true]))\r\n : ({} as Record<string, boolean>)\r\n const activeGroup = Object.entries(routeGroupMap).find(([p]) => pathname.includes(p))?.[1]\r\n if (activeGroup) base[activeGroup] = false\r\n return base\r\n }\r\n\r\n const [collapsedGroups, setCollapsedGroups] = useState<Record<string, boolean>>(() =>\r\n buildCollapsed(location.pathname)\r\n )\r\n const toggleGroup = (group: string) =>\r\n setCollapsedGroups((prev) => ({ ...prev, [group]: !prev[group] }))\r\n\r\n // Colapsada: 1 botão que roda p/ o próximo idioma (não há espaço p/ segmentos).\r\n const cycleLang = () => {\r\n if (!languages?.length || !onLanguageChange) return\r\n const idx = languages.findIndex((l) => l.code === currentLang)\r\n const next = languages[(idx + 1) % languages.length]\r\n if (next) onLanguageChange(next.code)\r\n }\r\n\r\n // Seletor de tema (light/dark/system) — derivado do Sidebar do Tickets.\r\n const themeOptions: { val: SidebarTheme; Icon: React.ComponentType<IconProps>; label: string }[] = [\r\n { val: 'light', Icon: Sun, label: themeLabels?.light ?? 'Light' },\r\n { val: 'dark', Icon: Moon, label: themeLabels?.dark ?? 'Dark' },\r\n { val: 'system', Icon: Monitor, label: themeLabels?.system ?? 'System' },\r\n ]\r\n const ThemeIcon = theme === 'light' ? Sun : theme === 'dark' ? Moon : Monitor\r\n const cycleTheme = () => {\r\n if (!onThemeChange) return\r\n const order: SidebarTheme[] = ['light', 'dark', 'system']\r\n const idx = order.indexOf((theme ?? 'system') as SidebarTheme)\r\n onThemeChange(order[(idx + 1) % order.length])\r\n }\r\n\r\n useEffect(() => {\r\n const onResize = () => setCollapsedGroups(buildCollapsed(location.pathname))\r\n window.addEventListener('resize', onResize)\r\n return () => window.removeEventListener('resize', onResize)\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [location.pathname])\r\n\r\n useEffect(() => {\r\n const activeGroup = Object.entries(routeGroupMap).find(([p]) =>\r\n location.pathname.includes(p)\r\n )?.[1]\r\n if (activeGroup) setCollapsedGroups((prev) => ({ ...prev, [activeGroup]: false }))\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [location.pathname])\r\n\r\n return (\r\n <aside\r\n onMouseEnter={() => !isOpen && setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n className={`bg-proef-navy text-white h-screen flex flex-col fixed left-0 top-0 z-40 transition-all duration-300 border-r border-white/10 overflow-hidden ${isExpanded ? 'w-64 translate-x-0' : 'w-20 sm:translate-x-0 -translate-x-full'}`}>\r\n\r\n <div className={`px-4 flex flex-row items-center h-16 ${isExpanded ? 'justify-between' : 'justify-center'}`}>\r\n {isExpanded && (\r\n <div className=\"flex flex-col pl-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-3xl font-black text-white tracking-tighter\">proef</span>\r\n <div className=\"w-2 h-2 rounded-full bg-proef-turquoise mt-3 animate-pulse\" />\r\n </div>\r\n {appTitle && (\r\n <span className=\"text-[10px] font-black uppercase tracking-[0.3em] text-white/50 mt-1 pl-1\">{appTitle}</span>\r\n )}\r\n </div>\r\n )}\r\n <div className=\"flex items-center gap-2\">\r\n {avatar && (\r\n <div className=\"cursor-help flex-shrink-0\">{avatar}</div>\r\n )}\r\n {setIsOpen && isExpanded && (\r\n // isOpen: fixa → colapsa (ChevronLeft). Colapsada+hover: fixa de volta (ChevronRight).\r\n <button onClick={() => setIsOpen(!isOpen)} title={isOpen ? undefined : 'Fixar'} className=\"appearance-none border-0 cursor-pointer text-white/40 hover:text-white transition-colors p-1.5 bg-white/5 rounded-lg hover:bg-white/10\">\r\n {isOpen ? <ChevronLeft size={16} /> : <ChevronRight size={16} />}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <nav className=\"flex-1 overflow-y-auto overflow-x-hidden pt-2 transition-opacity duration-300\">\r\n {menus.map((item, i) => {\r\n const prevGroup = menus[i - 1]?.group\r\n const currGroup = item.group\r\n const showGroupHeader = currGroup && currGroup !== prevGroup\r\n const isGroupCollapsed = !!currGroup && !!collapsedGroups[currGroup]\r\n\r\n return (\r\n <Fragment key={item.to}>\r\n {showGroupHeader && isExpanded && (\r\n <button onClick={() => toggleGroup(currGroup!)} className=\"w-full px-6 pt-5 pb-1.5 text-left group/grp appearance-none bg-transparent border-0 cursor-pointer\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-[9px] font-black uppercase tracking-[0.25em] text-white/30 group-hover/grp:text-white/50 transition-colors\">{groupLabels[currGroup!] ?? currGroup}</span>\r\n <ChevronDown size={10} className={`text-white/30 group-hover/grp:text-white/50 transition-all ${isGroupCollapsed ? '-rotate-90' : ''}`} />\r\n </div>\r\n <div className=\"mt-1 h-px bg-white/10\" />\r\n </button>\r\n )}\r\n {showGroupHeader && !isExpanded && <div className=\"mx-auto w-8 my-3 h-px bg-white/15\" />}\r\n {!isGroupCollapsed && item.external && (\r\n <a\r\n href={item.to}\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n title={!isExpanded ? item.label : undefined}\r\n onClick={() => { if (window.innerWidth < 640 && setIsOpen) setIsOpen(false) }}\r\n className={`\r\n flex items-center gap-4 transition-all duration-300 rounded-lg mx-2 no-underline\r\n ${isExpanded ? 'px-6 py-2.5' : 'px-0 py-2.5 justify-center'}\r\n text-white/50 hover:bg-white/5 hover:text-white\r\n `}\r\n >\r\n <div className=\"relative flex-shrink-0\">\r\n <item.icon size={20} />\r\n </div>\r\n {isExpanded && (\r\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\">\r\n <span className=\"text-sm font-semibold truncate\">{item.label}</span>\r\n <ExternalLink size={12} className=\"ml-auto flex-shrink-0 text-white/30\" />\r\n </div>\r\n )}\r\n </a>\r\n )}\r\n {!isGroupCollapsed && !item.external && (\r\n <NavLink\r\n to={item.to}\r\n end={item.end ?? item.to === '/'}\r\n title={!isExpanded ? item.label : undefined}\r\n onClick={() => { if (window.innerWidth < 640 && setIsOpen) setIsOpen(false) }}\r\n className={({ isActive }) => `\r\n flex items-center gap-4 transition-all duration-300 rounded-lg mx-2\r\n ${isExpanded ? 'px-6 py-2.5' : 'px-0 py-2.5 justify-center'}\r\n ${isActive ? 'bg-proef-turquoise/15 text-proef-turquoise font-semibold' : 'text-white/50 hover:bg-white/5 hover:text-white'}\r\n `}\r\n >\r\n {({ isActive }) => (\r\n <>\r\n <div className=\"relative flex-shrink-0\">\r\n <item.icon size={20} className={isActive ? 'text-proef-turquoise drop-shadow-[0_0_6px_rgba(0,230,200,0.6)]' : ''} />\r\n {item.badge != null && item.badge > 0 && !isExpanded && (\r\n <span className=\"absolute -top-1 -right-1 w-2 h-2 rounded-full bg-amber-400\" />\r\n )}\r\n </div>\r\n {isExpanded && (\r\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\">\r\n <span className=\"text-sm font-semibold truncate\">{item.label}</span>\r\n {item.badge != null && item.badge > 0 && (\r\n <span className=\"ml-auto flex-shrink-0 bg-amber-400 text-proef-navy text-[10px] font-black rounded-full px-1.5 py-0.5 min-w-[18px] text-center leading-none\">\r\n {item.badge}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </NavLink>\r\n )}\r\n </Fragment>\r\n )\r\n })}\r\n </nav>\r\n\r\n <div className={`mt-auto border-t border-white/10 px-2 py-3 ${isExpanded ? 'space-y-2' : 'flex flex-col items-center gap-3'}`}>\r\n {/* Slot extra (ex: filtro global da app). Recebe o estado expandido. */}\r\n {footer && <div className={isExpanded ? '' : 'w-full flex justify-center'}>{footer(isExpanded)}</div>}\r\n\r\n {/* Seletor de tema (opcional). Expandida: grid Light/Dark/System; colapsada: 1 ícone que roda. */}\r\n {onThemeChange && (\r\n isExpanded ? (\r\n <div>\r\n <p className=\"px-1 pb-1 text-[8px] font-black uppercase tracking-[0.25em] text-white/30\">{themeLabels?.label ?? 'Theme'}</p>\r\n <div className=\"grid grid-cols-3 gap-1 p-1 bg-white/5 rounded-lg border border-white/5\">\r\n {themeOptions.map((opt) => (\r\n <button\r\n key={opt.val}\r\n onClick={() => onThemeChange(opt.val)}\r\n title={opt.label}\r\n aria-pressed={theme === opt.val}\r\n className={`appearance-none bg-transparent border-0 cursor-pointer flex flex-col items-center gap-1 py-1.5 rounded-md text-[8px] font-black uppercase tracking-wider transition-all ${theme === opt.val ? 'bg-proef-turquoise/15 text-proef-turquoise' : 'text-white/40 hover:text-white/70 hover:bg-white/5'}`}\r\n >\r\n <opt.Icon size={14} />\r\n {opt.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ) : (\r\n <button onClick={cycleTheme} title={themeLabels?.label ?? 'Theme'} className=\"appearance-none bg-transparent border-0 cursor-pointer p-2 text-white/30 hover:text-proef-turquoise transition-colors rounded-lg hover:bg-white/5\">\r\n <ThemeIcon size={18} />\r\n </button>\r\n )\r\n )}\r\n\r\n {/* Selector de idioma (opcional). Expandida: segmentos PT|EN; colapsada: 1 globo que roda. */}\r\n {languages && languages.length > 0 && (\r\n isExpanded ? (\r\n <div className=\"flex gap-1\">\r\n {languages.map((l) => (\r\n <button\r\n key={l.code}\r\n onClick={() => onLanguageChange?.(l.code)}\r\n className={`appearance-none bg-transparent cursor-pointer flex-1 py-1.5 text-[10px] font-black uppercase tracking-widest border transition-all rounded-md ${currentLang === l.code ? 'text-proef-turquoise border-proef-turquoise/40' : 'text-white/40 border-white/5 hover:text-white hover:border-white/20'}`}\r\n >\r\n {l.label}\r\n </button>\r\n ))}\r\n </div>\r\n ) : (\r\n <div className=\"flex justify-center\">\r\n <button onClick={cycleLang} title={currentLang?.toUpperCase()} className=\"appearance-none bg-transparent border-0 cursor-pointer p-2 text-white/30 hover:text-proef-turquoise transition-colors rounded-lg hover:bg-white/5\">\r\n <Globe size={18} />\r\n </button>\r\n </div>\r\n )\r\n )}\r\n\r\n {isExpanded ? (\r\n <button onClick={() => onLogout?.()} className=\"appearance-none bg-transparent cursor-pointer w-full text-center py-2.5 text-[10px] font-black uppercase tracking-widest text-white/40 hover:text-proef-turquoise transition-all border border-white/5 hover:border-proef-turquoise/30\">\r\n {logoutLabel}\r\n </button>\r\n ) : (\r\n <div className=\"flex justify-center\">\r\n <button onClick={() => onLogout?.()} title={logoutLabel} className=\"appearance-none bg-transparent border-0 cursor-pointer p-2 text-white/30 hover:text-proef-turquoise transition-colors rounded-lg hover:bg-white/5\">\r\n <LogOut size={18} />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Só com a sidebar aberta: no carril de 20px isto ficava ilegível\r\n ou cortado, e é informação de consulta, não um controlo. */}\r\n {deployedAt != null && isExpanded && (\r\n <div title={deployedAtLabel} className=\"text-center text-[10px] tabular-nums text-white/25 select-text\">\r\n {formatarDeploy(deployedAt)}\r\n </div>\r\n )}\r\n </div>\r\n </aside>\r\n )\r\n}\r\n\r\nexport default Sidebar\r\n"],"names":["Fragment"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ .cui-spinner {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ width: 100%;
6
+ }
7
+ .cui-spinner .cui-icon {
8
+ font-size: 1.5rem;
9
+ color: var(--dark-blue);
10
+ }
@@ -0,0 +1,19 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
3
+ import { faSpinner } from "@fortawesome/free-solid-svg-icons";
4
+ import './Spinner.css';/* empty css */
5
+ const Spinner = () => {
6
+ return /* @__PURE__ */ jsx("div", { className: "cui-spinner", children: /* @__PURE__ */ jsx(
7
+ FontAwesomeIcon,
8
+ {
9
+ icon: faSpinner,
10
+ className: "cui-icon",
11
+ spin: true,
12
+ "aria-hidden": "true"
13
+ }
14
+ ) });
15
+ };
16
+ export {
17
+ Spinner as default
18
+ };
19
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sources":["../../../../../../src/legacy/components/layout/Spinner/Spinner.tsx"],"sourcesContent":["import React from 'react'\r\n\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons'\r\nimport './Spinner.scss'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst Spinner: React.FC = () => {\r\n return (\r\n <div className=\"cui-spinner\">\r\n <FontAwesomeIcon\r\n icon={faSpinner}\r\n className={'cui-icon'}\r\n spin\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default Spinner\r\n"],"names":[],"mappings":";;;;AAOA,MAAM,UAAoB,MAAM;AAC9B,SACE,oBAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM;AAAA,MACN,WAAW;AAAA,MACX,MAAI;AAAA,MACJ,eAAY;AAAA,IAAA;AAAA,EAAA,GAEhB;AAEJ;"}
@@ -0,0 +1,34 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const Search = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
3
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "8" }),
4
+ /* @__PURE__ */ jsx("path", { d: "m21 21-4.3-4.3" })
5
+ ] });
6
+ const Bell = ({ size = 24, className }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
7
+ /* @__PURE__ */ jsx("path", { d: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" }),
8
+ /* @__PURE__ */ jsx("path", { d: "M10.3 21a1.94 1.94 0 0 0 3.4 0" })
9
+ ] });
10
+ const TopBar = ({ searchPlaceholder, onSearch, right }) => {
11
+ return /* @__PURE__ */ jsxs("header", { className: "h-16 bg-white border-b border-slate-100 dark:bg-slate-900 dark:border-slate-800 fixed top-0 right-0 left-0 sm:left-64 z-30 flex items-center justify-between px-4 sm:px-12", children: [
12
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4 flex-1 max-w-xl", children: /* @__PURE__ */ jsxs("div", { className: "relative group w-full", children: [
13
+ /* @__PURE__ */ jsx(Search, { size: 16, className: "absolute left-0 top-1/2 -translate-y-1/2 text-slate-400 group-focus-within:text-proef-blue transition-colors" }),
14
+ /* @__PURE__ */ jsx(
15
+ "input",
16
+ {
17
+ type: "text",
18
+ placeholder: searchPlaceholder,
19
+ onChange: (e) => onSearch?.(e.target.value),
20
+ className: "w-full bg-transparent border-none py-2.5 pl-8 pr-4 text-sm focus:ring-0 outline-none placeholder:text-slate-400 font-medium"
21
+ }
22
+ ),
23
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-1 left-0 right-4 h-0.5 bg-slate-100 scale-x-0 group-focus-within:scale-x-100 transition-transform origin-left duration-300" })
24
+ ] }) }),
25
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4", children: right ?? /* @__PURE__ */ jsxs("button", { className: "relative p-2 text-slate-400 hover:text-proef-navy transition-colors", children: [
26
+ /* @__PURE__ */ jsx(Bell, { size: 20 }),
27
+ /* @__PURE__ */ jsx("span", { className: "absolute top-2 right-2 w-1.5 h-1.5 bg-proef-turquoise rounded-full" })
28
+ ] }) })
29
+ ] });
30
+ };
31
+ export {
32
+ TopBar as default
33
+ };
34
+ //# sourceMappingURL=TopBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopBar.js","sources":["../../../../../../src/legacy/components/layout/TopBar/TopBar.tsx"],"sourcesContent":["import React from 'react'\r\n\r\n// ── Inline icons (no lucide-react dependency in common-ui) ────────────────\r\ntype IconProps = { size?: number; className?: string }\r\n\r\nconst Search = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\r\n <path d=\"m21 21-4.3-4.3\" />\r\n </svg>\r\n)\r\n\r\nconst Bell = ({ size = 24, className }: IconProps) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\r\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" />\r\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" />\r\n </svg>\r\n)\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface TopBarProps {\r\n searchPlaceholder?: string\r\n onSearch?: (value: string) => void\r\n right?: React.ReactNode\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nconst TopBar = ({ searchPlaceholder, onSearch, right }: TopBarProps) => {\r\n return (\r\n <header className=\"h-16 bg-white border-b border-slate-100 dark:bg-slate-900 dark:border-slate-800 fixed top-0 right-0 left-0 sm:left-64 z-30 flex items-center justify-between px-4 sm:px-12\">\r\n <div className=\"flex items-center gap-4 flex-1 max-w-xl\">\r\n <div className=\"relative group w-full\">\r\n <Search size={16} className=\"absolute left-0 top-1/2 -translate-y-1/2 text-slate-400 group-focus-within:text-proef-blue transition-colors\" />\r\n <input\r\n type=\"text\"\r\n placeholder={searchPlaceholder}\r\n onChange={(e) => onSearch?.(e.target.value)}\r\n className=\"w-full bg-transparent border-none py-2.5 pl-8 pr-4 text-sm focus:ring-0 outline-none placeholder:text-slate-400 font-medium\"\r\n />\r\n <div className=\"absolute bottom-1 left-0 right-4 h-0.5 bg-slate-100 scale-x-0 group-focus-within:scale-x-100 transition-transform origin-left duration-300\" />\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-4\">\r\n {right ?? (\r\n <button className=\"relative p-2 text-slate-400 hover:text-proef-navy transition-colors\">\r\n <Bell size={20} />\r\n <span className=\"absolute top-2 right-2 w-1.5 h-1.5 bg-proef-turquoise rounded-full\" />\r\n </button>\r\n )}\r\n </div>\r\n </header>\r\n )\r\n}\r\n\r\nexport default TopBar\r\n"],"names":[],"mappings":";AAKA,MAAM,SAAS,CAAC,EAAE,OAAO,IAAI,UAAA,MACzB,qBAAC,OAAA,EAAI,OAAM,8BAA6B,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,WAClL,UAAA;AAAA,EAAA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,EAC9B,oBAAC,QAAA,EAAK,GAAE,iBAAA,CAAiB;AAAA,GAC7B;AAGJ,MAAM,OAAO,CAAC,EAAE,OAAO,IAAI,UAAA,MACvB,qBAAC,OAAA,EAAI,OAAM,8BAA6B,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,WAClL,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,GAAE,4CAAA,CAA4C;AAAA,EACpD,oBAAC,QAAA,EAAK,GAAE,iCAAA,CAAiC;AAAA,GAC7C;AAWJ,MAAM,SAAS,CAAC,EAAE,mBAAmB,UAAU,YAAyB;AACpE,SACI,qBAAC,UAAA,EAAO,WAAU,8KACd,UAAA;AAAA,IAAA,oBAAC,SAAI,WAAU,2CACX,UAAA,qBAAC,OAAA,EAAI,WAAU,yBACX,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAO,MAAM,IAAI,WAAU,gHAA+G;AAAA,MAC3I;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,aAAa;AAAA,UACb,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,UAC1C,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAEd,oBAAC,OAAA,EAAI,WAAU,6IAAA,CAA6I;AAAA,IAAA,EAAA,CAChK,EAAA,CACJ;AAAA,IACA,oBAAC,SAAI,WAAU,2BACV,mBACG,qBAAC,UAAA,EAAO,WAAU,uEACd,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAK,MAAM,GAAA,CAAI;AAAA,MAChB,oBAAC,QAAA,EAAK,WAAU,qEAAA,CAAqE;AAAA,IAAA,EAAA,CACzF,EAAA,CAER;AAAA,EAAA,GACJ;AAER;"}