@nextelco/common-ui 2.1.106 → 2.1.107
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/index.js +201 -145
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/legacy/components/atoms/InputData/InputData.js +2 -13
- package/dist/esm/legacy/components/atoms/InputData/InputData.js.map +1 -1
- package/dist/esm/legacy/components/charts/Charts.js +147 -57
- package/dist/esm/legacy/components/charts/Charts.js.map +1 -1
- package/dist/esm/legacy/components/layout/Layout/Layout.js +21 -82
- package/dist/esm/legacy/components/layout/Layout/Layout.js.map +1 -1
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js +29 -218
- package/dist/esm/legacy/components/layout/Sidebar/Sidebar.js.map +1 -1
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js +77 -10
- package/dist/esm/legacy/components/molecules/ColumnPicker/ColumnPicker.js.map +1 -1
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js +445 -337
- package/dist/esm/legacy/components/molecules/DataTable/DataTable.js.map +1 -1
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js +15 -97
- package/dist/esm/legacy/components/molecules/UserAvatar/UserAvatar.js.map +1 -1
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js +3 -3
- package/dist/esm/legacy/components/organisms/MapaPontos/MapaPontos.js.map +1 -1
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js +15 -3
- package/dist/esm/legacy/components/organisms/PainelFiltros/PainelFiltros.js.map +1 -1
- package/dist/esm/legacy/components/organisms/Selector/Selector.js +4 -4
- package/dist/esm/legacy/components/organisms/Selector/Selector.js.map +1 -1
- package/dist/esm/legacy/components/ui/Avisos.js +23 -76
- package/dist/esm/legacy/components/ui/Avisos.js.map +1 -1
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js +14 -27
- package/dist/esm/legacy/components/ui/CabecalhoPagina.js.map +1 -1
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js +3 -51
- package/dist/esm/legacy/components/ui/CaixaPesquisa.js.map +1 -1
- package/dist/esm/legacy/components/ui/Confirmacao.js +13 -31
- package/dist/esm/legacy/components/ui/Confirmacao.js.map +1 -1
- package/dist/esm/legacy/components/ui/Escolha.js +21 -137
- package/dist/esm/legacy/components/ui/Escolha.js.map +1 -1
- package/dist/esm/legacy/components/ui/FaixaAviso.js +13 -11
- package/dist/esm/legacy/components/ui/FaixaAviso.js.map +1 -1
- package/dist/esm/legacy/components/ui/Separadores.js +11 -46
- package/dist/esm/legacy/components/ui/Separadores.js.map +1 -1
- package/dist/esm/legacy/components/ui/Ui.js +18 -115
- package/dist/esm/legacy/components/ui/Ui.js.map +1 -1
- package/dist/esm/legacy/components/ui/painelFlutuante.js +5 -44
- package/dist/esm/legacy/components/ui/painelFlutuante.js.map +1 -1
- 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/feedback/Toast/Toast.js +105 -0
- package/dist/esm/v1/components/feedback/Toast/Toast.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 +277 -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/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.map +1 -1
- 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/foundations/icons/icons.js +61 -2
- package/dist/esm/v1/foundations/icons/icons.js.map +1 -1
- package/dist/esm/v1/primitives/buttons/Button/Button.js +18 -4
- package/dist/esm/v1/primitives/buttons/Button/Button.js.map +1 -1
- 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/forms/Checkbox/Checkbox.js +1 -1
- package/dist/esm/v1/primitives/forms/Checkbox/Checkbox.js.map +1 -1
- 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/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 +190 -12
- package/dist/esm/v1/primitives/forms/SelectInput/SelectInput.js.map +1 -1
- package/dist/esm/v1/primitives/forms/field.js +4 -2
- package/dist/esm/v1/primitives/forms/field.js.map +1 -1
- 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 +1 -1
- package/dist/style.css +1 -1
- package/dist/style.layered.css +1 -1
- package/dist/tailwind.css +24 -0
- package/dist/theme-boot.js +1 -0
- package/dist/theme.css +10 -3
- package/dist/tokens.css +119 -0
- package/dist/types/legacy/components/atoms/InputData/InputData.d.ts +4 -1
- package/dist/types/legacy/components/charts/Charts.d.ts +58 -5
- package/dist/types/legacy/components/layout/Layout/Layout.d.ts +7 -20
- package/dist/types/legacy/components/layout/Sidebar/Sidebar.d.ts +13 -26
- package/dist/types/legacy/components/molecules/ColumnPicker/ColumnPicker.d.ts +56 -3
- package/dist/types/legacy/components/molecules/DataTable/DataTable.d.ts +72 -7
- package/dist/types/legacy/components/molecules/UserAvatar/UserAvatar.d.ts +4 -5
- package/dist/types/legacy/components/ui/Avisos.d.ts +6 -16
- package/dist/types/legacy/components/ui/CabecalhoPagina.d.ts +6 -20
- package/dist/types/legacy/components/ui/CaixaPesquisa.d.ts +2 -4
- package/dist/types/legacy/components/ui/Confirmacao.d.ts +3 -10
- package/dist/types/legacy/components/ui/Escolha.d.ts +5 -15
- package/dist/types/legacy/components/ui/FaixaAviso.d.ts +2 -6
- package/dist/types/legacy/components/ui/Separadores.d.ts +3 -10
- package/dist/types/legacy/components/ui/Ui.d.ts +12 -54
- package/dist/types/legacy/components/ui/painelFlutuante.d.ts +6 -10
- package/dist/types/legacy/exports/atoms.d.ts +1 -1
- package/dist/types/legacy/exports/charts.d.ts +2 -2
- package/dist/types/legacy/exports/hooks.d.ts +2 -2
- package/dist/types/legacy/exports/molecules.d.ts +2 -2
- 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/feedback/Toast/Toast.d.ts +51 -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/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
- package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +3 -2
- 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/foundations/icons/icons.d.ts +20 -0
- package/dist/types/v1/index.d.ts +43 -1
- package/dist/types/v1/primitives/buttons/Button/Button.d.ts +20 -5
- 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/forms/DateInput/DateInput.d.ts +43 -0
- package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
- package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +60 -12
- package/dist/types/v1/primitives/forms/field.d.ts +2 -0
- package/dist/types/v1/primitives/navigation/Tabs/Tabs.d.ts +58 -0
- package/package.json +3 -3
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.css +0 -17
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js +0 -41
- package/dist/esm/legacy/components/atoms/Tooltip/Tooltip.js.map +0 -1
- package/dist/esm/legacy/components/molecules/Search/Search.css +0 -18
- package/dist/esm/legacy/components/molecules/Search/Search.js +0 -30
- package/dist/esm/legacy/components/molecules/Search/Search.js.map +0 -1
- package/dist/esm/legacy/hooks/useTheme.js +0 -39
- package/dist/esm/legacy/hooks/useTheme.js.map +0 -1
- package/dist/types/legacy/components/atoms/Tooltip/Tooltip.d.ts +0 -13
- package/dist/types/legacy/components/molecules/Search/Search.d.ts +0 -7
- package/dist/types/legacy/hooks/useTheme.d.ts +0 -17
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { type ReactNode } from 'react';
|
|
2
|
-
/** @deprecated Legacy —
|
|
2
|
+
/** @deprecated Legacy — usar `useToast` do V1. */
|
|
3
3
|
export type TipoAviso = 'sucesso' | 'erro' | 'aviso' | 'info';
|
|
4
|
-
/** @deprecated Legacy —
|
|
4
|
+
/** @deprecated Legacy — usar `ToastOptions` do V1. */
|
|
5
5
|
export interface OpcoesAviso {
|
|
6
6
|
/** Botão no aviso (ex: "Tentar de novo", "Desfazer"). */
|
|
7
7
|
acao?: {
|
|
@@ -11,7 +11,7 @@ export interface OpcoesAviso {
|
|
|
11
11
|
/** Milissegundos até fechar sozinho. 0 = só fecha à mão. */
|
|
12
12
|
duracao?: number;
|
|
13
13
|
}
|
|
14
|
-
/** @deprecated Legacy —
|
|
14
|
+
/** @deprecated Legacy — usar `ToastApi` do V1. */
|
|
15
15
|
export interface AvisosApi {
|
|
16
16
|
sucesso: (mensagem: ReactNode, opcoes?: OpcoesAviso) => number;
|
|
17
17
|
erro: (mensagem: ReactNode, opcoes?: OpcoesAviso) => number;
|
|
@@ -19,7 +19,7 @@ export interface AvisosApi {
|
|
|
19
19
|
info: (mensagem: ReactNode, opcoes?: OpcoesAviso) => number;
|
|
20
20
|
fechar: (id: number) => void;
|
|
21
21
|
}
|
|
22
|
-
/** @deprecated Legacy —
|
|
22
|
+
/** @deprecated Legacy — usar `ToastProviderProps` do V1. */
|
|
23
23
|
export interface AvisosProviderProps {
|
|
24
24
|
children: ReactNode;
|
|
25
25
|
/** Rótulo do botão de fechar (leitores de ecrã). */
|
|
@@ -27,17 +27,7 @@ export interface AvisosProviderProps {
|
|
|
27
27
|
/** Máximo de avisos visíveis ao mesmo tempo; os mais antigos saem. */
|
|
28
28
|
maximo?: number;
|
|
29
29
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Avisos de resultado de ações ("Guardado", "Não foi possível eliminar").
|
|
32
|
-
*
|
|
33
|
-
* Substituem os `alert()` do browser e as caixas de erro feitas em cada página.
|
|
34
|
-
* Pôr o provider uma vez à volta da app e usar `useAvisos()` onde for preciso.
|
|
35
|
-
* Erros de validação de formulário NÃO vão aqui: ficam junto aos campos.
|
|
36
|
-
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
37
|
-
*/
|
|
30
|
+
/** @deprecated Legacy — usar `ToastProvider` do V1. */
|
|
38
31
|
export declare function AvisosProvider({ children, rotuloFechar, maximo }: AvisosProviderProps): React.JSX.Element;
|
|
39
|
-
/**
|
|
40
|
-
* Avisos da app. Tem de estar dentro de um `AvisosProvider`.
|
|
41
|
-
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
42
|
-
*/
|
|
32
|
+
/** @deprecated Legacy — usar `useToast` do V1. */
|
|
43
33
|
export declare function useAvisos(): AvisosApi;
|
|
@@ -1,37 +1,23 @@
|
|
|
1
1
|
import React, { type ReactNode } from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* Um nível do caminho por cima do título.
|
|
4
|
-
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
5
|
-
*/
|
|
2
|
+
/** @deprecated Legacy — usar `BreadcrumbItem` do V1. */
|
|
6
3
|
export interface NivelCaminho {
|
|
7
4
|
rotulo: ReactNode;
|
|
8
5
|
/** Ligação normal. Para o router da app, usar `onClick` (ex: `() => navigate('/x')`). */
|
|
9
6
|
href?: string;
|
|
10
7
|
onClick?: () => void;
|
|
11
8
|
}
|
|
12
|
-
/** @deprecated Legacy —
|
|
9
|
+
/** @deprecated Legacy — usar `PageHeaderProps` do V1. */
|
|
13
10
|
export interface CabecalhoPaginaProps {
|
|
14
11
|
titulo: ReactNode;
|
|
15
12
|
descricao?: ReactNode;
|
|
16
|
-
/**
|
|
17
|
-
* Caminho até à página (área › lista › registo). O último nível é a página
|
|
18
|
-
* atual e não leva ligação, mesmo que a traga.
|
|
19
|
-
*/
|
|
13
|
+
/** Caminho até à página (área › lista › registo). O último nível é a página atual. */
|
|
20
14
|
caminho?: NivelCaminho[];
|
|
21
|
-
/** Botões da página (ex: "Novo", "Editar").
|
|
15
|
+
/** Botões da página (ex: "Novo", "Editar"). */
|
|
22
16
|
acoes?: ReactNode;
|
|
23
17
|
/** Linha extra por baixo da descrição (etiquetas de estado, responsável…). */
|
|
24
18
|
extra?: ReactNode;
|
|
25
19
|
/** Rótulo acessível da navegação do caminho. */
|
|
26
20
|
rotuloCaminho?: string;
|
|
27
21
|
}
|
|
28
|
-
/**
|
|
29
|
-
|
|
30
|
-
* descrição e ações.
|
|
31
|
-
*
|
|
32
|
-
* Existe para o título deixar de ser desenhado à mão em cada ecrã — com
|
|
33
|
-
* tamanhos, cores e posições diferentes de página para página. O nome no menu,
|
|
34
|
-
* o título e o último nível do caminho devem ser o mesmo texto.
|
|
35
|
-
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
36
|
-
*/
|
|
37
|
-
export default function CabecalhoPagina({ titulo, descricao, caminho, acoes, extra, rotuloCaminho, }: CabecalhoPaginaProps): React.JSX.Element;
|
|
22
|
+
/** @deprecated Legacy — usar `PageHeader` (ou `Page`) do V1. */
|
|
23
|
+
export default function CabecalhoPagina({ titulo, descricao, caminho, acoes, extra, rotuloCaminho }: CabecalhoPaginaProps): React.JSX.Element;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
/** @deprecated Legacy — usar `SearchInputProps` do V1. */
|
|
2
3
|
export interface CaixaPesquisaProps {
|
|
3
4
|
valor: string;
|
|
4
5
|
onMudar: (valor: string) => void;
|
|
@@ -9,8 +10,5 @@ export interface CaixaPesquisaProps {
|
|
|
9
10
|
className?: string;
|
|
10
11
|
autoFocus?: boolean;
|
|
11
12
|
}
|
|
12
|
-
/**
|
|
13
|
-
* Caixa de pesquisa das barras de tabela e listas: mesma altura (h-8) e cantos (rounded-lg) dos botões, do
|
|
14
|
-
* Exportar e do seletor de colunas. Lupa à esquerda; com texto, um "×" para limpar (Esc também limpa).
|
|
15
|
-
*/
|
|
13
|
+
/** @deprecated Legacy — usar `SearchInput` do V1. */
|
|
16
14
|
export default function CaixaPesquisa({ valor, onMudar, placeholder, rotulo, className, autoFocus }: CaixaPesquisaProps): React.JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { type ReactNode } from 'react';
|
|
2
|
-
/** @deprecated Legacy —
|
|
2
|
+
/** @deprecated Legacy — usar `ConfirmDialog` ou `useConfirm` do V1. */
|
|
3
3
|
export interface ConfirmacaoProps {
|
|
4
4
|
aberto: boolean;
|
|
5
5
|
titulo: ReactNode;
|
|
@@ -20,12 +20,5 @@ export interface ConfirmacaoProps {
|
|
|
20
20
|
onClick: () => void;
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
* browser, que mostra o endereço do servidor, não diz que registo é e só tem
|
|
26
|
-
* "OK".
|
|
27
|
-
*
|
|
28
|
-
* Esc e clicar fora cancelam (exceto enquanto `aConfirmar`).
|
|
29
|
-
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
30
|
-
*/
|
|
31
|
-
export default function Confirmacao({ aberto, titulo, children, onConfirmar, onCancelar, textoConfirmar, textoCancelar, variante, aConfirmar, acaoSecundaria, }: ConfirmacaoProps): React.JSX.Element | null;
|
|
23
|
+
/** @deprecated Legacy — usar `ConfirmDialog` ou `useConfirm` do V1. */
|
|
24
|
+
export default function Confirmacao({ aberto, titulo, children, onConfirmar, onCancelar, textoConfirmar, textoCancelar, variante, aConfirmar, acaoSecundaria, }: ConfirmacaoProps): React.JSX.Element;
|
|
@@ -14,32 +14,22 @@ export interface EscolhaProps {
|
|
|
14
14
|
rotulo: string;
|
|
15
15
|
/** Texto do botão sem nada escolhido. */
|
|
16
16
|
placeholder?: string;
|
|
17
|
-
/**
|
|
18
|
-
* Primeira opção "vazia" (valor ''), para desfazer a escolha (ex.: "Todas"). Sem isto não há como voltar atrás
|
|
19
|
-
* depois de escolher.
|
|
20
|
-
*/
|
|
17
|
+
/** Primeira opção "vazia" (valor ''), para desfazer a escolha (ex.: "Todas"). */
|
|
21
18
|
opcaoVazia?: string;
|
|
22
19
|
disabled?: boolean;
|
|
23
20
|
/** Caixa de pesquisa no topo da lista. Por omissão, só com mais de 10 opções. */
|
|
24
21
|
pesquisa?: boolean;
|
|
25
22
|
/** Largura (classes tailwind). Por omissão a do conteúdo, entre 10rem e 18rem (etiqueta: a do texto). */
|
|
26
23
|
className?: string;
|
|
27
|
-
/**
|
|
28
|
-
* 'barra' (omissão): h-8, como os botões e filtros das barras. 'formulario': a altura dos campos de texto dos
|
|
29
|
-
* formulários (px-3 py-2), para alinhar com eles.
|
|
30
|
-
*/
|
|
24
|
+
/** 'barra' (omissão): a altura dos botões e filtros. 'formulario': a altura dos campos dos formulários legacy (38px). */
|
|
31
25
|
tamanho?: 'barra' | 'formulario';
|
|
32
|
-
/**
|
|
33
|
-
* 'campo' (omissão) ou 'etiqueta': o botão é uma etiqueta arredondada (ex.: o estado numa linha de tabela), com
|
|
34
|
-
* as cores de `corEtiqueta`. A lista é a mesma.
|
|
35
|
-
*/
|
|
26
|
+
/** 'campo' (omissão) ou 'etiqueta': o botão é uma etiqueta arredondada, com as cores de `corEtiqueta`. */
|
|
36
27
|
aspeto?: 'campo' | 'etiqueta';
|
|
37
28
|
/** Classes de cor da etiqueta (fundo, texto e variante dark:), normalmente conforme o valor escolhido. */
|
|
38
29
|
corEtiqueta?: string;
|
|
39
30
|
}
|
|
40
31
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* MenuAcoes. Teclado: ↑/↓, Home/End, Enter escolhe, Esc fecha; ao escrever com a lista aberta salta para a opção.
|
|
32
|
+
* Migrado para o V1: adaptador do `SelectInput` (a mesma lista desenhada, nomes antigos e textos em português).
|
|
33
|
+
* @deprecated Legacy — usar o `SelectInput` do V1. Ver Storybook › Legacy.
|
|
44
34
|
*/
|
|
45
35
|
export default function Escolha({ valor, opcoes, onMudar, rotulo, placeholder, opcaoVazia, disabled, pesquisa, className, tamanho, aspeto, corEtiqueta, }: EscolhaProps): React.JSX.Element;
|
|
@@ -13,11 +13,7 @@ export interface FaixaAvisoProps {
|
|
|
13
13
|
icone?: ReactNode;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* incompletos. Não é para resultados de ações — esses são avisos (`useAvisos`).
|
|
19
|
-
*
|
|
20
|
-
* Fica bem no slot `topBar` do Layout.
|
|
21
|
-
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
16
|
+
* Migrado para o V1: adaptador do `Notice` com `variant="banner"` (faixa no topo da página).
|
|
17
|
+
* @deprecated Legacy — usar o `Notice` do V1. Ver Storybook › Legacy.
|
|
22
18
|
*/
|
|
23
19
|
export default function FaixaAviso({ children, tom, acao, icone }: FaixaAvisoProps): React.JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { type ReactNode } from 'react';
|
|
2
|
-
/** @deprecated Legacy —
|
|
2
|
+
/** @deprecated Legacy — usar `TabItem` do V1. */
|
|
3
3
|
export interface Separador<T extends string> {
|
|
4
4
|
id: T;
|
|
5
5
|
rotulo: ReactNode;
|
|
@@ -7,7 +7,7 @@ export interface Separador<T extends string> {
|
|
|
7
7
|
contagem?: number;
|
|
8
8
|
desativado?: boolean;
|
|
9
9
|
}
|
|
10
|
-
/** @deprecated Legacy —
|
|
10
|
+
/** @deprecated Legacy — usar `TabsProps` do V1. */
|
|
11
11
|
export interface SeparadoresProps<T extends string> {
|
|
12
12
|
itens: Separador<T>[];
|
|
13
13
|
ativo: T;
|
|
@@ -15,12 +15,5 @@ export interface SeparadoresProps<T extends string> {
|
|
|
15
15
|
/** Rótulo acessível do conjunto (ex: "Estado das faturas"). */
|
|
16
16
|
rotulo?: string;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Separadores de uma página, iguais em todo o portal.
|
|
20
|
-
*
|
|
21
|
-
* O ativo fica a navy com sublinhado (não turquesa: turquesa sobre branco não
|
|
22
|
-
* tem contraste para texto). Setas esquerda/direita, Home e End mudam de
|
|
23
|
-
* separador, como num tablist normal.
|
|
24
|
-
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
25
|
-
*/
|
|
18
|
+
/** @deprecated Legacy — usar `Tabs` do V1. */
|
|
26
19
|
export default function Separadores<T extends string>({ itens, ativo, onMudar, rotulo }: SeparadoresProps<T>): React.JSX.Element;
|
|
@@ -5,13 +5,8 @@ import React, { type ReactNode } from 'react';
|
|
|
5
5
|
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
6
6
|
*/
|
|
7
7
|
export type StatusSla = 'ok' | 'risco' | 'incumprido';
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
title?: ReactNode;
|
|
11
|
-
extra?: ReactNode;
|
|
12
|
-
children: ReactNode;
|
|
13
|
-
className?: string;
|
|
14
|
-
}): React.JSX.Element;
|
|
8
|
+
import { Card } from '../../../v1/primitives/display/Card/Card';
|
|
9
|
+
export { Card };
|
|
15
10
|
/**
|
|
16
11
|
* Colour-bordered group — the overview sections in the prototype.
|
|
17
12
|
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
@@ -21,51 +16,10 @@ export declare function SectionGroup({ title, tone, children, }: {
|
|
|
21
16
|
tone?: 'accent' | 'ok' | 'blue' | 'red' | 'purple' | 'yellow';
|
|
22
17
|
children: ReactNode;
|
|
23
18
|
}): React.JSX.Element;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
value: ReactNode;
|
|
29
|
-
tone?: KpiTone;
|
|
30
|
-
delta?: ReactNode;
|
|
31
|
-
onClick?: () => void;
|
|
32
|
-
/** Ponto colorido antes do rótulo — liga o indicador à cor que ele tem no mapa ou na legenda. */
|
|
33
|
-
dot?: string;
|
|
34
|
-
/**
|
|
35
|
-
* Barra por baixo do valor. Um número é uma percentagem; uma lista é uma
|
|
36
|
-
* barra repartida, com cada troço proporcional ao seu peso.
|
|
37
|
-
*
|
|
38
|
-
* Serve para o indicador dizer a PROPORÇÃO e não só o valor: "253 concluídas"
|
|
39
|
-
* não diz nada sem saber de quantas.
|
|
40
|
-
*/
|
|
41
|
-
barra?: number | {
|
|
42
|
-
peso: number;
|
|
43
|
-
cor: string;
|
|
44
|
-
}[];
|
|
45
|
-
/** Linha pequena no fim, para um dado que acompanha mas não é o indicador. */
|
|
46
|
-
rodape?: ReactNode;
|
|
47
|
-
/**
|
|
48
|
-
* Faixa fina em vez de cartão.
|
|
49
|
-
*
|
|
50
|
-
* Oito indicadores em cartões de 88px empurram o conteúdo para fora do ecrã,
|
|
51
|
-
* e o conteúdo é que é o trabalho. Denso alinha à esquerda e corta a altura
|
|
52
|
-
* para metade — os números continuam a ler-se, e o mapa fica acima da dobra.
|
|
53
|
-
*/
|
|
54
|
-
denso?: boolean;
|
|
55
|
-
/** Fundo colorido (tom claro) em vez de só o número — opt-in, sem quebrar o uso existente. */
|
|
56
|
-
bgTint?: boolean;
|
|
57
|
-
/** Filtro ativo (KPI clicável selecionado): contorno azul. */
|
|
58
|
-
active?: boolean;
|
|
59
|
-
/** Tooltip do KPI clicável (ex: "Filtrar a tabela"). */
|
|
60
|
-
hint?: string;
|
|
61
|
-
}): React.JSX.Element;
|
|
62
|
-
/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
|
|
63
|
-
export type BadgeTone = 'ok' | 'risco' | 'incumprido' | 'neutral' | 'accent';
|
|
64
|
-
/** @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy. */
|
|
65
|
-
export declare function Badge({ tone, children }: {
|
|
66
|
-
tone?: BadgeTone;
|
|
67
|
-
children: ReactNode;
|
|
68
|
-
}): React.JSX.Element;
|
|
19
|
+
import { Kpi, type KpiTone } from '../../../v1/primitives/display/Kpi/Kpi';
|
|
20
|
+
export { Kpi, type KpiTone };
|
|
21
|
+
import { Badge, type BadgeTone } from '../../../v1/primitives/display/Badge/Badge';
|
|
22
|
+
export { Badge, type BadgeTone };
|
|
69
23
|
/**
|
|
70
24
|
* SLA badge — picks the tone and label from `status`. Labels overridable via `labels`.
|
|
71
25
|
* @deprecated Legacy — não usar em código novo. Ver Storybook › Legacy.
|
|
@@ -82,7 +36,10 @@ export declare function BadgeSla({ status, labels }: {
|
|
|
82
36
|
export declare function ChipEstadoInterno({ estado }: {
|
|
83
37
|
estado: string | null;
|
|
84
38
|
}): React.JSX.Element;
|
|
85
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Migrado para o V1: é o `Button` do V1 (mesmo aspeto); isto só mantém a API antiga.
|
|
41
|
+
* @deprecated Legacy — usar `Button` do V1.
|
|
42
|
+
*/
|
|
86
43
|
export declare function Btn({ children, onClick, variant, active, disabled, title, type, }: {
|
|
87
44
|
children: ReactNode;
|
|
88
45
|
onClick?: () => void;
|
|
@@ -94,7 +51,8 @@ export declare function Btn({ children, onClick, variant, active, disabled, titl
|
|
|
94
51
|
}): React.JSX.Element;
|
|
95
52
|
/**
|
|
96
53
|
* Mutually exclusive button group (granularity, dimension…).
|
|
97
|
-
*
|
|
54
|
+
* Migrado para o V1: é o `SegmentedControl` do V1; isto só mantém a API antiga.
|
|
55
|
+
* @deprecated Legacy — usar `SegmentedControl` do V1.
|
|
98
56
|
*/
|
|
99
57
|
export declare function BtnGroup<T extends string>({ value, options, onChange, label, }: {
|
|
100
58
|
value: T;
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import { type CSSProperties } from 'react';
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Migrado para o V1 (`useFloatingPanel`): estes nomes ficam para o MenuAcoes e o código legacy.
|
|
3
|
+
* @deprecated Legacy — usar o `useFloatingPanel` do V1.
|
|
5
4
|
*/
|
|
6
5
|
export declare const CLS_PAINEL = "fixed z-[60] min-w-[10rem] max-h-72 overflow-auto rounded-xl border border-slate-200 bg-white py-1 text-sm shadow-lg dark:border-slate-700 dark:bg-slate-900";
|
|
7
|
-
/**
|
|
8
|
-
export declare const clsItem: (
|
|
9
|
-
/**
|
|
10
|
-
* Painel flutuante preso a um botão: posição fixa (não é cortado por tabelas ou modais com scroll), abre para
|
|
11
|
-
* cima quando não cabe por baixo, fecha ao clicar fora, com Esc, ao fazer scroll fora dele ou ao redimensionar.
|
|
12
|
-
*/
|
|
6
|
+
/** @deprecated Legacy — usar o `itemClass` do V1. */
|
|
7
|
+
export declare const clsItem: (active: boolean, danger?: boolean) => string;
|
|
8
|
+
/** @deprecated Legacy — usar o `useFloatingPanel` do V1. */
|
|
13
9
|
export declare function usePainelFlutuante(alinhar?: 'esquerda' | 'direita'): {
|
|
14
10
|
aberto: boolean;
|
|
15
11
|
setAberto: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
16
12
|
fechar: () => void;
|
|
17
13
|
refBotao: import("react").RefObject<HTMLButtonElement | null>;
|
|
18
14
|
refPainel: import("react").RefObject<HTMLDivElement | null>;
|
|
19
|
-
estilo: CSSProperties;
|
|
15
|
+
estilo: import("react").CSSProperties;
|
|
20
16
|
};
|
|
@@ -11,7 +11,7 @@ export { default as IconButton } from '../components/atoms/Button/variants/IconB
|
|
|
11
11
|
export { default as TabButton } from '../components/atoms/Button/variants/TabButton';
|
|
12
12
|
export { default as MainButton } from '../components/atoms/Button/variants/MainButton';
|
|
13
13
|
export { default as Stack } from '../components/atoms/Stack/Stack';
|
|
14
|
-
export { default as Tooltip } from '
|
|
14
|
+
export { default as Tooltip } from '../../v1/components/overlays/Tooltip/Tooltip';
|
|
15
15
|
export { default as Input } from '../components/atoms/Input/Input';
|
|
16
16
|
export { default as Icone } from '../components/atoms/Icone/Icone';
|
|
17
17
|
export type { IconeQualquer } from '../components/atoms/Icone/Icone';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { PALETA, cor, BarrasEmpilhadas, BarrasHorizontais, Anel, Linha, Linhas, Bolhas, } from '../components/charts/Charts';
|
|
2
|
-
export type { SerieEmpilhada, Distribuicao, PontoRisco } from '../components/charts/Charts';
|
|
1
|
+
export { PALETA, cor, Barras, BarrasEmpilhadas, BarrasHorizontais, Anel, Linha, Linhas, Bolhas, } from '../components/charts/Charts';
|
|
2
|
+
export type { SerieEmpilhada, Distribuicao, PontoRisco, BarrasProps, CliqueGrafico } from '../components/charts/Charts';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { useApi } from '../hooks/useApi';
|
|
2
2
|
export type { RequestOptions } from '../hooks/useApi';
|
|
3
|
-
export { useTheme } from '
|
|
4
|
-
export type { Theme } from '
|
|
3
|
+
export { useTheme } from '../../v1/capabilities/theme/useTheme';
|
|
4
|
+
export type { Theme } from '../../v1/capabilities/theme/useTheme';
|
|
@@ -9,8 +9,8 @@ export { default as PhotoAvatar } from '../components/molecules/PhotoAvatar/Phot
|
|
|
9
9
|
export { default as DataTable } from '../components/molecules/DataTable/DataTable';
|
|
10
10
|
export { timestampDeData } from '../components/molecules/DataTable/DataTable';
|
|
11
11
|
export type { DataTableColumn, DataTableLabels, DataTableView, DataTableEstado, } from '../components/molecules/DataTable/DataTable';
|
|
12
|
-
export { default as ColumnPicker, applyColumnLayout, orderColumns, } from '../components/molecules/ColumnPicker/ColumnPicker';
|
|
13
|
-
export type { ColumnPickerItem, ColumnPickerLabels, } from '../components/molecules/ColumnPicker/ColumnPicker';
|
|
12
|
+
export { default as ColumnPicker, applyColumnLayout, orderColumns, useColumnLayout, } from '../components/molecules/ColumnPicker/ColumnPicker';
|
|
13
|
+
export type { ColumnPickerItem, ColumnPickerLabels, ColumnPickerProps, ColumnLayout, UseColumnLayoutOptions, UseColumnLayoutResult, } from '../components/molecules/ColumnPicker/ColumnPicker';
|
|
14
14
|
export { default as FileDropzone } from '../components/molecules/FileDropzone/FileDropzone';
|
|
15
15
|
export type { FileDropzoneProps, FileDropzoneLabels } from '../components/molecules/FileDropzone/FileDropzone';
|
|
16
16
|
export { default as LanguageSwitcher } from '../components/molecules/LanguageSwitcher/LanguageSwitcher';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type CSSProperties } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Aspeto comum das listas suspensas (SelectInput, MenuAcoes): cartão arredondado com sombra, nos dois temas.
|
|
4
|
+
* Um só sítio para ficarem iguais.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PANEL_CLASS = "fixed z-[60] min-w-[10rem] max-h-72 overflow-auto rounded-xl border border-slate-200 bg-white py-1 text-sm shadow-lg dark:border-slate-700 dark:bg-slate-900";
|
|
7
|
+
/** Item de uma lista suspensa; `active` = o que o teclado tem selecionado. */
|
|
8
|
+
export declare const itemClass: (active: boolean, danger?: boolean) => string;
|
|
9
|
+
/**
|
|
10
|
+
* Painel flutuante preso a um botão: posição fixa (não é cortado por tabelas ou janelas com scroll), abre para
|
|
11
|
+
* cima quando não cabe por baixo, fecha ao clicar fora, ao fazer scroll fora dele ou ao redimensionar.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useFloatingPanel(align?: 'left' | 'right'): {
|
|
14
|
+
open: boolean;
|
|
15
|
+
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
16
|
+
close: () => void;
|
|
17
|
+
triggerRef: import("react").RefObject<HTMLButtonElement | null>;
|
|
18
|
+
panelRef: import("react").RefObject<HTMLDivElement | null>;
|
|
19
|
+
style: CSSProperties;
|
|
20
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Se a app está em escuro agora (a classe `.dark` no `<html>`), e muda quando o
|
|
3
|
+
* tema muda.
|
|
4
|
+
*
|
|
5
|
+
* Para o que não pode usar o `dark:` do Tailwind e precisa das cores em
|
|
6
|
+
* JavaScript: gráficos, `<iframe>`, SVG com cores por props. O componente volta
|
|
7
|
+
* a desenhar quando o tema muda.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useIsDark(): boolean;
|
|
10
|
+
export default useIsDark;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type Theme = 'light' | 'dark' | 'system';
|
|
2
|
+
/** Chave da escolha no localStorage. A mesma nos portais (Tickets, AuditoriasIT). */
|
|
3
|
+
export declare const THEME_STORAGE_KEY = "theme";
|
|
4
|
+
/** Põe ou tira a classe `.dark` no `<html>`: é a ela que os componentes e os tokens reagem. */
|
|
5
|
+
export declare function applyTheme(theme: Theme): void;
|
|
6
|
+
/**
|
|
7
|
+
* Script para pôr no `<head>` do `index.html`, antes do CSS: aplica o tema
|
|
8
|
+
* guardado antes da primeira pintura (sem o clarão branco ao abrir em escuro).
|
|
9
|
+
*
|
|
10
|
+
* O build também o põe em `dist/theme-boot.js`, para a app o injetar no
|
|
11
|
+
* `index.html` sem o copiar (ex: num plugin `transformIndexHtml` do Vite).
|
|
12
|
+
*/
|
|
13
|
+
export declare const themeBootScript = "(function(){try{var k='theme',o='proef-theme',v=localStorage.getItem(k)||localStorage.getItem(o)||'system';if(v==='dark'||(v==='system'&&window.matchMedia('(prefers-color-scheme: dark)').matches))document.documentElement.classList.add('dark')}catch(e){}})();";
|
|
14
|
+
/**
|
|
15
|
+
* Tema da app: claro, escuro ou o do sistema. Guarda a escolha (sozinho, a cada
|
|
16
|
+
* mudança), aplica a classe `.dark` no `<html>`, segue o sistema em `system` e
|
|
17
|
+
* acompanha a escolha feita noutro separador.
|
|
18
|
+
*
|
|
19
|
+
* const { theme, setTheme } = useTheme()
|
|
20
|
+
* <AppShell theme={theme} onThemeChange={setTheme} …/>
|
|
21
|
+
*
|
|
22
|
+
* Para não haver clarão ao abrir, pôr o `themeBootScript` no `index.html`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function useTheme(): {
|
|
25
|
+
theme: Theme;
|
|
26
|
+
setTheme: (t: Theme) => void;
|
|
27
|
+
cycle: () => void;
|
|
28
|
+
};
|
|
29
|
+
export default useTheme;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface PaginationLabels {
|
|
3
|
+
/** "{page}" e "{pages}" são substituídos (ex: "Página {page} de {pages}"). */
|
|
4
|
+
page: string;
|
|
5
|
+
/** "{count}" é substituído pelo total de registos (ex: "{count} resultados"). */
|
|
6
|
+
total: string;
|
|
7
|
+
perPage: string;
|
|
8
|
+
prev: string;
|
|
9
|
+
next: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const DEFAULT_PAGINATION_LABELS: PaginationLabels;
|
|
12
|
+
export interface PaginationProps {
|
|
13
|
+
/** Página atual, a contar de 1. */
|
|
14
|
+
page: number;
|
|
15
|
+
/** Número de páginas. */
|
|
16
|
+
pages: number;
|
|
17
|
+
onPageChange: (page: number) => void;
|
|
18
|
+
/** Total de registos (mostrado à esquerda). */
|
|
19
|
+
total?: number;
|
|
20
|
+
/** Registos por página e as opções do seletor (sem opções, não há seletor). */
|
|
21
|
+
pageSize?: number;
|
|
22
|
+
pageSizeOptions?: number[];
|
|
23
|
+
onPageSizeChange?: (size: number) => void;
|
|
24
|
+
labels?: Partial<PaginationLabels>;
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Paginação por baixo de uma lista: "Página 1 de 4", o total, quantos por página e
|
|
29
|
+
* Anterior/Seguinte. É a mesma que a `DataTable` mostra; usar esta quando a app pagina
|
|
30
|
+
* no servidor (a tabela recebe só a página atual).
|
|
31
|
+
*/
|
|
32
|
+
export default function Pagination({ page, pages, onPageChange, total, pageSize, pageSizeOptions, onPageSizeChange, labels, className, }: PaginationProps): React.JSX.Element;
|
|
33
|
+
export { Pagination };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type ToastTone = 'success' | 'error' | 'warning' | 'info';
|
|
3
|
+
export interface ToastOptions {
|
|
4
|
+
/** Linha em negrito por cima da mensagem. */
|
|
5
|
+
title?: string;
|
|
6
|
+
/** Botão no aviso (ex: Desfazer, Tentar de novo). Fecha o aviso depois de correr. */
|
|
7
|
+
action?: {
|
|
8
|
+
label: string;
|
|
9
|
+
onClick: () => void;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Quanto tempo fica visível, em ms. `0`: fica até ser fechado. Por omissão
|
|
13
|
+
* depende do tipo: ler um erro demora mais do que um "Guardado".
|
|
14
|
+
*/
|
|
15
|
+
duration?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ToastApi {
|
|
18
|
+
success: (message: React.ReactNode, options?: ToastOptions) => number;
|
|
19
|
+
error: (message: React.ReactNode, options?: ToastOptions) => number;
|
|
20
|
+
warning: (message: React.ReactNode, options?: ToastOptions) => number;
|
|
21
|
+
info: (message: React.ReactNode, options?: ToastOptions) => number;
|
|
22
|
+
/** Fecha um aviso pelo número que as funções acima devolvem. */
|
|
23
|
+
dismiss: (id: number) => void;
|
|
24
|
+
}
|
|
25
|
+
export interface ToastProviderProps {
|
|
26
|
+
children: React.ReactNode;
|
|
27
|
+
/** Nome do botão × de cada aviso, para leitores de ecrã. Por omissão: "Fechar aviso". */
|
|
28
|
+
closeLabel?: string;
|
|
29
|
+
/** Nome da zona dos avisos, para leitores de ecrã. Por omissão: "Avisos". */
|
|
30
|
+
regionLabel?: string;
|
|
31
|
+
/** Máximo de avisos visíveis ao mesmo tempo; os mais antigos saem. Por omissão 4. */
|
|
32
|
+
max?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Avisos da app. Fora de um ToastProvider dá erro, para não se perderem
|
|
36
|
+
* avisos sem ninguém reparar.
|
|
37
|
+
*/
|
|
38
|
+
export declare function useToast(): ToastApi;
|
|
39
|
+
/**
|
|
40
|
+
* Avisos do resultado de uma ação, no canto inferior direito (ex: "Ticket
|
|
41
|
+
* guardado", "Não foi possível apagar").
|
|
42
|
+
*
|
|
43
|
+
* Monta-se uma vez à volta da app; em qualquer ecrã, `useToast()` dá
|
|
44
|
+
* `success`, `error`, `warning` e `info`. Desaparecem sozinhos (os erros
|
|
45
|
+
* ficam mais tempo); com o rato por cima ficam até ele sair. Aparecem por cima
|
|
46
|
+
* de uma janela (Dialog) aberta.
|
|
47
|
+
*
|
|
48
|
+
* Substituem o `alert()` do browser. Erros de validação de um formulário não
|
|
49
|
+
* vão aqui: ficam junto aos campos.
|
|
50
|
+
*/
|
|
51
|
+
export default function ToastProvider({ children, closeLabel, regionLabel, max }: ToastProviderProps): React.JSX.Element;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type SideNavLabels, type SideNavProps } from '../SideNav/SideNav';
|
|
3
|
+
export interface AppShellLabels extends SideNavLabels {
|
|
4
|
+
openMenu: string;
|
|
5
|
+
}
|
|
6
|
+
export interface AppShellProps extends Omit<SideNavProps, 'open' | 'onOpenChange' | 'footer' | 'labels'> {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
/** Conteúdo extra no rodapé do menu, por cima do tema (ex: um filtro global). */
|
|
9
|
+
sidebarFooter?: (expanded: boolean) => React.ReactNode;
|
|
10
|
+
/** Barras no topo, com a largura toda (ex: "A ver como…", "A sincronizar…"). Empurram o menu e a página para baixo. */
|
|
11
|
+
banners?: React.ReactNode;
|
|
12
|
+
/** Barra fixa por cima da página, à direita do menu (ex: título e alertas). Traz o seu próprio fundo. */
|
|
13
|
+
topBar?: React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* A página ocupa a altura que sobra do ecrã, sem scroll da página (ex:
|
|
16
|
+
* quadros e listas que fazem scroll por dentro, com o `Page` em `fill`).
|
|
17
|
+
* As margens são as mesmas das outras páginas.
|
|
18
|
+
*/
|
|
19
|
+
fullHeight?: boolean;
|
|
20
|
+
/** Menu aberto ao entrar (ecrãs grandes). Por omissão sim; fechado fica só com os ícones. */
|
|
21
|
+
defaultOpen?: boolean;
|
|
22
|
+
/** A pessoa abriu ou fechou o menu (para a app guardar a escolha, se quiser). */
|
|
23
|
+
onOpenChange?: (open: boolean) => void;
|
|
24
|
+
labels?: Partial<AppShellLabels>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A moldura da app: o menu lateral (`SideNav`) à esquerda e a página à
|
|
28
|
+
* direita, com barras opcionais no topo.
|
|
29
|
+
*
|
|
30
|
+
* Em ecrãs pequenos (< 1024px) o menu é uma gaveta, aberta pelo botão no canto,
|
|
31
|
+
* que fecha ao mudar de página.
|
|
32
|
+
*
|
|
33
|
+
* Precisa de estar dentro de um Router do react-router.
|
|
34
|
+
*/
|
|
35
|
+
export default function AppShell({ children, sidebarFooter, banners, topBar, fullHeight, defaultOpen, onOpenChange, labels, ...sideNav }: AppShellProps): React.JSX.Element;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type PageHeaderProps } from '../PageHeader/PageHeader';
|
|
3
|
+
export interface PageProps extends PageHeaderProps {
|
|
4
|
+
/** Separadores da página (ex: `<Tabs …/>`), entre o cabeçalho e o conteúdo. */
|
|
5
|
+
tabs?: React.ReactNode;
|
|
6
|
+
/**
|
|
7
|
+
* A página ocupa a altura que sobra e o conteúdo faz scroll por dentro (ex:
|
|
8
|
+
* quadros e listas compridas). Usar com o `fullHeight` do `AppShell`.
|
|
9
|
+
*/
|
|
10
|
+
fill?: boolean;
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Uma página da app: cabeçalho (`PageHeader`), separadores opcionais e o
|
|
15
|
+
* conteúdo, sempre com os mesmos espaços entre eles. As margens à volta vêm do
|
|
16
|
+
* `AppShell`; a página não põe as suas.
|
|
17
|
+
*
|
|
18
|
+
* **Caminho automático**: dentro do `AppShell`, numa página que está num grupo
|
|
19
|
+
* do menu, o caminho por cima do título é "grupo › página" (ex: "App & Dev ›
|
|
20
|
+
* Sprints"), com os nomes do menu. Passar `breadcrumb` substitui-o (ex: no
|
|
21
|
+
* detalhe de um registo); `breadcrumb={[]}` tira-o.
|
|
22
|
+
*/
|
|
23
|
+
export default function Page({ tabs, fill, children, breadcrumb, ...header }: PageProps): React.JSX.Element;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/** Um nível do caminho por cima do título. */
|
|
3
|
+
export interface BreadcrumbItem {
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
/** Ligação normal. Para o router da app, usar `onClick` (ex: `() => navigate('/x')`). */
|
|
6
|
+
href?: string;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
}
|
|
9
|
+
export interface PageHeaderProps {
|
|
10
|
+
title: React.ReactNode;
|
|
11
|
+
description?: React.ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Caminho até à página (área › lista › registo). O último nível é a página
|
|
14
|
+
* atual e não leva ligação, mesmo que a traga.
|
|
15
|
+
*/
|
|
16
|
+
breadcrumb?: BreadcrumbItem[];
|
|
17
|
+
/** Botões da página (ex: "Novo", "Editar"). Ficam à direita e descem em ecrã estreito. */
|
|
18
|
+
actions?: React.ReactNode;
|
|
19
|
+
/** Linha extra por baixo da descrição (etiquetas de estado, responsável…). */
|
|
20
|
+
extra?: React.ReactNode;
|
|
21
|
+
/** Nome da navegação do caminho, para leitores de ecrã. Por omissão: "Caminho". */
|
|
22
|
+
breadcrumbLabel?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Cabeçalho comum a todas as páginas: caminho, título com a barra turquesa,
|
|
26
|
+
* descrição e ações.
|
|
27
|
+
*
|
|
28
|
+
* Existe para o título deixar de ser desenhado à mão em cada ecrã — com
|
|
29
|
+
* tamanhos, cores e posições diferentes de página para página. O nome no menu,
|
|
30
|
+
* o título e o último nível do caminho devem ser o mesmo texto.
|
|
31
|
+
*
|
|
32
|
+
* Normalmente usa-se através do `Page`, que também arruma os separadores e o
|
|
33
|
+
* conteúdo por baixo.
|
|
34
|
+
*/
|
|
35
|
+
export default function PageHeader({ title, description, breadcrumb, actions, extra, breadcrumbLabel }: PageHeaderProps): React.JSX.Element;
|