@proef/common-ui 0.0.0-stage → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/assets/imagem-6ee08a37d9.png +0 -0
- package/dist/esm/assets/imagem-6fcae1b87b.png +0 -0
- package/dist/esm/index.js +324 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js +5 -0
- package/dist/esm/legacy/assets/svgs/proef-footer-logo.svg.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.css +43 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.js +31 -0
- package/dist/esm/legacy/components/atoms/Acronym/Acronym.js.map +1 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.css +36 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js +57 -0
- package/dist/esm/legacy/components/atoms/BreadCrumb/BreadCrumb.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.css +218 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js +50 -0
- package/dist/esm/legacy/components/atoms/Button/variants/ActionButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.css +56 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js +34 -0
- package/dist/esm/legacy/components/atoms/Button/variants/FilterButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.css +74 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js +29 -0
- package/dist/esm/legacy/components/atoms/Button/variants/IconButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.css +99 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js +36 -0
- package/dist/esm/legacy/components/atoms/Button/variants/MainButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.css +63 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js +21 -0
- package/dist/esm/legacy/components/atoms/Button/variants/TabButton.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Field/Field.css +171 -0
- package/dist/esm/legacy/components/atoms/Field/Field.js +70 -0
- package/dist/esm/legacy/components/atoms/Field/Field.js.map +1 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.css +10 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.js +25 -0
- package/dist/esm/legacy/components/atoms/IconText/IconText.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Icone/Icone.js +24 -0
- package/dist/esm/legacy/components/atoms/Icone/Icone.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Input/Input.css +12 -0
- package/dist/esm/legacy/components/atoms/Input/Input.js +28 -0
- package/dist/esm/legacy/components/atoms/Input/Input.js.map +1 -0
- package/dist/esm/legacy/components/atoms/InputData/InputData.js +25 -0
- package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Label/Label.css +192 -0
- package/dist/esm/legacy/components/atoms/Label/Label.js +13 -0
- package/dist/esm/legacy/components/atoms/Label/Label.js.map +1 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.css +40 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js +21 -0
- package/dist/esm/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Select/Select.css +16 -0
- package/dist/esm/legacy/components/atoms/Select/Select.js +27 -0
- package/dist/esm/legacy/components/atoms/Select/Select.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Stack/Stack.js +20 -0
- package/dist/esm/legacy/components/atoms/Stack/Stack.js.map +1 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.css +36 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js +29 -0
- package/dist/esm/legacy/components/atoms/Switch/CustomSwitch.js.map +1 -0
- package/dist/esm/legacy/components/charts/Charts.js +349 -0
- package/dist/esm/legacy/components/charts/Charts.js.map +1 -0
- package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js +100 -0
- package/dist/esm/legacy/components/layout/AppLauncher/AppLauncher.js.map +1 -0
- package/dist/esm/legacy/components/layout/Error/Error.css +20 -0
- package/dist/esm/legacy/components/layout/Error/Error.js +12 -0
- package/dist/esm/legacy/components/layout/Error/Error.js.map +1 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.css +42 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.js +23 -0
- package/dist/esm/legacy/components/layout/Footer/Footer.js.map +1 -0
- package/dist/esm/legacy/components/layout/Header/Header.css +66 -0
- package/dist/esm/legacy/components/layout/Header/Header.js +37 -0
- package/dist/esm/legacy/components/layout/Header/Header.js.map +1 -0
- package/dist/esm/legacy/components/layout/Layout/Layout.js +31 -0
- package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -0
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +38 -0
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.css +10 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.js +19 -0
- package/dist/esm/legacy/components/layout/Spinner/Spinner.js.map +1 -0
- package/dist/esm/legacy/components/layout/TopBar/TopBar.js +34 -0
- package/dist/esm/legacy/components/layout/TopBar/TopBar.js.map +1 -0
- package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js +82 -0
- package/dist/esm/legacy/components/layout/TopNavLayout/TopNavLayout.js.map +1 -0
- package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js +25 -0
- package/dist/esm/legacy/components/molecules/BarraValor/BarraValor.js.map +1 -0
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +246 -0
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.css +3 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js +33 -0
- package/dist/esm/legacy/components/molecules/ConfirmModal/ConfirmModal.js.map +1 -0
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +1259 -0
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -0
- package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js +68 -0
- package/dist/esm/legacy/components/molecules/FileDropzone/FileDropzone.js.map +1 -0
- package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js +96 -0
- package/dist/esm/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.js.map +1 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.css +54 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.js +64 -0
- package/dist/esm/legacy/components/molecules/Modal/Modal.js.map +1 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.css +97 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js +113 -0
- package/dist/esm/legacy/components/molecules/MultiTagPicker/MultiTagPicker.js.map +1 -0
- package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js +114 -0
- package/dist/esm/legacy/components/molecules/PhotoAvatar/PhotoAvatar.js.map +1 -0
- package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js +116 -0
- package/dist/esm/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.js.map +1 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.css +69 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js +62 -0
- package/dist/esm/legacy/components/molecules/Sidebar/Sidebar.js.map +1 -0
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +23 -0
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -0
- package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js +162 -0
- package/dist/esm/legacy/components/organisms/GanttChart/GanttChart.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Kanban/Kanban.js +88 -0
- package/dist/esm/legacy/components/organisms/Kanban/Kanban.js.map +1 -0
- package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js +87 -0
- package/dist/esm/legacy/components/organisms/LazyLoader/LazyLoader.js.map +1 -0
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +427 -0
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -0
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +218 -0
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -0
- package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js +147 -0
- package/dist/esm/legacy/components/organisms/PesquisaRapida/PesquisaRapida.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.css +26 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.js +26 -0
- package/dist/esm/legacy/components/organisms/Profile/Profile.js.map +1 -0
- package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js +79 -0
- package/dist/esm/legacy/components/organisms/RoleGuard/RoleGuard.js.map +1 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.css +87 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.js +181 -0
- package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -0
- package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js +115 -0
- package/dist/esm/legacy/components/organisms/StatusMatrix/StatusMatrix.js.map +1 -0
- package/dist/esm/legacy/components/ui/Avisos.js +33 -0
- package/dist/esm/legacy/components/ui/Avisos.js.map +1 -0
- package/dist/esm/legacy/components/ui/BarraAcoes.js +19 -0
- package/dist/esm/legacy/components/ui/BarraAcoes.js.map +1 -0
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js +19 -0
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -0
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js +9 -0
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -0
- package/dist/esm/legacy/components/ui/Confirmacao.js +34 -0
- package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -0
- package/dist/esm/legacy/components/ui/Escolha.js +41 -0
- package/dist/esm/legacy/components/ui/Escolha.js.map +1 -0
- package/dist/esm/legacy/components/ui/FaixaAviso.js +19 -0
- package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -0
- package/dist/esm/legacy/components/ui/MenuAcoes.js +116 -0
- package/dist/esm/legacy/components/ui/MenuAcoes.js.map +1 -0
- package/dist/esm/legacy/components/ui/Passos.js +32 -0
- package/dist/esm/legacy/components/ui/Passos.js.map +1 -0
- package/dist/esm/legacy/components/ui/Separadores.js +17 -0
- package/dist/esm/legacy/components/ui/Separadores.js.map +1 -0
- package/dist/esm/legacy/components/ui/TextoAuto.js +33 -0
- package/dist/esm/legacy/components/ui/TextoAuto.js.map +1 -0
- package/dist/esm/legacy/components/ui/Ui.js +263 -0
- package/dist/esm/legacy/components/ui/Ui.js.map +1 -0
- package/dist/esm/legacy/components/ui/painelFlutuante.js +13 -0
- package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -0
- package/dist/esm/legacy/constants/Colors.js +33 -0
- package/dist/esm/legacy/constants/Colors.js.map +1 -0
- package/dist/esm/legacy/constants/FontWeight.js +35 -0
- package/dist/esm/legacy/constants/FontWeight.js.map +1 -0
- package/dist/esm/legacy/contexts/apiContext.js +25 -0
- package/dist/esm/legacy/contexts/apiContext.js.map +1 -0
- package/dist/esm/legacy/contexts/authContext.js +85 -0
- package/dist/esm/legacy/contexts/authContext.js.map +1 -0
- package/dist/esm/legacy/contexts/socketContext.js +34 -0
- package/dist/esm/legacy/contexts/socketContext.js.map +1 -0
- package/dist/esm/legacy/hooks/useApi.js +62 -0
- package/dist/esm/legacy/hooks/useApi.js.map +1 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.css +18 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.js +50 -0
- package/dist/esm/legacy/pages/Error/ErrorPage.js.map +1 -0
- package/dist/esm/legacy/pages/Loading/Loading.css +46 -0
- package/dist/esm/legacy/pages/Loading/Loading.js +9 -0
- package/dist/esm/legacy/pages/Loading/Loading.js.map +1 -0
- package/dist/esm/legacy/pages/Login/LoginScreen.js +46 -0
- package/dist/esm/legacy/pages/Login/LoginScreen.js.map +1 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.css +21 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.js +24 -0
- package/dist/esm/legacy/pages/NotFound/NotFound.js.map +1 -0
- package/dist/esm/legacy/styles/themes/ButtonThemes.js +28 -0
- package/dist/esm/legacy/styles/themes/ButtonThemes.js.map +1 -0
- package/dist/esm/legacy/styles/utils/utils.js +7 -0
- package/dist/esm/legacy/styles/utils/utils.js.map +1 -0
- package/dist/esm/legacy/utils/stringUtils.js +35 -0
- package/dist/esm/legacy/utils/stringUtils.js.map +1 -0
- package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js +157 -0
- package/dist/esm/v1/capabilities/documents/QRScanning/scanQRCodes.js.map +1 -0
- package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js +52 -0
- package/dist/esm/v1/capabilities/overlay/useFloatingPanel.js.map +1 -0
- package/dist/esm/v1/capabilities/theme/useIsDark.js +15 -0
- package/dist/esm/v1/capabilities/theme/useIsDark.js.map +1 -0
- package/dist/esm/v1/capabilities/theme/useTheme.js +66 -0
- package/dist/esm/v1/capabilities/theme/useTheme.js.map +1 -0
- package/dist/esm/v1/components/data/Pagination/Pagination.js +66 -0
- package/dist/esm/v1/components/data/Pagination/Pagination.js.map +1 -0
- package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js +307 -0
- package/dist/esm/v1/components/documents/DocumentDropzone/DocumentDropzone.js.map +1 -0
- package/dist/esm/v1/components/feedback/Toast/Toast.js +105 -0
- package/dist/esm/v1/components/feedback/Toast/Toast.js.map +1 -0
- package/dist/esm/v1/components/forms/FormField/FormField.js +59 -0
- package/dist/esm/v1/components/forms/FormField/FormField.js.map +1 -0
- package/dist/esm/v1/components/forms/FormGrid/FormGrid.js +20 -0
- package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -0
- package/dist/esm/v1/components/layout/AppShell/AppShell.js +89 -0
- package/dist/esm/v1/components/layout/AppShell/AppShell.js.map +1 -0
- package/dist/esm/v1/components/layout/Page/Page.js +16 -0
- package/dist/esm/v1/components/layout/Page/Page.js.map +1 -0
- package/dist/esm/v1/components/layout/PageHeader/PageHeader.js +26 -0
- package/dist/esm/v1/components/layout/PageHeader/PageHeader.js.map +1 -0
- package/dist/esm/v1/components/layout/SideNav/SideNav.js +287 -0
- package/dist/esm/v1/components/layout/SideNav/SideNav.js.map +1 -0
- package/dist/esm/v1/components/layout/navTrail.js +19 -0
- package/dist/esm/v1/components/layout/navTrail.js.map +1 -0
- package/dist/esm/v1/components/lists/ListFinder/ListFinder.js +271 -0
- package/dist/esm/v1/components/lists/ListFinder/ListFinder.js.map +1 -0
- package/dist/esm/v1/components/lists/ListFinder/labels.js +18 -0
- package/dist/esm/v1/components/lists/ListFinder/labels.js.map +1 -0
- package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js +95 -0
- package/dist/esm/v1/components/overlays/ConfirmDialog/ConfirmDialog.js.map +1 -0
- package/dist/esm/v1/components/overlays/Dialog/Dialog.js +141 -0
- package/dist/esm/v1/components/overlays/Dialog/Dialog.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js +98 -0
- package/dist/esm/v1/components/overlays/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js +84 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipLayer.js.map +1 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js +33 -0
- package/dist/esm/v1/components/overlays/Tooltip/TooltipPanel.js.map +1 -0
- package/dist/esm/v1/components/overlays/topLayer.js +28 -0
- package/dist/esm/v1/components/overlays/topLayer.js.map +1 -0
- package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js +50 -0
- package/dist/esm/v1/components/tables/PaginatedTable/PaginatedTable.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/ColumnFilter.js +292 -0
- package/dist/esm/v1/components/tables/Table/ColumnFilter.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js +129 -0
- package/dist/esm/v1/components/tables/Table/OverlayScrollbar.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/Table.js +1410 -0
- package/dist/esm/v1/components/tables/Table/Table.js.map +1 -0
- package/dist/esm/v1/components/tables/Table/labels.js +44 -0
- package/dist/esm/v1/components/tables/Table/labels.js.map +1 -0
- package/dist/esm/v1/foundations/icons/icons.js +227 -0
- package/dist/esm/v1/foundations/icons/icons.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/Button/Button.js +41 -0
- package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js +65 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/SegmentedControl.js.map +1 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js +10 -0
- package/dist/esm/v1/primitives/buttons/SegmentedControl/segmentedStyles.js.map +1 -0
- package/dist/esm/v1/primitives/display/Avatar/Avatar.js +120 -0
- package/dist/esm/v1/primitives/display/Avatar/Avatar.js.map +1 -0
- package/dist/esm/v1/primitives/display/Badge/Badge.js +23 -0
- package/dist/esm/v1/primitives/display/Badge/Badge.js.map +1 -0
- package/dist/esm/v1/primitives/display/Card/Card.js +22 -0
- package/dist/esm/v1/primitives/display/Card/Card.js.map +1 -0
- package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js +45 -0
- package/dist/esm/v1/primitives/display/FilterChips/FilterChips.js.map +1 -0
- package/dist/esm/v1/primitives/display/Kpi/Kpi.js +103 -0
- package/dist/esm/v1/primitives/display/Kpi/Kpi.js.map +1 -0
- package/dist/esm/v1/primitives/display/Notice/Notice.js +71 -0
- package/dist/esm/v1/primitives/display/Notice/Notice.js.map +1 -0
- package/dist/esm/v1/primitives/display/Person/Person.js +14 -0
- package/dist/esm/v1/primitives/display/Person/Person.js.map +1 -0
- package/dist/esm/v1/primitives/display/RichText/RichText.js +12 -0
- package/dist/esm/v1/primitives/display/RichText/RichText.js.map +1 -0
- package/dist/esm/v1/primitives/display/RichText/utils.js +56 -0
- package/dist/esm/v1/primitives/display/RichText/utils.js.map +1 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js +137 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/PdfPreview.js.map +1 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js +26 -0
- package/dist/esm/v1/primitives/documents/PdfPreview/pdfjs.js.map +1 -0
- package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js +37 -0
- package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -0
- package/dist/esm/v1/primitives/forms/DateInput/DateInput.js +150 -0
- package/dist/esm/v1/primitives/forms/DateInput/DateInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js +37 -0
- package/dist/esm/v1/primitives/forms/LookupInput/LookupInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js +253 -0
- package/dist/esm/v1/primitives/forms/RichTextEditor/RichTextEditor.js.map +1 -0
- package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js +43 -0
- package/dist/esm/v1/primitives/forms/SearchInput/SearchInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js +207 -0
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/TextArea/TextArea.js +75 -0
- package/dist/esm/v1/primitives/forms/TextArea/TextArea.js.map +1 -0
- package/dist/esm/v1/primitives/forms/TextInput/TextInput.js +21 -0
- package/dist/esm/v1/primitives/forms/TextInput/TextInput.js.map +1 -0
- package/dist/esm/v1/primitives/forms/field.js +14 -0
- package/dist/esm/v1/primitives/forms/field.js.map +1 -0
- package/dist/esm/v1/primitives/lists/ListItem/ListItem.js +73 -0
- package/dist/esm/v1/primitives/lists/ListItem/ListItem.js.map +1 -0
- package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js +96 -0
- package/dist/esm/v1/primitives/navigation/Tabs/Tabs.js.map +1 -0
- package/dist/style.components.css +3 -0
- package/dist/style.css +2 -0
- package/dist/style.layered.css +2 -0
- package/dist/tailwind.css +24 -0
- package/dist/theme-boot.js +1 -0
- package/dist/theme.css +265 -0
- package/dist/tokens.css +121 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/legacy/components/atoms/Acronym/Acronym.d.ts +11 -0
- package/dist/types/legacy/components/atoms/BreadCrumb/BreadCrumb.d.ts +9 -0
- package/dist/types/legacy/components/atoms/Button/variants/ActionButton.d.ts +14 -0
- package/dist/types/legacy/components/atoms/Button/variants/FilterButton.d.ts +12 -0
- package/dist/types/legacy/components/atoms/Button/variants/IconButton.d.ts +22 -0
- package/dist/types/legacy/components/atoms/Button/variants/MainButton.d.ts +17 -0
- package/dist/types/legacy/components/atoms/Button/variants/TabButton.d.ts +14 -0
- package/dist/types/legacy/components/atoms/Field/Field.d.ts +15 -0
- package/dist/types/legacy/components/atoms/IconText/IconText.d.ts +12 -0
- package/dist/types/legacy/components/atoms/Icone/Icone.d.ts +31 -0
- package/dist/types/legacy/components/atoms/Input/Input.d.ts +13 -0
- package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +38 -0
- package/dist/types/legacy/components/atoms/Label/Label.d.ts +11 -0
- package/dist/types/legacy/components/atoms/MultiTagPickerTag/MultiTagPickerTag.d.ts +10 -0
- package/dist/types/legacy/components/atoms/SearchSelect/SearchSelect.d.ts +15 -0
- package/dist/types/legacy/components/atoms/Select/Select.d.ts +16 -0
- package/dist/types/legacy/components/atoms/Stack/Stack.d.ts +9 -0
- package/dist/types/legacy/components/atoms/Switch/CustomSwitch.d.ts +12 -0
- package/dist/types/legacy/components/charts/Charts.d.ts +149 -0
- package/dist/types/legacy/components/layout/AppLauncher/AppLauncher.d.ts +35 -0
- package/dist/types/legacy/components/layout/Error/Error.d.ts +8 -0
- package/dist/types/legacy/components/layout/Footer/Footer.d.ts +11 -0
- package/dist/types/legacy/components/layout/Header/Header.d.ts +16 -0
- package/dist/types/legacy/components/layout/Layout/Layout.d.ts +35 -0
- package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +56 -0
- package/dist/types/legacy/components/layout/Spinner/Spinner.d.ts +5 -0
- package/dist/types/legacy/components/layout/TopBar/TopBar.d.ts +10 -0
- package/dist/types/legacy/components/layout/TopNavLayout/TopNavLayout.d.ts +43 -0
- package/dist/types/legacy/components/molecules/BarraValor/BarraValor.d.ts +28 -0
- package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +116 -0
- package/dist/types/legacy/components/molecules/ConfirmModal/ConfirmModal.d.ts +13 -0
- package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +344 -0
- package/dist/types/legacy/components/molecules/FileDropzone/FileDropzone.d.ts +25 -0
- package/dist/types/legacy/components/molecules/LanguageSwitcher/LanguageSwitcher.d.ts +33 -0
- package/dist/types/legacy/components/molecules/Modal/Modal.d.ts +22 -0
- package/dist/types/legacy/components/molecules/MultiTagPicker/MultiTagPicker.d.ts +25 -0
- package/dist/types/legacy/components/molecules/PhotoAvatar/PhotoAvatar.d.ts +34 -0
- package/dist/types/legacy/components/molecules/SeletorPesquisa/SeletorPesquisa.d.ts +48 -0
- package/dist/types/legacy/components/molecules/Sidebar/Sidebar.d.ts +12 -0
- package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +19 -0
- package/dist/types/legacy/components/organisms/GanttChart/GanttChart.d.ts +62 -0
- package/dist/types/legacy/components/organisms/Kanban/Kanban.d.ts +44 -0
- package/dist/types/legacy/components/organisms/LazyLoader/LazyLoader.d.ts +16 -0
- package/dist/types/legacy/components/organisms/MapaPontos/MapaPontos.d.ts +206 -0
- package/dist/types/legacy/components/organisms/PainelFiltros/PainelFiltros.d.ts +69 -0
- package/dist/types/legacy/components/organisms/PesquisaRapida/PesquisaRapida.d.ts +53 -0
- package/dist/types/legacy/components/organisms/Profile/Profile.d.ts +12 -0
- package/dist/types/legacy/components/organisms/RoleGuard/RoleGuard.d.ts +37 -0
- package/dist/types/legacy/components/organisms/Selector/Selector.d.ts +20 -0
- package/dist/types/legacy/components/organisms/StatusMatrix/StatusMatrix.d.ts +54 -0
- package/dist/types/legacy/components/ui/Avisos.d.ts +33 -0
- package/dist/types/legacy/components/ui/BarraAcoes.d.ts +19 -0
- package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +23 -0
- package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +14 -0
- package/dist/types/legacy/components/ui/Confirmacao.d.ts +24 -0
- package/dist/types/legacy/components/ui/Escolha.d.ts +35 -0
- package/dist/types/legacy/components/ui/FaixaAviso.d.ts +19 -0
- package/dist/types/legacy/components/ui/MenuAcoes.d.ts +31 -0
- package/dist/types/legacy/components/ui/Passos.d.ts +31 -0
- package/dist/types/legacy/components/ui/Separadores.d.ts +19 -0
- package/dist/types/legacy/components/ui/TextoAuto.d.ts +23 -0
- package/dist/types/legacy/components/ui/Ui.d.ts +181 -0
- package/dist/types/legacy/components/ui/painelFlutuante.d.ts +16 -0
- package/dist/types/legacy/constants/Colors.d.ts +28 -0
- package/dist/types/legacy/constants/FontWeight.d.ts +9 -0
- package/dist/types/legacy/contexts/apiContext.d.ts +10 -0
- package/dist/types/legacy/contexts/authContext.d.ts +31 -0
- package/dist/types/legacy/contexts/socketContext.d.ts +16 -0
- package/dist/types/legacy/exports/assets.d.ts +0 -0
- package/dist/types/legacy/exports/atoms.d.ts +19 -0
- package/dist/types/legacy/exports/charts.d.ts +2 -0
- package/dist/types/legacy/exports/constants.d.ts +0 -0
- package/dist/types/legacy/exports/contexts.d.ts +3 -0
- package/dist/types/legacy/exports/hooks.d.ts +4 -0
- package/dist/types/legacy/exports/layout.d.ts +14 -0
- package/dist/types/legacy/exports/molecules.d.ts +21 -0
- package/dist/types/legacy/exports/organisms.d.ts +17 -0
- package/dist/types/legacy/exports/pages.d.ts +5 -0
- package/dist/types/legacy/exports/styles.d.ts +2 -0
- package/dist/types/legacy/exports/types.d.ts +7 -0
- package/dist/types/legacy/exports/ui.d.ts +24 -0
- package/dist/types/legacy/exports/utils.d.ts +1 -0
- package/dist/types/legacy/hooks/useApi.d.ts +19 -0
- package/dist/types/legacy/pages/Error/ErrorPage.d.ts +16 -0
- package/dist/types/legacy/pages/Loading/Loading.d.ts +8 -0
- package/dist/types/legacy/pages/Login/LoginScreen.d.ts +42 -0
- package/dist/types/legacy/pages/NotFound/NotFound.d.ts +8 -0
- package/dist/types/legacy/styles/themes/ButtonThemes.d.ts +6 -0
- package/dist/types/legacy/styles/utils/utils.d.ts +2 -0
- package/dist/types/legacy/types/Fetcher.d.ts +5 -0
- package/dist/types/legacy/types/LoggedUser.d.ts +10 -0
- package/dist/types/legacy/types/SelectableElement.d.ts +6 -0
- package/dist/types/legacy/types/SidebarMenu.d.ts +12 -0
- package/dist/types/legacy/types/themes/AcronymThemes.d.ts +4 -0
- package/dist/types/legacy/types/themes/ButtonThemes.d.ts +21 -0
- package/dist/types/legacy/types/themes/CustomSwitchThemes.d.ts +4 -0
- package/dist/types/legacy/types/themes/IconTextThemes.d.ts +6 -0
- package/dist/types/legacy/utils/keycloak.d.ts +0 -0
- package/dist/types/legacy/utils/stringUtils.d.ts +6 -0
- package/dist/types/v1/capabilities/documents/QRScanning/scanQRCodes.d.ts +25 -0
- package/dist/types/v1/capabilities/overlay/useFloatingPanel.d.ts +20 -0
- package/dist/types/v1/capabilities/theme/useIsDark.d.ts +10 -0
- package/dist/types/v1/capabilities/theme/useTheme.d.ts +29 -0
- package/dist/types/v1/components/data/Pagination/Pagination.d.ts +33 -0
- package/dist/types/v1/components/documents/DocumentDropzone/DocumentDropzone.d.ts +60 -0
- package/dist/types/v1/components/feedback/Toast/Toast.d.ts +51 -0
- package/dist/types/v1/components/forms/FormField/FormField.d.ts +44 -0
- package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +23 -0
- package/dist/types/v1/components/layout/AppShell/AppShell.d.ts +35 -0
- package/dist/types/v1/components/layout/Page/Page.d.ts +23 -0
- package/dist/types/v1/components/layout/PageHeader/PageHeader.d.ts +35 -0
- package/dist/types/v1/components/layout/SideNav/SideNav.d.ts +92 -0
- package/dist/types/v1/components/layout/navTrail.d.ts +15 -0
- package/dist/types/v1/components/lists/ListFinder/ListFinder.d.ts +86 -0
- package/dist/types/v1/components/lists/ListFinder/labels.d.ts +24 -0
- package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
- package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +66 -0
- package/dist/types/v1/components/overlays/Tooltip/Tooltip.d.ts +34 -0
- package/dist/types/v1/components/overlays/Tooltip/TooltipLayer.d.ts +18 -0
- package/dist/types/v1/components/overlays/Tooltip/TooltipPanel.d.ts +23 -0
- package/dist/types/v1/components/overlays/topLayer.d.ts +23 -0
- package/dist/types/v1/components/tables/PaginatedTable/PaginatedTable.d.ts +41 -0
- package/dist/types/v1/components/tables/Table/ColumnFilter.d.ts +48 -0
- package/dist/types/v1/components/tables/Table/OverlayScrollbar.d.ts +34 -0
- package/dist/types/v1/components/tables/Table/Table.d.ts +250 -0
- package/dist/types/v1/components/tables/Table/labels.d.ts +54 -0
- package/dist/types/v1/foundations/icons/icons.d.ts +81 -0
- package/dist/types/v1/index.d.ts +86 -0
- package/dist/types/v1/primitives/buttons/Button/Button.d.ts +35 -0
- package/dist/types/v1/primitives/buttons/SegmentedControl/SegmentedControl.d.ts +28 -0
- package/dist/types/v1/primitives/buttons/SegmentedControl/segmentedStyles.d.ts +16 -0
- package/dist/types/v1/primitives/display/Avatar/Avatar.d.ts +30 -0
- package/dist/types/v1/primitives/display/Badge/Badge.d.ts +25 -0
- package/dist/types/v1/primitives/display/Card/Card.d.ts +22 -0
- package/dist/types/v1/primitives/display/FilterChips/FilterChips.d.ts +33 -0
- package/dist/types/v1/primitives/display/Kpi/Kpi.d.ts +68 -0
- package/dist/types/v1/primitives/display/Notice/Notice.d.ts +29 -0
- package/dist/types/v1/primitives/display/Person/Person.d.ts +15 -0
- package/dist/types/v1/primitives/display/RichText/RichText.d.ts +17 -0
- package/dist/types/v1/primitives/display/RichText/utils.d.ts +22 -0
- package/dist/types/v1/primitives/documents/PdfPreview/PdfPreview.d.ts +17 -0
- package/dist/types/v1/primitives/documents/PdfPreview/pdfjs.d.ts +11 -0
- package/dist/types/v1/primitives/forms/Checkbox/Checkbox.d.ts +25 -0
- package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
- package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +28 -0
- package/dist/types/v1/primitives/forms/RichTextEditor/RichTextEditor.d.ts +64 -0
- package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
- package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +70 -0
- package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +40 -0
- package/dist/types/v1/primitives/forms/TextInput/TextInput.d.ts +16 -0
- package/dist/types/v1/primitives/forms/field.d.ts +22 -0
- package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +67 -0
- package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
- package/package.json +125 -6
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Escolha.js","sources":["../../../../../src/legacy/components/ui/Escolha.tsx"],"sourcesContent":["import React from 'react'\r\nimport SelectInput from '../../../v1/primitives/forms/SelectInput/SelectInput'\r\n\r\nexport interface OpcaoEscolha {\r\n valor: string\r\n rotulo: string\r\n /** Texto pequeno por baixo do rótulo, na lista. */\r\n descricao?: string\r\n}\r\n\r\nexport interface EscolhaProps {\r\n valor: string\r\n /** Opções: texto simples (valor = rótulo) ou { valor, rotulo, descricao }. */\r\n opcoes: readonly string[] | readonly OpcaoEscolha[]\r\n onMudar: (valor: string) => void\r\n /** Nome acessível (leitores de ecrã). */\r\n rotulo: string\r\n /** Texto do botão sem nada escolhido. */\r\n placeholder?: string\r\n /** Primeira opção \"vazia\" (valor ''), para desfazer a escolha (ex.: \"Todas\"). */\r\n opcaoVazia?: string\r\n disabled?: boolean\r\n /** Caixa de pesquisa no topo da lista. Por omissão, só com mais de 10 opções. */\r\n pesquisa?: boolean\r\n /** Largura (classes tailwind). Por omissão a do conteúdo, entre 10rem e 18rem (etiqueta: a do texto). */\r\n className?: string\r\n /** 'barra' (omissão): a altura dos botões e filtros. 'formulario': a altura dos campos dos formulários legacy (38px). */\r\n tamanho?: 'barra' | 'formulario'\r\n /** 'campo' (omissão) ou 'etiqueta': o botão é uma etiqueta arredondada, com as cores de `corEtiqueta`. */\r\n aspeto?: 'campo' | 'etiqueta'\r\n /** Classes de cor da etiqueta (fundo, texto e variante dark:), normalmente conforme o valor escolhido. */\r\n corEtiqueta?: string\r\n}\r\n\r\n/**\r\n * Migrado para o V1: adaptador do `SelectInput` (a mesma lista desenhada, nomes antigos e textos em português).\r\n * @deprecated Legacy — usar o `SelectInput` do V1. Ver Storybook › Legacy.\r\n */\r\nexport default function Escolha({\r\n valor,\r\n opcoes,\r\n onMudar,\r\n rotulo,\r\n placeholder = 'Escolher…',\r\n opcaoVazia,\r\n disabled = false,\r\n pesquisa,\r\n className,\r\n tamanho = 'barra',\r\n aspeto = 'campo',\r\n corEtiqueta,\r\n}: EscolhaProps) {\r\n const etiqueta = aspeto === 'etiqueta'\r\n return (\r\n <SelectInput\r\n aria-label={rotulo}\r\n value={valor}\r\n onValueChange={onMudar}\r\n options={opcoes.map((o) => (typeof o === 'string' ? o : { value: o.valor, label: o.rotulo, description: o.descricao }))}\r\n placeholder={placeholder}\r\n placeholderOption={false}\r\n emptyOption={opcaoVazia}\r\n disabled={disabled}\r\n searchable={pesquisa}\r\n variant={etiqueta ? 'pill' : 'field'}\r\n pillClassName={corEtiqueta}\r\n tall={tamanho === 'formulario'}\r\n labels={{ search: 'Pesquisar…', searchIn: 'Pesquisar em {label}', noResults: 'Sem resultados' }}\r\n className={`inline-block ${className ?? (etiqueta ? '' : 'min-w-[10rem] max-w-[18rem]')}`}\r\n />\r\n )\r\n}\r\n"],"names":[],"mappings":";;AAsCA,SAAwB,QAAQ;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AACF,GAAiB;AACf,QAAM,WAAW,WAAW;AAC5B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,cAAY;AAAA,MACZ,OAAO;AAAA,MACP,eAAe;AAAA,MACf,SAAS,OAAO,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,QAAQ,aAAa,EAAE,WAAY;AAAA,MACtH;AAAA,MACA,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb;AAAA,MACA,YAAY;AAAA,MACZ,SAAS,WAAW,SAAS;AAAA,MAC7B,eAAe;AAAA,MACf,MAAM,YAAY;AAAA,MAClB,QAAQ,EAAE,QAAQ,cAAc,UAAU,wBAAwB,WAAW,iBAAA;AAAA,MAC7E,WAAW,gBAAgB,cAAc,WAAW,KAAK,8BAA8B;AAAA,IAAA;AAAA,EAAA;AAG7F;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Notice } from "../../../v1/primitives/display/Notice/Notice.js";
|
|
3
|
+
const TOM = { aviso: "warning", info: "info", erro: "error" };
|
|
4
|
+
function FaixaAviso({ children, tom = "aviso", acao, icone }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
Notice,
|
|
7
|
+
{
|
|
8
|
+
variant: "banner",
|
|
9
|
+
tone: TOM[tom],
|
|
10
|
+
icon: icone ?? null,
|
|
11
|
+
action: acao ? { label: acao.rotulo, onClick: acao.onClick } : void 0,
|
|
12
|
+
children
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
FaixaAviso as default
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=FaixaAviso.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FaixaAviso.js","sources":["../../../../../src/legacy/components/ui/FaixaAviso.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\r\nimport Notice from '../../../v1/primitives/display/Notice/Notice'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport type TomFaixa = 'aviso' | 'info' | 'erro'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface FaixaAvisoProps {\r\n children: ReactNode\r\n tom?: TomFaixa\r\n /** Ação à direita (ex: \"Voltar ao meu perfil\" no \"Ver como\"). */\r\n acao?: { rotulo: ReactNode; onClick: () => void }\r\n icone?: ReactNode\r\n}\r\n\r\nconst TOM: Record<TomFaixa, 'warning' | 'info' | 'error'> = { aviso: 'warning', info: 'info', erro: 'error' }\r\n\r\n/**\r\n * Migrado para o V1: adaptador do `Notice` com `variant=\"banner\"` (faixa no topo da página).\r\n * @deprecated Legacy — usar o `Notice` do V1. Ver Storybook › Legacy.\r\n */\r\nexport default function FaixaAviso({ children, tom = 'aviso', acao, icone }: FaixaAvisoProps) {\r\n return (\r\n <Notice\r\n variant=\"banner\"\r\n tone={TOM[tom]}\r\n icon={icone ?? null}\r\n action={acao ? { label: acao.rotulo, onClick: acao.onClick } : undefined}\r\n >\r\n {children}\r\n </Notice>\r\n )\r\n}\r\n"],"names":[],"mappings":";;AAeA,MAAM,MAAsD,EAAE,OAAO,WAAW,MAAM,QAAQ,MAAM,QAAA;AAMpG,SAAwB,WAAW,EAAE,UAAU,MAAM,SAAS,MAAM,SAA0B;AAC5F,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAM,IAAI,GAAG;AAAA,MACb,MAAM,SAAS;AAAA,MACf,QAAQ,OAAO,EAAE,OAAO,KAAK,QAAQ,SAAS,KAAK,QAAA,IAAY;AAAA,MAE9D;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useMemo, useState, useEffect } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { usePainelFlutuante, CLS_PAINEL, clsItem } from "./painelFlutuante.js";
|
|
5
|
+
function MenuAcoes({ acoes, rotulo, titulo, alinhar = "direita", disabled = false }) {
|
|
6
|
+
const p = usePainelFlutuante(alinhar);
|
|
7
|
+
const itens = useMemo(() => acoes.filter((a) => !!a), [acoes]);
|
|
8
|
+
const ativas = itens.map((a, i) => a.desativado ? -1 : i).filter((i) => i >= 0);
|
|
9
|
+
const [ativo, setAtivo] = useState(-1);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (p.aberto) setAtivo(ativas[0] ?? -1);
|
|
12
|
+
}, [p.aberto]);
|
|
13
|
+
const executar = (a) => {
|
|
14
|
+
if (a.desativado) return;
|
|
15
|
+
p.fechar();
|
|
16
|
+
a.onClick();
|
|
17
|
+
};
|
|
18
|
+
const teclado = (e) => {
|
|
19
|
+
if (!p.aberto) {
|
|
20
|
+
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
p.setAberto(true);
|
|
23
|
+
}
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const pos = ativas.indexOf(ativo);
|
|
27
|
+
if (e.key === "Escape") {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
e.stopPropagation();
|
|
30
|
+
p.fechar();
|
|
31
|
+
p.refBotao.current?.focus();
|
|
32
|
+
} else if (e.key === "ArrowDown") {
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
setAtivo(ativas[Math.min(ativas.length - 1, pos + 1)] ?? -1);
|
|
35
|
+
} else if (e.key === "ArrowUp") {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
setAtivo(ativas[Math.max(0, pos - 1)] ?? -1);
|
|
38
|
+
} else if (e.key === "Enter") {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
const a = itens[ativo];
|
|
41
|
+
if (a) executar(a);
|
|
42
|
+
} else if (e.key === "Tab") {
|
|
43
|
+
p.fechar();
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
if (itens.length === 0) return null;
|
|
47
|
+
const botao = rotulo ? /* @__PURE__ */ jsxs(
|
|
48
|
+
"button",
|
|
49
|
+
{
|
|
50
|
+
ref: p.refBotao,
|
|
51
|
+
type: "button",
|
|
52
|
+
disabled,
|
|
53
|
+
title: titulo,
|
|
54
|
+
"aria-haspopup": "menu",
|
|
55
|
+
"aria-expanded": p.aberto,
|
|
56
|
+
onClick: (e) => {
|
|
57
|
+
e.stopPropagation();
|
|
58
|
+
p.setAberto((a) => !a);
|
|
59
|
+
},
|
|
60
|
+
className: `inline-flex items-center gap-1 px-3.5 py-1.5 rounded-md text-[11px] font-black uppercase tracking-widest transition-colors whitespace-nowrap border disabled:opacity-50 disabled:cursor-not-allowed ${p.aberto ? "bg-proef-navy text-white border-proef-navy dark:bg-proef-blue dark:border-proef-blue" : "bg-white text-slate-500 border-slate-200 hover:border-proef-navy hover:text-proef-navy dark:bg-slate-800 dark:text-slate-300 dark:border-slate-700 dark:hover:border-slate-400 dark:hover:text-white"}`,
|
|
61
|
+
children: [
|
|
62
|
+
rotulo,
|
|
63
|
+
/* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: `h-3.5 w-3.5 transition-transform ${p.aberto ? "rotate-180" : ""}`, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) })
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
) : /* @__PURE__ */ jsx(
|
|
67
|
+
"button",
|
|
68
|
+
{
|
|
69
|
+
ref: p.refBotao,
|
|
70
|
+
type: "button",
|
|
71
|
+
disabled,
|
|
72
|
+
title: titulo,
|
|
73
|
+
"aria-label": titulo ?? "Ações",
|
|
74
|
+
"aria-haspopup": "menu",
|
|
75
|
+
"aria-expanded": p.aberto,
|
|
76
|
+
onClick: (e) => {
|
|
77
|
+
e.stopPropagation();
|
|
78
|
+
p.setAberto((a) => !a);
|
|
79
|
+
},
|
|
80
|
+
className: `appearance-none cursor-pointer border-0 p-1.5 rounded-lg text-slate-500 hover:bg-slate-100 hover:text-slate-800 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-white disabled:opacity-50 ${p.aberto ? "bg-slate-100 dark:bg-slate-700" : "bg-transparent"}`,
|
|
81
|
+
children: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", className: "h-4 w-4", fill: "currentColor", "aria-hidden": true, children: [
|
|
82
|
+
/* @__PURE__ */ jsx("circle", { cx: "5", cy: "12", r: "1.8" }),
|
|
83
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "1.8" }),
|
|
84
|
+
/* @__PURE__ */ jsx("circle", { cx: "19", cy: "12", r: "1.8" })
|
|
85
|
+
] })
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative inline-block", onKeyDown: teclado, children: [
|
|
89
|
+
botao,
|
|
90
|
+
p.aberto && createPortal(
|
|
91
|
+
/* @__PURE__ */ jsx("div", { ref: p.refPainel, style: p.estilo, className: CLS_PAINEL, role: "menu", onClick: (e) => e.stopPropagation(), onKeyDown: teclado, children: itens.map((a, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
92
|
+
a.separador && i > 0 && /* @__PURE__ */ jsx("div", { className: "my-1 border-t border-slate-100 dark:border-slate-800" }),
|
|
93
|
+
/* @__PURE__ */ jsxs(
|
|
94
|
+
"button",
|
|
95
|
+
{
|
|
96
|
+
type: "button",
|
|
97
|
+
role: "menuitem",
|
|
98
|
+
disabled: a.desativado,
|
|
99
|
+
onMouseEnter: () => !a.desativado && setAtivo(i),
|
|
100
|
+
onClick: () => executar(a),
|
|
101
|
+
className: `appearance-none border-0 ${clsItem(i === ativo, a.perigo)} disabled:opacity-40 disabled:cursor-not-allowed`,
|
|
102
|
+
children: [
|
|
103
|
+
a.icone && /* @__PURE__ */ jsx("span", { className: "shrink-0 [&>svg]:h-4 [&>svg]:w-4", children: a.icone }),
|
|
104
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: a.rotulo })
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
)
|
|
108
|
+
] }, i)) }),
|
|
109
|
+
document.body
|
|
110
|
+
)
|
|
111
|
+
] });
|
|
112
|
+
}
|
|
113
|
+
export {
|
|
114
|
+
MenuAcoes as default
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=MenuAcoes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuAcoes.js","sources":["../../../../../src/legacy/components/ui/MenuAcoes.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState, type ReactNode } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { CLS_PAINEL, clsItem, usePainelFlutuante } from './painelFlutuante'\r\n\r\nexport interface AcaoMenu {\r\n rotulo: ReactNode\r\n onClick: () => void\r\n /** Ícone à esquerda (ex.: um ícone do lucide-react com className=\"h-4 w-4\"). */\r\n icone?: ReactNode\r\n /** Ação destrutiva (eliminar, fechar…): a vermelho. */\r\n perigo?: boolean\r\n desativado?: boolean\r\n /** Linha separadora antes deste item. */\r\n separador?: boolean\r\n}\r\n\r\nexport interface MenuAcoesProps {\r\n /** Itens; `false`/`null`/`undefined` são ignorados (para `cond && {...}`). */\r\n acoes: (AcaoMenu | false | null | undefined)[]\r\n /**\r\n * Conteúdo do botão. Sem rótulo, o botão é o ícone \"⋯\" (ações de uma linha de tabela).\r\n * Com rótulo, é um botão como o Btn, com uma seta.\r\n */\r\n rotulo?: ReactNode\r\n /** Nome acessível / tooltip do botão. */\r\n titulo?: string\r\n /** Lado para onde a lista abre, a partir do botão. Por omissão, alinhada à direita do botão. */\r\n alinhar?: 'esquerda' | 'direita'\r\n disabled?: boolean\r\n}\r\n\r\n/**\r\n * Botão que abre uma lista de ações (ex.: \"Ações do ano\", o \"⋯\" de cada linha). Mesmo aspeto da lista da\r\n * Escolha. Teclado: ↑/↓ percorrem, Enter executa, Esc fecha. Os cliques não chegam à linha da tabela.\r\n */\r\nexport default function MenuAcoes({ acoes, rotulo, titulo, alinhar = 'direita', disabled = false }: MenuAcoesProps) {\r\n const p = usePainelFlutuante(alinhar)\r\n const itens = useMemo(() => acoes.filter((a): a is AcaoMenu => !!a), [acoes])\r\n const ativas = itens.map((a, i) => (a.desativado ? -1 : i)).filter((i) => i >= 0)\r\n const [ativo, setAtivo] = useState(-1)\r\n\r\n useEffect(() => {\r\n if (p.aberto) setAtivo(ativas[0] ?? -1)\r\n }, [p.aberto]) // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const executar = (a: AcaoMenu) => {\r\n if (a.desativado) return\r\n p.fechar()\r\n a.onClick()\r\n }\r\n\r\n const teclado = (e: React.KeyboardEvent) => {\r\n if (!p.aberto) {\r\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n e.preventDefault()\r\n p.setAberto(true)\r\n }\r\n return\r\n }\r\n const pos = ativas.indexOf(ativo)\r\n if (e.key === 'Escape') {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n p.fechar()\r\n p.refBotao.current?.focus()\r\n } else if (e.key === 'ArrowDown') {\r\n e.preventDefault()\r\n setAtivo(ativas[Math.min(ativas.length - 1, pos + 1)] ?? -1)\r\n } else if (e.key === 'ArrowUp') {\r\n e.preventDefault()\r\n setAtivo(ativas[Math.max(0, pos - 1)] ?? -1)\r\n } else if (e.key === 'Enter') {\r\n e.preventDefault()\r\n const a = itens[ativo]\r\n if (a) executar(a)\r\n } else if (e.key === 'Tab') {\r\n p.fechar()\r\n }\r\n }\r\n\r\n if (itens.length === 0) return null\r\n\r\n const botao = rotulo ? (\r\n <button\r\n ref={p.refBotao}\r\n type=\"button\"\r\n disabled={disabled}\r\n title={titulo}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={p.aberto}\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n p.setAberto((a) => !a)\r\n }}\r\n className={`inline-flex items-center gap-1 px-3.5 py-1.5 rounded-md text-[11px] font-black uppercase tracking-widest transition-colors whitespace-nowrap border disabled:opacity-50 disabled:cursor-not-allowed ${\r\n p.aberto\r\n ? 'bg-proef-navy text-white border-proef-navy dark:bg-proef-blue dark:border-proef-blue'\r\n : 'bg-white text-slate-500 border-slate-200 hover:border-proef-navy hover:text-proef-navy dark:bg-slate-800 dark:text-slate-300 dark:border-slate-700 dark:hover:border-slate-400 dark:hover:text-white'\r\n }`}\r\n >\r\n {rotulo}\r\n <svg viewBox=\"0 0 24 24\" className={`h-3.5 w-3.5 transition-transform ${p.aberto ? 'rotate-180' : ''}`} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"m6 9 6 6 6-6\" />\r\n </svg>\r\n </button>\r\n ) : (\r\n <button\r\n ref={p.refBotao}\r\n type=\"button\"\r\n disabled={disabled}\r\n title={titulo}\r\n aria-label={titulo ?? 'Ações'}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={p.aberto}\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n p.setAberto((a) => !a)\r\n }}\r\n className={`appearance-none cursor-pointer border-0 p-1.5 rounded-lg text-slate-500 hover:bg-slate-100 hover:text-slate-800 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-white disabled:opacity-50 ${\r\n p.aberto ? 'bg-slate-100 dark:bg-slate-700' : 'bg-transparent'\r\n }`}\r\n >\r\n <svg viewBox=\"0 0 24 24\" className=\"h-4 w-4\" fill=\"currentColor\" aria-hidden>\r\n <circle cx=\"5\" cy=\"12\" r=\"1.8\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"1.8\" />\r\n <circle cx=\"19\" cy=\"12\" r=\"1.8\" />\r\n </svg>\r\n </button>\r\n )\r\n\r\n return (\r\n <div className=\"relative inline-block\" onKeyDown={teclado}>\r\n {botao}\r\n {p.aberto &&\r\n createPortal(\r\n <div ref={p.refPainel} style={p.estilo} className={CLS_PAINEL} role=\"menu\" onClick={(e) => e.stopPropagation()} onKeyDown={teclado}>\r\n {itens.map((a, i) => (\r\n <React.Fragment key={i}>\r\n {a.separador && i > 0 && <div className=\"my-1 border-t border-slate-100 dark:border-slate-800\" />}\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n disabled={a.desativado}\r\n onMouseEnter={() => !a.desativado && setAtivo(i)}\r\n onClick={() => executar(a)}\r\n className={`appearance-none border-0 ${clsItem(i === ativo, a.perigo)} disabled:opacity-40 disabled:cursor-not-allowed`}\r\n >\r\n {a.icone && <span className=\"shrink-0 [&>svg]:h-4 [&>svg]:w-4\">{a.icone}</span>}\r\n <span className=\"truncate\">{a.rotulo}</span>\r\n </button>\r\n </React.Fragment>\r\n ))}\r\n </div>,\r\n document.body\r\n )}\r\n </div>\r\n )\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
function Passos({ passos, atual, onMudar, livre = false, rotulo = "Passos" }) {
|
|
3
|
+
const iAtual = passos.findIndex((p) => p.id === atual);
|
|
4
|
+
return /* @__PURE__ */ jsx("nav", { "aria-label": rotulo, className: "bg-white border border-slate-200 rounded-xl px-4 py-3 dark:bg-slate-900 dark:border-slate-700", children: /* @__PURE__ */ jsx("ol", { className: "flex flex-wrap items-center gap-2", children: passos.map((p, i) => {
|
|
5
|
+
const eAtual = i === iAtual;
|
|
6
|
+
const clicavel = !!onMudar && !eAtual && (livre || p.concluido);
|
|
7
|
+
const circulo = p.erro ? "bg-incumprido border-incumprido text-white" : eAtual ? "bg-proef-navy border-proef-navy text-white" : p.concluido ? "bg-proef-turquoise border-proef-turquoise text-proef-navy" : "bg-white border-slate-300 text-slate-500 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-400";
|
|
8
|
+
const conteudo = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
9
|
+
/* @__PURE__ */ jsx(
|
|
10
|
+
"span",
|
|
11
|
+
{
|
|
12
|
+
"aria-hidden": "true",
|
|
13
|
+
className: `inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full border-2 text-xs font-extrabold ${circulo}`,
|
|
14
|
+
children: p.erro ? "!" : p.concluido && !eAtual ? "✓" : i + 1
|
|
15
|
+
}
|
|
16
|
+
),
|
|
17
|
+
/* @__PURE__ */ jsxs("span", { className: `text-xs font-bold whitespace-nowrap ${eAtual ? "text-proef-navy dark:text-slate-100" : "text-slate-500"}`, children: [
|
|
18
|
+
p.rotulo,
|
|
19
|
+
p.erro && /* @__PURE__ */ jsx("span", { className: "sr-only", children: " (com erros)" }),
|
|
20
|
+
p.concluido && !p.erro && /* @__PURE__ */ jsx("span", { className: "sr-only", children: " (concluído)" })
|
|
21
|
+
] })
|
|
22
|
+
] });
|
|
23
|
+
return /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2 flex-1 min-w-fit", "aria-current": eAtual ? "step" : void 0, children: [
|
|
24
|
+
clicavel ? /* @__PURE__ */ jsx("button", { type: "button", onClick: () => onMudar(p.id), className: "flex items-center gap-2 rounded-md hover:underline", children: conteudo }) : /* @__PURE__ */ jsx("span", { className: "flex items-center gap-2", children: conteudo }),
|
|
25
|
+
i < passos.length - 1 && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: `h-0.5 flex-1 min-w-4 ${p.concluido ? "bg-proef-turquoise" : "bg-slate-200"}` })
|
|
26
|
+
] }, p.id);
|
|
27
|
+
}) }) });
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
Passos as default
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=Passos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Passos.js","sources":["../../../../../src/legacy/components/ui/Passos.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface Passo<T extends string> {\r\n id: T\r\n rotulo: ReactNode\r\n /** Passo já preenchido e válido (✓). */\r\n concluido?: boolean\r\n /** Passo com erros por corrigir. */\r\n erro?: boolean\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport interface PassosProps<T extends string> {\r\n passos: Passo<T>[]\r\n atual: T\r\n /** Sem isto, os passos são só indicação (não se clica). */\r\n onMudar?: (id: T) => void\r\n /**\r\n * Todos os passos clicáveis. Num registo já existente (editar/visualizar)\r\n * pode-se saltar para qualquer passo; num novo, só para os já concluídos.\r\n */\r\n livre?: boolean\r\n rotulo?: string\r\n}\r\n\r\n/**\r\n * Barra de passos para formulários longos (página própria, não pop-up).\r\n *\r\n * Mostra onde se está, o que já está feito e onde há erros — o que um\r\n * formulário de seis secções seguidas não diz.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport default function Passos<T extends string>({ passos, atual, onMudar, livre = false, rotulo = 'Passos' }: PassosProps<T>) {\r\n const iAtual = passos.findIndex((p) => p.id === atual)\r\n return (\r\n <nav aria-label={rotulo} className=\"bg-white border border-slate-200 rounded-xl px-4 py-3 dark:bg-slate-900 dark:border-slate-700\">\r\n <ol className=\"flex flex-wrap items-center gap-2\">\r\n {passos.map((p, i) => {\r\n const eAtual = i === iAtual\r\n const clicavel = !!onMudar && !eAtual && (livre || p.concluido)\r\n const circulo = p.erro\r\n ? 'bg-incumprido border-incumprido text-white'\r\n : eAtual\r\n ? 'bg-proef-navy border-proef-navy text-white'\r\n : p.concluido\r\n ? 'bg-proef-turquoise border-proef-turquoise text-proef-navy'\r\n : 'bg-white border-slate-300 text-slate-500 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-400'\r\n const conteudo = (\r\n <>\r\n <span\r\n aria-hidden=\"true\"\r\n className={`inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full border-2 text-xs font-extrabold ${circulo}`}\r\n >\r\n {p.erro ? '!' : p.concluido && !eAtual ? '✓' : i + 1}\r\n </span>\r\n <span className={`text-xs font-bold whitespace-nowrap ${eAtual ? 'text-proef-navy dark:text-slate-100' : 'text-slate-500'}`}>\r\n {p.rotulo}\r\n {p.erro && <span className=\"sr-only\"> (com erros)</span>}\r\n {p.concluido && !p.erro && <span className=\"sr-only\"> (concluído)</span>}\r\n </span>\r\n </>\r\n )\r\n return (\r\n <li key={p.id} className=\"flex items-center gap-2 flex-1 min-w-fit\" aria-current={eAtual ? 'step' : undefined}>\r\n {clicavel ? (\r\n <button type=\"button\" onClick={() => onMudar!(p.id)} className=\"flex items-center gap-2 rounded-md hover:underline\">\r\n {conteudo}\r\n </button>\r\n ) : (\r\n <span className=\"flex items-center gap-2\">{conteudo}</span>\r\n )}\r\n {i < passos.length - 1 && (\r\n <span aria-hidden=\"true\" className={`h-0.5 flex-1 min-w-4 ${p.concluido ? 'bg-proef-turquoise' : 'bg-slate-200'}`} />\r\n )}\r\n </li>\r\n )\r\n })}\r\n </ol>\r\n </nav>\r\n )\r\n}\r\n"],"names":[],"mappings":";AAiCA,SAAwB,OAAyB,EAAE,QAAQ,OAAO,SAAS,QAAQ,OAAO,SAAS,YAA4B;AAC7H,QAAM,SAAS,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK;AACrD,SACE,oBAAC,OAAA,EAAI,cAAY,QAAQ,WAAU,iGACjC,UAAA,oBAAC,MAAA,EAAG,WAAU,qCACX,UAAA,OAAO,IAAI,CAAC,GAAG,MAAM;AACpB,UAAM,SAAS,MAAM;AACrB,UAAM,WAAW,CAAC,CAAC,WAAW,CAAC,WAAW,SAAS,EAAE;AACrD,UAAM,UAAU,EAAE,OACd,+CACA,SACE,+CACA,EAAE,YACA,8DACA;AACR,UAAM,WACJ,qBAAA,UAAA,EACE,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAW,yGAAyG,OAAO;AAAA,UAE1H,UAAA,EAAE,OAAO,MAAM,EAAE,aAAa,CAAC,SAAS,MAAM,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,2BAEpD,QAAA,EAAK,WAAW,uCAAuC,SAAS,wCAAwC,gBAAgB,IACtH,UAAA;AAAA,QAAA,EAAE;AAAA,QACF,EAAE,QAAQ,oBAAC,QAAA,EAAK,WAAU,WAAU,UAAA,gBAAY;AAAA,QAChD,EAAE,aAAa,CAAC,EAAE,QAAQ,oBAAC,QAAA,EAAK,WAAU,WAAU,UAAA,eAAA,CAAY;AAAA,MAAA,EAAA,CACnE;AAAA,IAAA,GACF;AAEF,gCACG,MAAA,EAAc,WAAU,4CAA2C,gBAAc,SAAS,SAAS,QACjG,UAAA;AAAA,MAAA,+BACE,UAAA,EAAO,MAAK,UAAS,SAAS,MAAM,QAAS,EAAE,EAAE,GAAG,WAAU,sDAC5D,UAAA,UACH,wBAEC,QAAA,EAAK,WAAU,2BAA2B,UAAA,UAAS;AAAA,MAErD,IAAI,OAAO,SAAS,yBAClB,QAAA,EAAK,eAAY,QAAO,WAAW,wBAAwB,EAAE,YAAY,uBAAuB,cAAc,GAAA,CAAI;AAAA,IAAA,EAAA,GAT9G,EAAE,EAWX;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import Tabs from "../../../v1/primitives/navigation/Tabs/Tabs.js";
|
|
3
|
+
function Separadores({ itens, ativo, onMudar, rotulo }) {
|
|
4
|
+
return /* @__PURE__ */ jsx(
|
|
5
|
+
Tabs,
|
|
6
|
+
{
|
|
7
|
+
items: itens.map((it) => ({ id: it.id, label: it.rotulo, count: it.contagem ?? void 0, disabled: it.desativado })),
|
|
8
|
+
value: ativo,
|
|
9
|
+
onChange: onMudar,
|
|
10
|
+
label: rotulo
|
|
11
|
+
}
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
Separadores as default
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=Separadores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Separadores.js","sources":["../../../../../src/legacy/components/ui/Separadores.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\r\nimport Tabs from '../../../v1/primitives/navigation/Tabs/Tabs'\r\n\r\n/*\r\n * Migrado para o V1: os separadores são o `Tabs` do V1. Este ficheiro só\r\n * traduz a API antiga (em português) para a nova, para as apps que ainda a\r\n * usam continuarem a funcionar sem mudanças.\r\n */\r\n\r\n/** @deprecated Legacy — usar `TabItem` do V1. */\r\nexport interface Separador<T extends string> {\r\n id: T\r\n rotulo: ReactNode\r\n /** Número à frente do rótulo (ex: faturas por mapear). Omitir quando não interessa. */\r\n contagem?: number\r\n desativado?: boolean\r\n}\r\n\r\n/** @deprecated Legacy — usar `TabsProps` do V1. */\r\nexport interface SeparadoresProps<T extends string> {\r\n itens: Separador<T>[]\r\n ativo: T\r\n onMudar: (id: T) => void\r\n /** Rótulo acessível do conjunto (ex: \"Estado das faturas\"). */\r\n rotulo?: string\r\n}\r\n\r\n/** @deprecated Legacy — usar `Tabs` do V1. */\r\nexport default function Separadores<T extends string>({ itens, ativo, onMudar, rotulo }: SeparadoresProps<T>) {\r\n return (\r\n <Tabs<T>\r\n items={itens.map((it) => ({ id: it.id, label: it.rotulo, count: it.contagem ?? undefined, disabled: it.desativado }))}\r\n value={ativo}\r\n onChange={onMudar}\r\n label={rotulo}\r\n />\r\n )\r\n}\r\n"],"names":[],"mappings":";;AA4BA,SAAwB,YAA8B,EAAE,OAAO,OAAO,SAAS,UAA+B;AAC5G,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,OAAO,GAAG,QAAQ,OAAO,GAAG,YAAY,QAAW,UAAU,GAAG,aAAa;AAAA,MACpH,OAAO;AAAA,MACP,UAAU;AAAA,MACV,OAAO;AAAA,IAAA;AAAA,EAAA;AAGb;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useRef, useImperativeHandle, useLayoutEffect } from "react";
|
|
3
|
+
const TextoAuto = forwardRef(function TextoAuto2({ minLinhas = 1, maxLinhas = 15, value, style, className = "", ...resto }, refExterna) {
|
|
4
|
+
const ref = useRef(null);
|
|
5
|
+
useImperativeHandle(refExterna, () => ref.current);
|
|
6
|
+
useLayoutEffect(() => {
|
|
7
|
+
const el = ref.current;
|
|
8
|
+
if (!el) return;
|
|
9
|
+
const cs = getComputedStyle(el);
|
|
10
|
+
el.style.height = "auto";
|
|
11
|
+
const linha = parseFloat(cs.lineHeight) || 20;
|
|
12
|
+
const bordas = el.offsetHeight - el.clientHeight;
|
|
13
|
+
const max = linha * maxLinhas + parseFloat(cs.paddingTop || "0") + parseFloat(cs.paddingBottom || "0") + bordas;
|
|
14
|
+
const pedido = el.scrollHeight + bordas;
|
|
15
|
+
el.style.height = `${Math.min(pedido, max)}px`;
|
|
16
|
+
el.style.overflowY = pedido > max ? "auto" : "hidden";
|
|
17
|
+
}, [value, maxLinhas]);
|
|
18
|
+
return /* @__PURE__ */ jsx(
|
|
19
|
+
"textarea",
|
|
20
|
+
{
|
|
21
|
+
ref,
|
|
22
|
+
rows: minLinhas,
|
|
23
|
+
value,
|
|
24
|
+
style: { resize: "none", ...style },
|
|
25
|
+
className: `w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 focus:border-proef-blue focus:outline-none focus:ring-1 focus:ring-proef-blue ${className}`,
|
|
26
|
+
...resto
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
export {
|
|
31
|
+
TextoAuto as default
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=TextoAuto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextoAuto.js","sources":["../../../../../src/legacy/components/ui/TextoAuto.tsx"],"sourcesContent":["import React, { forwardRef, useImperativeHandle, useLayoutEffect, useRef, type TextareaHTMLAttributes } from 'react'\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport type TextoAutoProps = Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'rows'> & {\r\n /** Altura mínima, em linhas. */\r\n minLinhas?: number\r\n /** A partir daqui deixa de crescer e passa a ter scroll. */\r\n maxLinhas?: number\r\n}\r\n\r\n/**\r\n * Caixa de texto que cresce com o conteúdo até `maxLinhas`; a partir daí tem\r\n * scroll. Enter muda de linha (não submete).\r\n *\r\n * Vinda do Auditorias IT (comentários e descrições), onde uma textarea fixa ou\r\n * cortava o texto ou ocupava meio ecrã vazia.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nconst TextoAuto = forwardRef<HTMLTextAreaElement, TextoAutoProps>(function TextoAuto(\r\n { minLinhas = 1, maxLinhas = 15, value, style, className = '', ...resto },\r\n refExterna\r\n) {\r\n const ref = useRef<HTMLTextAreaElement>(null)\r\n useImperativeHandle(refExterna, () => ref.current as HTMLTextAreaElement)\r\n\r\n useLayoutEffect(() => {\r\n const el = ref.current\r\n if (!el) return\r\n const cs = getComputedStyle(el)\r\n el.style.height = 'auto'\r\n const linha = parseFloat(cs.lineHeight) || 20\r\n const bordas = el.offsetHeight - el.clientHeight\r\n const max = linha * maxLinhas + parseFloat(cs.paddingTop || '0') + parseFloat(cs.paddingBottom || '0') + bordas\r\n const pedido = el.scrollHeight + bordas\r\n el.style.height = `${Math.min(pedido, max)}px`\r\n el.style.overflowY = pedido > max ? 'auto' : 'hidden'\r\n }, [value, maxLinhas])\r\n\r\n return (\r\n <textarea\r\n ref={ref}\r\n rows={minLinhas}\r\n value={value}\r\n style={{ resize: 'none', ...style }}\r\n className={`w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 focus:border-proef-blue focus:outline-none focus:ring-1 focus:ring-proef-blue ${className}`}\r\n {...resto}\r\n />\r\n )\r\n})\r\n\r\nexport default TextoAuto\r\n"],"names":["TextoAuto"],"mappings":";;AAkBA,MAAM,YAAY,WAAgD,SAASA,WACzE,EAAE,YAAY,GAAG,YAAY,IAAI,OAAO,OAAO,YAAY,IAAI,GAAG,MAAA,GAClE,YACA;AACA,QAAM,MAAM,OAA4B,IAAI;AAC5C,sBAAoB,YAAY,MAAM,IAAI,OAA8B;AAExE,kBAAgB,MAAM;AACpB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,UAAM,KAAK,iBAAiB,EAAE;AAC9B,OAAG,MAAM,SAAS;AAClB,UAAM,QAAQ,WAAW,GAAG,UAAU,KAAK;AAC3C,UAAM,SAAS,GAAG,eAAe,GAAG;AACpC,UAAM,MAAM,QAAQ,YAAY,WAAW,GAAG,cAAc,GAAG,IAAI,WAAW,GAAG,iBAAiB,GAAG,IAAI;AACzG,UAAM,SAAS,GAAG,eAAe;AACjC,OAAG,MAAM,SAAS,GAAG,KAAK,IAAI,QAAQ,GAAG,CAAC;AAC1C,OAAG,MAAM,YAAY,SAAS,MAAM,SAAS;AAAA,EAC/C,GAAG,CAAC,OAAO,SAAS,CAAC;AAErB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,OAAO,EAAE,QAAQ,QAAQ,GAAG,MAAA;AAAA,MAC5B,WAAW,kNAAkN,SAAS;AAAA,MACrO,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import Escolha from "./Escolha.js";
|
|
3
|
+
import SegmentedControl from "../../../v1/primitives/buttons/SegmentedControl/SegmentedControl.js";
|
|
4
|
+
import Button from "../../../v1/primitives/buttons/Button/Button.js";
|
|
5
|
+
import { Badge } from "../../../v1/primitives/display/Badge/Badge.js";
|
|
6
|
+
function IconX({ className = "" }) {
|
|
7
|
+
return /* @__PURE__ */ jsxs(
|
|
8
|
+
"svg",
|
|
9
|
+
{
|
|
10
|
+
viewBox: "0 0 24 24",
|
|
11
|
+
fill: "none",
|
|
12
|
+
stroke: "currentColor",
|
|
13
|
+
strokeWidth: 2,
|
|
14
|
+
strokeLinecap: "round",
|
|
15
|
+
strokeLinejoin: "round",
|
|
16
|
+
className,
|
|
17
|
+
"aria-hidden": "true",
|
|
18
|
+
children: [
|
|
19
|
+
/* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
|
|
20
|
+
/* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
function SectionGroup({
|
|
26
|
+
title,
|
|
27
|
+
tone = "accent",
|
|
28
|
+
children
|
|
29
|
+
}) {
|
|
30
|
+
const tones = {
|
|
31
|
+
accent: ["border-slate-200 dark:border-slate-700", "text-proef-navy dark:text-slate-100"],
|
|
32
|
+
ok: ["border-ok", "text-ok"],
|
|
33
|
+
blue: ["border-[#4FA8FF]", "text-[#2E8CE0]"],
|
|
34
|
+
red: ["border-incumprido", "text-incumprido"],
|
|
35
|
+
purple: ["border-[#8B5CF6]", "text-[#7C3AED]"],
|
|
36
|
+
yellow: ["border-[#D9A400]", "text-[#B78400]"]
|
|
37
|
+
};
|
|
38
|
+
const [borda, texto] = tones[tone];
|
|
39
|
+
return /* @__PURE__ */ jsxs("div", { className: `border-[1.5px] ${borda} rounded-2xl p-4 pb-1 mb-5 bg-[rgba(24,34,56,0.015)] dark:bg-slate-900/40`, children: [
|
|
40
|
+
/* @__PURE__ */ jsx("div", { className: `text-[15px] font-bold text-center tracking-wide mb-3.5 ${texto}`, children: title }),
|
|
41
|
+
children
|
|
42
|
+
] });
|
|
43
|
+
}
|
|
44
|
+
function BadgeSla({ status, labels }) {
|
|
45
|
+
const tone = status === "ok" ? "ok" : status === "risco" ? "risco" : "incumprido";
|
|
46
|
+
const defaults = { ok: "On time", risco: "At risk", incumprido: "Breached" };
|
|
47
|
+
const label = labels?.[status] ?? defaults[status];
|
|
48
|
+
return /* @__PURE__ */ jsx(Badge, { tone, children: label });
|
|
49
|
+
}
|
|
50
|
+
const CORES_ESTADO_INTERNO = {
|
|
51
|
+
"Concluído": ["#1F8A55", "#E5F6EC"],
|
|
52
|
+
"Aferição": ["#2E6DA4", "#E5F0FA"],
|
|
53
|
+
"Para Tratamento": ["#1868B0", "#E5F0FA"],
|
|
54
|
+
"Aguarda Validação LS": ["#2E6DA4", "#E5F0FA"],
|
|
55
|
+
"Aguarda Produção LS": ["#6E8CAD", "#EDF2F7"],
|
|
56
|
+
"Incompleto/Devolvido": ["#C2255C", "#FBE5EF"],
|
|
57
|
+
"Falta de Documentação": ["#B96E00", "#FCF0DC"],
|
|
58
|
+
Ignorar: ["#767C88", "#EEF0F2"],
|
|
59
|
+
Cancelado: ["#767C88", "#EEF0F2"]
|
|
60
|
+
};
|
|
61
|
+
function ChipEstadoInterno({ estado }) {
|
|
62
|
+
if (!estado) return /* @__PURE__ */ jsx("span", { className: "text-slate-400", children: "—" });
|
|
63
|
+
const cor = CORES_ESTADO_INTERNO[estado];
|
|
64
|
+
if (!cor) return /* @__PURE__ */ jsx("span", { children: estado });
|
|
65
|
+
return /* @__PURE__ */ jsx("span", { className: "px-2 py-0.5 rounded text-[11px] font-medium inline-block", style: { color: cor[0], background: cor[1] }, children: estado });
|
|
66
|
+
}
|
|
67
|
+
const VARIANTE_V1 = { default: "secondary", accent: "primary", danger: "danger", ghost: "ghost" };
|
|
68
|
+
function Btn({
|
|
69
|
+
children,
|
|
70
|
+
onClick,
|
|
71
|
+
variant = "default",
|
|
72
|
+
active = false,
|
|
73
|
+
disabled = false,
|
|
74
|
+
title,
|
|
75
|
+
type = "button"
|
|
76
|
+
}) {
|
|
77
|
+
return /* @__PURE__ */ jsx(
|
|
78
|
+
Button,
|
|
79
|
+
{
|
|
80
|
+
type,
|
|
81
|
+
onClick,
|
|
82
|
+
disabled,
|
|
83
|
+
title,
|
|
84
|
+
variant: VARIANTE_V1[variant],
|
|
85
|
+
active: variant === "default" && active ? true : void 0,
|
|
86
|
+
children
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
function BtnGroup({
|
|
91
|
+
value,
|
|
92
|
+
options,
|
|
93
|
+
onChange,
|
|
94
|
+
label
|
|
95
|
+
}) {
|
|
96
|
+
return /* @__PURE__ */ jsx(SegmentedControl, { value, options, onChange, label });
|
|
97
|
+
}
|
|
98
|
+
function Estado({
|
|
99
|
+
carregando,
|
|
100
|
+
erro,
|
|
101
|
+
vazio,
|
|
102
|
+
labels
|
|
103
|
+
}) {
|
|
104
|
+
if (carregando) return /* @__PURE__ */ jsx("div", { className: "py-10 text-center text-sm text-slate-400", children: labels?.loading ?? "Loading…" });
|
|
105
|
+
if (erro) return /* @__PURE__ */ jsx("div", { className: "py-10 text-center text-sm text-incumprido", children: labels?.error ?? "Failed to load" });
|
|
106
|
+
if (vazio) return /* @__PURE__ */ jsx("div", { className: "py-10 text-center text-sm text-slate-400", children: labels?.empty ?? "No data" });
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
function Modal({ open, onClose, title, children, wide }) {
|
|
110
|
+
if (!open) return null;
|
|
111
|
+
return /* @__PURE__ */ jsx(
|
|
112
|
+
"div",
|
|
113
|
+
{
|
|
114
|
+
onClick: (e) => {
|
|
115
|
+
if (e.target === e.currentTarget) onClose();
|
|
116
|
+
},
|
|
117
|
+
className: "fixed inset-0 bg-[rgba(20,30,50,0.45)] z-50 flex items-center justify-center p-4",
|
|
118
|
+
children: /* @__PURE__ */ jsxs("div", { className: `bg-white dark:bg-slate-900 rounded-xl w-full ${wide ? "max-w-[min(1600px,95vw)]" : "max-w-[720px]"} max-h-[85vh] flex flex-col shadow-2xl`, children: [
|
|
119
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4 px-5 py-4 border-b border-slate-200 dark:border-slate-700", children: [
|
|
120
|
+
/* @__PURE__ */ jsx("div", { className: "text-[15px] font-bold text-proef-navy dark:text-slate-100", children: title }),
|
|
121
|
+
/* @__PURE__ */ jsx("button", { onClick: onClose, "aria-label": "Close", className: "text-slate-500 hover:text-slate-800 dark:text-slate-400 dark:hover:text-slate-100", children: /* @__PURE__ */ jsx(IconX, { className: "w-5 h-5" }) })
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsx("div", { className: "overflow-auto thin-scroll px-5 py-4", children })
|
|
124
|
+
] })
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
function Campo({ label, children, className = "" }) {
|
|
129
|
+
return /* @__PURE__ */ jsxs("label", { className: `flex flex-col gap-1 ${className}`, children: [
|
|
130
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] font-black uppercase tracking-wider text-slate-400 leading-normal", children: label }),
|
|
131
|
+
children
|
|
132
|
+
] });
|
|
133
|
+
}
|
|
134
|
+
function CampoSelect({
|
|
135
|
+
label,
|
|
136
|
+
value,
|
|
137
|
+
options,
|
|
138
|
+
onChange,
|
|
139
|
+
placeholderVazio,
|
|
140
|
+
disabled = false,
|
|
141
|
+
className = ""
|
|
142
|
+
}) {
|
|
143
|
+
const normalizadas = options.map((o) => typeof o === "string" ? { value: o, label: o } : o);
|
|
144
|
+
return /* @__PURE__ */ jsx(Campo, { label, className, children: /* @__PURE__ */ jsx(
|
|
145
|
+
Escolha,
|
|
146
|
+
{
|
|
147
|
+
valor: value,
|
|
148
|
+
opcoes: normalizadas.map((o) => ({ valor: o.value, rotulo: o.label })),
|
|
149
|
+
onMudar: onChange,
|
|
150
|
+
rotulo: label,
|
|
151
|
+
opcaoVazia: placeholderVazio,
|
|
152
|
+
placeholder: placeholderVazio,
|
|
153
|
+
disabled,
|
|
154
|
+
className: "min-w-[10rem] max-w-56"
|
|
155
|
+
}
|
|
156
|
+
) });
|
|
157
|
+
}
|
|
158
|
+
function CampoPesquisa({
|
|
159
|
+
label,
|
|
160
|
+
valorInicial = "",
|
|
161
|
+
onConfirmar,
|
|
162
|
+
placeholder,
|
|
163
|
+
className = ""
|
|
164
|
+
}) {
|
|
165
|
+
const confirmar = (v) => onConfirmar(v.trim() || void 0);
|
|
166
|
+
return /* @__PURE__ */ jsx(Campo, { label, className, children: /* @__PURE__ */ jsx(
|
|
167
|
+
"input",
|
|
168
|
+
{
|
|
169
|
+
type: "search",
|
|
170
|
+
defaultValue: valorInicial,
|
|
171
|
+
placeholder,
|
|
172
|
+
onKeyDown: (e) => {
|
|
173
|
+
if (e.key === "Enter") confirmar(e.target.value);
|
|
174
|
+
},
|
|
175
|
+
onBlur: (e) => confirmar(e.target.value),
|
|
176
|
+
className: "h-8 border border-slate-300 rounded-lg px-2.5 text-sm w-64 bg-white dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:placeholder:text-slate-500"
|
|
177
|
+
}
|
|
178
|
+
) });
|
|
179
|
+
}
|
|
180
|
+
function CampoInterruptor({
|
|
181
|
+
label,
|
|
182
|
+
checked,
|
|
183
|
+
onChange
|
|
184
|
+
}) {
|
|
185
|
+
return /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm pb-1.5 cursor-pointer select-none", children: [
|
|
186
|
+
/* @__PURE__ */ jsx("input", { type: "checkbox", checked, onChange: (e) => onChange(e.target.checked) }),
|
|
187
|
+
label
|
|
188
|
+
] });
|
|
189
|
+
}
|
|
190
|
+
function BarraFiltros({ children }) {
|
|
191
|
+
return /* @__PURE__ */ jsx("div", { className: "bg-white border border-slate-200 dark:bg-slate-900 dark:border-slate-700 rounded-xl px-4 py-3 flex flex-wrap items-end gap-3", children });
|
|
192
|
+
}
|
|
193
|
+
function LinhaAlerta({
|
|
194
|
+
severidade,
|
|
195
|
+
icone,
|
|
196
|
+
titulo,
|
|
197
|
+
detalhe,
|
|
198
|
+
referencia,
|
|
199
|
+
onReferenciaClick,
|
|
200
|
+
quando
|
|
201
|
+
}) {
|
|
202
|
+
const barras = {
|
|
203
|
+
critico: "border-l-incumprido",
|
|
204
|
+
grave: "border-l-orange-500",
|
|
205
|
+
atencao: "border-l-risco",
|
|
206
|
+
info: "border-l-sky-400"
|
|
207
|
+
};
|
|
208
|
+
const textos = {
|
|
209
|
+
critico: "text-incumprido",
|
|
210
|
+
grave: "text-orange-600 dark:text-orange-400",
|
|
211
|
+
atencao: "text-risco",
|
|
212
|
+
info: "text-sky-600 dark:text-sky-400"
|
|
213
|
+
};
|
|
214
|
+
return /* @__PURE__ */ jsxs("div", { className: `bg-white border border-slate-200 dark:bg-slate-900 dark:border-y-slate-700 dark:border-r-slate-700 border-l-4 ${barras[severidade]} rounded-lg px-4 py-2.5 flex items-start gap-3`, children: [
|
|
215
|
+
icone && /* @__PURE__ */ jsx("span", { className: `${textos[severidade]} shrink-0 mt-0.5`, children: icone }),
|
|
216
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
217
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-slate-800 dark:text-slate-100", children: titulo }),
|
|
218
|
+
detalhe && /* @__PURE__ */ jsx("div", { className: "text-xs text-slate-500 dark:text-slate-400", children: detalhe })
|
|
219
|
+
] }),
|
|
220
|
+
referencia && /* @__PURE__ */ jsx(
|
|
221
|
+
"button",
|
|
222
|
+
{
|
|
223
|
+
type: "button",
|
|
224
|
+
onClick: onReferenciaClick,
|
|
225
|
+
className: "text-xs font-mono text-proef-navy dark:text-sky-300 hover:underline shrink-0",
|
|
226
|
+
children: referencia
|
|
227
|
+
}
|
|
228
|
+
),
|
|
229
|
+
quando && /* @__PURE__ */ jsx("span", { className: "text-xs text-slate-400 shrink-0 tabular-nums", children: quando })
|
|
230
|
+
] });
|
|
231
|
+
}
|
|
232
|
+
function ListaCampos({
|
|
233
|
+
campos,
|
|
234
|
+
colunas = 2,
|
|
235
|
+
mostrarVazios = false
|
|
236
|
+
}) {
|
|
237
|
+
const vazio = (v) => v == null || v === "" || v === "—";
|
|
238
|
+
const visiveis = mostrarVazios ? campos : campos.filter((c) => !vazio(c.valor));
|
|
239
|
+
if (!visiveis.length) return null;
|
|
240
|
+
const grelha = { 1: "", 2: "md:grid-cols-2", 3: "md:grid-cols-3" }[colunas];
|
|
241
|
+
return /* @__PURE__ */ jsx("dl", { className: `grid ${grelha} gap-x-6 gap-y-1`, children: visiveis.map((c) => /* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-3 border-b border-slate-100 dark:border-slate-800 py-1", children: [
|
|
242
|
+
/* @__PURE__ */ jsx("dt", { className: "text-xs text-slate-500 dark:text-slate-400", children: c.label }),
|
|
243
|
+
/* @__PURE__ */ jsx("dd", { className: "text-xs font-medium text-slate-800 dark:text-slate-100 text-right", children: c.valor })
|
|
244
|
+
] }, c.label)) });
|
|
245
|
+
}
|
|
246
|
+
export {
|
|
247
|
+
Badge,
|
|
248
|
+
BadgeSla,
|
|
249
|
+
BarraFiltros,
|
|
250
|
+
Btn,
|
|
251
|
+
BtnGroup,
|
|
252
|
+
Campo,
|
|
253
|
+
CampoInterruptor,
|
|
254
|
+
CampoPesquisa,
|
|
255
|
+
CampoSelect,
|
|
256
|
+
ChipEstadoInterno,
|
|
257
|
+
Estado,
|
|
258
|
+
LinhaAlerta,
|
|
259
|
+
ListaCampos,
|
|
260
|
+
Modal,
|
|
261
|
+
SectionGroup
|
|
262
|
+
};
|
|
263
|
+
//# sourceMappingURL=Ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ui.js","sources":["../../../../../src/legacy/components/ui/Ui.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\r\nimport Escolha from './Escolha'\r\nimport SegmentedControl from '../../../v1/primitives/buttons/SegmentedControl/SegmentedControl'\r\nimport Button from '../../../v1/primitives/buttons/Button/Button'\r\n\r\n/** Visual UI primitives (proef design system). Prefer these over repeating classes. */\r\n\r\n/**\r\n * SLA status accepted by BadgeSla.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport type StatusSla = 'ok' | 'risco' | 'incumprido'\r\n\r\nfunction IconX({ className = '' }: { className?: string }) {\r\n return (\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={className}\r\n aria-hidden=\"true\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n )\r\n}\r\n\r\n// Migrado para o V1: o Card é o do V1 (aceita o nome antigo `extra`). Reexportado daqui para o código legacy.\r\nimport { Card } from '../../../v1/primitives/display/Card/Card'\r\nexport { Card }\r\n\r\n/**\r\n * Colour-bordered group — the overview sections in the prototype.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function SectionGroup({\r\n title,\r\n tone = 'accent',\r\n children,\r\n}: {\r\n title: string\r\n tone?: 'accent' | 'ok' | 'blue' | 'red' | 'purple' | 'yellow'\r\n children: ReactNode\r\n}) {\r\n const tones: Record<string, [string, string]> = {\r\n accent: ['border-slate-200 dark:border-slate-700', 'text-proef-navy dark:text-slate-100'],\r\n ok: ['border-ok', 'text-ok'],\r\n blue: ['border-[#4FA8FF]', 'text-[#2E8CE0]'],\r\n red: ['border-incumprido', 'text-incumprido'],\r\n purple: ['border-[#8B5CF6]', 'text-[#7C3AED]'],\r\n yellow: ['border-[#D9A400]', 'text-[#B78400]'],\r\n }\r\n const [borda, texto] = tones[tone]!\r\n return (\r\n <div className={`border-[1.5px] ${borda} rounded-2xl p-4 pb-1 mb-5 bg-[rgba(24,34,56,0.015)] dark:bg-slate-900/40`}>\r\n <div className={`text-[15px] font-bold text-center tracking-wide mb-3.5 ${texto}`}>{title}</div>\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\n// Migrado para o V1: o Kpi é o do V1 (aceita os nomes antigos `delta`, `bgTint`, `barra`, `rodape`, `denso`;\r\n// `hint` passou de `title` para a camada `data-tip`). Reexportado daqui para o código legacy que o importa.\r\nimport { Kpi, type KpiTone } from '../../../v1/primitives/display/Kpi/Kpi'\r\nexport { Kpi, type KpiTone }\r\n\r\n// Migrado para o V1: o Badge é o do V1 (mesmo nome e API; ganhou `dot` e `icon`). Reexportado daqui para\r\n// o código legacy que o importa deste ficheiro.\r\nimport { Badge, type BadgeTone } from '../../../v1/primitives/display/Badge/Badge'\r\nexport { Badge, type BadgeTone }\r\n\r\n/**\r\n * SLA badge — picks the tone and label from `status`. Labels overridable via `labels`.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function BadgeSla({ status, labels }: { status: StatusSla; labels?: { ok?: string; risco?: string; incumprido?: string } }) {\r\n const tone: BadgeTone = status === 'ok' ? 'ok' : status === 'risco' ? 'risco' : 'incumprido'\r\n const defaults: Record<StatusSla, string> = { ok: 'On time', risco: 'At risk', incumprido: 'Breached' }\r\n const label = labels?.[status] ?? defaults[status]\r\n return <Badge tone={tone}>{label}</Badge>\r\n}\r\n\r\n/** Internal-state chip — prototype colours (ESTADO_INTERNO_COLORS). */\r\nconst CORES_ESTADO_INTERNO: Record<string, [string, string]> = {\r\n 'Concluído': ['#1F8A55', '#E5F6EC'],\r\n 'Aferição': ['#2E6DA4', '#E5F0FA'],\r\n 'Para Tratamento': ['#1868B0', '#E5F0FA'],\r\n 'Aguarda Validação LS': ['#2E6DA4', '#E5F0FA'],\r\n 'Aguarda Produção LS': ['#6E8CAD', '#EDF2F7'],\r\n 'Incompleto/Devolvido': ['#C2255C', '#FBE5EF'],\r\n 'Falta de Documentação': ['#B96E00', '#FCF0DC'],\r\n Ignorar: ['#767C88', '#EEF0F2'],\r\n Cancelado: ['#767C88', '#EEF0F2'],\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport function ChipEstadoInterno({ estado }: { estado: string | null }) {\r\n if (!estado) return <span className=\"text-slate-400\">—</span>\r\n const cor = CORES_ESTADO_INTERNO[estado]\r\n if (!cor) return <span>{estado}</span>\r\n return (\r\n <span className=\"px-2 py-0.5 rounded text-[11px] font-medium inline-block\" style={{ color: cor[0], background: cor[1] }}>\r\n {estado}\r\n </span>\r\n )\r\n}\r\n\r\nconst VARIANTE_V1 = { default: 'secondary', accent: 'primary', danger: 'danger', ghost: 'ghost' } as const\r\n\r\n/**\r\n * Migrado para o V1: é o `Button` do V1 (mesmo aspeto); isto só mantém a API antiga.\r\n * @deprecated Legacy — usar `Button` do V1.\r\n */\r\nexport function Btn({\r\n children,\r\n onClick,\r\n variant = 'default',\r\n active = false,\r\n disabled = false,\r\n title,\r\n type = 'button',\r\n}: {\r\n children: ReactNode\r\n onClick?: () => void\r\n variant?: 'default' | 'accent' | 'danger' | 'ghost'\r\n active?: boolean\r\n disabled?: boolean\r\n title?: string\r\n type?: 'button' | 'submit'\r\n}) {\r\n return (\r\n <Button\r\n type={type}\r\n onClick={onClick}\r\n disabled={disabled}\r\n title={title}\r\n variant={VARIANTE_V1[variant]}\r\n // Só o `default` tinha estado ligado; nos outros o `active` não fazia nada.\r\n active={variant === 'default' && active ? true : undefined}\r\n >\r\n {children}\r\n </Button>\r\n )\r\n}\r\n\r\n/**\r\n * Mutually exclusive button group (granularity, dimension…).\r\n * Migrado para o V1: é o `SegmentedControl` do V1; isto só mantém a API antiga.\r\n * @deprecated Legacy — usar `SegmentedControl` do V1.\r\n */\r\nexport function BtnGroup<T extends string>({\r\n value,\r\n options,\r\n onChange,\r\n label,\r\n}: {\r\n value: T\r\n options: { value: T; label: string }[]\r\n onChange: (v: T) => void\r\n /** Rótulo opcional à esquerda (ex: \"Situação\"), com espaçamento próprio. */\r\n label?: string\r\n}) {\r\n return <SegmentedControl<T> value={value} options={options} onChange={onChange} label={label} />\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport function Estado({\r\n carregando,\r\n erro,\r\n vazio,\r\n labels,\r\n}: {\r\n carregando?: boolean\r\n erro?: boolean\r\n vazio?: boolean\r\n labels?: { loading?: string; error?: string; empty?: string }\r\n}) {\r\n if (carregando) return <div className=\"py-10 text-center text-sm text-slate-400\">{labels?.loading ?? 'Loading…'}</div>\r\n if (erro) return <div className=\"py-10 text-center text-sm text-incumprido\">{labels?.error ?? 'Failed to load'}</div>\r\n if (vazio) return <div className=\"py-10 text-center text-sm text-slate-400\">{labels?.empty ?? 'No data'}</div>\r\n return null\r\n}\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport function Modal({ open, onClose, title, children, wide }: { open: boolean; onClose: () => void; title: ReactNode; children: ReactNode; wide?: boolean }) {\r\n if (!open) return null\r\n return (\r\n <div\r\n onClick={(e) => {\r\n if (e.target === e.currentTarget) onClose()\r\n }}\r\n className=\"fixed inset-0 bg-[rgba(20,30,50,0.45)] z-50 flex items-center justify-center p-4\"\r\n >\r\n {/*\r\n `wide` acompanha o ecrã em vez de parar num número fixo.\r\n\r\n 1200px era estreito num ecrã grande: um modal com mapa e tabela lado a\r\n lado ficava com a tabela cortada e o mapa pequeno, enquanto meio ecrã\r\n ficava vazio. O tecto de 1600px existe para o texto não ficar a\r\n atravessar o monitor todo, e os 95vw para o modal nunca encostar às\r\n margens.\r\n */}\r\n <div className={`bg-white dark:bg-slate-900 rounded-xl w-full ${wide ? 'max-w-[min(1600px,95vw)]' : 'max-w-[720px]'} max-h-[85vh] flex flex-col shadow-2xl`}>\r\n <div className=\"flex items-center justify-between gap-4 px-5 py-4 border-b border-slate-200 dark:border-slate-700\">\r\n <div className=\"text-[15px] font-bold text-proef-navy dark:text-slate-100\">{title}</div>\r\n <button onClick={onClose} aria-label=\"Close\" className=\"text-slate-500 hover:text-slate-800 dark:text-slate-400 dark:hover:text-slate-100\">\r\n <IconX className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n <div className=\"overflow-auto thin-scroll px-5 py-4\">{children}</div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ─── Filtros ────────────────────────────────────────────────────────────────\r\n// O kit não tinha campos de formulário, e cada ecrã acabava a repetir o mesmo\r\n// <label> com <select> e as mesmas classes. Estes três resolvem a barra de\r\n// filtros que praticamente todos os ecrãs de listagem têm.\r\n\r\n/**\r\n * Rótulo pequeno em maiúsculas por cima do campo.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function Campo({ label, children, className = '' }: { label: string; children: ReactNode; className?: string }) {\r\n return (\r\n <label className={`flex flex-col gap-1 ${className}`}>\r\n <span className=\"text-[10px] font-black uppercase tracking-wider text-slate-400 leading-normal\">{label}</span>\r\n {children}\r\n </label>\r\n )\r\n}\r\n\r\n/**\r\n * Select com opção vazia à cabeça.\r\n *\r\n * A opção vazia é obrigatória e não opcional: sem ela não há como desfazer uma\r\n * escolha, e o utilizador fica preso ao primeiro valor que carregou.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function CampoSelect({\r\n label,\r\n value,\r\n options,\r\n onChange,\r\n placeholderVazio,\r\n disabled = false,\r\n className = '',\r\n}: {\r\n label: string\r\n value: string\r\n options: readonly string[] | readonly { value: string; label: string }[]\r\n onChange: (v: string) => void\r\n placeholderVazio: string\r\n disabled?: boolean\r\n className?: string\r\n}) {\r\n const normalizadas = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o))\r\n return (\r\n <Campo label={label} className={className}>\r\n {/* Mesma lista suspensa em todos os portais (Escolha), em vez do <select> nativo. */}\r\n <Escolha\r\n valor={value}\r\n opcoes={normalizadas.map((o) => ({ valor: o.value, rotulo: o.label }))}\r\n onMudar={onChange}\r\n rotulo={label}\r\n opcaoVazia={placeholderVazio}\r\n placeholder={placeholderVazio}\r\n disabled={disabled}\r\n className=\"min-w-[10rem] max-w-56\"\r\n />\r\n </Campo>\r\n )\r\n}\r\n\r\n/**\r\n * Campo de pesquisa que só dispara ao confirmar.\r\n *\r\n * Deliberadamente NÃO pesquisa a cada tecla: sobre dezenas de milhares de\r\n * registos isso seria um pedido por letra. Confirma-se com Enter ou ao sair do\r\n * campo.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function CampoPesquisa({\r\n label,\r\n valorInicial = '',\r\n onConfirmar,\r\n placeholder,\r\n className = '',\r\n}: {\r\n label: string\r\n valorInicial?: string\r\n onConfirmar: (v: string | undefined) => void\r\n placeholder?: string\r\n className?: string\r\n}) {\r\n const confirmar = (v: string): void => onConfirmar(v.trim() || undefined)\r\n return (\r\n <Campo label={label} className={className}>\r\n <input\r\n type=\"search\"\r\n defaultValue={valorInicial}\r\n placeholder={placeholder}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') confirmar((e.target as HTMLInputElement).value)\r\n }}\r\n onBlur={(e) => confirmar(e.target.value)}\r\n className=\"h-8 border border-slate-300 rounded-lg px-2.5 text-sm w-64 bg-white dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:placeholder:text-slate-500\"\r\n />\r\n </Campo>\r\n )\r\n}\r\n\r\n/**\r\n * Caixa de interruptor com rótulo à direita, alinhada com os campos ao lado.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function CampoInterruptor({\r\n label,\r\n checked,\r\n onChange,\r\n}: {\r\n label: string\r\n checked: boolean\r\n onChange: (v: boolean) => void\r\n}) {\r\n return (\r\n <label className=\"flex items-center gap-2 text-sm pb-1.5 cursor-pointer select-none\">\r\n <input type=\"checkbox\" checked={checked} onChange={(e) => onChange(e.target.checked)} />\r\n {label}\r\n </label>\r\n )\r\n}\r\n\r\n/**\r\n * Barra onde os campos de filtro assentam.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function BarraFiltros({ children }: { children: ReactNode }) {\r\n return (\r\n <div className=\"bg-white border border-slate-200 dark:bg-slate-900 dark:border-slate-700 rounded-xl px-4 py-3 flex flex-wrap items-end gap-3\">\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\n// ─── Listas ─────────────────────────────────────────────────────────────────\r\n\r\n/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */\r\nexport type SeveridadeAlerta = 'critico' | 'grave' | 'atencao' | 'info'\r\n\r\n/**\r\n * Linha de uma lista de alertas.\r\n *\r\n * A severidade está na barra lateral colorida e não no fundo: uma lista de\r\n * cinquenta linhas com fundos saturados é ilegível, e o que se quer é poder\r\n * varrer a coluna da esquerda e saber onde parar.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function LinhaAlerta({\r\n severidade,\r\n icone,\r\n titulo,\r\n detalhe,\r\n referencia,\r\n onReferenciaClick,\r\n quando,\r\n}: {\r\n severidade: SeveridadeAlerta\r\n icone?: ReactNode\r\n titulo: ReactNode\r\n detalhe?: ReactNode\r\n /** Identificador clicável à direita (ex: número da ordem). */\r\n referencia?: string\r\n onReferenciaClick?: () => void\r\n quando?: ReactNode\r\n}) {\r\n const barras: Record<SeveridadeAlerta, string> = {\r\n critico: 'border-l-incumprido',\r\n grave: 'border-l-orange-500',\r\n atencao: 'border-l-risco',\r\n info: 'border-l-sky-400',\r\n }\r\n const textos: Record<SeveridadeAlerta, string> = {\r\n critico: 'text-incumprido',\r\n grave: 'text-orange-600 dark:text-orange-400',\r\n atencao: 'text-risco',\r\n info: 'text-sky-600 dark:text-sky-400',\r\n }\r\n\r\n return (\r\n <div className={`bg-white border border-slate-200 dark:bg-slate-900 dark:border-y-slate-700 dark:border-r-slate-700 border-l-4 ${barras[severidade]} rounded-lg px-4 py-2.5 flex items-start gap-3`}>\r\n {icone && <span className={`${textos[severidade]} shrink-0 mt-0.5`}>{icone}</span>}\r\n <div className=\"min-w-0 flex-1\">\r\n <div className=\"text-sm font-semibold text-slate-800 dark:text-slate-100\">{titulo}</div>\r\n {detalhe && <div className=\"text-xs text-slate-500 dark:text-slate-400\">{detalhe}</div>}\r\n </div>\r\n {referencia && (\r\n <button\r\n type=\"button\"\r\n onClick={onReferenciaClick}\r\n className=\"text-xs font-mono text-proef-navy dark:text-sky-300 hover:underline shrink-0\"\r\n >\r\n {referencia}\r\n </button>\r\n )}\r\n {quando && <span className=\"text-xs text-slate-400 shrink-0 tabular-nums\">{quando}</span>}\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Grelha de pares rótulo/valor, para painéis de detalhe.\r\n *\r\n * Os campos vazios são omitidos por omissão: num registo vindo de várias\r\n * origens, metade dos campos costuma não existir, e uma coluna de travessões\r\n * não informa ninguém. `mostrarVazios` repõe-os quando a ausência é o que\r\n * interessa ver.\r\n * @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.\r\n */\r\nexport function ListaCampos({\r\n campos,\r\n colunas = 2,\r\n mostrarVazios = false,\r\n}: {\r\n campos: { label: string; valor: ReactNode }[]\r\n colunas?: 1 | 2 | 3\r\n mostrarVazios?: boolean\r\n}) {\r\n const vazio = (v: ReactNode): boolean => v == null || v === '' || v === '—'\r\n const visiveis = mostrarVazios ? campos : campos.filter((c) => !vazio(c.valor))\r\n if (!visiveis.length) return null\r\n\r\n const grelha = { 1: '', 2: 'md:grid-cols-2', 3: 'md:grid-cols-3' }[colunas]\r\n\r\n return (\r\n <dl className={`grid ${grelha} gap-x-6 gap-y-1`}>\r\n {visiveis.map((c) => (\r\n <div key={c.label} className=\"flex justify-between gap-3 border-b border-slate-100 dark:border-slate-800 py-1\">\r\n <dt className=\"text-xs text-slate-500 dark:text-slate-400\">{c.label}</dt>\r\n <dd className=\"text-xs font-medium text-slate-800 dark:text-slate-100 text-right\">{c.valor}</dd>\r\n </div>\r\n ))}\r\n </dl>\r\n )\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PANEL_CLASS, useFloatingPanel, itemClass } from "../../../v1/capabilities/overlay/useFloatingPanel.js";
|
|
2
|
+
const CLS_PAINEL = PANEL_CLASS;
|
|
3
|
+
const clsItem = itemClass;
|
|
4
|
+
function usePainelFlutuante(alinhar = "esquerda") {
|
|
5
|
+
const p = useFloatingPanel(alinhar === "direita" ? "right" : "left");
|
|
6
|
+
return { aberto: p.open, setAberto: p.setOpen, fechar: p.close, refBotao: p.triggerRef, refPainel: p.panelRef, estilo: p.style };
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
CLS_PAINEL,
|
|
10
|
+
clsItem,
|
|
11
|
+
usePainelFlutuante
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=painelFlutuante.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"painelFlutuante.js","sources":["../../../../../src/legacy/components/ui/painelFlutuante.ts"],"sourcesContent":["import { useFloatingPanel, PANEL_CLASS, itemClass } from '../../../v1/capabilities/overlay/useFloatingPanel'\r\n\r\n/**\r\n * Migrado para o V1 (`useFloatingPanel`): estes nomes ficam para o MenuAcoes e o código legacy.\r\n * @deprecated Legacy — usar o `useFloatingPanel` do V1.\r\n */\r\nexport const CLS_PAINEL = PANEL_CLASS\r\n/** @deprecated Legacy — usar o `itemClass` do V1. */\r\nexport const clsItem = itemClass\r\n\r\n/** @deprecated Legacy — usar o `useFloatingPanel` do V1. */\r\nexport function usePainelFlutuante(alinhar: 'esquerda' | 'direita' = 'esquerda') {\r\n const p = useFloatingPanel(alinhar === 'direita' ? 'right' : 'left')\r\n return { aberto: p.open, setAberto: p.setOpen, fechar: p.close, refBotao: p.triggerRef, refPainel: p.panelRef, estilo: p.style }\r\n}\r\n"],"names":[],"mappings":";AAMO,MAAM,aAAa;AAEnB,MAAM,UAAU;AAGhB,SAAS,mBAAmB,UAAkC,YAAY;AAC/E,QAAM,IAAI,iBAAiB,YAAY,YAAY,UAAU,MAAM;AACnE,SAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,EAAE,SAAS,QAAQ,EAAE,OAAO,UAAU,EAAE,YAAY,WAAW,EAAE,UAAU,QAAQ,EAAE,MAAA;AAC3H;"}
|