@nextelco/common-ui 2.1.105 → 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/forms/FormField/FormField.js.map +1 -1
- package/dist/esm/v1/components/forms/FormGrid/FormGrid.js.map +1 -1
- 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/lists/ListFinder/ListFinder.js +4 -4
- package/dist/esm/v1/components/lists/ListFinder/ListFinder.js.map +1 -1
- 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/components/tables/PaginatedTable/PaginatedTable.js.map +1 -1
- package/dist/esm/v1/components/tables/Table/Table.js.map +1 -1
- 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 +10 -5
- 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/LookupInput/LookupInput.js.map +1 -1
- 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/TextArea/TextArea.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/lists/ListItem/ListItem.js +2 -2
- package/dist/esm/v1/primitives/lists/ListItem/ListItem.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/forms/FormField/FormField.d.ts +3 -3
- package/dist/types/v1/components/forms/FormGrid/FormGrid.d.ts +2 -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 +1 -1
- package/dist/types/v1/components/overlays/ConfirmDialog/ConfirmDialog.d.ts +59 -0
- package/dist/types/v1/components/overlays/Dialog/Dialog.d.ts +6 -3
- 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 +1 -1
- package/dist/types/v1/components/tables/Table/Table.d.ts +1 -1
- 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 +22 -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/Checkbox/Checkbox.d.ts +7 -0
- package/dist/types/v1/primitives/forms/DateInput/DateInput.d.ts +43 -0
- package/dist/types/v1/primitives/forms/LookupInput/LookupInput.d.ts +3 -0
- package/dist/types/v1/primitives/forms/SearchInput/SearchInput.d.ts +23 -0
- package/dist/types/v1/primitives/forms/SelectInput/SelectInput.d.ts +61 -10
- package/dist/types/v1/primitives/forms/TextArea/TextArea.d.ts +3 -0
- package/dist/types/v1/primitives/forms/field.d.ts +2 -0
- package/dist/types/v1/primitives/lists/ListItem/ListItem.d.ts +2 -1
- 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/esm/v1/primitives/lists/ListItem/ListCheckbox.js +0 -28
- package/dist/esm/v1/primitives/lists/ListItem/ListCheckbox.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
- package/dist/types/v1/primitives/lists/ListItem/ListCheckbox.d.ts +0 -14
|
@@ -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;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type SideNavTheme = 'light' | 'dark' | 'system';
|
|
3
|
+
export interface SideNavBadge {
|
|
4
|
+
count: number;
|
|
5
|
+
/** `attention` (amarelo, por omissão): coisas à espera da pessoa. `alert` (laranja): à espera de outro circuito (ex: CAB). */
|
|
6
|
+
tone?: 'attention' | 'alert';
|
|
7
|
+
/** O que o número conta, para o tooltip e leitores de ecrã (ex: "Aprovações pendentes"). */
|
|
8
|
+
label?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SideNavItem {
|
|
11
|
+
/** Rota da app, ou URL completo com `external`. */
|
|
12
|
+
to: string;
|
|
13
|
+
label: string;
|
|
14
|
+
/** Componente de ícone que aceita `size` e `className` (ex: um ícone do lucide-react). */
|
|
15
|
+
icon: React.ComponentType<{
|
|
16
|
+
size?: number;
|
|
17
|
+
className?: string;
|
|
18
|
+
}>;
|
|
19
|
+
/** Chave do grupo. Os itens do mesmo grupo aparecem juntos, por baixo do título do grupo. */
|
|
20
|
+
group?: string;
|
|
21
|
+
/** Só fica ativo na rota exata (como o `end` do NavLink). */
|
|
22
|
+
end?: boolean;
|
|
23
|
+
/** Abre num separador novo, fora da app. */
|
|
24
|
+
external?: boolean;
|
|
25
|
+
/** Contadores ao lado do texto. Os que têm `count` 0 não aparecem. */
|
|
26
|
+
badges?: SideNavBadge[];
|
|
27
|
+
}
|
|
28
|
+
export interface SideNavLabels {
|
|
29
|
+
closeMenu: string;
|
|
30
|
+
expandMenu: string;
|
|
31
|
+
collapseMenu: string;
|
|
32
|
+
/** Antes do nome do grupo, no botão que o abre/fecha (ex: "Abrir Recursos"). */
|
|
33
|
+
openGroup: string;
|
|
34
|
+
closeGroup: string;
|
|
35
|
+
theme: string;
|
|
36
|
+
light: string;
|
|
37
|
+
dark: string;
|
|
38
|
+
system: string;
|
|
39
|
+
language: string;
|
|
40
|
+
logout: string;
|
|
41
|
+
deployedAt: string;
|
|
42
|
+
}
|
|
43
|
+
export declare const SIDENAV_LABELS: SideNavLabels;
|
|
44
|
+
export interface SideNavProps {
|
|
45
|
+
menu: SideNavItem[];
|
|
46
|
+
/** Título de cada grupo do menu, pela chave (`group`). Sem título, aparece a chave. */
|
|
47
|
+
groupLabels?: Record<string, string>;
|
|
48
|
+
/** Por baixo do logótipo (ex: "IT Portal"). */
|
|
49
|
+
appTitle?: string;
|
|
50
|
+
/** Foto ou iniciais da pessoa, no topo do menu. */
|
|
51
|
+
avatar?: React.ReactNode;
|
|
52
|
+
/** Sem isto, não há botão de terminar sessão. */
|
|
53
|
+
onLogout?: () => void;
|
|
54
|
+
/** Escolha de idioma no rodapé. Só aparece com `languages` e `onLanguageChange`. */
|
|
55
|
+
languages?: {
|
|
56
|
+
code: string;
|
|
57
|
+
label: string;
|
|
58
|
+
}[];
|
|
59
|
+
currentLanguage?: string;
|
|
60
|
+
onLanguageChange?: (code: string) => void;
|
|
61
|
+
/**
|
|
62
|
+
* Escolha de tema no rodapé. Só aparece com `onThemeChange`. O menu só
|
|
63
|
+
* mostra a escolha: pôr a classe `.dark` no `<html>` é da app.
|
|
64
|
+
*/
|
|
65
|
+
theme?: SideNavTheme;
|
|
66
|
+
onThemeChange?: (theme: SideNavTheme) => void;
|
|
67
|
+
/** Quando foi feito o build, no fundo do menu. A app decide a quem o mostra (ex: só administradores). */
|
|
68
|
+
deployedAt?: string | number | Date;
|
|
69
|
+
/** Conteúdo extra no rodapé, por cima do tema (ex: um filtro global). Recebe se o menu está expandido. */
|
|
70
|
+
footer?: (expanded: boolean) => React.ReactNode;
|
|
71
|
+
labels?: Partial<SideNavLabels>;
|
|
72
|
+
/** Aberto (256px) ou fechado (só ícones; em ecrãs pequenos, escondido). A app guarda este estado. */
|
|
73
|
+
open: boolean;
|
|
74
|
+
onOpenChange: (open: boolean) => void;
|
|
75
|
+
}
|
|
76
|
+
/** Abaixo desta largura o menu é uma gaveta por cima da página; acima ocupa espaço (aberto ou só ícones). */
|
|
77
|
+
export declare const DRAWER_MAX = 1024;
|
|
78
|
+
export declare const isDrawer: () => boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Menu lateral navy da app, fixo à esquerda. Normalmente usa-se através do
|
|
81
|
+
* `AppShell`, que também trata da página ao lado.
|
|
82
|
+
*
|
|
83
|
+
* - **Ecrãs grandes** (≥ 1024px): aberto ocupa 256px; fechado fica só com os
|
|
84
|
+
* ícones (80px) e abre por cima da página ao passar o rato.
|
|
85
|
+
* - **Ecrãs pequenos**: escondido quando fechado; aberto fica por cima da
|
|
86
|
+
* página e fecha ao escolher uma página.
|
|
87
|
+
* - **Grupos**: abertos por omissão, fecham com um clique no título. Só com os
|
|
88
|
+
* ícones, fica aberto apenas o grupo da página atual.
|
|
89
|
+
*
|
|
90
|
+
* Precisa de estar dentro de um Router do react-router.
|
|
91
|
+
*/
|
|
92
|
+
export default function SideNav({ menu, groupLabels, appTitle, avatar, onLogout, languages, currentLanguage, onLanguageChange, theme, onThemeChange, deployedAt, footer, labels: labelsProp, open, onOpenChange, }: SideNavProps): React.JSX.Element;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SideNavItem } from './SideNav/SideNav';
|
|
2
|
+
/** Onde a página atual está no menu: o grupo (se tiver) e o nome da entrada. Uso interno. */
|
|
3
|
+
export interface NavTrail {
|
|
4
|
+
group?: string;
|
|
5
|
+
page: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const NavTrailContext: import("react").Context<NavTrail | null>;
|
|
8
|
+
/** O lugar da página atual no menu do `AppShell`; `null` fora de um `AppShell` ou fora do menu. */
|
|
9
|
+
export declare const useNavTrail: () => NavTrail | null;
|
|
10
|
+
/**
|
|
11
|
+
* A entrada do menu da rota atual: a de caminho mais comprido que é o início da
|
|
12
|
+
* rota (ex: `/equipamentos/rececao` antes de `/equipamentos`). Ligações
|
|
13
|
+
* externas não contam.
|
|
14
|
+
*/
|
|
15
|
+
export declare function findNavTrail(menu: SideNavItem[], groupLabels: Record<string, string>, pathname: string): NavTrail | null;
|
|
@@ -15,7 +15,7 @@ export interface ListFinderProps<T> {
|
|
|
15
15
|
/** As marcadas. Só há caixas de marcar com `onSelectionChange`. */
|
|
16
16
|
selectedKeys?: ReadonlySet<string>;
|
|
17
17
|
onSelectionChange?: (keys: Set<string>) => void;
|
|
18
|
-
/** Filtros ao lado do voltar, por cima da pesquisa (ex: um ou dois SelectInput). */
|
|
18
|
+
/** Filtros ao lado do voltar, por cima da pesquisa (ex: um ou dois [SelectInput](?path=/docs/v1-primitives-forms-selectinput--docs)). */
|
|
19
19
|
filters?: React.ReactNode;
|
|
20
20
|
/** Com isto aparece um ‹ à esquerda, para fechar ou esconder a lista. */
|
|
21
21
|
onBack?: () => void;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface ConfirmDialogProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
/** Curto: a ação ou a pergunta (ex: "Apagar despesa"). */
|
|
5
|
+
title: React.ReactNode;
|
|
6
|
+
/** A pergunta ou o que vai acontecer (ex: "Tem a certeza que pretende apagar esta despesa?"). */
|
|
7
|
+
message?: React.ReactNode;
|
|
8
|
+
/** Consequência que a pessoa não adivinha sozinha (ex: "Não se pode desfazer."). Em letra mais pequena. */
|
|
9
|
+
detail?: React.ReactNode;
|
|
10
|
+
/** `danger`: apaga ou não se pode desfazer. O botão fica vermelho e aparece o sinal de atenção. */
|
|
11
|
+
tone?: 'default' | 'danger';
|
|
12
|
+
/** Por omissão: "Confirmar". */
|
|
13
|
+
confirmLabel?: string;
|
|
14
|
+
/** Por omissão: "Cancelar". */
|
|
15
|
+
cancelLabel?: string;
|
|
16
|
+
/** Nome do botão ×, para leitores de ecrã. Por omissão: "Fechar". */
|
|
17
|
+
closeLabel?: string;
|
|
18
|
+
/** A confirmar (ex: à espera do servidor): o botão mostra a roda e a janela não fecha. */
|
|
19
|
+
loading?: boolean;
|
|
20
|
+
/** Uma segunda saída (ex: "Desativar" em vez de apagar). Não fecha a janela sozinha. */
|
|
21
|
+
secondaryAction?: {
|
|
22
|
+
label: string;
|
|
23
|
+
onClick: () => void;
|
|
24
|
+
};
|
|
25
|
+
onConfirm: () => void;
|
|
26
|
+
/** Cancelar, ×, Esc ou clique fora. */
|
|
27
|
+
onCancel: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pergunta de sim/não antes de uma ação (ex: apagar, enviar, fechar sem
|
|
31
|
+
* guardar). Substitui o `window.confirm` do browser, que mostra o endereço do
|
|
32
|
+
* servidor, não diz que registo é e só tem "OK".
|
|
33
|
+
*
|
|
34
|
+
* Com `tone="danger"` o foco começa em Cancelar: um Enter por engano não apaga
|
|
35
|
+
* nada. Nos outros casos começa em Confirmar.
|
|
36
|
+
*
|
|
37
|
+
* Para não ter de guardar o estado em cada ecrã, usar `useConfirm()` (com o
|
|
38
|
+
* `ConfirmProvider` à volta da app).
|
|
39
|
+
*/
|
|
40
|
+
export default function ConfirmDialog({ open, title, message, detail, tone, confirmLabel, cancelLabel, closeLabel, loading, secondaryAction, onConfirm, onCancel, }: ConfirmDialogProps): React.JSX.Element;
|
|
41
|
+
export type ConfirmOptions = Omit<ConfirmDialogProps, 'open' | 'onConfirm' | 'onCancel' | 'loading'>;
|
|
42
|
+
export interface ConfirmProviderProps {
|
|
43
|
+
children: React.ReactNode;
|
|
44
|
+
/** Textos por omissão dos botões, para a app os traduzir. */
|
|
45
|
+
confirmLabel?: string;
|
|
46
|
+
cancelLabel?: string;
|
|
47
|
+
closeLabel?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Dá o `useConfirm()` a toda a app. Monta-se uma vez, à volta da app.
|
|
51
|
+
*/
|
|
52
|
+
export declare function ConfirmProvider({ children, confirmLabel, cancelLabel, closeLabel }: ConfirmProviderProps): React.JSX.Element;
|
|
53
|
+
/**
|
|
54
|
+
* Pergunta e espera pela resposta: `true` se confirmou, `false` se cancelou.
|
|
55
|
+
*
|
|
56
|
+
* const confirm = useConfirm()
|
|
57
|
+
* if (await confirm({ title: 'Apagar despesa', message: 'Tem a certeza?', tone: 'danger', confirmLabel: 'Apagar' })) apagar()
|
|
58
|
+
*/
|
|
59
|
+
export declare function useConfirm(): (options: ConfirmOptions) => Promise<boolean>;
|
|
@@ -13,9 +13,10 @@ export interface DialogProps {
|
|
|
13
13
|
open: boolean;
|
|
14
14
|
/** Pedido para fechar (×, Esc ou clique fora): a app põe `open` a `false`. */
|
|
15
15
|
onClose: () => void;
|
|
16
|
-
|
|
16
|
+
/** Normalmente texto; aceita JSX (ex: um nome em negrito). */
|
|
17
|
+
title: React.ReactNode;
|
|
17
18
|
/** Linha por baixo do título (ex: nome · departamento). */
|
|
18
|
-
subtitle?:
|
|
19
|
+
subtitle?: React.ReactNode;
|
|
19
20
|
/** Botões no rodapé, sempre visíveis (ex: Confirmar, Fechar). */
|
|
20
21
|
footer?: React.ReactNode;
|
|
21
22
|
/** Largura máxima: `sm` 480px, `md` 720px, `lg` 1000px. Nunca passa o ecrã. */
|
|
@@ -39,7 +40,7 @@ export interface DialogProps {
|
|
|
39
40
|
}
|
|
40
41
|
/**
|
|
41
42
|
* Janela por cima da página: cabeçalho navy com título, corpo que faz scroll e
|
|
42
|
-
* rodapé com os botões.
|
|
43
|
+
* rodapé com os botões ([Button](?path=/docs/v1-primitives-buttons-button--docs)).
|
|
43
44
|
*
|
|
44
45
|
* É a janela modal da V1 (substitui o `Modal` legacy).
|
|
45
46
|
*
|
|
@@ -56,5 +57,7 @@ export interface DialogProps {
|
|
|
56
57
|
* da janela do browser (com uma margem), e acompanha-a quando é
|
|
57
58
|
* redimensionada. O que não couber faz scroll no corpo; o cabeçalho e o
|
|
58
59
|
* rodapé ficam sempre visíveis.
|
|
60
|
+
*
|
|
61
|
+
* **Exemplo completo:** [Formulário em modal](?path=/docs/v1-patterns-forms-formulário-em-modal--docs).
|
|
59
62
|
*/
|
|
60
63
|
export default function Dialog({ open, onClose, title, subtitle, footer, size, height, closeOnBackdrop, closeLabel, flush, children, }: DialogProps): React.ReactPortal;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface TooltipProps {
|
|
3
|
+
/** O que aparece no painel. Aceita JSX (ex: uma lista, um link com `interactive`). Vazio: sem tooltip. */
|
|
4
|
+
content?: React.ReactNode;
|
|
5
|
+
/** @deprecated Nome antigo de `content` (Tooltip legacy). */
|
|
6
|
+
tip?: React.ReactNode;
|
|
7
|
+
/** @deprecated Já não é preciso (o id é gerado); fica para não partir o código legacy. */
|
|
8
|
+
id?: string;
|
|
9
|
+
/** Cabeçalho opcional, separado por uma linha. */
|
|
10
|
+
title?: React.ReactNode;
|
|
11
|
+
/** O elemento que mostra o tooltip ao passar o rato ou com o foco. */
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
/** O painel aceita o rato (para clicar em links lá dentro) e fecha com um pequeno atraso. */
|
|
14
|
+
interactive?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* O painel segue o rato, em vez de ficar por cima do elemento. Para elementos
|
|
17
|
+
* grandes ou células de grelhas (ex: um cronograma), onde o centro do
|
|
18
|
+
* elemento fica longe do rato.
|
|
19
|
+
*/
|
|
20
|
+
followCursor?: boolean;
|
|
21
|
+
/** Desliga o tooltip (o elemento aparece na mesma). */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Classes do invólucro (um `<span>`), ex: `cursor-help` ou `block`. */
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Tooltip com conteúdo rico à volta de um elemento: aparece por cima dele (ou
|
|
28
|
+
* por baixo, se não couber) ao passar o rato ou com o foco do teclado; Esc
|
|
29
|
+
* fecha. As quebras de linha (`\n`) do texto mantêm-se.
|
|
30
|
+
*
|
|
31
|
+
* Para texto simples, basta o atributo `data-tip` com o `TooltipLayer`
|
|
32
|
+
* montado na raiz, sem embrulhar nada. O painel é o mesmo.
|
|
33
|
+
*/
|
|
34
|
+
export default function Tooltip({ content: contentProp, tip, title, children, interactive, followCursor, disabled, className, }: TooltipProps): React.JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Tooltips de toda a app, por atributo: qualquer elemento com `data-tip` mostra
|
|
4
|
+
* o texto num painel escuro ao passar o rato ou ao receber o foco do teclado.
|
|
5
|
+
* Monta-se uma vez na raiz.
|
|
6
|
+
*
|
|
7
|
+
* <button data-tip="Registar horas" aria-label="Registar horas">…</button>
|
|
8
|
+
* <span data-tip={nome} data-tip-title="Requisitante">…</span>
|
|
9
|
+
*
|
|
10
|
+
* - `data-tip-title`: cabeçalho opcional, separado por uma linha.
|
|
11
|
+
* - Texto com `\n` aparece em várias linhas.
|
|
12
|
+
* - Para conteúdo rico (JSX, links), usar o `Tooltip`.
|
|
13
|
+
* - Substitui o `title` do browser (lento, sem tema, corta texto longo). O
|
|
14
|
+
* tooltip não é lido pelos leitores de ecrã: o elemento continua a precisar
|
|
15
|
+
* do seu nome (`aria-label` ou texto).
|
|
16
|
+
* - Aparece por cima de uma janela (Dialog) aberta.
|
|
17
|
+
*/
|
|
18
|
+
export default function TooltipLayer(): React.JSX.Element;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* O painel escuro das tooltips (uso interno): o mesmo para a camada `data-tip`
|
|
4
|
+
* (TooltipLayer) e para o `Tooltip` com conteúdo rico. Fica na camada de cima
|
|
5
|
+
* do browser (`popover`), por cima de uma janela aberta.
|
|
6
|
+
*/
|
|
7
|
+
declare const TooltipPanel: React.ForwardRefExoticComponent<{
|
|
8
|
+
id?: string;
|
|
9
|
+
title?: React.ReactNode;
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
visible: boolean;
|
|
12
|
+
/** Aceita o rato (para se poder clicar em links lá dentro). */
|
|
13
|
+
interactive?: boolean;
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
onMouseEnter?: () => void;
|
|
16
|
+
onMouseLeave?: () => void;
|
|
17
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
18
|
+
export default TooltipPanel;
|
|
19
|
+
/** Distância ao cursor/elemento e margem mínima ao bordo da janela. */
|
|
20
|
+
export declare const OFFSET = 10;
|
|
21
|
+
export declare const MARGIN = 12;
|
|
22
|
+
/** Encosta o painel dentro da janela. */
|
|
23
|
+
export declare const clamp: (value: number, size: number, max: number) => number;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Põe um elemento na camada de cima do browser (top layer), por cima de um
|
|
4
|
+
* Dialog aberto. Só para uso interno (avisos, tooltips): o elemento tem de ter
|
|
5
|
+
* `popover="manual"`.
|
|
6
|
+
*
|
|
7
|
+
* Um `<dialog>` aberto com `showModal()` fica por cima de tudo o que está na
|
|
8
|
+
* página, incluindo `position: fixed` com `z-index` alto. Um popover também vai
|
|
9
|
+
* para essa camada, e fica por cima de quem lá entrou antes: por isso `raise()`
|
|
10
|
+
* volta a mostrá-lo quando é preciso que apareça à frente de uma janela que
|
|
11
|
+
* abriu depois.
|
|
12
|
+
*
|
|
13
|
+
* Em browsers sem popover (e no jsdom dos testes) não faz nada: o elemento
|
|
14
|
+
* continua com o seu `z-index`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useTopLayer(ref: RefObject<HTMLElement | null>, visible: boolean): () => void;
|
|
17
|
+
/**
|
|
18
|
+
* Anula a margem, a borda e o scroll que o browser dá aos popovers. O fundo e o
|
|
19
|
+
* espaçamento ficam com cada componente: pôr aqui `bg-transparent`/`p-0` junto
|
|
20
|
+
* com o `bg-…`/`px-…` do componente deixava o resultado à mercê da ordem do CSS
|
|
21
|
+
* (numa app com Tailwind próprio, a tooltip ficava transparente).
|
|
22
|
+
*/
|
|
23
|
+
export declare const popoverReset = "m-0 border-0 overflow-visible";
|
|
@@ -23,7 +23,7 @@ export interface PaginatedTableProps<T> extends TableProps<T> {
|
|
|
23
23
|
onPageSizeChange?: (pageSize: number) => void;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* A
|
|
26
|
+
* A [Table](?path=/docs/v1-components-tables-table--docs) para listas de página inteira: a paginação fica EM CIMA, numa
|
|
27
27
|
* barra com a contagem de linhas, o tamanho de página e os números de página,
|
|
28
28
|
* em vez de no fundo.
|
|
29
29
|
*
|
|
@@ -245,6 +245,6 @@ export declare function TableBase<T>({ paginacaoNoTopo, columns: colunasBase, da
|
|
|
245
245
|
* a si mesma, com a troca de páginas no fundo.
|
|
246
246
|
*
|
|
247
247
|
* Para a paginação EM CIMA, com a contagem e o tamanho de página (uma lista de
|
|
248
|
-
* página inteira), ver o
|
|
248
|
+
* página inteira), ver o [PaginatedTable](?path=/docs/v1-components-tables-paginatedtable--docs).
|
|
249
249
|
*/
|
|
250
250
|
export default function Table<T>(props: TableProps<T>): React.JSX.Element;
|
|
@@ -33,9 +33,29 @@ export declare function ChevronsUpDownIcon(props: IconProps): React.JSX.Element;
|
|
|
33
33
|
export declare function FilterIcon(props: IconProps): React.JSX.Element;
|
|
34
34
|
/** Fechar, remover (×). */
|
|
35
35
|
export declare function CloseIcon(props: IconProps): React.JSX.Element;
|
|
36
|
+
/** Abrir o menu (gaveta em ecrãs pequenos). */
|
|
37
|
+
export declare function MenuIcon(props: IconProps): React.JSX.Element;
|
|
36
38
|
/** Agrupar (camadas). */
|
|
37
39
|
export declare function LayersIcon(props: IconProps): React.JSX.Element;
|
|
40
|
+
/** Expandir o menu lateral recolhido. */
|
|
41
|
+
export declare function PanelOpenIcon(props: IconProps): React.JSX.Element;
|
|
38
42
|
/** Lista de valores. */
|
|
39
43
|
export declare function ListIcon(props: IconProps): React.JSX.Element;
|
|
44
|
+
/** Tema claro. */
|
|
45
|
+
export declare function SunIcon(props: IconProps): React.JSX.Element;
|
|
46
|
+
/** Tema escuro. */
|
|
47
|
+
export declare function MoonIcon(props: IconProps): React.JSX.Element;
|
|
48
|
+
/** Tema do sistema. */
|
|
49
|
+
export declare function MonitorIcon(props: IconProps): React.JSX.Element;
|
|
50
|
+
/** Idioma. */
|
|
51
|
+
export declare function GlobeIcon(props: IconProps): React.JSX.Element;
|
|
52
|
+
/** Terminar sessão. */
|
|
53
|
+
export declare function LogOutIcon(props: IconProps): React.JSX.Element;
|
|
54
|
+
/** Abre fora da aplicação (separador novo). */
|
|
55
|
+
export declare function ExternalLinkIcon(props: IconProps): React.JSX.Element;
|
|
56
|
+
/** Atenção (avisos, confirmações perigosas). */
|
|
57
|
+
export declare function WarningIcon(props: IconProps): React.JSX.Element;
|
|
58
|
+
/** Erro. */
|
|
59
|
+
export declare function ErrorIcon(props: IconProps): React.JSX.Element;
|
|
40
60
|
/** Intervalo (mínimo e máximo). */
|
|
41
61
|
export declare function SlidersIcon(props: IconProps): React.JSX.Element;
|
package/dist/types/v1/index.d.ts
CHANGED
|
@@ -5,7 +5,10 @@ export type { PdfPreviewProps } from './primitives/documents/PdfPreview/PdfPrevi
|
|
|
5
5
|
export { configurePdfWorker } from './primitives/documents/PdfPreview/pdfjs';
|
|
6
6
|
export { scanQRCodes, configureQRScanner } from './capabilities/documents/QRScanning/scanQRCodes';
|
|
7
7
|
export type { ScanQRCodesOptions } from './capabilities/documents/QRScanning/scanQRCodes';
|
|
8
|
-
export {
|
|
8
|
+
export { useTheme, applyTheme, themeBootScript, THEME_STORAGE_KEY } from './capabilities/theme/useTheme';
|
|
9
|
+
export type { Theme } from './capabilities/theme/useTheme';
|
|
10
|
+
export { useIsDark } from './capabilities/theme/useIsDark';
|
|
11
|
+
export { QrCodeIcon, SparklesIcon, PrefilledIcon, LockIcon, InfoIcon, SearchIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, CloseIcon, MenuIcon, PanelOpenIcon, SunIcon, MoonIcon, MonitorIcon, GlobeIcon, LogOutIcon, ExternalLinkIcon, WarningIcon, ErrorIcon, ChevronUpIcon, ChevronRightIcon, ChevronsUpDownIcon, FilterIcon, LayersIcon, ListIcon, SlidersIcon, } from './foundations/icons/icons';
|
|
9
12
|
export type { IconProps } from './foundations/icons/icons';
|
|
10
13
|
export { default as TextInput } from './primitives/forms/TextInput/TextInput';
|
|
11
14
|
export type { TextInputProps } from './primitives/forms/TextInput/TextInput';
|
|
@@ -13,6 +16,10 @@ export { default as SelectInput } from './primitives/forms/SelectInput/SelectInp
|
|
|
13
16
|
export type { SelectInputProps } from './primitives/forms/SelectInput/SelectInput';
|
|
14
17
|
export { default as TextArea } from './primitives/forms/TextArea/TextArea';
|
|
15
18
|
export type { TextAreaProps } from './primitives/forms/TextArea/TextArea';
|
|
19
|
+
export { default as DateInput } from './primitives/forms/DateInput/DateInput';
|
|
20
|
+
export type { DateInputProps } from './primitives/forms/DateInput/DateInput';
|
|
21
|
+
export { default as SearchInput } from './primitives/forms/SearchInput/SearchInput';
|
|
22
|
+
export type { SearchInputProps } from './primitives/forms/SearchInput/SearchInput';
|
|
16
23
|
export { default as Checkbox } from './primitives/forms/Checkbox/Checkbox';
|
|
17
24
|
export type { CheckboxProps } from './primitives/forms/Checkbox/Checkbox';
|
|
18
25
|
export { default as LookupInput } from './primitives/forms/LookupInput/LookupInput';
|
|
@@ -25,6 +32,41 @@ export { default as Button } from './primitives/buttons/Button/Button';
|
|
|
25
32
|
export type { ButtonProps } from './primitives/buttons/Button/Button';
|
|
26
33
|
export { default as Dialog, useDialogContainer } from './components/overlays/Dialog/Dialog';
|
|
27
34
|
export type { DialogProps } from './components/overlays/Dialog/Dialog';
|
|
35
|
+
export { default as ConfirmDialog, ConfirmProvider, useConfirm } from './components/overlays/ConfirmDialog/ConfirmDialog';
|
|
36
|
+
export type { ConfirmDialogProps, ConfirmOptions, ConfirmProviderProps } from './components/overlays/ConfirmDialog/ConfirmDialog';
|
|
37
|
+
export { default as Tooltip } from './components/overlays/Tooltip/Tooltip';
|
|
38
|
+
export type { TooltipProps } from './components/overlays/Tooltip/Tooltip';
|
|
39
|
+
export { default as TooltipLayer } from './components/overlays/Tooltip/TooltipLayer';
|
|
40
|
+
export { default as ToastProvider, useToast } from './components/feedback/Toast/Toast';
|
|
41
|
+
export type { ToastApi, ToastOptions, ToastProviderProps, ToastTone } from './components/feedback/Toast/Toast';
|
|
42
|
+
export { default as AppShell } from './components/layout/AppShell/AppShell';
|
|
43
|
+
export type { AppShellProps, AppShellLabels } from './components/layout/AppShell/AppShell';
|
|
44
|
+
export { default as Page } from './components/layout/Page/Page';
|
|
45
|
+
export type { PageProps } from './components/layout/Page/Page';
|
|
46
|
+
export { default as PageHeader } from './components/layout/PageHeader/PageHeader';
|
|
47
|
+
export type { PageHeaderProps, BreadcrumbItem } from './components/layout/PageHeader/PageHeader';
|
|
48
|
+
export { default as SideNav } from './components/layout/SideNav/SideNav';
|
|
49
|
+
export type { SideNavProps, SideNavItem, SideNavBadge, SideNavLabels, SideNavTheme } from './components/layout/SideNav/SideNav';
|
|
50
|
+
export { Badge } from './primitives/display/Badge/Badge';
|
|
51
|
+
export type { BadgeProps, BadgeTone } from './primitives/display/Badge/Badge';
|
|
52
|
+
export { Notice } from './primitives/display/Notice/Notice';
|
|
53
|
+
export type { NoticeProps, NoticeTone } from './primitives/display/Notice/Notice';
|
|
54
|
+
export { Avatar, initials } from './primitives/display/Avatar/Avatar';
|
|
55
|
+
export type { AvatarProps, AvatarSize } from './primitives/display/Avatar/Avatar';
|
|
56
|
+
export { Person } from './primitives/display/Person/Person';
|
|
57
|
+
export type { PersonProps } from './primitives/display/Person/Person';
|
|
58
|
+
export { Pagination } from './components/data/Pagination/Pagination';
|
|
59
|
+
export type { PaginationProps, PaginationLabels } from './components/data/Pagination/Pagination';
|
|
60
|
+
export { FilterChips } from './primitives/display/FilterChips/FilterChips';
|
|
61
|
+
export type { FilterChipsProps, FilterChipItem } from './primitives/display/FilterChips/FilterChips';
|
|
62
|
+
export { Card } from './primitives/display/Card/Card';
|
|
63
|
+
export type { CardProps } from './primitives/display/Card/Card';
|
|
64
|
+
export { Kpi } from './primitives/display/Kpi/Kpi';
|
|
65
|
+
export type { KpiProps, KpiTone } from './primitives/display/Kpi/Kpi';
|
|
66
|
+
export { default as Tabs } from './primitives/navigation/Tabs/Tabs';
|
|
67
|
+
export type { TabsProps, TabsSingleProps, TabsMultipleProps, TabItem } from './primitives/navigation/Tabs/Tabs';
|
|
68
|
+
export { default as SegmentedControl } from './primitives/buttons/SegmentedControl/SegmentedControl';
|
|
69
|
+
export type { SegmentedControlProps, SegmentedOption } from './primitives/buttons/SegmentedControl/SegmentedControl';
|
|
28
70
|
export { default as Table } from './components/tables/Table/Table';
|
|
29
71
|
export type { TableProps, TableColumn, TableView, TableState } from './components/tables/Table/Table';
|
|
30
72
|
export { default as PaginatedTable } from './components/tables/PaginatedTable/PaginatedTable';
|
|
@@ -1,18 +1,35 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
/**
|
|
4
|
+
* `primary`: a ação principal (navy, uma por ecrã). `secondary` (contorno): as
|
|
5
|
+
* outras (ex: Fechar, Exportar). `success` (verde): aprovar, aceitar, concluir.
|
|
6
|
+
* `danger`: apaga ou não se pode desfazer (ex: Apagar). `ghost`: sem contorno,
|
|
7
|
+
* para ações discretas.
|
|
8
|
+
*
|
|
9
|
+
* Sobre fundo escuro (ex: uma barra navy): `inverse` (contorno branco) para as
|
|
10
|
+
* ações normais e `accent` (turquesa) para a principal.
|
|
11
|
+
*/
|
|
12
|
+
variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'ghost' | 'inverse' | 'accent';
|
|
13
|
+
/** `sm`: mais pequeno (28px), para ícones dentro de linhas de tabelas e cartões. */
|
|
14
|
+
size?: 'md' | 'sm';
|
|
15
|
+
/** Ligado (ex: um filtro ativo): o `secondary` fica navy. Dá `aria-pressed`. */
|
|
16
|
+
active?: boolean;
|
|
17
|
+
/** Ícone antes do texto (ex: `<CheckIcon size={13} />`). Sem texto, o botão fica quadrado (dar `aria-label`). */
|
|
6
18
|
icon?: React.ReactNode;
|
|
7
19
|
/** A guardar/enviar: mostra uma roda no lugar do ícone e fica desativado. */
|
|
8
20
|
loading?: boolean;
|
|
9
21
|
}
|
|
10
22
|
/**
|
|
11
|
-
* Botão de ação (ex: Confirmar,
|
|
12
|
-
* (`type="button"`); para submeter, passar `type="submit"`.
|
|
23
|
+
* Botão de ação (ex: Confirmar, Novo projeto). Por omissão não submete
|
|
24
|
+
* formulários (`type="button"`); para submeter, passar `type="submit"`.
|
|
25
|
+
*
|
|
26
|
+
* O aspeto dos portais proef: MAIÚSCULAS, letra grossa e espaçada, a mesma
|
|
27
|
+
* altura dos outros controlos (32px).
|
|
13
28
|
*
|
|
14
29
|
* **Aceita os atributos HTML do [<button>](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/button)**, com o mesmo comportamento: `onClick`, `disabled`, `type`, `name`, `form`, `ref`, ...
|
|
15
30
|
* Só os próprios do V1 aparecem na tabela abaixo.
|
|
31
|
+
*
|
|
32
|
+
* **Onde aparece:** no rodapé de um [Dialog](?path=/docs/v1-components-overlays-dialog--docs) (ver [Formulário em modal](?path=/docs/v1-patterns-forms-formulário-em-modal--docs)).
|
|
16
33
|
*/
|
|
17
34
|
declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
18
35
|
export default Button;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface SegmentedOption<V extends string = string> {
|
|
3
|
+
value: V;
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
/** Ícone antes do texto (ex: um ícone do lucide com `size={12}`). */
|
|
6
|
+
icon?: React.ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface SegmentedControlProps<V extends string = string> {
|
|
10
|
+
/** A opção escolhida. A app guarda este estado. */
|
|
11
|
+
value: V;
|
|
12
|
+
options: SegmentedOption<V>[];
|
|
13
|
+
onChange: (value: V) => void;
|
|
14
|
+
/** Rótulo visível à esquerda (ex: "Situação"). Também é o nome do grupo para leitores de ecrã. */
|
|
15
|
+
label?: string;
|
|
16
|
+
/** Nome do grupo para leitores de ecrã, quando não há `label` visível. */
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Escolha de uma opção entre poucas, em botões lado a lado (ex: Dia · Semana ·
|
|
22
|
+
* Mês, ou Todos · Atribuição · Devolução). Para filtros e modos de vista numa
|
|
23
|
+
* barra; para trocar de vista com conteúdo próprio, usar `Tabs`.
|
|
24
|
+
*
|
|
25
|
+
* Mesmo aspeto dos `Tabs` segmentados: botões juntos numa caixa, o escolhido
|
|
26
|
+
* a navy. Setas ← → mudam de opção.
|
|
27
|
+
*/
|
|
28
|
+
export default function SegmentedControl<V extends string = string>({ value, options, onChange, label, ariaLabel, className, }: SegmentedControlProps<V>): React.JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aspeto "segmentado": botões juntos numa caixa, o escolhido a navy.
|
|
3
|
+
*
|
|
4
|
+
* Partilhado pelo `SegmentedControl` (escolher um valor, ex: 7D · 30D) e pelos
|
|
5
|
+
* `Tabs` com `variant="segmented"` (trocar de vista): fazem coisas diferentes
|
|
6
|
+
* mas têm de parecer o mesmo controlo.
|
|
7
|
+
*
|
|
8
|
+
* A caixa tem a altura dos outros controlos (`--spacing-control`), para ficar
|
|
9
|
+
* alinhada com botões, pesquisa e campos na mesma barra.
|
|
10
|
+
*/
|
|
11
|
+
export declare const SEGMENTED: {
|
|
12
|
+
list: string;
|
|
13
|
+
item: string;
|
|
14
|
+
active: string;
|
|
15
|
+
idle: string;
|
|
16
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/** Iniciais a partir do nome completo (primeira + última). Sem nome: "?". */
|
|
3
|
+
export declare function initials(fullName?: string | null): string;
|
|
4
|
+
/** `none`: sem tamanho nem cores das iniciais — quem usa põe as classes (ex: o UserAvatar da Legacy). */
|
|
5
|
+
export type AvatarSize = 'sm' | 'md' | 'lg' | 'none';
|
|
6
|
+
export interface AvatarProps {
|
|
7
|
+
name?: string | null;
|
|
8
|
+
/** URL da fotografia. Sem ela (ou se falhar) ficam as iniciais. */
|
|
9
|
+
photo?: string | null;
|
|
10
|
+
/** Fotografia maior para o cartão (por omissão, a mesma). */
|
|
11
|
+
photoLarge?: string | null;
|
|
12
|
+
email?: string | null;
|
|
13
|
+
company?: string | null;
|
|
14
|
+
department?: string | null;
|
|
15
|
+
jobTitle?: string | null;
|
|
16
|
+
/** `sm` 24px (tabelas e listas), `md` 28px, `lg` 32px (formulários, cabeçalhos). */
|
|
17
|
+
size?: AvatarSize;
|
|
18
|
+
/** Cartão com a fotografia grande e os dados ao passar o rato (no toque, ao tocar). */
|
|
19
|
+
card?: boolean;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A fotografia de uma pessoa (ou as iniciais), redonda. Com `card`, mostra a
|
|
24
|
+
* fotografia grande, o email, a empresa, o departamento e a função ao passar o rato;
|
|
25
|
+
* no toque abre e fecha ao tocar, sem passar o toque à linha por baixo.
|
|
26
|
+
*
|
|
27
|
+
* Para uma pessoa com o nome ao lado (ex: numa tabela), usar o `Person`.
|
|
28
|
+
*/
|
|
29
|
+
export default function Avatar({ name, photo, photoLarge, email, company, department, jobTitle, size, card, className, }: AvatarProps): React.JSX.Element;
|
|
30
|
+
export { Avatar };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Estados com significado: `ok` (verde), `risco` (âmbar), `incumprido` (vermelho).
|
|
4
|
+
* Sem estado: `neutral` (cinzento) e `accent` (azul).
|
|
5
|
+
* Classificações (distinguir valores que não são bons nem maus, ex: origem, tipo,
|
|
6
|
+
* área): `blue`, `violet`, `cyan`, `orange`, `pink` — sem significado, só para os
|
|
7
|
+
* valores se reconhecerem de relance. Não usar verde/âmbar/vermelho para isto.
|
|
8
|
+
*/
|
|
9
|
+
export type BadgeTone = 'ok' | 'risco' | 'incumprido' | 'neutral' | 'accent' | 'blue' | 'violet' | 'cyan' | 'orange' | 'pink';
|
|
10
|
+
/** Aceita os atributos do `<span>` (ex: `data-tip`, `title`, `aria-label`). */
|
|
11
|
+
export interface BadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
|
|
12
|
+
tone?: BadgeTone;
|
|
13
|
+
/** Ponto à esquerda. Por omissão sim; sem ponto para etiquetas que não são um estado (ex: categoria). */
|
|
14
|
+
dot?: boolean;
|
|
15
|
+
/** Ícone no lugar do ponto (ex: `<Eye size={11} />`). */
|
|
16
|
+
icon?: React.ReactNode;
|
|
17
|
+
children: React.ReactNode;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Etiqueta em pílula: o estado de um registo (ex: "Publicado", "Em atraso") ou
|
|
21
|
+
* uma classificação (ex: a categoria, a origem). As cores dos estados vêm dos
|
|
22
|
+
* tokens, por isso acompanham o tema escuro.
|
|
23
|
+
*/
|
|
24
|
+
export default function Badge({ tone, dot, icon, children, className, ...props }: BadgeProps): React.JSX.Element;
|
|
25
|
+
export { Badge };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
3
|
+
/** Título no topo (ex: "Por estado"). */
|
|
4
|
+
title?: React.ReactNode;
|
|
5
|
+
/** Ações à direita do título (ex: um botão, um seletor). */
|
|
6
|
+
actions?: React.ReactNode;
|
|
7
|
+
/** `none`: sem margem interior, para tabelas ou listas que vão até à borda. */
|
|
8
|
+
padding?: 'md' | 'none';
|
|
9
|
+
/** @deprecated Nome antigo (Legacy) de `actions`. */
|
|
10
|
+
extra?: React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Cartão: agrupa um bloco de conteúdo (um gráfico, uma lista, um resumo) num
|
|
14
|
+
* fundo próprio com cantos redondos, com título opcional.
|
|
15
|
+
*
|
|
16
|
+
* Os indicadores soltos usam o `Kpi`; as tabelas da biblioteca já trazem o seu
|
|
17
|
+
* contorno e não vão dentro de um cartão.
|
|
18
|
+
*
|
|
19
|
+
* **Aceita os atributos HTML do `<div>`** (ex: `id`, `data-*`, `onClick`).
|
|
20
|
+
*/
|
|
21
|
+
export default function Card({ title, actions, extra, padding, className, children, ...props }: CardProps): React.JSX.Element;
|
|
22
|
+
export { Card };
|